我有一个文件夹,其中包含几个子项目,这些子项目以子文件夹的形式存在,其中包含所有makefile。用以下语义调用文件夹:X_Y
其中X
是文件夹的类型(三个字母,例如tex
,rmd
,dat
,...),而Y
只是唯一的标识符,由字母和数字组成(例如mymodel2
),使文件夹列表如下所示:
mod_x1
mod_x2
tex_x3
rmd_x4
对于每个文件夹,我希望将呼叫make Y
扩展到make -C X_Y
。由于文件夹名称的第二部分是唯一标识符,因此应该没有歧义。例如,如果仅存在4个示例文件夹,
make x1
-> make -C mod_x1/
make x2
-> make -C mod_x2/
make x3
-> make -C tex_x3/
make x4
-> make -C rmd_x4/
make x5
应该产生错误。我该怎么做?请注意,对于其他文件夹和文件,makefile中还有其他规则。这应该像是“如果没有其他要求的默认规则”]
[相当多的基础结构才能使简单的make
精确地完成您想要的所有事情,尤其是在不知道需要别名的实际子目录列表的情况下,尤其是如果您尚未具有用于帮助的规则子目录。
但是在BSD中,因为为您提供了所有基础结构,所以很容易。这是一个基于BSD Make的完整子目录名称创建具有简单目标名称的目标的示例(主要部分是${SUBDIR}
的定义和最后一个小.for
循环:
#!/usr/bin/make -f
#
# provide aliases for subdirectory targets
#
SUBDIR= mod_x1 mod_x2 tex_x3 rmd_x4
.include <bsd.own.mk>
.if !defined(MAKEDIRTARGET)
# Only NetBSD has MAKEDIRTARGET by default...
MAKEDIRTARGETENV?=
MAKEDIRTARGET=\
@_makedirtarget() { \
dir="$$1"; shift; \
target="$$1"; shift; \
case "$${dir}" in \
/*) this="$${dir}/"; \
real="$${dir}" ;; \
.) this="${_THISDIR_}"; \
real="${.CURDIR}" ;; \
*) this="${_THISDIR_}$${dir}/"; \
real="${.CURDIR}/$${dir}" ;; \
esac; \
show=$${this:-.}; \
echo "$${target} ===> $${show%/}$${1:+ (with: $$@)}"; \
cd "$${real}" \
&& ${MAKEDIRTARGETENV} ${MAKE} _THISDIR_="$${this}" "$$@" $${target}; \
}; \
_makedirtarget
.endif
.for dir in ${SUBDIR}
${dir:C/^.*_//}: ${dir} .PHONY
${MAKEDIRTARGET} ${dir} all
.endfor
.include <bsd.subdir.mk>
我将把它翻译成您喜欢的make
,作为读者的练习。