Quellcode durchsuchen

Tests/CXXModules: add tests for module commands

Ben Boeckel vor 2 Jahren
Ursprung
Commit
6863c1d823
46 geänderte Dateien mit 3378 neuen und 1 gelöschten Zeilen
  1. 2 0
      Tests/RunCMake/CXXModules/Inspect.cmake
  2. 39 0
      Tests/RunCMake/CXXModules/NinjaDependInfoCompileDatabase-check.cmake
  3. 52 0
      Tests/RunCMake/CXXModules/NinjaDependInfoCompileDatabase.cmake
  4. 41 0
      Tests/RunCMake/CXXModules/RunCMakeTest.cmake
  5. 65 1
      Tests/RunCMake/CXXModules/check-json.cmake
  6. 81 0
      Tests/RunCMake/CXXModules/examples/build-database-check.cmake
  7. 300 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-all-multi.json
  8. 153 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-all.json
  9. 153 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-config.json
  10. 153 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-cxx-config.json
  11. 300 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-cxx-multi.json
  12. 153 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-cxx.json
  13. 278 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-all-multi.json
  14. 142 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-all.json
  15. 142 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-config.json
  16. 142 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-cxx-config.json
  17. 278 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-cxx-multi.json
  18. 142 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-cxx.json
  19. 59 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-target.json
  20. 153 0
      Tests/RunCMake/CXXModules/examples/expect/export-build-database-target.json
  21. 19 0
      Tests/RunCMake/CXXModules/examples/export-build-database-build-check.cmake
  22. 19 0
      Tests/RunCMake/CXXModules/examples/export-build-database-check.cmake
  23. 37 0
      Tests/RunCMake/CXXModules/examples/export-build-database-setup.cmake
  24. 21 0
      Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database-check.cmake
  25. 21 0
      Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database/CXX-check.cmake
  26. 14 0
      Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database/CXX/Debug-check.cmake
  27. 14 0
      Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database/CXX/Release-Release-check.cmake
  28. 14 0
      Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database/Debug-check.cmake
  29. 14 0
      Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database/Release-Release-check.cmake
  30. 85 0
      Tests/RunCMake/CXXModules/examples/export-build-database/CMakeLists.txt
  31. 0 0
      Tests/RunCMake/CXXModules/examples/export-build-database/dep_interface_include/anchor
  32. 6 0
      Tests/RunCMake/CXXModules/examples/export-build-database/importable.cxx
  33. 6 0
      Tests/RunCMake/CXXModules/examples/export-build-database/lib.cxx
  34. 0 0
      Tests/RunCMake/CXXModules/examples/export-build-database/target_interface_include/anchor
  35. 0 0
      Tests/RunCMake/CXXModules/examples/export-build-database/target_public_include/anchor
  36. 18 0
      Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-build-check.cmake
  37. 18 0
      Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-check.cmake
  38. 22 0
      Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database-check.cmake
  39. 22 0
      Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database/CXX-check.cmake
  40. 19 0
      Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database/CXX/Debug-check.cmake
  41. 19 0
      Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database/CXX/Release-Release-check.cmake
  42. 19 0
      Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database/Debug-check.cmake
  43. 19 0
      Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database/Release-check.cmake
  44. 22 0
      Tests/RunCMake/CXXModules/examples/import-modules/CMakeLists.txt
  45. 51 0
      Tests/RunCMake/CXXModules/expect/NinjaDependInfoCompileDatabase-private.json
  46. 51 0
      Tests/RunCMake/CXXModules/expect/NinjaDependInfoCompileDatabase-public.json

+ 2 - 0
Tests/RunCMake/CXXModules/Inspect.cmake

