macos - 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
)
注意:由于兼容性原因,我无法更改文件名。
解决方案
编辑:确切地说,这已在 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 发行说明,但我找不到任何关于此问题已修复的说明。
推荐阅读
- javascript - 单击按钮后如何从表单中获取结果(JavaScript 和 HTML)
- json - 确定 Type 是否为纯“数据类型”
- python - python请求库:从附加路径获取响应的函数
- r - 如何更改 RDA 箭头的字体和字体大小 - ggvegan?
- microsoft-graph-api - 通过 REST API 读取 MS Teams 中的聊天线程
- php - 将 WooCommerce 功能的特定结果打印为简码
- python-3.x - 无法使用 .json 密钥文件创建 Pub/Sub Publisher Client
- python - 在文件中写入嵌入列表
- r - 使用 R Markdown 和内置 Microsoft 主题生成 PowerPoint 幻灯片
- postgresql - chown: /var/lib/postgresql/data/postgresql.conf: 只读文件系统