通常,OS X中的内核扩展和软件包使用反向DNS表示法命名(例如,com.apple.dock.plist)。这适用于属性列表,但也是命名内核扩展的标准(即,包括在I / O注册表中注册的扩展中的C ++类的名称)。据我了解,这样做是为了防止命名冲突。
对于涉及许多个人(开发人员)的开源项目,这是一个挑战,因为没有可以轻松地与bundle / kext关联的域名或公司名称。
有没有人看过Apple文档的指导,或者OS X的开源项目是否应该遵循其他标准,特别是在内核扩展方面?
答案 0 :(得分:1)
我没有听到任何权威的声音。说实话,我认为Apple并不关心这一切。我过去曾经想过这个主题,并形成了我自己的观点,我将分享:
名称前缀的主要目的是避免名称冲突。这尤其适用于kext包本身,但正如您所提到的,也适用于C ++类,它们在内核的OSMetaObject
运行时类型系统中具有单个命名空间。有开源代码的东西是有叉子,所以你无法控制其他人可能对你的代码做什么,如果不兼容的名称冲突的不兼容分支的构建突然出现,它可能会导致用户系统出现问题。所以我们试图避免这种情况,对吧?
因此,重点确实放在版本上,而不是源代码。我发现反向DNS前缀的名称无论如何都令人恼火,因此我总是使用#define SaneClassName tld_domain_driver_ClassName
来使我的代码更具可读性。我已经将它扩展为使用宏,如下所示:
#define SaneClassName PREFIXED_NAME(ClassName)
如此定义PREFIXED_NAME
宏:
#ifndef NAME_PREFIX
#error Must #define a unique, reverse-DNS-style NAME_PREFIX, e.g. com_example_driver_
#endif
#define PREFIXED_NAME_CONCAT2(prefix,name) prefix ## name
#define PREFIXED_NAME_CONCAT(prefix,name) PREFIXED_NAME_CONCAT2(prefix, name)
#define PREFIXED_NAME(name) PREFIXED_NAME_CONCAT(NAME_PREFIX, name)
您可以在构建系统中创建NAME_PREFIX
配置选项,并通过-DNAME_PREFIX=com_example_driver_
将其传递给编译器,这样如果有人分叉代码,则默认情况下无法构建,除非他们选择合适的前缀。如果您愿意,请在#error消息中强调前缀必须是唯一的。您还需要确保在info.plist和kext二进制文件中结束的包标识符由构建系统基于用户配置进行类似设置。
如果您没有与项目关联的域名,则可以根据托管位置(com_github_organisationname_project_)或基于电子邮件地址选择名称。如果您担心项目中的个别开发人员发布冲突的二进制版本,您可以请求他们使用他们托管公共分支的地方,电子邮件地址规则或给他们“子域名”(com_github_organisationname_project_person _)。
尽管付出了这些努力,你当然无法控制的是,如果在用户的机器上安装了两个叉子的构建,并且它们匹配同一个设备,那么kext会加载到用户的系统上。如果它成为问题,您只需要教育您的用户。似乎不太可能!