Browse Source

CMake: Grab all CMAKE_CXX_FLAGS(_<CONFIG>) -Ddefines for Interrogate

Sam Edwards 6 years ago
parent
commit
faced9aa49
1 changed files with 23 additions and 6 deletions
  1. 23 6
      cmake/macros/Interrogate.cmake

+ 23 - 6
cmake/macros/Interrogate.cmake

@@ -220,13 +220,30 @@ function(interrogate_sources target output database language_flags)
   endif()
   set(define_flags "$<$<BOOL:${_compile_defs}>:-D${_q}$<JOIN:${_compile_defs},${_q}\t-D${_q}>${_q}>")
 
-  # If this is a release build that has NDEBUG defined, we need that too:
-  foreach(build_type ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE})
-    string(TOUPPER "${build_type}" build_type)
-    if(CMAKE_CXX_FLAGS_${build_type} MATCHES ".*NDEBUG.*")
-      list(APPEND define_flags "$<$<CONFIG:${build_type}>:-DNDEBUG>")
+  # Some of the definitions may be specified using -D flags in the global
+  # CXX_FLAGS variables; parse those out (this also picks up NDEBUG)
+  set(_configs ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE} "<ALL>")
+  list(REMOVE_DUPLICATES _configs)
+  foreach(_config ${_configs})
+    if(_config STREQUAL "<ALL>")
+      set(flags "${CMAKE_CXX_FLAGS}")
+    else()
+      string(TOUPPER "${_config}" _CONFIG)
+      set(flags "${CMAKE_CXX_FLAGS_${_CONFIG}}")
+    endif()
+
+    # Convert "/D define1" and "-Ddefine2" flags, interspersed with other
+    # compiler nonsense, into a basic "-Ddefine1 -Ddefine2" string
+    string(REGEX MATCHALL "[/-]D[ \t]*[A-Za-z0-9_]+" igate_flags "${flags}")
+    string(REPLACE ";" " " igate_flags "${igate_flags}")
+    string(REPLACE "/D" "-D" igate_flags "${igate_flags}")
+
+    if(_config STREQUAL "<ALL>")
+      list(APPEND define_flags "${igate_flags}")
+    else()
+      list(APPEND define_flags "$<$<CONFIG:${_config}>:${igate_flags}>")
     endif()
-  endforeach(build_type)
+  endforeach(_config)
 
   # In case the user (or a distro buildsystem) is throwing NDEBUG in by hand:
   if(CMAKE_CXX_FLAGS MATCHES ".*NDEBUG.*")