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