[CMake] how to set ar/ranlib flags per target

Verweij, Arjen VerweijA at tass-safe.com
Thu Jul 22 07:58:49 EDT 2010


Hi Kelly,

I'm using cmake to migrate from a legacy build system. The source consists of C C++ Fortran and Fortran90. I think -in all- there are 15 binaries.

One of the problems for us is linking. Cmake somehow decides to take compiler X to link executable Y. But in some cases it didn't use the one we expected.

So we wrapped add_executable() inside a function that takes an extra argument to control the linker language:

function (FEXECUTABLE EXE_NAME LINK_LANG )

[...]

    add_executable (${EXE_NAME_EXE} ${FILE_LIST_M})

    if ( ${LINK_LANG} STREQUAL "CXX" )
        set_target_properties (${EXE_NAME_EXE} PROPERTIES LINKER_LANGUAGE CXX)
    elseif ( ${LINK_LANG} STREQUAL "C" )
        set_target_properties (${EXE_NAME_EXE} PROPERTIES LINKER_LANGUAGE C)
    elseif ( ${LINK_LANG} STREQUAL "Fortran" )
        set_target_properties (${EXE_NAME_EXE} PROPERTIES LINKER_LANGUAGE Fortran)
    else ()
        message( FATAL "Unknown linker language specified for function FEXECUTABLE: ${LINK_LANG" )
    endif ()

[...]

endfunction (FEXECUTABLE)

I'm not saying that this is proper usage of cmake, but it "works for me (tm)".

Perhaps you can try a similar approach with add_library() - myadd_static_library() ? - to indicate if you want to use a 32-bit or 64-bit archiver.

Regards,
Arjen

