You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-packaging/debian/_buildscripts/local/scripts/build_module.sh

495 lines
16 KiB
Bash

#!/bin/bash
#
# Build a single TDE module
#
# Load common code and initialization
. ./_build_common.sh
init_common
# Timer settings
_BUILDMOD_TIMER_NUM=0
_BUILDMOD_TIME="--/--:--:--:---"
exec_time_start $_BUILDMOD_TIMER_NUM
#----------------------------
# Parameters:
# $1 - error code
function do_exit()
{
cd "$SCRIPT_DIR"
if [ $1 -eq 0 ]; then
echo -e "${CGreen}#### Processing module ${CLightGreen}\"$MOD_NAME\"${CGreen} succeeded ####${CNone}"
if [ "$bool_LOG_RESULT" = "y" ]; then
echo "[ OK ] [$_BUILDMOD_TIME] \"$MOD_NAME\"" >>"$LOG_RESULT_FILENAME"
fi
else
echo -e "${CRed}#### Processing module ${CLightRed}\"$MOD_NAME\"${CRed} failed ($1) ####${CNone}"
if [ "$bool_LOG_RESULT" = "y" ]; then
echo "[FAILED] [$_BUILDMOD_TIME] \"$MOD_NAME\"" >>"$LOG_RESULT_FILENAME"
fi
fi
exit $1
}
#----------------------------
# Parameters:
# $1 - folder name
function recreate_folder()
{
if [ -d "$1" ]; then
rm -R "$1"
fi
mkdir -p "$1"
}
#----------------------------
# Check command line arguments and set options
#----------------------------
MOD_NAME="" # the module to be built
bool_BUILD_FROM_GIT="n"
bool_EXTRADEP_MOD="n"
bool_SHOW_BUILD_LOGS="n"
bool_BUILD_LOCALLY="n"
bool_LOG_RESULT="n"
bool_SHELL_HOOK="n"
bool_PREPARE_ONLY="n"
bool_DEBUG_MODE="n"
bool_INTERNAL_PBUILDER="n"
for arg in $@; do
if [ "$arg" = "-g" ]; then # select code to build from Git repo (-g) or from local build copy
bool_BUILD_FROM_GIT="y"
elif [ "$arg" = "-l" ]; then # build module Locally instead of in a clean chroot environment
bool_BUILD_LOCALLY="y"
elif [ "$arg" = "-sl" ]; then # output the building logs to terminal (ShowLog)
bool_SHOW_BUILD_LOGS="y"
elif [ "$arg" = "-lr" ]; then # Log build Result to file
bool_LOG_RESULT="y"
elif [ "$arg" = "-sh" ]; then # install Shell Hook for failing builds (only valid if NOT building locally)
bool_SHELL_HOOK="y"
elif [ "$arg" = "-po" ]; then # Prepare build folder Only but do not build
bool_PREPARE_ONLY="y"
elif [ "$arg" = "-d" ]; then # build with Debug symbols (used in hook scripts)
bool_DEBUG_MODE="y"
elif [ "$arg" = "-ip" ]; then # build using Internal Pbuilder (experimental)
bool_INTERNAL_PBUILDER="y"
elif [ "$MOD_NAME" = "" ]; then # module to be built
MOD_NAME="$arg"
fi
done
if [ "$MOD_NAME" = "" ]; then
echo "Please specify the module to build"
do_exit 3
fi
# Check if module is an extra dependency
if [[ $MOD_NAME =~ ^$CFG_EXTRA_DEPS_DIR/ ]]; then
bool_EXTRADEP_MOD="y"
fi
# Shell hook is only valid if not building locally
# Internal pbuilder option has no meaning if we are building locally
if [ "bool_BUILD_LOCALLY" = "y" ]; then
bool_SHELL_HOOK="n"
bool_INTERNAL_PBUILDER="n"
fi
# pbuilder absolute paths
PBUILDER_HOOK_DIR="$HOME/.pbuilder/hooks"
PBUILDER_SHELL_HOOK="$PBUILDER_HOOK_DIR/C10shell"
PBUILDER_SHELL_HOOK_TEMPLATE="$PBUILDER_HOOK_DIR/__template_C10shell"
PBUILDER_DEPS_HOOK="$PBUILDER_HOOK_DIR/D05deps"
PBUILDER_DEPS_HOOK_SAVE="$PBUILDER_HOOK_DIR/__saved_D05deps"
# Local option variables
# - internal pbuilder
OPT_INTERNAL_PBUILDER=""
if [ "$bool_INTERNAL_PBUILDER" = "y" ]; then
OPT_INTERNAL_PBUILDER="--use-pdebuild-internal"
fi
# - sign packages
OPT_SIGN_PKG_LOCAL="-uc -us"
OPT_SIGN_PKG_PBUILDER=""
if [ ! -z "$GPG_SIGN_KEYID" ]; then
OPT_SIGN_PKG_LOCAL="-k$GPG_SIGN_KEYID"
OPT_SIGN_PKG_PBUILDER="--auto-debsign --debsign-k $GPG_SIGN_KEYID"
fi
# - show logs
OPT_SHOW_LOGS="&>"
if [ "$bool_SHOW_BUILD_LOGS" = "y" ]; then
OPT_SHOW_LOGS=" | tee "
fi
# Log start
echo -e "${CLightCyan}#### Processing module \"$MOD_NAME\" ####${CNone}"
#----------------------------
# Base directories
#----------------------------
GIT_DIR="$TDE_DIR/$CFG_GIT_DIR"
BUILD_DIR="$TDE_DIR/$CFG_BUILD_DIR"
GIT_TDE_MAIN="$TDE_DIR/$CFG_GIT_TDE_MAIN"
GIT_TDE_PACKAGING="$TDE_DIR/$CFG_GIT_TDE_PACKAGING"
GIT_EXTRA_DEPENDENCIES="$TDE_DIR/$CFG_GIT_EXTRA_DEPENDENCIES"
HOOK_DIR="$TDE_DIR/$CFG_HOOK_DIR"
# This folders must exists
BASE_DIRS=("GIT_DIR" "BUILD_DIR" "SCRIPT_DIR" "GIT_TDE_MAIN" "GIT_TDE_PACKAGING" "GIT_EXTRA_DEPENDENCIES" "HOOK_DIR")
for var_name in ${BASE_DIRS[@]}; do
if [ ! -d "${!var_name}" ]; then
echo -e "$var_name directory missing. Value is \"${!var_name}\". Check your config or create it."
do_exit 4
fi
done
#----------------------------
# Build output directories
#----------------------------
TDE_BUILD_DIR="$TDE_DIR/$CFG_TDE_BUILD_DIR"
TDE_DEBS_DIR="$TDE_DIR/$CFG_TDE_DEBS_DIR"
BUILD_DIRS=("TDE_BUILD_DIR" "TDE_DEBS_DIR")
for var_name in ${BUILD_DIRS[@]}; do
if [ ! -d "${!var_name}" ]; then
mkdir "${!var_name}"
fi
done
#----------------------------
# Check module name validity
#----------------------------
if [ "$bool_EXTRADEP_MOD" != "y" ]; then
# Standard module
MOD_GIT_PATH="$GIT_TDE_MAIN/$MOD_NAME"
MOD_GIT_PKGING_PATH="$GIT_TDE_PACKAGING/$MOD_NAME/debian"
else
# Extra dependency module
MOD_GIT_PATH="$GIT_DIR/$MOD_NAME"
fi
MOD_BUILD_PATH="$TDE_BUILD_DIR/$MOD_NAME"
MOD_BUILD_PKGING_PATH="$MOD_BUILD_PATH/debian"
if [ "$bool_BUILD_FROM_GIT" = "y" ]; then
echo -e "${CYellow}> Building from GIT repo${CNone}"
# source files
if [ ! -d "$MOD_GIT_PATH" ]; then
echo "Module \"$MOD_NAME\" not found in GIT"
do_exit 5
fi
bool_COPY_MOD_SRC="y"
# packaging scripts
if [ "$bool_EXTRADEP_MOD" != "y" -a ! -d "$MOD_GIT_PKGING_PATH" ]; then
echo "Packaging for \"$MOD_NAME\" not found in GIT"
do_exit 6
fi
bool_COPY_PKGING_FILES="y"
#
else
echo -e "${CYellow}> Building from BUILD folder${CNone}"
# source files
bool_COPY_MOD_SRC="n"
if [ ! -d "$MOD_BUILD_PATH" ]; then
if [ ! -d "$MOD_GIT_PATH" ]; then
echo "Module \"$MOD_NAME\" not found neither in BUILD nor in GIT"
do_exit 7
fi
bool_COPY_MOD_SRC="y"
fi
# packaging scripts
bool_COPY_PKGING_FILES="n"
if [ "$bool_EXTRADEP_MOD" != "y" -a ! -d "$MOD_BUILD_PKGING_PATH" ]; then
if [ ! -d "$MOD_GIT_PKGING_PATH" ]; then
echo "Packaging for \"$MOD_NAME\" not found neither in BUILD nor in GIT"
do_exit 8
fi
bool_COPY_PKGING_FILES="y"
fi
fi
#----------------------------
# Prepare source files
#----------------------------
# remove output from previous build
if [ -d "$MOD_BUILD_PATH" ]; then
cd "$MOD_BUILD_PATH/.."
rm *.deb *.dsc *.changes *.tar.bz2 *.tar.gz *.tar.xz *.log *.buildinfo &>/dev/null
fi
# copy main repo source files, if needed
if [ "$bool_COPY_MOD_SRC" = "y" ]; then
bool_COPY_PKGING_FILES="y"
recreate_folder "$MOD_BUILD_PATH"
if [ "$bool_EXTRADEP_MOD" != "y" ]; then
# Normal module
cp -R "$MOD_GIT_PATH" "$MOD_BUILD_PATH/.."
# Add SCM information for crash test report
[ -f "$MOD_BUILD_PATH/.tdescmmodule" ] && rm "$MOD_BUILD_PATH/.tdescmmodule"
[ -f "$MOD_BUILD_PATH/.tdescmrevision" ] && rm "$MOD_BUILD_PATH/.tdescmrevision"
# --> Module name
echo "$MOD_NAME" >"$MOD_BUILD_PATH/.tdescmmodule"
# --> SCM info
cd "$MOD_GIT_PATH"
MOD_BRANCH=`git branch --contains HEAD | grep -v "no branch" | head -n1 | cut -c 3-`
COMMIT_HASH=`git rev-parse HEAD`
echo "$MOD_BRANCH-$COMMIT_HASH" >"$MOD_BUILD_PATH/.tdescmrevision"
else
# Extra dependency module
if [ `find "$MOD_GIT_PATH" -name '*.dsc' | wc -l` == 1 ]; then
if [ -d "$MOD_BUILD_PATH" ]; then
rm -R "$MOD_BUILD_PATH"
fi
eval dpkg-source --no-copy --no-check -x `find "$MOD_GIT_PATH" -name '*.dsc'` \
\"$MOD_BUILD_PATH\" $OPT_SHOW_LOGS/dev/null
# Make sure patches are not reapplied in future local builds. This could stop pdebuild from working.
if [ -f "$MOD_BUILD_PATH/debian/patches/series" ]; then
cp /dev/null "$MOD_BUILD_PATH/debian/patches/series"
fi
else
echo "There must be one and only one .dsc file in \"$MOD_GIT_PATH\""
do_exit 9
fi
fi
fi
# copying packaging scripts, if needed
if [ "$bool_EXTRADEP_MOD" != "y" -a "$bool_COPY_PKGING_FILES" = "y" ]; then
if [ -d "$MOD_BUILD_PKGING_PATH" ]; then
rm -R $MOD_BUILD_PKGING_PATH
fi
cp -R "$MOD_GIT_PKGING_PATH" "$MOD_BUILD_PKGING_PATH"
# TODO metapackage support
if [ "$USE_LOCAL_BUILD_NUMBER" != "y" ]; then
# Default package name (Slavek's repo style)
# Calculate package version
cd $MOD_GIT_PATH
branch=`git branch --contains HEAD | egrep -v "no branch|detached" | head -n1 | cut -c 3-`
target_tag=`git tag | grep -F "$TDE_RELEASE" | head -n1`
tag=`git tag | \
sed "s|^\([^0-9]\)|\1.|" | sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr -k 5,5nr | sed "s|^\([^0-9]\)\.|\1|" | \
while read t; do \
git branch --contains $t | cut -c 3- | grep -x "$branch" >/dev/null && \
echo "$t..HEAD" && break; done`
count=`git log $tag --pretty=oneline | wc -l`
package=$(basename $PWD)-trinity-$TDE_RELEASE
if [[ "$count" -gt 0 ]] || [[ -z "$target_tag" ]]; then
package=$package~pre$count+$(git rev-parse HEAD | cut -c 1-8)
fi
REL=4:$TDE_RELEASE${package#*$TDE_RELEASE}
REL=${REL%+*}
REL=${REL/4:14.0.0/4:14.0.0-s}
REL=${REL/4:14.0.0-s~pre/4:14.0.0-s~}
REL=${REL/.0~pre/.0~s}
# Get package name and packaging release
PKG_NAME=$(head -n1 $MOD_BUILD_PKGING_PATH/changelog)
PKG_NAME=${PKG_NAME%% *}
PKG_TAG=$(cd "$GIT_TDE_PACKAGING/$MOD_NAME" &&
git tag | \
sed "s|^\([^0-9]\)|\1.|" | sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr -k 5,5nr | sed "s|^\([^0-9]\)\.|\1|" | \
while read t; do \
git branch --contains $t | cut -c 3- | grep -x "$branch" >/dev/null && \
echo "$t..HEAD" && break; done)
PKG_REL=$(cd "$GIT_TDE_PACKAGING/$MOD_NAME" &&
git log $PKG_TAG --pretty=oneline . | wc -l)
if [ -n "$REL_SUFFIX" ]; then
PKG_REL="${PKG_REL}${REL_SUFFIX}"
fi
# TODO add relative patch count
ADD_REL=0
DATE=$(date -R)
GITUSER="$(git config --get user.name) <$(git config --get user.email)>"
echo "$PKG_NAME ($REL-0$DISTRO$DISTRO_VERSION.$ADD_REL+$PKG_REL) $DISTRO_NAME; urgency=low" > "$MOD_BUILD_PKGING_PATH/changelog"
echo -e "\n * Automated git build\n\n -- $GITUSER $DATE\n" >> "$MOD_BUILD_PKGING_PATH/changelog"
cat "$GIT_TDE_PACKAGING/$MOD_NAME/debian/changelog" >> "$MOD_BUILD_PKGING_PATH/changelog"
else
# Local build version
if [ "$BUILD_DATE" = "" ]; then
BUILD_DATE=`date +%Y%m%d+%H%M`
fi
BUILDISTRO_NAME="4:$TDE_RELEASE-${BUILD_NUMBER}+$BUILD_DATE" # Module build version number (quilt format)
dch -b -v "$BUILDISTRO_NAME" -D "$DISTRO_NAME" -c "$MOD_BUILD_PKGING_PATH/changelog" "Autogenerated by building script" &>/dev/null
fi
fi
# prepare destination directory for building
MOD_DEB_PATH="$TDE_DEBS_DIR/$MOD_NAME"
MOD_DEBSRC_PATH="$MOD_DEB_PATH/src"
recreate_folder "$MOD_DEB_PATH"
recreate_folder "$MOD_DEBSRC_PATH"
#----------------------------
# Apply pre-build hooks if present
#----------------------------
if [ -x "$HOOK_DIR/$MOD_NAME/pre_build.sh" ]; then
echo -e "${CYellow}> Applying pre-build hook${CNone}"
. "$HOOK_DIR/$MOD_NAME/pre_build.sh"
if [ $? -eq 0 ]; then
echo -e "> ${CBrown}Pre-build hook applied successfully${CNone}"
else
echo -e "> ${CLightBlue}Pre-build hook failed${CNone}"
fi
fi
#----------------------------
# Switch to 3.0(quilt) format
#----------------------------
# create orig tarball
cd "$MOD_BUILD_PATH"
MOD_BASENAME=`head -n 1 "$MOD_BUILD_PKGING_PATH/changelog" | sed -r "s/^([^ ]+).*/\1/"`
MOD_MAJOR_VER=`head -n 1 "$MOD_BUILD_PKGING_PATH/changelog" | sed -r "s/^[^ ]+ \(([^:]+:)?.*/\1/"`
MOD_UP_VER=`head -n 1 "$MOD_BUILD_PKGING_PATH/changelog" | sed -r "s/^[^ ]+ \(([^:]+:)?([^-]+).*/\2/"`
MOD_DEB_VER=`head -n 1 "$MOD_BUILD_PKGING_PATH/changelog" | sed -r "s/^[^ ]+ \([^-]+-([^\)]+).*/\1/"`
tar cJf "../${MOD_BASENAME}_${MOD_UP_VER}.orig.tar.xz" --exclude="debian" --exclude=".git*" .
# switch to quilt format
if [ -f "$MOD_BUILD_PKGING_PATH/source/format" ]; then
grep -q "(native)" "$MOD_BUILD_PKGING_PATH/source/format" && \
sed -i "s/(native)/(quilt)/" "$MOD_BUILD_PKGING_PATH/source/format"
else
[ -d "$MOD_BUILD_PKGING_PATH/source" ] || mkdir -p "$MOD_BUILD_PKGING_PATH/source"
echo "3.0 (quilt)" >"$MOD_BUILD_PKGING_PATH/source/format"
fi
# remove quilt references from rules file
grep -q "^include.*/usr/share/cdbs/1/rules/patchsys-quilt\.mk" "$MOD_BUILD_PKGING_PATH/rules" && \
sed -i "s/^\(include.*\/usr\/share\/cdbs\/1\/rules\/patchsys-quilt\.mk\)/#\1/" "$MOD_BUILD_PKGING_PATH/rules"
if [ "$bool_PREPARE_ONLY" = "y" ]; then
echo -e "${CBrown}Source code prepared for building${CNone}"
do_exit 0
fi
#----------------------------
# Enable debug mode if required
#----------------------------
if [ "$bool_DEBUG_MODE" = "y" ]; then
echo -e "${CBrown}Enable debug mode${CNone}"
sed -i "s/RelWithDebInfo/Debug/" "$MOD_BUILD_PKGING_PATH/rules"
fi
#----------------------------
# Build
#----------------------------
BUILDING_LOG_FILE="$MOD_DEBSRC_PATH/__build__.log"
cd "$MOD_BUILD_PATH"
if [ "$bool_BUILD_LOCALLY" = "y" ]; then
## Build module locally
echo -e "${CYellow}> Building locally${CNone}"
eval dpkg-buildpackage $OPT_SIGN_PKG_LOCAL $OPT_SHOW_LOGS\"$BUILDING_LOG_FILE\"
build_retval=$?
#
else
## Build module in a clean chroot environment using pbuilder
# Install/remove shell hook
if [ "$bool_SHELL_HOOK" = "y" ]; then
if [ -x "$PBUILDER_SHELL_HOOK_TEMPLATE" ]; then
cp "$PBUILDER_SHELL_HOOK_TEMPLATE" "$PBUILDER_SHELL_HOOK" &>/dev/null
else
echo "pbuilder shell hook template file not found! ($PBUILDER_SHELL_HOOK_TEMPLATE)"
fi
else
if [ -x "$PBUILDER_SHELL_HOOK" ]; then
rm "$PBUILDER_SHELL_HOOK" &>/dev/null
fi
fi
# Build using pbuilder
echo -e "${CYellow}> Building using pbuilder${CNone}"
# Create pbuilder hook to make sure all available packages are scanned
# Store any existing D05 hook as a temporary file, this will be reinstated at the end
if [ -x "$PBUILDER_DEPS_HOOK" ]; then
mv "$PBUILDER_DEPS_HOOK" "$PBUILDER_DEPS_HOOK_SAVE"
fi
cat <<END_D05 > "$PBUILDER_DEPS_HOOK"
#!/bin/sh
(cd "$TDE_DEBS_DIR"; apt-ftparchive packages . > Packages)
echo "deb [trusted=yes] file://$TDE_DEBS_DIR ./" >> /etc/apt/sources.list
apt-get update
END_D05
chmod a+x "$PBUILDER_DEPS_HOOK"
# Build
eval pdebuild $OPT_INTERNAL_PBUILDER $OPT_SIGN_PKG_PBUILDER \
--architecture $ARCHITECTURE \
--buildresult \"$MOD_DEB_PATH\" \
--pbuilderroot \"sudo DIST=$DISTRO_NAME ARCH=$ARCHITECTURE\" \
--logfile \"$BUILDING_LOG_FILE\" \
-- \
--bindmounts \"$TDE_DEBS_DIR\" \
--hookdir \"$PBUILDER_HOOK_DIR\" \
$OPT_SHOW_LOGS\"$BUILDING_LOG_FILE\"
build_retval=$?
if [ -x "$PBUILDER_DEPS_HOOK" ]; then
mv "$PBUILDER_DEPS_HOOK_SAVE" "$PBUILDER_DEPS_HOOK"
fi
fi
if [ $build_retval -eq 0 ]; then
echo -e "${CLightGreen}> Building completed SUCCESSFULLY${CNone}"
else
echo -e "${CLightRed}> Building completed WITH ERRORS${CNone}"
fi
#----------------------------
# Apply post-build hooks if present
#----------------------------
if [ -x "$HOOK_DIR/$MOD_NAME/post_build.sh" ]; then
echo -e "${CYellow}> Applying post-build hook${CNone}"
. "$HOOK_DIR/$MOD_NAME/post_build.sh"
if [ $? -eq 0 ]; then
echo -e "${CBrown}Post-build hook applied successfully${CNone}"
else
echo -e "${CLightBlue}Post-build hook failed${CNone}"
fi
fi
#----------------------------
# Move compiled module files to destination folders
#----------------------------
if [ "$bool_BUILD_LOCALLY" = "y" ]; then
cd "$MOD_BUILD_PATH/.."
mv *.deb "$MOD_DEB_PATH" &>/dev/null
mv *.dsc *.changes *.tar.xz *.tar.bz2 *.tar.gz *.buildinfo "$MOD_DEBSRC_PATH" &>/dev/null
else
cd "$MOD_DEB_PATH"
mv *.dsc *.changes *.tar.xz *.tar.bz2 *.tar.gz *.buildinfo "$MOD_DEBSRC_PATH" &>/dev/null
cd "$MOD_BUILD_PATH/.."
mv *.dsc *.changes *.tar.xz *.tar.bz2 *.tar.gz *.buildinfo "$MOD_DEBSRC_PATH" &>/dev/null
fi
#----------------------------
# Removing leftover files
#----------------------------
cd "$MOD_BUILD_PATH/.."
rm *.deb *.dsc *.changes *.tar.xz *.tar.bz2 *.tar.gz *.log *.buildinfo &>/dev/null
cd "$MOD_DEB_PATH"
rm *.dsc *.changes *.tar.xz *.tar.bz2 *.tar.gz *.log *.buildinfo &>/dev/null
#----------------------------
# Building completed
#----------------------------
exec_time_stop $_BUILDMOD_TIMER_NUM "_BUILDMOD_TIME"
do_exit $build_retval