[CMake] COMPILE_FLAGS property that appends instead of replaces
I would like to set the COMPILE_FLAGS property multiple times on the same target through set_target_properties(), however only the last call seems to persist. Previous flags set get overridden. Is this the correct behavior? If so, is there a way to make this property append instead of replace on the same target? - Robert Dailey -- 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] COMPILE_FLAGS property that appends instead of replaces
I believe that is the defined behavior. Usually, people would use add_definitions() to add the flags before creating the target. If you have one target per subdirectory, you don't have to worry about removing them afterwards: CMakeLists.txt: add_definitions(/foo) add_subdirectory(baz) add_subdirectory(qux) baz/CMakeLists.txt add_definitions(/bar) add_executable(baz baz.cpp) qux/CMakeLists.txt add_executable(qux qux.cpp) baz gets the compiler flags /foo /bar, qux only gets /foo. As an aside, I ran into a similar issue, but with Linker Flags in the cache. To overcome that, I wrote a few functions to encapsulate the writing of flags and handle checking for duplicates. You could certainly do something similar with properties: ## Cache Set Helper Functions function(AppendIfMissing _outVar _inVar _value) string(REGEX REPLACE ; _inList ${${_inVar}}) list(FIND _inList ${_value} _pos) if(${_pos} EQUAL -1) set(${_outVar} ${${_inVar}} ${_value} PARENT_SCOPE) else() set(${_outVar} ${${_inVar}} PARENT_SCOPE) endif() endfunction(AppendIfMissing) function(CheckAndAppendCacheForce _varName _value _type ) AppendIfMissing(_outvar ${_varName} ${_value}) foreach(_arg IN LISTS ARGN) set(_desc ${_desc} ${_arg}) endforeach() set(${_varName} ${_outvar} CACHE ${_type} ${_desc} FORCE) endfunction(CheckAndAppendCacheForce) function(CheckAndAppendCache _varName _value _type ) AppendIfMissing(_outvar ${_varName} ${_value}) foreach(_arg IN LISTS ARGN) set(_desc ${_desc} ${_arg}) endforeach() set(${_varName} ${_outvar} CACHE ${_type} ${_desc}) endfunction(CheckAndAppendCache) Aaron Meadows From: cmake-boun...@cmake.org [mailto:cmake-boun...@cmake.org] On Behalf Of Robert Dailey Sent: Monday, February 06, 2012 3:58 PM To: CMake ML Subject: [CMake] COMPILE_FLAGS property that appends instead of replaces I would like to set the COMPILE_FLAGS property multiple times on the same target through set_target_properties(), however only the last call seems to persist. Previous flags set get overridden. Is this the correct behavior? If so, is there a way to make this property append instead of replace on the same target? - Robert Dailey This email was sent to you by Thomson Reuters, the global news and information company. Any views expressed in this message are those of the individual sender, except where the sender specifically states them to be the views of Thomson Reuters.-- 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] COMPILE_FLAGS property that appends instead of replaces
Thanks. This seems to work: set_property( TARGET foo APPEND_STRING PROPERTY COMPILE_FLAGS /ZI ) set_property( TARGET foo APPEND_STRING PROPERTY COMPILE_FLAGS /W4 ) Just make sure you have a space at the end of each one, so that when the strings are appended, there is a space between each compiler flag. - Robert Dailey On Mon, Feb 6, 2012 at 4:13 PM, aaron.mead...@thomsonreuters.com wrote: *I believe that is the defined behavior. Usually, people would use add_definitions() to add the flags before creating the target. If you have one target per subdirectory, you don’t have to worry about removing them afterwards:* * * *CMakeLists.txt:* * add_definitions(/foo)* * * * add_subdirectory(baz)* * add_subdirectory(qux)* * * *baz/CMakeLists.txt* * add_definitions(/bar)* * add_executable(baz baz.cpp)* * * *qux/CMakeLists.txt* * add_executable(qux qux.cpp)* * * * * *baz gets the compiler flags “/foo /bar”, qux only gets “/foo”.* * * * * * * *As an aside, I ran into a similar issue, but with Linker Flags in the cache. To overcome that, I wrote a few functions to encapsulate the writing of flags and handle checking for duplicates. You could certainly do something similar with properties:* * * ** *## Cache Set Helper Functions* ** *function(AppendIfMissing _outVar _inVar _value)* * string(REGEX REPLACE ; _inList ${${_inVar}})* * list(FIND _inList ${_value} _pos)* * * * if(${_pos} EQUAL -1)* *set(${_outVar} ${${_inVar}} ${_value} PARENT_SCOPE)* * else()* *set(${_outVar} ${${_inVar}} PARENT_SCOPE)* * endif()* *endfunction(AppendIfMissing)* * * *function(CheckAndAppendCacheForce _varName _value _type )* * AppendIfMissing(_outvar ${_varName} ${_value})* * * * foreach(_arg IN LISTS ARGN)* *set(_desc ${_desc} ${_arg})* * endforeach()* * * * set(${_varName} ${_outvar} CACHE ${_type} ${_desc} FORCE)* *endfunction(CheckAndAppendCacheForce)* * * *function(CheckAndAppendCache _varName _value _type )* * AppendIfMissing(_outvar ${_varName} ${_value})* * * * foreach(_arg IN LISTS ARGN)* *set(_desc ${_desc} ${_arg})* * endforeach()* * * * set(${_varName} ${_outvar} CACHE ${_type} ${_desc})* *endfunction(CheckAndAppendCache)* * * * * *Aaron Meadows* * * *From:* cmake-boun...@cmake.org [mailto:cmake-boun...@cmake.org] *On Behalf Of *Robert Dailey *Sent:* Monday, February 06, 2012 3:58 PM *To:* CMake ML *Subject:* [CMake] COMPILE_FLAGS property that appends instead of replaces ** ** I would like to set the COMPILE_FLAGS property multiple times on the same target through set_target_properties(), however only the last call seems to persist. Previous flags set get overridden. Is this the correct behavior? If so, is there a way to make this property append instead of replace on the same target? ** ** - Robert Dailey This email was sent to you by Thomson Reuters, the global news and information company. Any views expressed in this message are those of the individual sender, except where the sender specifically states them to be the views of Thomson Reuters. -- 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