在CMake字符串中添加引号

时间:2016-01-13 10:11:21

标签: cmake escaping

我正在使用CMake创建和构建我的项目解决方案。我使用以下命令添加一个post build事件,将.tlb从本地bin复制到程序bin。

ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME} POST_BUILD COMMAND xcopy /D /Y "${CMAKE_SOURCE_DIR}LocalBin\\example.tlb" "${CMAKE_SOURCE_DIR}ProgramBin\\$<CONFIGURATION>\\")

当这将命令添加到项目属性时,它将添加为

xcopy / D / Y LocalBin \ example.tlb ProgramBin \ Debug \

然而,这给了我一个错误。退出代码4。

如果我进入项目属性并破解命令行并将其更改为添加&#34; &#34;

xcopy / D / Y&#34; LocalBin \ example.tlb&#34; &#34; ProgramBin \调试\&#34;

有效。

有没有办法可以更改CMake添加自定义命令以包含&#34; &#34;在实际的命令行中,它将工作,无需手动更改项目属性。

3 个答案:

答案 0 :(得分:6)

字符串中必须有escape引号。转义是在CMake中用反斜杠完成的。因此,在字符串中添加引号,请添加\"

引用CMake文档https://cmake.org/cmake/help/v3.4/manual/cmake-language.7.html#escape-sequences

  

后跟非字母数字字符的\只是对文字字符进行编码而不将其解释为语法

在你的情况下,你最终会

"\"${CMAKE_SOURCE_DIR}LocalBin\\example.tlb\""

而不是

"${CMAKE_SOURCE_DIR}LocalBin\\example.tlb"

答案 1 :(得分:0)

可悲的是,这仅适用于命令参数,但不适用于命令本身。当您必须调用程序文件(其中包含空格的路径)中的着色器编译器并且预建规则失败时,这真的没有用。要解决此问题,我使用cmake文件(WRITE ...)命令动态创建批处理文件,然后使用正确的转义路径调用此批处理文件到我想要执行的实际着色器编译器。在批处理中,我有一行%1

解决我的问题

file(WRITE Shaders/compile_shaders.bat "\
%1 /ESolveVMF /Tcs_5_0 /DTGSize_=16 /Fh \"${CMAKE_CURRENT_LIST_DIR}/Shaders/GenerateRoughnessMaps.inc\" \"${CMAKE_CURRENT_LIST_DIR}/Shaders/GenerateRoughnessMaps.hlsl\"\n\
%1 /ESolveVMFReconstructNormal /Tcs_5_0 /DTGSize_=16 /Fh \"${CMAKE_CURRENT_LIST_DIR}/Shaders/GenerateReconstructNormalRoughnessMaps.inc\" \"${CMAKE_CURRENT_LIST_DIR}/Shaders/GenerateRoughnessMaps.hlsl\"")

add_custom_command(TARGET ${CURRENT_MODULE_NAME} PRE_BUILD
                  COMMAND "${CMAKE_CURRENT_LIST_DIR}\\Shaders\\compile_shaders.bat" "\"$(WindowsSdkDir)bin\\x86\\fxc.exe\""
                  COMMENT "Compiling shaders")

答案 2 :(得分:0)

经过一段时间的努力,我找到了一个使用generator expressions的可行解决方案:

ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME} POST_BUILD COMMAND xcopy /D /Y $<1:"${CMAKE_SOURCE_DIR}LocalBin\\example.tlb"> $<1:"${CMAKE_SOURCE_DIR}ProgramBin\\$<CONFIGURATION>\\">)

这是一个开放的bug in CMake