Makefile 先发制人

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是我要生成的文件的名称。我更喜欢调用为“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_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
    的正常预请求时,这不起作用。