integrate C/LDFLAGS into LunaBuild flow
[lunaix-os.git] / lunaix-os / usr / makefile
1 include utils.mkinc
2 include toolchain.mkinc
3
4 task := all
5
6 # TODO make this use LBuild
7 CFLAGS += -m32 -ffreestanding -fno-pie
8 LDFLAGS += -m32 -nostdlib -nolibc -z noexecstack -no-pie -Wl,--build-id=none
9
10 sys_include := $(CURDIR)/includes
11 build_dir := $(CURDIR)/build
12 libc_name := liblunac
13 libc_files := $(libc_name).a
14 libc := $(addprefix $(build_dir)/lib/,$(libc_files))
15 ldscript := $(CURDIR)/link-usr.ld
16
17 common_param := CC AR INCLUDES BUILD_DIR BUILD_NAME CFLAGS LDFLAGS
18
19 INCLUDES := $(sys_include)
20 BUILD_DIR := $(build_dir)
21 BUILD_NAME := $(libc_name).a
22
23 $(build_dir)/bin:
24         @mkdir -p $(build_dir)/bin
25
26 $(build_dir)/lib:
27         @mkdir -p $(build_dir)/lib
28
29 $(build_dir)/includes:
30         @mkdir -p $(build_dir)/includes
31
32 export $(common_param)
33 $(build_dir)/$(libc_name).a: $(build_dir)/bin $(build_dir)/lib $(build_dir)/includes
34         $(call status,TASK,$(BUILD_NAME))
35         @$(MAKE) $(MKFLAGS) -C libc/ $(task)
36
37 app-list = $(shell cat apps.list)
38 exec-list = $(shell cat execs.list)
39
40 mkapp-list := $(addprefix app-, $(app-list))
41 mkexec-list := $(addprefix $(build_dir)/bin/, $(exec-list))
42
43 export LD_SCRIPT := $(ldscript)
44 export LIBC := $(libc)
45 app-%:
46         $(call status,TASK,$*)
47         @$(MAKE) $(MKFLAGS) -C $* $(task) BUILD_NAME="$*"
48
49 exec_%.o: %.c
50         $(call status,CC,$<)
51         @$(CC) $(CFLAGS) $(addprefix -I,$(INCLUDES)) -c $< -o $@
52
53 $(build_dir)/bin/%: exec_%.o
54         $(call status,LD,$(@F))
55         @$(CC) -T $(ldscript) -o $@ $< $(libc) $(LDFLAGS)
56
57 app: task := all
58 app: INCLUDES += $(build_dir)/includes
59 app: $(mkapp-list)
60
61 exec: task := all
62 exec: INCLUDES += $(build_dir)/includes
63 exec: $(mkexec-list)
64
65 clean: task := clean
66 clean: $(mkapp-list)
67         @rm -rf $(build_dir)
68         @$(MAKE) $(MKFLAGS) -C libc/ $(task)
69
70 all: task := all
71 all: $(build_dir)/$(libc_name).a exec app