blob: 22ce5623e27ae561efb20bef28b3a122d300fe17 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
cmake_minimum_required(VERSION 3.10)
project(Teaclave C)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(TeaclaveUtils)
include(ExternalProject)
find_package(PkgConfig QUIET)
if (NOT PkgConfig_FOUND)
message(FATAL_ERROR "PkgConfig is not found.")
endif()
find_package(Git)
find_package(OpenSSL)
check_exe_dependencies(rustup pypy)
pkg_check_modules(INTEL_SGX_SDK QUIET libsgx_urts>=2.17.101.1)
if(NOT INTEL_SGX_SDK_FOUND)
message(FATAL_ERROR "Intel SGX SDK (version 2.17.1) is not found or version not matched.")
endif()
# ====== VARIABLES FOR CMAKE -D{VAR}=VAL CONFIGURATION BEGIN ======
set_strvar_from_env_or(SGX_SDK "/opt/sgxsdk" "Path of SGX SDK")
set_strvar_from_env_or(RUSTFLAGS "" "Rust flags")
set_strvar_from_env_or(TEACLAVE_CMAKE_DBG ""
"set to turn on debug message for cmake")
set(MESAPY_VERSION v1.0.0-sgx)
set(RUSTUP_TOOLCHAIN "nightly-2022-10-22")
option(COV "Turn on/off coverage" OFF)
option(OFFLINE "Turn on/off cargo offline" OFF)
option(TEST_MODE "Turn on/off test mode" OFF)
option(SGX_SIM_MODE "Turn on/off sgx simulation mode" OFF)
option(DCAP "Turn on/off DCAP attestation" OFF)
option(GIT_SUBMODULE "Check submodules during build" ON)
option(USE_PREBUILT_MESAPY "Use prebuilt MesaPy SGX executor" ON)
option(EXECUTOR_BUILTIN "Compile with the Builtin executor" ON)
option(EXECUTOR_MESAPY "Compile with the MesaPy executor" ON)
option(EXECUTOR_WAMR "Compile with the WebAssembly Micro Runtime executor" ON)
init_submodules()
if(DCAP)
set(RUSTFLAGS "${RUSTFLAGS} --cfg dcap")
endif()
if(TEST_MODE)
set(RUSTFLAGS "${RUSTFLAGS} --cfg test_mode")
endif()
if(SGX_SIM_MODE)
set(RUSTFLAGS "${RUSTFLAGS} --cfg sgx_sim")
set(SGX_MODE "SW")
else()
set(SGX_MODE "HW")
endif()
if(EXECUTOR_BUILTIN)
set(RUSTFLAGS "${RUSTFLAGS} --cfg executor_builtin")
endif()
if(EXECUTOR_MESAPY)
set(RUSTFLAGS "${RUSTFLAGS} --cfg executor_mesapy")
endif()
if(EXECUTOR_WAMR)
set(RUSTFLAGS "${RUSTFLAGS} --cfg executor_wamr")
endif()
# ======= VARIABLES FOR CMAKE -D{VAR}=VAL CONFIGURATION END =======
# =============== VARIABLES FOR MANUAL CHANGE BEGIN ===============
set(UNIX_LIBS teaclave_sdk protected_fs_rs)
# ================ VARIABLES FOR MANUAL CHANGE END ================
# UNIX_APPS, SGX_APPS and SGX_LIBS are parsed from corresponding toml files
parse_cargo_packages(
UNIX_APPS CARGO_TOML_PATH
${PROJECT_SOURCE_DIR}/cmake/tomls/Cargo.unix_app.toml CATEGORIES
UNIX_APP_CATEGORIES)
parse_cargo_packages(
SGX_APPS CARGO_TOML_PATH
${PROJECT_SOURCE_DIR}/cmake/tomls/Cargo.sgx_untrusted_app.toml CATEGORIES
SGX_APP_CATEGORIES)
parse_cargo_packages(
SGX_LIBS
CARGO_TOML_PATH
${PROJECT_SOURCE_DIR}/cmake/tomls/Cargo.sgx_trusted_lib.toml
CATEGORIES
SGX_LIB_CATEGORIES
PKG_PATHS
SGX_LIB_PATHS
EDL_NAMES
EDL_LIB_NAMES)
if(NOT TEST_MODE)
list(FILTER SGX_APPS EXCLUDE REGEX "_tests$")
list(FILTER SGX_APP_CATEGORIES EXCLUDE REGEX "tests")
list(FILTER SGX_LIBS EXCLUDE REGEX "_tests_enclave$")
list(FILTER SGX_LIB_CATEGORIES EXCLUDE REGEX "tests")
endif()
if(NOT DCAP)
list(FILTER UNIX_APPS EXCLUDE REGEX "dcap")
list(FILTER UNIX_APP_CATEGORIES EXCLUDE REGEX "dcap")
endif()
include(TeaclaveGenVars)
# ========== CONFIG-TIME CHECKS AND INITIALIZATIONS BEGIN =========
check_sgx_sdk()
generate_env_file()
# =========== CONFIG-TIME CHECKS AND INITIALIZATIONS END ==========
# UTIL TARGETS: prep, sgx-test, cov, cov-clean, format, check, doc, etc.
include(UtilTargets)
# unix_app
list(LENGTH UNIX_APPS UNIX_APP_LEN)
set(UNIX_APPS_DEPENDS prep)
math(EXPR UNIX_APP_LAST_INDEX "${UNIX_APP_LEN} - 1")
foreach(_i RANGE ${UNIX_APP_LAST_INDEX})
list(GET UNIX_APPS ${_i} _pkg_name)
list(GET UNIX_APP_CATEGORIES ${_i} _category)
add_cargo_build_target(
${_pkg_name}
TARGET_NAME
"${UNIXAPP_PREFIX}-${_pkg_name}"
TOML_DIR
${MT_UNIX_TOML_DIR}
TARGET_DIR
${UNIX_TARGET_DIR}
INSTALL_DIR
${TEACLAVE_INSTALL_DIR}/${_category}
EXTRA_CARGO_FLAGS
${EXTRA_CARGO_FLAGS}
DEPENDS
${UNIX_APPS_DEPENDS})
endforeach()
# sgx_untrusted_app
list(LENGTH SGX_APPS SGX_APP_LEN)
set(SGX_APPS_DEPENDS prep)
math(EXPR SGX_APP_LAST_INDEX "${SGX_APP_LEN} - 1")
foreach(_i RANGE ${SGX_APP_LAST_INDEX})
list(GET SGX_APPS ${_i} _pkg_name)
list(GET SGX_APP_CATEGORIES ${_i} _category)
add_cargo_build_target(
${_pkg_name}
TARGET_NAME
"${SGXAPP_PREFIX}-${_pkg_name}"
TOML_DIR
${MT_SGXAPP_TOML_DIR}
TARGET_DIR
${UNTRUSTED_TARGET_DIR}
INSTALL_DIR
${TEACLAVE_INSTALL_DIR}/${_category}
EXTRA_CARGO_FLAGS
${EXTRA_CARGO_FLAGS}
DEPENDS
${SGX_APPS_DEPENDS})
endforeach()
set(MESAPY_OUTPUTS
${TEACLAVE_OUT_DIR}/libpypy-c.a
${TEACLAVE_OUT_DIR}/libffi.a
${TEACLAVE_OUT_DIR}/libsgx_tlibc_ext.a
${TEACLAVE_OUT_DIR}/libsgx_ulibc.a
${TEACLAVE_OUT_DIR}/ffi.o
)
# WAMR library
set(WAMR_OUTPUTS
${TEACLAVE_OUT_DIR}/libvmlib.a
)
if(USE_PREBUILT_MESAPY)
add_custom_command(
OUTPUT ${MESAPY_OUTPUTS}
COMMAND
wget -qN https://github.com/mesatee/mesapy/releases/download/${MESAPY_VERSION}/mesapy-${MESAPY_VERSION}.tar.gz &&
tar xzf mesapy-${MESAPY_VERSION}.tar.gz
DEPENDS prep
WORKING_DIRECTORY ${TEACLAVE_OUT_DIR})
else()
add_custom_command(
OUTPUT ${MESAPY_OUTPUTS}
COMMAND
make sgx &&
make -C sgx/examples/exec &&
cp pypy/goal/libpypy-c.a
sgx/libffi/build_dir/lib/libffi.a
sgx/sgx_tlibc_ext/libsgx_tlibc_ext.a
sgx/sgx_ulibc/libsgx_ulibc.a
sgx/examples/exec/Enclave/src/ffi.o
${TEACLAVE_OUT_DIR}
DEPENDS prep
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/third_party/mesapy)
endif()
ExternalProject_Add(wamr_teaclave
SOURCE_DIR ${WAMR_TEACLAVE_ROOT_DIR}
BINARY_DIR ${WAMR_TEACLAVE_ROOT_DIR}/build
INSTALL_COMMAND ""
LOG_BUILD 1
)
add_custom_command(
OUTPUT ${WAMR_OUTPUTS}
DEPENDS wamr_teaclave
COMMAND
cp ${WAMR_TEACLAVE_ROOT_DIR}/build/libvmlib.a ${TEACLAVE_OUT_DIR}
WORKING_DIRECTORY ${WAMR_TEACLAVE_ROOT_DIR}/build
)
add_custom_target(mesapy
DEPENDS ${MESAPY_OUTPUTS}
)
add_custom_target(wamr
DEPENDS ${WAMR_TEACLAVE_ROOT_DIR}/CMakeLists.txt ${WAMR_OUTPUTS}
)
# mesapy components
add_custom_command(
OUTPUT ${TEACLAVE_OUT_DIR}/acs_py_enclave.c
COMMAND
env ARGS PYTHONPATH=${PROJECT_SOURCE_DIR}/third_party/mesapy/sgx
PYPY_FFI_OUTDIR=${TEACLAVE_OUT_DIR} pypy
${PROJECT_SOURCE_DIR}/services/access_control/python/ffi.py
DEPENDS prep ${PROJECT_SOURCE_DIR}/services/access_control/python/ffi.py
${PROJECT_SOURCE_DIR}/services/access_control/python/acs_engine.py
COMMENT "Generating mesapy ffi stubs")
add_library(pycomponent STATIC ${TEACLAVE_OUT_DIR}/acs_py_enclave.c)
set_target_properties(pycomponent PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
${TEACLAVE_OUT_DIR})
target_compile_definitions(pycomponent PUBLIC SGX)
if(NOT EXISTS "/usr/lib/pypy/include/Python.h")
message(
FATAL_ERROR
"pypy development package not found\nFor Ubuntu, please run `apt-get install pypy-dev`"
)
endif()
target_compile_options(pycomponent PUBLIC -UWITH_THREAD -O2 -fPIC -Wimplicit
-I/usr/lib/pypy/include)
# std Aware Cargo
set(DEFAULT_STD_PATH ${TRUSTED_TARGET_DIR}/default_std/sysroot/lib/rustlib/${SGX_LIB_TARGET}/lib)
set(COV_STD_PATH ${TRUSTED_TARGET_DIR}/cov_std/sysroot/lib/rustlib/${SGX_LIB_TARGET}/lib)
add_custom_target(
default_std
COMMAND
${CMAKE_COMMAND} -E env ${TEACLAVE_COMMON_ENVS} RUSTFLAGS=""
cargo build --target-dir ${TRUSTED_TARGET_DIR}/default_std
--features backtrace,capi,env,net,thread,untrusted_time,unsupported_process -Zbuild-std=core,alloc
--target ${RUST_SGX_SDK}/rustlib/${SGX_LIB_TARGET}.json
COMMAND
mkdir -p ${DEFAULT_STD_PATH}
COMMAND
cp -r ${TRUSTED_TARGET_DIR}/default_std/${SGX_LIB_TARGET}/${TARGET}/deps/*
${DEFAULT_STD_PATH}
DEPENDS prep
COMMENT "Building default std"
WORKING_DIRECTORY ${RUST_SGX_SDK}/rustlib/std
) # default_std
add_custom_target(
cov_std
COMMAND
${CMAKE_COMMAND} -E env ${TEACLAVE_COMMON_ENVS} RUSTFLAGS=""
cargo build --target-dir ${TRUSTED_TARGET_DIR}/cov_std
--features backtrace,capi,env,net,profiler,thread,untrusted_time,unsupported_process -Zbuild-std=core,alloc
--target ${RUST_SGX_SDK}/rustlib/${SGX_LIB_TARGET}.json
COMMAND
mkdir -p ${COV_STD_PATH}
COMMAND
cp -r ${TRUSTED_TARGET_DIR}/cov_std/${SGX_LIB_TARGET}/${TARGET}/deps/*
${COV_STD_PATH}
DEPENDS prep
COMMENT "Building cov std"
WORKING_DIRECTORY ${RUST_SGX_SDK}/rustlib/std
) # cov_std
# sgx_trusted_lib
list(LENGTH SGX_LIBS SGX_LIB_LEN)
set(SGX_LIB_DEPENDS prep mesapy pycomponent)
math(EXPR SGX_LIB_LAST_INDEX "${SGX_LIB_LEN} - 1")
foreach(_i RANGE ${SGX_LIB_LAST_INDEX})
list(GET SGX_LIBS ${_i} _pkg_name)
list(GET SGX_LIB_PATHS ${_i} _pkg_path)
list(GET SGX_LIB_CATEGORIES ${_i} _category)
list(GET EDL_LIB_NAMES ${_i} _edl_lib_name)
if(EXECUTOR_WAMR)
list(APPEND SGX_LIB_DEPENDS wamr)
endif()
if(COV)
list(APPEND SGX_LIB_DEPENDS cov_std)
else()
list(APPEND SGX_LIB_DEPENDS default_std)
endif()
add_sgx_build_target(
${_pkg_path}
${_pkg_name}
DEPENDS
${SGX_LIB_DEPENDS}
INSTALL_DIR
${TEACLAVE_INSTALL_DIR}/${_category}
EDL_LIB_NAME
${_edl_lib_name})
endforeach()
# Dylib/staticlib of Teaclave Rust Client SDK
add_cargo_build_dylib_staticlib_target(teaclave_client_sdk
TARGET_NAME "teaclave_client_sdk"
TOML_DIR ${MT_UNIX_TOML_DIR}
TARGET_DIR ${UNIX_TARGET_DIR}
DEPENDS prep)
# example/quickstart_c link_directories(${TEACLAVE_LIB_INSTALL_DIR})
# add_executable(quickstart_c
# ${TEACLAVE_PROJECT_ROOT}/examples/quickstart_c/main.c)
# add_dependencies(quickstart_c prep ${UNIXLIB_PREFIX}-teaclave_sdk_c)
# target_include_directories(quickstart_c PUBLIC
# ${TEACLAVE_PROJECT_ROOT}/teaclave_sdk/c_sdk/include/)
# target_link_libraries(quickstart_c teaclave_sdk_c) add_custom_command(TARGET
# quickstart_c POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
# ${CMAKE_CURRENT_BINARY_DIR}/quickstart_c
# ${TEACLAVE_EXAMPLE_INSTALL_DIR}/quickstart_c )
add_enclave_sig_target_n_hooks()