我设置 make 使用递归 make 构建我的树。所以设置是
A/Makefile a.c
A/B/Makefile a.c
A/B/C/Makefile a.c
如果我make all
从 A/ 层发出命令,那么 make 将沿着树向下构建所有内容,然后再返回。每个 Makefile 都包含一个要构建的文件夹列表。根目录中有一个 common.inc 文件,每个 Makefile 都会读取该文件。
这只是递归 make 的标准布局,并没有什么新东西。很多地方都给出了细节。 这里和这里是例子。
我的问题是:很多时候我想做make all
但只在当前文件夹中构建东西,而不是真正沿着树向下移动,可能是因为我此时想测试当前文件夹中的一些更改。所以我最终编辑了当前文件夹的 Makefile,方法是注释掉SUBDIRS=A B C
下面列出的所有文件夹,或者只为这个文件夹添加新的特殊目标。两者都是令人讨厌的事情,必须继续做。
有没有人有一个递归makefile的想法或一个小例子,它使用一个开关来告诉它在调用时是否应该沿着树向下移动?可能有一种方法可以调用 make 并在命令行传递一些标志,并且该标志用于删除SUBDIRS=A B C .....
列表,因此它仅在当前文件夹级别停止?
只是要清楚。我在 Rules.mk 中使用标准 SUBDIRS,树中的每个 Makefile 都包含它。这是部分。我很久以前从网上复制的
$(SUBDIRS)::
@if test -d $@; then \
set $(EXIT_ON_ERROR); \
echo "cd $@; make $@"; \
cd $@; make $@; \
set +e; \
else \
echo "Skipping non-directory $@..."; \
fi \
$(CLICK_STOPWATCH);
endif
在我写的每个文件夹 Makefile
SUBDIRS = A B C
include Rules.mk
all:: .......
然后我只是写 make all
来建造。如果有一种方法可以make all LOOP=0
在 LOOP 是某个值的情况下传递它或一个选项或一个字符串或其他东西,然后更改上述SUBDIRS
逻辑以检查此值LOOP
并根据该值执行递归生成与否,然后问题已经解决了。LOOP=1
如果命令行中缺少它,则默认可以是 to 。
但我不知道足够的 Make 来编写这种类型的逻辑。