CMake/CPack: 不同平台的首选包生成器
CMake/CPack: Preferred package generators for different platforms
我想在 Linux、OSX 和 Windows 上分发 C/C++ 项目的可执行文件和库。什么是首选的 CPack 生成器,即哪些可能对大多数用户可用?在 Windows 上似乎只有 NSIS,但在 Linux 和 OSX 上有几种选择。
顺便说一句,源代码分发也生成了,所以理论上所有平台的用户都应该可以自己编译代码,但为了方便,我们想提供预编译的二进制文件。
每个不同平台上都有多种常见做法。哪一个最适合您将取决于多种因素,但以下内容至少应该有助于在 CMake/CPack 直接支持的更流行的格式中进行选择。我假设您正在通过 CMake 使用 CPack(即也通过 CPack module, possibly with package components using the CPackComponent module)。
Windows:
- NSIS package generator 生成普通用户习惯使用的可执行安装程序。这些支持基于组件的安装,因此您可以将源作为可选组件提供。 CMake 对此包生成器的支持相当成熟,但最近它可能正在成为一种不太受欢迎的方法。
- WIX package generator 生成 MSI 安装程序。对此的支持较新,并且在功能开发等方面似乎更加活跃。它还支持基于组件的安装,并且似乎正在成为 NSIS 之上的首选格式。
Mac
Mac有很多选项可供选择,但最合适的选项取决于您要打包的内容。如果您只想提供一个应用程序包,DMG package generator (also sometimes referred to as the DragNDrop generator) is probably what you want. Users are well acquainted with these and they are easy to use. Avoid the Bundle generator,它更旧且支持的内容更有限,应该首选 DMG 生成器。
对于包含多个捆绑包的软件包,DMG 生成器仍然可能适用,但合适的安装程序可能更合适。直到最近几年,PackageMaker generator was the go-to generator for that, but it has been superseded by the ProductBuild generator(从 3.7 版开始由 CMake 支持)。
Linux
在基于 RedHat 的系统上,RPM 通常是选择的包格式(使用 RPM generator), whereas for Debian-based systems the DEB format is preferred (use the DEB generator). Debian-based systems can support RPM using tools like alien, but users almost always prefer a native DEB format. If you're happy to provide both, you can keep both camps happy, but note that you will have to pay careful attention to binary compatibility. Simple packages used to be able to build against the LSB (Linux Standards Base) to produce a single RPM that would work on all major Linux distributions (even Debian-based ones), but the LSB hasn't really kept up with recent developments and it never really supported the full set of functionality most complex apps needed (or the versions of packages they provided were too old). The LSB does, however, provide very useful tools like the app checker 评估您构建的包(以任何方式)是否会缺少符号等,跨各种 Linux分布。
请注意,对于 Linux,您应该区分您的目标是打包以包含在 Linux 发行版本身中,还是您希望用户在发行版的打包系统之外下载并安装包.较大的独立商业软件产品将倾向于作为独立包分发,包括相关库等,并默认安装在 /opt
下(如果它们遵循 LSB 和 Filesystem Hierarchy Standard - FHS 提倡的指南(PDF )).理想情况下,您可以使您的包可重定位,以便分发维护人员可以更轻松地根据他们的分发要求调整您的打包方法。
RPM和DEB都在一定程度上支持源码包。
跨平台
- IFW package generator 受到一些人的青睐,因为它可以生成在所有平台上具有相似外观和感觉的安装程序。它在提供对可下载组件等功能的支持方面也相当进步。如果对跨所有平台的易于使用的图形安装程序感兴趣,那么这个可能就是您要找的。
- Archive package generator 提供对 ZIP、tarball、7z 等压缩文件的支持。这些是非常基本的格式,可以将您的文件简单地集中到一个存档中。它们没有桌面集成、pre-/post-install 和卸载等有用的功能,但作为上述格式之一的第二种替代包格式,它们很方便。特别是,它们对于在其系统上没有管理员访问权限并希望简单地解压缩到一个方便的位置的用户非常有用。
我想在 Linux、OSX 和 Windows 上分发 C/C++ 项目的可执行文件和库。什么是首选的 CPack 生成器,即哪些可能对大多数用户可用?在 Windows 上似乎只有 NSIS,但在 Linux 和 OSX 上有几种选择。 顺便说一句,源代码分发也生成了,所以理论上所有平台的用户都应该可以自己编译代码,但为了方便,我们想提供预编译的二进制文件。
每个不同平台上都有多种常见做法。哪一个最适合您将取决于多种因素,但以下内容至少应该有助于在 CMake/CPack 直接支持的更流行的格式中进行选择。我假设您正在通过 CMake 使用 CPack(即也通过 CPack module, possibly with package components using the CPackComponent module)。
Windows:
- NSIS package generator 生成普通用户习惯使用的可执行安装程序。这些支持基于组件的安装,因此您可以将源作为可选组件提供。 CMake 对此包生成器的支持相当成熟,但最近它可能正在成为一种不太受欢迎的方法。
- WIX package generator 生成 MSI 安装程序。对此的支持较新,并且在功能开发等方面似乎更加活跃。它还支持基于组件的安装,并且似乎正在成为 NSIS 之上的首选格式。
Mac
Mac有很多选项可供选择,但最合适的选项取决于您要打包的内容。如果您只想提供一个应用程序包,DMG package generator (also sometimes referred to as the DragNDrop generator) is probably what you want. Users are well acquainted with these and they are easy to use. Avoid the Bundle generator,它更旧且支持的内容更有限,应该首选 DMG 生成器。
对于包含多个捆绑包的软件包,DMG 生成器仍然可能适用,但合适的安装程序可能更合适。直到最近几年,PackageMaker generator was the go-to generator for that, but it has been superseded by the ProductBuild generator(从 3.7 版开始由 CMake 支持)。
Linux
在基于 RedHat 的系统上,RPM 通常是选择的包格式(使用 RPM generator), whereas for Debian-based systems the DEB format is preferred (use the DEB generator). Debian-based systems can support RPM using tools like alien, but users almost always prefer a native DEB format. If you're happy to provide both, you can keep both camps happy, but note that you will have to pay careful attention to binary compatibility. Simple packages used to be able to build against the LSB (Linux Standards Base) to produce a single RPM that would work on all major Linux distributions (even Debian-based ones), but the LSB hasn't really kept up with recent developments and it never really supported the full set of functionality most complex apps needed (or the versions of packages they provided were too old). The LSB does, however, provide very useful tools like the app checker 评估您构建的包(以任何方式)是否会缺少符号等,跨各种 Linux分布。
请注意,对于 Linux,您应该区分您的目标是打包以包含在 Linux 发行版本身中,还是您希望用户在发行版的打包系统之外下载并安装包.较大的独立商业软件产品将倾向于作为独立包分发,包括相关库等,并默认安装在 /opt
下(如果它们遵循 LSB 和 Filesystem Hierarchy Standard - FHS 提倡的指南(PDF )).理想情况下,您可以使您的包可重定位,以便分发维护人员可以更轻松地根据他们的分发要求调整您的打包方法。
RPM和DEB都在一定程度上支持源码包。
跨平台
- IFW package generator 受到一些人的青睐,因为它可以生成在所有平台上具有相似外观和感觉的安装程序。它在提供对可下载组件等功能的支持方面也相当进步。如果对跨所有平台的易于使用的图形安装程序感兴趣,那么这个可能就是您要找的。
- Archive package generator 提供对 ZIP、tarball、7z 等压缩文件的支持。这些是非常基本的格式,可以将您的文件简单地集中到一个存档中。它们没有桌面集成、pre-/post-install 和卸载等有用的功能,但作为上述格式之一的第二种替代包格式,它们很方便。特别是,它们对于在其系统上没有管理员访问权限并希望简单地解压缩到一个方便的位置的用户非常有用。