首页 > 解决方案 > CMake转义OS X内容副本的文件名中的特殊字符

问题描述

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

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

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
    )

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

标签: macoscmakebundle

解决方案


编辑:确切地说,这已在 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 发行说明,但我找不到任何关于此问题已修复的说明。


推荐阅读