Makefile 先发制人
我知道以前有人问过这个问题,但请容忍我。run_test是我要生成的文件的名称。我更喜欢调用为“make run_test”。我希望每次调用make run_test时都调用prereq的makefile。但是我不想调用prereq的make来强制重新构建run_测试Makefile 先发制人,makefile,gnu-make,Makefile,Gnu Make,我知道以前有人问过这个问题,但请容忍我。run_test是我要生成的文件的名称。我更喜欢调用为“make run_test”。我希望每次调用make run_test时都调用prereq的makefile。但是我不想调用prereq的make来强制重新构建run_测试 run_test: build_prereq prereq_dir/prereq_ts rebuild_test.sh .PHONY: build_prereq build_prereq: make -C prereq
run_test: build_prereq prereq_dir/prereq_ts
rebuild_test.sh
.PHONY: build_prereq
build_prereq:
make -C prereq_dir
如果make-C prereq(prereq_dir/makefile)检测到prereq的依赖项是旧的,并且需要重新生成prereq,则会更新prereq_dir/prereq_ts
run_test: build_prereq prereq_dir/prereq_ts
rebuild_test.sh
.PHONY: build_prereq
build_prereq:
make -C prereq_dir
这样做的问题是总是调用rebuilded_test.sh,我假设这是因为执行了run_test的一个依赖项(因为它是假的)
我已通过将run_test更改为:
run_test:: build_prereq
run_test:: prereq_dir/prereq_ts
rebuild_test.sh
.PHONY: build_prereq
build_prereq:
make -C prereq_dir
这是一个好的解决方案吗?它首先运行build_prereq,然后在prereq_dir/prereq_ts更新时运行rebuild_test.sh(如果需要,这将发生在build_prereq的make调用中)
有没有更合适的方法。我不想创建其他目标,因为这不允许直接调用make ie“make run_test”。如果您愿意成为不可移植的,GNU make只支持订购的先决条件(请参阅GNU make手册),这些先决条件正是您想要的:
run_test: | build_prereq
build_prereq:
$(MAKE) -C prereq_dir
(注意调用子MAKE时始终使用
$(MAKE)
,切勿使用MAKE
)MAKE支持您想要的内容
.PHONY: build_prereq
build_prereq:
${MAKE} -C prereq_dir
prereq_dir/prereq_ts: build_prereq ;
run_test: prereq_dir/prereq_ts
rebuild_test.sh
因此,您要求make构建运行测试
为确保prereq\u dir/prereq\u ts
是最新的,它首先运行
build\u prereq
的配方
接下来,它运行prereq\u dir/prereq\u ts
(它没有看到;
)
现在它检查prereq\u dir/prereq\u ts
的时间戳,以确定run\u test
是否过期
很好。这有点不清楚。假设prereq\u dir/prereq\u ts
没有改变,但是prereq
的先决条件已经改变;是否应该让run\u test
执行任何操作?否,不应该重建run\u test。如果prereq的先决条件发生变化,那么prereq_dir/prereq_ts将被触发,这将导致重新生成运行测试。不,当prereq_dir/prereq_ts
被(i)在build_prereq
运行时可能被触发,并且(ii)是run_test
的正常预请求时,这不起作用。