| # Copyright (C) 2017-2019 Baidu, Inc. All Rights Reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # |
| # * Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # * Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in |
| # the documentation and/or other materials provided with the |
| # distribution. |
| # * Neither the name of Baidu, Inc., nor the names of its |
| # contributors may be used to endorse or promote products derived |
| # from this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| # |
| |
| ######## SGX SDK Settings ######## |
| |
| SGX_SDK ?= /opt/intel/sgxsdk |
| SGX_MODE ?= HW |
| SGX_ARCH ?= x64 |
| |
| ifeq ($(shell getconf LONG_BIT), 32) |
| SGX_ARCH := x86 |
| else ifeq ($(findstring -m32, $(CXXFLAGS)), -m32) |
| SGX_ARCH := x86 |
| endif |
| |
| ifeq ($(SGX_ARCH), x86) |
| SGX_COMMON_CFLAGS := -m32 |
| SGX_LIBRARY_PATH := $(SGX_SDK)/lib |
| SGX_ENCLAVE_SIGNER := $(SGX_SDK)/bin/x86/sgx_sign |
| SGX_EDGER8R := $(SGX_SDK)/bin/x86/sgx_edger8r |
| else |
| SGX_COMMON_CFLAGS := -m64 |
| SGX_LIBRARY_PATH := $(SGX_SDK)/lib64 |
| SGX_ENCLAVE_SIGNER := $(SGX_SDK)/bin/x64/sgx_sign |
| SGX_EDGER8R := $(SGX_SDK)/bin/x64/sgx_edger8r |
| endif |
| |
| ifeq ($(SGX_DEBUG), 1) |
| ifeq ($(SGX_PRERELEASE), 1) |
| $(error Cannot set SGX_DEBUG and SGX_PRERELEASE at the same time!!) |
| endif |
| endif |
| |
| |
| ifeq ($(SGX_DEBUG), 1) |
| SGX_COMMON_CFLAGS += -O0 -g |
| else |
| SGX_COMMON_CFLAGS += -O2 |
| endif |
| |
| ######## CUSTOM Settings ######## |
| |
| CUSTOM_LIBRARY_PATH := ./lib |
| CUSTOM_BIN_PATH := ./bin |
| CUSTOM_EDL_PATH := ../../edl |
| CUSTOM_COMMON_PATH := ../../common |
| |
| ######## EDL Settings ######## |
| |
| Enclave_EDL_Files := enclave/Enclave_t.c enclave/Enclave_t.h app/Enclave_u.c app/Enclave_u.h |
| |
| ######## protobuf Settings ######## |
| |
| Proto_File := ./person.proto |
| Proto_RS_Files := ./app/src/person.rs ./enclave/src/person.rs |
| |
| ######## APP Settings ######## |
| |
| App_Rust_Flags := --release |
| App_Include_Paths := -I ./app -I./include -I$(SGX_SDK)/include -I$(CUSTOM_EDL_PATH) |
| App_C_Flags := $(SGX_COMMON_CFLAGS) -fPIC -Wno-attributes $(App_Include_Paths) |
| |
| App_Rust_Path := ./app/target/release |
| App_Enclave_u_Object :=app/libEnclave_u.a |
| App_Name := bin/app |
| |
| ######## Enclave Settings ######## |
| |
| ifneq ($(SGX_MODE), HW) |
| Trts_Library_Name := sgx_trts_sim |
| Service_Library_Name := sgx_tservice_sim |
| else |
| Trts_Library_Name := sgx_trts |
| Service_Library_Name := sgx_tservice |
| endif |
| Crypto_Library_Name := sgx_tcrypto |
| KeyExchange_Library_Name := sgx_tkey_exchange |
| ProtectedFs_Library_Name := sgx_tprotected_fs |
| |
| RustEnclave_C_Files := $(wildcard ./enclave/*.c) |
| RustEnclave_C_Objects := $(RustEnclave_C_Files:.c=.o) |
| RustEnclave_Include_Paths := -I$(CUSTOM_COMMON_PATH)/inc -I$(CUSTOM_EDL_PATH) -I$(SGX_SDK)/include -I$(SGX_SDK)/include/tlibc -I$(SGX_SDK)/include/stlport -I$(SGX_SDK)/include/epid -I ./enclave -I./include |
| |
| RustEnclave_Link_Libs := -L$(CUSTOM_LIBRARY_PATH) -lcompiler-rt-patch -lenclave |
| RustEnclave_Compile_Flags := $(SGX_COMMON_CFLAGS) -nostdinc -fvisibility=hidden -fpie -fstack-protector $(RustEnclave_Include_Paths) |
| RustEnclave_Link_Flags := $(SGX_COMMON_CFLAGS) -Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfiles -L$(SGX_LIBRARY_PATH) \ |
| -Wl,--whole-archive -l$(Trts_Library_Name) -Wl,--no-whole-archive \ |
| -Wl,--start-group -lsgx_tstdc -lsgx_tcxx -l$(Service_Library_Name) -l$(Crypto_Library_Name) $(RustEnclave_Link_Libs) -Wl,--end-group \ |
| -Wl,-Bstatic -Wl,-Bsymbolic -Wl,--no-undefined \ |
| -Wl,-pie,-eenclave_entry -Wl,--export-dynamic \ |
| -Wl,--defsym,__ImageBase=0 \ |
| -Wl,--gc-sections \ |
| -Wl,--version-script=enclave/Enclave.lds |
| |
| RustEnclave_Name := enclave/enclave.so |
| Signed_RustEnclave_Name := bin/enclave.signed.so |
| |
| .PHONY: all |
| all: $(App_Name) $(Signed_RustEnclave_Name) |
| |
| ######## EDL Objects ######## |
| |
| $(Enclave_EDL_Files): $(SGX_EDGER8R) enclave/Enclave.edl |
| $(SGX_EDGER8R) --trusted enclave/Enclave.edl --search-path $(SGX_SDK)/include --search-path ../../edl --trusted-dir enclave |
| $(SGX_EDGER8R) --untrusted enclave/Enclave.edl --search-path $(SGX_SDK)/include --search-path ../../edl --untrusted-dir app |
| @echo "GEN => $(Enclave_EDL_Files)" |
| |
| ####### protobuf ####### |
| |
| $(Proto_RS_Files): $(Proto_File) |
| protoc --rust_out ./app/src $(Proto_File) |
| protoc --rust_out ./enclave/src $(Proto_File) |
| sed -i -e 's/#!\[allow(unused_results)\]/#!\[allow(unused_results)\]\n\nuse std::prelude::v1::*;\n/g' ./enclave/src/person.rs |
| |
| ######## App Objects ######## |
| |
| app/Enclave_u.o: $(Enclave_EDL_Files) |
| @$(CC) $(App_C_Flags) -c app/Enclave_u.c -o $@ |
| @echo "CC <= $<" |
| |
| $(App_Enclave_u_Object): app/Enclave_u.o |
| $(AR) rcsD $@ $^ |
| cp $(App_Enclave_u_Object) ./lib |
| |
| $(App_Name): $(App_Enclave_u_Object) $(Proto_RS_Files) |
| @cd app && SGX_SDK=$(SGX_SDK) cargo build $(App_Rust_Flags) |
| @echo "Cargo => $@" |
| mkdir -p bin |
| cp $(App_Rust_Path)/app ./bin |
| |
| ######## Enclave Objects ######## |
| |
| enclave/Enclave_t.o: $(Enclave_EDL_Files) |
| @$(CC) $(RustEnclave_Compile_Flags) -c enclave/Enclave_t.c -o $@ |
| @echo "CC <= $<" |
| |
| $(RustEnclave_Name): enclave compiler-rt enclave/Enclave_t.o |
| cp ../../compiler-rt/libcompiler-rt-patch.a ./lib |
| @$(CXX) enclave/Enclave_t.o -o $@ $(RustEnclave_Link_Flags) |
| @echo "LINK => $@" |
| |
| $(Signed_RustEnclave_Name): $(RustEnclave_Name) |
| mkdir -p bin |
| @$(SGX_ENCLAVE_SIGNER) sign -key enclave/Enclave_private.pem -enclave $(RustEnclave_Name) -out $@ -config enclave/Enclave.config.xml |
| @echo "SIGN => $@" |
| |
| .PHONY: enclave |
| enclave: $(Proto_RS_FILES) |
| $(MAKE) -C ./enclave/ |
| |
| .PHONY: compiler-rt |
| compiler-rt: |
| $(MAKE) -C ../../compiler-rt/ 2> /dev/null |
| |
| .PHONY: clean |
| clean: |
| @rm -f $(App_Name) $(RustEnclave_Name) $(Signed_RustEnclave_Name) enclave/*_t.* app/*_u.* lib/*.a $(Proto_RS_Files) |
| @cd enclave && cargo clean && rm -f Cargo.lock |
| @cd app && cargo clean && rm -f Cargo.lock |
| |