Запись зависимостей в файл с помощью Make - PullRequest
0 голосов
/ 08 октября 2019

Я пишу компиляцию Makefile для Verilog (не важно, если вы не знакомы с ней). Команда компилятора может принимать либо блоки компиляции, либо плоский файл, в котором блоки компиляции находятся «по порядку». В последнем случае я хотел бы написать правило, которое будет выводить файл с зависимостями в правильном порядке.

Давайте предположим простой файл сборки ниже:

a.output:
  <a.files>

b.output: a.output
  <b.files>

c.output: d.output
  <c.files>

d.output: d.input
  <d.files>

Мне бы хотелось, чтобы файл содержал:

a.files
b.files
d.files
c.files

У меня была идея, что в рецепте должна быть переменная, к которой можно добавить, например

a.output: 
  MY_FILES += <a.files>

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

Кроме того, я бы хотел, чтобы Makefile был параллельным, но, очевидно, он не будет работать для этой цели. Как я могу указать отключение параллельного выполнения для этой конкретной цели или набора целей?

РЕДАКТИРОВАТЬ 8 октября 2019

Чтобы сделать его проще для человека, не знакомого с синтаксисом Makeчтобы написать зависимости, я в основном позволил им записывать свои намерения, используя переменные:

MODULES += module_a
module_a.prerequisites = module_b module c
module_a.other_var = some_string_a

MODULES += module_b
module_b.prerequisites = 
module_b.other_var = some_string_b

Затем я использую директиву define для генерации правил, необходимых для компиляции (я был вдохновлен thisпример ). Это означает, что у меня есть гибкость в том, что я могу создать. Итак, в предыдущем примере <a.output> фактически является целью для module_a. Это может быть цель PHONY. <a.files> фактически представляет переменные (prerequisites и other_var в примере).

Извините за недопонимание, но я пытаюсь выписать все целевые и зависимые module_x.other_var в правильном порядке для данного модуля. Я надеюсь, что это проясняет.

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

1 Ответ

0 голосов
/ 08 октября 2019

В простейшей форме вы можете просто отобразить имена в файле

OUTPUT_FILE = output.file

a.output:
    echo "<a.files>" > $(OUTPUT_FILE)

b.output: a.output
    echo "<b.files>" >> $(OUTPUT_FILE)

c.output: d.output
    echo "<c.files>" >> $(OUTPUT_FILE)

d.output: d.input
    echo "<d.files>" >> $(OUTPUT_FILE)

Если эти файлы являются предварительными условиями, то вы можете распечатать каждую депо или цель, используя auto vars:

Печать цели / цели

d.output: d.input
    echo "$@" >> $(OUTPUT_FILE)

печать первой предпосылки

d.output: d.input
    echo "$<" >> $(OUTPUT_FILE)

печать всех предпосылок

d.output: d.input
    echo "$^" >> $(OUTPUT_FILE)

обновление для параллельной сборки

Не очень, конечно, это можно улучшить, но это будет безопасно для параллельных сборок. Однако, как я уже сказал, я думаю, что один только метод echo работает нормально.

Также обратите внимание, что это не проверено, поэтому рассматривайте его как псевдокод

OUTPUT_FILE = output.file
OUTPUT_FILE_A = output.file.a
OUTPUT_FILE_B = output.file.b
OUTPUT_FILE_C = output.file.c
OUTPUT_FILE_D = output.file.d
OUTPUT_FILES =  $(OUTPUT_FILE_A)
OUTPUT_FILES += $(OUTPUT_FILE_B)
OUTPUT_FILES += $(OUTPUT_FILE_C)
OUTPUT_FILES += $(OUTPUT_FILE_D)

final: a.output b.output c.output d.output
    echo "" > $(OUTPUT_FILE)
    for file in "$(OUTPUT_FILES)" ; do \
        cat $$file >> $(OUTPUT_FILE) ; \
    done

a.output:
    echo "<a.files>" > $(OUTPUT_FILE_A)

b.output: a.output
    echo "<b.files>" > $(OUTPUT_FILE_B)

c.output: d.output
    echo "<c.files>" > $(OUTPUT_FILE_C)

d.output: d.input
    echo "<d.files>" > $(OUTPUT_FILE_D)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...