mirror of
https://github.com/Kitware/CMake.git
synced 2026-02-19 05:30:59 -06:00
add_custom_{command,target}: Teach JOB_SERVER_AWARE about WORKING_DIRECTORY
Issue: #16273
This commit is contained in:
@@ -334,15 +334,6 @@ bool cmAddCustomCommandCommand(std::vector<std::string> const& args,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If using a GNU Make generator and `JOB_SERVER_AWARE` is set then
|
|
||||||
// prefix all commands with '+'.
|
|
||||||
if (cmIsOn(job_server_aware) &&
|
|
||||||
mf.GetGlobalGenerator()->IsGNUMakeJobServerAware()) {
|
|
||||||
for (auto& commandLine : commandLines) {
|
|
||||||
commandLine.insert(commandLine.begin(), "+");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Choose which mode of the command to use.
|
// Choose which mode of the command to use.
|
||||||
auto cc = cm::make_unique<cmCustomCommand>();
|
auto cc = cm::make_unique<cmCustomCommand>();
|
||||||
cc->SetByproducts(byproducts);
|
cc->SetByproducts(byproducts);
|
||||||
@@ -353,6 +344,7 @@ bool cmAddCustomCommandCommand(std::vector<std::string> const& args,
|
|||||||
cc->SetUsesTerminal(uses_terminal);
|
cc->SetUsesTerminal(uses_terminal);
|
||||||
cc->SetDepfile(depfile);
|
cc->SetDepfile(depfile);
|
||||||
cc->SetJobPool(job_pool);
|
cc->SetJobPool(job_pool);
|
||||||
|
cc->SetJobserverAware(cmIsOn(job_server_aware));
|
||||||
cc->SetCommandExpandLists(command_expand_lists);
|
cc->SetCommandExpandLists(command_expand_lists);
|
||||||
cc->SetDependsExplicitOnly(depends_explicit_only);
|
cc->SetDependsExplicitOnly(depends_explicit_only);
|
||||||
if (source.empty() && output.empty()) {
|
if (source.empty() && output.empty()) {
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ bool cmAddCustomTargetCommand(std::vector<std::string> const& args,
|
|||||||
const char* comment = nullptr;
|
const char* comment = nullptr;
|
||||||
std::vector<std::string> sources;
|
std::vector<std::string> sources;
|
||||||
std::string job_pool;
|
std::string job_pool;
|
||||||
std::string JOB_SERVER_AWARE;
|
std::string job_server_aware;
|
||||||
|
|
||||||
// Keep track of parser state.
|
// Keep track of parser state.
|
||||||
enum tdoing
|
enum tdoing
|
||||||
@@ -67,7 +67,7 @@ bool cmAddCustomTargetCommand(std::vector<std::string> const& args,
|
|||||||
doing_comment,
|
doing_comment,
|
||||||
doing_source,
|
doing_source,
|
||||||
doing_job_pool,
|
doing_job_pool,
|
||||||
doing_JOB_SERVER_AWARE,
|
doing_job_server_aware,
|
||||||
doing_nothing
|
doing_nothing
|
||||||
};
|
};
|
||||||
tdoing doing = doing_command;
|
tdoing doing = doing_command;
|
||||||
@@ -106,7 +106,7 @@ bool cmAddCustomTargetCommand(std::vector<std::string> const& args,
|
|||||||
} else if (copy == "JOB_POOL") {
|
} else if (copy == "JOB_POOL") {
|
||||||
doing = doing_job_pool;
|
doing = doing_job_pool;
|
||||||
} else if (copy == "JOB_SERVER_AWARE") {
|
} else if (copy == "JOB_SERVER_AWARE") {
|
||||||
doing = doing_JOB_SERVER_AWARE;
|
doing = doing_job_server_aware;
|
||||||
} else if (copy == "COMMAND") {
|
} else if (copy == "COMMAND") {
|
||||||
doing = doing_command;
|
doing = doing_command;
|
||||||
|
|
||||||
@@ -153,8 +153,8 @@ bool cmAddCustomTargetCommand(std::vector<std::string> const& args,
|
|||||||
case doing_job_pool:
|
case doing_job_pool:
|
||||||
job_pool = copy;
|
job_pool = copy;
|
||||||
break;
|
break;
|
||||||
case doing_JOB_SERVER_AWARE:
|
case doing_job_server_aware:
|
||||||
JOB_SERVER_AWARE = copy;
|
job_server_aware = copy;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
status.SetError("Wrong syntax. Unknown type of argument.");
|
status.SetError("Wrong syntax. Unknown type of argument.");
|
||||||
@@ -220,15 +220,6 @@ bool cmAddCustomTargetCommand(std::vector<std::string> const& args,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If using a GNU Make generator and `JOB_SERVER_AWARE` is set then
|
|
||||||
// prefix all commands with '+'.
|
|
||||||
if (cmIsOn(JOB_SERVER_AWARE) &&
|
|
||||||
mf.GetGlobalGenerator()->IsGNUMakeJobServerAware()) {
|
|
||||||
for (auto& commandLine : commandLines) {
|
|
||||||
commandLine.insert(commandLine.begin(), "+");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the utility target to the makefile.
|
// Add the utility target to the makefile.
|
||||||
auto cc = cm::make_unique<cmCustomCommand>();
|
auto cc = cm::make_unique<cmCustomCommand>();
|
||||||
cc->SetWorkingDirectory(working_directory.c_str());
|
cc->SetWorkingDirectory(working_directory.c_str());
|
||||||
@@ -240,6 +231,7 @@ bool cmAddCustomTargetCommand(std::vector<std::string> const& args,
|
|||||||
cc->SetUsesTerminal(uses_terminal);
|
cc->SetUsesTerminal(uses_terminal);
|
||||||
cc->SetCommandExpandLists(command_expand_lists);
|
cc->SetCommandExpandLists(command_expand_lists);
|
||||||
cc->SetJobPool(job_pool);
|
cc->SetJobPool(job_pool);
|
||||||
|
cc->SetJobserverAware(cmIsOn(job_server_aware));
|
||||||
cmTarget* target =
|
cmTarget* target =
|
||||||
mf.AddUtilityCommand(targetName, excludeFromAll, std::move(cc));
|
mf.AddUtilityCommand(targetName, excludeFromAll, std::move(cc));
|
||||||
|
|
||||||
|
|||||||
@@ -194,6 +194,16 @@ void cmCustomCommand::SetJobPool(const std::string& job_pool)
|
|||||||
this->JobPool = job_pool;
|
this->JobPool = job_pool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool cmCustomCommand::GetJobserverAware() const
|
||||||
|
{
|
||||||
|
return this->JobserverAware;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmCustomCommand::SetJobserverAware(bool b)
|
||||||
|
{
|
||||||
|
this->JobserverAware = b;
|
||||||
|
}
|
||||||
|
|
||||||
#define DEFINE_CC_POLICY_ACCESSOR(P) \
|
#define DEFINE_CC_POLICY_ACCESSOR(P) \
|
||||||
cmPolicies::PolicyStatus cmCustomCommand::Get##P##Status() const \
|
cmPolicies::PolicyStatus cmCustomCommand::Get##P##Status() const \
|
||||||
{ \
|
{ \
|
||||||
|
|||||||
@@ -115,6 +115,11 @@ public:
|
|||||||
const std::string& GetJobPool() const;
|
const std::string& GetJobPool() const;
|
||||||
void SetJobPool(const std::string& job_pool);
|
void SetJobPool(const std::string& job_pool);
|
||||||
|
|
||||||
|
/** Set/Get whether this custom command should be given access to the
|
||||||
|
jobserver (if possible). */
|
||||||
|
bool GetJobserverAware() const;
|
||||||
|
void SetJobserverAware(bool b);
|
||||||
|
|
||||||
#define DECLARE_CC_POLICY_ACCESSOR(P) \
|
#define DECLARE_CC_POLICY_ACCESSOR(P) \
|
||||||
cmPolicies::PolicyStatus Get##P##Status() const;
|
cmPolicies::PolicyStatus Get##P##Status() const;
|
||||||
CM_FOR_EACH_CUSTOM_COMMAND_POLICY(DECLARE_CC_POLICY_ACCESSOR)
|
CM_FOR_EACH_CUSTOM_COMMAND_POLICY(DECLARE_CC_POLICY_ACCESSOR)
|
||||||
@@ -139,6 +144,7 @@ private:
|
|||||||
std::string WorkingDirectory;
|
std::string WorkingDirectory;
|
||||||
std::string Depfile;
|
std::string Depfile;
|
||||||
std::string JobPool;
|
std::string JobPool;
|
||||||
|
bool JobserverAware = false;
|
||||||
bool HaveComment = false;
|
bool HaveComment = false;
|
||||||
bool EscapeAllowMakeVars = false;
|
bool EscapeAllowMakeVars = false;
|
||||||
bool EscapeOldStyle = true;
|
bool EscapeOldStyle = true;
|
||||||
|
|||||||
@@ -1080,6 +1080,15 @@ void cmLocalUnixMakefileGenerator3::AppendCustomCommand(
|
|||||||
// Setup the proper working directory for the commands.
|
// Setup the proper working directory for the commands.
|
||||||
this->CreateCDCommand(commands1, dir, relative);
|
this->CreateCDCommand(commands1, dir, relative);
|
||||||
|
|
||||||
|
cmGlobalUnixMakefileGenerator3* gg =
|
||||||
|
static_cast<cmGlobalUnixMakefileGenerator3*>(this->GlobalGenerator);
|
||||||
|
|
||||||
|
// Prefix the commands with the jobserver prefix "+"
|
||||||
|
if (ccg.GetCC().GetJobserverAware() && gg->IsGNUMakeJobServerAware()) {
|
||||||
|
std::transform(commands1.begin(), commands1.end(), commands1.begin(),
|
||||||
|
[](std::string const& cmd) { return cmStrCat("+", cmd); });
|
||||||
|
}
|
||||||
|
|
||||||
// push back the custom commands
|
// push back the custom commands
|
||||||
cm::append(commands, commands1);
|
cm::append(commands, commands1);
|
||||||
}
|
}
|
||||||
|
|||||||
4
Tests/RunCMake/Make/Foo/CMakeLists.txt
Normal file
4
Tests/RunCMake/Make/Foo/CMakeLists.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.26)
|
||||||
|
project(Foo NONE)
|
||||||
|
|
||||||
|
add_custom_target(drive ALL COMMAND ${CMAKE_COMMAND} -E true)
|
||||||
@@ -1,12 +1,26 @@
|
|||||||
# This test verifies that the commands in the generated Makefiles contain the
|
set(BUILD_DIR "${RunCMake_BINARY_DIR}/GNUMakeJobServerAware-build")
|
||||||
# `+` prefix
|
|
||||||
function(check_for_plus_prefix target)
|
function(check target line)
|
||||||
set(file "${RunCMake_BINARY_DIR}/GNUMakeJobServerAware-build/${target}")
|
# Read the file and split it into a list of lines
|
||||||
file(READ "${file}" build_file)
|
file(READ ${BUILD_DIR}/${target} contents)
|
||||||
if(NOT "${build_file}" MATCHES [[\+]])
|
STRING(REGEX REPLACE ";" "\\\\;" contents "${contents}")
|
||||||
message(FATAL_ERROR "The file ${file} does not contain the expected prefix in the custom command.")
|
STRING(REGEX REPLACE "\n" ";" contents "${contents}")
|
||||||
|
|
||||||
|
set(found FALSE)
|
||||||
|
foreach(entry ${contents})
|
||||||
|
if("${entry}" MATCHES "${line}")
|
||||||
|
set(found TRUE)
|
||||||
|
break()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(NOT found)
|
||||||
|
message(FATAL_ERROR "Could not find '${line}' in ${BUILD_DIR}/${target}\n${contents}")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
check_for_plus_prefix("CMakeFiles/dummy.dir/build.make")
|
check("CMakeFiles/dummy.dir/build.make" [[\+\$\(CMAKE_COMMAND\) -E true]])
|
||||||
check_for_plus_prefix("CMakeFiles/dummy2.dir/build.make")
|
check("CMakeFiles/dummy2.dir/build.make" [[\+\$\(CMAKE_COMMAND\) -E true]])
|
||||||
|
|
||||||
|
check("CMakeFiles/dummy3.dir/build.make" [[\+cd (/d )?"?.*"? && \$\(CMAKE_COMMAND\) -E true]])
|
||||||
|
check("CMakeFiles/dummy4.dir/build.make" [[\+cd (/d )?"?.*"? && \$\(CMAKE_COMMAND\) -E true]])
|
||||||
|
|||||||
@@ -1,12 +1,31 @@
|
|||||||
|
# Test JOB_SERVER_AWARE with custom commands
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/custom-command"
|
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/missing"
|
||||||
JOB_SERVER_AWARE ON
|
JOB_SERVER_AWARE ON
|
||||||
COMMAND $(CMAKE_COMMAND) -E touch "${CMAKE_CURRENT_BINARY_DIR}/custom-command"
|
COMMAND $(CMAKE_COMMAND) -E true
|
||||||
)
|
)
|
||||||
add_custom_target(dummy ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/custom-command")
|
add_custom_target(dummy ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/missing")
|
||||||
|
|
||||||
|
# Test JOB_SERVER_AWARE with custom targets
|
||||||
add_custom_target(
|
add_custom_target(
|
||||||
dummy2 ALL
|
dummy2 ALL
|
||||||
JOB_SERVER_AWARE ON
|
JOB_SERVER_AWARE ON
|
||||||
COMMAND ${CMAKE_COMMAND} -E true
|
COMMAND $(CMAKE_COMMAND) -E true
|
||||||
|
)
|
||||||
|
|
||||||
|
# Test JOB_SERVER_AWARE with custom commands with WORKING_DIRECTORY
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/missing2"
|
||||||
|
JOB_SERVER_AWARE ON
|
||||||
|
COMMAND $(CMAKE_COMMAND) -E true
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Foo"
|
||||||
|
)
|
||||||
|
add_custom_target(dummy3 ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/missing2")
|
||||||
|
|
||||||
|
# Test JOB_SERVER_AWARE with custom targets with WORKING_DIRECTORY
|
||||||
|
add_custom_target(
|
||||||
|
dummy4 ALL
|
||||||
|
JOB_SERVER_AWARE ON
|
||||||
|
COMMAND $(CMAKE_COMMAND) -E true
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Foo"
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user