Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CMAKE add_custom_command: How to use my raw commands

Tags:

cmake

I am trying to add some custom build commands to my vc2010 project by using ADD_CUSTOM_COMMAND. But:

[1] I just find that CMAKE will automatically insert much more code than I hvae expected.

For example, I want the command exactly to be:

"c:\Some Folder\MyTool.exe" -arg0 -arg1

The corresponding code in CMakeLists.txt is like:

add_custom_command( OUTPUT ${outfile}
                  COMMAND "c:\Some Folder\MyTool.exe" ARGS "-arg0 -arg1"
                  # COMMAND "\"c:\Some Folder\MyTool.exe\"" will FAIL to be parsed!
                  MAIN_DEPENDENCY ${infile}
                  VERBATIM)

but actually I got:

setlocal
c:\Some Folder\MyTool.exe "-arg0 -arg1"
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd

This is not what I want. I have also tried the string: COMMAND "\"${MYTOOL_PATH}\" -arg0 -arg1", but CMake just failed to parse it because there is a quote in front of the string. So it's bad I can't quote the command string because the path c:\Some Folder\MyTool.exe contains spaces.

[2] I also notice CMake will automatically expand my dependency pathes.

If I add to the command DEPENS "$(PATH_MACRO)", I will eventually get the dependency path automatically expanded by CMake: C:\MySolutionDir\$(PATH_MACRO); But I only want $(PATH_MACRO), because I will make sure visual studio understands what $(PATH_MACRO) refers to.

So here is my question:

How can CMake only accept my raw inputs, without auto expanding the path or inserting code I don't expect? I will make sure my inputs will be valid for visual studio. Thanks!

PS. My CMake version: 2.8.10.2. VS version: visual studio 2010 Ultimate

like image 430
A.Y.N. Avatar asked Nov 13 '22 07:11

A.Y.N.


1 Answers

In case this helps someone. I was trying to get binary signing to work as a post-build step using signtool.exe but ONLY for Release builds. Only the uncommented syntax works, none of the others do. I'm kinda at a loss as to why some of the others do not work, but at least I found one that does. There seems to be some strange rules about when literal quotes are generated and when they are not, depending on what is inside the quoted expression. Perhaps someone can explain.

function(my_sign_binary TARGET)
#SET(COMMAND_LINE signtool sign $<TARGET_FILE:${TARGET}>)
add_custom_command(
    TARGET ${TARGET} 
    POST_BUILD 
    COMMENT "Signing: ${TARGET}"
    COMMAND "$<$<CONFIG:Release>:signtool>" "$<$<CONFIG:Release>:sign>"  "$<$<CONFIG:Release>:$<TARGET_FILE:${TARGET}>>"

    #COMMAND $<$<CONFIG:Release>:signtool.exe sign $<TARGET_FILE:${TARGET}>>
    #COMMAND echo 1. signtool sign $<TARGET_FILE:${TARGET}>
    #COMMAND echo 2. "$<$<CONFIG:Release>:signtool sign $<TARGET_FILE:${TARGET}>>"
    #COMMAND "$<$<CONFIG:Release>:signtool sign $<TARGET_FILE:${TARGET}>>"
    #COMMAND "$<$<CONFIG:Release>:signtool>" "$<$<CONFIG:Release>:\ sign\ $<TARGET_FILE:${TARGET}>>"
    #COMMAND echo 3. $<$<CONFIG:Release>:"signtool sign $<TARGET_FILE:${TARGET}>">
    #COMMAND "echo 4. $<$<CONFIG:Release>:signtool sign $<TARGET_FILE:${TARGET}>>"
    #COMMAND echo 5. [$<$<CONFIG:Release>:signtool sign $<TARGET_FILE:${TARGET}>>]
    #COMMAND $<$<CONFIG:Release>:signtool sign $<TARGET_FILE:${TARGET}>>
    #COMMAND $<$<CONFIG:Release>:${COMMAND_LINE}>
    #COMMAND $<$<CONFIG:Release>:COMMAND_LINE>
    #COMMAND $<$<CONFIG:Release>:"${COMMAND_LINE}">
    #COMMAND $<CONFIG:Release>:signtool sign $<TARGET_FILE:${TARGET}>
    #COMMAND echo 8. "${$<$<CONFIG:Release>:COMMAND_LINE>}"
    #COMMAND ${"$<$<CONFIG:Release>:COMMAND_LINE>"}
)
endfunction()
like image 124
David Avatar answered Dec 31 '22 16:12

David