Ant+CPPTasks、SCons和Make比较

20

我正在了解 scons,在我投入大量时间学习之前,我想确保了解一下其他选择。过去我一直使用GNU make,但对它并不是太满意。

尤其是:为什么在C / C ++项目中不经常使用Ant呢?(考虑到有Ant cpptasks)我读了一些帖子,说Ant更偏向于Java(显然),但这样做的缺点是什么?为什么scons比make好得多?

我正在使用TI DSP的交叉编译器,通常一个项目中有20-50个cpp文件。构建管理中困难的部分似乎是自动依赖检查。其他所有操作只需要将文件列表与编译器选项集映射起来即可。

编辑:那么为什么跨编译会改变任何事情呢?它是以与gcc相同的方式运行的编译器,只是它生成的目标文件/可执行文件不能在我的PC上运行。

5个回答

25
对于交叉编译,我认为你最好的选择是CMakeAutotools。特别是如果你可以为多个架构/平台编译代码。我通常在本地机器上编译我的代码子集以进行单元测试,并在目标平台上编译全部代码。CMake处理这个问题尤其好,因为它允许您指定交叉编译库的位置。因此,它可以被告知在构建机器上安装的工具链库所在的位置(例如/opt/arm-eabi-gcc/),而不是在/usr/lib中搜索交叉编译的libpng。您可以为不同的变量创建多个构建目录,并使用make手动编译每个变量,或者使用一个简单的递归make触发所有变量。
Ant的缺点是它基本上与vanilla Make一样好或不好,但有一个额外的劣势,即你正在使用一个对于C或C++来说不是特别主流的东西。你必须处理所有自己的依赖关系——包括内部依赖关系,例如C文件到头文件到库或可执行文件,以及外部依赖关系,例如必须链接第三方库。此外,我认为Ant C任务并没有得到很好的维护。我见过所有使用Ant进行C开发的人都倡导使用exec任务调用GCC。
SCons更好,但交叉编译不是它的强项。它不像CMake或Autotools那样是一个“构建系统”,而只是一个构建工具。正如其维基上所说,它就是用Python实现的Make。然而,它内置了处理依赖关系的功能,这意味着您不必使用“gcc -MM -MD”之类的命令来自己处理依赖关系,因此这比Make更具优势。 SCons还支持检测已安装的第三方库,但通常的做法可能会增加构建时间。与其他系统不同,每次运行SCons时都会运行检查阶段,尽管大多数结果都被缓存。 SCons以长时间的构建时间而闻名,但对于50个文件来说这不是问题。 SCons不支持交叉编译-您必须自己处理,就像邮件列表中讨论的那样。通常,您需要将构建强制设置为类Unix平台,然后覆盖C编译器的名称。构建多个变体或将构建目录与源目录分开充满了陷阱,这使得它在交叉和本地编译代码时不太适用。
CMake和Autotools已经很好地解决了依赖问题,而且Autotools的交叉编译支持也很成熟。自2008年4月发布2.6.0版本以来,CMake就已经具备了交叉编译功能。你可以免费获得这些功能,还有其他功能,比如打包和运行单元测试("make check"或类似目标)。这两个工具的缺点是它们需要引导。在CMake的情况下,您需要安装CMake二进制文件才能创建Makefiles或Visual Studio解决方案文件。在Autotools的情况下稍微复杂一些,因为不是所有编译软件的人都需要安装automake和autoconf,只有那些需要更改构建系统的人才需要安装它们(添加新文件算作更改构建系统)。2阶段引导(configure.ac-> configure,configure + Makefile.in-> Makefile)在概念上有点棘手,需要理解。

对于编辑:交叉编译是构建系统中的额外麻烦,因为它增加了程序和库的自动检测的复杂性。SCons不处理这个问题,它把这个问题留给你去解决。Ant同样也没有处理。在autotools情况下,Autoconf处理这个问题,但是当你配置时,你可能需要在命令行上提供“-with-libfoobar=/some/path”,否则在链接阶段尝试使用/usr/lib时会出现链接错误。CMake的方法稍微重量级一些,需要使用工具链文件,但这意味着你不必指定所有的工具和库(CC、CXX、RANLIB、--with-ibfoo=等),因为它们是从标准约定中找到的。理论上,你可以在多个项目中重用一个精心制作的CMake工具链文件来进行交叉编译。实际上,CMake并不普及,对于普通黑客来说并不方便,但如果你正在创建多个专有项目,则可能很有用。


6
我曾经大量使用Ant+CppTasks来构建非常庞大的代码库,通过JNI集成到新的Java代码中,并且非常满意于C++代码的可靠增量构建、良好的灵活性(在构建文件或通过对代码进行微调等方面)。但是,CppTasks是一个没有社区支持并且维护者(Curt Arnold)长时间未做任何事情的项目。它仍然非常好用和有用,但请注意,很少有人知道或者使用CppTasks(例如当我需要特定编译器处理C文件时,编译器“竞标”文件的方式让我感到困扰,而不同的C++编译器却取代了这些文件)。
CppTasks跟踪编译选项的方式,动态地扫描头文件依赖关系,同时保持快速(有一些依赖缓存),这意味着它是我使用过的唯一一个具有准确增量构建的系统,在构建非常庞大的代码库时非常重要。
因此,正如我在Ant用户/开发人员列表上多次说过的那样,如果你有大量的Java内容,并且已经在Ant中投资,而且不怕深入研究CppTasks的文档和代码,现在需要构建JNI“胶水”代码和/或胶水代码公开的“遗留”本地库,那么CppTasks是一个值得考虑的竞争者,收益可能很大。
例如,我轻松地集成了<rc>用于Windows dll,以添加完整的版本信息,编写一个小的Ant任务来正确格式化.res文件。它对我起作用了,但Ant+CppTasks绝对更适合“高级”Ant用户/开发人员,在我看来。
希望这可以帮到你。--DD

3
我想推荐使用terp 通过ANT构建C++项目。我们开发了terp,因为ANT是我们选择的构建工具,而CppTasks已经有点过时了,同时我们也想在不同的抽象层面上工作。terp支持许多不同的编译器,并得到我们公司的支持。但对于大多数项目来说,它并非免费的。
我们主要设计terp用于全重构而不是增量构建的依赖分析。我们正在努力实现,但现在还没有。terp的优点在于多平台、多处理器架构、多编译器版本的发布中,您不需要为所有组合维护n个不同的配置。截至目前(2009年7月),它处于公共测试阶段,但很快就会发布。

2

在过去的五年中,我一直在从事一个项目,该项目使用ant进行x86和arm构建。我们为了生产通用编译器而调整了cpptasks,只需传入前缀(例如arm-gum-linux-gnueabi-),然后将其添加到实际工具(如g++或ar)之前即可。没有前缀意味着您会得到开发平台的构建工具。交叉编译的工具链在其构建工具二进制文件中具有这些前缀。选择Ant而不是基于Make的任何东西几乎全部原因是cpptasks能够执行增量构建以及保持autoconf正常运行所必须发生的混乱。我们能够支持几乎任何源文件的范例,特别是用于库集的文件夹树结构中的文件可以被创建/重命名/删除,而无需对构建文件进行任何编辑。一个小缺点是链接文件会以一种导致不必要的重建的方式更新属性。

<target name="lib.cvp">
<fetch.and.log.version 
    svnvers.target="common/cvp" 
    svnvers.property="libcvp.version"/>
    <cc objdir="${obj.dir}/common/cvp" 
        commandPrefix="${command.prefix}" 
        compilerName="${compiler.name}"
        outfile="${lib.dir}/cvp" outtype="static">
        <compiler extends="base.compiler"/>
        <compilerarg 
            value="-D__CVP_LIB_BUILD_VERSION__=&quot;${libcvp.version}&quot;"/>
        <compilerarg 
            value="-D__BUILD_NOTES__=&quot;${libcvp.toolversion}&quot;"/>
        <compilerarg if="is.x86" value="-DARCH_X86"/>
        <linker extends="base.linker"/>
        <includepath refid="common.inc"/>
        <fileset dir="${project.home}/common/cvp">
            <include name="*.c"/>
            <include name="*.cpp"/>
        </fileset>
    </cc>
</target>

1

Ant拥有非常Java-heavy的用户群(出于自然原因)。事实上,大多数非Java开发人员并不知道Ant在更广泛的环境中可以非常有用。因此,如果您使用Ant构建C/C++代码,您将比使用具有更大用户群的系统(如CMake或SCons)更加独立。

就个人而言,我非常喜欢CMake,主要是因为它是唯一一个可以生成真正Visual Studio项目的构建系统。SCons也可以,但它们只是对SCons进行外部调用,而CMake生成的项目使用了Visual Studio自己的构建引擎。如果您与习惯于使用Visual Studio的人一起工作,这非常有用。

我不确定是否应该称CMake对交叉编译的支持“成熟”,因为它仍然很年轻。但是,CMake的开发人员非常认真对待它,所以我毫不犹豫地尝试了它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接