多くのサブディレクトリを持つ.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ファイルになり$(CSRC)
ます。
このように定義すると$(OBJS)
:
$(OBJS): %.o: %.c
mkdir -p $(dir $@)
$(CP) $< $@
.cファイルのターゲットを作成するルールがないというエラーが表示されます。しかし、makeはビルドミラーディレクトリで.cファイルを探しているので、ソースディレクトリを探す必要があります。これをどのように配置できるか知っていますか?
よろしくお願いします!