Makefile зеркало, каталог для сборки - PullRequest
1 голос
/ 13 апреля 2011

Мне нужно создать 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), $< всегда будет первым .c файлом в $(CSRC).

Если я определю $(OBJS) таким образом:

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

Я получу ошибку, что не существует правила для создания цели для файла .c.Но я вижу, что make ищет .c файл в каталоге зеркальной сборки, и он должен смотреть на исходный каталог.Может быть, вы знаете, как это можно организовать?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Правило $(OBJS): %.o: %.c означает что-то вроде этого: при попытке создать файл .o используйте это правило, если существует соответствующий файл .c. Например: когда make ищет способ создания $(OBJDIR)/foo.o, он ищет $(OBJDIR)/foo.c.

В вашем случае этот файл не существует, поэтому правило игнорируется.

То, что вы хотите, это что-то вроде этого:

$(OBJS): $(OBJDIR)/%.o: $(SOURCEDIR)/%.c
    mkdir -p $(dir $@)
    $(CP) $< $@
0 голосов
/ 13 апреля 2011

Первое правило для $(OBJS), которое вы пробовали, гласит, что каждый объектный файл индивидуально зависит от всех исходных файлов. Конечно, это не правильно.
Ваша вторая попытка лучше, хотя рецепт странный. Исправьте это и используйте VPATH, чтобы make нашел источники.

...