为OS X命名开源kext / projects

用户名

通常,使用反向DNS表示法(例如com.apple.dock.plist)来命名OS X中的内核扩展和软件包。这适用于属性列表,但也是命名内核扩展的标准(即,包括在I / O注册表中注册的扩展中的C ++类的名称)。据我了解,这样做是为了防止命名冲突。

对于涉及许多个人(开发人员)的开源项目来说,这是一个挑战,因为没有一个域名或公司名称可以轻易地与捆绑软件/附属软件相关联。

有没有人看过Apple文档中的指南,或者是否有其他OS X开源项目可以遵循或应遵循的其他标准,尤其是在内核扩展方面?

pmdj

我还没有听到什么权威。老实说,我认为苹果并不那么在乎。过去,我已经对该主题进行了一些思考,并形成了我自己的观点,我将分享以下观点:

名称前缀的主要目的是避免名称冲突。这尤其适用于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_)。

尽管做出了这些努力,您当然无法控制的是,如果在用户的计算机上安装了两个fork的构建,并且它们与同一台设备匹配,则哪个kext会加载到用户的系统上。如果出现问题,您只需要教育您的用户。似乎不太可能!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章