Re: [CMake] how to set ar/ranlib flags per target - Solved
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
Re: [CMake] how to set ar/ranlib flags per target - Solved
Michael, I tried your way of setting it, and that worked. I already had a toolchain file, so wasn't worried about setting it there, but your comment about using a toolchain file prompted me to look at why I was using it. Turns out that it was something I set up early on, and have since found better ways to do the things I was using it for. So, my setup is cleaner now, thanks. Kelly Hickel -Original Message- From: Michael Wild [mailto:them...@gmail.com] Sent: Friday, July 23, 2010 1:29 AM To: Hickel, Kelly Cc: CMake List Subject: Re: [CMake] how to set ar/ranlib flags per target - Solved 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
Re: [CMake] 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
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 -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
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
Re: [CMake] how to set ar/ranlib flags per target - Solved
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
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
[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
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 -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
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
Re: [CMake] how to set ar/ranlib flags per target
Well the thread you reference asks the TS to submit a bug in Mantis. Was such a bug ever submitted? I did a quick check and I can't find one using several queries. No other ideas for fixing your problem except for wrapping add_library to include 32/64 bit argument. Regards, Arjen -Original Message- From: Hickel, Kelly [mailto:kelly_hic...@bmc.com] Sent: woensdag 21 juli 2010 22:46 To: Verweij, Arjen; cmake@cmake.org Subject: RE: 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
Re: [CMake] how to set ar/ranlib flags per target
On 07/21/2010 10:46 PM, Hickel, Kelly wrote: -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. AFAIK, these rule variables are effective for the directory they are defined in, and they are inherited as usual; look at the following: # CMakeLists.txt: CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(RULEVARS C) SET(CMAKE_C_ARCHIVE_CREATE echo \Top directory\; CMAKE_AR cr TARGET LINK_FLAGS OBJECTS) FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/f.c void f(void){}\n) ADD_LIBRARY(f STATIC f.c) ADD_SUBDIRECTORY(subdir1) ADD_SUBDIRECTORY(subdir2) # subdir1/CMakeLists.txt: SET(CMAKE_C_ARCHIVE_CREATE echo \Sub directory\; CMAKE_AR cr TARGET LINK_FLAGS OBJECTS) FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/g.c void g(void){}\n) ADD_LIBRARY(g STATIC g.c) # subdir2/CMakeLists.txt: FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/h.c void h(void){}\n) ADD_LIBRARY(h STATIC h.c) After configuration and make VERBOSE=1, you will see that the targets f and g are built with their individual CMAKE_C_ARCHIVE_CREATE rule while h inherits this rule from the parent directory. Thus, if it's feasible to organize your project so that the 32- and 64-bit targets reside in their own directories you could possibly get by with the manipulation of the rule variables on a per-directory basis. Regards, Michael P.S.: The latest definition of the rules in a directory takes effect for that entire directory, but the subdirectories inherit the definition which is valid at the ADD_SUBDIRECTORY(). Prove it by moving the SET() in the toplevel CMakeLists.txt to the end: f and g won't change, but h is built with the usual rule. 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