215 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
include ../sgxenv.mk
 | 
						|
 | 
						|
# An overview of the build process
 | 
						|
#
 | 
						|
# The target library:
 | 
						|
#     libocclum-libos.so
 | 
						|
#
 | 
						|
# The intermediate libraries:
 | 
						|
#     libocclum-libos-core.a
 | 
						|
#     libocclum_libos_core_rs.a
 | 
						|
#
 | 
						|
# Diagram:
 | 
						|
#
 | 
						|
# +-------------------+
 | 
						|
# |LibOS (Enclave)<--------+ libocclum-libos.so
 | 
						|
# | +---------------| |
 | 
						|
# | |LibOS Core <----------+ libocclum-libos-core.a
 | 
						|
# | |  +----------| | |
 | 
						|
# | |  |Rust <-------------+ libocclum_libos_core_rs.a
 | 
						|
# | |  +----------+ | |      (Rust forbids the use of hypens in library names)
 | 
						|
# | |  |C         | | |
 | 
						|
# | |  +----------+ | |
 | 
						|
# | |  |Assembly  | | |
 | 
						|
# | |  +----------+ | |
 | 
						|
# | +---------------+ |
 | 
						|
# | |Rust SGX SDK <-----+
 | 
						|
# | +---------------| | +--+ Dependencies
 | 
						|
# | |Intel SGX SDK<-----+
 | 
						|
# | +---------------| |
 | 
						|
# +-------------------+
 | 
						|
 | 
						|
# The log level for LibOS
 | 
						|
#
 | 
						|
# There are five levels:
 | 
						|
# 1 - error
 | 
						|
# 2 - warn
 | 
						|
# 3 - info
 | 
						|
# 4 - debug
 | 
						|
# 5 - trace
 | 
						|
#
 | 
						|
# By setting the log level to a specific value (say warn), all log messages
 | 
						|
# whose levels are no greater than the value (error and warn <= warn) will
 | 
						|
# be printed.
 | 
						|
LIBOS_LOG ?= error
 | 
						|
 | 
						|
LIBOS_SONAME := libocclum-libos.so.$(MAJOR_VER_NUM)
 | 
						|
 | 
						|
LIBOS_FEATURES :=
 | 
						|
 | 
						|
ifeq ($(SGX_MODE), HW)
 | 
						|
	LIBOS_CORE_LIB_NAME := occlum-libos-core
 | 
						|
	LIBOS_SO_REAL := $(BUILD_DIR)/lib/libocclum-libos.so.$(VERSION_NUM)
 | 
						|
	LIBOS_FEATURES += pku
 | 
						|
else ifeq ($(SGX_MODE), HYPER)
 | 
						|
	LIBOS_CORE_LIB_NAME := occlum-libos-core_hyper
 | 
						|
	LIBOS_SO_REAL := $(BUILD_DIR)/lib/libocclum-libos_hyper.so.$(VERSION_NUM)
 | 
						|
	OCCLUM_DISABLE_DCAP := 1
 | 
						|
else
 | 
						|
	LIBOS_CORE_LIB_NAME := occlum-libos-core_sim
 | 
						|
	LIBOS_SO_REAL := $(BUILD_DIR)/lib/libocclum-libos_sim.so.$(VERSION_NUM)
 | 
						|
endif
 | 
						|
 | 
						|
LIBOS_CORE_A := $(OBJ_DIR)/libos/lib/lib$(LIBOS_CORE_LIB_NAME).a
 | 
						|
LIBOS_CORE_RS_A := $(OBJ_DIR)/libos/lib/libocclum_libos_core_rs.a
 | 
						|
 | 
						|
# All source code
 | 
						|
RUST_SRCS := $(wildcard src/*.rs src/*/*.rs src/*/*/*.rs src/*/*/*/*.rs src/*/*/*/*/*.rs)
 | 
						|
RUST_TARGET_DIR := $(OBJ_DIR)/libos/cargo-target
 | 
						|
RUST_OUT_DIR := $(OBJ_DIR)/libos/lib
 | 
						|
