diff --git a/.gitignore b/.gitignore index 5130c9f4..f10c6651 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +/build + # No editor backup files. *.sw* *.backup diff --git a/Runtime/meson.build b/Runtime/meson.build new file mode 100644 index 00000000..3ab06a7b --- /dev/null +++ b/Runtime/meson.build @@ -0,0 +1,44 @@ +install_data('../Pal/src/host/Linux/libpal.so', + install_dir: pkglibexecdir / 'linux') +install_subdir('../Pal/src/host/Linux/gdb_integration', + install_dir: pkglibexecdir / 'linux') + +install_data( + '../Pal/src/host/Linux-SGX/pal-sgx', + '../Pal/src/host/Linux-SGX/libpal.so', + install_dir: pkglibexecdir / 'linux-sgx') +install_subdir('../Pal/src/host/Linux-SGX/gdb_integration', + install_dir: pkglibexecdir / 'linux-sgx') + +conf = configuration_data() +conf.set_quoted('IN_GIT', '') + +hostpalpath_linux = prefix / pkglibexecdir / 'linux' +conf_graphene = configuration_data() +conf_graphene.merge_from(conf) +conf_graphene.set('SGX', 0) +conf_graphene.set_quoted('HOST_PAL_PATH', hostpalpath_linux) +conf_graphene.set_quoted('LIBPAL_PATH', hostpalpath_linux / 'libpal.so') +conf_graphene.set_quoted('PAL_CMD', hostpalpath_linux / 'libpal.so') + +configure_file( + input: 'pal_loader', + output: 'graphene', + configuration: conf_graphene, + install_dir: get_option('bindir'), +) + +hostpalpath_linux_sgx = prefix / pkglibexecdir / 'linux-sgx' +conf_graphene_sgx = configuration_data() +conf_graphene_sgx.merge_from(conf) +conf_graphene_sgx.set('SGX', 1) +conf_graphene_sgx.set_quoted('HOST_PAL_PATH', hostpalpath_linux_sgx) +conf_graphene_sgx.set_quoted('LIBPAL_PATH', hostpalpath_linux_sgx / 'libpal.so') +conf_graphene_sgx.set_quoted('PAL_CMD', hostpalpath_linux_sgx / 'pal-sgx') + +configure_file( + input: 'pal_loader', + output: 'graphene-sgx', + configuration: conf_graphene_sgx, + install_dir: get_option('bindir'), +) diff --git a/Runtime/pal_loader b/Runtime/pal_loader index d21bc24b..b517713b 100755 --- a/Runtime/pal_loader +++ b/Runtime/pal_loader @@ -4,61 +4,79 @@ # Copyright (C) 2019 Invisible Things Lab # Copyright (C) 2020 Intel Corporation # MichaƂ Kowalczyk +# Wojtek Porczyk -while : -do - case "$1" in - "SGX") - SGX=1 - export SGX - ;; - "GDB") - GDB=1 - ;; - *) - break - ;; - esac - shift -done -RUNTIME_DIR=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") -if [ -z "$PAL_HOST" ]; then - if ! command -v make >/dev/null; then - libpal="$RUNTIME_DIR/libpal-*.so" - libpal="$(echo -n "$libpal")" - libpal="${libpal//$RUNTIME_DIR\//}" - if [ "$libpal" = 'libpal-*.so' ]; then - echo "Unable to detect PAL_HOST. Please install the make program." - exit 1 +# This is how we detect whether we're installed or running from inside git repo. +# If unchanged (i.e., if this reads IN_GIT between "at" characters), this is an +# ordinary string and test -n "$IN_GIT" is true. But when installing, this is +# rewritten using meson's configure_file() function to an empty string and the +# else branch is taken. See also: ./meson.build and +# https://mesonbuild.com/Reference-manual.html#configure_file. +IN_GIT=@IN_GIT@ + +if test -n "$IN_GIT" +then + while : + do + case "$1" in + "SGX") + SGX=1 + export SGX + ;; + "GDB") + GDB=1 + ;; + *) + break + ;; + esac + shift + done + + RUNTIME_DIR=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") + if [ -z "$PAL_HOST" ]; then + if ! command -v make >/dev/null; then + libpal="$RUNTIME_DIR/libpal-*.so" + libpal="$(echo -n "$libpal")" + libpal="${libpal//$RUNTIME_DIR\//}" + if [ "$libpal" = 'libpal-*.so' ]; then + echo "Unable to detect PAL_HOST. Please install the make program." + exit 1 + fi + + array=("$libpal") + if [ ${#array[@]} -ne 1 ]; then + echo "Multiple libpal detected ($libpal). Please explicitly set the environment variable PAL_HOST." + exit 1 + fi + + PAL_HOST="${libpal%.so}" + PAL_HOST="${PAL_HOST#libpal-}" + else + PAL_HOST=$(make --no-print-directory --quiet -f "$RUNTIME_DIR/../Scripts/Makefile.configs" print_host 2>&1) fi - - array=("$libpal") - if [ ${#array[@]} -ne 1 ]; then - echo "Multiple libpal detected ($libpal). Please explicitly set the environment variable PAL_HOST." - exit 1 - fi - - PAL_HOST="${libpal%.so}" - PAL_HOST="${PAL_HOST#libpal-}" - else - PAL_HOST=$(make --no-print-directory --quiet -f "$RUNTIME_DIR/../Scripts/Makefile.configs" print_host 2>&1) fi + PAL_CMD="$RUNTIME_DIR/pal-$PAL_HOST" + LIBPAL_PATH=$(realpath "$RUNTIME_DIR/libpal-$PAL_HOST.so") + HOST_PAL_PATH=$(realpath "$RUNTIME_DIR/../Pal/src/host/$PAL_HOST") +else + PAL_CMD=@PAL_CMD@ + LIBPAL_PATH=@LIBPAL_PATH@ + HOST_PAL_PATH=@HOST_PAL_PATH@ + SGX=@SGX@ fi MANIFEST= ENVS=() PREFIX=() -PAL_CMD="$RUNTIME_DIR/pal-$PAL_HOST" -LIBPAL_PATH=$(realpath "$RUNTIME_DIR/libpal-$PAL_HOST.so") -HOST_PAL_PATH=$(realpath "$RUNTIME_DIR/../Pal/src/host/$PAL_HOST") if [ "$GDB" == "1" ]; then PREFIX=("gdb" "-q") if [ -n "$INSIDE_EMACS" ]; then PREFIX+=("-i=mi") fi - if [ -v SGX ]; then + if [ 0"$SGX" -gt 0 ]; then PREFIX+=("-x" "$HOST_PAL_PATH/gdb_integration/graphene_sgx_gdb.py") ENVS+=("LD_PRELOAD=$HOST_PAL_PATH/gdb_integration/sgx_gdb.so:$LD_PRELOAD") else @@ -92,7 +110,7 @@ if [ "$MANIFEST" == "" ]; then fi if [ ! -f "$PAL_CMD" ]; then - echo "$PAL_CMD is not built" + echo "$PAL_CMD not found" exit 1 fi diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..38cedd8a --- /dev/null +++ b/meson.build @@ -0,0 +1,11 @@ +project( + 'graphene', 'c', + version: '1.0', + license: 'LGPLv3+', +) + +prefix = get_option('prefix') +pkglibexecdir = get_option('libexecdir') / meson.project_name() +pkgdatadir = get_option('datadir') / meson.project_name() + +subdir('Runtime')