cmake_minimum_required (VERSION 3.10)
project (MesaTEE C)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(MesaTEEUtils)
include(ExternalProject)
check_exe_dependencies(git openssl python rustup lsof pypy)
init_submodules()

# ====== 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(MESATEE_CMAKE_DBG "" "set to turn on debug message for cmake")
set(MESAPY_VERSION 2b7ea38773d337d106c613a239661a60a4fa7528)
option(COV "Turn on/off coverage" OFF)
option(OFFLINE "Turn on/off cargo offline" ON)
option(TEST_MODE "Turn on/off test mode" OFF)
option(SGX_SIM_MODE "Turn on/off sgx simulation mode" OFF)

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()
# ======= VARIABLES FOR CMAKE -D{VAR}=VAL CONFIGURATION END =======

# =============== VARIABLES FOR MANUAL CHANGE BEGIN ===============
set(UNIX_LIBS mesatee_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
)

include(MesaTEEGenVars)

# ========== 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)
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 ${MESATEE_INSTALL_DIR}/${_category}
        EXTRA_CARGO_FLAGS ${EXTRA_CARGO_FLAGS}
        DEPENDS prep
    )
endforeach()

# sgx_untrusted_app
list(LENGTH SGX_APPS SGX_APP_LEN)
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 ${MESATEE_INSTALL_DIR}/${_category}
        EXTRA_CARGO_FLAGS ${EXTRA_CARGO_FLAGS}
        DEPENDS prep
    )
endforeach()

# mesapy components
add_custom_command(
    OUTPUT ${MESATEE_OUT_DIR}/acs_py_enclave.c
    COMMAND env
    ARGS PYTHONPATH=${PROJECT_SOURCE_DIR}/third_party/mesapy/sgx
         PYPY_FFI_OUTDIR=${MESATEE_OUT_DIR}
         pypy ${PROJECT_SOURCE_DIR}/mesatee_services/acs/python/ffi.py
    DEPENDS prep
            ${PROJECT_SOURCE_DIR}/mesatee_services/acs/python/ffi.py
            ${PROJECT_SOURCE_DIR}/mesatee_services/acs/python/acs_engine.py
    COMMENT "Generating mesapy ffi stubs"
)
add_library(pycomponent STATIC ${MESATEE_OUT_DIR}/acs_py_enclave.c)
set_target_properties(pycomponent PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${MESATEE_OUT_DIR})
target_compile_definitions(pycomponent PUBLIC SGX)
if(NOT EXISTS "/usr/lib/pypy/include")
    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)


# sgx_trusted_lib
list(LENGTH SGX_LIBS SGX_LIB_LEN)
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)
    add_sgx_build_target(${_pkg_path} ${_pkg_name}
        DEPENDS prep pycomponent
        INSTALL_DIR ${MESATEE_INSTALL_DIR}/${_category}
    )
endforeach()

# MesaTEE C SDK
add_cargo_build_dylib_target(mesatee_sdk_c
    TARGET_NAME "${UNIXLIB_PREFIX}-mesatee_sdk_c"
    TOML_DIR ${MT_UNIX_TOML_DIR}
    TARGET_DIR ${UNIX_TARGET_DIR}
    DEPENDS prep
)

# example/quickstart_c
link_directories(${MESATEE_LIB_INSTALL_DIR})
add_executable(quickstart_c ${MESATEE_PROJECT_ROOT}/examples/quickstart_c/main.c)
add_dependencies(quickstart_c prep ${UNIXLIB_PREFIX}-mesatee_sdk_c)
target_include_directories(quickstart_c
    PUBLIC ${MESATEE_PROJECT_ROOT}/mesatee_sdk/c_sdk/include/)
target_link_libraries(quickstart_c mesatee_sdk_c)
add_custom_command(TARGET quickstart_c POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/quickstart_c
    ${MESATEE_EXAMPLE_INSTALL_DIR}/quickstart_c
)

add_enclave_sig_target_n_hooks()
