我有时从源代码编译应用程序,并且我一直在使用:
./configure
make
sudo make install
但最近,我发现./autogen.sh
它为我生成配置和制作脚本并执行它们。
还有哪些其他方法可以简化 C/C++/C#(mono) 编译?看起来有点老了。有新的工具吗?如果可以选择,我应该使用哪一个?
答案1
Autoconf 和 Automake 旨在解决 Unix 的进化问题。
随着 Unix 向不同方向发展,想要可移植代码的开发人员倾向于编写如下代码:
#if RUNNING_ON_BSD
Set things up in the BSD way
#if RUNNING_ON_SYSTEMV
Set things up in the SystemV way
#endif
随着 Unix 被分叉成不同的实现(BSD、SystemV、许多供应商分叉,以及后来的 Linux 和其他类 Unix 系统),对于想要编写可移植代码来编写不依赖于特定操作系统品牌的代码的开发人员来说变得很重要,但基于操作系统公开的功能。这很重要,因为 Unix 版本会引入新功能,例如“发送”系统调用,后来其他操作系统也会采用它。开发人员不再使用大量代码来检查品牌和版本,而是开始按功能进行探索,因此代码变成了:
#if HAVE_SEND
Use Send here
#else
Use something else
#endif
早在 90 年代,大多数用于编译源代码的自述文件都指示开发人员编辑 config.h 文件并注释掉系统上可用的适当功能,或者为已测试的每个操作系统配置提供标准 config.h 文件。
这个过程既麻烦又容易出错,这就是 Autoconf 的由来。您应该将 Autoconf 视为一种由带有特殊宏的 shell 命令组成的语言,它能够使用探测操作系统功能的工具来取代 config.h 的人工编辑过程。
您通常会将探测代码写入configure.ac 文件中,然后运行autoconf 命令,该命令会将该文件编译为您所使用过的可执行configure 命令。
因此,当您运行时,./configure && make
您正在探测系统上可用的功能,然后使用检测到的配置构建可执行文件。
当开源项目开始使用源代码控制系统时,签入configure.ac 文件是有意义的,但签入编译(configure)的结果却没有意义。 autogen.sh 只是一个小脚本,它使用正确的命令参数调用 autoconf 编译器。
--
Automake 也源于社区现有的实践。 GNU 项目标准化了 Makefile 的一组常规目标:
make all
将构建该项目make clean
将从项目中删除所有已编译的文件make install
会安装该软件- 类似的事情
make dist
会make distcheck
准备要分发的源代码并验证结果是否是完整的源代码包 - 等等...
构建兼容的 makefile 变得很麻烦,因为有大量的样板文件被一遍又一遍地重复。因此,Automake 是一个新的编译器,它与 autoconf 集成,并将“源”Makefile(名为 Makefile.am)处理为 Makefile,然后将其提供给 Autoconf。
automake/autoconf 工具链实际上使用了许多其他辅助工具,并且通过其他组件来增强它们以执行其他特定任务。随着按顺序运行这些命令的复杂性不断增加,对可立即运行的脚本的需求诞生了,这就是 autogen.sh 的由来。
据我所知,Gnome 是引入此帮助程序脚本 autogen.sh 的使用的项目
答案2
这个领域有两个“大玩家”; Cmake 和 GNU Autotools。
GNU Autotools 是 GNU 做事的方式,并且相当关注 *nix。它是一种元构建系统,提供了一组工具来生成特定的配置并为您想要执行的操作创建文件。这可以帮助您在代码中进行更多更改,而无需直接操作构建系统,并且可以帮助其他人以您未设计的方式构建您的代码 - 在 *nix 下。
Cmake 是跨平台的做事方式。 Cmake 团队以许多不同的方式构建软件,包括 GCC、Visual Studio、XCode、Windows、OSX、Solaris、BSD、GNU/Linux 等。如果您非常关心代码库的可移植性,那么这就是正确的选择。
正如已经提到的,有些人似乎喜欢 Scons。如果您熟悉 Python,这可能会为您的工作环境提供更多的一致性。
Ruby 还有一种称为 Rake 的元构建系统,它本身就非常酷,对于那些已经熟悉 Ruby 的人来说非常方便。
答案3
斯康斯是一种可能的替代品,尽管我没有个人经验。它也是用 Python 实现的,这可能是一个问题,具体取决于构建环境。
答案4
对于 C#,您可以使用 xbuild(以及 Windows 上的 msbuild),它将从您的项目文件构建项目。