2014-01-09 4 views
0

Учитывая этот Makefile сниппает:рекурсивный Makefile: хочет запустить фиктивную цель затем запустить все мишени

TARGETS =  ${SHARED_LIB_A} ${SHARED_LIB_B} 

.PHONY: subdirs $(SUBDIRS) 

subdirs: $(SUBDIRS) 

$(SUBDIRS): 
    $(MAKE) -C [email protected] 

all: $(TARGETS) 

Я хочу изменить этот Makefile так, чтобы получить ЦЕЛЕВЫЕ построила после фальшивой цель запуска. То есть. ЦЕЛИ зависят от кода в SUBDIRS, который строится - TARGETS необходимо запускать после SUBDIRS. Прямо сейчас, как это работает, так это то, что цель PHONY запускается (субдиры построены), но не все цели (если я специально не запускаю ее как «сделать все»), но я хочу избежать этого, если это возможно, я просто хочу запустить «сделать» и иметь его построить подкаталоги, а затем построить ЗАДАЧИ.

ответ

1

первое, вы должны иметь all как первое правило, не последний. Если вы не указали конкретную цель на make командной строке, он будет запустить первую цель в Makefile (здесь, subdirs)

во-вторых, вы должны объявить subdirs как предпосылка $(TARGETS), что будет гарантировать, что они построены не только после subdirs завершения:.

all: $(TARGETS) 

$(TARGETS): subdirs 

Теперь, потому что subdirs это фальшиво это означает, что $(TARGETS) будет всегда будет считать устаревшими и всегда будет построен, даже если применение subdirs не изменять какие-либо файлы. Однако нет другой альтернативы, поскольку вы написали свой make-файл здесь, потому что make не может знать, какие файлы (созданные субарендами) вы хотите использовать, чтобы узнать, устарела ли библиотека.

В качестве альтернативы вы можете указать, что subdirs является порядок только условием:

$(TARGETS): | subdirs 
+0

Ах, да, кажется, делать то, что я хочу. Благодарю. В этом случае мне все равно, если файлы не были изменены в поддиректорах. – aneccodeal

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