为 OS X 命名开源 kext/projects

Naming open-source kext/projects for OS X

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

对于涉及许多个人(开发人员)的开源项目,这是一个挑战,因为没有一个域名或公司名称可以很容易地与 bundle/kext 相关联。

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

没听过什么权威的。老实说,我认为 Apple 并没有那么在乎。我过去对这个主题进行了一些思考,并形成了自己的观点,我将分享这些观点:

名字前缀的主要objective是为了避免名字冲突。这尤其适用于 kext 捆绑包本身,但正如您提到的,也适用于 C++ 类,它们在内核的 OSMetaObject 运行 时间类型系统中具有单个名称空间。开放源代码的问题是存在分叉,因此您无法控制其他人可能会用您的代码做什么,如果不小心突然出现名称冲突的不兼容分叉构建,可能会导致用户系统出现问题。这就是我们要避免的情况,对吧?

所以重点实际上是 builds,而不是源代码。无论如何,我发现反向 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_ 将其传递给编译器,这样如果有人 fork 代码,默认情况下它将无法构建,除非他们选择了一个合适的前缀。如果愿意,可以在#error 消息中强调前缀必须是唯一的。您还需要确保在 info.plist 和 kext 二进制文件中结束的包标识符由构建系统基于用户配置类似地设置。

如果您没有与您的项目相关联的域名,您可以根据项目的托管位置 (com_github_organisationname_project_) 或电子邮件地址来选择名称。如果您担心项目中的个别开发人员会发布冲突的二进制版本,您可以要求他们使用他们托管 public 分支的位置、电子邮件地址规则或给他们 "subdomains" (com_github_organisationname_project_ person_).

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