[CMake] Fortran-C mixed code

Radu Serban radu at llnl.gov
Thu Jan 18 14:27:46 EST 2007


Bill Hoffman wrote:
> Radu Serban wrote:
>> Alan W. Irwin wrote:
>>> On 2007-01-12 12:42-0800 Radu Serban wrote:
>>>
>>>> I'm attempting to use cmake to configure a package containing both 
>>>> Fortran (F77) and C source code (as an alternative to the current 
>>>> build system which uses autoconf+libtool) but I couldn't figure out 
>>>> how to properly do that.
>>>
>>> Have you considered splitting your library into a fortran-only 
>>> library and a
>>> C-only library?  Autotools tries to support mixing fortran- and 
>>> C-compiled
>>> objects in the same library (using the AC_F77_LIBRARY_LDFLAGS macro 
>>> and the
>>> resulting FLIBS), but we could never get that to work reliably on all
>>> platforms for PLplot.  Thus, we ended up splitting our libraries into
>>> fortran-only and C-only when we were still building with autotools, 
>>> and we
>>> have continued that approach now we have migrated to cmake.  We 
>>> didn't have
>>> to do anything special to get this approach to work. Just use the
>>> appropriate ADD_LIBRARY command for each library, and use
>>> TARGET_LINK_LIBRARIES to establish the dependencies between them, and 
>>> the
>>> result seems to build fine on all platforms.
>>>
>>> Alan
>>
>> Hi Alan,
>>
>> Splitting the library into two is unfortunately not applicable to my 
>> case (see below why).
>>
>> In my initial post I had raised 3 issues (determining the F77 
>> intrinsic and run-time libraries, using a C compiler to link an 
>> executable from an object created from a Fortran source and a C 
>> library, and determining the Fortran compiler's name mangling scheme).
>>
>> The first two issues are relevant only if the C library is actually 
>> built using a C++ compiler. However, I realized that cmake will stop 
>> with an error if I set the environment variable CC to, say, g++ before 
>> invoking cmake on my project (#error "The CMAKE_C_COMPILER is set to a 
>> C++ compiler"). As such, I can always be sure that a C++ compiler will 
>> not be used to create the library from the C sources and using the 
>> Fortran compiler to link will work just fine (and the F77 intrinsic 
>> and run-time libraries will not be needed).
>>
>> But knowing the Fortran name mangling scheme is still crucial (if 
>> interested, see below why). For now I rely on the user to provide the 
>> case (lower or upper) and number of appended underscores (none, one, 
>> or two) which determine it. The defaults I provide (lower case with 
>> one underscore) is probably the most common one, but I'd be much 
>> happier if I could automatically determine it at configuration time... 
>> Any suggestions?
>>
>> Finally, I'm now wondering why cmake will not allow using a C++ 
>> compiler on C sources. Sure, one must be careful in conditionally 
>> including the appropriate wrappers in the header files to allow C++ 
>> usage, but I don't see why cmake would absolutely forbid this. Issuing 
>> a warning may be appropriate, why an error? Am I missing anything?
>>
> You can always use the LINKER_LANGUAGE property of a target to force 
> which compiler is used to link.
> 
> Back to your original example, this should do what you want:
> 
> add_executable(foo foo.f)
> target_link_libraries(foo my_c_library)
> set_target_properties(foo PROPERTIES LINKER_LANGUAGE CXX)
> 
> -Bill
> 
> 

Thanks Bill,
I should have read the man page more carefully. I'll remember this for the 
future. For my current situation this is not needed anymore since a C++ compiler 
cannot be used to create my_c_library from C sources (probably for the better; 
otherwise I'd also need to figure out the Fortran run time libraries).
--Radu



More information about the CMake mailing list