The commands for PRE_LINK/POST_BUILD is not correctly quoted for Ninja in
Windows. 'CMD /C "<command>"' is added to the command, just as Ninja itself
does.
(this was maybe different in earlier Ninja versions, but has been around for a
couple of years)
(The quoting in the working command is strange, but works.)
A workaround that is not so bad, is to patch build.ninja
Is there a better way?
Note: The lines LINK_FLAGS ,POST_BUILD , PRE_LINK , TARGET_PDB are duplicated
in build.ninja. Does not make a difference.
ARM DS-5 compiler (armcc compiler 5.04)
Platform: Windows (Linux used too, but with Unix Makefiles)
CMake 3.0.2
Ninja 1.5.1
/Gerhard
CmakeLists.txt excerpt:
ADD_CUSTOM_COMMAND(
TARGET ECU
PRE_LINK
COMMAND "C:/Program Files/DS-5/bin/armasm.exe" --cpu=Cortex-A9 -g
--cpreproc --apcs=interwork --arm --no_unaligned_access --pd "__EVAL SETA 1"
--pd "__MICROLIB SETA 1" -Ic:/Temp/includes -o
${CMAKE_CURRENT_BINARY_DIR}/osekasm.o c:/Os/osekasm.s VERBATIM
)
#Generate hex, copy to view
add_custom_command(TARGET ECU POST_BUILD
COMMAND "C:/Program Files/DS-5/bin/fromelf.exe" --m32combined
--output=${CMAKE_CURRENT_BINARY_DIR}/ECU.hex
${CMAKE_CURRENT_BINARY_DIR}/ECU.elf VERBATIM
COMMAND "C:/cygwin/bin/objcopy" -I elf32-big -O srec --srec-len=32
--srec-forceS3 -j .securityLevel ${CMAKE_CURRENT_BINARY_DIR}/ECU.elf
${CMAKE_CURRENT_BINARY_DIR}/parameter_section.hex VERBATIM
)
Generated in build.ninja:
LINK_FLAGS = --cpu=Cortex-A9 c:/Temp/includes/SecModLib.a
-L--list=c:/Temp/build/ECU.map -L--scatter=c:/Zynq7000/scatter.txt -L--map
-L--no_remove -L--symbols
-L--info=common,summarysizes,summarystack,sizes,totals,unused,unusedsymbols,veneers
C:/Temp/build/osekasm.o
POST_BUILD = cmd.exe /C "cd /D C:\Temp\build && "C:\Program
Files\DS-5\bin\fromelf.exe" --m32combined --output=C:/Temp/build/ECU.hex
C:/Temp/build/ECU.elf && C:\cygwin\bin\objcopy -I elf32-big -O srec
--srec-len=32 --srec-forceS3 -j .securityLevel C:/Temp/build/ECU.elf
C:/Temp/build/parameter_section.hex"
PRE_LINK = cmd.exe /C "cd /D C:\Temp\build && "C:\Program
Files\DS-5\bin\armasm.exe" --cpu=Cortex-A9 -g --cpreproc --apcs=interwork --arm
--no_unaligned_access --pd "__EVAL SETA 1" --pd "__MICROLIB SETA 1"
-Ic:/Temp/includes -o C:/Temp/build/osekasm.o c:/Temp/Os/osekasm.s && cd
C:\Temp\build"
TARGET_PDB = ECU.elf.dbg
Console output:
[106/107] Linking C executable ECU.elf
FAILED: cmd.exe /C "cmd.exe /C "cd /D C:\Temp\build && "C:\Program
Files\DS-5\bin\armasm.exe" --cpu=Cortex-A9 -g --cpreproc --apcs=interwork --arm
--no_unaligned_access --pd "__EVAL SETA 1" --pd "__MICROLIB SETA 1"
-Ic:/Temp/includes -o C:/Temp/build/osekasm.o c:/Temp/Os/osekasm.s && cd
C:\Temp\build" && C:\PROGRA~1\DS-5\bin\armcc.exe --cpu=Cortex-A9
c:/Temp/includes/SecModLib.a -L--list=c:/Temp/build/ECU.map
-L--scatter=c:/Zynq7000/scatter.txt -L--map -L--no_remove -L--symbols
-L--info=common,summarysizes,summarystack,sizes,totals,unused,unusedsymbols,veneers
C:/Temp/build/osekasm.o --via=CMakeFiles/ECU.rsp -o ECU.elf && cmd.exe /C
"cd /D C:\Temp\build && "C:\Program Files\DS-5\bin\fromelf.exe" --m32combined
--output=C:/Temp/build/ECU.hex C:/Temp/build/ECU.elf && C:\cygwin\bin\objcopy
-I elf32-big -O srec --srec-len=32 --srec-forceS3 -j .securityLevel
C:/Temp/build/ECU.elf C:/Temp/build/parameter_section.hex""
'cmd.exe' is not recognized as an internal or external command,
operable program or batch file.
ninja: build stopped: subcommand failed.
Patched (in Makefile):
${CMAKE_MAKEFILE}: ${CMAKELISTS} ${CMAKE_TOOLCHAIN} | ${CMAKE_BUILD_DIR}
@#CMake Ninja uses cmd incorrectly
@perl -pi -e
's%^(\s*(POST_BUILD|PRE_LINK)\s*=\s*)cmd.exe\s(/C)?\s*"(.*)"%$$1$$4%i; ' $@
Rules patched OK:
LINK_FLAGS = --cpu=Cortex-A9 c:/Temp/includes/SecModLib.a
-L--list=c:/Temp/build/ECU.map -L--scatter=c:/Zynq7000/scatter.txt -L--map
-L--no_remove -L--symbols
-L--info=common,summarysizes,summarystack,sizes,totals,unused,unusedsymbols,veneers
C:/Temp/build/osekasm.o
POST_BUILD = cd /D C:\Temp\build && "C:\Program Files\DS-5\bin\fromelf.exe"
--m32combined --output=C:/Temp/build/ECU.hex C:/Temp/build/ECU.elf &&
C:\cygwin\bin\objcopy -I elf32-big -O srec --srec-len=32 --srec-forceS3 -j
.securityLevel C:/Temp/build/ECU.elf C:/Temp/build/parameter_section.hex
PRE_LINK = cd /D C:\Temp\build && "C:\Program Files\DS-5\bin\armasm.exe"
--cpu=Cortex-A9 -g --cpreproc --apcs=interwork --arm --no_unaligned_access --pd
"__EVAL SETA 1" --pd "__MICROLIB SETA 1" -Ic:/Temp/includes -o
C:/Temp/build/osekasm.o c:/Temp/Os/osekasm.s && cd C:\Temp\build
TARGET_PDB = ECU.elf.dbg
--
Powered by www.kitware.com
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Kitware offers various services to support the CMake community. For more
information on each offering, please visit:
CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake