Ant 蚂蚁+;cpptasks vs.scons vs.make

Ant 蚂蚁+;cpptasks vs.scons vs.make,ant,build-process,makefile,scons,Ant,Build Process,Makefile,Scons,在我把一大块脑细胞投入到完全不同的东西中之前,我正在研究,我只是想确定我知道替代方案是什么。我过去一直在使用GNU make,但从未对它特别满意 特别是:为什么蚂蚁不经常使用C/C++项目?(考虑到有)我读了一些帖子说Ant更倾向于Java(显然),但这样做的缺点是什么?为什么烤饼比make好多了 我正在使用TI DSP的交叉编译器,一个项目中通常有20-50个cpp文件。看起来构建管理中最困难的部分是自动依赖性检查。其他一切只是将文件列表与编译器选项集映射在一起 编辑:为什么交叉编译会改变什么

在我把一大块脑细胞投入到完全不同的东西中之前,我正在研究,我只是想确定我知道替代方案是什么。我过去一直在使用GNU make,但从未对它特别满意

特别是:为什么蚂蚁不经常使用C/C++项目?(考虑到有)我读了一些帖子说Ant更倾向于Java(显然),但这样做的缺点是什么?为什么烤饼比make好多了

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


编辑:为什么交叉编译会改变什么?它是一个与gcc运行方式相同的编译器,只是它生成的对象文件/可执行文件不会在我的电脑上运行。

对于交叉编译,我认为您的最佳选择是要么。尤其是当您可以为多个体系结构/平台编译代码时。我通常在本机上编译代码的一个子集以进行单元测试,而所有代码都是为目标平台编译的。CMake处理得特别好,因为它允许您指定交叉编译库所在的位置。因此,与其在/usr/lib中搜索交叉编译的libpng,还可以告诉它在/opt/arm-eabi-gcc/或构建机器上安装了工具链库的任何地方查找。您可以为不同的变体创建多个构建目录,并使用make手动编译每个变体,或者使用脑残的手动递归make触发该批

蚂蚁有一个缺点,它基本上和香草一样好或坏,但缺点是你使用的东西不是C或C++的主流。您必须处理所有您自己的依赖关系-包括内部依赖关系,例如C文件到头文件到库或可执行文件,以及外部依赖关系,例如必须链接到第三方库。另外,我认为Ant C任务并没有得到那么多的维护。我见过的每一个使用Ant for C的人都呼吁GCC执行exec任务

SCons更好,但交叉编译不是它的优点。它也不像CMake或Autotools那样是一个“构建系统”,它只是一个构建工具。正如他们在维基上所说的那样。不过,它确实内置了对依赖项的处理,这意味着您不必使用“gcc-MM-MD”或其他任何东西来处理依赖项,因此这是相对于Make的优势。SCON还支持检测已安装的第三方库,但通常的检测方式会增加很多构建时间。与其他系统不同,SCons在每次运行时都会运行检查阶段,尽管大多数结果都是缓存的。SCons也因其构建时间长而臭名昭著,尽管对于50个文件来说这不是问题。SCON中不存在交叉编译支持—您必须自己进行编译。通常,您会强制构建类似于Unix平台,然后重写C编译器的名称。构建多个变体或将构建目录与源目录分离充满了陷阱,这使得交叉编译代码变得不太合适

CMake和Autotools已经很好地解决了依赖性问题,并且Autotools的交叉编译支持已经成熟。自2008年4月发布版本2.6.0以来,CMake一直在进行交叉编译。您可以免费获得这些功能,以及其他功能,如打包和运行单元测试(“进行检查”或类似的目标)。这两种工具的缺点是它们都需要引导。对于CMake,您需要安装CMake二进制文件来创建Makefiles或Visual Studio解决方案文件。在Autotools的情况下,它稍微复杂一些,因为不是每个编译软件的人都需要安装automake和autoconf,只有那些需要更改生成系统的人(添加新文件视为更改生成系统)。两阶段引导(configure.ac->configure,configure+Makefile.in->Makefile)在概念上更难理解


对于编辑:交叉编译在构建系统中是一个额外的难题,因为它增加了程序和库的自动检测的复杂性。SCons不处理这个问题,它让你自己来解决。蚂蚁同样什么也不做。Autoconf在autotools中处理此问题,但在配置链接时,您可能必须在命令行上提供“-with libfoobar=/some/path”,或者在链接阶段尝试使用/usr/lib时,必须面对断开的链接。CMake的方法对于工具链文件来说有点重,但这意味着您不必按照标准约定指定所有工具和库(CC、CXX、RANLIB、-with ibfoo=,等等)。理论上,您可以在多个项目中重用精心编制的CMake工具链文件,以交叉编译它们。实际上,CMake的普及程度还不足以为普通黑客提供方便,尽管如果您正在创建多个专有项目,它可能会很有用。

Ant拥有大量Java用户(出于自然原因)。Ant在更广泛的环境中非常有用,这是大多数非Java开发人员都不知道的。因此,如果您使用Ant构建C/C++代码,那么您自己编写的代码要比使用具有更大用户群(CMake或SCON)的系统多得多

就我个人而言,我对CMake非常满意,主要是因为它是唯一能够生成真正VisualStudio项目的构建系统。SCON也可以,但他们只对SCON进行外部调用,而CMake生成的项目使用Visual Studio自己的构建引擎。如果您与使用VisualStudio的人一起工作,这将非常有用

我不确定我会不会
<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>