2013-09-18 3 views
0

Я пытаюсь отлаживать следующий код:ошибки при использовании Makefile, целей и%

TESTS=$(shell cat yoursourcefile) 
all: $(TESTS) 

%: compile_design 
compile [email protected]_tb.vhd >> log_file.log 
simulate [email protected] 

Я получил эту ошибку:

makefile_tb.vhd >> log_file.log 

, как будто Makefile является мишень

этого ошибка исчезает, когда я добавляю символ или больше до%:

T%: compile_design 
compile [email protected]_tb.vhd >> log_file.log 
simulate [email protected] 

Это работает, но подразумевает, что все мои цели начинаются с «Т», что не всегда так. Мои вопросы: Что такое функция% здесь? Как избавиться от этой ошибки?

Как было предложено, я добавил

makefile: ; [email protected]: 

в конце, так что у меня сейчас:

TESTS=$(shell cat yoursourcefile) 
all: $(TESTS) 

%: compile_design 
compile [email protected]_tb.vhd >> log_file.log 
simulate [email protected] 

makefile: ; [email protected]: 

тогда, когда я делаю:

make all 

я [все] Error2 all_tb.vhd >> log_file.log

, но all_tb.vhd не существует!

ответ

1

Правило %: compile_design является "match-anything" pattern rule. В нем говорится: «Эй, если вы когда-нибудь захотите построить любой файл с любым именем, то вы можете сделать это, выполнив эти команды. О, и, кстати, если у вас есть файл, который вы хотите построить, и он старше, чем файл compile_design, тогда вам нужно его перестроить ». Как правило, вы хотите избежать правил match-anything, но если ваши целевые имена действительно не имеют определенного шаблона, вы не можете.

Когда вы добавляете T перед этим, он сообщает make, что вместо любого файла это правило может создавать только файлы, которые начинаются с T.

Причина make пытается перестроить make-файл, так как GNU make имеет специальную функцию, которая allows it to remake its own makefiles. Поэтому после того, как он прочитает свой файл makefile, он попытается переделать его. Обычно это не действует, потому что нет правила для создания make-файла, но здесь вы добавили правило, которое вы сказали make, может построить что-нибудь. Добавление T сохраняет шаблон от соответствия Makefile, потому что Makefile не начинается с T.

Самые простой для вас сделать, это определить явное правило для Makefile: сделать всегда выбирает явное правило, если оно существует, над неявным правилом, как правило шаблон:

Makefile: ; @: 

Это создает явное правило, которое ничего не делает (: - это встроенная команда оболочки, которая ничего не делает).

+0

Теперь у меня: 'makefile:; $ @: ТЕСТЫ = $ (скорлупа кошка yoursourcefile) всего: $ (ИСПЫТАНИЯ) %: compile_design компиляции [email protected]_tb.vhd >> log_file.log симулировать $ @ ' и я получил: ' all_tb.vhd >> log_file.log' , но all_tb.vhd не существует ** это переименование цели? ** – user2725571

+0

Я не могу читать make-файлы в комментариях, потому что все новые строки потеряны. Однако по умолчанию (если вы не указали иначе в командной строке) make создает только первую цель в make-файле (и все ее предпосылки, конечно). Если вы добавили правило для 'makefile' в качестве первого, то это единственное, что сделает make, если вы не запустите' make all'. Поместите правило make-файла в конец make-файла, а не в начало. – MadScientist

Смежные вопросы