我想知道是否可以将makefile目标的依赖项作为参数传递。如果可能的话,该怎么做。

例如,假设我有一个基于多个依赖关系构建的应用程序

target_full : dep1.o dep2.o dep3.o
    commands

dep1.o : file1 file2
    commands

dep2.o : file3 file4
    commands

dep3.o : file5 file6
    commands

我希望能够将已经编译的依赖项作为参数传递。

因此,如果我运行make all,它将从文件生成dep1.o dep2.o dep3.o,但是如果我运行make all dep1-file=myDep.o,它将仅生成dep2.o和dep3.o,并使用给定的依赖性,而无需从file1和file2重新编译dep1.o。

实际上,我根本不希望第一个依赖目标被调用

我想像的东西
ifndef(dep1-file)
    dep1=dep1.o
else
    dep1=${dep1-file}
endif

target_full : ${dep1} dep2.o dep3.o
    commands

${dep1} : file1 file2
    commands

dep2.o : file3 file4
    commands

dep3.o : file5 file6
    commands

但是,请继续从文件1和文件2编译dep1.o。也许是因为修改日期,但我也希望不要将其计入在内,因为我不在乎file1和file2是否比我的自定义依赖项更新。

编辑:我应该明确指出我有一个可行的解决方案,但是它确实很难看,所以我对它不完全满意,我认为存在一种更好的方法。

但是,我将其粘贴在此处,以方便您理解我的问题。
ifndef dep1-file
    dep1=dep1.o
else
    dep1=${dep1-file}
endif

target_full : ${dep1} dep2.o dep3.o
    commands

ifndef dep1-file
${dep1} : file1 file2
    commands
endif

dep2.o : file3 file4
    commands

dep3.o : file5 file6
    commands

我很高兴能为您解决这个问题提供帮助。
提前致谢

最佳答案

您可以使用变量的命令行覆盖文件功能:

var-dep = dep1.o
target-full : $(var-dep) dep2.o dep3.o

并在命令行上简单地覆盖它:
make var-dep=myother.o

关于c - Makefile : Pass a target's dependency as an argument,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47139080/

10-09 06:06