[CMake] Fortan and C++

Michael Wild themiwi at gmail.com
Sun Aug 23 07:48:36 EDT 2009


Sorry, I should read stuff more carefully, I just plain overlooked  
that error message. I'm not sure what might be the reason for it. I'll  
have to investigate. However, if you don't plan to call module- 
functions from C, you should be fine.

Michael

On 23. Aug, 2009, at 13:02, Dominik Szczerba wrote:

> Hmmm I dont understand. SET(FUNCTIONS...) does not influence  
> anything. The messages I get are identical as before, with the only  
> difference that the myfconfig.h now has something meaningful inside:
>
> #define myfFUNCTIONS functions_
>
> However, the errors:
>
> -- Failed to find C binding to Fortran module functions.
> -- Failed to find Fortran module linkage
> -- created /home/domel/build/solve/myconfig.h
>
> are still there. Any valuable ideas?
>
> - Dominik
>
>
> Michael Wild wrote:
>> I think you called the CREATE_FORTRAN_C_INTERFACE function   
>> incorrectly. The second argument needs to be the name of a  
>> variable  containing a list of function names:
>> SET( FUNCTIONS cross )
>> CREATE_FORTRAN_C_INTERFACE( myf FUNCTIONS $ 
>> {CMAKE_CURRENT_BINARY_DIR}/ myconfig.h )
>> Michael
>> On 22. Aug, 2009, at 20:24, Dominik Szczerba wrote:
>>> Of course, you are right - not about ifcore that is resolved by  
>>> ldd,  but about the multibyte magic. I applied your patch. Now I  
>>> get:
>>>
>>> -- checking Fortran function linkage: sub_
>>> -- found Fortran function linkage
>>> -- checking Fortran function with _  linkage: my_sub_
>>> -- checking Fortran module linkage: test_interface$sub
>>> -- checking Fortran module linkage: TEST_INTERFACE_mp_sub
>>> -- checking Fortran module linkage: _test_interface__sub
>>> -- checking Fortran module linkage: __test_interface__sub
>>> -- checking Fortran module linkage: __test_interface_NMOD_sub
>>> -- checking Fortran module linkage: __test_interface_MOD_sub
>>> -- Failed to find C binding to Fortran module functions.
>>> -- Failed to find Fortran module linkage
>>> -- created myfconfig.h
>>>
>>> The content of myfconfig.h file:
>>>
>>> /* This file is automatically generated by CMake, DO NOT EDIT.
>>>  It contains a mapping from Fortran functions so they can
>>>  be called from C or C++.   */
>>>
>>> Where do I go from here?
>>>
>>> Many thanks,
>>> Dominik
>>>
>>> Michael Wild wrote:
>>>> As I said, FortranCInterface.cmake is buggy as it doesn't pass  
>>>> the   CMAKE_Fortran_FLAGS and CMAKE_EXE_LINKER_FLAGS variables to  
>>>> the   TRY_COMPILE project. If you have to set these in order to  
>>>> compile/ link  a mixed-language program, it fails. Come to think  
>>>> of it, in  your case  the ifcore library will also be missing, so  
>>>> probably  something like a  CMAKE_REQUIRED_LIBRARIES variable  
>>>> will also be  necessary.
>>>> Michael
>>>> On 22. Aug, 2009, at 15:40, Dominik Szczerba wrote:
>>>>> 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
>>>>>
>>>
>>> -- 
>>> 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