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)

Ответы (0 шт):