2013-04-27 5 views
1

Я немного начинаю использовать make-файлы, и я пытаюсь написать make-файл для gcc, который принимает входы из двух разных каталогов (в моем случае они называются ядром и драйверами) и выводят объектные файлы в другой каталог (называемый tmp) с использованием подстановочных знаков.Каталог выходных файлов Makefile

Я написал этот код, чтобы получить имена входных файлов и выходных файлов

C_SOURCES = $(wildcard $(KERNEL_DIR)/*.c $(DRIVERS_DIR)/*.c) 

#Creating a list for object files names 
C_OBJ = $(C_SOURCES:.c=.o) 

и я использую следующее правило

%.o: %.c $(CC) $(CFLAGS) -c $< -o [email protected] 

, но я не могу получить для вывода объекта файлы в нужном каталоге.файлы

ответ

2

Что-то вроде этого примера должно сделать это за вас. Я разделил вещи немного для удобства чтения, но я уверен, что вы получите идею:

KERNEL_SOURCES = $(wildcard $(KERNEL_DIR)/*.c) 
DRIVER_SOURCES = $(wildcard $(DRIVER_DIR)/*.c) 

OBJECTS = $(patsubst $(KERNEL_DIR)/%.c,tmp/%.o,$(KERNEL_SOURCES)) 
OBJECTS += $(patsubst $(DRIVER_DIR)/%.c,tmp/%.o,$(DRIVER_SOURCES)) 

Берегитесь исходных файлов с одинаковым именем в обоих KERNEL_DIR и DRIVER_DIR!

+0

и как следует ли изменить правило? Я использую следующий '% .o:% .c \t $ (CC) $ (CFLAGS) -c $ <-o $ @' –

+0

@PatrickJane, это сложнее. Поскольку вам нужен только один выходной каталог, это будет сложно. Я бы порекомендовал, чтобы вы этого не делали, а вместо этого отразили структуру входных каталогов в 'tmp' - тогда у вас будет отображение 1: 1 каждого файла' .o' в файл '.c' и сделайте свою жизнь Полегче. –

2

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

SOURCES := $(wildcard $(KERNEL_DIR)/*.c $(DRIVER_DIR)/*.c) 
OBJECTS := $(patsubst %.c,$(OBJECT_DIR)/%.o,$(notdir $(SOURCES))) 

all: $(OBJECTS) 

$(OBJECT_DIR)/%.o : $(KERNEL_DIR)/%.c 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

$(OBJECT_DIR)/%.o : $(DRIVER_DIR)/%.c 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

Очевидно, что вы будете иметь большие проблемы, если у вас есть foo.c файл в обоих исходных каталогах ...

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