@@ -42,6 +42,8 @@ set(CMAKE_CXX_OUTPUT_EXTENSION \"${CMAKE_CXX_OUTPUT_EXTENSION}\")
 set(CXXModules_default_build_type \"${CMAKE_BUILD_TYPE}\")
 set(CXXModules_default_build_type \"${CMAKE_BUILD_TYPE}\")
 set(CMAKE_CXX_STANDARD_DEFAULT \"${CMAKE_CXX_STANDARD_DEFAULT}\")
 set(CMAKE_CXX_STANDARD_DEFAULT \"${CMAKE_CXX_STANDARD_DEFAULT}\")
 set(CMAKE_CXX20_STANDARD_COMPILE_OPTION \"${CMAKE_CXX20_STANDARD_COMPILE_OPTION}\")
 set(CMAKE_CXX20_STANDARD_COMPILE_OPTION \"${CMAKE_CXX20_STANDARD_COMPILE_OPTION}\")
+set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT \"${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}\")
+set(CMAKE_CXX_MODULE_MAP_FORMAT \"${CMAKE_CXX_MODULE_MAP_FORMAT}\")
 ")
 ")
 
 
 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/info.cmake" "${info}")
 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/info.cmake" "${info}")

+ 39 - 0
Tests/RunCMake/CXXModules/NinjaDependInfoCompileDatabase-check.cmake

@@ -0,0 +1,39 @@
+include("${CMAKE_CURRENT_LIST_DIR}/check-json.cmake")
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  set(have_file 0)
+  foreach (CXXModules_config IN ITEMS Release Debug RelWithDebInfo MinSizeRel)
+    if (NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/ninja-compiledb-public.dir/${CXXModules_config}/CXXDependInfo.json")
+      continue ()
+    endif ()
+    set(have_file 1)
+
+    set(CMAKE_BUILD_TYPE "${CXXModules_config}")
+
+    file(READ "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/ninja-compiledb-public.dir/${CXXModules_config}/CXXDependInfo.json" actual_contents)
+    file(READ "${CMAKE_CURRENT_LIST_DIR}/expect/NinjaDependInfoCompileDatabase-public.json" expect_contents)
+    check_json("${actual_contents}" "${expect_contents}")
+
+    file(READ "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/ninja-compiledb-private.dir/${CXXModules_config}/CXXDependInfo.json" actual_contents)
+    file(READ "${CMAKE_CURRENT_LIST_DIR}/expect/NinjaDependInfoCompileDatabase-private.json" expect_contents)
+    check_json("${actual_contents}" "${expect_contents}")
+  endforeach ()
+
+  if (NOT have_file)
+    list(APPEND RunCMake_TEST_FAILED
+      "No recognized build configurations found.")
+  endif ()
+else ()
+  set(CXXModules_config "${CXXModules_default_build_type}")
+  set(CMAKE_BUILD_TYPE "${CXXModules_default_build_type}")
+
+  file(READ "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/ninja-compiledb-public.dir/CXXDependInfo.json" actual_contents)
+  file(READ "${CMAKE_CURRENT_LIST_DIR}/expect/NinjaDependInfoCompileDatabase-public.json" expect_contents)
+  check_json("${actual_contents}" "${expect_contents}")
+
+  file(READ "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/ninja-compiledb-private.dir/CXXDependInfo.json" actual_contents)
+  file(READ "${CMAKE_CURRENT_LIST_DIR}/expect/NinjaDependInfoCompileDatabase-private.json" expect_contents)
+  check_json("${actual_contents}" "${expect_contents}")
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 52 - 0
Tests/RunCMake/CXXModules/NinjaDependInfoCompileDatabase.cmake

@@ -0,0 +1,52 @@
+# Fake out that we have dyndep; we only need to generate, not actually build
+# here.
+set(CMAKE_CXX_SCANDEP_SOURCE "")
+
+enable_language(CXX)
+
+if (NOT CMAKE_GENERATOR MATCHES "Ninja")
+  message(FATAL_ERROR
+    "This test requires a 'Ninja' generator to be used.")
+endif ()
+
+add_library(ninja-compiledb-public)
+target_sources(ninja-compiledb-public
+  PRIVATE
+    sources/module-impl.cxx
+    sources/module-internal-part-impl.cxx
+    sources/module-part-impl.cxx
+  PUBLIC
+    FILE_SET modules TYPE CXX_MODULES
+    BASE_DIRS
+      "${CMAKE_CURRENT_SOURCE_DIR}/sources"
+    FILES
+      sources/module.cxx
+      sources/module-part.cxx
+    FILE_SET internal_partitions TYPE CXX_MODULES FILES
+      sources/module-internal-part.cxx)
+target_compile_features(ninja-compiledb-public
+  PRIVATE
+    cxx_std_20)
+set_property(TARGET ninja-compiledb-public
+  PROPERTY EXPORT_BUILD_DATABASE 1)
+
+add_library(ninja-compiledb-private)
+target_sources(ninja-compiledb-private
+  PRIVATE
+    sources/module-impl.cxx
+    sources/module-internal-part-impl.cxx
+    sources/module-part-impl.cxx
+  PRIVATE
+    FILE_SET modules TYPE CXX_MODULES
+    BASE_DIRS
+      "${CMAKE_CURRENT_SOURCE_DIR}/sources"
+    FILES
+      sources/module.cxx
+      sources/module-part.cxx
+    FILE_SET internal_partitions TYPE CXX_MODULES FILES
+      sources/module-internal-part.cxx)
+target_compile_features(ninja-compiledb-private
+  PRIVATE
+    cxx_std_20)
+set_property(TARGET ninja-compiledb-private
+  PROPERTY EXPORT_BUILD_DATABASE 1)

+ 41 - 0
Tests/RunCMake/CXXModules/RunCMakeTest.cmake

@@ -119,6 +119,7 @@ if (RunCMake_GENERATOR MATCHES "Ninja")
   run_cmake(NinjaDependInfoExportFilesystemSafe)
   run_cmake(NinjaDependInfoExportFilesystemSafe)
   run_cmake(NinjaDependInfoBMIInstall)
   run_cmake(NinjaDependInfoBMIInstall)
   run_cmake(NinjaForceResponseFile) # issue#25367
   run_cmake(NinjaForceResponseFile) # issue#25367
+  run_cmake(NinjaDependInfoCompileDatabase)
 elseif (RunCMake_GENERATOR MATCHES "Visual Studio")
 elseif (RunCMake_GENERATOR MATCHES "Visual Studio")
   run_cmake(VisualStudioNoSyntheticTargets)
   run_cmake(VisualStudioNoSyntheticTargets)
 else ()
 else ()
@@ -286,6 +287,32 @@ if ("compile_commands" IN_LIST CMake_TEST_MODULE_COMPILATION)
   run_cxx_module_test(export-compile-commands)
   run_cxx_module_test(export-compile-commands)
 endif ()
 endif ()
 
 
+macro (setup_export_build_database_targets)
+  set(RunCMake_CXXModules_TARGETS
+    cmake_build_database-CXX
+    cmake_build_database)
+
+  if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+    list(INSERT RunCMake_CXXModules_TARGETS 0
+      cmake_build_database-CXX-Debug
+      cmake_build_database-Debug
+      # Other config targets.
+      cmake_build_database-CXX-Release@Release
+      cmake_build_database-Release@Release)
+  endif ()
+endmacro ()
+
+# Tests which require build database support.
+if ("build_database" IN_LIST CMake_TEST_MODULE_COMPILATION)
+  setup_export_build_database_targets()
+  set(RunCMake_CXXModules_NO_TEST 1)
+
+  run_cxx_module_test(export-build-database)
+
+  unset(RunCMake_CXXModules_NO_TEST)
+  unset(RunCMake_CXXModules_TARGETS)
+endif ()
+
 # Tests which require collation work.
 # Tests which require collation work.
 if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION)
 if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION)
   run_cxx_module_test(public-req-private)
   run_cxx_module_test(public-req-private)
@@ -316,6 +343,12 @@ endif ()
 
 
 function (run_cxx_module_import_test type name)
 function (run_cxx_module_import_test type name)
   set(RunCMake_CXXModules_INSTALL 0)
   set(RunCMake_CXXModules_INSTALL 0)
+
+  if ("EXPORT_BUILD_DATABASE" IN_LIST ARGN)
+    list(REMOVE_ITEM ARGN EXPORT_BUILD_DATABASE)
+    list(APPEND ARGN -DCMAKE_EXPORT_BUILD_DATABASE=1)
+  endif ()
+
   run_cxx_module_test(import-modules "import-modules-${name}" "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/${name}-${type}" ${ARGN})
   run_cxx_module_test(import-modules "import-modules-${name}" "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/${name}-${type}" ${ARGN})
 endfunction ()
 endfunction ()
 
 
@@ -343,6 +376,14 @@ if ("export_bmi" IN_LIST CMake_TEST_MODULE_COMPILATION)
     run_cxx_module_import_test(build export-transitive-targets-build -DTRANSITIVE_TARGETS=1)
     run_cxx_module_import_test(build export-transitive-targets-build -DTRANSITIVE_TARGETS=1)
     run_cxx_module_import_test(build export-transitive-modules-build -DTRANSITIVE_MODULES=1)
     run_cxx_module_import_test(build export-transitive-modules-build -DTRANSITIVE_MODULES=1)
     run_cxx_module_import_test(build export-with-headers-build -DWITH_HEADERS=1)
     run_cxx_module_import_test(build export-with-headers-build -DWITH_HEADERS=1)
+
+    if ("build_database" IN_LIST CMake_TEST_MODULE_COMPILATION)
+      setup_export_build_database_targets()
+
+      run_cxx_module_import_test(build export-build-database -DBUILD_DATABASE=1 EXPORT_BUILD_DATABASE)
+
+      unset(RunCMake_CXXModules_TARGETS)
+    endif ()
   endif ()
   endif ()
 endif ()
 endif ()
 
 

+ 65 - 1
Tests/RunCMake/CXXModules/check-json.cmake

@@ -3,19 +3,48 @@ cmake_policy(SET CMP0057 NEW)
 
 
 function (json_placeholders in out)
 function (json_placeholders in out)
   string(REPLACE "<CONFIG>" "${CXXModules_config}" in "${in}")
   string(REPLACE "<CONFIG>" "${CXXModules_config}" in "${in}")
+  string(TOLOWER "${CXXModules_config}" config_lower)
+  string(REPLACE "<CONFIG_LOWER>" "${config_lower}" in "${in}")
+  string(REPLACE "<CONFIG_OTHER>" "${CXXModules_config_other}" in "${in}")
+  string(TOLOWER "${CXXModules_config_other}" config_lower)
+  string(REPLACE "<CONFIG_OTHER_LOWER>" "${config_lower}" in "${in}")
   if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
   if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
     string(REPLACE "<CONFIG_DIR>" "/${CXXModules_config}" in "${in}")
     string(REPLACE "<CONFIG_DIR>" "/${CXXModules_config}" in "${in}")
+    string(REPLACE "<CONFIG_OTHER_DIR>" "/${CXXModules_config_other}" in "${in}")
   else ()
   else ()
     string(REPLACE "<CONFIG_DIR>" "" in "${in}")
     string(REPLACE "<CONFIG_DIR>" "" in "${in}")
+    string(REPLACE "<CONFIG_OTHER_DIR>" "" in "${in}")
   endif ()
   endif ()
   if (CMAKE_BUILD_TYPE)
   if (CMAKE_BUILD_TYPE)
     string(REPLACE "<CONFIG_FORCE>" "${CXXModules_config}" in "${in}")
     string(REPLACE "<CONFIG_FORCE>" "${CXXModules_config}" in "${in}")
+    string(REPLACE "<CONFIG_OTHER_FORCE>" "${CXXModules_config_other}" in "${in}")
   else ()
   else ()
     string(REPLACE "<CONFIG_FORCE>" "noconfig" in "${in}")
     string(REPLACE "<CONFIG_FORCE>" "noconfig" in "${in}")
   endif ()
   endif ()
   string(REPLACE "<SOURCE_DIR>" "${RunCMake_SOURCE_DIR}" in "${in}")
   string(REPLACE "<SOURCE_DIR>" "${RunCMake_SOURCE_DIR}" in "${in}")
   string(REPLACE "<BINARY_DIR>" "${RunCMake_TEST_BINARY_DIR}" in "${in}")
   string(REPLACE "<BINARY_DIR>" "${RunCMake_TEST_BINARY_DIR}" in "${in}")
   string(REPLACE "<OBJEXT>" "${CMAKE_CXX_OUTPUT_EXTENSION}" in "${in}")
   string(REPLACE "<OBJEXT>" "${CMAKE_CXX_OUTPUT_EXTENSION}" in "${in}")
+  if (CMAKE_CXX_MODULE_MAP_FORMAT STREQUAL "gcc")
+    set(bmiflag "-fmodule-only")
+    set(bmiext "gcm")
+  elseif (CMAKE_CXX_MODULE_MAP_FORMAT STREQUAL "clang")
+    set(bmiflag "--precompile")
+    set(bmiext "pcm")
+  elseif (CMAKE_CXX_MODULE_MAP_FORMAT STREQUAL "msvc")
+    set(bmiflag "-ifcOutput.*")
+    set(bmiext "ifc")
+  endif ()
+  string(REPLACE "<BMI_ONLY_FLAG>" "${bmiflag}" in "${in}")
+  string(REPLACE "<BMIEXT>" ".${bmiext}" in "${in}")
+  set(output_flag "-o")
+  if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
+    set(output_flag "-Fo")
+  endif ()
+  string(REPLACE "<OUTPUT_FLAG>" "${output_flag}" in "${in}")
+  string(REPLACE "<CXX20_OPTION>" "${CMAKE_CXX20_STANDARD_COMPILE_OPTION}" in "${in}")
+  string(REPLACE "<HEX>" "[0-9a-f]+" in "${in}")
+  string(REPLACE "REGEX:" "" in "${in}")
+  string(REPLACE "PATH:" "" in "${in}")
   set("${out}" "${in}" PARENT_SCOPE)
   set("${out}" "${in}" PARENT_SCOPE)
 endfunction ()
 endfunction ()
 
 
@@ -46,7 +75,26 @@ function (check_json_value path actual_type expect_type actual_value expect_valu
     endif ()
     endif ()
 
 
     json_placeholders("${expect_value}" expect_value_expanded)
     json_placeholders("${expect_value}" expect_value_expanded)
-    if (NOT actual_value STREQUAL expect_value_expanded)
+    if (expect_value MATCHES "^REGEX:PATH:")
+      string(REPLACE "\\" "/" actual_value_check "${actual_value}")
+      string(REGEX REPLACE "^\"(.*)\"$" "\\1" actual_value_check "${actual_value_check}")
+      if (NOT actual_value_check MATCHES "^${expect_value_expanded}$")
+        list(APPEND RunCMake_TEST_FAILED
+          "String mismatch (path regex) at ${path}: ${actual_value} vs. ^${expect_value_expanded}$")
+      endif ()
+    elseif (expect_value MATCHES "^REGEX:")
+      if (NOT actual_value MATCHES "^${expect_value_expanded}$")
+        list(APPEND RunCMake_TEST_FAILED
+          "String mismatch (regex) at ${path}: ${actual_value} vs. ^${expect_value_expanded}$")
+      endif ()
+    elseif (expect_value MATCHES "^PATH:")
+      string(REPLACE "\\" "/" actual_value_check "${actual_value}")
+      string(REGEX REPLACE "^\"(.*)\"$" "\\1" actual_value_check "${actual_value_check}")
+      if (NOT actual_value_check STREQUAL "${expect_value_expanded}")
+        list(APPEND RunCMake_TEST_FAILED
+          "String mismatch (path) at ${path}: ${actual_value} vs. ^${expect_value_expanded}$")
+      endif ()
+    elseif (NOT actual_value STREQUAL expect_value_expanded)
       list(APPEND RunCMake_TEST_FAILED
       list(APPEND RunCMake_TEST_FAILED
         "String mismatch at ${path}: ${actual_value} vs. ${expect_value_expanded}")
         "String mismatch at ${path}: ${actual_value} vs. ${expect_value_expanded}")
     endif ()
     endif ()
@@ -61,6 +109,22 @@ endfunction ()
 
 
 # Check that two arrays are the same.
 # Check that two arrays are the same.
 function (check_json_array path actual expect)
 function (check_json_array path actual expect)
+  if (item_filter)
+    string(JSON iter_len LENGTH "${actual}")
+    set(idx 0)
+    while (idx LESS iter_len)
+      string(JSON type TYPE "${actual}" "${idx}")
+      string(JSON item GET "${actual}" "${idx}")
+      if (type STREQUAL "STRING" AND
+          item MATCHES "${item_filter}")
+        string(JSON actual REMOVE "${actual}" "${idx}")
+        math(EXPR iter_len "${iter_len} - 1")
+      else ()
+        math(EXPR idx "${idx} + 1")
+      endif ()
+    endwhile ()
+  endif ()
+
   string(JSON actual_len LENGTH "${actual}")
   string(JSON actual_len LENGTH "${actual}")
   string(JSON expect_len LENGTH "${expect}")
   string(JSON expect_len LENGTH "${expect}")
 
 

+ 81 - 0
Tests/RunCMake/CXXModules/examples/build-database-check.cmake

@@ -0,0 +1,81 @@
+cmake_policy(PUSH)
+cmake_policy(SET CMP0057 NEW)
+
+include("${CMAKE_CURRENT_LIST_DIR}/../check-json.cmake")
+
+function (check_build_database expect_basename fname component)
+  if (component STREQUAL "NO_EXIST")
+    if (EXISTS "${RunCMake_TEST_BINARY_DIR}/${fname}")
+      list(APPEND RunCMake_TEST_FAILED
+        "Build database detected before it is expected (${fname}).")
+      set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE)
+    endif ()
+    return ()
+  endif ()
+
+  if (NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/${fname}")
+    list(APPEND RunCMake_TEST_FAILED
+      "No build database detected (${fname}).")
+    set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE)
+    return ()
+  endif ()
+
+  if (component STREQUAL "ALL")
+    set(CXXModules_config "Debug")
+    set(suffix "all")
+  elseif (component STREQUAL "ALL_MULTI")
+    set(CXXModules_config "Debug")
+    set(CXXModules_config_other "Release")
+    set(suffix "all-multi")
+  elseif (component STREQUAL "JUST_CXX")
+    set(CXXModules_config "Debug")
+    set(suffix "cxx")
+  elseif (component STREQUAL "JUST_CXX_MULTI")
+    set(CXXModules_config "Debug")
+    set(CXXModules_config_other "Release")
+    set(suffix "cxx-multi")
+  elseif (component STREQUAL "CXX_AND_DEBUG")
+    set(CXXModules_config "Debug")
+    set(suffix "cxx-config")
+  elseif (component STREQUAL "CXX_AND_RELEASE")
+    set(CXXModules_config "Release")
+    set(suffix "cxx-config")
+  elseif (component STREQUAL "JUST_DEBUG")
+    set(CXXModules_config "Debug")
+    set(suffix "config")
+  elseif (component STREQUAL "JUST_RELEASE")
+    set(CXXModules_config "Release")
+    set(suffix "config")
+  elseif (component STREQUAL "JUST_TARGET_DEBUG")
+    set(CXXModules_config "Debug")
+    set(suffix "target")
+  elseif (component STREQUAL "JUST_TARGET_RELEASE")
+    set(CXXModules_config "Release")
+    set(suffix "target")
+  elseif (component STREQUAL "JUST_TARGET")
+    set(CXXModules_config "Debug")
+    set(suffix "target")
+  else ()
+    list(APPEND RunCMake_TEST_FAILED
+      "Unrecognized test component for ${fname}: ${component}")
+    set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE)
+    return ()
+  endif ()
+
+  set(expected_file "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/expect/${expect_basename}-${suffix}.json")
+  if (NOT EXISTS "${expected_file}")
+    list(APPEND RunCMake_TEST_FAILED
+      "No expected output JSON file found: ${expected_file}")
+    set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE)
+    return ()
+  endif ()
+
+  file(READ "${RunCMake_TEST_BINARY_DIR}/${fname}" actual)
+  file(READ "${expected_file}" expect)
+
+  check_json("${actual}" "${expect}")
+
+  set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE)
+endfunction ()
+
+cmake_policy(POP)

+ 300 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-all-multi.json

@@ -0,0 +1,300 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "export_build_database",
+      "name": "export_build_database@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx",
+          "work-directory": "<BINARY_DIR>"
+        },
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "PATH:<BINARY_DIR>/CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable<BMIEXT>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    },
+    {
+      "family-name": "export_build_database",
+      "name": "export_build_database@<CONFIG_OTHER>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/lib.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/lib.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/lib.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx",
+          "work-directory": "<BINARY_DIR>"
+        },
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/importable.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/importable.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/importable.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<BINARY_DIR>/CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/importable<BMIEXT>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 153 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-all.json

@@ -0,0 +1,153 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "export_build_database",
+      "name": "export_build_database@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx",
+          "work-directory": "<BINARY_DIR>"
+        },
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<BINARY_DIR>/CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable<BMIEXT>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 153 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-config.json

@@ -0,0 +1,153 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "export_build_database",
+      "name": "export_build_database@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx",
+          "work-directory": "<BINARY_DIR>"
+        },
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "PATH:<BINARY_DIR>/CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable<BMIEXT>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 153 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-cxx-config.json

@@ -0,0 +1,153 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "export_build_database",
+      "name": "export_build_database@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx",
+          "work-directory": "<BINARY_DIR>"
+        },
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "PATH:<BINARY_DIR>/CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable<BMIEXT>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 300 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-cxx-multi.json

