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-boun...@cmake.org [mailto:cmake-boun...@cmake.org] On >> Behalf Of Hickel, Kelly >> Sent: Thursday, July 22, 2010 10:35 AM >> To: Verweij, Arjen; cmake@cmake.org >> Subject: Re: [CMake] how to set ar/ranlib flags per target >> >> >>> -----Original Message----- >>> From: cmake-boun...@cmake.org [mailto:cmake-boun...@cmake.org] On >>> Behalf Of Verweij, Arjen >>> Sent: Thursday, July 22, 2010 6:59 AM >>> To: cmake@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_hic...@bmc.com] >>>> Sent: donderdag 22 juli 2010 13:46 >>>> To: Hickel, Kelly; Verweij, Arjen; cmake@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-boun...@cmake.org [mailto:cmake-boun...@cmake.org] On >>>>> Behalf Of Hickel, Kelly >>>>> Sent: Wednesday, July 21, 2010 3:46 PM >>>>> To: Verweij, Arjen; cmake@cmake.org >>>>> Subject: Re: [CMake] how to set ar/ranlib flags per target >>>>> >>>>> >>>>>> -----Original Message----- >>>>>> From: cmake-boun...@cmake.org [mailto:cmake-boun...@cmake.org] >> On >>>>>> Behalf Of Verweij, Arjen >>>>>> Sent: Wednesday, July 21, 2010 3:43 PM >>>>>> To: cmake@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-boun...@cmake.org [mailto:cmake-boun...@cmake.org] >> On >>>>>> Behalf >>>>>>> Of Hickel, Kelly >>>>>>> Sent: woensdag 21 juli 2010 21:00 >>>>>>> To: cmake@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 _______________________________________________ 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