#!/bin/bash #set -x SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" BUILD_TYPE="Debug" ACTION="" CPU_CORE_COUNT=1 COMPILER="clang" CFLAGS_RELEASE="-O2 -msse -msse2" CFLAGS_DEBUG="-O0 -g3 -ggdb3 -DDEBUG" if [ $(uname) == "Linux" ]; then CPU_CORE_COUNT=$(getconf _NPROCESSORS_ONLN) elif [ $(uname) == "FreeBSD" ]; then CPU_CORE_COUNT=$(getconf NPROCESSORS_ONLN) fi print_help() { printf "INFO:\n\tsimple script to build webrdp." printf "usage:\n\t-a\tAction:\t\tmake,clean,prepare\n\t-c\tCompiler:\tgcc,clang\n\t-b\tBuild type:\tRelease,Debug\n\t-h\tThis message\n" exit 0 } while getopts ":a:c:b:h" opt; do case $opt in a) ACTION=$OPTARG ;; c) COMPILER=$OPTARG ;; b) BUILD_TYPE=$OPTARG ;; h) print_help ;; esac done sanity_check() { if [ -z "${ACTION}" ]; then echo "Error: Action must be specified" print_help fi if [[ "${ACTION}" != "make" && "${ACTION}" != "clean" && "${ACTION}" != "prepare" ]]; then echo "Error: wrong action \"${ACTION}\"" print_help fi if [ "${ACTION}" == "make" ]; then if [[ "${COMPILER}" != "gcc" && "${COMPILER}" != "clang" ]];then echo "Error: wrong compiler \"${COMPILER}\"" print_help fi if [[ "${BUILD_TYPE}" != "Debug" && "${BUILD_TYPE}" != "Release" ]]; then echo "Error: wrong build type \"${BUILD_TYPE}\"" print_help fi fi } case "${COMPILER}" in clang) CC=clang CXX=clang++ ;; gcc) CC=gcc CXX=g++ ;; esac sanity_check function clean { rm -rf "${SCRIPTPATH}"/3rdparty/libev/build rm -rf "${SCRIPTPATH}"/3rdparty/wslay/build rm -rf "${SCRIPTPATH}"/3rdparty/FreeRDP/build rm -rf "${SCRIPTPATH}"/3rdparty/curl/build rm -rf "${SCRIPTPATH}"/src/core/build rm -rf "${SCRIPTPATH}"/src/rdp/build } function prepare { git fetch --all git submodule foreach git reset --hard git submodule update --init if [ $(uname -a | grep -c "Debian") -ge 1 ]; then su -c "apt install -y clang zlib1g-dev libssl-dev libpng-dev libunwind8-dev cmake gcc g++" fi } function makeapp { #build libev (static by default) cd "${SCRIPTPATH}"/3rdparty/libev mkdir build cd build cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_CXX_FLAGS="-fPIC" -DCMAKE_C_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_CXX_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_C_FLAGS_RELEASE="${CFLAGS_RELEASE}" -DCMAKE_CXX_FLAGS_RELEASE="${CFLAGS_RELEASE}" ../ make -j${CPU_CORE_COUNT} #build wslay (static by default) cd "${SCRIPTPATH}"/3rdparty/wslay mkdir build cd build cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_CXX_FLAGS="-fPIC" -DCMAKE_C_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_CXX_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_C_FLAGS_RELEASE="${CFLAGS_RELEASE}" -DCMAKE_CXX_FLAGS_RELEASE="${CFLAGS_RELEASE}" ../ make -j${CPU_CORE_COUNT} #build static version of libfreerdp2 cd "${SCRIPTPATH}"/3rdparty/FreeRDP git reset --hard git clean -df mkdir build cd build FREERDP_CMAKE_OPTIONS=( -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DWITH_LIBSYSTEMD=OFF -DBUILD_SHARED_LIBS=OFF -DWITH_CHANNELS=ON -DWITH_CLIENT_CHANNELS=ON -DCHANNEL_URBDRC=OFF -DCHANNEL_URBDRC_CLIENT=OFF -DCHANNEL_RDPDR_CLIENT=ON -DCHANNEL_AUDIN_CLIENT=OFF -DCHANNEL_AUDIN=OFF -DCHANNEL_AINPUT_CLIENT=OFF -DCHANNEL_SMARTCARD_CLIENT=OFF -DWITH_CUPS=OFF -DCHANNEL_RDPDR=ON -DCHANNEL_PRINTER=OFF -DWITH_LIBSYSTEMD=OFF -DWITH_ALSA=OFF -DWITH_PULSE=OFF -DWITH_OSS=OFF -DWITH_X11=OFF -DWITH_FFMPEG=OFF -DWITH_GSTREAMER_1_0=OFF -DWITH_GSTREAMER_0_10=OFF -DBUILD_TESTING=OFF -DCMAKE_INSTALL_PREFIX:PATH=./ -DWITH_SERVER=OFF -DWITH_SERVER_INTERFACE=OFF -DWITH_WAYLAND=OFF -DWITH_SERVER_CHANNELS=OFF -DWITH_CLIENT=OFF -DWITH_CLIENT_INTERFACE=ON -DWITH_MANPAGES=OFF -DWITH_XEXT=OFF -DWITH_XRANDR=OFF -DWITH_PCSC=OFF -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_CXX_FLAGS="-fPIC" -DCMAKE_C_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_CXX_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_C_FLAGS_RELEASE="${CFLAGS_RELEASE}" -DCMAKE_CXX_FLAGS_RELEASE="${CFLAGS_RELEASE}" ) if [ ${BUILD_TYPE} == "Debug" ]; then CURL_CMAKE_OPTIONS+=( -DENABLE_DEBUG=ON -DWITH_DEBUG_ALL=ON ) fi cmake "${FREERDP_CMAKE_OPTIONS[@]}" ../ make -j${CPU_CORE_COUNT} #build curl cd "${SCRIPTPATH}"/3rdparty/curl mkdir build cd build CURL_CMAKE_OPTIONS=( -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DBUILD_SHARED_LIBS=OFF -DCURL_DISABLE_LDAP=ON -DCURL_DISABLE_LDAPS=ON -DCURL_USE_LIBSSH2=OFF -DBUILD_CURL_EXE=OFF -DBUILD_TESTING=OFF -DCURL_DISABLE_FILE=ON -DCURL_DISABLE_DICT=ON -DCURL_DISABLE_FTP=ON -DCURL_DISABLE_GOPHER=OFF -DCURL_DISABLE_IMAP=OFF -DCURL_DISABLE_POP3=OFF -DCURL_DISABLE_RTSP=OFF -DCURL_DISABLE_SMTP=OFF -DCURL_DISABLE_TELNET=ON -DCURL_DISABLE_TFTP=OFF -DENABLE_MANUAL=OFF #curl compiled in clang does not work properly on my system //sss -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_CXX_FLAGS="-fPIC" -DCMAKE_C_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_CXX_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_C_FLAGS_RELEASE="${CFLAGS_RELEASE}" -DCMAKE_CXX_FLAGS_RELEASE="${CFLAGS_RELEASE}" ) CURL_LIB_NAME="libcurl.a" if [ ${BUILD_TYPE} == "Debug" ]; then CURL_LIB_NAME="libcurl-d.a" CURL_CMAKE_OPTIONS+=( -DENABLE_DEBUG=ON ) fi cmake "${CURL_CMAKE_OPTIONS[@]}" ../ make -j${CPU_CORE_COUNT} mv ./lib/${CURL_LIB_NAME} ./libcurl.a #build rdp backend module cd "$SCRIPTPATH"/src/rdp mkdir build cd build cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX -DCMAKE_C_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_CXX_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_C_FLAGS_RELEASE="${CFLAGS_RELEASE}" -DCMAKE_CXX_FLAGS_RELEASE="${CFLAGS_RELEASE}" ../ make -j${CPU_CORE_COUNT} #build core local MY_CORE_CFLAGS="" cd "$SCRIPTPATH"/src/core mkdir build cd build cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX -DCMAKE_C_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_CXX_FLAGS_DEBUG="${CFLAGS_DEBUG}" -DCMAKE_C_FLAGS_RELEASE="${CFLAGS_RELEASE}" -DCMAKE_CXX_FLAGS_RELEASE="${CFLAGS_RELEASE}" ../ make -j${CPU_CORE_COUNT} #move built binary to target directory cd "$SCRIPTPATH" mkdir build rm build/core-$BUILD_TYPE mv src/core/build/core build/core-$BUILD_TYPE cd "$SCRIPTPATH"/src/tools ${CC} ${CFLAGS_RELEASE} keygen.c -o "$SCRIPTPATH"/build/keygen } case "${ACTION}" in make) prepare # clean makeapp ;; prepare) prepare ;; clean) clean ;; esac