eom*_*mer 7 linux packaging distribution
我正在进行跨平台开发,我想为Linux构建一个漂亮的,自包含的(!)包.我知道这不是通常的方式,但应用程序需要一个地方的所有数据,所以我将它安装到/ opt,就像许多其他专有软件包一样.我最终将提供deb和rpm包,但现在只有.tar.gz.用户应该在某处提取它,它应该工作.我宁愿没有安装程序.
首先是我的问题,然后是细节:
现在来看一些细节:这是我的项目(为此我称之为foo)布局:
现在在包中,将有两个额外的元素:
libs将包含项目所需的所有共享库,foo.sh是一个将LD_LIBRARY_PATH设置为包含libs的脚本.因此,用户将执行foo.sh并且程序应该启动.
我有一个shell脚本,它按以下步骤打包软件:
你觉得这怎么样?这种方法存在一些问题:
你怎么做呢?
编辑: 刚出现的另一个问题:您如何确定您的软件所依赖的库?我做了一个ldd foo,但是有很多.我看了一下WorldOfGoo包的外观,它们只发送了很少的库.如何假设用户系统中存在哪个库,哪个库不存在?只需将所有目标分布安装到虚拟matine中,看看需要什么?
您打包自己的东西(使用依赖库)的方式/opt
是如何打包专有(甚至是开源)软件.这是Linux基金会的推荐做法(请参阅我对其他问题的回答链接).
外部库可以从头开始编译,并作为单独的步骤嵌入到构建过程中(特别是如果您修改它们),或者从某些发行版的包中获取.第二种方法更容易,但第一种方法允许更大的灵活性.
请注意,没有必要在包中包含一些非常低级的库(例如glibc,Xorg).他们最好留给系统供应商调整,你可能只是假设它们存在.此外,还有一个Linux标准库,它记录了最重要的库; 这些库几乎无处不在,并且可以信任.
另请注意,如果您在较新的系统下进行编译,则很可能旧系统的用户将无法使用它,而反之则不然.因此,为了获得更好的兼容性,在比现在早两年的系统下编译包可能是有用的.
我刚刚概述了一些通用的东西,但我相信Linux Developers Network网站包含有关打包和可移植性的更多信息.
从我在开源分发项目中看到的情况来看,您的脚本与分发供应商打包软件的方式相同.他们的脚本自动修补源代码,模仿软件的安装并将生成的文件夹打包到DEB和RPM中.
Tar.gz或者当然也可以工作,但是创建一个RPM并不复杂,你不能错过这样一个机会,让你的用户生活变得如此简单.
回答你的问题,
是的,您必须对依赖项进行两次硬编码.
问题是,当您在CMake中对它们进行强制转换时,您可以使用其他术语来指定它们,而不是在打包脚本中指定它们.CMake是指共享库和头文件,而打包脚本是指包.
包名称与共享库和标头之间没有交叉分布的一对一关系.它因分布而异.因此,应该指定两次.
但是包可以很容易地由分发供应商重新打包,特别是如果你努力将所有依赖的lib打包到它中(因此对端口的外部依赖性会更少).此外,一个可以将包从一个发行版移植到另一个发行版的工具很快就会出现(我会在发布时更新我的答案).
是的,您必须指定两次版本.
但问题是你可以组织你的包装过程,使包装和软件版本永远不会失去同步.只需将包装脚本从您的存储库中检出(或从您的网站下载)与脚本将写入包规范的版本完全相同.
要分析软件的依赖关系,您可以使用我们的开源免费Linux应用程序检查工具.它将报告它所依赖的库列表,显示与您的软件兼容的发行版,并帮助您的应用程序在各个发行版中更具可移植性.事实证明,有时可以通过很少的努力实现更多的交叉分发兼容性,并且您不必将自己锁定为仅支持几个选定的发行版.
归档时间: |
|
查看次数: |
4166 次 |
最近记录: |