[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