1

我需要创建编译带有很多子目录的 .c 文件的 Makefile(源目录大约有 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)如果我以这种方式定义规则,$<则始终是 .c 中的第一个 .c 文件$(CSRC)

如果我$(OBJS)这样定义:

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

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

提前谢谢你!

4

2 回答 2

1

规则的$(OBJS): %.o: %.c意思是这样的:尝试创建.o文件时,如果相应的.c文件存在,则使用此规则。例如:当 make 正在寻找一种创建方式时$(OBJDIR)/foo.o,它会寻找$(OBJDIR)/foo.c.

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

你想要的是这样的:

$(OBJS): $(OBJDIR)/%.o: $(SOURCEDIR)/%.c
    mkdir -p $(dir $@)
    $(CP) $< $@
于 2011-04-13T15:15:15.233 回答
0

您尝试的第一条规则$(OBJS)指出,每个目标文件都单独依赖于所有源文件。这肯定是不正确的。
你的第二次尝试更好,虽然食谱很奇怪。修复它并用于VPATH查找make来源。

于 2011-04-13T15:04:58.043 回答