@@ -0,0 +1,300 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "export_build_database",
+      "name": "export_build_database@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx",
+          "work-directory": "<BINARY_DIR>"
+        },
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "PATH:<BINARY_DIR>/CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable<BMIEXT>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    },
+    {
+      "family-name": "export_build_database",
+      "name": "export_build_database@<CONFIG_OTHER>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/lib.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/lib.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/lib.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx",
+          "work-directory": "<BINARY_DIR>"
+        },
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/importable.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/importable.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/importable.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "PATH:<BINARY_DIR>/CMakeFiles/export_build_database.dir<CONFIG_OTHER_DIR>/importable<BMIEXT>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 153 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-cxx.json

@@ -0,0 +1,153 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "export_build_database",
+      "name": "export_build_database@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx",
+          "work-directory": "<BINARY_DIR>"
+        },
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "PATH:<BINARY_DIR>/CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable<BMIEXT>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 278 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-all-multi.json

@@ -0,0 +1,278 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "use_import_interfaces",
+      "name": "use_import_interfaces@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option",
+            "PATH:-Ddepflag=\"CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx"
+          ],
+          "baseline-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "local-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": ["REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>"]
+    },
+    {
+      "family-name": "use_import_interfaces",
+      "name": "use_import_interfaces@<CONFIG_OTHER>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option",
+            "PATH:-Ddepflag=\"CMakeFiles/use_import_interfaces.dir<CONFIG_OTHER_DIR>/use.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/use_import_interfaces.dir<CONFIG_OTHER_DIR>/use.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx"
+          ],
+          "baseline-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "local-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_OTHER_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": ["REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG_OTHER>"]
+    },
+    {
+      "family-name": "REGEX:CXXModules::export_build_database@<HEX>",
+      "name": "REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option",
+            "REGEX:PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/.d\"",
+            "REGEX:<BMI_ONLY_FLAG>",
+            "REGEX:PATH:<OUTPUT_FLAG>CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<IGNORE>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    },
+    {
+      "family-name": "REGEX:CXXModules::export_build_database@<HEX>",
+      "name": "REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG_OTHER>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option",
+            "REGEX:PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_OTHER_DIR>/.d\"",
+            "REGEX:<BMI_ONLY_FLAG>",
+            "REGEX:PATH:<OUTPUT_FLAG>CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_OTHER_DIR>/",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_OTHER_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<IGNORE>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 142 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-all.json

@@ -0,0 +1,142 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "use_import_interfaces",
+      "name": "use_import_interfaces@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option",
+            "PATH:-Ddepflag=\"CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx"
+          ],
+          "baseline-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "local-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": ["REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>"]
+    },
+    {
+      "family-name": "REGEX:CXXModules::export_build_database@<HEX>",
+      "name": "REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option",
+            "REGEX:PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/.d\"",
+            "REGEX:<BMI_ONLY_FLAG>",
+            "REGEX:PATH:<OUTPUT_FLAG>CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<IGNORE>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 142 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-config.json

@@ -0,0 +1,142 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "use_import_interfaces",
+      "name": "use_import_interfaces@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option",
+            "PATH:-Ddepflag=\"CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx"
+          ],
+          "baseline-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "local-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": ["REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>"]
+    },
+    {
+      "family-name": "REGEX:CXXModules::export_build_database@<HEX>",
+      "name": "REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option",
+            "REGEX:PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/.d\"",
+            "REGEX:<BMI_ONLY_FLAG>",
+            "REGEX:PATH:<OUTPUT_FLAG>CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<IGNORE>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 142 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-cxx-config.json

@@ -0,0 +1,142 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "use_import_interfaces",
+      "name": "use_import_interfaces@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option",
+            "PATH:-Ddepflag=\"CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx"
+          ],
+          "baseline-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "local-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": ["REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>"]
+    },
+    {
+      "family-name": "REGEX:CXXModules::export_build_database@<HEX>",
+      "name": "REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option",
+            "REGEX:PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/.d\"",
+            "REGEX:<BMI_ONLY_FLAG>",
+            "REGEX:PATH:<OUTPUT_FLAG>CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<IGNORE>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 278 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-cxx-multi.json

@@ -0,0 +1,278 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "use_import_interfaces",
+      "name": "use_import_interfaces@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option",
+            "PATH:-Ddepflag=\"CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx"
+          ],
+          "baseline-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "local-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": ["REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>"]
+    },
+    {
+      "family-name": "use_import_interfaces",
+      "name": "use_import_interfaces@<CONFIG_OTHER>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option",
+            "PATH:-Ddepflag=\"CMakeFiles/use_import_interfaces.dir<CONFIG_OTHER_DIR>/use.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/use_import_interfaces.dir<CONFIG_OTHER_DIR>/use.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx"
+          ],
+          "baseline-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "local-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_OTHER_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": ["REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG_OTHER>"]
+    },
+    {
+      "family-name": "REGEX:CXXModules::export_build_database@<HEX>",
+      "name": "REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option",
+            "REGEX:PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/.d\"",
+            "REGEX:<BMI_ONLY_FLAG>",
+            "REGEX:PATH:<OUTPUT_FLAG>CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<IGNORE>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    },
+    {
+      "family-name": "REGEX:CXXModules::export_build_database@<HEX>",
+      "name": "REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG_OTHER>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option",
+            "REGEX:PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_OTHER_DIR>/.d\"",
+            "REGEX:<BMI_ONLY_FLAG>",
+            "REGEX:PATH:<OUTPUT_FLAG>CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_OTHER_DIR>/",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_OTHER_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_OTHER_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<IGNORE>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 142 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-cxx.json

@@ -0,0 +1,142 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "use_import_interfaces",
+      "name": "use_import_interfaces@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option",
+            "PATH:-Ddepflag=\"CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx"
+          ],
+          "baseline-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "local-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": ["REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>"]
+    },
+    {
+      "family-name": "REGEX:CXXModules::export_build_database@<HEX>",
+      "name": "REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option",
+            "REGEX:PATH:-Ddepflag=\"CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/.d\"",
+            "REGEX:<BMI_ONLY_FLAG>",
+            "REGEX:PATH:<OUTPUT_FLAG>CMakeFiles/CXXModules__export_build_database@synth_<HEX>.dir<CONFIG_DIR>/",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_interface_define",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dtarget_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<IGNORE>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 59 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-imported-target.json

@@ -0,0 +1,59 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "use_import_interfaces",
+      "name": "use_import_interfaces@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option",
+            "PATH:-Ddepflag=\"CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx"
+          ],
+          "baseline-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "local-arguments": [
+            "-Dtarget_interface_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_interface_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dtarget_interface_option",
+            "-Dtarget_public_option"
+          ],
+          "object": "PATH:CMakeFiles/use_import_interfaces.dir<CONFIG_DIR>/use.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/import-modules/use.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": ["REGEX:CXXModules__export_build_database@synth_<HEX>@<CONFIG>"]
+    }
+  ]
+}

