#!/bin/bash # Script to build Khaganat binary (executed in docker) # # Copyright (C) 2017 AleaJactaEst # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # declare DIRBUILD="/opt/build/" declare DIRCODEUSE="/opt/build/opennel-code" declare DIRCODE="/opt/ref/opennel-code" declare DIRPYMANAGER="/opt/ref/opennel-pymanager" declare CXXFLAGS="" declare -i DONTCOPYSOURCE=0 declare -i BUILD_OPENNEL_CODE=1 declare -i PACKAGE_OPENNEL_PYMANAGER=1 declare -i REGENERATE_DATABASE=0 function usage() { cat << EOF usage:$0 [options] internal script to build under docker workdir: directory use to buid options: -h, --help : Show this help -d, --debug : Show debug message --add-opts-cmake="string" : add option use on command cmake (generate Makefile) --add-opts-make="string" : add option use on command make --cxxflags=[String] : adding cxx flags when generate Makefile (and build) --dont-copy-source : disable copy source, work directly on source (apply patch) --build-dir= : build directory --code-dir= : code source localization --opennel-pymanager-dir= : opennel manager localization code --cxxflags="string" : option to add for C++ builder --regenerate-database : regenerate database_plr.cpp & database_plr.h (depend of database.xml) EOF } function chrashed() { local code=$? echo "$(date "+%Y/%m/%d %H:%M:%S") ERROR - BUILD (under docker) FAILED (code:$code)" if [ -n "$LOGFILE" ] then echo "$(date "+%Y/%m/%d %H:%M:%S") ERROR - BUILD (under docker) FAILED (code:$code)" >> $LOGFILE fi exit 2 } function msg_error() { echo "$(date "+%Y/%m/%d %H:%M:%S") ERROR - $1" if [ -n "$LOGFILE" ] then echo "$(date "+%Y/%m/%d %H:%M:%S") ERROR - $1" >> $LOGFILE fi } function msg_info() { echo "$(date "+%Y/%m/%d %H:%M:%S") INFO - $1" if [ -n "$LOGFILE" ] then echo "$(date "+%Y/%m/%d %H:%M:%S") INFO - $1" >> $LOGFILE fi } function msg_debug() { if [[ $DEBUG -ne 0 ]] then echo "$(date "+%Y/%m/%d %H:%M:%S") DEBUG - $1" if [ -n "$LOGFILE" ] then echo "$(date "+%Y/%m/%d %H:%M:%S") DEBUG - $1" >> $LOGFILE fi fi } function patch_onlyifnotapply() { # Check path is apply or not (if not apply patch) msg_debug "check patch $1" if ! patch -Z -t -R -s -f --dry-run -p 1 -i $1 1>/dev/null then msg_debug "patch $1" patch -f -Z -t -p 1 -i $1 || exit 2 fi } # # MAIN # trap chrashed EXIT while test $# -gt 0 do case "$1" in -h|--help) usage exit 1 ;; -d|--debug) DEBUG=1 shift ;; --add-opts-cmake=*) CMAKEOPTS="$CMAKEOPTS ${1#*=}" shift ;; --add-opts-make=*) MAKEOPTS="$MAKEOPTS ${1#*=}" shift ;; --build-dir=*) DIRBUILD="${1#*=}" shift ;; --code-dir=*) DIRCODE="${1#*=}" shift ;; --opennel-pymanager-dir=*) DIRPYMANAGER="${1#*=}" shift ;; --cxxflags=*) CXXFLAGS="$CXXFLAGS ${1#*=}" shift ;; --dont-copy-source) DONTCOPYSOURCE=1 DIRCODEUSE="$DIRCODE" shift ;; --disable-build-opennel-code) BUILD_OPENNEL_CODE=0 shift ;; --disable-package-opennel-pymanager) PACKAGE_OPENNEL_PYMANAGER=0 shift ;; --regenerate-database) REGENERATE_DATABASE=1 shift ;; *) msg_error "options '$1' not recognize" usage exit 2 ;; esac done declare LOGFILE="${DIRBUILD}/build.log" msg_debug "DIRBUILD:$DIRBUILD" msg_debug "DIRCODE:$DIRCODE" msg_debug "DIRPYMANAGER:$DIRPYMANAGER" msg_debug "CMAKEOPTS:$CMAKEOPTS" msg_debug "MAKEOPTS:$MAKEOPTS" msg_debug "LOGFILE:$LOGFILE" msg_debug "CXXFLAGS:$CXXFLAGS" msg_debug "DONTCOPYSOURCE:$DONTCOPYSOURCE" msg_debug "REGENERATE_DATABASE:$REGENERATE_DATABASE" msg_info "CREATE BUILD DIRECTORY" mkdir -p ${DIRBUILD}/ || exit 2 if [[ $PACKAGE_OPENNEL_PYMANAGER -ne 0 ]] then msg_info "PACKAGE OPENNEL-PYMANAGER" mkdir -p /tmp/pymanager/tmp || exit 2 cp -pr $DIRPYMANAGER/* /tmp/pymanager || exit 2 msg_debug "cd /tmp/pymanager; `which python3` setup.py bdist_wheel -d ${DIRBUILD} -b /tmp" rm -f ${DIRBUILD}/*.whl || exit 2 cd /tmp/pymanager; `which python3` setup.py bdist_wheel -d ${DIRBUILD} -b /tmp/pymanager/tmp || exit 2 fi if [[ $BUILD_OPENNEL_CODE -ne 0 ]] then if [[ $DONTCOPYSOURCE -eq 0 ]] then msg_info "COPY CODE" DIRCODEUSE="$DIRBUILD/opennel-code" mkdir -p ${DIRBUILD}/opennel-code || exit 2 cp -pr $DIRCODE/* ${DIRBUILD}/opennel-code || exit 2 fi msg_info "PATCH CODE" for patchfile in $(cat ${DIRCODE}/patch/series) do cd ${DIRCODEUSE} patch_onlyifnotapply ${DIRCODE}/patch/$patchfile || exit 2 done if [[ $REGENERATE_DATABASE -ne 0 ]] then msg_info "GENERATE DATABASE HEADER" find / -name generate_client_db.xslt 2>/dev/null cd ${DIRBUILD}/opennel-code/code/ryzom/common/src/game_share; xsltproc --stringparam filename database --stringparam bank PLR --stringparam output header --stringparam side server --output ../../../server/src/entities_game_service/database_plr.h generate_client_db.xslt ../../data_common/database.xml || exit 2 msg_info "GENERATE DATABASE CODE" cd ${DIRBUILD}/opennel-code/code/ryzom/common/src/game_share; xsltproc --stringparam filename database --stringparam bank PLR --stringparam output cpp --stringparam side server --output ../../../server/src/entities_game_service/database_plr.cpp generate_client_db.xslt ../../data_common/database.xml || exit 2 fi msg_info "PREPARE BUILD" msg_debug "cd ${DIRBUILD}; CXXFLAGS="$CXXFLAGS" cmake -DWITH_NEL=ON -DWITH_STATIC=ON -DWITH_STATIC_DRIVERS=ON -DWITH_STATIC_EXTERNAL=ON -DWITH_SYMBOLS=ON -DWITH_LUA52=ON -DWITH_RYZOM_PATCH=ON -DWITH_RYZOM_CUSTOM_PATCH_SERVER=ON ${CMAKEOPTS} ${DIRCODEUSE}/code 1>>$LOGFILE 2>&1 " cd ${DIRBUILD}; CXXFLAGS="$CXXFLAGS" cmake -DWITH_NEL=ON \ -DWITH_STATIC=ON \ -DWITH_STATIC_DRIVERS=ON \ -DWITH_STATIC_EXTERNAL=ON \ -DWITH_SYMBOLS=ON \ -DWITH_LUA52=ON \ -DWITH_RYZOM_PATCH=ON \ -DWITH_RYZOM_CUSTOM_PATCH_SERVER=ON \ ${CMAKEOPTS} \ ${DIRCODEUSE}/code 1>>$LOGFILE 2>&1 || exit 2 msg_info "BUILD START" msg_debug "make option : $MAKEOPTS" cd ${DIRBUILD}; VERBOSE=1 make $MAKEOPTS 1>>$LOGFILE 2>&1 || exit 2 fi trap '' EXIT msg_info "BUILD END"