2016-05-27 2 views
1

в текущем проекте C у нас была плохая идея поместить все объектные файлы в другую папку из источника. Сначала это не усложнялось, но теперь нам нужно скомпилировать некоторые файлы в определенной папке и другие в другой.Makefile: автоматическая цель в других каталогах

arborecence выглядит следующим образом:

  • objs1
  • objs2
  • ЦСИ
    • file1.c
    • file2.c

После запуска make Я хотел бы древовидное быть изменен:

  • objs1
    • file1.o
  • objs2
    • file1.o
    • file2 .o

Сначала Makefile было как:

CSRC = $(wildcard *.c) 
OBJS = $(CSRC:%.c=%.o) 

objs1/%.o : %.c 
    gcc -c -o [email protected] $< 

Теперь Theres также file2.c и он не должен быть составлен в objs1, file1.o должны быть в обоих objs1 и objs2 и file2.o РЕКОМЕНДУЕМЫМ быть в objs2.

Я использую общие правила, потому что проект больше, и это действительно удобно.

Итак, у меня есть две переменные, которые содержат имя объекта, одно для objs1, другое для objs2.

Я хотел бы сделать что-то вроде

$(OBJS1): %.o %.c 

Но действовать будет, как исходные файлы в objs1 и что это не так.

Итак, каким образом можно комбинировать общие правила с указанным местоположением?

Спасибо

+0

Как 'objs1/file1.o' и' objs2/file1.o' отличаются, если они скомпилированы из того же исходного файла? Выполняются ли они по-разному? – user657267

+0

Да, они скомпилированы как стандартный объект, а другой скомпилирован с привязкой к JNI сначала, а затем в качестве библиотеки. –

ответ

0

Вы, вероятно, хотите, чтобы указать объекты вручную, видя, как вы нужны конкретные файлы, скомпилированные в определенных каталогах:

objs1 := objs1/file1.o 
objs2 := objs2/file1.o objs2/file2.o 

$(objs1): CFLAGS += blah1 
$(objs2): CFLAGS += blah2 

$(objs1): objs1/%.o: src/%.c 
$(objs2): objs2/%.o: src/%.c 

$(objs1) $(objs2): 
    $(COMPILE.c) $(OUTPUT_OPTION) $< 

Если небольшое количество дублирования раздражает вас, вы можете использовать вторичное расширение вместо

.SECONDEXPANSION: 
$(objs1) $(objs2): %.o: src/$$(notdir $$*).c 
    $(COMPILE.c) $(OUTPUT_OPTION) $< 
1

Если вы терпите рекурсивный макияж, вы можете сделать свой соответствующий подкаталог кво тас объектных файлов, просто не делая в подкаталоге, с соответствующим CFLAGS и CPPFLAGS и VPATH=../src Нет необходимости писать какие-либо компиляции рецептов на все в этом случае, например,

Makefile

export CC := gcc 
objs1: OBJS := file1.o 
objs2: OBJS := file1.o file2.o 
objs1: CFLAGS := -g 
objs1: CPPFLAGS := -I../include 
objs2: CFLAGS = -O2 
objs2: CPPFLAGS := -I../include -DNDEBUG 

.PHONY: all clean objs1 objs2 

all: objs1 objs2 

objs1 objs2: 
    mkdir -p [email protected] 
    $(MAKE) -C [email protected] $(OBJS) CFLAGS='$(CFLAGS)' CPPFLAGS='$(CPPFLAGS)' VPATH=../src 

clean: 
    rm -fr objs1 objs2 

, который работает, как:

$ make 
mkdir -p objs1 
make -C objs1 file1.o CFLAGS='-g' CPPFLAGS='-I../include ' VPATH=../src 
make[1]: Entering directory '/home/imk/develop/scrap/objs1' 
gcc -g -I../include -c -o file1.o ../src/file1.c 
make[1]: Leaving directory '/home/imk/develop/scrap/objs1' 
mkdir -p objs2 
make -C objs2 file1.o file2.o CFLAGS='-O2' CPPFLAGS='-I../include -DNDEBUG' VPATH=../src 
make[1]: Entering directory '/home/imk/develop/scrap/objs2' 
gcc -O2 -I../include -DNDEBUG -c -o file1.o ../src/file1.c 
gcc -O2 -I../include -DNDEBUG -c -o file2.o ../src/file2.c 
make[1]: Leaving directory '/home/imk/develop/scrap/objs2' 

Это важно, чтобы подкаталоги .PHONY. В противном случае make будет считать их простое существование означает, что делать нечего.

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