Makefile镜像构建目录

时间:2011-04-13 14:20:09

标签: makefile mirror

我需要创建Makefile来编译带有很多子目录的.c文件(源目录大约在5级深度),我需要将目标文件放在镜像的构建目录中。到目前为止,我创建了这个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 $@)
    $(CC) $(CFLAGS) $< -o $(patsubst ../%,$(OBJDIR)/%,$@)

如果我以$(OBJS)这种方式定义规则,$<始终是$(CSRC)中的第一个.c文件。

如果我以这种方式定义$(OBJS)

$(OBJS): %.o: %.c
    mkdir -p $(dir $@)
    $(CP) $< $@

我收到错误,没有规则为.c文件制作目标。但是我看到make正在构建镜像目录中查找.c文件,它应该查看源目录。你可能知道如何安排这个吗?

提前谢谢你!

2 个答案:

答案 0 :(得分:1)

规则$(OBJS): %.o: %.c的含义如下:尝试创建.o文件时,如果存在相应的.c文件,请使用此规则。例如:当make正在寻找创建$(OBJDIR)/foo.o的方法时,它会查找$(OBJDIR)/foo.c

在您的情况下,此文件不存在,因此将忽略该规则。

你想要的是这样的东西:

$(OBJS): $(OBJDIR)/%.o: $(SOURCEDIR)/%.c
    mkdir -p $(dir $@)
    $(CP) $< $@

答案 1 :(得分:0)

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