|
|
@@ -0,0 +1,2508 @@
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+# This file is part of the xPack distribution.
|
|
|
+# (https://xpack.github.io)
|
|
|
+# Copyright (c) 2020 Liviu Ionescu.
|
|
|
+#
|
|
|
+# Permission to use, copy, modify, and/or distribute this software
|
|
|
+# for any purpose is hereby granted, under the terms of the MIT license.
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+# Helper script used in the second edition of the xPack build
|
|
|
+# scripts. As the name implies, it should contain only functions and
|
|
|
+# should be included with 'source' by the build scripts (both native
|
|
|
+# and container).
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+# Default empty definition, if XBB is available, it should
|
|
|
+# redefine it.
|
|
|
+function xbb_activate()
|
|
|
+{
|
|
|
+ :
|
|
|
+}
|
|
|
+
|
|
|
+function xbb_activate_dev()
|
|
|
+{
|
|
|
+ # Add XBB include in front of XBB_CPPFLAGS.
|
|
|
+ XBB_CPPFLAGS="-I${XBB_FOLDER_PATH}/include ${XBB_CPPFLAGS}"
|
|
|
+
|
|
|
+ if [ -d "${XBB_FOLDER_PATH}/lib" ]
|
|
|
+ then
|
|
|
+ # Add XBB lib in front of XBB_LDFLAGS.
|
|
|
+ XBB_LDFLAGS="-L${XBB_FOLDER_PATH}/lib ${XBB_LDFLAGS}"
|
|
|
+ XBB_LDFLAGS_LIB="-L${XBB_FOLDER_PATH}/lib ${XBB_LDFLAGS_LIB}"
|
|
|
+ XBB_LDFLAGS_APP="-L${XBB_FOLDER_PATH}/lib ${XBB_LDFLAGS_APP}"
|
|
|
+ XBB_LDFLAGS_APP_STATIC_GCC="-L${XBB_FOLDER_PATH}/lib ${XBB_LDFLAGS_APP_STATIC_GCC}"
|
|
|
+
|
|
|
+ # Add XBB lib in front of PKG_CONFIG_PATH.
|
|
|
+ if [ -d "${XBB_FOLDER_PATH}/lib/pkgconfig" ]
|
|
|
+ then
|
|
|
+ if [ -z "${PKG_CONFIG_PATH}" ]
|
|
|
+ then
|
|
|
+ PKG_CONFIG_PATH="${XBB_FOLDER_PATH}/lib/pkgconfig"
|
|
|
+ else
|
|
|
+ PKG_CONFIG_PATH="${XBB_FOLDER_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ -d "${XBB_FOLDER_PATH}/lib64" ]
|
|
|
+ then
|
|
|
+ # For 64-bit systems, add XBB lib64 in front of paths.
|
|
|
+ XBB_LDFLAGS="-L${XBB_FOLDER_PATH}/lib64 ${XBB_LDFLAGS_LIB}"
|
|
|
+ XBB_LDFLAGS_LIB="-L${XBB_FOLDER_PATH}/lib64 ${XBB_LDFLAGS_LIB}"
|
|
|
+ XBB_LDFLAGS_APP="-L${XBB_FOLDER_PATH}/lib64 ${XBB_LDFLAGS_APP}"
|
|
|
+ XBB_LDFLAGS_APP_STATIC_GCC="-L${XBB_FOLDER_PATH}/lib64 ${XBB_LDFLAGS_APP_STATIC_GCC}"
|
|
|
+
|
|
|
+ if [ -d "${XBB_FOLDER_PATH}/lib64/pkgconfig" ]
|
|
|
+ then
|
|
|
+ if [ -z "${PKG_CONFIG_PATH}" ]
|
|
|
+ then
|
|
|
+ PKG_CONFIG_PATH="${XBB_FOLDER_PATH}/lib64/pkgconfig"
|
|
|
+ else
|
|
|
+ PKG_CONFIG_PATH="${XBB_FOLDER_PATH}/lib64/pkgconfig:${PKG_CONFIG_PATH}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ export XBB_CPPFLAGS
|
|
|
+
|
|
|
+ export XBB_LDFLAGS
|
|
|
+ export XBB_LDFLAGS_LIB
|
|
|
+ export XBB_LDFLAGS_APP
|
|
|
+ export XBB_LDFLAGS_APP_STATIC_GCC
|
|
|
+
|
|
|
+ export PKG_CONFIG_PATH
|
|
|
+}
|
|
|
+
|
|
|
+function xbb_activate_libs()
|
|
|
+{
|
|
|
+ LD_LIBRARY_PATH=${LD_LIBRARY_PATH:-""}
|
|
|
+
|
|
|
+ if [ -d "${XBB_FOLDER_PATH}/lib" ]
|
|
|
+ then
|
|
|
+ if [ -z "${LD_LIBRARY_PATH}" ]
|
|
|
+ then
|
|
|
+ LD_LIBRARY_PATH="${XBB_FOLDER_PATH}/lib"
|
|
|
+ else
|
|
|
+ LD_LIBRARY_PATH="${XBB_FOLDER_PATH}/lib:${LD_LIBRARY_PATH}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ -d "${XBB_FOLDER_PATH}/lib64" ]
|
|
|
+ then
|
|
|
+ if [ -z "${LD_LIBRARY_PATH}" ]
|
|
|
+ then
|
|
|
+ LD_LIBRARY_PATH="${XBB_FOLDER_PATH}/lib64"
|
|
|
+ else
|
|
|
+ LD_LIBRARY_PATH="${XBB_FOLDER_PATH}/lib64:${LD_LIBRARY_PATH}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ export LD_LIBRARY_PATH
|
|
|
+}
|
|
|
+
|
|
|
+# Add the freshly built binaries.
|
|
|
+function xbb_activate_installed_bin()
|
|
|
+{
|
|
|
+ # Add the XBB bin to the PATH.
|
|
|
+ PATH="${LIBS_INSTALL_FOLDER_PATH}/bin:${PATH}"
|
|
|
+
|
|
|
+ export PATH
|
|
|
+}
|
|
|
+
|
|
|
+# Add the freshly built headrs and libraries.
|
|
|
+function xbb_activate_installed_dev()
|
|
|
+{
|
|
|
+ # Add XBB include in front of XBB_CPPFLAGS.
|
|
|
+ XBB_CPPFLAGS="-I${LIBS_INSTALL_FOLDER_PATH}/include ${XBB_CPPFLAGS}"
|
|
|
+
|
|
|
+ if [ -d "${LIBS_INSTALL_FOLDER_PATH}/lib" ]
|
|
|
+ then
|
|
|
+ # Add XBB lib in front of XBB_LDFLAGS.
|
|
|
+ XBB_LDFLAGS="-L${LIBS_INSTALL_FOLDER_PATH}/lib ${XBB_LDFLAGS}"
|
|
|
+ XBB_LDFLAGS_LIB="-L${LIBS_INSTALL_FOLDER_PATH}/lib ${XBB_LDFLAGS_LIB}"
|
|
|
+ XBB_LDFLAGS_APP="-L${LIBS_INSTALL_FOLDER_PATH}/lib ${XBB_LDFLAGS_APP}"
|
|
|
+ XBB_LDFLAGS_APP_STATIC_GCC="-L${LIBS_INSTALL_FOLDER_PATH}/lib ${XBB_LDFLAGS_APP_STATIC_GCC}"
|
|
|
+
|
|
|
+ # Add XBB lib in front of PKG_CONFIG_PATH.
|
|
|
+ PKG_CONFIG_PATH="${LIBS_INSTALL_FOLDER_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}"
|
|
|
+
|
|
|
+ # Needed by internal binaries, like the bootstrap compiler, which do not
|
|
|
+ # have a rpath.
|
|
|
+ if [ -z "${LD_LIBRARY_PATH}" ]
|
|
|
+ then
|
|
|
+ LD_LIBRARY_PATH="${LIBS_INSTALL_FOLDER_PATH}/lib"
|
|
|
+ else
|
|
|
+ LD_LIBRARY_PATH="${LIBS_INSTALL_FOLDER_PATH}/lib:${LD_LIBRARY_PATH}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ # For just in case, apparently not used.
|
|
|
+ if [ -d "${LIBS_INSTALL_FOLDER_PATH}/lib64" ]
|
|
|
+ then
|
|
|
+ # For 64-bit systems, add XBB lib64 in front of paths.
|
|
|
+ XBB_LDFLAGS="-L${LIBS_INSTALL_FOLDER_PATH}/lib64 ${XBB_LDFLAGS_LIB}"
|
|
|
+ XBB_LDFLAGS_LIB="-L${LIBS_INSTALL_FOLDER_PATH}/lib64 ${XBB_LDFLAGS_LIB}"
|
|
|
+ XBB_LDFLAGS_APP="-L${LIBS_INSTALL_FOLDER_PATH}/lib64 ${XBB_LDFLAGS_APP}"
|
|
|
+ XBB_LDFLAGS_APP_STATIC_GCC="-L${LIBS_INSTALL_FOLDER_PATH}/lib64 ${XBB_LDFLAGS_APP_STATIC_GCC}"
|
|
|
+
|
|
|
+ PKG_CONFIG_PATH="${LIBS_INSTALL_FOLDER_PATH}/lib64/pkgconfig:${PKG_CONFIG_PATH}"
|
|
|
+
|
|
|
+ if [ -z "${LD_LIBRARY_PATH}" ]
|
|
|
+ then
|
|
|
+ LD_LIBRARY_PATH="${LIBS_INSTALL_FOLDER_PATH}/lib64"
|
|
|
+ else
|
|
|
+ LD_LIBRARY_PATH="${LIBS_INSTALL_FOLDER_PATH}/lib64:${LD_LIBRARY_PATH}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ export XBB_CPPFLAGS
|
|
|
+
|
|
|
+ export XBB_LDFLAGS
|
|
|
+ export XBB_LDFLAGS_LIB
|
|
|
+ export XBB_LDFLAGS_APP
|
|
|
+ export XBB_LDFLAGS_APP_STATIC_GCC
|
|
|
+
|
|
|
+ export PKG_CONFIG_PATH
|
|
|
+ export LD_LIBRARY_PATH
|
|
|
+
|
|
|
+ echo
|
|
|
+ env | sort
|
|
|
+}
|
|
|
+
|
|
|
+function xbb_activate_tex()
|
|
|
+{
|
|
|
+ :
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function do_config_guess()
|
|
|
+{
|
|
|
+ if [ -f "${XBB_FOLDER_PATH}/share/libtool/build-aux/config.guess" ]
|
|
|
+ then
|
|
|
+ BUILD="$(${XBB_FOLDER_PATH}/share/libtool/build-aux/config.guess)"
|
|
|
+ elif [ -f "/usr/share/libtool/build-aux/config.guess" ]
|
|
|
+ then
|
|
|
+ BUILD="$(/usr/share/libtool/build-aux/config.guess)"
|
|
|
+ elif [ -f "/usr/share/misc/config.guess" ]
|
|
|
+ then
|
|
|
+ BUILD="$(/usr/share/misc/config.guess)"
|
|
|
+ else
|
|
|
+ echo "Could not find config.guess."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+function prepare_xbb_env()
|
|
|
+{
|
|
|
+ # Defaults, to ensure the variables are defined.
|
|
|
+ PATH="${PATH:-""}"
|
|
|
+ LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-""}"
|
|
|
+
|
|
|
+ if [ -f "${HOME}/opt/xbb/xbb-source.sh" ]
|
|
|
+ then
|
|
|
+ XBB_FOLDER_PATH="${HOME}/opt/xbb"
|
|
|
+ echo
|
|
|
+ echo "Sourcing ${HOME}/opt/xbb/xbb-source.sh..."
|
|
|
+ source "${HOME}/opt/xbb/xbb-source.sh"
|
|
|
+ elif [ -f "${HOME}/opt/homebrew/xbb/xbb-source.sh" ]
|
|
|
+ then
|
|
|
+ XBB_FOLDER_PATH="${HOME}/opt/homebrew/xbb"
|
|
|
+ # Deprecated, on macOS it was moved to HOME/opt/xbb
|
|
|
+ echo
|
|
|
+ echo "Sourcing ${HOME}/opt/homebrew/xbb/xbb-source.sh..."
|
|
|
+ source "${HOME}/opt/homebrew/xbb/xbb-source.sh"
|
|
|
+ elif [ -f "/opt/xbb/xbb-source.sh" ]
|
|
|
+ then
|
|
|
+ XBB_FOLDER_PATH="/opt/xbb"
|
|
|
+ echo
|
|
|
+ echo "Sourcing /opt/xbb/xbb-source.sh..."
|
|
|
+ source "/opt/xbb/xbb-source.sh"
|
|
|
+ else
|
|
|
+ XBB_FOLDER_PATH=""
|
|
|
+ fi
|
|
|
+
|
|
|
+ TARGET_FOLDER_NAME="${TARGET_PLATFORM}-${TARGET_ARCH}"
|
|
|
+
|
|
|
+ # Compute the BUILD/HOST/TARGET for configure.
|
|
|
+ CROSS_COMPILE_PREFIX=""
|
|
|
+ if [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ # Disable test when cross compiling for Windows.
|
|
|
+ WITH_TESTS="n"
|
|
|
+
|
|
|
+ # For Windows targets, decide which cross toolchain to use.
|
|
|
+ if [ ${TARGET_ARCH} == "x32" ]
|
|
|
+ then
|
|
|
+ CROSS_COMPILE_PREFIX="i686-w64-mingw32"
|
|
|
+ elif [ ${TARGET_ARCH} == "x64" ]
|
|
|
+ then
|
|
|
+ CROSS_COMPILE_PREFIX="x86_64-w64-mingw32"
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_ARCH}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ do_config_guess
|
|
|
+
|
|
|
+ HOST="${CROSS_COMPILE_PREFIX}"
|
|
|
+ TARGET="${HOST}"
|
|
|
+
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ do_config_guess
|
|
|
+
|
|
|
+ HOST="${BUILD}"
|
|
|
+ TARGET="${HOST}"
|
|
|
+
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ do_config_guess
|
|
|
+
|
|
|
+ HOST="${BUILD}"
|
|
|
+ TARGET="${HOST}"
|
|
|
+
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ -f "/.dockerenv" ]
|
|
|
+ then
|
|
|
+ WORK_FOLDER_PATH="${CONTAINER_WORK_FOLDER_PATH}"
|
|
|
+ DOWNLOAD_FOLDER_PATH="${CONTAINER_CACHE_FOLDER_PATH}"
|
|
|
+ else
|
|
|
+ WORK_FOLDER_PATH="${HOST_WORK_FOLDER_PATH}"
|
|
|
+ DOWNLOAD_FOLDER_PATH="${HOST_CACHE_FOLDER_PATH}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ # Develop builds use the host folder.
|
|
|
+ BUILD_FOLDER_PATH="${WORK_FOLDER_PATH}/${TARGET_FOLDER_NAME}/build"
|
|
|
+ if [ -f "/.dockerenv" ]
|
|
|
+ then
|
|
|
+ if [ "${IS_DEVELOP}" != "y" ]
|
|
|
+ then
|
|
|
+ # Docker builds use a temporary folder.
|
|
|
+ BUILD_FOLDER_PATH="/tmp/${TARGET_FOLDER_NAME}/build"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ LIBS_BUILD_FOLDER_PATH="${BUILD_FOLDER_PATH}/libs"
|
|
|
+ mkdir -pv "${LIBS_BUILD_FOLDER_PATH}"
|
|
|
+
|
|
|
+ APP_BUILD_FOLDER_PATH="${BUILD_FOLDER_PATH}/${APP_LC_NAME}"
|
|
|
+ # Do it later, only if needed.
|
|
|
+ # mkdir -pv "${APP_BUILD_FOLDER_PATH}"
|
|
|
+
|
|
|
+ INSTALL_FOLDER_PATH="${WORK_FOLDER_PATH}/${TARGET_FOLDER_NAME}/install"
|
|
|
+ STAMPS_FOLDER_PATH="${INSTALL_FOLDER_PATH}"
|
|
|
+
|
|
|
+ LIBS_INSTALL_FOLDER_PATH="${INSTALL_FOLDER_PATH}/libs"
|
|
|
+ # Use explicit include & especially lib, to prevent compiler complaining
|
|
|
+ # for missing folders.
|
|
|
+ mkdir -pv "${LIBS_INSTALL_FOLDER_PATH}/include"
|
|
|
+ mkdir -pv "${LIBS_INSTALL_FOLDER_PATH}/lib"
|
|
|
+
|
|
|
+ APP_INSTALL_FOLDER_PATH="${INSTALL_FOLDER_PATH}/${APP_LC_NAME}"
|
|
|
+ mkdir -pv "${APP_INSTALL_FOLDER_PATH}"
|
|
|
+
|
|
|
+ LOGS_FOLDER_NAME=${LOGS_FOLDER_NAME:-"logs"}
|
|
|
+ LOGS_FOLDER_PATH="${WORK_FOLDER_PATH}/${TARGET_FOLDER_NAME}/${LOGS_FOLDER_NAME}"
|
|
|
+ mkdir -pv "${LOGS_FOLDER_PATH}"
|
|
|
+
|
|
|
+ DEPLOY_FOLDER_NAME=${DEPLOY_FOLDER_NAME:-"deploy"}
|
|
|
+ DEPLOY_FOLDER_PATH="${WORK_FOLDER_PATH}/${DEPLOY_FOLDER_NAME}"
|
|
|
+ # Do it later, only if needed.
|
|
|
+ # mkdir -pv "${DEPLOY_FOLDER_PATH}"
|
|
|
+
|
|
|
+ DISTRO_INFO_NAME=${DISTRO_INFO_NAME:-"distro-info"}
|
|
|
+
|
|
|
+ BUILD_GIT_PATH="${WORK_FOLDER_PATH}/build.git"
|
|
|
+
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+
|
|
|
+ APP_PREFIX="${INSTALL_FOLDER_PATH}/${APP_LC_NAME}"
|
|
|
+ # The documentation location is now the same on all platforms.
|
|
|
+ APP_PREFIX_DOC="${APP_PREFIX}/share/doc"
|
|
|
+
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+
|
|
|
+ SOURCES_FOLDER_PATH=${SOURCES_FOLDER_PATH:-"${WORK_FOLDER_PATH}/sources"}
|
|
|
+ mkdir -pv "${SOURCES_FOLDER_PATH}"
|
|
|
+
|
|
|
+ # Empty defaults.
|
|
|
+ IS_DEVELOP=${IS_DEVELOP:-""}
|
|
|
+ IS_DEBUG=${IS_DEBUG:-""}
|
|
|
+ WITH_PDF=${WITH_PDF:-""}
|
|
|
+ WITH_HTML=${WITH_HTML:-""}
|
|
|
+ WITH_TESTS=${WITH_TESTS:-""}
|
|
|
+
|
|
|
+ # Redefine this to "y" to create files that include the architecture.
|
|
|
+ HAS_NAME_ARCH=${HAS_NAME_ARCH:-""}
|
|
|
+
|
|
|
+ USE_TAR_GZ=${USE_TAR_GZ:-"y"}
|
|
|
+ USE_SINGLE_FOLDER_PATH=${USE_SINGLE_FOLDER_PATH:-"y"}
|
|
|
+
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+
|
|
|
+ export LANGUAGE="en_US:en"
|
|
|
+ export LANG="en_US.UTF-8"
|
|
|
+ export LC_ALL="en_US.UTF-8"
|
|
|
+ export LC_COLLATE="en_US.UTF-8"
|
|
|
+ export LC_CTYPE="UTF-8"
|
|
|
+ export LC_MESSAGES="en_US.UTF-8"
|
|
|
+ export LC_MONETARY="en_US.UTF-8"
|
|
|
+ export LC_NUMERIC="en_US.UTF-8"
|
|
|
+ export LC_TIME="en_US.UTF-8"
|
|
|
+
|
|
|
+ export PATH
|
|
|
+ export LD_LIBRARY_PATH
|
|
|
+
|
|
|
+ export SOURCES_FOLDER_PATH
|
|
|
+
|
|
|
+ # libtool fails with the Ubuntu /bin/sh.
|
|
|
+ export SHELL="/bin/bash"
|
|
|
+ export CONFIG_SHELL="/bin/bash"
|
|
|
+
|
|
|
+ echo
|
|
|
+ env | sort
|
|
|
+}
|
|
|
+
|
|
|
+function prepare_xbb_extras()
|
|
|
+{
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+
|
|
|
+ XBB_CPPFLAGS=""
|
|
|
+
|
|
|
+ XBB_CFLAGS="-ffunction-sections -fdata-sections -pipe"
|
|
|
+ XBB_CXXFLAGS="-ffunction-sections -fdata-sections -pipe"
|
|
|
+
|
|
|
+ if [ "${TARGET_ARCH}" == "x64" -o "${TARGET_ARCH}" == "x32" ]
|
|
|
+ then
|
|
|
+ XBB_CFLAGS+=" -m${TARGET_BITS}"
|
|
|
+ XBB_CXXFLAGS+=" -m${TARGET_BITS}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ XBB_LDFLAGS=""
|
|
|
+
|
|
|
+ if [ "${IS_DEBUG}" == "y" ]
|
|
|
+ then
|
|
|
+ XBB_CFLAGS+=" -g -O0"
|
|
|
+ XBB_CXXFLAGS+=" -g -O0"
|
|
|
+ XBB_LDFLAGS+=" -g -O0"
|
|
|
+ else
|
|
|
+ XBB_CFLAGS+=" -O2"
|
|
|
+ XBB_CXXFLAGS+=" -O2"
|
|
|
+ XBB_LDFLAGS+=" -O2"
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ ! -z "$(xbb_activate; which "g++-xbb")" ]
|
|
|
+ then
|
|
|
+ prepare_gcc_env "" "-xbb"
|
|
|
+ elif [ ! -z "$(xbb_activate; which "g++-9")" ]
|
|
|
+ then
|
|
|
+ prepare_gcc_env "" "-9"
|
|
|
+ elif [ ! -z "$(xbb_activate; which "g++-8")" ]
|
|
|
+ then
|
|
|
+ prepare_gcc_env "" "-8"
|
|
|
+ elif [ ! -z "$(xbb_activate; which "g++-7")" ]
|
|
|
+ then
|
|
|
+ prepare_gcc_env "" "-7"
|
|
|
+ else
|
|
|
+ prepare_gcc_env "" ""
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+ # Do not add -static here, it fails.
|
|
|
+ # Do not try to link pthread statically, it must match the system glibc.
|
|
|
+ XBB_LDFLAGS_LIB="${XBB_LDFLAGS}"
|
|
|
+ XBB_LDFLAGS_APP="${XBB_LDFLAGS} -Wl,--gc-sections"
|
|
|
+ XBB_LDFLAGS_APP_STATIC_GCC="${XBB_LDFLAGS_APP} -static-libgcc -static-libstdc++"
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+ # Note: macOS linker ignores -static-libstdc++, so
|
|
|
+ # libstdc++.6.dylib should be handled.
|
|
|
+ XBB_LDFLAGS+=" -Wl,-macosx_version_min,10.10"
|
|
|
+ XBB_LDFLAGS_LIB="${XBB_LDFLAGS}"
|
|
|
+ XBB_LDFLAGS_APP="${XBB_LDFLAGS} -Wl,-dead_strip"
|
|
|
+ XBB_LDFLAGS_APP_STATIC_GCC="${XBB_LDFLAGS_APP}"
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ export NATIVE_CC=${CC}
|
|
|
+ export NATIVE_CXX=${CXX}
|
|
|
+
|
|
|
+ prepare_gcc_env "${CROSS_COMPILE_PREFIX}-"
|
|
|
+
|
|
|
+ # CRT_glob is from Arm script
|
|
|
+ # -static avoids libwinpthread-1.dll
|
|
|
+ # -static-libgcc avoids libgcc_s_sjlj-1.dll
|
|
|
+ XBB_LDFLAGS_LIB="${XBB_LDFLAGS}"
|
|
|
+ XBB_LDFLAGS_APP="${XBB_LDFLAGS} -Wl,--gc-sections"
|
|
|
+ XBB_LDFLAGS_APP_STATIC_GCC="${XBB_LDFLAGS_APP} -static-libgcc -static-libstdc++"
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ XBB_CFLAGS_NO_W="${XBB_CFLAGS} -w"
|
|
|
+ XBB_CXXFLAGS_NO_W="${XBB_CXXFLAGS} -w"
|
|
|
+
|
|
|
+ set +u
|
|
|
+ if [ ! -z "${XBB_FOLDER_PATH}" -a -x "${XBB_FOLDER_PATH}/bin/pkg-config-verbose" ]
|
|
|
+ then
|
|
|
+ PKG_CONFIG="${XBB_FOLDER_PATH}/bin/pkg-config-verbose"
|
|
|
+ else
|
|
|
+ PKG_CONFIG="$(which pkg-config)"
|
|
|
+ fi
|
|
|
+ set -u
|
|
|
+
|
|
|
+ # Hopefully defining it empty would be enough...
|
|
|
+ PKG_CONFIG_PATH=${PKG_CONFIG_PATH:-""}
|
|
|
+
|
|
|
+ # Prevent pkg-config to search the system folders (configured in the
|
|
|
+ # pkg-config at build time).
|
|
|
+ PKG_CONFIG_LIBDIR=${PKG_CONFIG_LIBDIR:-""}
|
|
|
+
|
|
|
+ set +u
|
|
|
+ echo
|
|
|
+ echo "CC=${CC}"
|
|
|
+ echo "CXX=${CXX}"
|
|
|
+ echo "XBB_CPPFLAGS=${XBB_CPPFLAGS}"
|
|
|
+ echo "XBB_CFLAGS=${XBB_CFLAGS}"
|
|
|
+ echo "XBB_CXXFLAGS=${XBB_CXXFLAGS}"
|
|
|
+
|
|
|
+ echo "XBB_LDFLAGS_LIB=${XBB_LDFLAGS_LIB}"
|
|
|
+ echo "XBB_LDFLAGS_APP=${XBB_LDFLAGS_APP}"
|
|
|
+ echo "XBB_LDFLAGS_APP_STATIC_GCC=${XBB_LDFLAGS_APP_STATIC_GCC}"
|
|
|
+
|
|
|
+ echo "PKG_CONFIG=${PKG_CONFIG}"
|
|
|
+ echo "PKG_CONFIG_PATH=${PKG_CONFIG_PATH}"
|
|
|
+ echo "PKG_CONFIG_LIBDIR=${PKG_CONFIG_LIBDIR}"
|
|
|
+ set -u
|
|
|
+
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ which ${CC}
|
|
|
+ ${CC} --version
|
|
|
+
|
|
|
+ which make
|
|
|
+ make --version
|
|
|
+ )
|
|
|
+
|
|
|
+ # ---------------------------------------------------------------------------
|
|
|
+
|
|
|
+ # CC & co were exported by prepare_gcc_env.
|
|
|
+ export XBB_CPPFLAGS
|
|
|
+
|
|
|
+ export XBB_CFLAGS
|
|
|
+ export XBB_CXXFLAGS
|
|
|
+
|
|
|
+ export XBB_CFLAGS_NO_W
|
|
|
+ export XBB_CXXFLAGS_NO_W
|
|
|
+
|
|
|
+ export XBB_LDFLAGS
|
|
|
+ export XBB_LDFLAGS_LIB
|
|
|
+ export XBB_LDFLAGS_APP
|
|
|
+ export XBB_LDFLAGS_APP_STATIC_GCC
|
|
|
+
|
|
|
+ export PKG_CONFIG
|
|
|
+ export PKG_CONFIG_PATH
|
|
|
+ export PKG_CONFIG_LIBDIR
|
|
|
+}
|
|
|
+
|
|
|
+function prepare_gcc_env()
|
|
|
+{
|
|
|
+ local prefix="$1"
|
|
|
+
|
|
|
+ local suffix
|
|
|
+ if [ $# -ge 2 ]
|
|
|
+ then
|
|
|
+ suffix="$2"
|
|
|
+ else
|
|
|
+ suffix=""
|
|
|
+ fi
|
|
|
+
|
|
|
+ export CC="${prefix}gcc${suffix}"
|
|
|
+ export CXX="${prefix}g++${suffix}"
|
|
|
+
|
|
|
+ export AR="${prefix}gcc-ar${suffix}"
|
|
|
+ export AS="${prefix}as"
|
|
|
+ export DLLTOOL="${prefix}dlltool"
|
|
|
+ export LD="${prefix}ld"
|
|
|
+ export NM="${prefix}gcc-nm${suffix}"
|
|
|
+ export OBJCOPY="${prefix}objcopy"
|
|
|
+ export OBJDUMP="${prefix}objdump"
|
|
|
+ export RANLIB="${prefix}gcc-ranlib${suffix}"
|
|
|
+ export READELF="${prefix}readelf"
|
|
|
+ export SIZE="${prefix}size"
|
|
|
+ export STRIP="${prefix}strip"
|
|
|
+ export WINDRES="${prefix}windres"
|
|
|
+ export WINDMC="${prefix}windmc"
|
|
|
+ export RC="${prefix}windres"
|
|
|
+}
|
|
|
+
|
|
|
+function unset_gcc_env()
|
|
|
+{
|
|
|
+ unset CC
|
|
|
+ unset CXX
|
|
|
+ unset AR
|
|
|
+ unset AS
|
|
|
+ unset DLLTOOL
|
|
|
+ unset LD
|
|
|
+ unset NM
|
|
|
+ unset OBJCOPY
|
|
|
+ unset OBJDUMP
|
|
|
+ unset RANLIB
|
|
|
+ unset READELF
|
|
|
+ unset SIZE
|
|
|
+ unset STRIP
|
|
|
+ unset WINDRES
|
|
|
+ unset WINDMC
|
|
|
+ unset RC
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function do_actions()
|
|
|
+{
|
|
|
+ if [ "${ACTION}" == "clean" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+
|
|
|
+ if [ "${IS_NATIVE}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the ${TARGET_FOLDER_NAME} build and install ${APP_LC_NAME} folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${TARGET_FOLDER_NAME}/build/${APP_LC_NAME}"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${TARGET_FOLDER_NAME}/install/${APP_LC_NAME}"
|
|
|
+ elif [ ! -z "${DO_BUILD_WIN32}${DO_BUILD_WIN64}${DO_BUILD_LINUX32}${DO_BUILD_LINUX64}${DO_BUILD_OSX}" ]
|
|
|
+ then
|
|
|
+ if [ "${DO_BUILD_WIN32}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the win32-x32 build and install ${APP_LC_NAME} folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x32/build/${APP_LC_NAME}"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x32/install/${APP_LC_NAME}"
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_WIN64}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the win32-x64 build and install ${APP_LC_NAME} folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x64/build/${APP_LC_NAME}"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x64/install/${APP_LC_NAME}"
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_LINUX32}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the linux-x32 build and install ${APP_LC_NAME} folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x32/build/${APP_LC_NAME}"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x32/install/${APP_LC_NAME}"
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_LINUX64}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the linux-x64 build and install ${APP_LC_NAME} folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x64/build/${APP_LC_NAME}"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x64/install/${APP_LC_NAME}"
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_OSX}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the darwin-x64 build and install ${APP_LC_NAME} folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/darwin-x64/build/${APP_LC_NAME}"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/darwin-x64/install/${APP_LC_NAME}"
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ echo "Removing the ${HOST_NODE_PLATFORM}-${HOST_NODE_ARCH} build and install ${APP_LC_NAME} folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${HOST_NODE_PLATFORM}-${HOST_NODE_ARCH}/build/${APP_LC_NAME}"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${HOST_NODE_PLATFORM}-${HOST_NODE_ARCH}/install/${APP_LC_NAME}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ "${ACTION}" == "cleanlibs" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+
|
|
|
+ if [ "${IS_NATIVE}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the ${TARGET_FOLDER_NAME} build and install libs folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${TARGET_FOLDER_NAME}/build/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${TARGET_FOLDER_NAME}/install/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${TARGET_FOLDER_NAME}/install"/stamp-*-installed
|
|
|
+ elif [ ! -z "${DO_BUILD_WIN32}${DO_BUILD_WIN64}${DO_BUILD_LINUX32}${DO_BUILD_LINUX64}${DO_BUILD_OSX}" ]
|
|
|
+ then
|
|
|
+ if [ "${DO_BUILD_WIN32}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the win32-x32 build and install libs folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x32/build/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x32/install/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x32/install"/stamp-*-installed
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_WIN64}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the win32-x64 build and install libs folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x64/build/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x64/install/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x64/install"/stamp-*-installed
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_LINUX32}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the linux-x32 build and install libs folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x32/build/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x32/install/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x32/install"/stamp-*-installed
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_LINUX64}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the linux-x64 build and install libs folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x64/build/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x64/install/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x64/install"/stamp-*-installed
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_OSX}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the darwin-x64 build and install libs folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/darwin-x64/build/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/darwin-x64/install/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/darwin-x64/install"/stamp-*-installed
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ echo "Removing the ${HOST_NODE_PLATFORM}-${HOST_NODE_ARCH} build and install libs folders..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${HOST_NODE_PLATFORM}-${HOST_NODE_ARCH}/build/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${HOST_NODE_PLATFORM}-${HOST_NODE_ARCH}/install/libs"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${HOST_NODE_PLATFORM}-${HOST_NODE_ARCH}/install"/stamp-*-installed
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ "${ACTION}" == "cleanall" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ if [ "${IS_NATIVE}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the ${TARGET_FOLDER_NAME} folder..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${TARGET_FOLDER_NAME}"
|
|
|
+ elif [ ! -z "${DO_BUILD_WIN32}${DO_BUILD_WIN64}${DO_BUILD_LINUX32}${DO_BUILD_LINUX64}${DO_BUILD_OSX}" ]
|
|
|
+ then
|
|
|
+ if [ "${DO_BUILD_WIN32}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the win32-x32 folder..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x32"
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_WIN64}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the win32-x64 folder..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/win32-x64"
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_LINUX32}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the linux-x32 folder..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x32"
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_LINUX64}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the linux-x64 folder..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/linux-x64"
|
|
|
+ fi
|
|
|
+ if [ "${DO_BUILD_OSX}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "Removing the darwin-x64 folder..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/darwin-x64"
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ echo "Removing the ${HOST_NODE_PLATFORM}-${HOST_NODE_ARCH} folder..."
|
|
|
+
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/${HOST_NODE_PLATFORM}-${HOST_NODE_ARCH}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ "${ACTION}" == "clean" -o "${ACTION}" == "cleanlibs" -o "${ACTION}" == "cleanall" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo "Clean completed. Proceed with a regular build."
|
|
|
+
|
|
|
+ exit 0
|
|
|
+ fi
|
|
|
+
|
|
|
+ # Not used for native buils. Otherwise the names of the docker images
|
|
|
+ # must be set.
|
|
|
+ if [ "${ACTION}" == "preload-images" ]
|
|
|
+ then
|
|
|
+ host_start_timer
|
|
|
+
|
|
|
+ host_prepare_docker
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Check/Preload Docker images..."
|
|
|
+
|
|
|
+ if [ "${HOST_MACHINE}" == "aarch64" -o "${HOST_MACHINE}" == "armv7l" -o "${HOST_MACHINE}" == "armv8l" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ docker run --interactive --tty "${docker_linux_arm64_image}" \
|
|
|
+ lsb_release --description --short
|
|
|
+
|
|
|
+ echo
|
|
|
+ docker run --interactive --tty "${docker_linux_arm32_image}" \
|
|
|
+ lsb_release --description --short
|
|
|
+ else
|
|
|
+ echo
|
|
|
+ docker run --interactive --tty "${docker_linux64_image}" \
|
|
|
+ lsb_release --description --short
|
|
|
+
|
|
|
+ echo
|
|
|
+ docker run --interactive --tty "${docker_linux32_image}" \
|
|
|
+ lsb_release --description --short
|
|
|
+ fi
|
|
|
+
|
|
|
+ echo
|
|
|
+ docker images
|
|
|
+
|
|
|
+ host_stop_timer
|
|
|
+
|
|
|
+ exit 0
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function run_verbose()
|
|
|
+{
|
|
|
+ # Does not include the .exe extension.
|
|
|
+ local app_path=$1
|
|
|
+ shift
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "[${app_path} $@]"
|
|
|
+ "${app_path}" "$@" 2>&1
|
|
|
+}
|
|
|
+
|
|
|
+function run_app()
|
|
|
+{
|
|
|
+ # Does not include the .exe extension.
|
|
|
+ local app_path=$1
|
|
|
+ shift
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "${app_path} $@"
|
|
|
+ if [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+ "${app_path}" "$@"
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+ "${app_path}" "$@"
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ local wsl_path=$(which wsl.exe)
|
|
|
+ if [ ! -z "${wsl_path}" ]
|
|
|
+ then
|
|
|
+ "${app_path}.exe" "$@"
|
|
|
+ else
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ local wine_path=$(which wine)
|
|
|
+ if [ ! -z "${wine_path}" ]
|
|
|
+ then
|
|
|
+ wine "${app_path}.exe" "$@"
|
|
|
+ else
|
|
|
+ echo "Install wine if you want to run the .exe binaries on Linux."
|
|
|
+ fi
|
|
|
+ )
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+function show_libs()
|
|
|
+{
|
|
|
+ # Does not include the .exe extension.
|
|
|
+ local app_path=$1
|
|
|
+ shift
|
|
|
+
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ if [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo "readelf -d ${app_path} | grep 'ibrary'"
|
|
|
+ # Ignore errors in case it is not using shared libraries.
|
|
|
+ set +e
|
|
|
+ readelf -d "${app_path}" | grep 'ibrary'
|
|
|
+ echo "ldd -v ${app_path}"
|
|
|
+ ldd -v "${app_path}"
|
|
|
+ set -e
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo "otool -L ${app_path}"
|
|
|
+ otool -L "${app_path}"
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo ${CROSS_COMPILE_PREFIX}-objdump -x ${app_path}.exe
|
|
|
+ ${CROSS_COMPILE_PREFIX}-objdump -x ${app_path}.exe | grep -i 'DLL Name'
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function do_patch()
|
|
|
+{
|
|
|
+ if [ ! -z "$1" ]
|
|
|
+ then
|
|
|
+ local patch_file_name="$1"
|
|
|
+ local patch_path="${BUILD_GIT_PATH}/patches/${patch_file_name}"
|
|
|
+ if [ -f "${patch_path}" ]
|
|
|
+ then
|
|
|
+ echo "Patching..."
|
|
|
+ patch -p0 < "${patch_path}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+function extract()
|
|
|
+{
|
|
|
+ local archive_name="$1"
|
|
|
+ local folder_name="$2"
|
|
|
+ # local patch_file_name="$3"
|
|
|
+ local pwd="$(pwd)"
|
|
|
+
|
|
|
+ if [ ! -d "${folder_name}" ]
|
|
|
+ then
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Extracting \"${archive_name}\" -> \"${pwd}/${folder_name}\"..."
|
|
|
+ if [[ "${archive_name}" == *zip ]]
|
|
|
+ then
|
|
|
+ unzip "${archive_name}"
|
|
|
+ else
|
|
|
+ if [ ! -z "${DEBUG}" ]
|
|
|
+ then
|
|
|
+ tar -x -v -f "${archive_name}"
|
|
|
+ else
|
|
|
+ tar -x -f "${archive_name}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ $# -ge 3 ]
|
|
|
+ then
|
|
|
+ cd "${folder_name}"
|
|
|
+ do_patch "$3"
|
|
|
+ fi
|
|
|
+ )
|
|
|
+ else
|
|
|
+ echo "Folder \"${pwd}/${folder_name}\" already present."
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+function download()
|
|
|
+{
|
|
|
+ local url="$1"
|
|
|
+ local archive_name="$2"
|
|
|
+
|
|
|
+ if [ ! -f "${DOWNLOAD_FOLDER_PATH}/${archive_name}" ]
|
|
|
+ then
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Downloading \"${archive_name}\" from \"${url}\"..."
|
|
|
+ rm -f "${DOWNLOAD_FOLDER_PATH}/${archive_name}.download"
|
|
|
+ mkdir -pv "${DOWNLOAD_FOLDER_PATH}"
|
|
|
+ curl --fail -L -o "${DOWNLOAD_FOLDER_PATH}/${archive_name}.download" "${url}"
|
|
|
+ mv "${DOWNLOAD_FOLDER_PATH}/${archive_name}.download" "${DOWNLOAD_FOLDER_PATH}/${archive_name}"
|
|
|
+ )
|
|
|
+ else
|
|
|
+ echo "File \"${DOWNLOAD_FOLDER_PATH}/${archive_name}\" already downloaded."
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# $4 is the patch file name
|
|
|
+function download_and_extract()
|
|
|
+{
|
|
|
+ local url="$1"
|
|
|
+ local archive_name="$2"
|
|
|
+ local folder_name="$3"
|
|
|
+
|
|
|
+ download "${url}" "${archive_name}"
|
|
|
+ if [ $# -ge 4 ]
|
|
|
+ then
|
|
|
+ extract "${DOWNLOAD_FOLDER_PATH}/${archive_name}" "${folder_name}" "$4"
|
|
|
+ else
|
|
|
+ extract "${DOWNLOAD_FOLDER_PATH}/${archive_name}" "${folder_name}"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+function git_clone()
|
|
|
+{
|
|
|
+ local url="$1"
|
|
|
+ local branch="$2"
|
|
|
+ local commit="$3"
|
|
|
+ local folder_name="$4"
|
|
|
+
|
|
|
+ (
|
|
|
+ echo
|
|
|
+ echo "Cloning \"${folder_name}\" from \"${url}\"..."
|
|
|
+ git clone --branch="${branch}" "${url}" "${folder_name}"
|
|
|
+ if [ -n "${commit}" ]
|
|
|
+ then
|
|
|
+ cd "${folder_name}"
|
|
|
+ git checkout -qf "${commit}"
|
|
|
+ fi
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+# Copy the build files to the Work area, to make them easily available.
|
|
|
+function copy_build_git()
|
|
|
+{
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/build.git"
|
|
|
+ mkdir -pv "${HOST_WORK_FOLDER_PATH}/build.git"
|
|
|
+ cp -r "$(dirname ${script_folder_path})"/* "${HOST_WORK_FOLDER_PATH}/build.git"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/build.git/scripts/helper/.git"
|
|
|
+ rm -rf "${HOST_WORK_FOLDER_PATH}/build.git/scripts/helper/build-helper.sh"
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function check_binary()
|
|
|
+{
|
|
|
+ local file_path="$1"
|
|
|
+
|
|
|
+ if [ ! -x "${file_path}" ]
|
|
|
+ then
|
|
|
+ return 0
|
|
|
+ fi
|
|
|
+
|
|
|
+ if file --mime "${file_path}" | grep -q text
|
|
|
+ then
|
|
|
+ return 0
|
|
|
+ fi
|
|
|
+
|
|
|
+ check_binary_for_libraries "$1"
|
|
|
+}
|
|
|
+
|
|
|
+function check_binary_for_libraries()
|
|
|
+{
|
|
|
+ local file_path="$1"
|
|
|
+ local file_name="$(basename ${file_path})"
|
|
|
+ local folder_path="$(dirname ${file_path})"
|
|
|
+
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ if [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo "${file_name} (${file_path})"
|
|
|
+ set +e
|
|
|
+ ${CROSS_COMPILE_PREFIX}-objdump -x "${file_path}" | grep -i 'DLL Name'
|
|
|
+
|
|
|
+ local dll_names=$(${CROSS_COMPILE_PREFIX}-objdump -x "${file_path}" \
|
|
|
+ | grep -i 'DLL Name' \
|
|
|
+ | sed -e 's/.*DLL Name: \(.*\)/\1/' \
|
|
|
+ )
|
|
|
+
|
|
|
+ local n
|
|
|
+ for n in ${dll_names}
|
|
|
+ do
|
|
|
+ if [ ! -f "${folder_path}/${n}" ]
|
|
|
+ then
|
|
|
+ if is_win_sys_dll "${n}"
|
|
|
+ then
|
|
|
+ :
|
|
|
+ elif [ "${n}${HAS_WINPTHREAD}" == "libwinpthread-1.dlly" ]
|
|
|
+ then
|
|
|
+ :
|
|
|
+ elif [[ ${n} == python*.dll ]] && [[ ${file_name} == *-gdb-py.exe ]]
|
|
|
+ then
|
|
|
+ :
|
|
|
+ else
|
|
|
+ echo "Unexpected |${n}|"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ set -e
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ (
|
|
|
+ set +e
|
|
|
+ cd ${folder_path}
|
|
|
+ otool -L "${file_name}"
|
|
|
+ set -e
|
|
|
+ )
|
|
|
+
|
|
|
+ # Skip the first line which is the binary itself.
|
|
|
+ local libs
|
|
|
+ if [[ "${file_name}" == *\.dylib ]]
|
|
|
+ then
|
|
|
+ # Skip the second line too, which is the library again.
|
|
|
+ lib_names=$(otool -L "${file_path}" \
|
|
|
+ | sed '1d' \
|
|
|
+ | sed '1d' \
|
|
|
+ | sed -e 's|[[:space:]]*\(.*\) (.*)|\1|' \
|
|
|
+ )
|
|
|
+ else
|
|
|
+ lib_names=$(otool -L "${file_path}" \
|
|
|
+ | sed '1d' \
|
|
|
+ | sed -e 's|[[:space:]]*\(.*\) (.*)|\1|' \
|
|
|
+ )
|
|
|
+ fi
|
|
|
+ for lib_name in ${lib_names}
|
|
|
+ do
|
|
|
+ if [ "${lib_name:0:1}" != "@" ]
|
|
|
+ then
|
|
|
+ if ! is_darwin_allowed_sys_dylib "${lib_name}"
|
|
|
+ then
|
|
|
+ echo ">>> \"${lib_name}\" is not expected here"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+ # More or less deprecated by the above.
|
|
|
+ set +e
|
|
|
+ local unxp
|
|
|
+ if [[ "${file_name}" == *\.dylib ]]
|
|
|
+ then
|
|
|
+ unxp=$(otool -L "${file_path}" | sed '1d' | sed '1d' | grep -v "${file_name}" | egrep -e "(macports|homebrew|opt|install)/")
|
|
|
+ else
|
|
|
+ unxp=$(otool -L "${file_path}" | sed '1d' | grep -v "${file_name}" | egrep -e "(macports|homebrew|opt|install)/")
|
|
|
+ fi
|
|
|
+ set -e
|
|
|
+
|
|
|
+ # echo "|${unxp}|"
|
|
|
+ if [ ! -z "$unxp" ]
|
|
|
+ then
|
|
|
+ echo "Unexpected |${unxp}|"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo "${file_name} (${file_path})"
|
|
|
+ set +e
|
|
|
+ readelf -d "${file_path}" | egrep -i '(SONAME)'
|
|
|
+ readelf -d "${file_path}" | egrep -i '(RUNPATH|RPATH)'
|
|
|
+ readelf -d "${file_path}" | egrep -i '(NEEDED)'
|
|
|
+
|
|
|
+ local so_names=$(readelf -d "${file_path}" \
|
|
|
+ | grep -i 'Shared library' \
|
|
|
+ | sed -e 's/.*Shared library: \[\(.*\)\]/\1/' \
|
|
|
+ )
|
|
|
+
|
|
|
+ local relative_path=$(readelf -d "${file_path}" | egrep -i '(RUNPATH|RPATH)' | sed -e 's/.*\[\$ORIGIN//' | sed -e 's/\].*//')
|
|
|
+ # echo $relative_path
|
|
|
+
|
|
|
+ for so_name in ${so_names}
|
|
|
+ do
|
|
|
+ if [ ! -f "${folder_path}${relative_path}/${so_name}" ]
|
|
|
+ then
|
|
|
+ if is_linux_sys_so "${so_name}"
|
|
|
+ then
|
|
|
+ :
|
|
|
+ elif [[ ${so_name} == libpython* ]] && [[ ${file_name} == *-gdb-py ]]
|
|
|
+ then
|
|
|
+ :
|
|
|
+ else
|
|
|
+ echo "Unexpected |${so_name}|"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ set -e
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+function is_win_sys_dll()
|
|
|
+{
|
|
|
+ local dll_name="$(echo "$1" | tr "[:upper:]" "[:lower:]")"
|
|
|
+
|
|
|
+ # DLLs that are expected to be present on any Windows.
|
|
|
+ # Be sure all names are lower case!
|
|
|
+ local sys_dlls=( \
|
|
|
+ advapi32.dll \
|
|
|
+ cfgmgr32.dll \
|
|
|
+ crypt32.dll \
|
|
|
+ dnsapi.dll \
|
|
|
+ gdi32.dll \
|
|
|
+ imm32.dll \
|
|
|
+ imm32.dll \
|
|
|
+ iphlpapi.dll \
|
|
|
+ iphlpapi.dll \
|
|
|
+ kernel32.dll \
|
|
|
+ msvcr90.dll \
|
|
|
+ oleaut32.dll \
|
|
|
+ psapi.dll \
|
|
|
+ rpcrt4.dll \
|
|
|
+ setupapi.dll \
|
|
|
+ shell32.dll \
|
|
|
+ shlwapi.dll \
|
|
|
+ user32.dll \
|
|
|
+ userenv.dll \
|
|
|
+ vcruntime140.dll \
|
|
|
+ version.dll \
|
|
|
+ winmm.dll \
|
|
|
+ winmm.dll \
|
|
|
+ ws2_32.dll \
|
|
|
+ \
|
|
|
+ msvcrt.dll \
|
|
|
+ ole32.dll \
|
|
|
+ api-ms-win-crt-runtime-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-math-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-locale-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-string-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-stdio-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-convert-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-time-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-environment-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-process-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-heap-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-conio-l1-1-0.dll \
|
|
|
+ api-ms-win-crt-filesystem-l1-1-0.dll \
|
|
|
+ )
|
|
|
+
|
|
|
+ # The Python DLL were a permanent source of trouble.
|
|
|
+ # python27.dll \
|
|
|
+ # The latest Python 2.7.18 has no DLL at all, so it cannot be skipped.
|
|
|
+ # python37.dll \
|
|
|
+ # The Python 3 seems better, allow to copy it in the archive,
|
|
|
+ # to be sure it matches the version used during build.
|
|
|
+
|
|
|
+ local dll
|
|
|
+ for dll in "${sys_dlls[@]}"
|
|
|
+ do
|
|
|
+ if [ "${dll}" == "${dll_name}" ]
|
|
|
+ then
|
|
|
+ return 0 # True
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ return 1 # False
|
|
|
+}
|
|
|
+
|
|
|
+function is_linux_sys_so()
|
|
|
+{
|
|
|
+ local lib_name="$1"
|
|
|
+
|
|
|
+ # Do not add these two, they are present if the toolchain is installed,
|
|
|
+ # but this is not guaranteed, so better copy them from the xbb toolchain.
|
|
|
+ # libstdc++.so.6
|
|
|
+ # libgcc_s.so.1
|
|
|
+
|
|
|
+ # Shared libraries that are expected to be present on any Linux.
|
|
|
+ # Note the X11 libraries.
|
|
|
+ local sys_lib_names=(\
|
|
|
+ librt.so.1 \
|
|
|
+ libm.so.6 \
|
|
|
+ libc.so.6 \
|
|
|
+ libutil.so.1 \
|
|
|
+ libpthread.so.0 \
|
|
|
+ libdl.so.2 \
|
|
|
+ ld-linux.so.2 \
|
|
|
+ ld-linux.so.3 \
|
|
|
+ ld-linux-x86-64.so.2 \
|
|
|
+ ld-linux-armhf.so.3 \
|
|
|
+ ld-linux-arm64.so.1 \
|
|
|
+ ld-linux-aarch64.so.1 \
|
|
|
+ libX11.so.6 \
|
|
|
+ libXau.so.6 \
|
|
|
+ libxcb.so.1 \
|
|
|
+ )
|
|
|
+
|
|
|
+ local sys_lib_name
|
|
|
+ for sys_lib_name in "${sys_lib_names[@]}"
|
|
|
+ do
|
|
|
+ if [ "${lib_name}" == "${sys_lib_name}" ]
|
|
|
+ then
|
|
|
+ return 0 # True
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ return 1 # False
|
|
|
+}
|
|
|
+
|
|
|
+function is_darwin_sys_dylib()
|
|
|
+{
|
|
|
+ local lib_name="$1"
|
|
|
+
|
|
|
+ if [[ ${lib_name} == /usr/lib* ]]
|
|
|
+ then
|
|
|
+ return 0 # True
|
|
|
+ fi
|
|
|
+ if [[ ${lib_name} == /System/Library/Frameworks/* ]]
|
|
|
+ then
|
|
|
+ return 0 # True
|
|
|
+ fi
|
|
|
+ if [[ ${lib_name} == /Library/Frameworks/* ]]
|
|
|
+ then
|
|
|
+ return 0 # True
|
|
|
+ fi
|
|
|
+
|
|
|
+ return 1 # False
|
|
|
+}
|
|
|
+
|
|
|
+function is_darwin_allowed_sys_dylib()
|
|
|
+{
|
|
|
+ local lib_name="$1"
|
|
|
+
|
|
|
+ # Since there is no -static-libc++, the first attempt was to not
|
|
|
+ # define these here and have the 10.10 ones copied to the application.
|
|
|
+ # Building CMake proved that this is ok with 10.11 and 10.12, but
|
|
|
+ # failes on 10.13 and 10.14 with:
|
|
|
+ # dyld: Symbol not found: __ZNSt3__118shared_timed_mutex13unlock_sharedEv
|
|
|
+ # Referenced from: /System/Library/Frameworks/CoreDisplay.framework/Versions/A/CoreDisplay
|
|
|
+ # Expected in: /Users/travis/test-cmake/xpack-cmake-3.17.1-1/bin/libc++.1.dylib
|
|
|
+ # in /System/Library/Frameworks/CoreDisplay.framework/Versions/A/CoreDisplay
|
|
|
+ #
|
|
|
+ # /usr/lib/libc++.dylib \
|
|
|
+ # /usr/lib/libc++.1.dylib \
|
|
|
+ # /usr/lib/libc++abi.dylib \
|
|
|
+
|
|
|
+ # Same for -static-libgcc; there were no cases which failed on later releases,
|
|
|
+ # but for consistency, they are also included here.
|
|
|
+ #
|
|
|
+ # /usr/lib/libgcc_s.1.dylib \
|
|
|
+
|
|
|
+ local sys_libs=(\
|
|
|
+ /usr/lib/libgcc_s.1.dylib \
|
|
|
+ /
|
|
|
+ /usr/lib/libc++.dylib \
|
|
|
+ /usr/lib/libc++.1.dylib \
|
|
|
+ /usr/lib/libc++abi.dylib \
|
|
|
+ /
|
|
|
+ /usr/lib/libSystem.B.dylib \
|
|
|
+ /usr/lib/libobjc.A.dylib \
|
|
|
+ )
|
|
|
+
|
|
|
+ if [[ ${lib_name} == /System/Library/Frameworks/* ]]
|
|
|
+ then
|
|
|
+ # Allow all system frameworks.
|
|
|
+ return 0 # True
|
|
|
+ fi
|
|
|
+
|
|
|
+ local lib
|
|
|
+ for lib in "${sys_libs[@]}"
|
|
|
+ do
|
|
|
+ if [ "${lib}" == "${lib_name}" ]
|
|
|
+ then
|
|
|
+ return 0 # True
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ return 1 # False
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function has_origin()
|
|
|
+{
|
|
|
+ if [ $# -lt 1 ]
|
|
|
+ then
|
|
|
+ warning "has_origin: Missing file argument"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ local bin="$1"
|
|
|
+ if [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+ local origin=$(readelf -d ${bin} | grep 'Library runpath: \[$ORIGIN\]')
|
|
|
+ if [ ! -z "${origin}" ]
|
|
|
+ then
|
|
|
+ return 0 # true
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ return 1 # false
|
|
|
+}
|
|
|
+
|
|
|
+# Strip binary files as in "strip binary" form, for both native
|
|
|
+# (linux/mac) and mingw.
|
|
|
+function strip_binary2()
|
|
|
+{
|
|
|
+ (
|
|
|
+ set +e
|
|
|
+ if [ $# -lt 2 ]
|
|
|
+ then
|
|
|
+ warning "strip_binary: Missing arguments"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ local strip="$1"
|
|
|
+ local bin="$2"
|
|
|
+
|
|
|
+ if is_elf "${bin}"
|
|
|
+ then
|
|
|
+ if has_origin "${bin}"
|
|
|
+ then
|
|
|
+ echo "${strip} ${bin} skipped (patched)"
|
|
|
+ else
|
|
|
+ echo "${strip} ${bin}"
|
|
|
+ # ${strip} ${bin} 2>/dev/null || true
|
|
|
+ "${strip}" -S "${bin}" || true
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ echo $(file "${bin}")
|
|
|
+ fi
|
|
|
+
|
|
|
+ set -e
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+function strip_binary()
|
|
|
+{
|
|
|
+ if [ $# -lt 1 ]
|
|
|
+ then
|
|
|
+ warning "strip_binary: Missing file argument"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ local file_path="$1"
|
|
|
+
|
|
|
+ if ! is_elf "${file_path}"
|
|
|
+ then
|
|
|
+ echo $(file "${file_path}")
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
+ local strip="strip"
|
|
|
+ if [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ strip="${CROSS_COMPILE_PREFIX}-strip"
|
|
|
+ if [[ "${file_path}" != *.exe ]] && [[ "${file_path}" != *.dll ]]
|
|
|
+ then
|
|
|
+ bin="${file_path}.exe"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ if has_origin "${file_path}"
|
|
|
+ then
|
|
|
+ # If the file was patched, skip strip, otherwise
|
|
|
+ # we may damage the binary due to a bug in strip.
|
|
|
+ echo "${strip} ${file_path} skipped (patched)"
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
+ echo "${strip} ${file_path}"
|
|
|
+ "${strip}" -S "${file_path}" || true
|
|
|
+}
|
|
|
+
|
|
|
+function is_elf()
|
|
|
+{
|
|
|
+ if [ $# -lt 1 ]
|
|
|
+ then
|
|
|
+ warning "is_elf: Missing arguments"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ local bin_path="$1"
|
|
|
+
|
|
|
+ # Symlinks do not match.
|
|
|
+ if [ -L "${bin_path}" ]
|
|
|
+ then
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ -f "${bin_path}" ]
|
|
|
+ then
|
|
|
+ # Return 0 (true) if found.
|
|
|
+ file ${bin_path} | egrep -q "( ELF )|( PE )|( PE32 )|( PE32\+ )|( Mach-O )"
|
|
|
+ else
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+function is_ar()
|
|
|
+{
|
|
|
+ if [ $# -lt 1 ]
|
|
|
+ then
|
|
|
+ warning "is_ar: Missing arguments"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ local bin_path="$1"
|
|
|
+
|
|
|
+ # Symlinks do not match.
|
|
|
+ if [ -L "${bin_path}" ]
|
|
|
+ then
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ -f "${bin_path}" ]
|
|
|
+ then
|
|
|
+ # Return 0 (true) if found.
|
|
|
+ file ${bin_path} | egrep -q "ar archive"
|
|
|
+ else
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+# Deprecated, use copy_dependencies_recursive().
|
|
|
+function copy_win_gcc_dll()
|
|
|
+{
|
|
|
+ local dll_name="$1"
|
|
|
+
|
|
|
+ # Identify the current cross gcc version, to locate the specific dll folder.
|
|
|
+ local cross_gcc_version=$(${CROSS_COMPILE_PREFIX}-gcc --version | grep 'gcc' | sed -e 's/.*\s\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\).*/\1.\2.\3/')
|
|
|
+ local cross_gcc_version_short=$(echo ${cross_gcc_version} | sed -e 's/\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\).*/\1.\2/')
|
|
|
+ local SUBLOCATION="-win32"
|
|
|
+
|
|
|
+ # First try Ubuntu specific locations,
|
|
|
+ # then do a long full search.
|
|
|
+
|
|
|
+ if [ -f "${XBB_FOLDER_PATH}/${CROSS_COMPILE_PREFIX}/lib/${dll_name}" ]
|
|
|
+ then
|
|
|
+ cp -v "${XBB_FOLDER_PATH}/${CROSS_COMPILE_PREFIX}/lib/${dll_name}" \
|
|
|
+ "${APP_PREFIX}/bin"
|
|
|
+ elif [ -f "/usr/lib/gcc/${CROSS_COMPILE_PREFIX}/${cross_gcc_version}/${dll_name}" ]
|
|
|
+ then
|
|
|
+ cp -v "/usr/lib/gcc/${CROSS_COMPILE_PREFIX}/${cross_gcc_version}/${dll_name}" \
|
|
|
+ "${APP_PREFIX}/bin"
|
|
|
+ elif [ -f "/usr/lib/gcc/${CROSS_COMPILE_PREFIX}/${cross_gcc_version_short}/${dll_name}" ]
|
|
|
+ then
|
|
|
+ cp -v "/usr/lib/gcc/${CROSS_COMPILE_PREFIX}/${cross_gcc_version_short}/${dll_name}" \
|
|
|
+ "${APP_PREFIX}/bin"
|
|
|
+ elif [ -f "/usr/lib/gcc/${CROSS_COMPILE_PREFIX}/${cross_gcc_version_short}${SUBLOCATION}/${dll_name}" ]
|
|
|
+ then
|
|
|
+ cp -v "/usr/lib/gcc/${CROSS_COMPILE_PREFIX}/${cross_gcc_version_short}${SUBLOCATION}/${dll_name}" \
|
|
|
+ "${APP_PREFIX}/bin"
|
|
|
+ else
|
|
|
+ echo "Searching /usr for ${dll_name}..."
|
|
|
+ SJLJ_PATH=$(find "${XBB_FOLDER_PATH}/${CROSS_COMPILE_PREFIX}" /usr \! -readable -prune -o -name ${dll_name} -print | grep ${CROSS_COMPILE_PREFIX})
|
|
|
+ cp -v ${SJLJ_PATH} "${APP_PREFIX}/bin"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# Deprecated, use copy_dependencies_recursive().
|
|
|
+function copy_win_libwinpthread_dll()
|
|
|
+{
|
|
|
+ if [ -f "${XBB_FOLDER_PATH}/${CROSS_COMPILE_PREFIX}/bin/libwinpthread-1.dll" ]
|
|
|
+ then
|
|
|
+ cp "${XBB_FOLDER_PATH}/${CROSS_COMPILE_PREFIX}/bin/libwinpthread-1.dll" \
|
|
|
+ "${APP_PREFIX}/bin"
|
|
|
+ else
|
|
|
+ echo "No libwinpthread-1.dll"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function change_dylib()
|
|
|
+{
|
|
|
+ local dylib_name="$1"
|
|
|
+ local file_path="$2"
|
|
|
+
|
|
|
+ local dylib_path="$(otool -L "${file_path}" | sed '1d' | sed -e 's|[[:space:]]*\(.*\)[[:space:]][(].*[)]|\1|' | grep "${dylib_name}")"
|
|
|
+
|
|
|
+ if [ -z "${dylib_path}" ]
|
|
|
+ then
|
|
|
+ echo "Dylib ${dylib_name} may not used in binary ${file_path}..."
|
|
|
+ # for example libftdi1.2.4.0.dylib has the name libftdi1.2.dylib.
|
|
|
+ # exit 1
|
|
|
+ elif [ $(printf "${dylib_path}" | wc -l) -gt 1 ]
|
|
|
+ then
|
|
|
+ echo "${file_path} has multiple ${dylib_name} libraries..."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ # Hack to bring Python library name in line with the other libraries.
|
|
|
+ if [ "${dylib_name}" == "Python" ]
|
|
|
+ then
|
|
|
+ local version="$(otool -L "${file_path}" | grep "${dylib_name}" | sed -e 's|.*current version \([0-9][0-9]*\.[0-9][0-9]*\).*|\1|')"
|
|
|
+ dylib_name="libpython${version}.dylib"
|
|
|
+ rm -rf "$(dirname ${file_path})/Python"
|
|
|
+ fi
|
|
|
+
|
|
|
+ chmod +w "${file_path}"
|
|
|
+ install_name_tool \
|
|
|
+ -change "${dylib_path}" \
|
|
|
+ "@executable_path/${dylib_name}" \
|
|
|
+ "${file_path}"
|
|
|
+
|
|
|
+ if [ ! -f "$(dirname ${file_path})/${dylib_name}" ]
|
|
|
+ then
|
|
|
+ install -v -c -m 644 "${dylib_path}" "$(dirname ${file_path})/${dylib_name}"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# Workaround to Docker error on 32-bit image:
|
|
|
+# stat: Value too large for defined data type (requires -D_FILE_OFFSET_BITS=64)
|
|
|
+function patch_linux_elf_origin()
|
|
|
+{
|
|
|
+ if [ $# -lt 1 ]
|
|
|
+ then
|
|
|
+ echo "patch_linux_elf_origin requires 1 args."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ local file_path="$1"
|
|
|
+ local libexec_path
|
|
|
+ if [ $# -ge 2 ]
|
|
|
+ then
|
|
|
+ libexec_path="$2"
|
|
|
+ else
|
|
|
+ libexec_path="$(dirname "${file_path}")"
|
|
|
+ fi
|
|
|
+
|
|
|
+ local tmp_path=$(mktemp)
|
|
|
+ rm -rf "${tmp_path}"
|
|
|
+ cp "${file_path}" "${tmp_path}"
|
|
|
+ if false
|
|
|
+ then
|
|
|
+ local relative_path="$(realpath --relative-to="$(dirname ${file_path})" "${libexec_path}")"
|
|
|
+ if [ "${IS_DEVELOP}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "\$ORIGIN/${relative_path}" "${file_path}"
|
|
|
+ fi
|
|
|
+ patchelf --set-rpath "\$ORIGIN/${relative_path}" "${tmp_path}"
|
|
|
+ else
|
|
|
+ if file "${tmp_path}" | grep statically
|
|
|
+ then
|
|
|
+ file "${file_path}"
|
|
|
+ else
|
|
|
+ patchelf --set-rpath "\$ORIGIN" "${tmp_path}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ cp "${tmp_path}" "${file_path}"
|
|
|
+ rm -rf "${tmp_path}"
|
|
|
+}
|
|
|
+
|
|
|
+# $1 - absolute path to executable
|
|
|
+# Note: must pass libexec path
|
|
|
+# For single apps, otherwise use prepare_app_folder_libraries
|
|
|
+# Does not use libexec.
|
|
|
+function prepare_app_libraries()
|
|
|
+{
|
|
|
+ local app_path="$1"
|
|
|
+ shift
|
|
|
+
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ local app_folder_path="$(dirname "${app_path}")"
|
|
|
+
|
|
|
+ if [ "${WITH_STRIP}" == "y" ]
|
|
|
+ then
|
|
|
+ strip_binary "${app_path}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo "Shared libraries:"
|
|
|
+ echo "${app_path}"
|
|
|
+ set +e
|
|
|
+ readelf -d "${app_path}" | grep 'Shared library:'
|
|
|
+ set -e
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Preparing libraries..."
|
|
|
+ patch_linux_elf_origin "${app_path}"
|
|
|
+
|
|
|
+ echo
|
|
|
+ copy_dependencies_recursive "${app_path}" "${app_folder_path}"
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Updated shared libraries:"
|
|
|
+ echo ldd -v "${app_path}"
|
|
|
+ ldd -v "${app_path}"
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo "Initial dynamic libraries:"
|
|
|
+ otool -L "${app_path}"
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Preparing libraries..."
|
|
|
+ copy_dependencies_recursive "${app_path}" "${app_folder_path}"
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Updated dynamic libraries:"
|
|
|
+ otool -L "${app_path}"
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo "Dynamic libraries:"
|
|
|
+ echo "${app_path}.exe"
|
|
|
+ ${CROSS_COMPILE_PREFIX}-objdump -x "${app_path}.exe" | grep -i 'DLL Name'
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Preparing libraries..."
|
|
|
+ copy_dependencies_recursive "${app_path}.exe" "${app_folder_path}"
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+# Process all executables and shared libraries.
|
|
|
+function prepare_app_folder_libraries()
|
|
|
+{
|
|
|
+ local folder_path
|
|
|
+ if [ $# -ge 1 ]
|
|
|
+ then
|
|
|
+ folder_path="$1"
|
|
|
+ else
|
|
|
+ folder_path="${APP_PREFIX}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ local libexec_folder_path
|
|
|
+ if [ $# -ge 2 ]
|
|
|
+ then
|
|
|
+ libexec_folder_path="$2"
|
|
|
+ else
|
|
|
+ libexec_folder_path="${APP_PREFIX}/libexec"
|
|
|
+ fi
|
|
|
+
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Preparing ${folder_path} libraries..."
|
|
|
+
|
|
|
+ # Otherwise `find` may fail.
|
|
|
+ cd "${WORK_FOLDER_PATH}"
|
|
|
+
|
|
|
+ local binaries
|
|
|
+ if [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ binaries=$(find "${folder_path}" -name \*.exe)
|
|
|
+ for bin in ${binaries}
|
|
|
+ do
|
|
|
+ echo
|
|
|
+ echo "Preparing $(basename "${bin}") ${bin} libraries..."
|
|
|
+ # On Windows the DLLs are copied in the same folder.
|
|
|
+ copy_dependencies_recursive "${bin}" "$(dirname "${bin}")"
|
|
|
+ done
|
|
|
+
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ binaries=$(find "${folder_path}" -name \* -perm +111 -and ! -type d)
|
|
|
+ for bin in ${binaries}
|
|
|
+ do
|
|
|
+ if is_elf "${bin}"
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo "Preparing $(basename "${bin}") ${bin} libraries..."
|
|
|
+ if true
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${bin}" \
|
|
|
+ "$(dirname "${bin}")"
|
|
|
+ else
|
|
|
+ # On macOS the dynamic libraries can be copied in the libexec folder.
|
|
|
+ copy_dependencies_recursive "${bin}" \
|
|
|
+ "$(dirname "${bin}")" "${libexec_folder_path}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ binaries=$(find "${folder_path}" -name \* -perm /111 -and ! -type d)
|
|
|
+ for bin_path in ${binaries}
|
|
|
+ do
|
|
|
+ if is_elf "${bin_path}"
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ echo "Preparing $(basename "${bin_path}") (${bin_path}) libraries..."
|
|
|
+ # On Linux the shared libraries can be copied in the libexec folder,
|
|
|
+ # and links be kept in the current folder, but not for 32-bit
|
|
|
+ # Intel distros.
|
|
|
+ # For consistency reasons, do the same on all platforms.
|
|
|
+ if true # [ "${TARGET_ARCH}" == "x32" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${bin_path}" \
|
|
|
+ "$(dirname "${bin_path}")"
|
|
|
+ else
|
|
|
+ copy_dependencies_recursive "${bin_path}" \
|
|
|
+ "$(dirname "${bin_path}")" "${libexec_folder_path}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ # echo $(basename "${bin_path}") $(readelf -d "${bin_path}" | egrep -i '(RUNPATH|RPATH)')
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+function copy_dependencies_recursive()
|
|
|
+{
|
|
|
+ if [ $# -lt 2 ]
|
|
|
+ then
|
|
|
+ echo "copy_dependencies_recursive requires at least 2 arg."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ local source_file_path="$1"
|
|
|
+ local dest_folder_path="$2"
|
|
|
+
|
|
|
+ local libexec_folder_path
|
|
|
+ if [ $# -ge 3 ]
|
|
|
+ then
|
|
|
+ libexec_folder_path="$3"
|
|
|
+ else
|
|
|
+ libexec_folder_path="${dest_folder_path}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ # The first step is to copy the file to libexec and link it.
|
|
|
+
|
|
|
+
|
|
|
+ local source_file_name="$(basename "${source_file_path}")"
|
|
|
+ local source_folder_path="$(dirname "${source_file_path}")"
|
|
|
+
|
|
|
+ local actual_source_file_path=""
|
|
|
+ local copied_file_path="${dest_folder_path}/${source_file_name}"
|
|
|
+
|
|
|
+ # echo "I. Processing ${source_file_path} itself..."
|
|
|
+
|
|
|
+ if [ ! -f "${dest_folder_path}/${source_file_name}" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ if [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ # On Windows don't bother with sym links, simply copy the file
|
|
|
+ # to the destination.
|
|
|
+
|
|
|
+ actual_source_file_path="$(readlink -f "${source_file_path}")"
|
|
|
+ copied_file_path="${dest_folder_path}/${source_file_name}"
|
|
|
+
|
|
|
+ else
|
|
|
+ # On POSIX copy to libexec and place a symlink at destination.
|
|
|
+
|
|
|
+ if [ -L "${source_file_path}" ]
|
|
|
+ then
|
|
|
+ #
|
|
|
+ # Compute the final absolute path of the link, regardless
|
|
|
+ # how many links there are on the way.
|
|
|
+ actual_source_file_path="$(readlink -f "${source_file_path}")"
|
|
|
+ copied_file_path="${libexec_folder_path}/$(basename "${actual_source_file_path}")"
|
|
|
+
|
|
|
+ elif is_elf "${source_file_path}"
|
|
|
+ then
|
|
|
+
|
|
|
+ if [ "${IS_DEVELOP}" == "y" ]
|
|
|
+ then
|
|
|
+ # The file is definitelly an elf, not a link.
|
|
|
+ echo "is_elf ${source_file_name}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ actual_source_file_path="${source_file_path}"
|
|
|
+ copied_file_path="${libexec_folder_path}/${source_file_name}"
|
|
|
+
|
|
|
+ else
|
|
|
+ # Not a symlink and not an elf. Ignore it.
|
|
|
+ echo "!!!!!!!!!!!!!!"
|
|
|
+ return
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ else
|
|
|
+ : #echo "${dest_folder_path}/${source_file_name} already there"
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ ! -z "${actual_source_file_path}" ]
|
|
|
+ then
|
|
|
+ if [ ! -f "${copied_file_path}" ]
|
|
|
+ then
|
|
|
+ install -v -c -m 644 "${actual_source_file_path}" "${copied_file_path}"
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ actual_source_file_path="${source_file_path}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ "${WITH_STRIP}" == "y" ]
|
|
|
+ then
|
|
|
+ strip_binary "${copied_file_path}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+ patch_linux_elf_origin "${copied_file_path}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ # If libexec is the destination, there is no need to link.
|
|
|
+ if [ ! -f "${dest_folder_path}/${source_file_name}" ]
|
|
|
+ then
|
|
|
+ (
|
|
|
+ cd "${dest_folder_path}"
|
|
|
+
|
|
|
+ local link_relative_path="$(realpath --relative-to="${dest_folder_path}" "${copied_file_path}")"
|
|
|
+ ln -sv "${link_relative_path}" "${source_file_name}"
|
|
|
+ )
|
|
|
+ fi
|
|
|
+
|
|
|
+ local actual_dest_file_path="$(realpath "${dest_folder_path}/${source_file_name}")"
|
|
|
+ local actual_dest_folder_path="$(dirname "${actual_dest_file_path}")"
|
|
|
+
|
|
|
+ # echo "II. Processing ${source_file_path} dependencies..."
|
|
|
+ if [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+ # The file must be an elf. Get its shared libraries.
|
|
|
+ local lib_names=$(readelf -d "${dest_folder_path}/${source_file_name}" \
|
|
|
+ | grep -i 'Shared library' \
|
|
|
+ | sed -e 's/.*Shared library: \[\(.*\)\]/\1/')
|
|
|
+ local lib_name
|
|
|
+ for lib_name in ${lib_names}
|
|
|
+ do
|
|
|
+ if is_linux_sys_so "${lib_name}"
|
|
|
+ then
|
|
|
+ continue # System library, no need to copy it.
|
|
|
+ else
|
|
|
+
|
|
|
+ if [ -f "$(dirname "${actual_source_file_path}")/${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "$(dirname "${actual_source_file_path}")/${lib_name}" \
|
|
|
+ "${actual_dest_folder_path}" "${libexec_folder_path}"
|
|
|
+ elif [ -f "${LIBS_INSTALL_FOLDER_PATH}/lib64/${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${LIBS_INSTALL_FOLDER_PATH}/lib64/${lib_name}" \
|
|
|
+ "${actual_dest_folder_path}" "${libexec_folder_path}"
|
|
|
+ elif [ -f "${LIBS_INSTALL_FOLDER_PATH}/lib/${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${LIBS_INSTALL_FOLDER_PATH}/lib/${lib_name}" \
|
|
|
+ "${actual_dest_folder_path}" "${libexec_folder_path}"
|
|
|
+ else
|
|
|
+ # Not a compiled dependency, perhas a compiler dependency.
|
|
|
+ local full_path=$(${CC} -print-file-name=${lib_name})
|
|
|
+ # -print-file-name outputs back the requested name if not found.
|
|
|
+ if [ "${full_path}" != "${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${full_path}" \
|
|
|
+ "${actual_dest_folder_path}" "${libexec_folder_path}"
|
|
|
+ else
|
|
|
+ # If no toolchain library either, last chance is the XBB libraries.
|
|
|
+ if [ -f "${XBB_FOLDER_PATH}/lib64/${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${XBB_FOLDER_PATH}/lib64/${lib_name}" \
|
|
|
+ "${actual_dest_folder_path}" "${libexec_folder_path}"
|
|
|
+ elif [ -f "${XBB_FOLDER_PATH}/lib/${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${XBB_FOLDER_PATH}/lib/${lib_name}" \
|
|
|
+ "${actual_dest_folder_path}" "${libexec_folder_path}"
|
|
|
+ else
|
|
|
+ echo "${lib_name} not found in the compiled or XBB libraries."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ ! -f "${actual_dest_folder_path}/${lib_name}" ]
|
|
|
+ then
|
|
|
+ echo "Oops! Dependency ${actual_dest_folder_path}/${lib_name} of ${source_file_name} not found"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ # echo "iterate ${dest_folder_path}/${source_file_name} done"
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+ echo
|
|
|
+ otool -L "${dest_folder_path}/${source_file_name}"
|
|
|
+ local lib_names
|
|
|
+ if [[ "${source_file_name}" == *\.dylib ]]
|
|
|
+ then
|
|
|
+ lib_names=$(otool -L "${dest_folder_path}/${source_file_name}" \
|
|
|
+ | sed '1d' \
|
|
|
+ | sed '1d' \
|
|
|
+ | sed -e 's|[[:space:]]*\(.*\) (.*)|\1|' \
|
|
|
+ )
|
|
|
+ else
|
|
|
+ lib_names=$(otool -L "${dest_folder_path}/${source_file_name}" \
|
|
|
+ | sed '1d' \
|
|
|
+ | sed -e 's|[[:space:]]*\(.*\) (.*)|\1|' \
|
|
|
+ )
|
|
|
+ fi
|
|
|
+ local exec_prefix="@executable_path/"
|
|
|
+ local loader_path="@loader_path/"
|
|
|
+ local lib_name
|
|
|
+ for lib_name in ${lib_names}
|
|
|
+ do
|
|
|
+ local lib_link_base=""
|
|
|
+ if [ "${lib_name:0:1}" != "@" ]
|
|
|
+ then
|
|
|
+ lib_link_base="$(basename $(readlink -f ${lib_name}))"
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ "${lib_name}" == "${exec_prefix}${source_file_name}" ]
|
|
|
+ then
|
|
|
+ :
|
|
|
+ elif [ "${lib_name}" == "${loader_path}${source_file_name}" ]
|
|
|
+ then
|
|
|
+ :
|
|
|
+ elif [ "${lib_link_base}" == "${source_file_name}" ]
|
|
|
+ then
|
|
|
+ : # Libraries return a line with their own name.
|
|
|
+ else
|
|
|
+ if is_darwin_sys_dylib "${lib_name}"
|
|
|
+ then
|
|
|
+ : # System library, no need to copy it.
|
|
|
+ if ! is_darwin_allowed_sys_dylib "${lib_name}"
|
|
|
+ then
|
|
|
+ echo "Oops! \"${lib_name}\" should not be there!"
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ # The libs can be relative to @executable_path or absolute.
|
|
|
+ if [ "${lib_name:0:${#exec_prefix}}" == "${exec_prefix}" ]
|
|
|
+ then
|
|
|
+ :
|
|
|
+ else
|
|
|
+ if [ -f "${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${lib_name}" \
|
|
|
+ "${dest_folder_path}" "${libexec_folder_path}"
|
|
|
+ elif [ -f "${LIBS_INSTALL_FOLDER_PATH}/lib/${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${LIBS_INSTALL_FOLDER_PATH}/lib/${lib_name}" \
|
|
|
+ "${dest_folder_path}" "${libexec_folder_path}"
|
|
|
+ else
|
|
|
+ echo "${lib_name} not found"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ # Change library path to '@executable_path' inside the lib or app.
|
|
|
+ change_dylib "$(basename "${lib_name}")" \
|
|
|
+ "${dest_folder_path}/${source_file_name}"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ local libs=$(${CROSS_COMPILE_PREFIX}-objdump -x "${dest_folder_path}/${source_file_name}" \
|
|
|
+ | grep -i 'DLL Name' \
|
|
|
+ | sed -e 's/.*DLL Name: \(.*\)/\1/' \
|
|
|
+ )
|
|
|
+ local lib_name
|
|
|
+ for lib_name in ${libs}
|
|
|
+ do
|
|
|
+ if is_win_sys_dll "${lib_name}"
|
|
|
+ then
|
|
|
+ : # System DLL, no need to copy it.
|
|
|
+ else
|
|
|
+ if [ -f "${LIBS_INSTALL_FOLDER_PATH}/bin/${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${LIBS_INSTALL_FOLDER_PATH}/bin/${lib_name}" \
|
|
|
+ "${dest_folder_path}"
|
|
|
+ elif [ -f "${XBB_FOLDER_PATH}/${CROSS_COMPILE_PREFIX}/bin/${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${XBB_FOLDER_PATH}/${CROSS_COMPILE_PREFIX}/bin/${lib_name}" \
|
|
|
+ "${dest_folder_path}"
|
|
|
+ elif [ -f "${XBB_FOLDER_PATH}/mingw/bin/${lib_name}" ]
|
|
|
+ then
|
|
|
+ # Mainly to get libwinpthread-1.dll.
|
|
|
+ copy_dependencies_recursive "${XBB_FOLDER_PATH}/mingw/bin/${lib_name}" \
|
|
|
+ "${dest_folder_path}"
|
|
|
+ else
|
|
|
+ local full_path=$(${CROSS_COMPILE_PREFIX}-gcc -print-file-name=${lib_name})
|
|
|
+ # -print-file-name outputs back the requested name if not found.
|
|
|
+ if [ "${full_path}" != "${lib_name}" ]
|
|
|
+ then
|
|
|
+ copy_dependencies_recursive "${full_path}" "${dest_folder_path}"
|
|
|
+ else
|
|
|
+ echo "${lib_name} required by ${source_file_name}, not found"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ "${IS_DEVELOP}" == "y" ]
|
|
|
+ then
|
|
|
+ echo "dependency ${source_file_path} done"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+function check_binaries()
|
|
|
+{
|
|
|
+ local folder_path="${APP_PREFIX}"
|
|
|
+ if [ $# -ge 1 ]
|
|
|
+ then
|
|
|
+ folder_path="$1"
|
|
|
+ fi
|
|
|
+
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Checking binaries for unwanted libraries..."
|
|
|
+
|
|
|
+ # Otherwise `find` may fail.
|
|
|
+ cd "${WORK_FOLDER_PATH}"
|
|
|
+
|
|
|
+ local binaries
|
|
|
+ if [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ binaries=$(find "${folder_path}" -name \*.exe)
|
|
|
+ for bin in ${binaries}
|
|
|
+ do
|
|
|
+ check_binary "${bin}"
|
|
|
+ done
|
|
|
+
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ binaries=$(find "${folder_path}" -name \* -perm +111 -and ! -type d)
|
|
|
+ for bin in ${binaries}
|
|
|
+ do
|
|
|
+ if is_elf "${bin}"
|
|
|
+ then
|
|
|
+ check_binary "${bin}"
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ binaries=$(find "${folder_path}" -name \* -perm /111 -and ! -type d)
|
|
|
+ for bin in ${binaries}
|
|
|
+ do
|
|
|
+ if is_elf "${bin}"
|
|
|
+ then
|
|
|
+ check_binary "${bin}"
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+# $1 - absolute path to input folder
|
|
|
+# $2 - name of output folder below INSTALL_FOLDER
|
|
|
+function copy_license()
|
|
|
+{
|
|
|
+ # Iterate all files in a folder and install some of them in the
|
|
|
+ # destination folder
|
|
|
+ (
|
|
|
+ if [ -z "$2" ]
|
|
|
+ then
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Copying license files for $2..."
|
|
|
+
|
|
|
+ cd "$1"
|
|
|
+ local f
|
|
|
+ for f in *
|
|
|
+ do
|
|
|
+ if [ -f "$f" ]
|
|
|
+ then
|
|
|
+ if [[ "$f" =~ AUTHORS.*|NEWS.*|COPYING.*|README.*|LICENSE.*|Copyright.*|COPYRIGHT.*|FAQ.*|DEPENDENCIES.*|THANKS.*|CHANGES.* ]]
|
|
|
+ then
|
|
|
+ install -d -m 0755 \
|
|
|
+ "${APP_PREFIX}/${DISTRO_INFO_NAME}/licenses/$2"
|
|
|
+ install -v -c -m 644 "$f" \
|
|
|
+ "${APP_PREFIX}/${DISTRO_INFO_NAME}/licenses/$2"
|
|
|
+ fi
|
|
|
+ elif [ -d "$f" ] && [[ "$f" =~ [Ll][Ii][Cc][Ee][Nn][Ss][Ee]* ]]
|
|
|
+ then
|
|
|
+ install -d -m 0755 \
|
|
|
+ "${APP_PREFIX}/${DISTRO_INFO_NAME}/licenses/$2"
|
|
|
+ install -v -c -m 644 "$f"/* \
|
|
|
+ "${APP_PREFIX}/${DISTRO_INFO_NAME}/licenses/$2"
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ )
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ if [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ find "${APP_PREFIX}/${DISTRO_INFO_NAME}/licenses" \
|
|
|
+ -type f \
|
|
|
+ -exec unix2dos '{}' ';'
|
|
|
+ fi
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+function copy_build_files()
|
|
|
+{
|
|
|
+ echo
|
|
|
+ echo "Copying build files..."
|
|
|
+
|
|
|
+ (
|
|
|
+ cd "${BUILD_GIT_PATH}"
|
|
|
+
|
|
|
+ mkdir -pv patches
|
|
|
+
|
|
|
+ find scripts patches -type d \
|
|
|
+ -exec install -d -m 0755 \
|
|
|
+ "${APP_PREFIX}/${DISTRO_INFO_NAME}"/'{}' ';'
|
|
|
+
|
|
|
+ find scripts patches -type f \
|
|
|
+ -exec install -v -c -m 644 \
|
|
|
+ '{}' "${APP_PREFIX}/${DISTRO_INFO_NAME}"/'{}' ';'
|
|
|
+
|
|
|
+ if [ -f CHANGELOG.txt ]
|
|
|
+ then
|
|
|
+ install -v -c -m 644 \
|
|
|
+ CHANGELOG.txt "${APP_PREFIX}/${DISTRO_INFO_NAME}"
|
|
|
+ fi
|
|
|
+ if [ -f CHANGELOG.md ]
|
|
|
+ then
|
|
|
+ install -v -c -m 644 \
|
|
|
+ CHANGELOG.md "${APP_PREFIX}/${DISTRO_INFO_NAME}"
|
|
|
+ fi
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+# Must be called in the build folder, like
|
|
|
+# cd "${LIBS_BUILD_FOLDER_PATH}"
|
|
|
+# cd "${UILD_FOLDER_PATH}"
|
|
|
+
|
|
|
+function copy_cmake_logs()
|
|
|
+{
|
|
|
+ local folder_name="$1"
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Preserving CMake log files..."
|
|
|
+ rm -rf "${LOGS_FOLDER_PATH}/${folder_name}"
|
|
|
+ mkdir -pv "${LOGS_FOLDER_PATH}/${folder_name}/CMakeFiles"
|
|
|
+
|
|
|
+ (
|
|
|
+ cd "${folder_name}"
|
|
|
+ cp -v "CMakeCache.txt" "${LOGS_FOLDER_PATH}/${folder_name}"
|
|
|
+
|
|
|
+ cp -v "CMakeFiles"/*.log "${LOGS_FOLDER_PATH}/${folder_name}/CMakeFiles"
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+# Copy one folder to another
|
|
|
+function copy_dir()
|
|
|
+{
|
|
|
+ local from_path="$1"
|
|
|
+ local to_path="$2"
|
|
|
+
|
|
|
+ set +u
|
|
|
+ # rm -rf "${to_path}"
|
|
|
+ mkdir -pv "${to_path}"
|
|
|
+
|
|
|
+ (
|
|
|
+ cd "${from_path}"
|
|
|
+ if [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+ find . -xdev -print0 | cpio -oa0 | (cd "${to_path}" && cpio -im)
|
|
|
+ else
|
|
|
+ find . -xdev -print0 | cpio -oa0V | (cd "${to_path}" && cpio -imuV)
|
|
|
+ fi
|
|
|
+ )
|
|
|
+
|
|
|
+ set -u
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function create_archive()
|
|
|
+{
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ local distribution_file_version="${RELEASE_VERSION}"
|
|
|
+
|
|
|
+ local target_folder_name=${TARGET_FOLDER_NAME}
|
|
|
+
|
|
|
+ if [ "${HAS_NAME_ARCH}" != "y" ]
|
|
|
+ then
|
|
|
+ # Pre xPack distributions use the old file name convention.
|
|
|
+ distribution_file_version="${RELEASE_VERSION}-${DISTRIBUTION_FILE_DATE}"
|
|
|
+
|
|
|
+ if [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ target_folder_name="win${TARGET_BITS}"
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+ target_folder_name="macos"
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+ target_folder_name="${CONTAINER_DISTRO_LC_NAME}${TARGET_BITS}"
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ local distribution_file="${DEPLOY_FOLDER_PATH}/${DISTRO_LC_NAME}-${APP_LC_NAME}-${distribution_file_version}-${target_folder_name}"
|
|
|
+
|
|
|
+ local archive_version_path
|
|
|
+ archive_version_path="${INSTALL_FOLDER_PATH}/archive/${DISTRO_LC_NAME}-${APP_LC_NAME}-${distribution_file_version}"
|
|
|
+
|
|
|
+ cd "${APP_PREFIX}"
|
|
|
+ find . -name '.DS_Store' -exec rm '{}' ';'
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Creating distribution..."
|
|
|
+
|
|
|
+ mkdir -pv "${DEPLOY_FOLDER_PATH}"
|
|
|
+
|
|
|
+ # The folder is temprarily moved into a versioned folder like
|
|
|
+ # xpack-<app-name>-<version>, or, in previous versions,
|
|
|
+ # in a more elaborate hierarchy like
|
|
|
+ # xPacks/<app-name>/<version>.
|
|
|
+ # After the archive is created, the folders are moved back.
|
|
|
+ # The atempt to transform the tar path fails, since symlinks were
|
|
|
+ # also transformed, which is bad.
|
|
|
+ if [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ local distribution_file="${distribution_file}.zip"
|
|
|
+
|
|
|
+ if [ "${USE_SINGLE_FOLDER_PATH}" != "y" ]
|
|
|
+ then
|
|
|
+ # DEPRECATED!
|
|
|
+ archive_version_path="${INSTALL_FOLDER_PATH}/archive/${DISTRO_UC_NAME}/${APP_UC_NAME}/${distribution_file_version}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "ZIP file: \"${distribution_file}\"."
|
|
|
+
|
|
|
+ rm -rf "${INSTALL_FOLDER_PATH}/archive"
|
|
|
+ mkdir -pv "${archive_version_path}"
|
|
|
+ mv "${APP_PREFIX}"/* "${archive_version_path}"
|
|
|
+
|
|
|
+ cd "${INSTALL_FOLDER_PATH}/archive"
|
|
|
+ zip -r9 -q "${distribution_file}" *
|
|
|
+
|
|
|
+ # Put folders back.
|
|
|
+ mv "${archive_version_path}"/* "${APP_PREFIX}"
|
|
|
+
|
|
|
+ else
|
|
|
+
|
|
|
+ # Unfortunately on node.js, xz & bz2 require native modules, which
|
|
|
+ # proved unsafe, some xz versions failed to compile on node.js v9.x,
|
|
|
+ # so use the good old .tar.gz.
|
|
|
+ local distribution_file
|
|
|
+ if [ "${USE_TAR_GZ}" == "y" ]
|
|
|
+ then
|
|
|
+ # Some platforms (like Arduino) accept only this explicit path.
|
|
|
+ distribution_file="${distribution_file}.tar.gz"
|
|
|
+ else
|
|
|
+ distribution_file="${distribution_file}.tgz"
|
|
|
+ fi
|
|
|
+
|
|
|
+ local archive_version_path
|
|
|
+ if [ "${USE_SINGLE_FOLDER_PATH}" != "y" ]
|
|
|
+ then
|
|
|
+ # DEPRECATED!
|
|
|
+ archive_version_path="${INSTALL_FOLDER_PATH}/archive/${DISTRO_TOP_FOLDER_PATH}/${APP_LC_NAME}/${distribution_file_version}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ echo "Compressed tarball: \"${distribution_file}\"."
|
|
|
+
|
|
|
+ rm -rf "${INSTALL_FOLDER_PATH}/archive"
|
|
|
+ mkdir -pv "${archive_version_path}"
|
|
|
+ mv -v "${APP_PREFIX}"/* "${archive_version_path}"
|
|
|
+
|
|
|
+ # Without --hard-dereference the hard links may be turned into
|
|
|
+ # broken soft links on macOS.
|
|
|
+ cd "${INSTALL_FOLDER_PATH}"/archive
|
|
|
+ # -J uses xz for compression; best compression ratio.
|
|
|
+ # -j uses bz2 for compression; good compression ratio.
|
|
|
+ # -z uses gzip for compression; fair compression ratio.
|
|
|
+ tar -c -z -f "${distribution_file}" \
|
|
|
+ --owner=0 \
|
|
|
+ --group=0 \
|
|
|
+ --format=posix \
|
|
|
+ --hard-dereference \
|
|
|
+ *
|
|
|
+
|
|
|
+ # Put folders back.
|
|
|
+ mv -v "${archive_version_path}"/* "${APP_PREFIX}"
|
|
|
+
|
|
|
+ fi
|
|
|
+
|
|
|
+ cd "${DEPLOY_FOLDER_PATH}"
|
|
|
+ compute_sha shasum -a 256 "$(basename ${distribution_file})"
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+# $1 = application name
|
|
|
+function check_application()
|
|
|
+{
|
|
|
+ local app_name=$1
|
|
|
+
|
|
|
+ if [ "${TARGET_PLATFORM}" == "linux" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Checking binaries for unwanted shared libraries..."
|
|
|
+
|
|
|
+ check_binary "${APP_PREFIX}/bin/${app_name}"
|
|
|
+
|
|
|
+ local libs=$(find "${APP_PREFIX}/bin" -name \*.so.\* -type f)
|
|
|
+ local lib
|
|
|
+ for lib in ${libs}
|
|
|
+ do
|
|
|
+ check_binary_for_libraries "${lib}"
|
|
|
+ done
|
|
|
+
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "darwin" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Checking binaries for unwanted dynamic libraries..."
|
|
|
+
|
|
|
+ check_binary "${APP_PREFIX}/bin/${app_name}"
|
|
|
+
|
|
|
+ local libs=$(find "${APP_PREFIX}/bin" -name \*.dylib -type f)
|
|
|
+ local lib
|
|
|
+ for lib in ${libs}
|
|
|
+ do
|
|
|
+ check_binary_for_libraries "${lib}"
|
|
|
+ done
|
|
|
+
|
|
|
+ elif [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Checking binaries for unwanted DLLs..."
|
|
|
+
|
|
|
+ check_binary "${APP_PREFIX}/bin/${app_name}.exe"
|
|
|
+
|
|
|
+ local libs=$(find "${APP_PREFIX}/bin" -name \*.dll -type f)
|
|
|
+ local lib
|
|
|
+ for lib in ${libs}
|
|
|
+ do
|
|
|
+ check_binary_for_libraries "${lib}"
|
|
|
+ done
|
|
|
+
|
|
|
+ else
|
|
|
+ echo "Oops! Unsupported ${TARGET_PLATFORM}."
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ echo
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function compute_sha()
|
|
|
+{
|
|
|
+ # $1 shasum program
|
|
|
+ # $2.. options
|
|
|
+ # ${!#} file
|
|
|
+
|
|
|
+ file=${!#}
|
|
|
+ sha_file="${file}.sha"
|
|
|
+ "$@" >"${sha_file}"
|
|
|
+ echo "SHA: $(cat ${sha_file})"
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function prime_wine()
|
|
|
+{
|
|
|
+ if [ "${TARGET_PLATFORM}" == "win32" ]
|
|
|
+ then
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ echo
|
|
|
+ winecfg &>/dev/null
|
|
|
+ echo "wine primed, testing..."
|
|
|
+ )
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function copy_distro_files()
|
|
|
+{
|
|
|
+ (
|
|
|
+ xbb_activate
|
|
|
+
|
|
|
+ mkdir -pv "${APP_PREFIX}/${DISTRO_INFO_NAME}"
|
|
|
+
|
|
|
+ copy_build_files
|
|
|
+
|
|
|
+ echo
|
|
|
+ echo "Copying xPack files..."
|
|
|
+
|
|
|
+ cd "${WORK_FOLDER_PATH}/build.git"
|
|
|
+ README_OUT_FILE_NAME="${README_OUT_FILE_NAME:-README-OUT.md}"
|
|
|
+ install -v -c -m 644 "scripts/${README_OUT_FILE_NAME}" \
|
|
|
+ "${APP_PREFIX}/README.md"
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|
|
|
+
|
|
|
+function tests_initialize()
|
|
|
+{
|
|
|
+ test_functions=()
|
|
|
+}
|
|
|
+
|
|
|
+function tests_add()
|
|
|
+{
|
|
|
+ test_functions+=("$1")
|
|
|
+}
|
|
|
+
|
|
|
+function tests_run()
|
|
|
+{
|
|
|
+ echo
|
|
|
+ echo "Runnng final tests..."
|
|
|
+
|
|
|
+ for test_function in ${test_functions[@]}
|
|
|
+ do
|
|
|
+ echo
|
|
|
+ local func=$(echo ${test_function} | sed -e 's|-|_|g')
|
|
|
+ echo "Running ${func}..."
|
|
|
+ ${func}
|
|
|
+ done
|
|
|
+}
|
|
|
+
|
|
|
+# -----------------------------------------------------------------------------
|