diff options
author | Ben Boeckel <ben.boeckel@kitware.com> | 2023-09-24 22:57:53 (GMT) |
---|---|---|
committer | Ben Boeckel <ben.boeckel@kitware.com> | 2024-08-27 16:37:36 (GMT) |
commit | dcf9a66ffe0b7f871b65df8477707facb55a6366 (patch) | |
tree | 68896e20b42e0a2e84a3aeb58eead4fa5a2d99ff | |
parent | bea4fb7cd6de1ae7c7ce399ee8b38cc435cf1395 (diff) | |
download | CMake-dcf9a66ffe0b7f871b65df8477707facb55a6366.zip CMake-dcf9a66ffe0b7f871b65df8477707facb55a6366.tar.gz CMake-dcf9a66ffe0b7f871b65df8477707facb55a6366.tar.bz2 |
cxxmodules: plumb control data for exporting build databases
This includes the target property, its initializing variable, its
initializing environment variable, and updating related docs to mention
the new bits.
-rw-r--r-- | Help/envvar/CMAKE_EXPORT_BUILD_DATABASE.rst | 11 | ||||
-rw-r--r-- | Help/guide/user-interaction/index.rst | 2 | ||||
-rw-r--r-- | Help/manual/cmake-env-variables.7.rst | 1 | ||||
-rw-r--r-- | Help/manual/cmake-properties.7.rst | 1 | ||||
-rw-r--r-- | Help/manual/cmake-variables.7.rst | 1 | ||||
-rw-r--r-- | Help/prop_tgt/EXPORT_BUILD_DATABASE.rst | 9 | ||||
-rw-r--r-- | Help/release/dev/module-cdb.rst | 8 | ||||
-rw-r--r-- | Help/variable/CMAKE_EXPORT_BUILD_DATABASE.rst | 80 | ||||
-rw-r--r-- | Modules/CMakeGenericSystem.cmake | 7 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 5 | ||||
-rw-r--r-- | Tests/RunCMake/property_init/CompileSources.cmake | 1 |
11 files changed, 126 insertions, 0 deletions
diff --git a/Help/envvar/CMAKE_EXPORT_BUILD_DATABASE.rst b/Help/envvar/CMAKE_EXPORT_BUILD_DATABASE.rst new file mode 100644 index 0000000..ff0fec4 --- /dev/null +++ b/Help/envvar/CMAKE_EXPORT_BUILD_DATABASE.rst @@ -0,0 +1,11 @@ +CMAKE_EXPORT_BUILD_DATABASE +--------------------------- + +.. versionadded:: 3.31 + +.. include:: ENV_VAR.txt + +The default value for :variable:`CMAKE_EXPORT_BUILD_DATABASE` when there is no +explicit configuration given on the first run while creating a new build tree. +On later runs in an existing build tree the value persists in the cache as +:variable:`CMAKE_EXPORT_BUILD_DATABASE`. diff --git a/Help/guide/user-interaction/index.rst b/Help/guide/user-interaction/index.rst index 3355992..0c3ef6a 100644 --- a/Help/guide/user-interaction/index.rst +++ b/Help/guide/user-interaction/index.rst @@ -300,6 +300,8 @@ the table below: commands used without a type :variable:`CMAKE_EXPORT_COMPILE_COMMANDS` Generate a ``compile_commands.json`` file for use with clang-based tools + :variable:`CMAKE_EXPORT_BUILD_DATABASE` Generate a ``build_database.json`` + file for use with clang-based tools ========================================== ============================================================ Other project-specific variables may be available diff --git a/Help/manual/cmake-env-variables.7.rst b/Help/manual/cmake-env-variables.7.rst index b2ceeae..fd5935c 100644 --- a/Help/manual/cmake-env-variables.7.rst +++ b/Help/manual/cmake-env-variables.7.rst @@ -47,6 +47,7 @@ Environment Variables that Control the Build /envvar/CMAKE_CONFIG_TYPE /envvar/CMAKE_CONFIGURATION_TYPES /envvar/CMAKE_CROSSCOMPILING_EMULATOR + /envvar/CMAKE_EXPORT_BUILD_DATABASE /envvar/CMAKE_EXPORT_COMPILE_COMMANDS /envvar/CMAKE_GENERATOR /envvar/CMAKE_GENERATOR_INSTANCE diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst index a195787..9ad856d 100644 --- a/Help/manual/cmake-properties.7.rst +++ b/Help/manual/cmake-properties.7.rst @@ -217,6 +217,7 @@ Properties on Targets /prop_tgt/EXCLUDE_FROM_ALL /prop_tgt/EXCLUDE_FROM_DEFAULT_BUILD /prop_tgt/EXCLUDE_FROM_DEFAULT_BUILD_CONFIG + /prop_tgt/EXPORT_BUILD_DATABASE /prop_tgt/EXPORT_COMPILE_COMMANDS /prop_tgt/EXPORT_FIND_PACKAGE_NAME /prop_tgt/EXPORT_NAME diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index 1d6331e..3598ece 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -195,6 +195,7 @@ Variables that Change Behavior /variable/CMAKE_ERROR_DEPRECATED /variable/CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION /variable/CMAKE_EXECUTE_PROCESS_COMMAND_ECHO + /variable/CMAKE_EXPORT_BUILD_DATABASE /variable/CMAKE_EXPORT_COMPILE_COMMANDS /variable/CMAKE_EXPORT_PACKAGE_REGISTRY /variable/CMAKE_EXPORT_NO_PACKAGE_REGISTRY diff --git a/Help/prop_tgt/EXPORT_BUILD_DATABASE.rst b/Help/prop_tgt/EXPORT_BUILD_DATABASE.rst new file mode 100644 index 0000000..6b2ad1b --- /dev/null +++ b/Help/prop_tgt/EXPORT_BUILD_DATABASE.rst @@ -0,0 +1,9 @@ +EXPORT_BUILD_DATABASE +--------------------- + +.. versionadded:: 3.31 + +Enable/Disable output of a build database for a target. + +This property is initialized by the value of the variable +:variable:`CMAKE_EXPORT_BUILD_DATABASE` if it is set when a target is created. diff --git a/Help/release/dev/module-cdb.rst b/Help/release/dev/module-cdb.rst new file mode 100644 index 0000000..6c28c79 --- /dev/null +++ b/Help/release/dev/module-cdb.rst @@ -0,0 +1,8 @@ +module-cdb +========== + +* Targets with C++ modules may now export their module compile commands using + the :prop_tgt:`EXPORT_BUILD_DATABASE` target property. This is initialized + with the :variable:`CMAKE_EXPORT_BUILD_DATABASE` variable which is itself + initialized using the :envvar:`CMAKE_EXPORT_BUILD_DATABASE` environment + variable. Only supported with the :ref:`Ninja Generators`. diff --git a/Help/variable/CMAKE_EXPORT_BUILD_DATABASE.rst b/Help/variable/CMAKE_EXPORT_BUILD_DATABASE.rst new file mode 100644 index 0000000..6b606a0 --- /dev/null +++ b/Help/variable/CMAKE_EXPORT_BUILD_DATABASE.rst @@ -0,0 +1,80 @@ +CMAKE_EXPORT_BUILD_DATABASE +--------------------------- + +.. versionadded:: 3.31 + +Enable/Disable output of module compile commands during the build. + +If enabled, generates a ``build_database.json`` file containing the +information necessary to compile a target's C++ module sources with any +tooling. The format of the JSON file looks like: + +.. code-block:: javascript + + { + "version": 1, + "revision": 0, + "sets": [ + { + "family-name" : "export_build_database", + "name" : "export_build_database@Debug", + "translation-units" : [ + { + "arguments": [ + "/path/to/compiler", + "...", + ], + "baseline-arguments" : + [ + "...", + ], + "local-arguments" : + [ + "...", + ], + "object": "CMakeFiles/target.dir/source.cxx.o", + "private": true, + "provides": { + "importable": "path/to/bmi" + }, + "requires" : [], + "source": "path/to/source.cxx", + "work-directory": "/path/to/working/directory" + } + ], + "visible-sets" : [] + } + ] + } + +This is initialized by the :envvar:`CMAKE_EXPORT_BUILD_DATABASE` environment +variable, and initializes the :prop_tgt:`EXPORT_BUILD_DATABASE` target +property for all targets. + +.. note:: + This option is implemented only by the :ref:`Ninja Generators`. It is + ignored on other generators. + +When supported and enabled, numerous targets are created in order to make it +possible to build a file containing just the commands that are needed for the +tool in question. + +``cmake_build_database-<CONFIG>`` + Writes ``build_database_<CONFIG>.json``. Writes a build database for the + entire build for the given configuration and all languages. Not available if + the configuration name is the empty string. + +``cmake_build_database-<LANG>-<CONFIG>`` + Writes ``build_database_<LANG>_<CONFIG>.json``. Writes build database for + the entire build for the given configuration and language. Not available if + the configuration name is the empty string. + +``cmake_build_database-<LANG>`` + Writes ``build_database_<LANG>.json``. Writes build database for the entire + build for the given language and all configurations. In a multi-config + generator, other build configuration database may be assumed to exist. + +``cmake_build_database`` + Writes to ``build_database.json``. Writes build database for all languages + and configurations. In a multi-config generator, other build configuration + database may be assumed to exist. diff --git a/Modules/CMakeGenericSystem.cmake b/Modules/CMakeGenericSystem.cmake index ccfde60..88e3bfa 100644 --- a/Modules/CMakeGenericSystem.cmake +++ b/Modules/CMakeGenericSystem.cmake @@ -78,6 +78,13 @@ if(NOT DEFINED CMAKE_EXPORT_COMPILE_COMMANDS AND CMAKE_GENERATOR MATCHES "Ninja| mark_as_advanced(CMAKE_EXPORT_COMPILE_COMMANDS) endif() +if(NOT DEFINED CMAKE_EXPORT_BUILD_DATABASE AND CMAKE_GENERATOR MATCHES "Ninja") + set(CMAKE_EXPORT_BUILD_DATABASE "$ENV{CMAKE_EXPORT_BUILD_DATABASE}" + CACHE BOOL "Enable/Disable output of build database during the build." + ) + mark_as_advanced(CMAKE_EXPORT_BUILD_DATABASE) +endif() + # GetDefaultWindowsPrefixBase # # Compute the base directory for CMAKE_INSTALL_PREFIX based on: diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 32fd16f..da0091b 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -598,6 +598,7 @@ TargetProperty const StaticTargetProperties[] = { // Metadata { "CROSSCOMPILING_EMULATOR"_s, IC::ExecutableTarget }, + { "EXPORT_BUILD_DATABASE"_s, IC::CanCompileSources }, { "EXPORT_COMPILE_COMMANDS"_s, IC::CanCompileSources }, { "FOLDER"_s }, { "TEST_LAUNCHER"_s, IC::ExecutableTarget }, @@ -1895,6 +1896,10 @@ void cmTarget::CopyImportedCxxModulesProperties(cmTarget const* tgt) // Metadata "EchoString", "EXPORT_COMPILE_COMMANDS", + // Do *not* copy this property; it should be re-initialized at synthesis + // time from the `CMAKE_EXPORT_BUILD_DATABASE` variable as `IMPORTED` + // targets ignore the property initialization. + // "EXPORT_BUILD_DATABASE", "FOLDER", "LABELS", "PROJECT_LABEL", diff --git a/Tests/RunCMake/property_init/CompileSources.cmake b/Tests/RunCMake/property_init/CompileSources.cmake index 22b8f3f..eb0a77f 100644 --- a/Tests/RunCMake/property_init/CompileSources.cmake +++ b/Tests/RunCMake/property_init/CompileSources.cmake @@ -177,6 +177,7 @@ set(properties # Metadata "EXPORT_COMPILE_COMMANDS" "OFF" "<SAME>" + "EXPORT_BUILD_DATABASE" "OFF" "<SAME>" ) if (CMAKE_HOST_APPLE) # compile-guarded in CMake |