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

Hickel, Kelly Kelly_Hickel at bmc.com
Thu Jul 22 16:03:29 EDT 2010


Thanks Michael,
 I'll give that a try tomorrow, at least setting it from the top level file, but this seems like exactly the thing that you'd want to do in a toolchain file, doesn't it?  E.g. one of the build tools has a particular restriction, and you need to change the template when using that, so having to jump through hoops to do it seems backwards.

As far as the replace, I suppose it might be safer, although it might not, given that I don't know what future versions might add between TARGET and LINK_FLAGS, but it's certainly not as clear what it's doing. From a simplistic point of view, it takes more lines to do it, and uses more advanced commands to do so.....


Kelly Hickel


> -----Original Message-----
> From: Michael Wild [mailto:themiwi at gmail.com]
> Sent: Thursday, July 22, 2010 2:51 PM
> To: Hickel, Kelly
> Cc: Verweij, Arjen; cmake at cmake.org
> Subject: Re: [CMake] how to set ar/ranlib flags per target - Solved
> 
> I just wanted to post this solution. But why don't you set this in the
> top-level CMakeLists.txt file? Also, you can use a loop over the
> languages and string(REGEX REPLACE ...) to make things a bit safer:
> 
> foreach(lang C CXX)
>   foreach(type CREATE APPEND)
>     string(REGEX REPLACE "(<TARGET>)(.*)(<LINK_FLAGS>)" "\\3 \\1 \\2"
>       CMAKE_${lang}_ARCHIVE_${type} "${CMAKE_${lang}_ARCHIVE_${type}}")
>   endforeach()
> endforeach()
> 
> 
> 
> Michael
> 
> 
> On 22. Jul, 2010, at 20:35 , Hickel, Kelly wrote:
> 
> > It turns out that you can do this (yay!), it's just tricky to
> discover how (well, it was for ME!).
> >
> > I got to wondering when CMake was injecting the STATIC_LIBRARY_FLAGS
> into the ar command line. The answer to this is also the reason why my
> setting LINK_FLAGS didn't have any effect on the ar command line.
> Apparently, cmMakefileLibraryTargetGenerator.cxx uses the target
> property STATIC_LIBRARY_FLAGS value and inserts it where <LINK_FLAGS>
> appears in the template.
> >
> > Since STATIC_LIBRARY_FLAGS is per target, this does what I want, as
> long as I accompany it with :
> >  SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> <LINK_FLAGS> cr <TARGET>
> <OBJECTS>")
> >  SET(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> <LINK_FLAGS> r <TARGET>
> <OBJECTS>")
> >  SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> <LINK_FLAGS> cr <TARGET>
> <OBJECTS>")
> >  SET(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> <LINK_FLAGS> r <TARGET>
> <OBJECTS>")
> >
> > The next problem was that adding those lines into my customized
> toolchain file didn't seem to work, something must be coming along and
> overriding those settings after my file is executed.  For me the
> simplest answer was to add those SET lines (with PARENT_SCOPE added to
> the line) into a function that I end up calling fairly frequently, to
> make sure I get the global setting that I want.  This is overkill, but
> it works just fine....
> >
> >
> > Anyway, just wanted to make sure the "solution" (well, workaround)
> made it into the mailing list archives.
> >
> >
> >
> > Kelly Hickel
> >
> >
> >
> >
> >
> >
> >
> >> -----Original Message-----
> >> From: cmake-bounces at cmake.org [mailto:cmake-bounces at cmake.org] On
> >> Behalf Of Hickel, Kelly
> >> Sent: Thursday, July 22, 2010 10:35 AM
> >> 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: Thursday, July 22, 2010 6:59 AM
> >>> To: cmake at cmake.org
> >>> Subject: Re: [CMake] how to set ar/ranlib flags per target
> >>>
> >>> 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
> >>
> >> Thanks Arjen,  I just don't see how this can help.  This snippet is
> >> ensure that the desired LINKER_LANGUAGE is set for each target, but
> my
> >> immediate issue is that it doesn't seem possible to inject -X64 onto
> >> the ar command line, in the correct place at all, much less on a per
> >> target basis, at least not without code changes (which I may
> undertake,
> >> but I'd REALLY like to avoid that).
> >>
> >> To sum up, I have these issues:
> >> 	1) The definition of CMAKE_C_ARCHIVE_CREATE indicates that it
> >> should use the LINK_FLAGS, but it doesn't do so and I don't know
> why.
> >> 	2) STATIC_LIBRARY_FLAGS *ALMOST* works, but it's putting the flag
> >> after the "/usr/bin/ar cr libfoo.a" and for AIX, it must come before
> >> the "cr".
> >> 	3) trying to manipulate things by setting CMAKE_AR for instance
> >> has a global effect.
> >>
> >> I suppose my best course is to figure out a way to change the source
> to
> >> be able to be more selective on where STATIC_LIBRARY_FLAGS gets
> >> injected, but that seems kind of a large hurdle for me at the moment
> (I
> >> haven't looked at the source that much).
> >>
> >> Thanks,
> >> -Kelly
> >>
> >>
> >>>
> >>>> -----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
> >>>
> >>> _______________________________________________
> >>> 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