EDL_C_SRCS := $(addprefix $(OBJ_DIR)/libos/,$(SRC_OBJ)/Enclave_t.c $(SRC_OBJ)/Enclave_t.h)
 | 
						|
EDL_C_OBJS := $(addprefix $(OBJ_DIR)/libos/,$(SRC_OBJ)/Enclave_t.o)
 | 
						|
C_SRCS := $(sort $(wildcard src/*.c src/*/*.c src/*/*/*.c))
 | 
						|
CXX_SRCS := $(sort $(wildcard src/*.cpp src/*/*.cpp))
 | 
						|
S_SRCS := $(sort $(wildcard src/*.S src/*/*.S src/*/*/*.S))
 | 
						|
C_OBJS := $(addprefix $(OBJ_DIR)/libos/,$(C_SRCS:.c=.o))
 | 
						|
CXX_OBJS := $(addprefix $(OBJ_DIR)/libos/,$(CXX_SRCS:.cpp=.o))
 | 
						|
S_OBJS := $(addprefix $(OBJ_DIR)/libos/,$(S_SRCS:.S=.o))
 | 
						|
 | 
						|
# Object files for simulation mode are stored in libos/src_sim
 | 
						|
ifeq ($(SGX_MODE), SIM)
 | 
						|
	C_OBJS := $(subst libos/src,libos/src_sim,$(C_OBJS))
 | 
						|
	CXX_OBJS := $(subst libos/src,libos/src_sim,$(CXX_OBJS))
 | 
						|
	S_OBJS := $(subst libos/src,libos/src_sim,$(S_OBJS))
 | 
						|
else ifeq ($(SGX_MODE), HYPER)
 | 
						|
	C_OBJS := $(subst libos/src,libos/src_hyper,$(C_OBJS))
 | 
						|
	CXX_OBJS := $(subst libos/src,libos/src_hyper,$(CXX_OBJS))
 | 
						|
	S_OBJS := $(subst libos/src,libos/src_hyper,$(S_OBJS))
 | 
						|
endif
 | 
						|
 | 
						|
ALL_BUILD_SUBDIRS := $(sort $(patsubst %/,%,$(dir $(LIBOS_SO_REAL) $(EDL_C_OBJS) $(C_OBJS) $(CXX_OBJS) $(S_OBJS)) $(RUST_TARGET_DIR) $(RUST_OUT_DIR)))
 | 
						|
 | 
						|
C_COMMON_FLAGS := -fno-stack-protector -I./include/
 | 
						|
# SGX GDB support
 | 
						|
C_COMMON_FLAGS += -g
 | 
						|
C_FLAGS := $(SGX_CFLAGS_T) $(C_COMMON_FLAGS)
 | 
						|
CXX_FLAGS := $(SGX_CXXFLAGS_T) $(C_COMMON_FLAGS)
 | 
						|
 | 
						|
_Other_Link_Flags := -L$(RUST_SGX_SDK_DIR)/compiler-rt/ -L$(BUILD_DIR)/lib -L$(RUST_OUT_DIR)
 | 
						|
_Other_Enclave_Libs := -l$(LIBOS_CORE_LIB_NAME) -lsgx_tprotected_fs
 | 
						|
ifndef OCCLUM_DISABLE_DCAP
 | 
						|
_Other_Enclave_Libs += -lsgx_dcap_tvl
 | 
						|
endif
 | 
						|
LINK_FLAGS := $(SGX_LFLAGS_T)
 | 
						|
 | 
						|
.PHONY: all clean format format-c format-rust format-check format-check-c format-check-rust gen_cov_report
 | 
						|
all: $(ALL_BUILD_SUBDIRS) $(LIBOS_SO_REAL)
 | 
						|
 | 
						|
$(ALL_BUILD_SUBDIRS):
 | 
						|
	@mkdir -p $@
 | 
						|
 | 
						|
LIBOS_SO_DEPS := $(LIBOS_CORE_A) $(LIBCOMPILER_RT_PATCH_A)
 | 
						|
 | 
						|
