我需要创建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文件,它应该查看源目录。你可能知道如何安排这个吗?
提前谢谢你!
答案 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
找到来源。