Я пишу компиляцию 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
в правильном порядке для данного модуля. Я надеюсь, что это проясняет.
В настоящее время я объединяю файл в правильном порядке, который является одним из решений, упомянутых ниже. Мне было интересно, есть ли какая-нибудь другая магия создания, которую я мог бы применить.