0

我知道以前有人问过这个问题,但请多多包涵。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 更新(如果需要,这将在 build_prereq 的 make 调用中发生),它会运行 rebuild_test.sh。

有没有更合适的方法来做到这一点。我不想创建额外的目标,因为这不允许直接调用 make 即“make run_test”。

4

2 回答 2

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过期。

完美的。

于 2013-03-06T16:35:25.853 回答
0

如果您愿意成为不可移植的,GNU make 支持仅订购的先决条件(请参阅 GNU make 手册),这正是您想要的:

run_test: | build_prereq

build_prereq:
        $(MAKE) -C prereq_dir

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

于 2013-03-06T13:02:09.207 回答