2017-02-18 139 views
2

我使用CMake的生成构建文件的跨平台游戏,并希望在某一批量的Info.plist文件定制的MacOS捆绑与CMake的

这里指定自定义NSMainNibFileNSPrincipalClass值Info.plist文件的相关部分我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属性为目标,它会按预期返回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捆绑?

回答

3

如果您查看MACOSX_BUNDLE_INFO_PLIST的文档,您会看到它只支持设置影响Info.plist模板(MACOSX_BUNDLE_BUNDLE_NAME等)的有限数量的属性。这些都不是NSMainNibFileNSPrincipalClass密钥。然而,该文档中它在模板的功能给出了一个暗示:

其Info.plist文件通过配置模板

什么是实际发生的创建,是该模块调用.plist.in文件中的configure_file。这就是为什么在全局范围设置变量的原因,但是在属性级设置变量不会。

所以,答案是你必须将它们设置为变量,而不是目标属性。如果您担心这些变量的范围,您可以在使用后立即使用这些变量,并且应该注意,变量只对它们的父范围是不可见的,除非它们是专门设置的。

+0

这可以说明一些原因。我不敢相信我没有拿起关于配置模板的一点(使用configure_file)。 无论如何我可以解决它,我只需要在plist中为某些工具指定XIB文件和NSApplication子类。 –