mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-15 03:48:02 +08:00
Unity: Add a target property to control generated filenames
If not set default to `unity_` as before. Closes: #26927
This commit is contained in:

committed by
Brad King

parent
1dfe9898e6
commit
5723e65215
@@ -431,6 +431,7 @@ syn keyword cmakeProperty contained
|
|||||||
\ UNITY_BUILD_BATCH_SIZE
|
\ UNITY_BUILD_BATCH_SIZE
|
||||||
\ UNITY_BUILD_CODE_AFTER_INCLUDE
|
\ UNITY_BUILD_CODE_AFTER_INCLUDE
|
||||||
\ UNITY_BUILD_CODE_BEFORE_INCLUDE
|
\ UNITY_BUILD_CODE_BEFORE_INCLUDE
|
||||||
|
\ UNITY_BUILD_FILENAME_PREFIX
|
||||||
\ UNITY_BUILD_MODE
|
\ UNITY_BUILD_MODE
|
||||||
\ UNITY_BUILD_RELOCATABLE
|
\ UNITY_BUILD_RELOCATABLE
|
||||||
\ UNITY_BUILD_UNIQUE_ID
|
\ UNITY_BUILD_UNIQUE_ID
|
||||||
|
@@ -422,6 +422,7 @@ Properties on Targets
|
|||||||
/prop_tgt/UNITY_BUILD_BATCH_SIZE
|
/prop_tgt/UNITY_BUILD_BATCH_SIZE
|
||||||
/prop_tgt/UNITY_BUILD_CODE_AFTER_INCLUDE
|
/prop_tgt/UNITY_BUILD_CODE_AFTER_INCLUDE
|
||||||
/prop_tgt/UNITY_BUILD_CODE_BEFORE_INCLUDE
|
/prop_tgt/UNITY_BUILD_CODE_BEFORE_INCLUDE
|
||||||
|
/prop_tgt/UNITY_BUILD_FILENAME_PREFIX
|
||||||
/prop_tgt/UNITY_BUILD_MODE
|
/prop_tgt/UNITY_BUILD_MODE
|
||||||
/prop_tgt/UNITY_BUILD_RELOCATABLE
|
/prop_tgt/UNITY_BUILD_RELOCATABLE
|
||||||
/prop_tgt/UNITY_BUILD_UNIQUE_ID
|
/prop_tgt/UNITY_BUILD_UNIQUE_ID
|
||||||
|
25
Help/prop_tgt/UNITY_BUILD_FILENAME_PREFIX.rst
Normal file
25
Help/prop_tgt/UNITY_BUILD_FILENAME_PREFIX.rst
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
UNITY_BUILD_FILENAME_PREFIX
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
.. versionadded:: 4.2
|
||||||
|
|
||||||
|
By default, the unity file generated when :prop_tgt:`UNITY_BUILD` is enabled
|
||||||
|
is of the form ``unity_<index>_<suffix>``, where ``<suffix>`` is language-specific.
|
||||||
|
|
||||||
|
If several targets are using unity builds, the build output may give no
|
||||||
|
indication which target a unity file belongs to. This property allows
|
||||||
|
customizing the prefix of the generated unity file name. If unset,
|
||||||
|
the default prefix ``unity_`` is used.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
|
||||||
|
.. code-block:: cmake
|
||||||
|
|
||||||
|
add_library(example_library
|
||||||
|
source1.cxx
|
||||||
|
source2.cxx
|
||||||
|
source3.cxx)
|
||||||
|
|
||||||
|
set_target_properties(example_library PROPERTIES
|
||||||
|
UNITY_BUILD True
|
||||||
|
UNITY_BUILD_FILENAME_PREFIX "example_")
|
5
Help/release/dev/unity-filename-prefix.rst
Normal file
5
Help/release/dev/unity-filename-prefix.rst
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
unity-filename-prefix
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
* The :prop_tgt:`UNITY_BUILD_FILENAME_PREFIX` target property was added
|
||||||
|
to control names of source files generated by :prop_tgt:`UNITY_BUILD`.
|
@@ -2943,9 +2943,8 @@ void cmLocalGenerator::CopyPchCompilePdb(
|
|||||||
<< from_file << "\"))\n";
|
<< from_file << "\"))\n";
|
||||||
file << " file(MAKE_DIRECTORY \"" << to_dir << "\")\n";
|
file << " file(MAKE_DIRECTORY \"" << to_dir << "\")\n";
|
||||||
file << " execute_process(COMMAND ${CMAKE_COMMAND} -E copy";
|
file << " execute_process(COMMAND ${CMAKE_COMMAND} -E copy";
|
||||||
file << " \"" << from_file << "\""
|
file << " \"" << from_file << "\"" << " \"" << to_dir
|
||||||
<< " \"" << to_dir << "\" RESULT_VARIABLE result "
|
<< "\" RESULT_VARIABLE result " << " ERROR_QUIET)\n";
|
||||||
<< " ERROR_QUIET)\n";
|
|
||||||
file << " if (NOT result EQUAL 0)\n"
|
file << " if (NOT result EQUAL 0)\n"
|
||||||
<< " execute_process(COMMAND ${CMAKE_COMMAND}"
|
<< " execute_process(COMMAND ${CMAKE_COMMAND}"
|
||||||
<< " -E sleep 1)\n"
|
<< " -E sleep 1)\n"
|
||||||
@@ -2953,8 +2952,7 @@ void cmLocalGenerator::CopyPchCompilePdb(
|
|||||||
file << " break()\n"
|
file << " break()\n"
|
||||||
<< " endif()\n";
|
<< " endif()\n";
|
||||||
file << " elseif(NOT EXISTS \"" << from_file << "\")\n"
|
file << " elseif(NOT EXISTS \"" << from_file << "\")\n"
|
||||||
<< " execute_process(COMMAND ${CMAKE_COMMAND}"
|
<< " execute_process(COMMAND ${CMAKE_COMMAND}" << " -E sleep 1)\n"
|
||||||
<< " -E sleep 1)\n"
|
|
||||||
<< " endif()\n";
|
<< " endif()\n";
|
||||||
file << "endforeach()\n";
|
file << "endforeach()\n";
|
||||||
outputs.push_back(configGenex(dest_file));
|
outputs.push_back(configGenex(dest_file));
|
||||||
@@ -3173,6 +3171,14 @@ std::string unity_file_extension(std::string const& lang)
|
|||||||
}
|
}
|
||||||
return extension;
|
return extension;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char const* unity_file_prefix(cmGeneratorTarget* target)
|
||||||
|
{
|
||||||
|
if (cmValue val = target->GetProperty("UNITY_BUILD_FILENAME_PREFIX")) {
|
||||||
|
return val->c_str();
|
||||||
|
}
|
||||||
|
return "unity_";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<cmLocalGenerator::UnitySource>
|
std::vector<cmLocalGenerator::UnitySource>
|
||||||
@@ -3186,15 +3192,15 @@ cmLocalGenerator::AddUnityFilesModeAuto(
|
|||||||
if (batchSize == 0) {
|
if (batchSize == 0) {
|
||||||
batchSize = filtered_sources.size();
|
batchSize = filtered_sources.size();
|
||||||
}
|
}
|
||||||
|
char const* filename_prefix = unity_file_prefix(target);
|
||||||
std::vector<UnitySource> unity_files;
|
std::vector<UnitySource> unity_files;
|
||||||
for (size_t itemsLeft = filtered_sources.size(), chunk, batch = 0;
|
for (size_t itemsLeft = filtered_sources.size(), chunk, batch = 0;
|
||||||
itemsLeft > 0; itemsLeft -= chunk, ++batch) {
|
itemsLeft > 0; itemsLeft -= chunk, ++batch) {
|
||||||
|
|
||||||
chunk = std::min(itemsLeft, batchSize);
|
chunk = std::min(itemsLeft, batchSize);
|
||||||
|
|
||||||
std::string filename =
|
std::string filename = cmStrCat(filename_base, filename_prefix, batch,
|
||||||
cmStrCat(filename_base, "unity_", batch, unity_file_extension(lang));
|
unity_file_extension(lang));
|
||||||
auto const begin = filtered_sources.begin() + batch * batchSize;
|
auto const begin = filtered_sources.begin() + batch * batchSize;
|
||||||
auto const end = begin + chunk;
|
auto const end = begin + chunk;
|
||||||
unity_files.emplace_back(this->WriteUnitySource(
|
unity_files.emplace_back(this->WriteUnitySource(
|
||||||
@@ -3230,10 +3236,11 @@ cmLocalGenerator::AddUnityFilesModeGroup(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char const* filename_prefix = unity_file_prefix(target);
|
||||||
for (auto const& item : explicit_mapping) {
|
for (auto const& item : explicit_mapping) {
|
||||||
auto const& name = item.first;
|
auto const& name = item.first;
|
||||||
std::string filename =
|
std::string filename = cmStrCat(filename_base, filename_prefix, name,
|
||||||
cmStrCat(filename_base, "unity_", name, unity_file_extension(lang));
|
unity_file_extension(lang));
|
||||||
unity_files.emplace_back(this->WriteUnitySource(
|
unity_files.emplace_back(this->WriteUnitySource(
|
||||||
target, configs, cmMakeRange(item.second), beforeInclude, afterInclude,
|
target, configs, cmMakeRange(item.second), beforeInclude, afterInclude,
|
||||||
std::move(filename), filename_base, pathMode));
|
std::move(filename), filename_base, pathMode));
|
||||||
|
@@ -19,6 +19,7 @@ run_cmake(unitybuild_cxx_group)
|
|||||||
run_cmake(unitybuild_c_and_cxx_absolute_path)
|
run_cmake(unitybuild_c_and_cxx_absolute_path)
|
||||||
run_cmake(unitybuild_c_and_cxx_relocatable_path)
|
run_cmake(unitybuild_c_and_cxx_relocatable_path)
|
||||||
run_cmake(unitybuild_c_and_cxx)
|
run_cmake(unitybuild_c_and_cxx)
|
||||||
|
run_cmake(unitybuild_c_and_cxx_filename_prefix)
|
||||||
run_cmake(unitybuild_c_and_cxx_group)
|
run_cmake(unitybuild_c_and_cxx_group)
|
||||||
if(CMake_TEST_OBJC)
|
if(CMake_TEST_OBJC)
|
||||||
run_cmake(unitybuild_objc)
|
run_cmake(unitybuild_objc)
|
||||||
|
@@ -0,0 +1,11 @@
|
|||||||
|
set(unitybuild_c "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/custom_prefix_0_c.c")
|
||||||
|
if(NOT EXISTS "${unitybuild_c}")
|
||||||
|
set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_c} does not exist.")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(unitybuild_cxx "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/tgt.dir/Unity/custom_prefix_0_cxx.cxx")
|
||||||
|
if(NOT EXISTS "${unitybuild_cxx}")
|
||||||
|
set(RunCMake_TEST_FAILED "Generated unity source files ${unitybuild_cxx} does not exist.")
|
||||||
|
return()
|
||||||
|
endif()
|
@@ -0,0 +1,21 @@
|
|||||||
|
set(CMAKE_INTERMEDIATE_DIR_STRATEGY FULL CACHE STRING "" FORCE)
|
||||||
|
|
||||||
|
project(unitybuild_c_and_cxx_filename_prefix C CXX)
|
||||||
|
|
||||||
|
set(srcs "")
|
||||||
|
foreach(s RANGE 1 8)
|
||||||
|
set(src_c "${CMAKE_CURRENT_BINARY_DIR}/s${s}.c")
|
||||||
|
file(WRITE "${src_c}" "int s${s}(void) { return 0; }\n")
|
||||||
|
|
||||||
|
set(src_cxx "${CMAKE_CURRENT_BINARY_DIR}/s${s}.cxx")
|
||||||
|
file(WRITE "${src_cxx}" "int s${s}(void) { return 0; }\n")
|
||||||
|
|
||||||
|
list(APPEND srcs "${src_c}")
|
||||||
|
list(APPEND srcs "${src_cxx}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
add_library(tgt SHARED ${srcs})
|
||||||
|
|
||||||
|
set_target_properties(tgt PROPERTIES
|
||||||
|
UNITY_BUILD ON
|
||||||
|
UNITY_BUILD_FILENAME_PREFIX "custom_prefix_")
|
Reference in New Issue
Block a user