+ 153 - 0
Tests/RunCMake/CXXModules/examples/expect/export-build-database-target.json

@@ -0,0 +1,153 @@
+{
+  "version": 1,
+  "revision": 0,
+  "sets": [
+    {
+      "family-name": "export_build_database",
+      "name": "export_build_database@<CONFIG>",
+      "translation-units": [
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/lib.cxx<OBJEXT>",
+          "private": true,
+          "provides": {},
+          "requires": ["importable"],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/lib.cxx",
+          "work-directory": "<BINARY_DIR>"
+        },
+        {
+          "arguments": [
+            "<IGNORE>",
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option",
+            "PATH:-Ddepflag=\"CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>.d\"",
+            "PATH:<OUTPUT_FLAG>CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+            "-c",
+            "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx"
+          ],
+          "baseline-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option"
+          ],
+          "local-arguments": [
+            "-Ddep_interface_define",
+            "-Dfrom_compile_definitions",
+            "-Dtarget_private_define",
+            "-Dtarget_public_define",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/from_include_directories",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_private_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/target_public_include",
+            "PATH:-I<SOURCE_DIR>/examples/export-build-database/dep_interface_include",
+            "-Dfrom_cmake_cxx_flags",
+            "-Dfrom_cmake_cxx_<CONFIG_LOWER>_flags",
+            "<CXX20_OPTION>",
+            "-Dfrom_compile_flags",
+            "-Dfrom_compile_options",
+            "-Dtarget_private_option",
+            "-Dtarget_public_option",
+            "-Ddep_interface_option",
+            "-Dfrom_source_flag",
+            "-Dfrom_source_option"
+          ],
+          "object": "PATH:CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable.cxx<OBJEXT>",
+          "private": true,
+          "provides": {
+            "importable": "<BINARY_DIR>/CMakeFiles/export_build_database.dir<CONFIG_DIR>/importable<BMIEXT>"
+          },
+          "requires": [],
+          "source": "PATH:<SOURCE_DIR>/examples/export-build-database/importable.cxx",
+          "work-directory": "<BINARY_DIR>"
+        }
+      ],
+      "visible-sets": []
+    }
+  ]
+}

