Вы, кажется, смущены.Я в замешательстве.
multishot_timer: TOPLEVEL := $(MULITSHOT_TIMER_TOPLEVEL)
Это целевая переменная .${TOPLEVEL}
будет иметь значение multishot_timer_top.cpp
только тогда, когда make расширяет рецепт для multishot_timer
или рецепты для любого из его предварительных условий .Это не тот случай, когда make расширяет эту строку:
$(ALLTARGETS): $(TOPLEVEL) $(VERILOG_FILES)
Исправить?Просто сделайте TOPLEVEL
обычной глобальной переменной.
TOPLEVEL := $(MULITSHOT_TIMER_TOPLEVEL)
Метинкс, хотя у вас есть более крупный шаблон, о котором вы нам не говорите.
Редактировать
ОК.Две вещи для управления.
Зависимости
У цели может быть много линий зависимости, но только у одной из них может быть рецепт.
multishot_timer: common/multishot_timer_tb.v common/multishot_timer.v
incrementer: common/incrementer.v
multishot_timer incrementer:
${VERILATOR} ${COMMONPREPARAMS} -cc $^ --exe ${TOPLEVEL} -o $@
Изменение рецепта в зависимости отtarget
Здесь много вариантов.Вот предложение для рассматриваемой проблемы:
В основном ${TOPLEVEL}
отличается в зависимости от того, $@
равен multishot_timer
или incrementer
.
TOPLEVEL<multishot_timer> := multishot_timer_top.cpp
TOPLEVEL<incrementer> := src/incrementer_top.cpp
TOPLEVEL = ${TOPLEVEL<$@>}
Хорошо.Вероятно, не стоит определять TOPLEVEL
(обратите внимание, что =
, важно, чтобы это была ленивая переменная), и просто используйте ${TOPLEVEL<$@>}
непосредственно в рецепте.
Для дополнительных очков: список целей
Получите все имена переменных в форме TOPLEVEL<%>
и удалите префикс TOPLEVEL<
и суффикс >
.
ALLTARGETS := $(patsubst TOPLEVEL<%>,%,$(filter TOPLEVEL<%>,${.VARIABLES}))
(Обратите внимание, как я резервирую ${…}
для переменных, и$(…)
для функций. Я считаю, что это помогает. YMMV.)