>-----Original Message-----
>From: Hickel, Kelly [mailto:Kelly_Hickel at bmc.com]
>Sent: donderdag 22 juli 2010 13:46
>To: Hickel, Kelly; Verweij, Arjen; cmake at cmake.org
>Subject: RE: how to set ar/ranlib flags per target
>
>Arjen, I saw your response about "wrapping add_library" on the list, but
>for some reason it didn't get to my inbox.
>
>I'm not sure what you mean by "wrapping", are you talking about a code
>change, or some sort of macro?  So far, I haven't been able to come up
>with any way of jamming -X64 into the right place in the ar command.
>
>Thanks,
>
>
>Kelly Hickel
>
>
>
>> -----Original Message-----
>> From: cmake-bounces at cmake.org [mailto:cmake-bounces at cmake.org] On
>> Behalf Of Hickel, Kelly
>> Sent: Wednesday, July 21, 2010 3:46 PM
>> To: Verweij, Arjen; cmake at cmake.org
>> Subject: Re: [CMake] how to set ar/ranlib flags per target
>>
>>
>> > -----Original Message-----
>> > From: cmake-bounces at cmake.org [mailto:cmake-bounces at cmake.org] On
>> > Behalf Of Verweij, Arjen
>> > Sent: Wednesday, July 21, 2010 3:43 PM
>> > To: cmake at cmake.org
>> > Subject: Re: [CMake] how to set ar/ranlib flags per target
>> >
>> > Kelly,
>> >
>> > I suffer from the same problem and solved it like this:
>> >
>> > SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS>
>> > <OBJECTS>")
>> > SET(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> -X64 r  <TARGET> <LINK_FLAGS>
>> > <OBJECTS>")
>> > SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -X64 <TARGET>")
>> > SET(CMAKE_CXX_ARCHIVE_CREATE ${CMAKE_C_ARCHIVE_CREATE})
>> > SET(CMAKE_CXX_ARCHIVE_APPEND ${CMAKE_C_ARCHIVE_APPEND})
>> > SET(CMAKE_CXX_ARCHIVE_FINISH ${CMAKE_C_ARCHIVE_FINISH})
>> > SET(CMAKE_Fortran_ARCHIVE_CREATE ${CMAKE_C_ARCHIVE_CREATE})
>> > SET(CMAKE_Fortran_ARCHIVE_APPEND ${CMAKE_C_ARCHIVE_APPEND})
>> > SET(CMAKE_Fortran_ARCHIVE_FINISH ${CMAKE_C_ARCHIVE_FINISH})
>> >
>> > Does that help you?
>> >
>> > Regards,
>> > Arjen
>>
>> Thanks Arjen, but I don't believe it does.
>> As far as I know that sets the flag globally, I have some targets that
>> are 32 bit and some that are 64 bit, so I need to set it per target.
>>
>> Reading the source, I found STATIC_LIBRARY_FLAGS, which *almost*
>works,
>> but it puts the flags AFTER the name of the output library, and ar on
>> AIX doesn't like that, complains it can't find the object file -X64.
>> Apparently the flag must come before the "cr" or "r" commands, e.g.
>"ar
>> -X64 cr foo.a bar.o baz.o".
>>
>> Thanks,
>> -Kelly
>>
>> >
>> > >-----Original Message-----
>> > >From: cmake-bounces at cmake.org [mailto:cmake-bounces at cmake.org] On
>> > Behalf
>> > >Of Hickel, Kelly
>> > >Sent: woensdag 21 juli 2010 21:00
>> > >To: cmake at cmake.org
>> > >Subject: [CMake] how to set ar/ranlib flags per target
>> > >
>> > >
>> > >Hello,
>> > >
>> > >I'm using CMake 2.8.1, and have a problem on AIX similar to this
>> one:
>> > >http://web.archiveorange.com/archive/v/5y7PkUbT6iizO31eshQa .
>> > >
>> > >I have the additional complication of needing to build both 32 and
>> 64
>> > >bit libraries from the same set of CMake files.
>> > >
>> > >I've tried a number of things (list below), does anyone have any
>> > ideas?
>> > >
>> > >(Wherever I write CMAKE_C_xyz below, I've also changed
>CMAKE_CXX_xyz
>> > >at the same time, where I write xyz_ARCHIVE_CREATE, I've also
>> changed
>> > >xyz_ARCHIVE_APPEND)
>> > >
>> > >1) Adding the flag to LINK_FLAGS because the definition for
>> > >   CMAKE_C_ARCHIVE_CREATE appears to include that on the command
>> line,
>> > >   but the generated link.txt input files don't include any
>options.
>> > >2) Changed the definition for CMAKE_C_ARCHIVE_CREATE in a private
>> > >   toolchain file that I specify on the command line.  By writing
>> > >   messages that show the value of that variable, I can see my
>> change
>> > >   take, but it appears to get reset to the default before
>> processing
>> > of
>> > >   my CMakeLists.txt file begins.
>> > >3) Frequently set CMAKE_C_ARCHIVE_CREATE to "<CMAKE_AR> <AR_FLAGS>
>r
>> > >   <TARGET> <LINK_FLAGS> <OBJECTS>", when I did this, I ended up
>> with
>> > >the
>> > >   literal string "AR_FLAGS" in the link.txt file, not that useful!
>> > >
>> > >I'm sure I'm missing something, any hints will be appreciated!
>> > >
>> > >Thanks,
>> > >Kelly
>> > >
>> > >_______________________________________________
>> > >Powered by www.kitware.com
>> > >
>> > >Visit other Kitware open-source projects at
>> > >http://www.kitware.com/opensource/opensource.html
>> > >
>> > >Please keep messages on-topic and check the CMake FAQ at:
>> > >http://www.cmake.org/Wiki/CMake_FAQ
>> > >
>> > >Follow this link to subscribe/unsubscribe:
>> > >http://www.cmake.org/mailman/listinfo/cmake
>> > _______________________________________________
>> > Powered by www.kitware.com
>> >
>> > Visit other Kitware open-source projects at
>> > http://www.kitware.com/opensource/opensource.html
>> >
>> > Please keep messages on-topic and check the CMake FAQ at:
>> > http://www.cmake.org/Wiki/CMake_FAQ
>> >
>> > Follow this link to subscribe/unsubscribe:
>> > http://www.cmake.org/mailman/listinfo/cmake
>>
>> _______________________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.cmake.org/mailman/listinfo/cmake



More information about the CMake mailing list