У вас есть пара проблем. Самое важное здесь:
SOURCES := $(call rwildcard,$(SRCDIR),*.c)
SOURCES += $(call rwildcard,$(SRCDIR),*.cpp)
Предположим, что это приводит к следующему значению для SOURCES
:
SOURCES := src/foo.c src/bar/bar.c src/biz/biz.cpp src/boz.cpp
Теперь, что будет OBJECTS
после следующего?
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:%.c=%.c.o))
OBJECTS += $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:%.cpp=%.cpp.o))
Это будет (при условии BUILDDIR
это obj
):
OBJECTS := obj/foo.c.o obj/bar/bar.c.o obj/biz/biz.cpp obj/boz.cpp \
obj/foo.c obj/bar/bar.c obj/biz/biz.cpp.o obj/boz.cpp.o
Почему? Поскольку перевод, подобный $(SOURCES:%.c=%.c.o)
, не возвращает только слов, соответствующих шаблону ... он возвращает ALL слов, а переводит только тех которые соответствуют шаблону.
Поскольку вы просто добавляете .o
к суффиксу, а не заменяете суффикс, вы можете упростить это как:
SOURCES := $(call rwildcard,$(SRCDIR),*.c)
SOURCES += $(call rwildcard,$(SRCDIR),*.cpp)
OBJECTS := $(SOURCES:$(SRCDIR)/%=$(BUILDDIR)/%.o))
Также это правило не right:
$(BUILDDIR)/%.c.o:
$(CC) $(INC) $(CFLAGS) -c -o $@ $<
Здесь вы не заявили никаких предварительных условий. Может быть, вы делаете это где-то еще, что вы не показали нам, но лучше было бы вместо этого:
$(BUILDDIR)/%.c.o: $(SRCDIR)/%.c
$(CC) $(INC) $(CFLAGS) -c -o $@ $<
И конечно же, для файлов .cpp
.