2016-04-13 2 views
1

я хава Makefile что-то вроде этого:Makefile автоматическая переменная для соответствующего файла Си

outdir = release 
allsrc = aaa/a.c bbb/b.c ccc/c.c 
allobjs = $(addprefix $(outdir), $(notdir $(allsrc:.c=.o)) 
... 
test: $(allobjs) 

$(allobjs): $(allsrc) 
     gcc -c -o [email protected] $< 

тест делают выполняющее:

gcc -c -o release/a.o aaa/a.c 
gcc -c -o release/b.o aaa/a.c 
gcc -c -o release/c.o aaa/a.c 

(автоматическая переменная $ < всегда занимает первое необходимое условие) , но я хочу «соответствующий»:

gcc -c -o release/a.o aaa/a.c 
gcc -c -o release/b.o bbb/b.c 
gcc -c -o release/c.o ccc/c.c 

Что я должен изменить на выполнить желаемый результат?

я знаю, что это будет работать наверняка:

$(outdir)/a.o: aaa/a.c 
     gcc -c -o [email protected] $< 

$(outdir)/b.o: bbb/b.c 
     gcc -c -o [email protected] $< 

$(outdir)/c.o: ccc/c.c 
     gcc -c -o [email protected] $< 

и интересно, как сделать то же самое в одном receipe. (потому что в моем реальном makefile у меня есть ~ 20 различных исходных файлов не только 3, как я сделал здесь, например)

+1

Если вы не будете обращать внимание на дельные советы в ответ Этан в , вы можете поэкспериментировать с '$ *. c'. –

ответ

1

Обычный способ сделать то, что вы спрашиваете, будет что-то вроде:

outdir = release 
allsrc = aaa/a.c bbb/b.c ccc/c.c 
allobjs = $(addprefix $(outdir), $(notdir $(allsrc:.c=.o))) 
VPATH = $(sort $(dir $(allsrc))) 
... 
test: $(allobjs) 

$(outdir)/%.o: %.c 
     gcc -c -o [email protected] $< 

Конечно, это будет работать с проблемами, если у вас есть в обоих aaa и bbb в b.c, но так как вы пытаетесь чтобы все объектные файлы помещали в один и тот же каталог, это имеет значение независимо. Это может сделать больше смысла, чтобы избавиться от $(notdir и сохранить ту же структуру каталогов под $(outdir), в этом случае вам не нужно VPATH

outdir = release 
allsrc = aaa/a.c bbb/b.c ccc/c.c 
allobjs = $(addprefix $(outdir), $(allsrc:.c=.o)) 
... 
test: $(allobjs) 

$(outdir)/%.o: %.c 
     mkdir -p `dirname [email protected]` 
     gcc -c -o [email protected] $< 
+0

спасибо, VPATH является решением. – MetNP

2

Вы не пишете свой рецепт. Это не так, как делают работы.

Этот рецепт говорит, что каждый элемент в $(allobjs) имеет каждый пункт в $(allsrc) как его предпосылка, но это не то, что вы имеете в виду.

Вы имеете в виду, что каждый .o файл имеет соответствующий .c файл как необходимое условие, которое является точно, что встроенный в %.o: %.c правило уже делает. Для этого вам даже не нужен make-файл.

Редактировать: На самом деле, вы не имеете в виду это. Я пропустил, что исходные файлы были в разных каталогах. Это меняет и усложняет ситуацию.

Chris Dodd wrote up два хороших решения для этого.

+0

хорошо вы можете написать мне минимальный пример, как построить aaa/ac, bbb/bc и ccc/cc для выпуска/ao, release/bo, release/co, потому что это то, что я задаю с этим вопросом – MetNP

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