+ 19 - 0
Tests/RunCMake/CXXModules/examples/export-build-database-build-check.cmake

@@ -0,0 +1,19 @@
+include("${CMAKE_CURRENT_LIST_DIR}/build-database-check.cmake")
+
+check_build_database("export-build-database" "build_database.json" NO_EXIST)
+check_build_database("export-build-database" "build_database_CXX.json" NO_EXIST)
+
+check_build_database("export-build-database" "build_database_CXX_Debug.json" NO_EXIST)
+check_build_database("export-build-database" "build_database_Debug.json" NO_EXIST)
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+  # check_build_database("export-build-database" "build_database_CXX_Release.json" NO_EXIST)
+  # check_build_database("export-build-database" "build_database_Release.json" NO_EXIST)
+  # check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Release/CXX_build_database.json" NO_EXIST)
+else ()
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/CXX_build_database.json" JUST_TARGET)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 19 - 0
Tests/RunCMake/CXXModules/examples/export-build-database-check.cmake

@@ -0,0 +1,19 @@
+include("${CMAKE_CURRENT_LIST_DIR}/build-database-check.cmake")
+
+check_build_database("export-build-database" "build_database.json" NO_EXIST)
+check_build_database("export-build-database" "build_database_CXX.json" NO_EXIST)
+
+check_build_database("export-build-database" "build_database_CXX_Debug.json" NO_EXIST)
+check_build_database("export-build-database" "build_database_Debug.json" NO_EXIST)
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Debug/CXX_build_database.json" NO_EXIST)
+
+  check_build_database("export-build-database" "build_database_CXX_Release.json" NO_EXIST)
+  check_build_database("export-build-database" "build_database_Release.json" NO_EXIST)
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Release/CXX_build_database.json" NO_EXIST)
+else ()
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/CXX_build_database.json" NO_EXIST)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 37 - 0
Tests/RunCMake/CXXModules/examples/export-build-database-setup.cmake

@@ -0,0 +1,37 @@
+get_property(is_multiconfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+if (is_multiconfig)
+  set(CMAKE_CONFIGURATION_TYPES "Debug" "Release")
+endif ()
+
+set(CMAKE_EXPORT_BUILD_DATABASE 1)
+
+# Mock up depfile flags to keep things consistent; we don't need accurate
+# dependency tracking for this test case anyways.
+set(CMAKE_CXX_DEPFILE_FORMAT gcc)
+set(CMAKE_DEPFILE_FLAGS_CXX "-Ddepflag=\\\"<DEP_FILE>\\\"")
+unset(CMAKE_CXX_DEPFILE_EXTENSION_REPLACE)
+
+# Disable MSVC flag injection from CMake abstractions.
+set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "")
+set(CMAKE_MSVC_RUNTIME_LIBRARY "")
+
+if (CMAKE_CXX_MODULE_BMI_ONLY_FLAG MATCHES "ifcOutput")
+  # Make a single flag for BMI-only to make the JSON expectations simpler.
+  set(CMAKE_CXX_MODULE_BMI_ONLY_FLAG
+    "-ifcOnly;-ifcOutput<OBJECT>")
+endif ()
+
+# Disable extensions to keep flag selection simpler.
+set(CMAKE_CXX_EXTENSIONS 0)
+
+if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
+  set(output_flag "-Fo")
+else ()
+  set(output_flag "-o")
+endif ()
+set(CMAKE_CXX_COMPILE_OBJECT
+  "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> ${output_flag}<OBJECT> -c <SOURCE>")
+
+set(CMAKE_CXX_FLAGS "-Dfrom_cmake_cxx_flags")
+set(CMAKE_CXX_FLAGS_DEBUG "-Dfrom_cmake_cxx_debug_flags")
+set(CMAKE_CXX_FLAGS_RELEASE "-Dfrom_cmake_cxx_release_flags")

+ 21 - 0
Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database-check.cmake

