Как я могу получить зависимости цели в рекурсивном make-файле? - PullRequest
0 голосов
/ 23 марта 2019

Когда проект зависит от какого-либо другого проекта, который имеет свой собственный make-файл, используется рекурсивное make следующим образом:

LIBDIR := path/to/lib
LIBNAME := library.a
LIBPATH := $(LIBDIR)/$(LIBNAME)

$(LIBPATH):
        $(MAKE) -C $(LIBDIR) $(LIBNAME)

Однако очевидная проблема с этим заключается в том, что make не может определить зависимости$(LIBPATH) потому что он определен в рекурсивном make-файле в $(LIBDIR).

В настоящее время я использую цель .PHONY, чтобы принудительно проверить, требуется ли перестройка подпроекта:

$(LIBPATH): always_build
        $(MAKE) -C $(LIBDIR) $(LIBNAME)

.PHONY: always_build

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

Есть лиспособ получить зависимости из подфайла make, чтобы я мог добавить их как зависимости $(LIBPATH), чтобы подфайл вызывался только тогда, когда его действительно нужно вызывать?

1 Ответ

1 голос
/ 23 марта 2019

Если вы имеете в виду, автоматизированным способом, то нет. Даже если бы они были, это не имело бы никакого смысла.

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

Далекий от того, чтобы быть БОЛЕЕ эффективным, вы фактически выполняете в три раза больше работы!

В рекурсивном сценарии сборки ваш текущий метод делегирования устаревших вычислений подмодулю - лучшее, что вы можете сделать.

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

В конечном счете вы не можете знать, что ваш проект полностью обновлен, не проверяя, что он полностью обновлен ... что означает проверку всех отношений зависимости.

...