使用 CMake 自定义 MacOS Bundle 的 Info.plist 文件
Customising MacOS Bundle's Info.plist file with CMake
我正在使用 CMake 为跨平台游戏生成构建文件,并希望在某些包的 Info.plist 文件
中指定自定义 NSMainNibFile
和 NSPrincipalClass
值
这是我的 Info.plist.in 模板的相关部分:
<key>NSMainNibFile</key>
<string>${MAIN_NIBFILE}</string>
<key>NSPrincipalClass</key>
<string>${PRINCIPAL_CLASS}</string>
我在 CMakeLists.txt 中所做的是:
set_target_properties(GLWindow PROPERTIES
MACOSX_BUNDLE_BUNDLE_NAME "OpenGL Test"
MAIN_NIBFILE "MainMenu"
PRINCIPAL_CLASS "NSApplication")
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/CMake/Info.plist.in)`
如果我得到目标的 MAIN_NIBFILE
属性,它会按预期 returns MainMenu,但实际生成的 Info.plist 是空的。
但是...
如果我全局设置这些变量,它工作正常。
# I would prefer to set these at target scope,
# but it doesn't bloody work!
set(MAIN_NIBFILE "MainMenu")
set(PRINCIPAL_CLASS "NSApplication")
我是不是遗漏了什么,或者这是 CMake 的限制,或者它如何处理 macOS 包?
如果您查看 MACOSX_BUNDLE_INFO_PLIST 的文档,您会发现它仅支持设置影响 Info.plist 模板(MACOSX_BUNDLE_BUNDLE_NAME
等)的有限数量的属性。其中 None 用于 NSMainNibFile
或 NSPrincipalClass
键。但是,在该文档中它给出了模板功能的提示:
its Info.plist file is created by configuring a template
实际发生的情况是,模块正在对 .plist.in 文件调用 configure_file
。这就是为什么在全局范围内设置变量有效,但在 属性 级别设置变量无效的原因。
所以,答案是您必须将它们设置为变量,而不是目标属性。如果你担心这些作用域,你可以unset
使用后立即变量,并且,需要注意的是,只有变量对其父作用域是不可见的,除非它们被特别设置为这样。
我正在使用 CMake 为跨平台游戏生成构建文件,并希望在某些包的 Info.plist 文件
中指定自定义NSMainNibFile
和 NSPrincipalClass
值
这是我的 Info.plist.in 模板的相关部分:
<key>NSMainNibFile</key>
<string>${MAIN_NIBFILE}</string>
<key>NSPrincipalClass</key>
<string>${PRINCIPAL_CLASS}</string>
我在 CMakeLists.txt 中所做的是:
set_target_properties(GLWindow PROPERTIES
MACOSX_BUNDLE_BUNDLE_NAME "OpenGL Test"
MAIN_NIBFILE "MainMenu"
PRINCIPAL_CLASS "NSApplication")
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/CMake/Info.plist.in)`
如果我得到目标的 MAIN_NIBFILE
属性,它会按预期 returns MainMenu,但实际生成的 Info.plist 是空的。
但是...
如果我全局设置这些变量,它工作正常。
# I would prefer to set these at target scope,
# but it doesn't bloody work!
set(MAIN_NIBFILE "MainMenu")
set(PRINCIPAL_CLASS "NSApplication")
我是不是遗漏了什么,或者这是 CMake 的限制,或者它如何处理 macOS 包?
如果您查看 MACOSX_BUNDLE_INFO_PLIST 的文档,您会发现它仅支持设置影响 Info.plist 模板(MACOSX_BUNDLE_BUNDLE_NAME
等)的有限数量的属性。其中 None 用于 NSMainNibFile
或 NSPrincipalClass
键。但是,在该文档中它给出了模板功能的提示:
its Info.plist file is created by configuring a template
实际发生的情况是,模块正在对 .plist.in 文件调用 configure_file
。这就是为什么在全局范围内设置变量有效,但在 属性 级别设置变量无效的原因。
所以,答案是您必须将它们设置为变量,而不是目标属性。如果你担心这些作用域,你可以unset
使用后立即变量,并且,需要注意的是,只有变量对其父作用域是不可见的,除非它们被特别设置为这样。