@@ -0,0 +1,21 @@
+include("${CMAKE_CURRENT_LIST_DIR}/build-database-check.cmake")
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database" "build_database.json" ALL_MULTI)
+  check_build_database("export-build-database" "build_database_CXX.json" JUST_CXX_MULTI)
+
+  check_build_database("export-build-database" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+  check_build_database("export-build-database" "build_database_Debug.json" JUST_DEBUG)
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+  check_build_database("export-build-database" "build_database_CXX_Release.json" CXX_AND_RELEASE)
+  check_build_database("export-build-database" "build_database_Release.json" JUST_RELEASE)
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Release/CXX_build_database.json" JUST_TARGET_RELEASE)
+else ()
+  check_build_database("export-build-database" "build_database.json" ALL)
+  check_build_database("export-build-database" "build_database_CXX.json" JUST_CXX)
+
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/CXX_build_database.json" JUST_TARGET)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 21 - 0
Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database/CXX-check.cmake

@@ -0,0 +1,21 @@
+include("${CMAKE_CURRENT_LIST_DIR}/../build-database-check.cmake")
+
+check_build_database("export-build-database" "build_database.json" NO_EXIST)
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database" "build_database_CXX.json" JUST_CXX_MULTI)
+
+  check_build_database("export-build-database" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+  check_build_database("export-build-database" "build_database_Debug.json" JUST_DEBUG)
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+  check_build_database("export-build-database" "build_database_CXX_Release.json" CXX_AND_RELEASE)
+  check_build_database("export-build-database" "build_database_Release.json" JUST_RELEASE)
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Release/CXX_build_database.json" JUST_TARGET_RELEASE)
+else ()
+  check_build_database("export-build-database" "build_database_CXX.json" JUST_CXX)
+
+  check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/CXX_build_database.json" JUST_TARGET)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 14 - 0
Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database/CXX/Debug-check.cmake

@@ -0,0 +1,14 @@
+include("${CMAKE_CURRENT_LIST_DIR}/../../build-database-check.cmake")
+
+check_build_database("export-build-database" "build_database.json" NO_EXIST)
+check_build_database("export-build-database" "build_database_CXX.json" NO_EXIST)
+
+check_build_database("export-build-database" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+check_build_database("export-build-database" "build_database_Debug.json" NO_EXIST)
+check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+check_build_database("export-build-database" "build_database_CXX_Release.json" NO_EXIST)
+check_build_database("export-build-database" "build_database_Release.json" NO_EXIST)
+check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Release/CXX_build_database.json" NO_EXIST)
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 14 - 0
Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database/CXX/Release-Release-check.cmake

@@ -0,0 +1,14 @@
+include("${CMAKE_CURRENT_LIST_DIR}/../../build-database-check.cmake")
+
+check_build_database("export-build-database" "build_database.json" NO_EXIST)
+check_build_database("export-build-database" "build_database_CXX.json" NO_EXIST)
+
+check_build_database("export-build-database" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+check_build_database("export-build-database" "build_database_Debug.json" JUST_DEBUG)
+check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+check_build_database("export-build-database" "build_database_CXX_Release.json" CXX_AND_RELEASE)
+check_build_database("export-build-database" "build_database_Release.json" NO_EXIST)
+check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Release/CXX_build_database.json" JUST_TARGET_RELEASE)
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 14 - 0
Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database/Debug-check.cmake

@@ -0,0 +1,14 @@
+include("${CMAKE_CURRENT_LIST_DIR}/../build-database-check.cmake")
+
+check_build_database("export-build-database" "build_database.json" NO_EXIST)
+check_build_database("export-build-database" "build_database_CXX.json" NO_EXIST)
+
+check_build_database("export-build-database" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+check_build_database("export-build-database" "build_database_Debug.json" JUST_DEBUG)
+check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+check_build_database("export-build-database" "build_database_CXX_Release.json" NO_EXIST)
+check_build_database("export-build-database" "build_database_Release.json" NO_EXIST)
+check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Release/CXX_build_database.json" NO_EXIST)
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 14 - 0
Tests/RunCMake/CXXModules/examples/export-build-database-target-cmake_build_database/Release-Release-check.cmake

@@ -0,0 +1,14 @@
+include("${CMAKE_CURRENT_LIST_DIR}/../build-database-check.cmake")
+
+check_build_database("export-build-database" "build_database.json" NO_EXIST)
+check_build_database("export-build-database" "build_database_CXX.json" NO_EXIST)
+
+check_build_database("export-build-database" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+check_build_database("export-build-database" "build_database_Debug.json" JUST_DEBUG)
+check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+check_build_database("export-build-database" "build_database_CXX_Release.json" CXX_AND_RELEASE)
+check_build_database("export-build-database" "build_database_Release.json" JUST_RELEASE)
+check_build_database("export-build-database" "CMakeFiles/export_build_database.dir/Release/CXX_build_database.json" JUST_TARGET_RELEASE)
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 85 - 0
Tests/RunCMake/CXXModules/examples/export-build-database/CMakeLists.txt

@@ -0,0 +1,85 @@
+cmake_minimum_required(VERSION 3.29)
+project(cxx_modules_export_build_database CXX)
+
+include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake")
+
+include("${CMAKE_SOURCE_DIR}/../export-build-database-setup.cmake")
+
+add_compile_options(-Dfrom_compile_options)
+add_compile_definitions(-Dfrom_compile_definitions)
+include_directories(from_include_directories)
+
+add_library(provide_flags INTERFACE)
+target_compile_options(provide_flags
+  INTERFACE
+    -Ddep_interface_option)
+target_compile_definitions(provide_flags
+  INTERFACE
+    dep_interface_define)
+target_include_directories(provide_flags
+  INTERFACE
+    dep_interface_include)
+
+add_library(export_build_database)
+target_sources(export_build_database
+  PRIVATE
+    lib.cxx
+  PUBLIC
+    FILE_SET modules
+      TYPE CXX_MODULES
+      BASE_DIRS
+        "${CMAKE_CURRENT_SOURCE_DIR}"
+      FILES
+        importable.cxx)
+target_compile_features(export_build_database PUBLIC cxx_std_20)
+target_link_libraries(export_build_database
+  PRIVATE
+    provide_flags)
+
+set_property(SOURCE importable.cxx APPEND
+  PROPERTY COMPILE_FLAGS "-Dfrom_source_flag")
+set_property(SOURCE importable.cxx APPEND
+  PROPERTY COMPILE_OPTIONS "-Dfrom_source_option")
+set_property(SOURCE importable.cxx APPEND
+  PROPERTY COMPILE_DEFINITIONS "from_source_define")
+
+set_property(TARGET export_build_database APPEND
+  PROPERTY COMPILE_FLAGS "-Dfrom_compile_flags")
+target_compile_options(export_build_database
+  PRIVATE
+    -Dtarget_private_option
+  INTERFACE
+    -Dtarget_interface_option
+  PUBLIC
+    -Dtarget_public_option)
+target_compile_definitions(export_build_database
+  PRIVATE
+    target_private_define
+  INTERFACE
+    target_interface_define
+  PUBLIC
+    target_public_define)
+target_include_directories(export_build_database
+  PRIVATE
+    target_private_include
+  INTERFACE
+    target_interface_include
+  PUBLIC
+    target_public_include)
+
+install(TARGETS export_build_database
+  EXPORT CXXModules
+  FILE_SET modules DESTINATION "lib/cxx/miu")
+export(EXPORT CXXModules
+  NAMESPACE CXXModules::
+  FILE "${CMAKE_CURRENT_BINARY_DIR}/export_build_database-targets.cmake")
+install(TARGETS provide_flags
+  EXPORT CXXModulesDeps)
+export(EXPORT CXXModulesDeps
+  NAMESPACE CXXModules::
+  FILE "${CMAKE_CURRENT_BINARY_DIR}/export_build_database-dep-targets.cmake")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_build_database-config.cmake"
+  "include(\"\${CMAKE_CURRENT_LIST_DIR}/export_build_database-dep-targets.cmake\")
+include(\"\${CMAKE_CURRENT_LIST_DIR}/export_build_database-targets.cmake\")
+set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
+")

+ 0 - 0
Tests/RunCMake/CXXModules/examples/export-build-database/dep_interface_include/anchor


+ 6 - 0
Tests/RunCMake/CXXModules/examples/export-build-database/importable.cxx

@@ -0,0 +1,6 @@
+export module importable;
+
+export int from_import()
+{
+  return 0;
+}

+ 6 - 0
Tests/RunCMake/CXXModules/examples/export-build-database/lib.cxx

@@ -0,0 +1,6 @@
+import importable;
+
+int f()
+{
+  return from_import();
+}

+ 0 - 0
Tests/RunCMake/CXXModules/examples/export-build-database/target_interface_include/anchor


+ 0 - 0
Tests/RunCMake/CXXModules/examples/export-build-database/target_public_include/anchor


+ 18 - 0
Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-build-check.cmake

@@ -0,0 +1,18 @@
+include("${CMAKE_CURRENT_LIST_DIR}/build-database-check.cmake")
+set(item_filter "-ifcOnly")
+
+check_build_database("export-build-database-imported" "build_database.json" NO_EXIST)
+check_build_database("export-build-database-imported" "build_database_CXX.json" NO_EXIST)
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database-imported" "build_database_CXX_Debug.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "build_database_Debug.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "CMakeFiles/export-module-commands.dir/Debug/CXX_build_database.json" NO_EXIST)
+
+  check_build_database("export-build-database-imported" "build_database_CXX_Release.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "build_database_Release.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "CMakeFiles/export-module-commands.dir/Release/CXX_build_database.json" NO_EXIST)
+else ()
+  check_build_database("export-build-database-imported" "CMakeFiles/export-module-commands.dir/CXX_build_database.json" NO_EXIST)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 18 - 0
Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-check.cmake

@@ -0,0 +1,18 @@
+include("${CMAKE_CURRENT_LIST_DIR}/build-database-check.cmake")
+set(item_filter "-ifcOnly")
+
+check_build_database("export-build-database-imported" "build_database.json" NO_EXIST)
+check_build_database("export-build-database-imported" "build_database_CXX.json" NO_EXIST)
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database-imported" "build_database_CXX_Debug.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "build_database_Debug.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "CMakeFiles/export-module-commands.dir/Debug/CXX_build_database.json" NO_EXIST)
+
+  check_build_database("export-build-database-imported" "build_database_CXX_Release.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "build_database_Release.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "CMakeFiles/export-module-commands.dir/Release/CXX_build_database.json" NO_EXIST)
+else ()
+  check_build_database("export-build-database-imported" "CMakeFiles/export-module-commands.dir/CXX_build_database.json" NO_EXIST)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 22 - 0
Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database-check.cmake

@@ -0,0 +1,22 @@
+include("${CMAKE_CURRENT_LIST_DIR}/build-database-check.cmake")
+set(item_filter "-ifcOnly")
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database-imported" "build_database.json" ALL_MULTI)
+  check_build_database("export-build-database-imported" "build_database_CXX.json" JUST_CXX_MULTI)
+
+  check_build_database("export-build-database-imported" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+  check_build_database("export-build-database-imported" "build_database_Debug.json" JUST_DEBUG)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+  check_build_database("export-build-database-imported" "build_database_CXX_Release.json" CXX_AND_RELEASE)
+  check_build_database("export-build-database-imported" "build_database_Release.json" JUST_RELEASE)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Release/CXX_build_database.json" JUST_TARGET_RELEASE)
+else ()
+  check_build_database("export-build-database-imported" "build_database.json" ALL)
+  check_build_database("export-build-database-imported" "build_database_CXX.json" JUST_CXX)
+
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/CXX_build_database.json" JUST_TARGET)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 22 - 0
Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database/CXX-check.cmake

@@ -0,0 +1,22 @@
+include("${CMAKE_CURRENT_LIST_DIR}/../build-database-check.cmake")
+set(item_filter "-ifcOnly")
+
+check_build_database("export-build-database-imported" "build_database.json" NO_EXIST)
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database-imported" "build_database_CXX.json" JUST_CXX_MULTI)
+
+  check_build_database("export-build-database-imported" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+  check_build_database("export-build-database-imported" "build_database_Debug.json" JUST_DEBUG)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+  check_build_database("export-build-database-imported" "build_database_CXX_Release.json" CXX_AND_RELEASE)
+  check_build_database("export-build-database-imported" "build_database_Release.json" JUST_RELEASE)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Release/CXX_build_database.json" JUST_TARGET_RELEASE)
+else ()
+  check_build_database("export-build-database-imported" "build_database_CXX.json" JUST_CXX)
+
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/CXX_build_database.json" JUST_TARGET)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 19 - 0
Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database/CXX/Debug-check.cmake

@@ -0,0 +1,19 @@
+include("${CMAKE_CURRENT_LIST_DIR}/../../build-database-check.cmake")
+set(item_filter "-ifcOnly")
+
+check_build_database("export-build-database-imported" "build_database.json" NO_EXIST)
+check_build_database("export-build-database-imported" "build_database_CXX.json" NO_EXIST)
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database-imported" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+  check_build_database("export-build-database-imported" "build_database_Debug.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+  check_build_database("export-build-database-imported" "build_database_CXX_Release.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "build_database_Release.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Release/CXX_build_database.json" NO_EXIST)
+else ()
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/CXX_build_database.json" JUST_TARGET)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 19 - 0
Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database/CXX/Release-Release-check.cmake

@@ -0,0 +1,19 @@
+include("${CMAKE_CURRENT_LIST_DIR}/../../build-database-check.cmake")
+set(item_filter "-ifcOnly")
+
+check_build_database("export-build-database-imported" "build_database.json" NO_EXIST)
+check_build_database("export-build-database-imported" "build_database_CXX.json" NO_EXIST)
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database-imported" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+  check_build_database("export-build-database-imported" "build_database_Debug.json" JUST_DEBUG)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+  check_build_database("export-build-database-imported" "build_database_CXX_Release.json" CXX_AND_RELEASE)
+  check_build_database("export-build-database-imported" "build_database_Release.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Release/CXX_build_database.json" JUST_TARGET_RELEASE)
+else ()
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/CXX_build_database.json" JUST_TARGET)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 19 - 0
Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database/Debug-check.cmake

@@ -0,0 +1,19 @@
+include("${CMAKE_CURRENT_LIST_DIR}/../build-database-check.cmake")
+set(item_filter "-ifcOnly")
+
+check_build_database("export-build-database-imported" "build_database.json" NO_EXIST)
+check_build_database("export-build-database-imported" "build_database_CXX.json" NO_EXIST)
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database-imported" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+  check_build_database("export-build-database-imported" "build_database_Debug.json" JUST_DEBUG)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+  check_build_database("export-build-database-imported" "build_database_CXX_Release.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "build_database_Release.json" NO_EXIST)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Release/CXX_build_database.json" NO_EXIST)
+else ()
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/CXX_build_database.json" JUST_TARGET)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 19 - 0
Tests/RunCMake/CXXModules/examples/import-modules-export-build-database-target-cmake_build_database/Release-check.cmake

@@ -0,0 +1,19 @@
+include("${CMAKE_CURRENT_LIST_DIR}/../build-database-check.cmake")
+set(item_filter "-ifcOnly")
+
+check_build_database("export-build-database-imported" "build_database.json" NO_EXIST)
+check_build_database("export-build-database-imported" "build_database_CXX.json" JUST_CXX)
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  check_build_database("export-build-database-imported" "build_database_CXX_Debug.json" CXX_AND_DEBUG)
+  check_build_database("export-build-database-imported" "build_database_Debug.json" JUST_DEBUG)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Debug/CXX_build_database.json" JUST_TARGET_DEBUG)
+
+  check_build_database("export-build-database-imported" "build_database_CXX_Release.json" CXX_AND_RELEASE)
+  check_build_database("export-build-database-imported" "build_database_Release.json" JUST_RELEASE)
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/Release/CXX_build_database.json" JUST_TARGET_RELEASE)
+else ()
+  check_build_database("export-build-database-imported" "CMakeFiles/use_import_interfaces.dir/CXX_build_database.json" JUST_TARGET)
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")

+ 22 - 0
Tests/RunCMake/CXXModules/examples/import-modules/CMakeLists.txt

@@ -19,12 +19,25 @@ elseif (TRANSITIVE_MODULES)
   set(package_name "export_transitive_modules")
   set(package_name "export_transitive_modules")
 elseif (WITH_HEADERS)
 elseif (WITH_HEADERS)
   set(package_name "export_with_headers")
   set(package_name "export_with_headers")
+elseif (BUILD_DATABASE)
+  include("${CMAKE_SOURCE_DIR}/../export-build-database-setup.cmake")
+  set(package_name "export_build_database")
 else ()
 else ()
   set(package_name "export_interfaces")
   set(package_name "export_interfaces")
 endif ()
 endif ()
 set(target_name "CXXModules::${package_name}")
 set(target_name "CXXModules::${package_name}")
 
 
 find_package("${package_name}" REQUIRED)
 find_package("${package_name}" REQUIRED)
+if (BUILD_DATABASE)
+  # Remove `-isystem` flags for better flag checking consistency.
+  set_property(TARGET "CXXModules::${package_name}" "CXXModules::provide_flags"
+    PROPERTY SYSTEM 0)
+  # Disable debug and runtime flag injection.
+  set_property(TARGET "CXXModules::${package_name}"
+    PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "")
+  set_property(TARGET "CXXModules::${package_name}"
+    PROPERTY MSVC_RUNTIME_LIBRARY "")
+endif ()
 
 
 add_executable(use_import_interfaces)
 add_executable(use_import_interfaces)
 target_sources(use_import_interfaces
 target_sources(use_import_interfaces
@@ -32,5 +45,14 @@ target_sources(use_import_interfaces
     use.cxx)
     use.cxx)
 target_compile_features(use_import_interfaces PRIVATE cxx_std_20)
 target_compile_features(use_import_interfaces PRIVATE cxx_std_20)
 target_link_libraries(use_import_interfaces PRIVATE "${target_name}")
 target_link_libraries(use_import_interfaces PRIVATE "${target_name}")
+if (BUILD_DATABASE AND
+    # Detect Clang targeting MSVC ABI.
+    CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
+  # Link to `libcmt.lib`. Build database tests neuter the runtime library
+  # selection to make flag matching easier. Manually perform the "link the
+  # runtime library" injected into the object files by the runtime library
+  # flag.
+  target_link_libraries(use_import_interfaces PRIVATE libcmt)
+endif ()
 
 
 add_test(NAME use_import_interfaces COMMAND use_import_interfaces)
 add_test(NAME use_import_interfaces COMMAND use_import_interfaces)

+ 51 - 0
Tests/RunCMake/CXXModules/expect/NinjaDependInfoCompileDatabase-private.json

@@ -0,0 +1,51 @@
+{
+  "bmi-installation": null,
+  "compiler-id": "<IGNORE>",
+  "compiler-frontend-variant": "<IGNORE>",
+  "compiler-simulate-id": "<IGNORE>",
+  "config": "<CONFIG>",
+  "cxx-modules": {
+    "CMakeFiles/ninja-compiledb-private.dir<CONFIG_DIR>/sources/module-internal-part.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": null,
+      "name": "internal_partitions",
+      "relative-directory": "sources",
+      "source": "<SOURCE_DIR>/sources/module-internal-part.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PRIVATE"
+    },
+    "CMakeFiles/ninja-compiledb-private.dir<CONFIG_DIR>/sources/module-part.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": null,
+      "name": "modules",
+      "relative-directory": "",
+      "source": "<SOURCE_DIR>/sources/module-part.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PRIVATE"
+    },
+    "CMakeFiles/ninja-compiledb-private.dir<CONFIG_DIR>/sources/module.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": null,
+      "name": "modules",
+      "relative-directory": "",
+      "source": "<SOURCE_DIR>/sources/module.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PRIVATE"
+    }
+  },
+  "database-info": {
+    "template-path": "<BINARY_DIR>/CMakeFiles/ninja-compiledb-private.dir<CONFIG_DIR>/CXX_build_database.json.in",
+    "output": "<BINARY_DIR>/CMakeFiles/ninja-compiledb-private.dir<CONFIG_DIR>/CXX_build_database.json"
+  },
+  "dir-cur-bld": "<BINARY_DIR>",
+  "dir-cur-src": "<SOURCE_DIR>",
+  "dir-top-bld": "<BINARY_DIR>",
+  "dir-top-src": "<SOURCE_DIR>",
+  "exports": [],
+  "forward-modules-from-target-dirs": [],
+  "include-dirs": [],
+  "language": "CXX",
+  "linked-target-dirs": [],
+  "module-dir": "<BINARY_DIR>/CMakeFiles/ninja-compiledb-private.dir<CONFIG_DIR>",
+  "sources": {}
+}

+ 51 - 0
Tests/RunCMake/CXXModules/expect/NinjaDependInfoCompileDatabase-public.json

@@ -0,0 +1,51 @@
+{
+  "bmi-installation": null,
+  "compiler-id": "<IGNORE>",
+  "compiler-frontend-variant": "<IGNORE>",
+  "compiler-simulate-id": "<IGNORE>",
+  "config": "<CONFIG>",
+  "cxx-modules": {
+    "CMakeFiles/ninja-compiledb-public.dir<CONFIG_DIR>/sources/module-internal-part.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": null,
+      "name": "internal_partitions",
+      "relative-directory": "sources",
+      "source": "<SOURCE_DIR>/sources/module-internal-part.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PUBLIC"
+    },
+    "CMakeFiles/ninja-compiledb-public.dir<CONFIG_DIR>/sources/module-part.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": null,
+      "name": "modules",
+      "relative-directory": "",
+      "source": "<SOURCE_DIR>/sources/module-part.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PUBLIC"
+    },
+    "CMakeFiles/ninja-compiledb-public.dir<CONFIG_DIR>/sources/module.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": null,
+      "name": "modules",
+      "relative-directory": "",
+      "source": "<SOURCE_DIR>/sources/module.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PUBLIC"
+    }
+  },
+  "database-info": {
+    "template-path": "<BINARY_DIR>/CMakeFiles/ninja-compiledb-public.dir<CONFIG_DIR>/CXX_build_database.json.in",
+    "output": "<BINARY_DIR>/CMakeFiles/ninja-compiledb-public.dir<CONFIG_DIR>/CXX_build_database.json"
+  },
+  "dir-cur-bld": "<BINARY_DIR>",
+  "dir-cur-src": "<SOURCE_DIR>",
+  "dir-top-bld": "<BINARY_DIR>",
+  "dir-top-src": "<SOURCE_DIR>",
+  "exports": [],
+  "forward-modules-from-target-dirs": [],
+  "include-dirs": [],
+  "language": "CXX",
+  "linked-target-dirs": [],
+  "module-dir": "<BINARY_DIR>/CMakeFiles/ninja-compiledb-public.dir<CONFIG_DIR>",
+  "sources": {}
+}