mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00
@@ -20,6 +20,7 @@ Try Compiling and Running Source Files
|
|||||||
[COMPILE_OUTPUT_VARIABLE <var>]
|
[COMPILE_OUTPUT_VARIABLE <var>]
|
||||||
[RUN_OUTPUT_VARIABLE <var>]
|
[RUN_OUTPUT_VARIABLE <var>]
|
||||||
[OUTPUT_VARIABLE <var>]
|
[OUTPUT_VARIABLE <var>]
|
||||||
|
[WORKING_DIRECTORY <var>]
|
||||||
[ARGS <args>...])
|
[ARGS <args>...])
|
||||||
|
|
||||||
Try compiling a ``<srcfile>``. Returns ``TRUE`` or ``FALSE`` for success
|
Try compiling a ``<srcfile>``. Returns ``TRUE`` or ``FALSE`` for success
|
||||||
@@ -74,6 +75,12 @@ The options are:
|
|||||||
``RUN_OUTPUT_VARIABLE <var>``
|
``RUN_OUTPUT_VARIABLE <var>``
|
||||||
Report the output from running the executable in a given variable.
|
Report the output from running the executable in a given variable.
|
||||||
|
|
||||||
|
``WORKING_DIRECTORY <var>``
|
||||||
|
.. versionadded:: 3.20
|
||||||
|
|
||||||
|
Run the executable in the given directory. If no ``WORKING_DIRECTORY`` is
|
||||||
|
specified, the executable will run in ``<bindir>``.
|
||||||
|
|
||||||
Other Behavior Settings
|
Other Behavior Settings
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
@@ -0,0 +1,5 @@
|
|||||||
|
try_run-allow-to-set-working-directory
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
* The :command:`try_run` command gained a ``WORKING_DIRECTORY`` option to
|
||||||
|
support setting of working directory.
|
@@ -84,6 +84,14 @@ bool cmTryRunCommand::InitialPass(std::vector<std::string> const& argv,
|
|||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
this->CompileOutputVariable = argv[i];
|
this->CompileOutputVariable = argv[i];
|
||||||
|
} else if (argv[i] == "WORKING_DIRECTORY") {
|
||||||
|
if (argv.size() <= (i + 1)) {
|
||||||
|
cmSystemTools::Error(
|
||||||
|
"WORKING_DIRECTORY specified but there is no variable");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
this->WorkingDirectory = argv[i];
|
||||||
} else {
|
} else {
|
||||||
tryCompile.push_back(argv[i]);
|
tryCompile.push_back(argv[i]);
|
||||||
}
|
}
|
||||||
@@ -102,6 +110,14 @@ bool cmTryRunCommand::InitialPass(std::vector<std::string> const& argv,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!this->WorkingDirectory.empty()) {
|
||||||
|
if (!cmSystemTools::MakeDirectory(this->WorkingDirectory)) {
|
||||||
|
cmSystemTools::Error(cmStrCat("Error creating working directory \"",
|
||||||
|
this->WorkingDirectory, "\"."));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool captureRunOutput = false;
|
bool captureRunOutput = false;
|
||||||
if (!this->OutputVariable.empty()) {
|
if (!this->OutputVariable.empty()) {
|
||||||
captureRunOutput = true;
|
captureRunOutput = true;
|
||||||
@@ -188,8 +204,9 @@ void cmTryRunCommand::RunExecutable(const std::string& runArgs,
|
|||||||
finalCommand += runArgs;
|
finalCommand += runArgs;
|
||||||
}
|
}
|
||||||
bool worked = cmSystemTools::RunSingleCommand(
|
bool worked = cmSystemTools::RunSingleCommand(
|
||||||
finalCommand, out, out, &retVal, nullptr, cmSystemTools::OUTPUT_NONE,
|
finalCommand, out, out, &retVal,
|
||||||
cmDuration::zero());
|
this->WorkingDirectory.empty() ? nullptr : this->WorkingDirectory.c_str(),
|
||||||
|
cmSystemTools::OUTPUT_NONE, cmDuration::zero());
|
||||||
// set the run var
|
// set the run var
|
||||||
char retChar[16];
|
char retChar[16];
|
||||||
const char* retStr;
|
const char* retStr;
|
||||||
|
@@ -49,4 +49,5 @@ private:
|
|||||||
std::string OutputVariable;
|
std::string OutputVariable;
|
||||||
std::string RunOutputVariable;
|
std::string RunOutputVariable;
|
||||||
std::string CompileOutputVariable;
|
std::string CompileOutputVariable;
|
||||||
|
std::string WorkingDirectory;
|
||||||
};
|
};
|
||||||
|
@@ -8,3 +8,5 @@ if (CMAKE_SYSTEM_NAME MATCHES "^(Linux|Darwin|Windows)$" AND
|
|||||||
run_cmake(LinkOptions)
|
run_cmake(LinkOptions)
|
||||||
unset (RunCMake_TEST_OPTIONS)
|
unset (RunCMake_TEST_OPTIONS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
run_cmake(WorkingDirArg)
|
||||||
|
9
Tests/RunCMake/try_run/WorkingDirArg.cmake
Normal file
9
Tests/RunCMake/try_run/WorkingDirArg.cmake
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
try_run(RUN_RESULT COMPILE_RESULT
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp ${CMAKE_CURRENT_SOURCE_DIR}/src.c
|
||||||
|
RUN_OUTPUT_VARIABLE OUTPUT_VARIABLE
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp/workdir
|
||||||
|
)
|
||||||
|
|
||||||
|
if(RUN_RESULT)
|
||||||
|
message(SEND_ERROR "try run failed with result: ${RUN_RESULT}")
|
||||||
|
endif()
|
Reference in New Issue
Block a user