build_module: added options to help with automated environments.
diff --git a/build_module.sh b/build_module.sh
index c705845..49ba532 100755
--- a/build_module.sh
+++ b/build_module.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
#
-# build_module.sh (c) NGINX, Inc. [v0.11 20-Jun-2017] Liam Crilly <liam.crilly@nginx.com>
+# build_module.sh (c) NGINX, Inc. [v0.12 30-Aug-2017] Liam Crilly <liam.crilly@nginx.com>
#
# This script supports apt(8) and yum(8) package managers. Installs the minimum
# necessary prerequisite packages to build 3rd party modules for NGINX Plus.
@@ -9,6 +9,8 @@
# Obtains pkg-oss tool, creates packaging files and copies in module source.
#
# CHANGELOG
+# v0.12 [30-Aug-2017] -o option to specify destination for package files
+# -y (--non-interactive) option for automated builds
# v0.11 [20-Jun-2017] Enforces NGINX versions that support dynamic modules
# v0.10 [27-Apr-2017] Fixed postinstall banner, improved .so filename detection,
# -v option for specifying OSS build/version
@@ -43,9 +45,11 @@
echo " Options:"
echo " -n | --nickname <word> # Used for packaging, lower case alphanumeric only"
echo " -s | --skip-depends # Skip dependecies check/install"
+ echo " -y | --non-interactive # Automatically install dependencies and overwrite files"
echo " -f | --force-dynamic # Attempt to convert static configuration to dynamic module"
echo " -r <NGINX Plus release number> # Build against the corresponding OSS version for this release"
echo " -v [NGINX OSS version number] # Build against this OSS version [current mainline] (default)"
+ echo " -o <package output directory> # Create package(s) in this directory"
echo ""
exit 1
fi
@@ -54,15 +58,23 @@
# Process command line options
#
CHECK_DEPENDS=1
+SAY_YES=""
+COPY_CMD="cp -i"
DO_DYNAMIC_CONVERT=0
MODULE_NAME=""
BUILD_PLATFORM=OSS
+OUTPUT_DIR=""
while [ $# -gt 1 ]; do
case "$1" in
"-s" | "--skip-depends")
CHECK_DEPENDS=0
shift
;;
+ "-y" | "--non-interactive")
+ SAY_YES="-y"
+ COPY_CMD="cp -f"
+ shift
+ ;;
"-f" | "--force-dynamic")
DO_DYNAMIC_CONVERT=1
shift
@@ -95,6 +107,14 @@
fi
shift
;;
+ "-o")
+ if [ ! -d $2 ]; then
+ echo "$ME: ERROR: Output directory $2 does not exist - quitting"
+ exit 1
+ fi
+ OUTPUT_DIR=$2
+ shift; shift
+ ;;
*)
echo "$ME: ERROR: Invalid command line option ($1) - quitting"
exit 1
@@ -107,20 +127,22 @@
#
if [ `whereis yum | grep -c "^yum: /"` -eq 1 ]; then
PKG_MGR=yum
+ PKG_FMT=rpm
NGINX_PACKAGES="pcre-devel zlib-devel openssl-devel"
DEVEL_PACKAGES="rpm-build"
+ PACKAGING_ROOT=${HOME}/rpmbuild/
PACKAGING_DIR=rpm/SPECS
PACKAGE_SOURCES_DIR=../SOURCES
- FIND_PKGS_CMD="find ${HOME}/rpmbuild/RPMS/ -maxdepth 2 -type f -name "*.rpm" -print"
- FIND_SO_CMD="find ${HOME}/rpmbuild/BUILD/ -type f -name "*.so" -print"
+ PACKAGE_OUTPUT_DIR=RPMS
elif [ `whereis apt-get | grep -c "^apt-get: /"` -eq 1 ]; then
PKG_MGR=apt-get
+ PKG_FMT=deb
NGINX_PACKAGES="libpcre3-dev zlib1g-dev libssl-dev"
DEVEL_PACKAGES="devscripts debhelper dpkg-dev quilt lsb-release"
+ PACKAGING_ROOT=${HOME}/debuild/
PACKAGING_DIR=debian
PACKAGE_SOURCES_DIR=extra
- FIND_PKGS_CMD="find ${HOME}/debuild/ -maxdepth 1 -type f -name "*.deb" -print"
- FIND_SO_CMD="find ${HOME}/debuild/ -maxdepth 9 -type f -name "*.so" -print"
+ PACKAGE_OUTPUT_DIR="*/debian"
else
echo "$ME: ERROR: Could not locate a supported package manager - quitting"
exit 1
@@ -142,7 +164,7 @@
if [ "${1##*.}" == "git" ]; then
CORE_PACKAGES="$CORE_PACKAGES git"
fi
- sudo $PKG_MGR install $CORE_PACKAGES $NGINX_PACKAGES $DEVEL_PACKAGES
+ sudo $PKG_MGR install $SAY_YES $CORE_PACKAGES $NGINX_PACKAGES $DEVEL_PACKAGES
fi
#
@@ -153,23 +175,36 @@
# Construct a reasonable nickname from the module source location
#
MODULE_NAME=`basename $1 | tr '[:blank:][:punct:]' '\n' | tr '[A-Z]' '[a-z]' | grep -ve nginx -e ngx -e http -e stream -e module -e plus -e tar -e zip -e gz -e git | tr -d '\n'`
- read -p "$ME: INPUT: Enter module nickname [$MODULE_NAME]: "
- if [ "$REPLY" != "" ]; then
- MODULE_NAME=$REPLY
+ if [ -z "$SAY_YES" ]; then
+ read -p "$ME: INPUT: Enter module nickname [$MODULE_NAME]: "
+ if [ "$REPLY" != "" ]; then
+ MODULE_NAME=$REPLY
+ fi
+ else
+ echo "$ME: INFO: using \"$MODULE_NAME\" as module nickname"
fi
fi
#
# Sanitize module nickname (this is a debbuild requirement, probably needs to check for more characters)
#
-MODULE_NAME_CLEAN=`echo $MODULE_NAME | tr '[A-Z]' '[a-z]' | tr -d '[_\-\.\t ]'`
-if [ $MODULE_NAME_CLEAN != $MODULE_NAME ]; then
- echo "$ME: WARNING: Removed illegal characters from module nickname - using $MODULE_NAME_CLEAN"
- read -p "$ME: INPUT: Confirm module nickname [$MODULE_NAME_CLEAN]: " MODULE_NAME
- if [ "$MODULE_NAME" = "" ]; then
- MODULE_NAME=$MODULE_NAME_CLEAN
+while true; do
+ MODULE_NAME_CLEAN=`echo $MODULE_NAME | tr '[A-Z]' '[a-z]' | tr -d '[/_\-\.\t ]'`
+ if [ "$MODULE_NAME_CLEAN" != "$MODULE_NAME" ] || [ -z $MODULE_NAME ]; then
+ echo "$ME: WARNING: Removed illegal characters from module nickname - using \"$MODULE_NAME_CLEAN\""
+ if [ -z $SAY_YES ]; then
+ read -p "$ME: INPUT: Confirm module nickname [$MODULE_NAME_CLEAN]: " MODULE_NAME
+ if [ "$MODULE_NAME" = "" ]; then
+ MODULE_NAME=$MODULE_NAME_CLEAN
+ fi
+ else
+ MODULE_NAME=$MODULE_NAME_CLEAN
+ break
+ fi
+ else
+ break
fi
-fi
+done
#
# Create temporary build area, with working copy of module source
@@ -346,6 +381,9 @@
# Build!
#
echo "$ME: INFO: Building"
+if [ -d $PACKAGING_ROOT -a "$SAY_YES" = "-y" ]; then
+ rm -fr $PACKAGING_ROOT
+fi
make prepare-build-env
if [ $? -ne 0 ]; then
echo "$ME: ERROR: Unable to prepare build environment - quitting"
@@ -366,10 +404,16 @@
if [ $? -ne 0 ]; then
echo "$ME: ERROR: Build failed"
else
+ echo ""
echo "$ME: INFO: Module binaries created"
- $FIND_SO_CMD
+ find $PACKAGING_ROOT -type f -name "*.so" -print
+
echo "$ME: INFO: Module packages created"
- $FIND_PKGS_CMD
+ if [ "$OUTPUT_DIR" = "" ]; then
+ find $PACKAGING_ROOT$PACKAGE_OUTPUT_DIR -type f -name "*.$PKG_FMT" -print
+ else
+ find $PACKAGING_ROOT$PACKAGE_OUTPUT_DIR -type f -name "*.$PKG_FMT" -exec $COPY_CMD -v {} $OUTPUT_DIR \;
+ fi
echo "$ME: INFO: Removing $BUILD_DIR"
rm -fr $BUILD_DIR
fi