jan@159: #!/bin/bash jan@159: # Simple Unix shell script to build Mercurial using Jenkins CI jan@159: # Designed to run under Cygwin as well. jan@158: jan@158: PROJECT="Mercurial Support" jan@158: jan@159: jan@159: # ### START OF common.sh.in ########################################## jan@159: # jan@159: # Common set of function to build a project. jan@159: # jan@159: jan@159: jan@158: # Determine operating system, bit simple but works jan@158: if [ "$OS" == "Windows_NT" ]; then jan@158: WIN32=1 jan@158: UNIX=0 jan@158: else jan@158: WIN32=0 jan@158: UNIX=1 jan@158: fi jan@158: jan@159: # ===================================================== jan@158: # Utility functions jan@159: # ===================================================== jan@158: jan@159: jan@159: # Simple logging functions jan@159: function info { jan@159: echo "[INF] $1" jan@159: if [ ! -z "$2" ]; then jan@159: echo " $2" jan@159: fi jan@159: } jan@159: jan@159: function error { jan@159: echo "[ERR] $1" jan@159: if [ ! -z "$2" ]; then jan@159: echo " $2" jan@159: fi jan@159: exit 1 jan@159: } jan@159: jan@159: # Run make in current directory. Caller should cd to target jan@159: # directory before calling this method. jan@158: function mk { jan@158: if [ "$WIN32" == "1" ]; then jan@158: cmd /C bmake.bat $1 $2 jan@158: else jan@158: if [ ! -f makefile ]; then jan@158: if [ -f Makefile ]; then jan@158: make mf || error "Failed to generate makefile (make mf)" jan@158: else jan@158: make -f Makefile.init mf || error "Failed to generate makefile (make -f Makefile.init mf)" jan@158: fi jan@158: fi jan@158: make $1 $2 || error "Make failed" jan@158: fi jan@158: } jan@158: jan@159: # Run tests for package specified in first argument. jan@159: function sunit { jan@158: pushd stx/goodies/builder/reports jan@158: info "Running tests for $1" jan@158: if [ "$WIN32" == "1" ]; then jan@159: cmd /C report-runner.bat -D ../../../.. -r Builder::TestReport -p "$1" || error "Failed to run reports" jan@158: else jan@159: (echo "" | ./report-runner.sh -D ../../../.. -r Builder::TestReport -p "$1") || error "Failed to run reports" jan@158: fi jan@158: popd jan@158: } jan@158: jan@159: # Main function. Performs complete build or given task jan@158: function main { jan@158: pushd "$BUILD" jan@158: if [ -z "$1" ]; then jan@158: info "Checking out..." jan@158: checkout jan@158: info "Compiling..." jan@158: compile jan@158: info "Running tests..." jan@158: runtests jan@158: else jan@158: case "$1" in jan@158: checkout) jan@158: info "Checking out..." jan@158: checkout;; jan@158: compile) jan@158: info "Compiling..." jan@158: compile;; jan@158: tests) jan@158: info "Running tests..." jan@158: runtests;; jan@158: test) jan@158: info "Running tests..." jan@158: runtests;; jan@158: *) jan@158: error "Invalid command ($1)" jan@158: esac jan@158: fi jan@158: popd jan@158: exit 0 jan@158: } jan@158: jan@158: # Setup... jan@159: jan@158: if [ "$WIN32" == "1" ]; then jan@158: # WINDOWS jan@158: # MUST export this, otherwise libjpeg fails to build!!!" jan@158: if [ -z "$BCB"]; then jan@158: export BCB="C:\Borland\BCC55" jan@158: fi jan@158: # To make cvs/ssh happy jan@158: if [ -z "$CVS_RSH" ]; then jan@158: export CVS_RSH=plink jan@158: fi jan@158: # Set home jan@158: export HOME=$USERPROFILE jan@158: else jan@158: # LINUX jan@158: # to get Mercurial on build slave jan@158: export PATH=$PATH:/home/vrany/bin jan@158: fi jan@158: jan@158: if [ -z "$CVSROOT" ]; then jan@158: error "CVSROOT not set!" jan@158: fi jan@158: jan@158: # Sorry, it's lot easier for all to have all the messages in EN :-) jan@158: export LANG=en_GB.UTF-8 jan@158: jan@158: # When run interactively, Jenkins env variables jan@158: # may not be set... jan@158: if [ -z "$WORKSPACE" ]; then jan@158: WORKSPACE="$PWD" jan@158: INTERACTIVE=1 jan@158: else jan@158: INTERACTIVE=0 jan@158: fi jan@158: jan@158: if [ "$INTERACTIVE" == "0" ]; then jan@158: if [ "$WIN32" == "1" ]; then jan@158: WORKSPACE="$PWD" jan@158: fi jan@158: fi jan@158: jan@158: if [ -z "$BUILD_NUMBER" ]; then jan@158: BUILD_NUMBER=$(date +%Y_%m_%d_interactive) jan@158: fi jan@158: jan@158: BUILD="." jan@158: jan@158: jan@158: echo "INFO: BUILD=\"$BUILD\"" jan@158: jan@158: if [ -d "$BUILD" ]; then jan@158: if [ "$BUILD" != "." ]; then jan@158: info "Build directory already exists!" jan@158: fi jan@158: else jan@158: mkdir -p "$BUILD" jan@158: fi jan@158: jan@159: jan@159: # =================================================================== jan@159: # Actual build functions. jan@159: # =================================================================== jan@159: # jan@159: # User scripts should override following functions to define a build jan@159: jan@159: function checkout { jan@159: error "You have to override function 'checkout'" jan@159: } jan@159: jan@159: function compile { jan@159: error "You have to override function 'compile'" jan@159: } jan@159: jan@159: function runtests { jan@159: info "No tests specified" "To do so, override function runtests" jan@159: } jan@159: jan@159: # ### END OF common.sh.in ############################################ jan@159: jan@158: # Checkout jan@158: function checkout { jan@158: # Checkout stx jan@158: if [ ! -d stx ]; then jan@158: if ! cvs co stx; then jan@158: error "CVS: Cannot checkout stx"; jan@158: fi jan@159: #else jan@159: # (cd stx && cvs update -d) jan@158: fi jan@158: jan@158: # Checkout stx:libscm jan@158: repo="https://bitbucket.org/janvrany/stx-libscm" jan@158: if [ ! -d stx/libscm ]; then jan@158: hg clone "$repo" stx/libscm || error "HG: cannot clone stx:libscm" jan@158: else jan@158: hg --cwd stx/libscm pull "$repo" || error "HG: cannot pull stx:libscm" jan@158: hg --cwd stx/libscm update || error "HG: cannot update stx:libscm" jan@158: fi jan@158: } jan@158: jan@158: jan@158: # Compile jan@158: function compile { jan@158: TARGETS1="stx stx/libscm/common stx/libscm/mercurial stx/librun" jan@158: for target in $TARGETS1; do jan@158: if ! (cd "$target" && mk); then jan@158: echo "ERROR: cannot $MAKE in $target" jan@158: exit 3 jan@158: fi jan@158: done jan@158: } jan@158: jan@158: function runtests { jan@158: sunit "stx:libscm/mercurial" jan@158: } jan@158: jan@158: jan@158: # Now, call main jan@158: main $1 $2 $3