blob: e42f7a302936c1292ee11d55fa791418d3383da4 [file] [log] [blame]
macro(dbg_message)
if(MESATEE_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)
execute_process (
COMMAND bash -c "if [[ ! $(git submodule foreach ls -A) ]] || [[ $(git submodule summary) ]]; then echo INFO: Need to reinitialize git submodules && git submodule update --init --recursive; fi"
)
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 ${MESATEE_INSTALL_DIR})
endif()
if (MTEE_NOT_SET_COMMON_ENV)
set(_envs)
else()
set(_envs ${MESATEE_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_lib_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 ${MESATEE_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 ${MESATEE_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)
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 ${MESATEE_INSTALL_DIR})
endif()
rm_trailing_enclave(${pkg_name} pkg_name_no_enclave)
set(_target_name ${SGXLIB_PREFIX}-${pkg_name_no_enclave})
if(pkg_name_no_enclave STREQUAL "functional_test")
set(_enclave_info "/dev/null")
else()
set(_enclave_info "${MESATEE_OUT_DIR}/${pkg_name}_info.toml")
endif()
add_custom_target(${_target_name} ALL
COMMAND ${CMAKE_COMMAND} -E env ${MESATEE_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
${_depends}
COMMAND cat ${MESATEE_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 ${MESATEE_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 ${MESATEE_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 ${MESATEE_COMMON_ENVS})
list(FILTER envs INCLUDE REGEX "MESATEE_PROJECT_ROOT|MESATEE_CFG_DIR|\
MESATEE_BUILD_CFG_DIR|MESATEE_OUT_DIR|MESATEE_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 "MesaTEE 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)
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_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()