Makefile: Как построить это условное правило? - PullRequest
0 голосов
/ 10 марта 2020

У меня есть папка с несколькими подпроектами в виде подпапок со всеми make-файлами в них. Папки называются со следующим семантием c: 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 должно выдать ошибку.

Как я могу это сделать? Обратите внимание, что для других папок и файлов в make-файле есть другие правила. это должно быть похоже на «правило по умолчанию, если больше ничего не применяется»

1 Ответ

0 голосов
/ 11 марта 2020

Требуется немало инфраструктуры, чтобы получить make, чтобы делать ровно все, что вы хотите, особенно если список реальных подкаталогов, которым нужны псевдонимы, неизвестен, особенно если у вас еще нет вспомогательных правил. для подкаталогов.

Однако в BSD Make это просто, поскольку вся инфраструктура предоставляется для вас. Вот пример создания целей с простыми именами целей на основе полных имен подкаталогов для BSD Make (с основной частью, являющейся определением ${SUBDIR} и последней маленькой .for l oop:

#!/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 в качестве упражнения для читателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...