On 22. Jul, 2010, at 22:03 , Hickel, Kelly wrote: > 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.
IMHO using a toolchain file is jumping through the hoops. AFAIK they are only intended for cross-compiling, which you are clearly not. > > 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..... > Indeed, that _could_ be a problem, but then your solution is even more dangerous in case the definitions of CMAKE_XXX_ARCHIVE_YYY variables change. Michael > > Kelly Hickel > > >> -----Original Message----- >> From: Michael Wild [mailto:them...@gmail.com] >> Sent: Thursday, July 22, 2010 2:51 PM >> To: Hickel, Kelly >> Cc: Verweij, Arjen; cmake@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-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