【问题标题】:CMAKE add_custom_command: How to use my raw commandsCMAKE add_custom_command:如何使用我的原始命令
【发布时间】:2013-04-17 05:45:47
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: cmake


    【解决方案1】:

    如果这对某人有帮助。我试图让二进制签名作为使用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()
    

    【讨论】:

      【解决方案2】:

      对于问题 1,请尝试 "c:\\Some Folder\\MyTool.exe" -arg0 -arg1ARGS 参数不是必需的,但重点是省略 -arg0 -arg1 周围的引号。

      对于问题 2,由于 $(PATH_MACRO) 不是绝对路径,CMake 将其视为相对于源目录的路径。解决此问题的最佳方法可能是使用“生成器表达式”,但如果没有关于您的具体情况的更多信息,我无法提供更好的答案。

      有关生成器表达式的信息,请参阅add_custom_command 的文档。

      【讨论】:

      • 谢谢弗雷泽。我知道生成器表达式,并且我已经在我的CMakeLists.txt 中使用了$&lt;CONFIGURATION&gt; 之类的东西。但这对这种情况确实没有帮助。我只是对此感兴趣,如果有的话,我可以停止 CMake 进行自动扩展,只保留我的原始字符串。
      • 我认为唯一的方法是完全限定宏 - 传递绝对路径,但也许其他人知道得更好?
      猜你喜欢
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多