add_custom_command: Allow OUTPUT filenames containing a hash '#' character

Most generators now support this character after escaping and quoting
cleanups over time.  Disallow it only on generators that do support it.

Fixes: #25604
stage/master/nightly/2024/05/16
Glenn Coombs 2024-05-13 12:09:19 +08:00 committed by Brad King
parent b38000d774
commit 8d2a503c1e
9 changed files with 30 additions and 28 deletions

View File

@ -269,6 +269,8 @@ The options are:
source tree is mentioned as an absolute source file path elsewhere
in the current directory.
The output file path may not contain ``<`` or ``>`` characters.
.. versionadded:: 3.20
Arguments to ``OUTPUT`` may use a restricted set of
:manual:`generator expressions <cmake-generator-expressions(7)>`.
@ -280,6 +282,10 @@ The options are:
considered private unless they are listed in a non-private file set.
See policy :policy:`CMP0154`.
.. versionchanged:: 3.30
The output file path may now use ``#`` characters, except
when using the :generator:`Borland Makefiles` generator.
``USES_TERMINAL``
.. versionadded:: 3.2

View File

@ -4403,7 +4403,12 @@ void CreateGeneratedSource(cmLocalGenerator& lg, const std::string& output,
}
// Make sure the output file name has no invalid characters.
std::string::size_type pos = output.find_first_of("#<>");
const bool hashNotAllowed = lg.GetState()->UseBorlandMake();
std::string::size_type pos = output.find_first_of("<>");
if (pos == std::string::npos && hashNotAllowed) {
pos = output.find_first_of('#');
}
if (pos != std::string::npos) {
lg.GetCMakeInstance()->IssueMessage(
MessageType::FATAL_ERROR,

View File

@ -588,3 +588,12 @@ add_custom_target(drive_mac_fw ALL DEPENDS mac_fw.txt)
# Test empty COMMANDs are omitted
add_executable(empty_command empty_command.cxx)
add_custom_command(TARGET empty_command POST_BUILD COMMAND $<0:date>)
# Test OUTPUT allows filenames containing "#" on generators that support this
if(NOT CMAKE_GENERATOR MATCHES "Borland Makefiles")
add_custom_target(file_with_hash ALL DEPENDS "${PROJECT_BINARY_DIR}/hash#in#name.txt")
add_custom_command(
OUTPUT "${PROJECT_BINARY_DIR}/hash#in#name.txt"
COMMAND ${CMAKE_COMMAND} -E touch "${PROJECT_BINARY_DIR}/hash#in#name.txt"
)
endif()

View File

@ -1,9 +1,3 @@
CMake Error at BadByproduct.cmake:2 \(add_custom_command\):
BYPRODUCTS containing a "#" is not allowed.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
CMake Error at BadByproduct.cmake:3 \(add_custom_command\):
BYPRODUCTS containing a "<" is not allowed.
Call Stack \(most recent call first\):
@ -17,7 +11,7 @@ Call Stack \(most recent call first\):
(
CMake Error at BadByproduct.cmake:5 \(add_custom_command\):
BYPRODUCTS containing a "#" is not allowed.
BYPRODUCTS containing a ">" is not allowed.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)

View File

@ -1,8 +1,8 @@
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
add_custom_command(OUTPUT a BYPRODUCTS "a#")
add_custom_command(OUTPUT b BYPRODUCTS "a<")
add_custom_command(OUTPUT c BYPRODUCTS "a>")
add_custom_command(OUTPUT d BYPRODUCTS "$<CONFIG>/#")
add_custom_command(OUTPUT d BYPRODUCTS "$<CONFIG>/$<ANGLE-R>")
add_custom_command(OUTPUT e BYPRODUCTS ${CMAKE_CURRENT_SOURCE_DIR}/f)
add_custom_command(OUTPUT f BYPRODUCTS "$<TARGET_PROPERTY:prop>")
add_custom_command(OUTPUT h BYPRODUCTS "$<OUTPUT_CONFIG:h>")

View File

@ -1,9 +1,3 @@
CMake Error at BadOutput.cmake:2 \(add_custom_command\):
OUTPUT containing a "#" is not allowed.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
CMake Error at BadOutput.cmake:3 \(add_custom_command\):
OUTPUT containing a "<" is not allowed.
Call Stack \(most recent call first\):
@ -17,7 +11,7 @@ Call Stack \(most recent call first\):
(
CMake Error at BadOutput.cmake:5 \(add_custom_command\):
OUTPUT containing a "#" is not allowed.
OUTPUT containing a ">" is not allowed.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)

View File

@ -1,8 +1,8 @@
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
add_custom_command(OUTPUT "a#" COMMAND a)
add_custom_command(OUTPUT "a<" COMMAND b)
add_custom_command(OUTPUT "a>" COMMAND c)
add_custom_command(OUTPUT "$<CONFIG>/#" COMMAND d)
add_custom_command(OUTPUT "$<CONFIG>/$<ANGLE-R>" COMMAND d)
add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/e COMMAND f)
add_custom_command(OUTPUT "$<TARGET_PROPERTY:prop>" COMMAND g)
add_custom_command(OUTPUT "$<OUTPUT_CONFIG:h>" COMMAND h)

View File

@ -1,9 +1,3 @@
CMake Error at BadByproduct.cmake:2 \(add_custom_target\):
BYPRODUCTS containing a "#" is not allowed.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
CMake Error at BadByproduct.cmake:3 \(add_custom_target\):
BYPRODUCTS containing a "<" is not allowed.
Call Stack \(most recent call first\):
@ -17,7 +11,7 @@ Call Stack \(most recent call first\):
(
CMake Error at BadByproduct.cmake:5 \(add_custom_target\):
BYPRODUCTS containing a "#" is not allowed.
BYPRODUCTS containing a ">" is not allowed.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)

View File

@ -1,8 +1,8 @@
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
add_custom_target(a BYPRODUCTS "a#" COMMAND b)
add_custom_target(c BYPRODUCTS "a<" COMMAND d)
add_custom_target(e BYPRODUCTS "a>" COMMAND f)
add_custom_target(g BYPRODUCTS "$<CONFIG>/#" COMMAND h)
add_custom_target(g BYPRODUCTS "$<CONFIG>/$<ANGLE-R>" COMMAND h)
add_custom_target(i BYPRODUCTS ${CMAKE_CURRENT_SOURCE_DIR}/j COMMAND k)
add_custom_target(l BYPRODUCTS "$<TARGET_PROPERTY:prop>" COMMAND m)
add_custom_target(n BYPRODUCTS "$<OUTPUT_CONFIG:n>" COMMAND o)