• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2023 Institute of Parallel And Distributed Systems (IPADS), Shanghai Jiao Tong University (SJTU)
2# Licensed under the Mulan PSL v2.
3# You can use this software according to the terms and conditions of the Mulan PSL v2.
4# You may obtain a copy of Mulan PSL v2 at:
5#     http://license.coscl.org.cn/MulanPSL2
6# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
7# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
8# PURPOSE.
9# See the Mulan PSL v2 for more details.
10
11all: user kernel
12include config.mk
13
14Q=@
15
16# libc
17LIBC_PROJ_DIR := $(realpath user/chcore-libc)
18ifeq ($(OH_DIR),)
19OH_DIR := $(realpath ../../../)
20endif
21LIBC_DIR := $(LIBC_PROJ_DIR)/musl-libc
22LIBCHCORE_DIR := $(LIBC_PROJ_DIR)/libchcore
23LIBCHCORE_SCRIPTS_DIR := $(LIBCHCORE_DIR)/cmake
24LIBCHCORE_OVERRIDES_DIR := $(LIBCHCORE_DIR)/porting/overrides
25LIBCHCORE_PATCHES_DIR := $(LIBCHCORE_DIR)/porting/patches
26LIBCHCORE_ARCH_INCLUDES_DIR := $(LIBCHCORE_DIR)/arch/$(CHCORE_ARCH)
27SECURE_FUNCTION_DIR := $(OH_DIR)/third_party/bounds_checking_function
28MUSL_LIBC_DIR := $(OH_DIR)/third_party/musl
29LIB_OHTEE_OBJS = $(wildcard user/chcore-libs/sys-libs/libohtee/*.c.o)
30
31ifneq ($(CHCORE_COMPILER_DIR),)
32export CHCORE_COMPILER_DIR := $(CHCORE_COMPILER_DIR)
33else
34# use clang 15.0.4 by default
35export CHCORE_COMPILER_DIR := $(OH_DIR)/prebuilts/clang/ohos/linux-x86_64/llvm/
36endif
37
38libc:
39	# copy musl-libc first
40	cp -rL $(MUSL_LIBC_DIR) $(LIBC_DIR)
41	rm $(LIBC_DIR)/bundle.json
42	cd $(LIBC_DIR) && git checkout 6227345be13b537704a72fc59ebf1735271b52d2 && cd -
43	$(Q)bash $(LIBCHCORE_SCRIPTS_DIR)/do_override_dir.sh $(LIBCHCORE_OVERRIDES_DIR) $(LIBC_DIR) \
44	&& bash $(LIBCHCORE_SCRIPTS_DIR)/do_patch_dir.sh $(LIBCHCORE_PATCHES_DIR) $(LIBC_DIR) \
45	&& cd $(LIBC_DIR) \
46	&& ./configure --prefix=$(LIBC_DIR)/install \
47		--syslibdir=$(LIBC_DIR)/lib \
48		--target=$(CHCORE_CROSS_COMPILE) \
49		--with-malloc=oldmalloc \
50		COMPILER_DIR=$(CHCORE_COMPILER_DIR) \
51		COMPILER=$(CHCORE_COMPILER_DIR)/bin/$(CHCORE_COMPILER) \
52		CROSS_COMPILE=$(CHCORE_COMPILER_DIR)/bin/llvm- \
53		CFLAGS="$(CONFIG_FLAGS) -I$(LIBCHCORE_ARCH_INCLUDES_DIR) -Wno-int-conversion" \
54	&& make -j$(shell nproc) > /dev/null \
55	&& make install
56
57# common flags for userspace targets (libs, system servers and apps)
58override CC := $(LIBC_DIR)/install/bin/musl-clang
59override AR := $(LIBC_DIR)/install/bin/musl-ar
60override OBJCOPY := $(CHCORE_COMPILER_DIR)/bin/llvm-objcopy
61override OBJDUMP := $(CHCORE_COMPILER_DIR)/bin/llvm-objdump
62override RANLIB := $(CHCORE_COMPILER_DIR)/bin/llvm-ranlib
63override DEFAULT_CFLAGS = -Wall -O3 $(CONFIG_FLAGS) \
64	-I$(realpath user/chcore-libs/sys-libs/libohtee/include)
65
66# bounds checking function
67SECURE_FUNCTION_OPTION = -fPIC -fstack-protector-all -Wformat=2 \
68			 -Wfloat-equal -Wshadow -Wconversion \
69			 -Wformat-security -Wextra \
70			 --param ssp-buffer-size=4 -Warray-bounds \
71			 -Wpointer-arith -Wcast-qual -Wstrict-prototypes \
72			 -Wstrict-overflow=1 -Wstrict-aliasing=2 \
73			 -Wswitch -Wswitch-default -Wmissing-prototypes \
74			 -I$(SECURE_FUNCTION_DIR)/include \
75			 -I$(SECURE_FUNCTION_SOURCE_DIR) \
76			 -I$(LIBC_DIR)/install/include
77
78SECURE_FUNCTION_CFLAG = -Wall -DNDEBUG -O2 $(SECURE_FUNCTION_OPTION)
79
80SECURE_FUNCTION_SOURCE_DIR=$(SECURE_FUNCTION_DIR)/src/
81SECURE_FUNCTION_SOURCES=$(patsubst $(SECURE_FUNCTION_SOURCE_DIR)/%,%,$(wildcard $(SECURE_FUNCTION_SOURCE_DIR)/*.c))
82SECURE_FUNCTION_OBJ_DIR := secure_obj
83SECURE_FUNCTION_OBJS := $(patsubst %.c,$(SECURE_FUNCTION_OBJ_DIR)/%.o,$(SECURE_FUNCTION_SOURCES))
84
85$(SECURE_FUNCTION_OBJ_DIR)/%.o: $(SECURE_FUNCTION_SOURCE_DIR)/%.c libc
86	$(CHCORE_COMPILER_DIR)/bin/$(CHCORE_COMPILER) --target=aarch64-linux-gnu $(SECURE_FUNCTION_CFLAG) -c $< -o $@
87
88$(SECURE_FUNCTION_OBJ_DIR):
89	mkdir -p $(SECURE_FUNCTION_OBJ_DIR)
90
91
92
93# link things together: musl-libc, libohtee and secure function
94srcdir = user/chcore-libc/musl-libc
95
96MALLOC_DIR = oldmalloc
97ARCH = aarch64
98SRC_DIRS = $(addprefix $(srcdir)/,src/* src/malloc/$(MALLOC_DIR) crt ldso)
99BASE_GLOBS = $(addsuffix /*.c,$(SRC_DIRS))
100ARCH_GLOBS = $(addsuffix /$(ARCH)/*.[csS],$(SRC_DIRS))
101BASE_SRCS = $(sort $(wildcard $(BASE_GLOBS)))
102ARCH_SRCS = $(sort $(wildcard $(ARCH_GLOBS)))
103BASE_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(BASE_SRCS)))
104ARCH_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(ARCH_SRCS)))
105REPLACED_OBJS = $(sort $(subst /$(ARCH)/,/,$(ARCH_OBJS)))
106OBJS = $(addprefix obj/, $(filter-out $(REPLACED_OBJS), $(sort $(BASE_OBJS) $(ARCH_OBJS))))
107
108ALL_OBJS = $(addprefix $(srcdir)/,$(OBJS))
109LIBC_OBJS = $(filter $(srcdir)/obj/src/%,$(ALL_OBJS)) $(filter $(srcdir)/obj/compat/%,$(ALL_OBJS))
110LDSO_OBJS = $(filter $(srcdir)/obj/ldso/%,$(ALL_OBJS:%.o=%.lo))
111CRT_OBJS = $(filter $(srcdir)/obj/crt/%,$(ALL_OBJS))
112
113AOBJS = $(LIBC_OBJS)
114LOBJS = $(LIBC_OBJS:.o=.lo)
115CFLAGS_ALL = -std=c99 -ffreestanding -nostdinc -D_XOPEN_SOURCE=700 -Os -pipe
116libc_shared: libc libohtee.so $(SECURE_FUNCTION_OBJ_DIR) $(SECURE_FUNCTION_OBJS)
117	${CHCORE_COMPILER_DIR}/bin/${CHCORE_COMPILER} --target=aarch64-linux-gnu -fuse-ld=lld $(CFLAGS_ALL) -nostdlib -shared \
118	-Wl,-e,_dlstart -o libc_shared.so $(LOBJS) $(LDSO_OBJS) -L${CHCORE_COMPILER_DIR}/lib/clang/current/lib/aarch64-linux-ohos/ -lclang_rt.builtins $(SECURE_FUNCTION_OBJS) $(LIB_OHTEE_OBJS)
119	$(shell mkdir -p ramdisk-dir)
120	$(Q)cp libc_shared.so ramdisk-dir
121
122
123# flags for libs
124# shared and static compile flags
125override DEFAULT_LIB_CFLAGS := $(DEFAULT_CFLAGS) -fPIC
126# shared link flags
127override DEFAULT_SHARED_LIB_LDFLAGS := $(DEFAULT_LDFLAGS)  -fPIC -shared
128
129# flags for system servers and apps
130# shared and static compile flags
131override DEFAULT_USER_CFLAGS := $(DEFAULT_CFLAGS) -fPIE
132# dynamic link flags
133override DEFAULT_DYNAMIC_USER_LDFLAGS := $(DEFAULT_LDFLAGS) -pie
134# static link flags
135override DEFAULT_STATIC_USER_LDFLAGS := $(DEFAULT_LDFLAGS) -static
136
137LIB_DIR := $(realpath user/chcore-libs/sys-libs)
138SERVER_DIR := $(realpath user/system-services/system-servers)
139ROOT_DIR := $(realpath .)
140
141USER_MAKE_PARAM := CC=$(CC) \
142				   AR=$(AR) \
143				   OBJCOPY=$(OBJCOPY) \
144				   OBJDUMP=$(OBJDUMP) \
145				   RANLIB=$(RANLIB) \
146				   DEFAULT_LIB_CFLAGS="$(DEFAULT_LIB_CFLAGS)" \
147				   DEFAULT_SHARED_LIB_LDFLAGS="$(DEFAULT_SHARED_LIB_LDFLAGS)" \
148				   DEFAULT_USER_CFLAGS="$(DEFAULT_USER_CFLAGS)" \
149				   DEFAULT_DYNAMIC_USER_LDFLAGS="$(DEFAULT_DYNAMIC_USER_LDFLAGS)" \
150				   DEFAULT_STATIC_USER_LDFLAGS="$(DEFAULT_STATIC_USER_LDFLAGS)" \
151				   LIB_DIR=$(LIB_DIR) \
152				   SERVER_DIR=$(SERVER_DIR) \
153				   ROOT_DIR=$(ROOT_DIR) \
154				   Q=$(Q)
155
156USER_TARGETS := libfs_base.a libohtee.so
157USER_TARGETS += tmpfs.srv chanmgr.srv fsm.srv procmgr
158USER_TARGET_DIR_MAP := \
159			libohtee.so=$(LIB_DIR)/libohtee \
160			libfs_base.a=$(SERVER_DIR)/fs_base \
161			tmpfs.srv=$(SERVER_DIR)/tmpfs \
162			chanmgr.srv=$(SERVER_DIR)/chanmgr \
163			fsm.srv=$(SERVER_DIR)/fsm \
164			procmgr=$(SERVER_DIR)/procmgr
165
166.PHONY: ramdisk user $(USER_TARGETS) clean
167
168define target_dir
169	$(word 2,$(subst =, ,$(filter $(1)=%,$(USER_TARGET_DIR_MAP))))
170endef
171
172# declare dependencies betwee libs, system servers and apps
173# ramdisk indicates which targets should be put in the ramdisk
174ramdisk: libohtee.so chanmgr.srv
175	$(shell mkdir -p ramdisk-dir)
176	$(Q)cp $(foreach target,$^,$(call target_dir,$(target))/$(target)) ramdisk-dir
177
178tmpfs.srv: ramdisk libfs_base.a libc_shared
179procmgr: fsm.srv tmpfs.srv
180
181# make all targets
182user: $(USER_TARGETS)
183$(USER_TARGETS): libc
184	make $(USER_MAKE_PARAM) -C $(call target_dir,$@) $@
185
186# kernel
187KERNEL_MAKE_PARAM := PROCMGR=$(SERVER_DIR)/procmgr/procmgr \
188					 Q=$(Q)
189
190.PHONY: kernel
191kernel: procmgr libc_shared
192	$(Q)make $(KERNEL_MAKE_PARAM) -C kernel CC=$(CHCORE_COMPILER_DIR)/bin/$(CHCORE_COMPILER)
193
194# related to clean
195clean-user-%:
196	make $(USER_MAKE_PARAM) -C $(call target_dir,$*) clean
197
198clean: $(addprefix clean-user-,$(USER_TARGETS))
199	$(Q)rm -rf ramdisk-dir
200	$(Q)make $(KERNEL_MAKE_PARAM) -C kernel clean
201	$(Q)rm -rf $(LIBC_DIR)
202	$(Q)rm -rf $(SECURE_FUNCTION_OBJ_DIR)
203	$(Q)rm -f libc_shared.so
204