2015-10-14 13 views
2

Я пытаюсь сделать один файл makefile, который скомпилирует два разных набора файлов. Это возможно?makefile целевые файлы

То, что я пытался до сих пор:

target1: OBJ = foo1.o foo2.o 
target1: application 

target2: OBJ = foo3.o foo4.o 
target2: application 

application: $(OBJ) 
    $(LD) $(OBJ) 

Что происходит, что LD вызывается с правильными параметрами, но сделать никогда не проверяет зависимости поэтому неявные правила, которые компилируются .c файлы .o никогда выполненный таким образом, что компоновщик не работает:

ld: cannot find foo1.o: No such file or directory 
ld: cannot find foo2.o: No such file or directory 

Каков правильный путь?

+0

Вы были правы. Исправлен минимальный код, вызывающий ошибку – felknight

+0

целевые переменные доступны в * рецепте * и в других целевых назначениях для одной и той же цели. Но они недоступны в предварительных требованиях (поскольку они могут зависеть от автоматических переменных, которые не имеют значения до тех пор, пока не будут определены предварительные условия). Возможно, есть способ сделать это, но похоже, что традиционный явный предварительный стиль проще. То есть, если вы удаляете 'OBJ =' из 'target1: OBJ = foo1.o foo2.o', вы получаете одинаково поддерживаемую' target1: foo1.o foo2.o'. :) – rici

+0

@EtanReisner: Почему вы думаете, что у него есть предпосылки? Я проверил это с make-файлом: 'target: prereq = foo'' target: $ (prereq) '' \ techo $^'. Если целевая переменная была доступна в предварительных условиях, я ожидал бы увидеть «foo». Но нет. (Рецепт для цели без предварительных условий выполняется безоговорочно, ¿нет?) – rici

ответ

0

Вы могли бы пойти с этим, например, (учитывая, что вы не будете называть сделать с групповой цели сразу):

OBJ := foo1.o foo2.o 

ifeq "$(MAKECMDGOALS)" "target2" 
OBJ := foo3.o foo4.o 
endif 

target1 target2: application 

application: $(OBJ) 
    $(LD) $^ 
+0

Спасибо за ответ. – felknight

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