簡體   English   中英

CMAKE add_custom_command:如何使用我的原始命令

[英]CMAKE add_custom_command: How to use my raw commands

我試圖通過使用ADD_CUSTOM_COMMAND向我的vc2010項目添加一些自定義構建命令。 但:

[1]我發現CMAKE會自動插入比我預期更多的代碼。

例如,我希望命令完全是:

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

CMakeLists.txt中的相應代碼如下:

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)

但實際上我得到了:

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

這不是我想要的。 我也嘗試過字符串: COMMAND "\\"${MYTOOL_PATH}\\" -arg0 -arg1" ,但是CMake只是無法解析它,因為字符串前面有一個引號。 所以很糟糕我不能引用命令字符串,因為路徑c:\\Some Folder\\MyTool.exe包含空格。

[2]我還注意到CMake會自動擴展我的依賴性修補程序。

如果我添加命令DEPENS "$(PATH_MACRO)" ,我最終將獲得由CMake自動擴展的依賴路徑: C:\\MySolutionDir\\$(PATH_MACRO) ; 但我只想要$(PATH_MACRO) ,因為我會確保visual studio了解$(PATH_MACRO)所指的內容。

所以這是我的問題

CMake如何只接受我的原始輸入,而不自動擴展路徑或插入我不期望的代碼? 我將確保我的輸入對visual studio有效。 謝謝!

PS。 我的CMake版本:2.8.10.2。 VS版:visual studio 2010 Ultimate

如果這有助於某人。 我試圖使用signtool.exe將二進制簽名作為后構建步驟工作,但僅適用於Release版本。 只有未注釋的語法有效,其他語法都沒有。 我有點不知道為什么其他一些人不工作,但至少我找到了一個。 關於何時生成文字引號以及何時不生成文字引號似乎存在一些奇怪的規則,具體取決於引用的表達式中的內容。 也許有人可以解釋。

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()

對於問題1,請嘗試"c:\\\\Some Folder\\\\MyTool.exe" -arg0 -arg1 ARGS參數不是必需的,但重點是省略-arg0 -arg1周圍的引號。

對於問題2,由於$(PATH_MACRO)不是絕對路徑,因此CMake將其視為相對於源目錄的路徑。 解決此問題的最佳方法可能是使用“生成器表達式”,但如果沒有關於您的確切情況的進一步信息,我無法提供更好的答案。

有關生成器表達式的信息,請參閱add_custom_command的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM