为Linux封装专有软件

我正在进行跨平台开发,我想为Linux构build一个很好的自包含(!)包。 我知道这不是通常的做法,但是应用程序需要将所有数据放在一个地方,所以我将它安装到/ opt中,就像许多其他专有软件包一样。 我将最终提供deb和rpm包,但现在只能是.tar.gz。 用户应该把它解压到某个地方,它应该可以工作。 我宁愿没有安装程序。

首先是我的问题,然后是细节:

  1. 其他人如何为Linux专门包装软件?
  2. 有包装软件包括共享库的工具吗?

现在的一些细节:这是我的项目(我称之为 )为此目的布局:

  • foo(二进制)
  • config.ini文件
  • 数据

现在在这个包里面还会有两个额外的元素:

  • foo.sh

libs将包含项目所需的所有共享库,而foo.sh是一个将LD_LIBRARY_PATH设置为包含lib的脚本。 因此,用户将执行foo.sh程序应该启动。

我有一个shell脚本,在以下步骤中打包软件:

  1. 创build空目录并将foo.sh复制到它
  2. 调用构build过程并安装到新目录中
  3. 从文件系统复制共享库
  4. 打包一切.tar.gz

你觉得这怎么样? 这种方法有一些问题:

  • 我必须硬编码所有的依赖两次(一次在CMake,一次在包装脚本)
  • 我必须定义版本号两次(一次在源代码中,一次在打包脚本中)

你怎么做呢?

编辑:刚刚出现的另一个问题:你如何确定你的软件依赖于哪些库? 我做了一个ldd foo ,但是有很多很多。 我研究了WorldOfGoo软件包的外观,而且他们只出货很less的图书馆。 我怎样才能做出哪些图书馆将出现在用户的系统,哪些不会? 只要将所有的目标发行版安装到虚拟磁盘上,看看有什么需要?

Solutions Collecting From Web of "为Linux封装专有软件"

一般问题

你的方式打包你的东西(与依赖库)到/opt是如何专有(甚至开源)软件打包。 这是Linux基金会推荐的做法(请参阅我对其他问题的链接回答 )。

外部库可以从头开始编译,并作为一个单独的步骤嵌入到构建过程中(特别是在修改它们的情况下),或从某些分发包中获取。 第二种方法比较容易,但第一种方法允许更多的灵活性。

请注意,没有必要在你的包中包含一些真正的低级库(比如glibc,Xorg)。 他们最好留给系统厂商调整,你可能会认为它们存在。 此外,还有一个Linux标准库 ,它记录了最重要的库; 这些图书馆几乎无处不在,可以信任。

还要注意的是,如果你在一个较新的系统下编译,很可能旧系统的用户将不能使用它,反之则不然。 因此,为了达到更好的兼容性,在比现在两年更早的​​系统下编译软件包可能是有用的。

我刚刚列出了一些通用的东西,但我相信Linux开发者网络网站包含更多关于封装和可移植性的信息。

打包

从我在开源分配项目中看到的情况来看,您的脚本与分发厂商打包软件的方式相同。 他们的脚本会自动修补源代码,模拟安装软件并将结果文件夹打包成DEB和RPM。

Tar.gz或课程也可以工作,但是创建一个RPM并不够复杂,因此您错过了让用户的生活变得更加轻松的机会。

回答你的问题,

  • 是的,你必须两次硬编码依赖关系。

    问题是,当你在CMake中强制它们的时候,你可以用其他术语来指定它们,而不是在包装脚本中指定它们。 CMake指的是共享库头文件 ,而打包脚本是指

    包名和共享库和头文件之间没有交叉分配的一对一关系。 它通过分布而变化。 因此,应该指定两次。

    但是软件包可以很容易地被发行商重新打包,特别是如果你努力打包所有依赖的库(所以对端口的外部依赖将会减少)。 此外,一个可以将包从一个发行版移植到另一个发行版的工具将很快出现(我将在发布时更新我的​​答案)。

  • 是的,你必须指定你的版本两次。

    但问题是,你可能组织你的打包过程,使软件包和软件版本永远不会失去同步 。 只要将包装脚本从存储库中检出(或从您的网站上下载),该脚本将完全与脚本将写入包规范的版本相同。

分析依赖关系

要分析软件的依赖关系,您可以使用我们的开源免费Linux应用程序检查器工具。 它将报告它所依赖的库的列表,显示软件兼容的发行版,并帮助您的应用程序跨分发更便携。 事实证明,通过一点点努力,有时候可以实现更多的交叉分配兼容性,而且您不必将自己锁定在几个选定的分发版本上。

长时间思考(或询问产品开发部门)您需要支持哪些分布/体系结构。

确保他们完全理解测试的影响。

我希望你能拿出一个支持的发行版和体系结构的简短列表。

这实际上取决于哪些客户支付Linux支持。 大多数人使用红帽企业(在服务器上)或Centos(这是从技术角度难以区分)。

如果你只需要支持Redhat,你只需要支持RPM,job就是好的。