Один Makefile, используемый во многих подкаталогах - PullRequest
0 голосов
/ 19 февраля 2011

Я ищу написать один make-файл, который сам вызывает цель во всех подкаталогах текущего каталога.Я пришел к этому в качестве отправной точки:

SUBDIRS := $(shell find . -maxdepth 1 -type d | sed -e 's/^/\"/;s/$$/\"/')

all:
        @for d in $(SUBDIRS); do \
                ($(MAKE) -f "../$(lastword $(MAKEFILE_LIST))" -C "$$d" gallery.html); \
        done

gallery.html:
        echo "Making gallery\n";
  1. Это правильный подход к проблеме?
  2. Это действительно самый «чистый» способ обнаружить директориии правильно их процитировать?

Я достаточно счастлив, используя расширения GNU make.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2011

Такая рекурсия имеет смысл, только если gallery.html имеет некоторые сложные локальные предпосылки, и даже тогда, вероятно, это не лучший способ.И эта чувствительность к имени make-файла - очень плохой признак.Но если это то, что вы хотите, я предлагаю следующее изменение:

.PHONY: $(SUBDIRS)
all: $(SUBDIRS)

$(SUBDIRS):
    $(MAKE) -f "../$(lastword $(MAKEFILE_LIST))" -C $@ gallery.html
2 голосов
/ 19 февраля 2011

То, что у вас есть, это, по сути, запутанный сценарий оболочки - вы не используете никаких функций самого make.

Содержат ли имена ваших подкаталогов пробельные символы?Если это так, то make, возможно, просто не подходящий инструмент для работы: он действительно хочет работать с разделенными пробелами списками слов и не имеет понятия цитирования, которое могло бы помочь ему справляться с пробелами в путях.

Если имена подкаталогов содержат пробелы, я бы разделил их на отдельный сценарий оболочки и make-файл, например:

#/bin/sh
find . -maxdepth 1 -type d | while read d; do
    make -f `dirname $0`/Makefile -C "$d" gallery.html
done

и

gallery.html:
        echo "Making gallery\n";

(с учетомчто, если в ваших подкаталогах есть больше путей с пробелами, make все равно может быть плохим выбором)

Если имена подкаталогов не содержат пробелов, то все можно сделать намного проще, и вы также можете избежатьрекурсивный вызов make (google "рекурсивный make считается вредным" по причинам, почему):

SUBDIRS := $(wildcard */)

all: $(SUBDIRS:%=%/gallery.html)

%/gallery.html:
    cd $* && echo "Making gallery in `pwd`\n"
...