mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-25 16:09:42 -06:00
execute_process(): Restore opening files relative to WORKING_DIRECTORY
Prior to 5420639a, execute_process() would open INPUT_FILE, OUTPUT_FILE,
and ERROR_FILE relative to the WORKING_DIRECTORY argument if it was
provided. Restore this behavior for backwards compatibility.
Fixes: #25338
This commit is contained in:
@@ -112,9 +112,27 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!status.GetMakefile().CanIWriteThisFile(arguments.OutputFile)) {
|
std::string inputFilename = arguments.InputFile;
|
||||||
status.SetError("attempted to output into a file: " +
|
std::string outputFilename = arguments.OutputFile;
|
||||||
arguments.OutputFile + " into a source directory.");
|
std::string errorFilename = arguments.ErrorFile;
|
||||||
|
if (!arguments.WorkingDirectory.empty()) {
|
||||||
|
if (!inputFilename.empty()) {
|
||||||
|
inputFilename = cmSystemTools::CollapseFullPath(
|
||||||
|
inputFilename, arguments.WorkingDirectory);
|
||||||
|
}
|
||||||
|
if (!outputFilename.empty()) {
|
||||||
|
outputFilename = cmSystemTools::CollapseFullPath(
|
||||||
|
outputFilename, arguments.WorkingDirectory);
|
||||||
|
}
|
||||||
|
if (!errorFilename.empty()) {
|
||||||
|
errorFilename = cmSystemTools::CollapseFullPath(
|
||||||
|
errorFilename, arguments.WorkingDirectory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!status.GetMakefile().CanIWriteThisFile(outputFilename)) {
|
||||||
|
status.SetError("attempted to output into a file: " + outputFilename +
|
||||||
|
" into a source directory.");
|
||||||
cmSystemTools::SetFatalErrorOccurred();
|
cmSystemTools::SetFatalErrorOccurred();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -162,20 +180,24 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
|
|||||||
|
|
||||||
// Check the output variables.
|
// Check the output variables.
|
||||||
std::unique_ptr<FILE, int (*)(FILE*)> inputFile(nullptr, fclose);
|
std::unique_ptr<FILE, int (*)(FILE*)> inputFile(nullptr, fclose);
|
||||||
if (!arguments.InputFile.empty()) {
|
if (!inputFilename.empty()) {
|
||||||
inputFile.reset(cmsys::SystemTools::Fopen(arguments.InputFile, "rb"));
|
inputFile.reset(cmsys::SystemTools::Fopen(inputFilename, "rb"));
|
||||||
builder.SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT,
|
if (inputFile) {
|
||||||
cm_fileno(inputFile.get()));
|
builder.SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT,
|
||||||
|
cm_fileno(inputFile.get()));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
builder.SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT,
|
builder.SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT,
|
||||||
cm_fileno(stdin));
|
cm_fileno(stdin));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<FILE, int (*)(FILE*)> outputFile(nullptr, fclose);
|
std::unique_ptr<FILE, int (*)(FILE*)> outputFile(nullptr, fclose);
|
||||||
if (!arguments.OutputFile.empty()) {
|
if (!outputFilename.empty()) {
|
||||||
outputFile.reset(cmsys::SystemTools::Fopen(arguments.OutputFile, "wb"));
|
outputFile.reset(cmsys::SystemTools::Fopen(outputFilename, "wb"));
|
||||||
builder.SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT,
|
if (outputFile) {
|
||||||
cm_fileno(outputFile.get()));
|
builder.SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT,
|
||||||
|
cm_fileno(outputFile.get()));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (arguments.OutputVariable == arguments.ErrorVariable &&
|
if (arguments.OutputVariable == arguments.ErrorVariable &&
|
||||||
!arguments.ErrorVariable.empty()) {
|
!arguments.ErrorVariable.empty()) {
|
||||||
@@ -186,14 +208,18 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<FILE, int (*)(FILE*)> errorFile(nullptr, fclose);
|
std::unique_ptr<FILE, int (*)(FILE*)> errorFile(nullptr, fclose);
|
||||||
if (!arguments.ErrorFile.empty()) {
|
if (!errorFilename.empty()) {
|
||||||
if (arguments.ErrorFile == arguments.OutputFile) {
|
if (errorFilename == outputFilename) {
|
||||||
builder.SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
|
if (outputFile) {
|
||||||
cm_fileno(outputFile.get()));
|
builder.SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
|
||||||
|
cm_fileno(outputFile.get()));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
errorFile.reset(cmsys::SystemTools::Fopen(arguments.ErrorFile, "wb"));
|
errorFile.reset(cmsys::SystemTools::Fopen(errorFilename, "wb"));
|
||||||
builder.SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
|
if (errorFile) {
|
||||||
cm_fileno(errorFile.get()));
|
builder.SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
|
||||||
|
cm_fileno(errorFile.get()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (arguments.ErrorVariable.empty() ||
|
} else if (arguments.ErrorVariable.empty() ||
|
||||||
(!arguments.ErrorVariable.empty() &&
|
(!arguments.ErrorVariable.empty() &&
|
||||||
|
|||||||
13
Tests/RunCMake/execute_process/InOutErrDirectory.cmake
Normal file
13
Tests/RunCMake/execute_process/InOutErrDirectory.cmake
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
file(MAKE_DIRECTORY dir)
|
||||||
|
file(WRITE dir/in.txt "This is a test")
|
||||||
|
execute_process(COMMAND ${PRINT_STDIN_EXE} WORKING_DIRECTORY dir INPUT_FILE in.txt OUTPUT_FILE out.txt ERROR_FILE err.txt)
|
||||||
|
if(NOT EXISTS dir/out.txt)
|
||||||
|
message(SEND_ERROR "Did not create dir/out.txt")
|
||||||
|
endif()
|
||||||
|
file(READ dir/out.txt out)
|
||||||
|
if(NOT out STREQUAL "This is a test")
|
||||||
|
message(SEND_ERROR "Did not read dir/in.txt")
|
||||||
|
endif()
|
||||||
|
if(NOT EXISTS dir/err.txt)
|
||||||
|
message(SEND_ERROR "Did not create dir/err.txt")
|
||||||
|
endif()
|
||||||
@@ -35,6 +35,11 @@ run_cmake_command(LastCommandError ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/La
|
|||||||
run_cmake_command(LastCommandTimeout ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/LastCommandTimeout.cmake)
|
run_cmake_command(LastCommandTimeout ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/LastCommandTimeout.cmake)
|
||||||
run_cmake_command(LastCommandGood ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/LastCommandGood.cmake)
|
run_cmake_command(LastCommandGood ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/LastCommandGood.cmake)
|
||||||
run_cmake_command(Stdin ${CMAKE_COMMAND} -DPRINT_STDIN_EXE=${PRINT_STDIN_EXE} -P ${RunCMake_SOURCE_DIR}/Stdin.cmake)
|
run_cmake_command(Stdin ${CMAKE_COMMAND} -DPRINT_STDIN_EXE=${PRINT_STDIN_EXE} -P ${RunCMake_SOURCE_DIR}/Stdin.cmake)
|
||||||
|
run_cmake_command(StdinNoexist ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/StdinNoexist.cmake)
|
||||||
|
run_cmake_command(StdoutNoexist ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/StdoutNoexist.cmake)
|
||||||
|
run_cmake_command(StderrNoexist ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/StderrNoexist.cmake)
|
||||||
|
run_cmake_command(StdoutStderrNoexist ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/StderrNoexist.cmake)
|
||||||
|
run_cmake_command(InOutErrDirectory ${CMAKE_COMMAND} -DPRINT_STDIN_EXE=${PRINT_STDIN_EXE} -P ${RunCMake_SOURCE_DIR}/InOutErrDirectory.cmake)
|
||||||
|
|
||||||
if(UNIX AND Python_EXECUTABLE)
|
if(UNIX AND Python_EXECUTABLE)
|
||||||
run_cmake_command(AnyCommandAbnormalExit ${CMAKE_COMMAND} -DPython_EXECUTABLE=${Python_EXECUTABLE} -P ${RunCMake_SOURCE_DIR}/AnyCommandAbnormalExit.cmake)
|
run_cmake_command(AnyCommandAbnormalExit ${CMAKE_COMMAND} -DPython_EXECUTABLE=${Python_EXECUTABLE} -P ${RunCMake_SOURCE_DIR}/AnyCommandAbnormalExit.cmake)
|
||||||
|
|||||||
1
Tests/RunCMake/execute_process/StderrNoexist.cmake
Normal file
1
Tests/RunCMake/execute_process/StderrNoexist.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
execute_process(COMMAND ${CMAKE_COMMAND} -E true ERROR_FILE noexist/error.txt)
|
||||||
1
Tests/RunCMake/execute_process/StdinNoexist.cmake
Normal file
1
Tests/RunCMake/execute_process/StdinNoexist.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
execute_process(COMMAND ${CMAKE_COMMAND} -E true INPUT_FILE noexist/input.txt)
|
||||||
1
Tests/RunCMake/execute_process/StdouStderrNoexist.cmake
Normal file
1
Tests/RunCMake/execute_process/StdouStderrNoexist.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
execute_process(COMMAND ${CMAKE_COMMAND} -E true OUTPUT_FILE noexist/merged.txt ERROR_FILE noexist/merged.txt)
|
||||||
1
Tests/RunCMake/execute_process/StdoutNoexist.cmake
Normal file
1
Tests/RunCMake/execute_process/StdoutNoexist.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
execute_process(COMMAND ${CMAKE_COMMAND} -E true OUTPUT_FILE noexist/output.txt)
|
||||||
Reference in New Issue
Block a user