【问题标题】:How to use pkgbuild to create a kext installer from within Xcode如何使用 pkgbuild 在 Xcode 中创建 kext 安装程序
【发布时间】:2013-01-08 08:55:11
【问题描述】:

我了解 PackageMaker 现已弃用。我们现在应该使用 pkgbuild/productbuild。

但是,我似乎找不到为 kext 创建安装程序的示例。我希望将包构建为我的 kext Xcode 项目构建步骤的一部分。所以任何 bash/脚本文件都会很棒。

【问题讨论】:

标签: xcode kernel-extension pkgbuild


【解决方案1】:

This answer 是一个非常好的一般情况指南。

具体来说,对于一个 kext,在 Product -> Archive 步骤之后,要生成组件 plist,我发现我需要 'cd' 进入构建的存档包目录:

cd ~/Library/Developer/Xcode/Archives/2013-12-22/my-kext\ 22-12-2013\ 22.57.xcarchive

然后,pkgbuild --analyze 步骤如下所示:

pkgbuild --analyze --root ./Products/ my-kext.plist

生成的 plist 应该在 RootRelativeBundlePath 键下包含一个外观合理的 kext 安装目标。 (通常是 /System/Library/Extensions/my.kext,或者如果是代码签名并且对于 10.9+,它应该是 /Library/Extensions/my.kext)如果不是,请在 Xcode 中修复您的 kext 目标的安装位置。

安装 kexts 时要注意的主要事情是获取正确的权限并刷新 kext 缓存。 pkgbuild 似乎默认将 kext 安装为 root,所以这很好。要强制刷新 kext 缓存,您需要更新 /System/Library/Extensions 上的修改时间(或 /Library/Extensions,如果您要安装到该位置)。您希望完全安装您的 kext 之后执行此操作,因此您需要一个安装后脚本。为它创建一个目录,例如./scripts 并使用内容创建一个名为“postinstall”的文件:

#!/bin/sh
touch /System/Library/Extensions

然后使其可执行:

chmod +x postinstall

您现在可以使用以下方法为您的 kext 构建通用包:

pkgbuild --root ./Products/ --scripts ./scripts/ --component-plist my-kext.plist my-kext.pkg

对于定制、协同设计等,请按照 catlan 链接答案中的说明进行操作 - 你无法击败他们!

【讨论】:

  • 当安装到/Library/Extensions/ 时,使用最新的 Xcode (6.4) 似乎不再需要 touch /System/Library/Extensions 命令:然后安装程序似乎等待自动重建 kext 缓存然后才执行安装后脚本。
  • 我已经尝试构建一个分发包,它奏效了。但是当我尝试签名时,productsigning 也能正常工作,但是在启动 pkg 时,安装程​​序会抱怨签名无效。不过不知道为什么。
  • 我怀疑 kext 缓存的东西取决于操作系统版本而不是 Xcode 版本。如果您忽略了touch 命令,请确保在所有受支持的操作系统版本上测试您的安装程序,尤其是已经安装了不同版本的 kext 的情况。 (仅在升级/降级时才需要触摸,而不是新安装的 kext)。对于 pkg 签名,我不是专家,但请确保您使用的是安装程序开发人员 ID 证书,而不是应用程序 onne。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多