2011-04-13 7 views
1

많은 하위 디렉토리 (소스 디렉토리가 5 레벨 정도 가깝게 나옵니다)로 .c 파일을 컴파일하는 Makefile을 작성해야하며 오브젝트 파일을 미러 된 빌드 디렉토리에 배치해야합니다. 지금까지, 나는이 메이크 만든 : 나는 $(OBJS)이 방법에 대한 규칙을 정의하면Makefile 미러 빌드 디렉토리

CC := gcc.exe 
AS := as.exe 

CFLAGS = -DCORE_SW_VERSION='"$(CORE_SW_VERSION)"' -Wall -mA6 -c -fmessage-length=0 -Hsdata0 
CFLAGS += -fgnu89-inline -mno-volatile-cache $(INCLUDE) -Hon=each_function_in_own_section -Xcrc -std=c99 -O1 

CORE_SW_VERSION:=CORE.07.01.04.01.03.01.R 
HAL_SW_VERSION:=16.01.06.01.06.00 

MODE_CORE := dev 
MODE_HAL := dev 


OBJDIR := $(shell pwd)/$(TARGET12) #TARGET12 is a make parameter 
INCLUDE := $(shell cat ./$(TARGET12)_include.txt) 
SOURCEDIR := ../sources 

CSRC := $(shell find $(SOURCEDIR) -name '*.c') 
EXCLUDES := $(shell cat ./$(TARGET12)_exclude.txt) 

OBJ := $(CSRC:.c=.o) 
OBJS := $(patsubst ../%.c,$(OBJDIR)/%.o,$(CSRC)) 


.PHONY: $(TARGET12) 
$(TARGET12): $(OBJS) 
    $(AR) -r $(CORE_SW_VERSION).a $(OBJS) 


$(OBJS): $(CSRC) 
    mkdir -p $(dir [email protected]) 
    $(CC) $(CFLAGS) $< -o $(patsubst ../%,$(OBJDIR)/%,[email protected]) 

$< 항상 $(CSRC)에서 처음으로 .c 파일입니다. 내가 $(OBJS) 이런 식으로 정의하면

는 :

$(OBJS): %.o: %.c 
    mkdir -p $(dir [email protected]) 
    $(CP) $< [email protected] 

을 나는이 .c 파일에 대한 대상을 할 규칙이 없음 오류가 발생합니다. 하지만 make가 미러링 된 디렉토리를 빌드 할 때 .c 파일을 찾고, 소스 디렉토리를 확인해야합니다. 이것이 어떻게 준비 될 수 있는지 아십니까?

미리 감사드립니다.

답변

1

규칙 $(OBJS): %.o: %.c은 다음과 같은 의미입니다. .o 파일을 만들려고 할 때 해당 .c 파일이있는 경우이 규칙을 사용하십시오. 예 : make가 $(OBJDIR)/foo.o을 만드는 방법을 찾고있을 때 $(OBJDIR)/foo.c을 찾습니다.

이 파일은 존재하지 않으므로 규칙이 무시됩니다. 당신이 원하는 것은 오히려이 같은 것입니다

:

$(OBJS): $(OBJDIR)/%.o: $(SOURCEDIR)/%.c 
    mkdir -p $(dir [email protected]) 
    $(CP) $< [email protected] 
+1

lesmana, 당신의 답장을 보내 주셔서 감사합니다! 사실, 그것은이었다 $ (OBJS) : $ (objdir를)/% O :. ../%.c \t @mkdir -p $ (DIR의 $의 @) \t $ (CC) $ (CFLAGS) $ < -o $ @ 그 작업을 마쳤습니다! 고마워요! 당신은 많은 도움이되었습니다! – Nikola

0

시도한 $(OBJS)의 첫 번째 규칙은 모든 개체 파일이 모든 원본 파일에 개별적으로 의존한다고 명시합니다. 확실히 그게 정확하지 않습니다.
조리법이 이상하지만 두 번째 시도가 더 좋습니다. 수정하고 VPATH을 사용하여 make에서 소스를 찾으십시오.