Build 如何重定向生成大量单独输出文件的实用程序的输出?

Build 如何重定向生成大量单独输出文件的实用程序的输出?,build,makefile,build-process,build-automation,Build,Makefile,Build Process,Build Automation,我的构建过程使用了很多封闭源代码的第三方实用程序。这些工具生成大量文件,分为三类:我想要的文件、报告和垃圾文件。有时我可以选择其中一个或两个文件的输出目录,但不是全部。其余文件只显示在当前目录或全新的子目录中。大多数这些不需要的文件都没有文档记录。这些实用程序的每个新版本中都会出现新的不需要的文件 是否有办法运行这些实用程序并将所有文件系统操作重定向到某个指定的子目录,在删除其余文件之前,我可以在其中复制出好的文件?我可以切换到一个子目录来运行这些工具,但这会把事情搞砸,因为构建过程是相对于项目

我的构建过程使用了很多封闭源代码的第三方实用程序。这些工具生成大量文件,分为三类:我想要的文件、报告和垃圾文件。有时我可以选择其中一个或两个文件的输出目录,但不是全部。其余文件只显示在当前目录或全新的子目录中。大多数这些不需要的文件都没有文档记录。这些实用程序的每个新版本中都会出现新的不需要的文件

是否有办法运行这些实用程序并将所有文件系统操作重定向到某个指定的子目录,在删除其余文件之前,我可以在其中复制出好的文件?我可以切换到一个子目录来运行这些工具,但这会把事情搞砸,因为构建过程是相对于项目的根目录的。(这些工具很难找到正确的文件。)

更新:


我希望得到的答案是,对文件系统使用某种写时复制的方法,这样工具可以在顶层运行,但所有文件都会生成到它们自己的子目录中。如果这不是一个选项,那么我认为下一个最好的办法是改成一个子目录来运行该工具。然后,新的问题变成了如何修复工具的输入,以便工具能够找到正确的源文件?这不是小事。要修复的输入示例包括配置文件中的命令行参数和文件路径。这似乎是一个容易出错且可能难以解决的问题。

为每个实用程序编写一个包装脚本,将
cd
放入相应的目录,然后从那里运行实际的实用程序。将这些包装器脚本保存在“本地”bin目录中,并将此目录首先放在$PATH中

如果工具在执行第三方实用程序时使用完整路径,则此操作将失败

您可以通过命令行在Makefile中指定以下内容:

$ make PATH=foo:$PATH

简短回答:不。如果这些工具必须在项目根目录中运行,那么它们必须在那里运行,如果它们破坏了嵌套,那么它们就是这样做的

回答:也许吧。如果它们真的必须在项目根目录中运行,那么就这样吧,但是可能有一种方法可以自动清理它们的臭气。您事先不知道不需要的文件和目录的名称,但如果您知道需要的文件和目录的名称,您可以将其列入白名单并删除所有其他内容


或者,根据项目和操作系统的具体情况,您可以创建一个临时目录,其中包含指向项目根目录中文件的符号链接;对于第三方工具来说,它看起来就像真正的根目录,但是当工作完成后,您可以挑选出好的文件并删除其余的文件,就像使用普通的临时文件一样。只要工具不尝试在预先存在的子目录中创建文件,这将很好地工作,换句话说,它可能会工作,但没有承诺。

让我们考虑生成生成的一些蜉蝣,在这个例子中,我主要想到ab</p> 示例:依赖项文件
    这方面的一个例子是gcc的**-MD**或**-MDD**标志,它生成依赖文件,帮助make理解自上次构建以来发生的更改。对于开发人员编辑代码来说,是的,这些代码很容易被认为是垃圾代码,但是如果您不想每次运行“make”时都重新生成所有代码,那么它们就非常重要。
    在这种情况下,您可以为对象文件使用不同的目标目录,这会将依赖项文件放在同一目录中。
示例:编译的对象文件
    现在,这个例子可能与您有关,也可能与您无关,但是工具需要许多类似类型的工件生成来“正确”工作。如果您想将其发挥到极致,“.o”文件同样可以被开发人员视为“垃圾”,开发人员试图在一个目录中找到一个混合了“.o”和“.c/.cpp”文件的源文件。
    在这种情况下,您可以使用不同的对象目录,这是一种相当标准的模式,当运行GCC时,您可以执行以下操作
    gcc-c file.c-o../objs/file.o
不,真的,**废话就是废话**
    但是,让我们以**垃圾**的意思为例。在构建之后,您永远不希望看到在构建过程中生成的“类型”文件,它是随机数据或其他数据,并且*必须*在每个构建中重新生成。
    在这种情况下,只需在构建结束时添加一个步骤,在产品成功构建后删除它们。就这么简单。这也是夜间构建中的标准模式,在夜间构建中,中间文件(对象、依赖项等)并不重要,只要构建正确执行,并且您的产品工件通过了通常的最低期望值,子任务没有非零结果,所有目标正确构建,打包成功。
    在构建失败的情况下,清理蜉蝣的下一步不会运行,您可以进入并对构建执行事后检查,以了解原因并修复它。
如果这些建议没有一个与你产生共鸣,我敦促你深入了解你正在使用的工具和你认为的“垃圾”,每一个构建工具或语言都有自己的味道和策略(即蚂蚁、Maven、Sube、Cube、GCC、Flex、java、Perl、Python、SCONES、地震等等)。因此,如果没有额外的信息,可能很难对如何最好地解决您的问题做出很好的解释。 更新:

其他可能的解决方案

工会
    如果您使用Linux来运行构建,那么实现您想要的功能的一种与工具无关的方法是使用[unionfs][1],您可以将目录“堆叠”在彼此的顶部。说你有以下目录是相当聪明的:
    /主页/登录/src/ /生成/登录/输出(年月日)
    mount -t unionfs -o dirs=/build/login/output_YY_MM_DD/=rw:/home/login/src/=ro
    
    
    NIGHTLY_BUILD_DIR=.build/${ARCH}
    USE_OUTPUT_DIR_ENV=NIGHTLY_BUILD_DIR