$(LIBOS_SO_REAL): $(LIBOS_CORE_A) $(LIBCOMPILER_RT_PATCH_A)
 | 
						|
	@$(CC) $(LIBOS_SO_DEPS) -o $@ $(LINK_FLAGS) -Wl,-soname=$(LIBOS_SONAME)
 | 
						|
	@echo "LINK => $@"
 | 
						|
 | 
						|
$(LIBOS_CORE_A): $(LIBOS_CORE_RS_A) $(C_OBJS) $(CXX_OBJS) $(S_OBJS) $(EDL_C_OBJS)
 | 
						|
	@cp $(LIBOS_CORE_RS_A) $(LIBOS_CORE_A)
 | 
						|
	@ar r $@ $(C_OBJS) $(CXX_OBJS) $(S_OBJS) $(EDL_C_OBJS)
 | 
						|
	@echo "GEN => $@"
 | 
						|
 | 
						|
ifneq (, $(shell which sccache))
 | 
						|
    RUSTC_WRAPPER := sccache
 | 
						|
else
 | 
						|
    RUSTC_WRAPPER :=
 | 
						|
endif
 | 
						|
 | 
						|
ifndef OCCLUM_DISABLE_DCAP
 | 
						|
    LIBOS_FEATURES += dcap
 | 
						|
endif
 | 
						|
 | 
						|
ifneq ($(OCCLUM_COV),)
 | 
						|
    LIBOS_FEATURES += cov
 | 
						|
    COV_FLAGS += "-Zprofile -Ccodegen-units=1 \
 | 
						|
        -Cllvm_args=-inline-threshold=0 -Clink-dead-code \
 | 
						|
        -Cpanic=abort"
 | 
						|
endif
 | 
						|
 | 
						|
ifeq ($(SGX_MODE), HYPER)
 | 
						|
    LIBOS_FEATURES += hyper_mode
 | 
						|
endif
 | 
						|
 | 
						|
# Release build is for production use. We enable code coverage only for debug
 | 
						|
# build.  It also simplifies the implementation as the release and debug build
 | 
						|
# have different output paths.
 | 
						|
ifeq ($(OCCLUM_RELEASE_BUILD), 1)
 | 
						|
$(LIBOS_CORE_RS_A): $(RUST_SRCS)
 | 
						|
	@RUSTC_BOOTSTRAP=1 RUSTC_WRAPPER=$(RUSTC_WRAPPER) cargo build --release --target-dir=$(RUST_TARGET_DIR) -Z unstable-options --out-dir=$(RUST_OUT_DIR) --features "$(LIBOS_FEATURES)"
 | 
						|
	@echo "CARGO (release) => $@"
 | 
						|
else ifneq ($(OCCLUM_COV),)
 | 
						|
$(LIBOS_CORE_RS_A): $(RUST_SRCS)
 | 
						|
	@CARGO_INCREMENTAL=0 RUSTC_BOOTSTRAP=1 RUSTFLAGS=$(COV_FLAGS) cargo build --target-dir=$(RUST_TARGET_DIR) -Z unstable-options --out-dir=$(RUST_OUT_DIR) --features "$(LIBOS_FEATURES)"
 | 
						|
	@echo "CARGO (debug + cov) => $@"
 | 
						|
else
 | 
						|
$(LIBOS_CORE_RS_A): $(RUST_SRCS)
 | 
						|
	@RUSTC_BOOTSTRAP=1 RUSTC_WRAPPER=$(RUSTC_WRAPPER) cargo build --target-dir=$(RUST_TARGET_DIR) -Z unstable-options --out-dir=$(RUST_OUT_DIR) --features "$(LIBOS_FEATURES)"
 | 
						|
	@echo "CARGO (debug) => $@"
 | 
						|
endif
 | 
						|
 | 
						|
$(OBJ_DIR)/libos/$(SRC_OBJ)/Enclave_t.o: $(OBJ_DIR)/libos/$(SRC_OBJ)/Enclave_t.c
 | 
						|
	@$(CC) $(C_FLAGS) -Iinclude/edl -c $< -o $@
 | 
						|
	@echo "CC <= $@"
 | 
						|
 | 
						|
