Makefile make:在不重建依赖项的情况下触发

Makefile make:在不重建依赖项的情况下触发,makefile,Makefile,基本上我有常用的Makefile构造: target: dependency1 dependency2 dependency3 runtargetscript.sh 但是,在这种情况下,目标只需要其中一个依赖项,某些依赖项可能无法构建。(因此我不能只构建所有依赖项) 当其中一个依赖项发生更改/创建时(即正常行为),是否可以告知make触发“目标”但不试图重建任何缺失的依赖项?假设你的规则体没有做任何特殊的事情,取决于哪些依赖项比目标更新,你可以使用 -W/COD>标志来指示它将某些

基本上我有常用的Makefile构造:

target: dependency1 dependency2 dependency3
      runtargetscript.sh
但是,在这种情况下,目标只需要其中一个依赖项,某些依赖项可能无法构建。(因此我不能只构建所有依赖项)


当其中一个依赖项发生更改/创建时(即正常行为),是否可以告知make触发“目标”但不试图重建任何缺失的依赖项?

假设你的规则体没有做任何特殊的事情,取决于哪些依赖项比目标更新,你可以使用<代码> -W/COD>标志来指示它将某些目标视为新的(因此不需要建立)。 因此,对于给定的示例,假设您可以(并且希望)构建
dependency2
,但不构建
dependency1
dependency3
,您将运行:

make -W dependency1 -W dependency3 target
编辑:正如注释中所指出的,当
dependency2
不比
target
新时,此功能无法正常工作,因为仍将生成
target

在这种情况下,我认为唯一的解决方案(考虑到下面的评论)是使用以下内容:

DEPENDENCY_BIN := $(or $(wildcard /path/to/mysql),$(wildcard /path/to/sqlite3),/path/that/does/not/exist)

target: $(DEPENDENCY_BIN) dependency2

使用GNU make,您可以使用shell转义动态构建依赖项,仅当依赖项已经存在时才添加它们:

if_exist = $(shell if [ -e $(1) ]; then echo $(1); fi)

target: $(call if_exist,dependency1) $(call if_exist,dependency2) $(call if_exist,dependency3)
        runtargetscript.sh
如果目标不存在,或者如果它比读取makefile时确实存在的任何依赖项都旧,那么将运行脚本,但如果它们当时不存在,则不会尝试构建它们


请注意这里的重要警告——如果文件不存在,但其他一些不相关的规则运行创建它们的操作,它将不会重建目标,除非您再次运行
make target

No,这不是因为(1)缺少依赖项会导致失败,(2)在所有情况下都会触发目标,即使没有依赖关系changed@Robby751)如果缺少依赖项意味着目标无法构建,那么我根本不知道如何才能得到想要的。2) 不,只有当
dependency2
比我的命令下的
target
更新时才会触发。1)安装需要MySQL二进制或Sqlite3二进制,但不是两者都需要-并且项目应该可以很好地编译,只要至少有一个可用2)从manpage:-W file,--what if=file,--new file=file,--假设new=file,假设目标文件刚刚被修改。当与-n标志一起使用时,这将显示如果修改该文件会发生什么情况。如果没有-n,它几乎与在运行make之前在给定文件上运行touch命令相同,只是修改时间仅在make的想象中更改。--结束---这意味着目标将始终被触发,因为-W dependency1将导致dependency1比目标更新。。。对。我没有正确地思考第二点。我道歉。