2013-03-05 3 views
0

Я знаю, что это было задано раньше, но, пожалуйста, несите меня. run_test - это имя файла, который я хотел бы сделать. Я предпочитаю использовать команду make run_test. Я хочу, чтобы makefile prereq вызывался каждый раз, когда вызываю make run_test. Но я не хочу, чтобы вызов make proreq заставлял run_test перестраиваться.сделать силу мишень перед превью

run_test: build_prereq prereq_dir/prereq_ts 
    rebuild_test.sh 

.PHONY: build_prereq 

build_prereq: 
    make -C prereq_dir 

prereq_dir/prereq_ts обновляется, если сделать -C PREREQ (prereq_dir/Makefile) определяет зависимости, PREREQ являются старыми и PREREQ должен быть восстановлен.

Проблема в том, что rebuilt_test.sh всегда вызывается, и я предполагаю, что это потому, что выполняется одна из зависимостей run_test (так как это PHONY).

Я решил эту проблему путем изменения run_test к:

run_test:: build_prereq 

run_test:: prereq_dir/prereq_ts 
    rebuild_test.sh 

.PHONY: build_prereq 

build_prereq: 
    make -C prereq_dir 

Является ли это хорошее решение? Сначала выполняется build_prereq, а затем выполняется rebuild_test.sh, если обновляется prereq_dir/prereq_ts (что произойдет в случае вызова make_prereq при необходимости).

Есть ли более правильный способ сделать это. Я не хочу создавать дополнительные цели, поскольку это не позволяет прямое обращение make, т. Е. «Make run_test».

+0

Это немного неясно. Предположим, что 'prereq_dir/prereq_ts' не изменилось, но предпосылки' prereq' имеют; должен ли 'make run_test' делать что-нибудь? – Beta

+0

Нет, run_test не следует перестраивать. Если предпосылки preereq изменяются, то prereq_dir/prereq_ts будут затронуты, и это должно привести к тому, что run_test будет перестроен. – nachum

ответ

0

Сделать опору именно то, что вы хотите.

.PHONY: build_prereq 
build_prereq: 
    ${MAKE} -C prereq_dir 

prereq_dir/prereq_ts: build_prereq ; 

run_test: prereq_dir/prereq_ts 
    rebuild_test.sh 

Итак, вы просите изготовителя построить run_test.

  1. Для обеспечения prereq_dir/prereq_ts до даты его первым запускает рецепта build_prereq.
  2. Далее идет рецепт для prereq_dir/prereq_ts (который ничего не делает — см., Что ;).
  3. Теперь он проверяет отметку времени prereq_dir/prereq_ts, чтобы решить, устарели ли run_test.

Отлично.

0

Если вы готовы быть непереносимой, GNU сделать поддерживает заказ только предварительные условия выбора (см ГНУ сделать руководство), которые действительно именно то, что вы хотите:

run_test: | build_prereq 

build_prereq: 
     $(MAKE) -C prereq_dir 

(обратите внимание всегда используйте $(MAKE) при использовании суб-марок, никогда make)

+0

Нет, это не работает, когда 'prereq_dir/prereq_ts' (i) возможно затронут при запуске' build_prereq' и (ii) является нормальным предварительным req of 'run_test'. – bobbogo

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