Ninja Multi-Config: $<TARGET_FILE:> in COMMAND of add_custom_target() resolves incorrectly
Example:
add_executable(main main.cpp)
add_custom_target(echo_target
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>" COMMAND echo "$<TARGET_FILE:main>"
VERBATIM
)
Excpected:
cmake .. -G"Ninja Multi-Config"
cmake --build . --target echo_target --config Release
[1/1 143.7 0.007] cmd.exe /C "cd /D F:\te........................
F:/test/testcmake/build/Release/main.exe
F:/test/testcmake/build/Release/main.exe
F:/test/testcmake/build/Release/main.exe
.......
.......
F:/test/testcmake/build/Release/main.exe
F:/test/testcmake/build/Release/main.exe
Actual:
cmake .. -G"Ninja Multi-Config"
cmake --build . --target echo_target --config Release
[1/1 37.5 0.027] CMakeFiles\echo_target-026cc81.bat 8894ba22fb150a87
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
F:/test/testcmake/build/RelWithDebInfo/main.exe
It looks like it has to to with numbers of COMMAND (or overall length of all commands) specified.
- If the COMMAND is short everything works as expected
- After certain number of COMMANDS cmake creates a .bat file with all commands. This file is not created per configuration.
Edited by Brad King