Как предполагает Бета, автоматическая переменная $?
может быть полезна в этом случае, потому что она расширяется как список всех предпосылок, которые новее, чем цель (кроме предпосылок только для заказа). Но нам все еще нужно решить другую проблему: ваш компилятор Verilog не создает один единственный двоичный файл на один скомпилированный источник Verilog. Более того, вы хотите перекомпилировать исходный файл Verilog foo.v
, если foo.v
или заголовочный файл hdr.vh
был изменен с момента последней компиляции foo.v
. Существует чистый способ создания, который заключается в использовании пустых файлов в качестве маркеров, по одному на исходный файл Verilog и один для всего проекта:
SOURCES := $(wildcard *.v)
TAGS := $(patsubst %.v,.%.tag,$(SOURCES))
all: verilog.timestamp
.PHONY: all
$(TAGS): .%.tag: %.v hdr.vh
touch $@
verilog.timestamp: $(TAGS)
xmvlog $(patsubst .%.tag,%.v,$?)
touch $@
clean::
rm -f $(TAGS) verilog.timestamp
Пояснения: чтобы собрать all
(цель по умолчанию и фальшивая цель), make попытается собрать verilog.timestamp
. Таким образом, он будет искать, устарел ли какой-либо из $(TAGS)
, то есть старше соответствующего исходного файла Verilog или заголовочного файла hdr.vh
. Если нет, это остановится. Иначе, это будет:
- Создайте устаревшие файлы тегов, только они, возможно параллельно (этот Makefile безопасен параллельно), просто прикоснувшись к ним.
- Сборка
verilog.timestamp
. При расширении рецепта, перед передачей его в оболочку, make заменит $(patsubst .%.tag,%.v,$?)
на все исходные файлы Verilog, соответствующие файлам тегов, которые были только что перестроены и, следовательно, новее, чем verilog.timestamp
. Наконец, это коснется verilog.timestamp
.
Демонстрация:
$ make clean
rm -f .src3.tag .src2.tag .src1.tag verilog.timestamp
$ make -j8
touch .src3.tag
touch .src2.tag
touch .src1.tag
xmvlog src3.v src2.v src1.v
touch verilog.timestamp
$ make -j8
make: Nothing to be done for 'all'.
$ touch src1.tag
$ make -j8
touch .src1.tag
xmvlog src1.v
touch verilog.timestamp
$ touch hdr.vh
$ make -j8
touch .src3.tag
touch .src2.tag
touch .src1.tag
xmvlog src3.v src2.v src1.v
touch verilog.timestamp
Примечания:
$(TAGS): .%.tag: %.v hdr.vh
- это правило статического шаблона
Конечно, если вы предпочитаете отделять файлы тегов от вашего исходного дерева, вы можете сохранить их в выделенном подкаталоге:
SOURCES := $(wildcard *.v)
TAGSDIR := .tags
TAGS := $(patsubst %.v,$(TAGSDIR)/.%.tag,$(SOURCES))
all: $(TAGSDIR)/verilog.timestamp
.PHONY: all
$(TAGS): $(TAGSDIR)/.%.tag: %.v hdr.vh | $(TAGSDIR)
touch $@
$(TAGSDIR)/verilog.timestamp: $(TAGS) | $(TAGSDIR)
xmvlog $(patsubst $(TAGSDIR)/.%.tag,%.v,$?)
touch $@
$(TAGSDIR):
mkdir -p $@
clean::
rm -rf $(TAGSDIR)
В последней версии | $(TAGSDIR)
является обязательным условием только для заказа .