make игнорирует правила сборки
Пытаюсь написать довольно сложную систему сборки на основе make и встрял на моменте компиляции исходный кодов в объектные. Когда я запускаю make из корневого каталога, то он компилириет в объектный файл только первый указанные в SRCS а остальные игнорирует. Тестовый проект для системы сборки выглядит так:
├── compile.mk
├── config.mk
├── Makefile
└── src
├── main.c
├── Makefile
├── module1
│ ├── module1_bar.c
│ └── module1_foo.c
└── module2
├── module2_bar.c
└── module2_foo.c
Содержимое Makefile-ов следующее:
#Makefile верхнего уровня
include config.mk
MAKEFLAGS+=--no-print-directory
all:
@printf "\x1b[32mStart project compilation\x1b[0m\n"
@$(foreach target,$(TARGETS), \
printf "\x1b[32m%s\x1b[0m compilation\n" "$(target)" && \
$(MAKE) -C $(target) clean && \
$(MAKE) -C $(target); \
)
clean:
$(foreach target,$(TARGETS),$(MAKE) -C $(target) clean;)
#config.mk
export CC=clang
export PROJECT_DIR=$(shell realpath .)
export SRC_DIR=$(PROJECT_DIR)/src
export BUILD_DIR=$(PROJECT_DIR)/build
export INCLUDE_DIR=$(PROJECT_DIR)/include
export LIBS_DIR=$(shell realpath libs)
export LIBS_INCLUDE_DIRS_PATH=$(shell find $(LIBS_DIR) -type d -iname "include")
export TARGETS=$(shell find $(shell realpath .) -type f -iname "Makefile" | xargs dirname | tail -n +2)
export CFLAGS=-I$(INCLUDE_DIR) $(addprefix -I,$(LIBS_INCLUDE_DIRS_PATH))
# $(info CC $(CC))
# $(info SRC_DIR $(SRC_DIR))
# $(info BUILD_DIR $(BUILD_DIR))
# $(info INCLUDE_DIR $(INCLUDE_DIR))
# $(info CFLAGS $(CFLAGS))
#compile.mk
SRC_BASENAMES=$(notdir $(SRCS))
SRC_FULLPATH=$(realpath $(SRCS))
OBJS=$(addprefix $(BUILD_DIR)/,$(addsuffix .o,$(SRC_BASENAMES)))
# $(info SRC_FULLPATH: $(SRC_FULLPATH))
# $(info OBJS: $(OBJS))
define COMPILE_SOURCE_TO_OBJECT
$(1): $(2)
$(info $(2) > $(1))
$(CC) $(CFLAGS) -c $(2) -o $(1)
@echo -e "\x1b[33m$(2)\x1b[0m compiled to \x1b[33m$(1)\x1b[0m"
endef
$(foreach i, $(shell seq 1 $(words $(SRCS))), \
$(eval $(call COMPILE_SOURCE_TO_OBJECT, \
$(strip $(word $(i),$(OBJS))), \
$(strip $(word $(i),$(SRC_FULLPATH))) \
)); \
)
$(BUILD_DIR)/$(TARGET): $(OBJS)
printf "\x1b[32m%s\x1b[0m compiled to \x1b[32m%s\x1b[0m" "$^" "$@"
clean:
rm -rf $(OBJS)
#Makefile в src
TARGET = main
TYPE = application
LIBS = lib1 lib2
SRCS = main.c \
module1/module1_foo.c \
module1/module1_bar.c \
module2/module2_foo.c \
module2/module2_bar.c
include ../compile.mk
all: $(BUILD_DIR)/$(TARGET)