【问题标题】:How to write a (GNU)makefile with output different than the target?如何编写输出与目标不同的(GNU)makefile?
【发布时间】:2014-02-27 15:48:34
【问题描述】:

我有一个脚本,它接受一个文件名并生成多个具有相同名称但不同扩展名的文件。我想写一个makefile,它依赖于以不同扩展名生成的文件,但只指定文件名。我有一个虚拟的例子来解释它。

test_output:test_input
    genereate.py -i $^ -o $@

上述makefile 依赖会生成多个文件名相同但扩展名不同的文件,但不会生成实际的目标。例如,它生成

test_output.a test_output.b test_output.c

上面写的方式不是有效的方式,因为没有实际的目标,所以即使输出已经存在,它也会运行它。

我将如何指定 makefile 以便它读取 target(test_output) 但实际上取决于它生成的输出文件,如 test_output.a 或任何其他文件。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    如果您使用 GNU make(您没有说),您可以使用模式规则告诉 make 一个基于单个词干生成多个输出的规则。所以例如你可以写:

    %.a %.b %.c : test_input
            genereate.py -i $^ -o $*
    

    (如果输入文件名与具有相同词干的输出文件名相关,则效果会更好,但上述方法将有效,尽管您必须为每个输入文件编写不同的文件)。

    通常这就是您想要的,因此需要这些输出的其他目标可以依赖它们。

    如果你真的想要一个没有任何扩展的目标,只需创建它:

    test_output : test_output.a test_output.b test_output.c
    
    %.a %.b %.c : test_input
            genereate.py -i $^ -o $*
    

    【讨论】:

    • 对不起,我分心了。如果 generate.py 输出文件中语法的数量和类型每次都不同,这意味着test_output.z 也可能存在。
    • 我不知道你所说的“每次”是什么意思。每次运行make?对于不同的test_input 文件?
    • @MadScientist.抱歉声明令人困惑。我的意思是每次我运行generate.py 时,它都会生成不同数量的文件(基于输入文件大小),名称相同但扩展名不同。
    • 我还是不明白。如果你不能写下将从输入文件生成的文件列表,那么 make 就无法知道它们是什么。就像在第一个示例中一样,您必须只使用通用目标。如果您想避免每次都重新生成它,只需让您的规则使用touch $@ 或类似的规则来创建test_output 文件,这样make 下次就不会重新运行它了。
    • 是的,这就是我现在设置的。它工作正常,但我认为还有另一种解决方案,如果有类似的东西,它可能更像 makefile。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多