#!/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"