Makefile:如何建立此条件规则?

问题描述 投票:0回答:1

我有一个文件夹,其中包含几个子项目,这些子项目以子文件夹的形式存在,其中包含所有makefile。用以下语义调用文件夹:X_Y其中X是文件夹的类型(三个字母,例如texrmddat,...),而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中还有其他规则。这应该像是“如果没有其他要求的默认规则”]

makefile
1个回答
0
投票

[相当多的基础结构才能使简单的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,作为读者的练习。

© www.soinside.com 2019 - 2024. All rights reserved.