2011-04-13 149 views
1

我需要创建Makefile来编译带有许多子目录的源文件(source目录进入5级深度),我需要将目标文件放在镜像目录中。到目前为止,我已经创建了这个Makefile: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]) 

如果我定义规则$(OBJS)这种方式,$<总是在$(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)/%○:。../%.c \t @mkdir -p $(DIR $ @) \t $(CC)$(CFLAGS)$ < -o $ @ 完成了这份工作!非常感谢!你帮了很多! – Nikola 2011-04-14 15:06:03

0

您试过的$(OBJS)的第一条规则是,每个目标文件都单独依赖于所有源文件。当然这不正确。
你的第二次尝试更好,虽然配方很奇怪。修复并使用VPATH使make找到来源。