2013-02-12 4 views
1

Любая идея, почему что-то подобное не работает в make-файле?несколько целей в make-файле

all : $(GOAL_DB) $(GOAL) 

%.d: %.cpp  
    $(CC) $(CPPFLAGS_DB) $< > [email protected] 
%.o : %.cpp 
    $(CC) $(FLAGS_DB) $< -o [email protected] 

$(GOAL_DB) : $(OFILES) 
     $(CC) $(LFLAGS_DB) -o [email protected] $^ $(LIBS_DB) 
    strip $(GOAL_DB) 
    rm -f *.o *.d 

%.d: %.cpp  
    $(CC) $(CPPFLAGS) $< > [email protected] 
%.o : %.cpp 
    $(CC) $(FLAGS) $< -o [email protected] 
$(GOAL) : $(OFILES) 
     $(CC) $(LFLAGS) -o [email protected] $^ $(LIBS) 
    strip $(GOAL) 
    rm -f *.o *.d 

Я просто пытаюсь построить две разные цели, используя make all, GNU make.

Первая цель строит отлично, но не создает новые файлы объектов для другой цели.

ответ

3

Файл make не похож на стандартную программу, которая выполняется последовательно. Кажется, вы сделали предположение, что новые правила появятся перед тем, как новая цель будет применена к этой цели. Это не тот случай. Makefile полностью оценивается для переменных, целей, зависимостей и т. Д., Прежде чем он начнет применять правила.

Make будет соответствовать этим $ (OFILES) против только одного из этих% .d: целей, вероятно, первого целевого шаблона, который он находит.

Причина, по которой вы не получаете новые объекты для другой цели, заключается в том, что она выглядит так, будто вы создаете один и тот же набор файлов дважды, тем самым пропустив вторую сборку, потому что она уже завершена.

Решение состоит в том, чтобы использовать 'целевые конкретные переменные':

all : $(GOAL_DB) $(GOAL) 

$(GOAL): BUILD_FLAGS=$(FLAGS) 
$(GOAL): BUILD_CPPFLAGS=$(CPPFLAGS) 
$(GOAL): BUILD_OUTDIR=./outdir 
$(GOAL): $(OFILES) 

$(GOAL_DB): BUILD_FLAGS=$(FLAGS_DB) 
$(GOAL_DB): BUILD_CPPFLAGS=$(CPPFLAGS_DB) 
$(GOAL_DB): BUILD_OUTDIR=./outdir_db 
$(GOAL_DB): $(OFILES) 

%.d: %.cpp  
    mkdir -p $(BUILD_OUTDIR) 
    $(CC) $(BUILD_CPPFLAGS) $< > $(BUILD_OUTDIR)/[email protected] 

%.o : %.cpp 
    mkdir -p $(BUILD_OUTDIR) 
    $(CC) $(BUILD_FLAGS) $< -o $(BUILD_OUTDIR)/[email protected] 
+0

Благодарности! да, я принял последовательное исполнение, которое определенно не происходит. Ваше решение имеет гораздо больше смысла, но оно не создает две цели, чтобы сделать все. – dharag

+0

Он по-прежнему не создает объектные файлы для другого. Я пытаюсь создать один и тот же набор файлов, но с использованием разных библиотек, вы думаете, что это может быть проблемой? – dharag

+0

Ах, правый. Выходные файлы все те же. Файл makefile, вероятно, должен быть настроен для вывода в отдельные каталоги. – PQuinn

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