summaryrefslogtreecommitdiffstats
path: root/cmake/scripts/common/AddOptions.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/scripts/common/AddOptions.cmake')
-rw-r--r--cmake/scripts/common/AddOptions.cmake78
1 files changed, 78 insertions, 0 deletions
diff --git a/cmake/scripts/common/AddOptions.cmake b/cmake/scripts/common/AddOptions.cmake
new file mode 100644
index 0000000..96837c1
--- /dev/null
+++ b/cmake/scripts/common/AddOptions.cmake
@@ -0,0 +1,78 @@
+# - Add options without repeating them on the command line
+#
+# Synopsis:
+#
+# add_options (lang build opts)
+#
+# where:
+#
+# lang Name of the language whose compiler should receive the
+# options, e.g. CXX. If a comma-separated list is received
+# then the option is added for all those languages. Use the
+# special value ALL_LANGUAGES for these languages: CXX, C
+# and Fortran
+#
+# build Kind of build to which this options should apply,
+# such as DEBUG and RELEASE. This can also be a comma-
+# separated list. Use the special value ALL_BUILDS to apply
+# to all builds.
+#
+# opts List of options to add. Each should be quoted.
+#
+# Example:
+#
+# add_options (CXX RELEASE "-O3" "-DNDEBUG" "-Wall")
+
+function(add_options langs builds)
+ # special handling of empty language specification
+ if("${langs}" STREQUAL "ALL_LANGUAGES")
+ set(langs CXX C Fortran)
+ endif()
+ foreach(lang IN LISTS langs)
+ # prepend underscore if necessary
+ foreach(build IN LISTS builds)
+ if(NOT ("${build}" STREQUAL "ALL_BUILDS"))
+ set(_bld "_${build}")
+ string(TOUPPER "${_bld}" _bld)
+ else()
+ set(_bld "")
+ endif()
+ foreach(_opt IN LISTS ARGN)
+ set(_var "CMAKE_${lang}_FLAGS${_bld}")
+ #message(STATUS "Adding \"${_opt}\" to \${${_var}}")
+ # remove it first
+ string(REPLACE "${_opt}" "" _without "${${_var}}")
+ string(STRIP "${_without}" _without)
+ # we need to strip this one as well, so they are comparable
+ string(STRIP "${${_var}}" _stripped)
+ # if it wasn't there, then add it at the end
+ if("${_without}" STREQUAL "${_stripped}")
+ # don't add any extra spaces if no options yet are set
+ if(NOT ${_stripped} STREQUAL "")
+ set(${_var} "${_stripped} ${_opt}")
+ else()
+ set(${_var} "${_opt}")
+ endif()
+ set(${_var} "${${_var}}" PARENT_SCOPE)
+ endif()
+ endforeach()
+ endforeach()
+ endforeach()
+endfunction()
+
+# set varname to flag unless user has specified something that matches regex
+function(set_default_option varname flag regex)
+ if(NOT "$ENV{CXXFLAGS}" MATCHES "${regex}"
+ AND NOT "${CMAKE_CXX_FLAGS}" MATCHES "${regex}"
+ AND NOT "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}")
+ set(${varname} ${flag} PARENT_SCOPE)
+ else()
+ set(${varname} PARENT_SCOPE)
+ endif()
+endfunction()
+
+# note: this must be called before project()
+macro(no_default_options)
+ # prevent the platform probe to set options
+ set(CMAKE_NOT_USING_CONFIG_FLAGS TRUE)
+endmacro()