【问题标题】:CMake escape special character in file name for OS X content copyCMake转义OS X内容副本的文件名中的特殊字符
【发布时间】:2021-04-07 00:41:15
【问题描述】:

stackoverflow 的长期读者(谢谢大家!),但这是我的第一个问题。

我正在尝试为现有 Xcode 项目创建 CMake 文件。目标是创建一个 *.app 文件(目录似乎更合适),其中包含应用程序运行所需的所有资源。 (或者更准确地说,我们的目标是不使用 Xcode,而是使用 CLion,我已经在 Windows 和 Linux 上的同一个项目中使用了它)

当 CMake 生成代码以复制一些包含特殊字符的文件时,我遇到了问题。 Cmake 运行良好,但是当我尝试构建时出现以下错误:

====================[ Build | MyAppDebug | Debug ]==========================
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/<user>/MyApp/cmake-build-debug --target MyAppDebug -- -j 8
CMakeFiles/MyAppDebug.dir/build.make:4112: *** missing separator.  Stop.
make[2]: *** [CMakeFiles/MyAppDebug.dir/all] Error 2
make[1]: *** [CMakeFiles/MyAppDebug.dir/rule] Error 2
make: *** [MyAppDebug] Error 2

这是在 build.make 文件中的第 4112 行:

4111.
4112.    ../bin/DebugOsx/MyApp.app/Contents/Resources/my\ resource\ folder/file_name#1.gif: /Users/<user>/resources/my\ resource\ folder/file_name#1.gif
4113.    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Copying OS X content ../bin/DebugOsx/MyApp.app/Contents/Resources/my resource folder/file_name#1.gif"
4114.    $(CMAKE_COMMAND) -E copy "/Users/<user>/resources/my resource folder/file_name#1.gif" "../bin/DebugOsx/MyApp.app/Contents/Resources/my resource folder/file_name#1.gif"
4115.

如果我通过在第 4112 行的文件名中添加反斜杠来手动转义 #,则这些行在尝试构建时不会出错。

4112.    ../bin/DebugOsx/MyApp.app/Contents/Resources/my\ resource\ folder/file_name\#1.gif: /Users/<user>/resources/my\ resource\ folder/file_name\#1.gif

这大致是我的 CMake 文件的外观:(我实际上使用了一堆 globbing 来获取所有文件和相应的文件夹树)

set(TESTFILE "/Users/<user>/resources/my resource folder/file_name#1") #Edit: I tried this with and without escaping
set_property(SOURCE ${TESTFILE} PROPERTY MACOSX_PACKAGE_LOCATION "Resources/my resource folder")
add_executable(MyAppDebug MACOSX_BUNDLE ${SOURCE_LIST} ${TESTFILE})

target_link_libraries(MyAppDebug <some libs>)
set_target_properties(MyAppDebug PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin/DebugOsx"
    OUTPUT_NAME "MyApp"
    MACOSX_BUNDLE TRUE
    MACOSX_BUNDLE_BUNDLE_NAME MyApp
    MACOSX_BUNDLE_BUNDLE_VERSION 1
    MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0.0"
    MACOSX_BUNDLE_GUI_IDENTIFIER org.mycompany.myapp
    )

注意: 由于兼容性原因,我无法更改文件名。

【问题讨论】:

  • 为什么在定义TESTFILE 变量时使用退格键(\)?无需转义双引号字符串中的空格。
  • 你说得对,我没有在实际文件中。这只是用最少的代码进行的快速测试,所以我可以把它放在问题中。我将编辑反斜杠。
  • 我想知道这是否真的是 cmake 中的一个错误,也许值得打开一个 GitLab 问题?
  • 根据that question,似乎CMake没有为Makefile转义哈希符号(#)。
  • 嗯,看起来是这样。我想知道为什么......我猜是去 CMake 论坛!谢谢

标签: macos cmake bundle


【解决方案1】:

编辑:确切地说,这已在 CMake 版本 1.18.0 中修复。 1.17.5 还是有这个问题。

显然,这已在 CMake 版本 3.17.3(随附最新版本的 CLion)和版本 3.19.2(当前最新)之间得到修复。

CLion(截至 2020.3)不支持 CMake 版本 >= 3.18,但在清除所有缓存并重新加载项目后它确实可以工作,并且文件名中的特殊字符被转义。现在我将简单地添加

cmake_minimum_required(VERSION 3.19)

到 CMake 文件的 Apple 部分。

注意: 我查看了自 3.18 版以来 CMake 的所有发行说明,但我找不到任何关于此问题已修复的说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-10
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多