add_custom_{command,target}: add genex support for COMMENT

Evaluate and expand generator expressions in the `COMMENT` argument of
the `add_custom_command()` and `add_custom_target()` commands.
This allows to include generator expressions, e.g. a targets location
$<TARGET_...> or the current configuration $<CONFIG>, in the build-time
messages.

Fixes #22507
This commit is contained in:
Peter Würth
2022-11-18 12:29:47 +01:00
parent 60a5a39022
commit 26d813092b
10 changed files with 67 additions and 3 deletions

View File

@@ -140,6 +140,10 @@ The options are:
Display the given message before the commands are executed at
build time.
.. versionadded:: 3.26
Arguments to ``COMMENT`` may use
:manual:`generator expressions <cmake-generator-expressions(7)>`.
``DEPENDS``
Specify files on which the command depends. Each argument is converted
to a dependency as follows:

View File

@@ -109,6 +109,10 @@ The options are:
Display the given message before the commands are executed at
build time.
.. versionadded:: 3.26
Arguments to ``COMMENT`` may use
:manual:`generator expressions <cmake-generator-expressions(7)>`.
``DEPENDS``
Reference files and outputs of custom commands created with
:command:`add_custom_command` command calls in the same directory

View File

@@ -0,0 +1,6 @@
custom-command-comment-genex
----------------------------
* :command:`add_custom_command` and :command:`add_custom_target` now
support :manual:`generator expressions <cmake-generator-expressions(7)>`
in their ``COMMENT`` option.

View File

@@ -148,6 +148,14 @@ std::string EvaluateDepfile(std::string const& path,
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(path);
return cge->Evaluate(lg, config);
}
std::string EvaluateComment(const char* comment,
cmGeneratorExpression const& ge,
cmLocalGenerator* lg, std::string const& config)
{
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(comment);
return cge->Evaluate(lg, config);
}
}
cmCustomCommandGenerator::cmCustomCommandGenerator(
@@ -465,10 +473,17 @@ std::string cmCustomCommandGenerator::GetInternalDepfile() const
cm::optional<std::string> cmCustomCommandGenerator::GetComment() const
{
if (const char* comment = this->CC->GetComment()) {
return comment;
const char* comment = this->CC->GetComment();
if (!comment) {
return cm::nullopt;
}
return cm::nullopt;
if (!*comment) {
return std::string();
}
cmGeneratorExpression ge(*this->LG->GetCMakeInstance(),
this->CC->GetBacktrace());
return EvaluateComment(comment, ge, this->LG, this->OutputConfig);
}
std::string cmCustomCommandGenerator::GetWorkingDirectory() const

View File

@@ -0,0 +1 @@
lorem ipsum, 01

View File

@@ -0,0 +1,9 @@
add_custom_target(helper)
set_property(TARGET helper PROPERTY MY_TEXT "lorem ipsum")
add_custom_command(
OUTPUT out.txt
COMMAND ${CMAKE_COMMAND} -E echo true
COMMENT "$<TARGET_PROPERTY:helper,MY_TEXT>$<COMMA> $<STREQUAL:foo,bar>$<EQUAL:42,42>"
)
set_property(SOURCE out.txt PROPERTY SYMBOLIC 1)
add_custom_target(main ALL DEPENDS out.txt)

View File

@@ -60,3 +60,12 @@ function(test_genex name)
endfunction()
test_genex(TargetGenexEvent)
if(NOT RunCMake_GENERATOR STREQUAL "Xcode")
block()
run_cmake(CommentGenex)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CommentGenex-build)
set(RunCMake_TEST_NO_CLEAN 1)
run_cmake_command(CommentGenex-build ${CMAKE_COMMAND} --build .)
endblock()
endif()

View File

@@ -0,0 +1 @@
lorem ipsum, 01

View File

@@ -0,0 +1,6 @@
add_custom_target(helper)
set_property(TARGET helper PROPERTY MY_TEXT "lorem ipsum")
add_custom_target(main ALL
COMMAND ${CMAKE_COMMAND} -E true
COMMENT "$<TARGET_PROPERTY:helper,MY_TEXT>$<COMMA> $<STREQUAL:foo,bar>$<EQUAL:42,42>"
)

View File

@@ -23,3 +23,12 @@ function(run_TargetOrder)
run_cmake_command(TargetOrder-build ${CMAKE_COMMAND} --build . -- ${build_flags})
endfunction()
run_TargetOrder()
if(NOT RunCMake_GENERATOR STREQUAL "Xcode")
block()
run_cmake(CommentGenex)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CommentGenex-build)
set(RunCMake_TEST_NO_CLEAN 1)
run_cmake_command(CommentGenex-build ${CMAKE_COMMAND} --build .)
endblock()
endif()