在 CMake 字符串中添加引号

Add quotation mark in CMake string

我正在使用 CMake 创建和构建我的项目解决方案。我正在使用以下命令添加一个 post 构建事件以将 .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 退出。

如果我进入项目属性并修改命令行并将其更改为添加“”

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

有效。

有没有一种方法可以更改 CMake 添加自定义命令以在实际命令行中包含“”,这样它就可以工作并且无需手动更改项目属性。

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

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

A \ followed by a non-alphanumeric character simply encodes the literal character without interpreting it as syntax

在你的情况下你会得到

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

而不是

"${CMAKE_SOURCE_DIR}LocalBin\example.tlb"

遗憾的是,这仅适用于命令参数,而不适用于命令本身。当您必须调用 Program Files 中的着色器编译器(其中包含 space 的路径)并且预构建规则失败时,这真的没有意思。为了解决这个问题,我使用 cmake file(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")

经过一段时间的努力,我找到了一个可行的解决方案 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