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

Я пытаюсь понять make-файл, и использование динамической цели кажется довольно запутанным. Я не могу понять, как эта динамическая цель вызывается в make-файле.

Я попытался отладить следующее, напечатав команды оболочки (make V = 1), но я не смог очистить свои сомнения. Я вижу, что создаются файлы file / 1, file / 2, file / 3 и file / 4, но я не вижу циклов или нескольких обращений к этой цели. Я также попытался заглянуть в документ https://www.gnu.org/software/make/manual/html_node/Implicit-Rules.html, но также не получил никакой соответствующей информации. Любое объяснение о такой динамической цели и ее выполнении было бы очень полезно.

PROGS= \
    path/to/file/1 \
    path/to/file/2
EXTRA_PROGS= \
    path/to/file/3 \
    path/to/file/4 
GO_BIN_BUILD=$(SOME_COMMAND_TO_BUILD_GO_BINARY)
GO_BIN_BUILD_DEPS=$(SOME_COMMAND_TO_BUILD_GO_DEPENDENCIES)

CTF_INTEGRATION_TESTS=$(foreach root,$(CTF_DIRS),$(root)/$(notdir $(root)).suite)
$(PROGS) $(EXTRA_PROGS) $(CTF_INTEGRATION_TESTS): $(GO_BIN_BUILD_DEPS) #the dynamic target in question.
    $(GO_BIN_BUILD)

1 Ответ

1 голос
/ 12 октября 2019

Я не думаю, что это правило означает то, что вы думаете, оно означает:

$(PROGS) $(EXTRA_PROGS) $(CTF_INTEGRATION_TESTS): $(GO_BIN_BUILD_DEPS)
        $(GO_BIN_BUILD)

Во-первых, make расширит все переменные в первой строке (вторая строка - это рецепт, поэтому это не так. расширяется до тех пор, пока make не захочет построить цель).

В результате вы получите что-то вроде этого:

path/to/file/1 path/to/file/2 path/to/file/3 path/to/file/4 a/a.suite b/b.suite : dep1 dep2 dep3

, где a/a.suite и b/b.suite - это результаты foreach функция (не зная значения переменной CTF_DIRS, я не могу сказать, какими могут быть реальные значения) и dep1, dep2, dep3 - результаты выполнения SOME_COMMAND_TO_BUILD_GO_DEPENDENCIES, которые, как я полагаю,$(shell ...) command.

Это интерпретируется так, как если бы вы объявили индивидуальные правила для каждого из этих файлов с одинаковым рецептом, вот так:

path/to/file/1 : dep1 dep2 dep3
        $(GO_BIN_BUILD)
path/to/file/2 : dep1 dep2 dep3
        $(GO_BIN_BUILD)
path/to/file/3 : dep1 dep2 dep3
        $(GO_BIN_BUILD)
path/to/file/4 : dep1 dep2 dep3
        $(GO_BIN_BUILD)
a/a.suite : dep1 dep2 dep3
        $(GO_BIN_BUILD)
b/b.suite : dep1 dep2 dep3
        $(GO_BIN_BUILD)
...