我没有听到任何权威的消息。老实说,我认为苹果并没有那么在意。过去我已经对这个主题进行了一些思考,并形成了自己的观点,我将分享:
名称前缀的主要目的是避免名称冲突。这尤其适用于 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 会加载到用户的系统上。如果它成为一个问题,你只需要教育你的用户。似乎不太可能!