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: #25604stage/master/nightly/2024/05/16
parent
b38000d774
commit
8d2a503c1e
|
@ -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
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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\)
|
||||
|
||||
|
|
|
@ -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>")
|
||||
|
|
|
@ -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\)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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\)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue