include utils.mkinc include toolchain.mkinc include lunabuild.mkinc include $(lbuild_mkinc) ifndef ARCH $(error ARCH is not set) endif task := all sys_include := $(CURDIR)/includes build_dir := $(CURDIR)/build libc_name := liblunac libc_files := $(libc_name).a libc := $(addprefix $(build_dir)/lib/,$(libc_files)) common_param := CC AR INCLUDES BUILD_DIR BUILD_NAME\ CFLAGS LDFLAGS ARCH LBUILD INCLUDES := $(sys_include) BUILD_DIR := $(build_dir) BUILD_NAME := $(libc_name).a mkapp-list := $(addprefix app-, $(shell cat apps.list)) mkexec-list := $(addprefix $(build_dir)/bin/, $(_LBUILD_SRCS)) uexec_ld := $(CURDIR)/uexec.ld # Directory structure prerequisites $(build_dir)/bin: @mkdir -p $(build_dir)/bin $(build_dir)/lib: @mkdir -p $(build_dir)/lib $(build_dir)/includes: @mkdir -p $(build_dir)/includes # LibC export $(common_param) $(build_dir)/$(libc_name).a: $(build_dir)/bin $(build_dir)/lib $(build_dir)/includes $(call status,TASK,$(BUILD_NAME)) @$(MAKE) $(MKFLAGS) -C libc/ $(task) $(uexec_ld): $(uexec_ld)x @$(CC) -include $(lbuild_config_h) -x c -P -E $< -o $@ # Application (with standalone makefile) export LD_SCRIPT := $(uexec_ld) export LIBC := $(libc) export $(common_param) app-%: $(uexec_ld) $(call status,TASK,$*) @$(MAKE) $(MKFLAGS) -C $* $(task) BUILD_NAME="$*" app: task := all app: INCLUDES += $(build_dir)/includes app: $(mkapp-list) # Programs (single file) exec_%.o: %.c $(call status,CC,$<) @$(CC) $(CFLAGS) $(addprefix -I,$(INCLUDES)) -c $< -o $@ $(build_dir)/bin/%: exec_%.o $(uexec_ld) $(call status,LD,$(@F)) @$(CC) -T $(uexec_ld) -o $@ $< $(libc) $(LDFLAGS) exec: task := all exec: INCLUDES += $(build_dir)/includes exec: $(mkexec-list) # General recipes clean: task := clean clean: $(mkapp-list) @rm -rf $(build_dir) $(lbuild_dir) $(uexec_ld) @$(MAKE) $(MKFLAGS) -C libc/ $(task) .NOTPARALLEL: all: task := all all: $(build_dir)/$(libc_name).a exec app