在先决条件之前制造目标

时间:2013-03-05 21:53:03

标签: makefile gnu-make

我知道以前曾经问过,但请耐心等待。 run_test是我想要制作的文件的名称。我更喜欢调用'make run_test'。我希望每次调用make run_test时都会调用prereq的makefile。但我不希望调用prereq的make来强制run_test重建。

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。

这个问题是我总是调用rebuilt_test.sh,我认为这是因为执行了run_test的一个依赖项(因为它是PHONY)。

我已将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即'make run_test'。

2 个答案:

答案 0 :(得分:0)

如果您愿意不可移植,GNU make支持仅限订单的先决条件(请参阅GNU制作手册),它完全符合您的要求:

run_test: | build_prereq

build_prereq:
        $(MAKE) -C prereq_dir

(注意总是在调用子品牌时使用$(MAKE),从不make

答案 1 :(得分:0)

准确支持你想要的东西。

.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来构建run_test

  1. 为了确保prereq_dir/prereq_ts是最新的,它首先运行 build_prereq的食谱。
  2. 接下来,它运行prereq_dir/prereq_ts的配方(什么都不做 - 看到;)。
  3. 现在它会检查prereq_dir/prereq_ts的时间戳,以确定run_test是否已过期。
  4. 完美。