CMakeMacroForceAddFlags
From KitwarePublic
Jump to navigationJump to search
I have several projects that depend on the presence of certain arguments to various flags. If the user accidentally removes them, I want to forcefully put them back in while preserving any additional arguments the user may have added. The following macro is helpful for doing this. The operation is similar to a set union, but I don't deal with duplicates in either set.
# This will add arguments not found in ${parameter} to the end. It # does not attempt to remove duplicate arguments already existing in # ${parameter}. MACRO(FORCE_ADD_FLAGS parameter) # Create a separated list of the arguments to loop over SET(p_list ${${parameter}}) SEPARATE_ARGUMENTS(p_list) # Make a copy of the current arguments in ${parameter} SET(new_parameter ${${parameter}}) # Now loop over each required argument and see if it is in our # current list of arguments. FOREACH(required_arg ${ARGN}) # This helps when we get arguments to the function that are # grouped as a string: # # ["-O3 -g"] instead of [-O3 -g] SET(TMP ${required_arg}) #elsewise the Seperate command doesn't work) SEPARATE_ARGUMENTS(TMP) FOREACH(option ${TMP}) # Look for the required argument in our list of existing arguments SET(found FALSE) FOREACH(p_arg ${p_list}) IF (${p_arg} STREQUAL ${option}) SET(found TRUE) ENDIF (${p_arg} STREQUAL ${option}) ENDFOREACH(p_arg) IF(NOT found) # The required argument wasn't found, so we need to add it in. SET(new_parameter "${new_parameter} ${option}") ENDIF(NOT found) ENDFOREACH(option ${TMP}) ENDFOREACH(required_arg ${ARGN}) SET(${parameter} ${new_parameter} CACHE STRING "" FORCE) ENDMACRO(FORCE_ADD_FLAGS)
Here is an example script using the macro.
SET(flags "") MESSAGE("flags = ${flags}") MESSAGE("forcing: -g3 -msse") FORCE_ADD_FLAGS(flags -g3 -msse) MESSAGE("flags = ${flags}") MESSAGE("forcing: \"-msse -msse2\" -O3") FORCE_ADD_FLAGS(flags "-msse -msse2" -O3) MESSAGE("flags = ${flags}") MESSAGE("forcing: -g3") FORCE_ADD_FLAGS(flags -g3) MESSAGE("flags = ${flags}")
Here's the output.
flags = forcing: -g3 -msse flags = -g3 -msse forcing: "-msse -msse2" -O3 flags = -g3 -msse -msse2 -O3 forcing: -g3 flags = -g3 -msse -msse2 -O3
Note that forcing a particular argument only adds it if it isn't already present and any previous arguments are left intact.