Ninja Multi-Config: Add support for DEPFILE option in add_custom_command()

And give other generators a path forward to add support in the future.
This commit is contained in:
Kyle Edwards 2020-02-07 14:18:54 -05:00
parent ad17c37d34
commit 67102d3252
6 changed files with 23 additions and 1 deletions

View File

@ -174,7 +174,7 @@ bool cmAddCustomCommandCommand(std::vector<std::string> const& args,
doing = doing_comment;
} else if (copy == keyDEPFILE) {
doing = doing_depfile;
if (mf.GetGlobalGenerator()->GetName() != "Ninja") {
if (!mf.GetGlobalGenerator()->SupportsCustomCommandDepfile()) {
status.SetError("Option DEPFILE not supported by " +
mf.GetGlobalGenerator()->GetName());
return false;

View File

@ -448,6 +448,8 @@ public:
MacFolder. */
virtual bool ShouldStripResourcePath(cmMakefile*) const;
virtual bool SupportsCustomCommandDepfile() const { return false; }
std::string GetSharedLibFlagsForLanguage(std::string const& lang) const;
/** Generate an <output>.rule file path for a given command output. */

View File

@ -211,6 +211,8 @@ public:
}
const char* GetCleanTargetName() const override { return "clean"; }
bool SupportsCustomCommandDepfile() const override { return true; }
virtual cmGeneratedFileStream* GetImplFileStream(
const std::string& /*config*/) const
{

View File

@ -0,0 +1,5 @@
set(log "${RunCMake_BINARY_DIR}/CustomCommandDepfile-build/CMakeFiles/impl-Debug.ninja")
file(READ "${log}" build_file)
if(NOT "${build_file}" MATCHES "depfile = test\\.d")
set(RunCMake_TEST_FAILED "Log file:\n ${log}\ndoes not have expected line: depfile = test.d")
endif()

View File

@ -0,0 +1,9 @@
add_custom_command(
OUTPUT main.copy.c
COMMAND "${CMAKE_COMMAND}" -E copy
"${CMAKE_CURRENT_SOURCE_DIR}/main.c"
main.copy.c
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
DEPFILE "test.d"
)
add_custom_target(copy ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/main.copy.c")

View File

@ -224,6 +224,10 @@ run_ninja(CustomCommandsAndTargets release-postbuild build-Release.ninja SubdirP
run_cmake_build(CustomCommandsAndTargets debug-targetpostbuild Debug TopTargetPostBuild)
run_ninja(CustomCommandsAndTargets release-targetpostbuild build-Release.ninja SubdirTargetPostBuild)
unset(RunCMake_TEST_BINARY_DIR)
run_cmake(CustomCommandDepfile)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/PostfixAndLocation-build)
set(RunCMake_TEST_OPTIONS "-DCMAKE_CONFIGURATION_TYPES=Debug\\;Release;-DCMAKE_NMC_CROSS_CONFIGS=all")
run_cmake_configure(PostfixAndLocation)