[CMake] Fortan and C++

Dominik Szczerba dominik at itis.ethz.ch
Sat Aug 22 09:40:58 EDT 2009


I naively tried:

INCLUDE(FortranCInterface)
CREATE_FORTRAN_C_INTERFACE(myf cross myfconfig.h)

to get:

-- checking Fortran function linkage: sub_
-- checking Fortran function linkage: _sub_
-- checking Fortran function linkage: __sub_
-- checking Fortran function linkage: SUB_
-- checking Fortran function linkage: _SUB_
-- checking Fortran function linkage: __SUB_
-- checking Fortran function linkage: sub
-- checking Fortran function linkage: _sub
-- checking Fortran function linkage: __sub
-- checking Fortran function linkage: SUB
-- checking Fortran function linkage: _SUB
-- checking Fortran function linkage: __SUB
CMake Error at 
/usr/local/share/cmake-2.6/Modules/FortranCInterface.cmake:169 (message):
   Could not find fortran c name mangling.
Call Stack (most recent call first):
   CMakeLists.txt:34 (create_fortran_c_interface)

I have C CXX and Fortran enabled in the 'project' call. Using icpc/ifort 
11.x

- Dominik

Dominik Szczerba wrote:
> Hi Michael,
> 
> Michael Wild wrote:
>> Hi Dominik
>>
>> Concerning the flags: you should add the -no-multibyte-chars to the  
>> CMAKE_CXX_FLAGS variable. This will get prepended to all  
>> CMAKE_CXX_FLAGS_{RELEASE,DEBUG,...} flags, since you don't want this  
>> flag to be used for the Release configuration exclusively, but for all  
>> configurations.
> 
> Thanks for the clarifications.
> 
>> Linking against ifcore using the C++ compiler only works if it is on  
>> the search path (probably by sourcing ifortvars.sh), otherwise you'll  
>> have to specify it's full path. I think, Intel recommends using the  
>> the Fortran compiler for linking instead, and passing it the -cxxlib  
>> and -nofor_main flags (those are the correct names now, I looked them  
>> up ;-)).
> 
> I see, will maybe try some day. However, I have no problem linking for 
> the moment.
> 
>> On Mac platforms there is another problem: By default the g++ compiler  
>> generates 32-bit code, while the Intel Fortran compiler generates 64- 
>> bit code (very annoying).
>>
>> If you try to use FortranCInterface.cmake, be aware that it is quite  
>> buggy, as it doesn't pass the CMAKE_*_FLAGS to the try_compile calls.  
>> Further it doesn't ensure that the C language is enabled, altough it  
>> is calling try_compile on C code! I'll file a bug report with an  
>> attached patch for that.
>>
> 
> This is new to me. Sounds like automatic handling of calling 
> decorations. Would be great! Are there any examples how to use it? Do I 
> still need it when I know the mangling scheme myself? Can I set the 
> pre/suffixes myself in some elegant manner? Currently I am just hacking 
> on my own, so indications how to position myself for the future are very 
> welcome.
> 
> Thanks,
> Dominik
> 
>> All the best
>>
>> Michael
>>
>> On 22. Aug, 2009, at 13:35, Dominik Szczerba wrote:
>>
>>> Here the report of my tests:
>>>
>>> Just ignorant approach (don't google):
>>>
>>> It works out of the box on linux with intel compilers 10.x. Just add  
>>> Fortran to the languages in the project signature and add STUFF.F90  
>>> to the source files. You need to link to ifcore library though.
>>>
>>> It does not work out of the box with the compilers 11.x. Here the  
>>> ignorant approach failed. The errors were like:
>>>
>>> -- Check for working CXX compiler: /usr/local/bin/icpc-11.0.083
>>> -- Check for working CXX compiler: /usr/local/bin/icpc-11.0.083 --  
>>> broken
>>> CMake Error at /usr/local/share/cmake-2.6/Modules/ 
>>> CMakeTestCXXCompiler.cmake:25 (MESSAGE):
>>>  The C++ compiler "/usr/local/bin/icpc-11.0.083" is not able to  
>>> compile a
>>>  simple test program.
>>>
>>>  It fails with the following output:
>>>
>>>   Change Dir: /home/domel/build/solve/CMakeFiles/CMakeTmp
>>>
>>> Checking by foot what the compilers at all say during compilations I  
>>> found:
>>>
>>>> icpc-11.0.083 -c test.cxx
>>> Catastrophic error: could not set locale "" to allow processing of  
>>> multibyte characters
>>>
>>> Googling reveals a bug in the compiler to be circumvented with  
>>> adding '-no-multibyte-chars' to the compiler switches. However,  
>>> adding this to my CMAKE_XXX_FLAGS_RELEASE (my CMAKE_BUILD_TYPE is  
>>> RELEASE) does not help. I must now either specify CMAKE_XXX_FLAGS  
>>> explicitly on the commandline or in the cache. Probably because  
>>> cmake uses default flags (CMAKE_XXX_FLAGS) for compiler checks, even  
>>> if CMAKE_BUILD_TYPE is explicitly set release/debug (as well as  
>>> corresponding release/debug flags).
>>>
>>> Maybe cmake should use compiler flags as defined by CMAKE_BUILD_TYPE  
>>> to check for compilers?
>>>
>>> - Dominik
>>>
>>>
>>>
>>> Dominik Szczerba wrote:
>>>> Michael,
>>>> Many thanks for the feedback.
>>>> What I am doing with a GNU makefile so far is compile just one file  
>>>> with the fortran compiler use C++ linker to link all object files  
>>>> as usual.
>>>> A comprehensive solution I would expect in cmake would be 1)  
>>>> nothing (.f90 file is understood) or something along the lines of  
>>>> setting the file properties (sort of 'to be compiler with' flag)...
>>>> - Dominik
>>>> Michael Wild wrote:
>>>>> On 21.08.2009, at 17:57, Dominik Szczerba <dominik at itis.ethz.ch>  
>>>>> wrote:
>>>>>
>>>>>> I want to compile one file with fortran compiler (intel) and  
>>>>>> link  with the rest of my project. Will the latest cmake allow to  
>>>>>> fully  cmakify such scenario?
>>>>> Hi Dominik
>>>>>
>>>>> If I remember correctly, you'll have to set the LINK_LANGUAGE  
>>>>> property  of your target to Fortran and then ensure that the  
>>>>> Fortran linker also  links against the C++ standard library. For  
>>>>> Intel this would be -stdc+ + (or some such). If you are creating  
>>>>> an executable, depending on  where your main-function is defined,  
>>>>> you might also need to tell the  linker to not add a Fortran main- 
>>>>> function, the flag is called - nofor_main if I remember correctly.  
>>>>> Otherwise the ifort man-page will  tell you :)
>>>>>
>>>>>
>>>>> HTH
>>>>>
>>>>> Michael
>>> -- 
>>> d o m i n i k   s z c z e r b a ,   p h d . . . . . . . . . . .
>>> c o m p u t a t i o n a l   l i f e   s c i e n c e   g r o u p
>>> . . . . . . . i t ' i s   r e s e a r c h   f o u n d a t i o n
>>> . . . . . . . . . . . . . . . . . . . . http://www.itis.ethz.ch
>>>
> 
> 


-- 
d o m i n i k   s z c z e r b a ,   p h d . . . . . . . . . . .
c o m p u t a t i o n a l   l i f e   s c i e n c e   g r o u p
. . . . . . . i t ' i s   r e s e a r c h   f o u n d a t i o n
. . . . . . . . . . . . . . . . . . . . http://www.itis.ethz.ch



More information about the CMake mailing list