| macro(dbg_message) |
| if(TEACLAVE_CMAKE_DBG) |
| message("${ARGN}") |
| endif() |
| endmacro() |
| |
| macro(SET_STRVAR_FROM_ENV_OR var default_val docstring) |
| if(NOT "$ENV{${var}}" STREQUAL "") |
| set(${var} |
| "$ENV{${var}}" |
| CACHE STRING "${docstring}") |
| else() |
| set(${var} |
| "${default_val}" |
| CACHE STRING "${docstring}") |
| endif() |
| endmacro() |
| |
| function(check_sgx_sdk) |
| if(NOT IS_DIRECTORY "${SGX_SDK}") |
| message( |
| FATAL_ERROR |
| "SGX SDK not found at ${SGX_SDK}, please adjust the SGX_SDK env or the CMake config." |
| ) |
| endif() |
| endfunction() |
| |
| function(init_submodules) |
| if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git") |
| # Update submodules as needed |
| if(GIT_SUBMODULE) |
| message(STATUS "Submodule update") |
| execute_process( |
| COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive |
| WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} |
| RESULT_VARIABLE GIT_SUBMOD_RESULT) |
| if(NOT GIT_SUBMOD_RESULT EQUAL "0") |
| message( |
| FATAL_ERROR |
| "git submodule update --init failed with ${GIT_SUBMOD_RESULT}, please checkout submodules" |
| ) |
| endif() |
| endif() |
| endif() |
| |
| if(NOT EXISTS "${PROJECT_SOURCE_DIR}/third_party/crates-io" |
| OR NOT EXISTS "${PROJECT_SOURCE_DIR}/third_party/crates-sgx" |
| OR NOT EXISTS "${PROJECT_SOURCE_DIR}/third_party/mesapy" |
| OR NOT EXISTS "${PROJECT_SOURCE_DIR}/third_party/rust-sgx-sdk") |
| message( |
| FATAL_ERROR |
| "The submodules were not downloaded! GIT_SUBMODULE was turned off or failed. Please update submodules and try again." |
| ) |
| endif() |
| endfunction() |
| |
| macro(rm_trailing_enclave src_str dest_name) |
| string(REGEX REPLACE "_enclave$" "" ${dest_name} ${src_str}) |
| endmacro() |
| |
| # add_cargo_build_target(package_name [TARGET_NAME target_name] # default to |
| # cg_${package_name} TOML_DIR toml_dir TARGET_DIR target_dir [DEPENDS [dep]...] |
| # [NOT_SET_COMMON_ENV] [EXTRA_CARGO_FLAGS flg...] ) |
| function(add_cargo_build_target package_name) |
| set(options NOT_SET_COMMON_ENV) |
| set(oneValueArgs TARGET_NAME TOML_DIR TARGET_DIR INSTALL_DIR |
| EXTRA_CARGO_FLAGS) |
| set(multiValueArgs DEPENDS) |
| cmake_parse_arguments(MTEE "${options}" "${oneValueArgs}" "${multiValueArgs}" |
| ${ARGN}) |
| |
| if(DEFINED MTEE_TARGET_NAME) |
| set(_target_name ${MTEE_TARGET_NAME}) |
| else() |
| set(_target_name cg_${package_name}) |
| endif() |
| |
| if(DEFINED MTEE_INSTALL_DIR) |
| set(_copy_dir ${MTEE_INSTALL_DIR}) |
| else() |
| set(_copy_dir ${TEACLAVE_INSTALL_DIR}) |
| endif() |
| |
| if(MTEE_NOT_SET_COMMON_ENV) |
| set(_envs) |
| else() |
| set(_envs ${TEACLAVE_COMMON_ENVS}) |
| endif() |
| |
| if(DEFINED MTEE_DEPENDS) |
| set(_depends DEPENDS ${MTEE_DEPENDS}) |
| else() |
| set(_depends) |
| endif() |
| |
| add_custom_target( |
| ${_target_name} ALL |
| COMMAND |
| ${CMAKE_COMMAND} -E env ${_envs} RUSTFLAGS=${RUSTFLAGS} |
| ${MT_SCRIPT_DIR}/cargo_build_ex.sh -p ${package_name} --target-dir |
| ${MTEE_TARGET_DIR} ${CARGO_BUILD_FLAGS} ${MTEE_EXTRA_CARGO_FLAGS} && cp |
| ${MTEE_TARGET_DIR}/${TARGET}/${package_name} ${_copy_dir} ${_depends} |
| COMMENT "Building ${_target_name}" |
| WORKING_DIRECTORY ${MTEE_TOML_DIR}) |
| endfunction() |
| |
| # add_cargo_build_dylib_target(package_name [TARGET_NAME target_name] # default to |
| # cg_${package_name} TOML_DIR toml_dir TARGET_DIR target_dir [DEPENDS [dep]...] |
| # [NOT_SET_COMMON_ENV] [EXTRA_CARGO_FLAGS flg...] ) |
| function(add_cargo_build_dylib_target package_name) |
| set(options NOT_SET_COMMON_ENV) |
| set(oneValueArgs TARGET_NAME TOML_DIR TARGET_DIR) |
| set(multiValueArgs DEPENDS EXTRA_CARGO_FLAGS) |
| cmake_parse_arguments(MTEE "${options}" "${oneValueArgs}" "${multiValueArgs}" |
| ${ARGN}) |
| |
| if(DEFINED MTEE_TARGET_NAME) |
| set(_target_name ${MTEE_TARGET_NAME}) |
| else() |
| set(_target_name cg_${package_name}) |
| endif() |
| |
| if(MTEE_NOT_SET_COMMON_ENV) |
| set(_envs) |
| else() |
| set(_envs ${TEACLAVE_COMMON_ENVS}) |
| endif() |
| |
| if(DEFINED MTEE_DEPENDS) |
| set(_depends DEPENDS ${MTEE_DEPENDS}) |
| else() |
| set(_depends) |
| endif() |
| |
| add_custom_target( |
| ${_target_name} ALL |
| COMMAND |
| ${CMAKE_COMMAND} -E env ${_envs} RUSTFLAGS=${RUSTFLAGS} |
| ${MT_SCRIPT_DIR}/cargo_build_ex.sh -p ${package_name} --target-dir |
| ${MTEE_TARGET_DIR} ${CARGO_BUILD_FLAGS} ${MTEE_EXTRA_CARGO_FLAGS} && cp |
| ${MTEE_TARGET_DIR}/${TARGET}/lib${package_name}.so |
| ${TEACLAVE_LIB_INSTALL_DIR} ${_depends} |
| COMMENT "Building ${_target_name} as a dynamic library" |
| WORKING_DIRECTORY ${MTEE_TOML_DIR}) |
| endfunction() |
| |
| # add_sgx_build_target(sgx_lib_path pkg_name [DEPENDS [dep]...] [INSTALL_DIR |
| # dir] [EXTRA_CARGO_FLAGS flg...] ) |
| function(add_sgx_build_target sgx_lib_path pkg_name) |
| set(options) |
| set(oneValueArgs INSTALL_DIR EDL_LIB_NAME) |
| set(multiValueArgs DEPENDS EXTRA_CARGO_FLAGS) |
| cmake_parse_arguments(MTEE "${options}" "${oneValueArgs}" "${multiValueArgs}" |
| ${ARGN}) |
| |
| if(DEFINED MTEE_DEPENDS) |
| set(_depends DEPENDS ${MTEE_DEPENDS}) |
| else() |
| set(_depends) |
| endif() |
| |
| if(DEFINED MTEE_INSTALL_DIR) |
| set(_copy_dir ${MTEE_INSTALL_DIR}) |
| else() |
| set(_copy_dir ${TEACLAVE_INSTALL_DIR}) |
| endif() |
| |
| if(DEFINED MTEE_EDL_LIB_NAME) |
| set(_edl_lib_name ${MTEE_EDL_LIB_NAME}) |
| else() |
| set(_edl_lib_name) |
| endif() |
| |
| rm_trailing_enclave(${pkg_name} pkg_name_no_enclave) |
| |
| set(_target_name ${SGXLIB_PREFIX}-${pkg_name_no_enclave}) |
| |
| if(pkg_name_no_enclave MATCHES "_tests$") |
| set(RUSTFLAGS "${RUSTFLAGS} --cfg test_mode") |
| endif() |
| |
| if(pkg_name_no_enclave MATCHES "_tests$" AND CMAKE_BUILD_TYPE_LOWER STREQUAL |
| "release") |
| set(_enclave_info "/dev/null") |
| else() |
| set(_enclave_info "${TEACLAVE_OUT_DIR}/${pkg_name}_info.toml") |
| endif() |
| |
| add_custom_target( |
| ${_target_name} ALL |
| COMMAND |
| ${CMAKE_COMMAND} -E env ${TEACLAVE_COMMON_ENVS} RUSTFLAGS=${RUSTFLAGS} |
| ${MT_SCRIPT_DIR}/cargo_build_ex.sh -p ${pkg_name} --target-dir |
| ${TRUSTED_TARGET_DIR} ${CARGO_BUILD_FLAGS} ${SGX_ENCLAVE_FEATURES} |
| ${MTEE_EXTRA_CARGO_FLAGS} |
| COMMAND |
| ${CMAKE_COMMAND} -E env ${TARGET_SGXLIB_ENVS} |
| SGX_COMMON_CFLAGS=${STR_SGX_COMMON_CFLAGS} CUR_PKG_NAME=${pkg_name} |
| CUR_PKG_PATH=${sgx_lib_path} CUR_INSTALL_DIR=${_copy_dir} |
| ${MT_SCRIPT_DIR}/sgx_link_sign.sh ${_edl_lib_name} ${_depends} |
| COMMAND |
| cat ${TEACLAVE_OUT_DIR}/${pkg_name}.meta.txt | python |
| ${MT_SCRIPT_DIR}/gen_enclave_info_toml.py ${pkg_name_no_enclave} > |
| ${_enclave_info} |
| COMMENT "Building ${_target_name}, enclave info to ${_enclave_info}" |
| WORKING_DIRECTORY ${MT_SGXLIB_TOML_DIR}) |
| endfunction() |
| |
| function(add_enclave_sig_target_n_hooks) |
| # add a target to generate enclave sig files |
| add_custom_target( |
| update_sig ALL |
| COMMAND ${TEACLAVE_COMMON_ENVS} ${MT_SCRIPT_DIR}/gen_enclave_sig.sh |
| COMMENT "Generating enclave signatures..." |
| DEPENDS ${SGXLIB_TARGETS}) |
| |
| # Hook the convenience targets for SGX modules so manually `make kms/tms/...` |
| # will trigger updating enclave sig files |
| foreach(sgx_module ${SGX_MODULES}) |
| add_custom_command( |
| TARGET ${sgx_module} |
| POST_BUILD |
| COMMENT "Updating enclave signatures..." |
| COMMAND ${TEACLAVE_COMMON_ENVS} ${MT_SCRIPT_DIR}/gen_enclave_sig.sh) |
| endforeach() |
| endfunction() |
| |
| function(join_string values glue out) |
| string(REGEX REPLACE "([^\\]|^);" "\\1${glue}" _res "${values}") |
| string(REGEX REPLACE "[\\](.)" "\\1" _res "${_res}") |
| set(${out} |
| "${_res}" |
| PARENT_SCOPE) |
| endfunction() |
| |
| function(generate_env_file) |
| set(envs ${TEACLAVE_COMMON_ENVS}) |
| list(FILTER envs INCLUDE REGEX "TEACLAVE_PROJECT_ROOT|TEACLAVE_CFG_DIR|\ |
| TEACLAVE_BUILD_CFG_DIR|TEACLAVE_OUT_DIR|TEACLAVE_AUDITORS_DIR") |
| # add extra env vars |
| list(APPEND envs "RUST_LOG=info" "RUST_BACKTRACE=1") |
| join_string("${envs}" "\nexport " env_file) |
| string(PREPEND env_file "export ") |
| string(APPEND env_file "\n") |
| file(WRITE ${PROJECT_BINARY_DIR}/environment ${env_file}) |
| message(STATUS "====== ${PROJECT_BINARY_DIR}/environment GENERATED ======") |
| endfunction() |
| |
| function(gen_convenience_targets) |
| # add a target with the same name for each unix_module |
| foreach(unix_module ${UNIX_APPS}) |
| add_custom_target(${unix_module} DEPENDS ${UNIXAPP_PREFIX}-${unix_module}) |
| endforeach() |
| |
| # add a target with the same name for each sgx_module (build sgxlib+sgxapp) |
| foreach(sgx_module ${SGX_MODULES}) |
| add_custom_target(${sgx_module} DEPENDS ${SGXAPP_PREFIX}-${sgx_module} |
| ${SGXLIB_PREFIX}-${sgx_module}) |
| endforeach() |
| endfunction() |
| |
| function(new_list_with_prefix new_list_name prefix) |
| set(_new_list) |
| foreach(item ${ARGN}) |
| string(PREPEND item ${prefix}) |
| set(_new_list ${_new_list} ${item}) |
| endforeach() |
| set(${new_list_name} |
| ${_new_list} |
| PARENT_SCOPE) |
| endfunction() |
| |
| function(check_exe_dependencies) |
| foreach(exe ${ARGN}) |
| execute_process(COMMAND bash -c "type ${exe}" OUTPUT_QUIET ERROR_QUIET |
| RESULT_VARIABLE _res) |
| if(_res) |
| message( |
| FATAL_ERROR |
| "Teaclave depends on \"${exe}\" but the command was not found. \ |
| Please install the dependency and retry.") |
| endif() |
| endforeach() |
| endfunction() |
| |
| function(parse_cargo_packages pkg_names) |
| set(options) |
| set(oneValueArgs CARGO_TOML_PATH PKG_PATHS CATEGORIES EDL_NAMES) |
| set(multiValueArgs) |
| |
| cmake_parse_arguments(MTEE "${options}" "${oneValueArgs}" "${multiValueArgs}" |
| ${ARGN}) |
| |
| set(_output) |
| set(err) |
| |
| execute_process( |
| COMMAND python ${PROJECT_SOURCE_DIR}/cmake/scripts/parse_cargo_packages.py |
| ${MTEE_CARGO_TOML_PATH} ${PROJECT_SOURCE_DIR} |
| OUTPUT_VARIABLE _output |
| ERROR_VARIABLE err) |
| |
| if(NOT (err STREQUAL "")) |
| message(FATAL_ERROR "failed to load packages: ${err}") |
| endif() |
| |
| string(REGEX REPLACE "\n" ";" _out_list ${_output}) |
| list(LENGTH _out_list LLEN) |
| |
| if(DEFINED MTEE_EDL_NAMES) |
| list(GET _out_list 3 _edl_names) |
| string(REPLACE ":" ";" _edl_names ${_edl_names}) |
| set(${MTEE_EDL_NAMES} |
| ${_edl_names} |
| PARENT_SCOPE) |
| dbg_message("${MTEE_EDL_NAMES}=${_edl_names}\n") |
| endif() |
| |
| if(DEFINED MTEE_CATEGORIES) |
| list(GET _out_list 2 _categories) |
| string(REPLACE ":" ";" _categories ${_categories}) |
| set(${MTEE_CATEGORIES} |
| ${_categories} |
| PARENT_SCOPE) |
| dbg_message("${MTEE_CATEGORIES}=${_categories}\n") |
| endif() |
| |
| if(DEFINED MTEE_PKG_PATHS) |
| list(GET _out_list 1 _pkg_paths) |
| string(REPLACE ":" ";" _pkg_paths ${_pkg_paths}) |
| set(${MTEE_PKG_PATHS} |
| ${_pkg_paths} |
| PARENT_SCOPE) |
| dbg_message("${MTEE_PKG_PATHS}=${_pkg_paths}\n") |
| endif() |
| |
| # level up the local variable to its parent scope |
| list(GET _out_list 0 _pkg_names) |
| string(REPLACE ":" ";" _pkg_names ${_pkg_names}) |
| set(${pkg_names} |
| ${_pkg_names} |
| PARENT_SCOPE) |
| dbg_message("${pkg_names}=${_pkg_names}\n") |
| endfunction() |