makefile один вызов компиляции для нескольких источников без заголовков - PullRequest
0 голосов
/ 28 августа 2018

Для компиляций verilog выгодно компилировать много файлов verilog одновременно - и они компилируются в базу данных (без файлов .o). Я обнаружил, что могу создать правило вроде:

SOURCES := src1.v src2.v src3.v
verilog.timestamp: $(SOURCES) hdr.vh
    xmvlog $(if $(filter-out $(SOURCES),$(?)),$(SOURCES),$(filter $(?),$(SOURCES)))

Это позволяет перекомпилировать только устаревшие файлы (или все они, когда заголовок устарел). Это кажется довольно уродливым - есть ли лучший способ выполнить эту задачу?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Как предполагает Бета, автоматическая переменная $? может быть полезна в этом случае, потому что она расширяется как список всех предпосылок, которые новее, чем цель (кроме предпосылок только для заказа). Но нам все еще нужно решить другую проблему: ваш компилятор 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. Если нет, это остановится. Иначе, это будет:

  1. Создайте устаревшие файлы тегов, только они, возможно параллельно (этот Makefile безопасен параллельно), просто прикоснувшись к ним.
  2. Сборка 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

Примечания:

  1. $(TAGS): .%.tag: %.v hdr.vh - это правило статического шаблона
  2. Конечно, если вы предпочитаете отделять файлы тегов от вашего исходного дерева, вы можете сохранить их в выделенном подкаталоге:

    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)
    
  3. В последней версии | $(TAGSDIR) является обязательным условием только для заказа .

0 голосов
/ 28 августа 2018

Я не знаю, лучше ли это, но ... вы можете touch источники, когда заголовок был изменен:

SOURCES := src1.v src2.v src3.v

verilog.timestamp: $(SOURCES) | hdr.vh
    xmvlog $?

$(SOURCES): hdr.vh
    @touch $@

(Обратите внимание, что $? не включает предпосылки только для заказа .)

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