shconfig: add `link` command to view the inverse dependency
[lunaix-os.git] / lunaix-os / usr / makefile
1 include utils.mkinc
2 include toolchain.mkinc
3
4 LCONFIG_FLAGS := --quiet
5
6 include lunabuild.mkinc
7
8 include $(lbuild_mkinc)
9
10 ifndef ARCH
11 $(error ARCH is not set)
12 endif
13
14 task := all
15
16 sys_include := $(CURDIR)/includes
17 build_dir := $(CURDIR)/build
18 libc_name := liblunac
19 libc_files := $(libc_name).a
20 libc := $(addprefix $(build_dir)/lib/,$(libc_files))
21
22 common_param := CC AR INCLUDES BUILD_DIR BUILD_NAME\
23                                 CFLAGS LDFLAGS ARCH LBUILD LIBC_INCLUDE
24
25 INCLUDES := $(sys_include)
26 BUILD_DIR := $(build_dir)
27 BUILD_NAME := $(libc_name).a
28
29 LIBC_INCLUDE := $(build_dir)/usr/includes
30
31 mkapp-list := $(addprefix app-, $(shell cat apps.list))
32 mkexec-list := $(addprefix $(build_dir)/bin/, $(_LBUILD_SRCS))
33
34 uexec_ld := $(CURDIR)/uexec.ld
35
36 # Directory structure prerequisites
37 $(build_dir)/bin:
38         @mkdir -p $(build_dir)/bin
39
40 $(build_dir)/lib:
41         @mkdir -p $(build_dir)/lib
42
43 $(LIBC_INCLUDE):
44         @mkdir -p $(LIBC_INCLUDE)
45
46 # LibC
47 export $(common_param)
48 $(build_dir)/$(libc_name).a: $(build_dir)/bin \
49                                                          $(build_dir)/lib $(LIBC_INCLUDE)
50         $(call status,TASK,$(BUILD_NAME))
51         @$(MAKE) $(MKFLAGS) -C libc/ $(task)
52
53 $(uexec_ld): $(uexec_ld)x
54         @$(CC) -include $(lbuild_config_h) -x c -P -E $< -o $@
55
56 # Application (with standalone makefile)
57 export LD_SCRIPT := $(uexec_ld)
58 export LIBC := $(libc)
59 export $(common_param)
60 app-%: $(uexec_ld)
61         $(call status,TASK,$*)
62         @$(MAKE) $(MKFLAGS) -C $* $(task) BUILD_NAME="$*"
63
64 app: task := all
65 app: INCLUDES += $(LIBC_INCLUDE)
66 app: $(mkapp-list)
67
68
69 # Programs (single file)
70 exec_%.o: %.c
71         $(call status,CC,$<)
72         @$(CC) $(CFLAGS) $(addprefix -I,$(INCLUDES)) -c $< -o $@
73
74 $(build_dir)/bin/%: exec_%.o $(uexec_ld)
75         $(call status,LD,$(@F))
76         @$(CC) -T $(uexec_ld) -o $@ $< $(libc) $(LDFLAGS)
77
78 exec: task := all
79 exec: INCLUDES += $(LIBC_INCLUDE)
80 exec: $(mkexec-list)
81
82
83 # General recipes
84 clean: task := clean
85 clean: $(mkapp-list)
86         @rm -rf $(build_dir) $(lbuild_dir) $(uexec_ld)
87         @$(MAKE) $(MKFLAGS) -C libc/ $(task)
88
89 .NOTPARALLEL:
90 all: task := all
91 all: $(build_dir)/$(libc_name).a exec app