【问题标题】:Naming open-source kext/projects for OS X [closed]为 OS X 命名开源 kext/项目 [关闭]
【发布时间】:2015-03-30 23:54:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: operating-system open-source kernel-extension


    【解决方案1】:

    我没有听到任何权威的消息。老实说,我认为苹果并没有那么在意。过去我已经对这个主题进行了一些思考,并形成了自己的观点,我将分享:

    名称前缀的主要目的是避免名称冲突。这尤其适用于 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 会加载到用户的系统上。如果它成为一个问题,你只需要教育你的用户。似乎不太可能!

    【讨论】:

    • 哇,你想了很多 - 很好的建议,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多