Использовать make-файл верхнего уровня в подкаталогах

У меня есть проект с такой структурой каталогов:

╷ /
├ Makefile
├┐ dir1/
│├ foo.in
│└ foo.out
├┐ dir2/
┊┊

и Makefile содержит правила для всех файлов в проекте, например

dir1/%.out: dir1/%.in
    gen_out $< $@

Если я в каталоге верхнего уровня, я могу запустить make dir1/foo.out просто хорошо.

Вопрос в том, каков самый элегантный способ вызова make foo.out внутри dir1 имеет такой же эффект?

3 ответа

Ваш выбор ограничен. Вы можете использовать -f ../Makefile флаг на make командной строки, может быть, написав сценарий оболочки вокруг make это определит текущее местоположение и вызовет его с соответствующими флагами в зависимости от того, где вы находитесь.

Вы можете установить MAKEFILES Переменная окружения, содержащая полное имя make-файла.

Вы можете создать маленький мини-make-файл в каждом каталоге, который ничего не делает, кроме повторного вызова $(MAKE) с правильным make-файлом верхнего уровня.

Вы можете сделать это легко с makepp. Просто переименуйте ваш Makefile в RootMakeppfile. Он будет загружен первым, где бы вы ни находились в своем дереве.

В отличие от традиционных make, makepp не нужно делать рекурсивные сборки. Таким образом, вы также можете поместить Makefile в каждый каталог, и makepp загрузит все нужные вам файлы в один процесс. Таким образом, он имеет единое представление о вашем проекте в целом и может обнаруживать и отслеживать все зависимости.

Попробуй это:

cd dir1 && make -f../Makefile foo.out
Другие вопросы по тегам