【发布时间】:2019-10-22 05:57:29
【问题描述】:
我试图弄清楚makefile 如何与make 和make sometarget 命令一起工作。据我所知,makefile 将首先读取整个 makefile,然后它会尝试更新命令中指定的目标。然后如果makefile有include directive,它会读取makefile,然后尝试更新包含文件,如果包含文件更新则重新读取makefile。我的理解适用于 make 命令,但使用 `make single-target' 命令有问题。
也许我对makefile 的理解是错误的,我需要一些建议。
我在 Ubuntu 16.04 上使用 GNU Make 4.1 测试了我的玩具 makefile。
项目树是:
.
├── bar.mk
└── Makefile
0 directories, 2 files
bar.mk 是:
$(warning "Reading from file: bar.mk")
Makefile 是:
include bar.mk
include BUILD.mk
$(warning Finished include)
all: test
touch $@
test:
@echo "target is test"
$(warning new warning)
BUILD.mk: bar.mk
touch $@
.PHONY: clean
clean:
rm -rf all BUILD.mk
当我使用make test 命令时,结果是:
bar.mk:1: "Reading from file: bar.mk"
Makefile:3: Finished include
Makefile:11: new warning
target is test
项目树是:
.
├── bar.mk
├── BUILD.mk
└── Makefile
0 directories, 3 files
不会重读makefile,从bash输出看,也不会执行touch BUILD.mk命令,BUILD.mk文件是怎么创建的?
【问题讨论】:
-
在
BUILD.mk,尝试用touch $@替换echo '$$(warning I am here)' >$@ -
@tripleee 谢谢。我试过你的建议,结果和原来的差不多。看起来像更新
BUILD.mk文件而不打印文件创建命令,那么文件不需要更新,所以它不会重新读取整个Makefile。原理我不懂。 -
我在这两种情况下都得到了更多的输出。演示:ideone.com/Jv8WJE
标签: makefile