GNU Make: как я могу установить две или более цели зависимости в одном блоке define..endef? - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь установить несколько зависимостей в одном блоке GNU Make define..endef, но мне совсем не везет. Если я урежу проблему до базовой c формы, я нацеливаюсь на окончательный make-файл, который выглядит следующим образом:

all:    CPU1    CPU2

CPU1: Build_CPU1

CPU2: Build_CPU2

Build_CPU1:
    @echo Building CPU #1

Build_CPU2:
    @echo Building CPU #2

Проблема возникает, если я пытаюсь поместить две промежуточные зависимости внутри блок define..endef:

all:    CPU1    CPU2

define DoBuild =
CPU1:   Build_CPU1



CPU2:   Build_CPU2



endef

$(call DoBuild)

Build_CPU1:
    @echo Building CPU #1

Build_CPU2:
    @echo Building CPU #2

Если после каждой из двух строк: -dependency (то есть «CPU1: Build_CPU1» и «CPU2: Build_CPU2») в define..endef поставить пустую новую строку block, GNU Make жалуется на "*** целевой шаблон не содержит '%'". Но если я добавлю пробел-затем-новую строку после двух зависимостей, это сообщение об ошибке исчезнет.

Однако, следуя двум строкам зависимости с пробелом-затем-новой строкой, GNU Make жалуется на "** * несколько целевых шаблонов. "

Я уверен, что здесь происходит то, что GNU Make объединяет все строки блока define..endef в одну строку: и, конечно, вы можете ' в одной строке должно быть несколько двоеточий.

Согласно руководству GNU Make 6.8 («Определение многострочных переменных»), вы должны иметь возможность принудительно вводить новую строку внутри блока define..endef, используя два переводы строк. Тем не менее, проблема в этом заключается в том, что это в конечном итоге определяет одну переменную, и поэтому анализируется, как если бы это была одна строка, даже если она содержит символы новой строки. Вот почему (я думаю), почему он объединяет две зависимости в одну строку (помещая оба двоеточия в одну строку), так что я в основном не в идеях. : - (

Есть ли способ убедить GNU Make определить две или более целей зависимостей в одном блоке define..endef?

PS: я использую GNU Make 4.2.1

1 Ответ

1 голос
/ 05 февраля 2020

Ниже приведен рабочий пример:

all: CPU1 CPU2

define DoBuild # No equal sign is needed.
CPU1: Build_CPU1
    @echo $$@
CPU2: Build_CPU2
    @echo $$@
endef

$(eval $(call DoBuild)) # Use eval.

Build_CPU1:
    @echo $@

Build_CPU2:
    @echo $@

Обратите внимание, что call возвращает строку. Чтобы сделать эту строку частью make-файла eval.

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