2013-04-27 2 views
1

저는 makefile을 사용하는 초보자입니다. 두 개의 다른 디렉토리 (커널과 드라이버라고도 함)의 입력을 받아들이는 gcc 용 makefile을 작성하려고합니다. 와일드 카드를 사용하는 다른 디렉토리 (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_DIRDRIVER_DIR 모두에서 같은 이름의 소스 파일을 조심해!

+0

방법 규칙을 수정해야합니까? 다음 문자를 사용합니다. '% .o : % .c \t $ (CC) $ (CFLAGS) -c $ <-o $ @' –

+0

@PatrickJane, 그게 더 어렵습니다. 단일 출력 디렉토리 만 필요하기 때문에 힘들 수 있습니다. 나는 그렇게하지 말고,'tmp'에서 입력 디렉토리 구조를 미러하는 것을 추천합니다 - 그러면 각'.o' 파일을'.c' 파일에 1 : 1로 매핑 시켜서 당신의 삶을 만드십시오. 더 쉽습니다. –

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 파일이있는 경우는 큰 문제가 있습니다 ...