summaryrefslogtreecommitdiffstats
path: root/debian/_buildscripts/local/build_module.sh
diff options
context:
space:
mode:
Diffstat (limited to 'debian/_buildscripts/local/build_module.sh')
-rwxr-xr-xdebian/_buildscripts/local/build_module.sh432
1 files changed, 432 insertions, 0 deletions
diff --git a/debian/_buildscripts/local/build_module.sh b/debian/_buildscripts/local/build_module.sh
new file mode 100755
index 000000000..18d55d778
--- /dev/null
+++ b/debian/_buildscripts/local/build_module.sh
@@ -0,0 +1,432 @@
+#!/bin/bash
+#
+# Build a single TDE module
+#
+
+# Load common code and initialization
+. ./internals/_build_common.sh
+init_common
+
+
+# Timer settings
+_BUILDMOD_TIMER_NUM=0
+_BUILDMOD_TIME="--/--:--:--:---"
+exec_time_start $_BUILDMOD_TIMER_NUM
+
+
+# Need sudo for non-root users
+SUDO_CMD=""
+if [ "`whoami`" != "root" ]; then
+ SUDO_CMD="sudo -E"
+fi
+
+
+#----------------------------
+# 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_BUILD_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_BUILD_RESULT_FILENAME"
+ fi
+ fi
+ exit $1
+}
+
+
+#----------------------------
+# Parameters:
+# $1 - folder name
+function recreate_folder()
+{
+ if [ -d "$1" ]; then
+ $SUDO_CMD 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
+export bool_SHELL_HOOK
+export bool_INTERNAL_PBUILDER
+
+# Local option variables
+# - sign packages
+OPT_SIGN_PKG_LOCAL="-uc -us"
+# - show logs
+OPT_SHOW_LOGS="&>"
+if [ "$bool_SHOW_BUILD_LOGS" = "y" ]; then
+ OPT_SHOW_LOGS=" | tee "
+fi
+export OPT_SHOW_LOGS
+
+# Log start
+echo -e "${CLightCyan}#### Processing module \"$MOD_NAME\" ####${CNone}"
+
+# This folders must exists
+BASE_DIRS=("REPO_DIR" "BUILD_DIR" "SCRIPT_DIR" "REPO_TDE_MAIN" "REPO_TDE_PACKAGING" "REPO_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
+#----------------------------
+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="$REPO_TDE_MAIN/$MOD_NAME"
+ MOD_GIT_PKGING_PATH="$REPO_TDE_PACKAGING/$MOD_NAME/debian"
+else
+ # Extra dependency module
+ MOD_GIT_PATH="$REPO_DIR/$MOD_NAME"
+fi
+export 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/.."
+ $SUDO_CMD 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
+ $SUDO_CMD 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
+ $SUDO_CMD rm -R $MOD_BUILD_PKGING_PATH
+ fi
+ cp -R "$MOD_GIT_PKGING_PATH" "$MOD_BUILD_PKGING_PATH"
+
+ # TODO metapackage support
+
+ # 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 "$REPO_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 "$REPO_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 "$REPO_TDE_PACKAGING/$MOD_NAME/debian/changelog" >> "$MOD_BUILD_PKGING_PATH/changelog"
+fi
+
+# prepare destination directory for building
+export 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
+#----------------------------
+export 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
+ $SUDO_CMD "$SCRIPT_DIR/internals/_pbuilder.sh"
+ build_retval=$?
+ if [ "`whoami`" != "root" ]; then
+ cd "$MOD_DEB_PATH"
+ $SUDO_CMD chown -R `id -u -n`:`id -g -n` . &>/dev/null
+ cd "$MOD_BUILD_PATH/.."
+ $SUDO_CMD chown `id -u -n`:`id -g -n` *.dsc *.changes *.tar.xz *.tar.bz2 *.tar.gz *.buildinfo &>/dev/null
+ $SUDO_CMD chown `id -u -n`:`id -g -n` "$TDE_DEBS_DIR/Packages" &>/dev/null
+ cd "$MOD_BUILD_PATH"
+ 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