我知道这里有很多讨论,为什么不使用递归Makefile。但不是相反。使用这个概念(反向递归(达到可用性的目的。有了这个系统,我只需要一个打开的shell就可以向git
添加新的或修改过的文件,还可以在同一路径中键入make
来重建更改后的源并链接它们。
对我的反向递归Makefile
实现的简短描述。我在这里有以下简化的树:
$ tree
.
├── dir
│ ├── Makefile
│ └── subdir
│ ├── Makefile
│ └── subsubdir
│ └── Makefile
└── Makefile
3 directories, 4 files
根生成文件的内容:
all:
@echo 'Makefile-root: all'
arg1:
@echo 'Makefile-root: arg1'
arg2:
@echo 'Makefile-root: arg2'
.PHONY: all arg1 arg2
RR Makefile:子目录中的所有其他Makefile都有相同的内容:
%::
make -C .. $@
all:
make -C ..
.PHONY: all
当我在subsubdir
:中键入make
时输出
$ make
make -C ..
make[1]: Entering directory '/home/krj/projects/XU-Loader/test/dir/subdir'
make -C ..
make[2]: Entering directory '/home/krj/projects/XU-Loader/test/dir'
make -C ..
make[3]: Entering directory '/home/krj/projects/XU-Loader/test'
Makefile-root: all
make[3]: Leaving directory '/home/krj/projects/XU-Loader/test'
make[2]: Leaving directory '/home/krj/projects/XU-Loader/test/dir'
make[1]: Leaving directory '/home/krj/projects/XU-Loader/test/dir/subdir'
当我在subsubdir
:中键入带参数的make
时输出
$ make arg1
make -C .. arg1
make[1]: Entering directory '/home/krj/projects/XU-Loader/test/dir/subdir'
make -C .. arg1
make[2]: Entering directory '/home/krj/projects/XU-Loader/test/dir'
make -C .. arg1
make[3]: Entering directory '/home/krj/projects/XU-Loader/test'
Makefile-root: arg1
make[3]: Leaving directory '/home/krj/projects/XU-Loader/test'
make[2]: Leaving directory '/home/krj/projects/XU-Loader/test/dir'
make[1]: Leaving directory '/home/krj/projects/XU-Loader/test/dir/subdir'
这可能只是一个表面问题,但如果不使用subsubdir
中的参数--no-print-directory
调用make
,我如何抑制Leaving/Entering
消息?
$ make --no-print-directory
make -C ..
make -C ..
make -C ..
Makefile-root: all
曾尝试在每个RR Makefile中添加MAKEFLAGS += -no-print-directory
,但将递归函数分解为根Makefile。
这是我的一个使用错误。我使用了-no-print-directory
而不是--no-print-directory
,因为我首先在SO上搜索了一个类似的问题,并找到了这个答案。不幸的是,不要研究GNU制造的手册页面。
使用--no-print-directory
,这是有效的,没有任何问题:
MAKEFLAGS += --no-print-directory
%::
make -C .. $@
all:
make -C ..
.PHONY: all