$(OBJ_DIR)/libos/$(SRC_OBJ)/Enclave_t.c: $(SGX_EDGER8R) ../Enclave.edl
 | 
						|
	@cd $(OBJ_DIR)/libos/$(SRC_OBJ) && $(SGX_EDGER8R) $(SGX_EDGER8R_MODE) --trusted $(CUR_DIR)/../Enclave.edl --search-path $(SGX_SDK)/include --search-path $(RUST_SGX_SDK_DIR)/edl
 | 
						|
	@echo "GEN <= $@"
 | 
						|
 | 
						|
$(C_OBJS):$(OBJ_DIR)/libos/$(SRC_OBJ)/%.o: src/%.c
 | 
						|
	@$(CC) $(C_FLAGS) -c $< -o $@
 | 
						|
	@echo "CC <= $@"
 | 
						|
 | 
						|
$(CXX_OBJS): $(OBJ_DIR)/libos/$(SRC_OBJ)/%.o: src/%.cpp
 | 
						|
	@$(CXX) $(CXX_FLAGS) -c $< -o $@
 | 
						|
	@echo "CXX <= $@"
 | 
						|
 | 
						|
$(S_OBJS):$(OBJ_DIR)/libos/$(SRC_OBJ)/%.o: src/%.S
 | 
						|
	@$(CC) $(C_FLAGS) -c $< -o $@
 | 
						|
	@echo "AS <= $@"
 | 
						|
 | 
						|
format: format-c format-rust
 | 
						|
 | 
						|
format-c: $(C_SRCS) $(CXX_SRCS)
 | 
						|
	@$(C_FORMATTER) $^
 | 
						|
 | 
						|
format-rust: $(RUST_SRCS)
 | 
						|
	@$(call format-rust)
 | 
						|
 | 
						|
format-check: format-check-c format-check-rust
 | 
						|
 | 
						|
format-check-c: $(C_SRCS) $(CXX_SRCS)
 | 
						|
	@$(C_FORMATTER) --check $^
 | 
						|
 | 
						|
format-check-rust: $(RUST_SRCS)
 | 
						|
	@$(call format-check-rust)
 | 
						|
 | 
						|
COV_TARGET_DIR := $(RUST_TARGET_DIR)/debug/deps
 | 
						|
DEPS_DIR := $(shell pwd)/../../deps
 | 
						|
LLVM_GCOV := $(DEPS_DIR)/rust-sgx-sdk/samplecode/sgx-cov/enclave/llvm-gcov
 | 
						|
ALL_TAG_INFO := all.tag.info
 | 
						|
FINAL_INFO := final.info
 | 
						|
COV_REPORT := cov_report
 | 
						|
 | 
						|
gen_cov_report:
 | 
						|
	# The path of the rust source code is relative in .d file, so gcov will
 | 
						|
	# look for the source code under COV_TARGET_DIR.
 | 
						|
	ln -sf $(shell pwd)/src $(COV_TARGET_DIR)/src
 | 
						|
	lcov --gcov-tool $(LLVM_GCOV) --rc lcov_branch_coverage=1 --rc lcov_excl_line=assert --exclude 'occlum/deps' --capture --directory ${COV_TARGET_DIR} -o $(ALL_TAG_INFO)
 | 
						|
	lcov --gcov-tool $(LLVM_GCOV) --rc lcov_branch_coverage=1 --rc lcov_excl_line=assert --extract $(ALL_TAG_INFO) `find -L $(COV_TARGET_DIR) -name *.rs` -o $(FINAL_INFO)
 | 
						|
	genhtml --branch-coverage --demangle-cpp --legend $(FINAL_INFO) -o $(COV_REPORT) --ignore-errors source
 | 
						|
 | 
						|
clean:
 | 
						|
	@-$(RM) -rf $(OBJ_DIR)/libos
 | 
						|
	@-$(RM) -f $(LIBOS_SO_REAL)
 | 
						|
	@-$(RM) -rf $(ALL_TAG_INFO) $(FINAL_INFO) $(COV_REPORT)
 |