summaryrefslogtreecommitdiff
path: root/build.sh
diff options
context:
space:
mode:
Diffstat (limited to 'build.sh')
-rwxr-xr-xbuild.sh428
1 files changed, 428 insertions, 0 deletions
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000000..f1a392f61f
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,428 @@
+#!/bin/sh
+
+# This is the custom build script for the viewer
+#
+# It must be run by the Linden Lab build farm shared buildscript because
+# it relies on the environment that sets up, functions it provides, and
+# the build result post-processing it does.
+#
+# The shared buildscript build.sh invokes this because it is named 'build.sh',
+# which is the default custom build script name in buildscripts/hg/BuildParams
+#
+# PLEASE NOTE:
+#
+# * This script is interpreted on three platforms, including windows and cygwin
+# Cygwin can be tricky....
+# * The special style in which python is invoked is intentional to permit
+# use of a native python install on windows - which requires paths in DOS form
+
+check_for()
+{
+ if [ -e "$2" ]; then found_dict='FOUND'; else found_dict='MISSING'; fi
+ echo "$1 ${found_dict} '$2' " 1>&2
+}
+
+build_dir_Darwin()
+{
+ echo build-darwin-i386
+}
+
+build_dir_Linux()
+{
+ echo build-linux-i686
+}
+
+build_dir_CYGWIN()
+{
+ echo build-vc120
+}
+
+viewer_channel_suffix()
+{
+ local package_name="$1"
+ local suffix_var="${package_name}_viewer_channel_suffix"
+ local suffix=$(eval "echo \$${suffix_var}")
+ if [ "$suffix"x = ""x ]
+ then
+ echo ""
+ else
+ echo "_$suffix"
+ fi
+}
+
+installer_Darwin()
+{
+ local package_name="$1"
+ local package_dir="$(build_dir_Darwin ${last_built_variant:-Release})/newview/"
+ local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_i386\\.dmg\$"
+ # since the additional packages are built after the base package,
+ # sorting oldest first ensures that the unqualified package is returned
+ # even if someone makes a qualified name that duplicates the last word of the base name
+ local package=$(ls -1tr "$package_dir" 2>/dev/null | grep -E "$pattern" | head -n 1)
+ test "$package"x != ""x && echo "$package_dir/$package"
+}
+
+installer_Linux()
+{
+ local package_name="$1"
+ local package_dir="$(build_dir_Linux ${last_built_variant:-Release})/newview/"
+ local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_i686\\.tar\\.bz2\$"
+ # since the additional packages are built after the base package,
+ # sorting oldest first ensures that the unqualified package is returned
+ # even if someone makes a qualified name that duplicates the last word of the base name
+ package=$(ls -1tr "$package_dir" 2>/dev/null | grep -E "$pattern" | head -n 1)
+ test "$package"x != ""x && echo "$package_dir/$package"
+}
+
+installer_CYGWIN()
+{
+ local package_name="$1"
+ local variant=${last_built_variant:-Release}
+ local build_dir=$(build_dir_CYGWIN ${variant})
+ local package_dir
+ if [ "$package_name"x = ""x ]
+ then
+ package_dir="${build_dir}/newview/${variant}"
+ else
+ package_dir="${build_dir}/newview/${package_name}/${variant}"
+ fi
+ if [ -r "${package_dir}/touched.bat" ]
+ then
+ local package_file=$(sed 's:.*=::' "${package_dir}/touched.bat")
+ echo "${package_dir}/${package_file}"
+ fi
+}
+
+pre_build()
+{
+ local variant="$1"
+ begin_section "Configure $variant"
+ [ -n "$master_message_template_checkout" ] \
+ && [ -r "$master_message_template_checkout/message_template.msg" ] \
+ && template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg"
+
+ "$autobuild" configure -c $variant -- \
+ -DPACKAGE:BOOL=ON \
+ -DRELEASE_CRASH_REPORTING:BOOL=ON \
+ -DVIEWER_CHANNEL:STRING="\"$viewer_channel\"" \
+ -DGRID:STRING="\"$viewer_grid\"" \
+ -DLL_TESTS:BOOL="$run_tests" \
+ -DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url
+
+ end_section "Configure $variant"
+}
+
+package_llphysicsextensions_tpv()
+{
+ begin_section "PhysicsExtensions_TPV"
+ tpv_status=0
+ if [ "$variant" = "Release" ]
+ then
+ llpetpvcfg=$build_dir/packages/llphysicsextensions/autobuild-tpv.xml
+ "$autobuild" build --verbose --config-file $llpetpvcfg -c Tpv
+
+ # capture the package file name for use in upload later...
+ PKGTMP=`mktemp -t pgktpv.XXXXXX`
+ trap "rm $PKGTMP* 2>/dev/null" 0
+ "$autobuild" package --verbose --config-file $llpetpvcfg --results-file "$(native_path $PKGTMP)"
+ tpv_status=$?
+ if [ -r "${PKGTMP}" ]
+ then
+ cat "${PKGTMP}" >> "$build_log"
+ eval $(cat "${PKGTMP}") # sets autobuild_package_{name,filename,md5}
+ autobuild_package_filename="$(shell_path "${autobuild_package_filename}")"
+ echo "${autobuild_package_filename}" > $build_dir/llphysicsextensions_package
+ fi
+ else
+ record_event "Do not provide llphysicsextensions_tpv for $variant"
+ llphysicsextensions_package=""
+ fi
+ end_section "PhysicsExtensions_TPV"
+ return $tpv_status
+}
+
+build()
+{
+ local variant="$1"
+ if $build_viewer
+ then
+ "$autobuild" build --no-configure -c $variant
+ build_ok=$?
+
+ # Run build extensions
+ if [ $build_ok -eq 0 -a -d ${build_dir}/packages/build-extensions ]; then
+ for extension in ${build_dir}/packages/build-extensions/*.sh; do
+ begin_section "Extension $extension"
+ . $extension
+ end_section "Extension $extension"
+ if [ $build_ok -ne 0 ]; then
+ break
+ fi
+ done
+ fi
+
+ # *TODO: Make this a build extension.
+ package_llphysicsextensions_tpv
+ tpvlib_build_ok=$?
+ if [ $build_ok -eq 0 -a $tpvlib_build_ok -eq 0 ]
+ then
+ echo true >"$build_dir"/build_ok
+ else
+ echo false >"$build_dir"/build_ok
+ fi
+ fi
+}
+
+# Check to see if we were invoked from the wrapper, if not, re-exec ourselves from there
+if [ "x$arch" = x ]
+then
+ top=`hg root`
+ if [ -x "$top/../buildscripts/hg/bin/build.sh" ]
+ then
+ exec "$top/../buildscripts/hg/bin/build.sh" "$top"
+ else
+ cat <<EOF
+This script, if called in a development environment, requires that the branch
+independent build script repository be checked out next to this repository.
+This repository is located at http://bitbucket.org/lindenlabinternal/sl-buildscripts
+EOF
+ exit 1
+ fi
+fi
+
+# Check to see if we're skipping the platform
+eval '$build_'"$arch" || pass
+
+# ensure AUTOBUILD is in native path form for child processes
+AUTOBUILD="$(native_path "$AUTOBUILD")"
+# set "$autobuild" to cygwin path form for use locally in this script
+autobuild="$(shell_path "$AUTOBUILD")"
+if [ ! -x "$autobuild" ]
+then
+ record_failure "AUTOBUILD not executable: '$autobuild'"
+ exit 1
+fi
+
+# load autobuild provided shell functions and variables
+eval "$("$autobuild" source_environment)"
+
+# dump environment variables for debugging
+begin_section "Environment"
+env|sort
+end_section "Environment"
+
+# Now run the build
+succeeded=true
+build_processes=
+last_built_variant=
+for variant in $variants
+do
+ eval '$build_'"$variant" || continue
+ eval '$build_'"$arch"_"$variant" || continue
+
+ # Only the last built arch is available for upload
+ last_built_variant="$variant"
+
+ begin_section "$variant"
+ build_dir=`build_dir_$arch $variant`
+ build_dir_stubs="$build_dir/win_setup/$variant"
+
+ begin_section "Initialize Build Directory"
+ rm -rf "$build_dir"
+ mkdir -p "$build_dir"
+ mkdir -p "$build_dir/tmp"
+ end_section "Initialize Build Directory"
+
+ if pre_build "$variant" "$build_dir" >> "$build_log" 2>&1
+ then
+ begin_section "Build $variant"
+ build "$variant" "$build_dir" 2>&1 | tee -a "$build_log" | sed -n 's/^ *\(##teamcity.*\)/\1/p'
+ if `cat "$build_dir/build_ok"`
+ then
+ if [ "$variant" == "Release" ]
+ then
+ if [ -r "$build_dir/autobuild-package.xml" ]
+ then
+ begin_section "Autobuild metadata"
+ upload_item docs "$build_dir/autobuild-package.xml" text/xml
+ if [ "$arch" != "Linux" ]
+ then
+ record_dependencies_graph # defined in buildscripts/hg/bin/build.sh
+ else
+ record_event "no dependency graph for linux (probable python version dependency)" 1>&2
+ fi
+ end_section "Autobuild metadata"
+ else
+ record_event "no autobuild metadata at '$build_dir/autobuild-package.xml'"
+ fi
+ else
+ record_event "do not record autobuild metadata for $variant"
+ fi
+ else
+ record_failure "Build of \"$variant\" failed."
+ fi
+ end_section "Build $variant"
+ fi
+ end_section "$variant"
+ if ! $succeeded
+ then
+ record_event "remaining variants skipped due to $variant failure"
+ break
+ fi
+done
+
+# build debian package
+if [ "$arch" == "Linux" ]
+then
+ if $succeeded
+ then
+ if $build_viewer_deb && [ "$last_built_variant" == "Release" ]
+ then
+ begin_section "Build Viewer Debian Package"
+ have_private_repo=false
+ # mangle the changelog
+ dch --force-bad-version \
+ --distribution unstable \
+ --newversion "${VIEWER_VERSION}" \
+ "Automated build #$build_id, repository $branch revision $revision." \
+ >> "$build_log" 2>&1
+
+ # build the debian package
+ $pkg_default_debuild_command >>"$build_log" 2>&1 || record_failure "\"$pkg_default_debuild_command\" failed."
+
+ # Unmangle the changelog file
+ hg revert debian/changelog
+
+ end_section "Build Viewer Debian Package"
+
+ # Run debian extensions
+ if [ -d ${build_dir}/packages/debian-extensions ]; then
+ for extension in ${build_dir}/packages/debian-extensions/*.sh; do
+ . $extension
+ done
+ fi
+ # Move any .deb results.
+ mkdir -p ../packages_public
+ mkdir -p ../packages_private
+ mv ${build_dir}/packages/*.deb ../packages_public 2>/dev/null || true
+ mv ${build_dir}/packages/packages_private/*.deb ../packages_private 2>/dev/null || true
+
+ # upload debian package and create repository
+ begin_section "Upload Debian Repository"
+ for deb_file in `/bin/ls ../packages_public/*.deb ../*.deb 2>/dev/null`; do
+ upload_item debian $deb_file binary/octet-stream
+ done
+ for deb_file in `/bin/ls ../packages_private/*.deb 2>/dev/null`; do
+ upload_item debian_private $deb_file binary/octet-stream
+ have_private_repo=true
+ done
+
+ create_deb_repo
+
+ # Rename the local debian_repo* directories so that the master buildscript
+ # doesn't make a remote repo again.
+ for debian_repo_type in debian_repo debian_repo_private; do
+ if [ -d "$build_log_dir/$debian_repo_type" ]; then
+ mv $build_log_dir/$debian_repo_type $build_log_dir/${debian_repo_type}_pushed
+ fi
+ done
+
+ if [ $have_private_repo = true ]; then
+ eval "$python_command \"$redirect\" '\${private_S3PROXY_URL}${S3PREFIX}repo/$repo/rev/$revision/index.html'"\
+ >"$build_log_dir/private.html" || fatal generating redirect
+ upload_item global_redirect "$build_log_dir/private.html" text/html
+
+ fi
+
+ end_section "Upload Debian Repository"
+
+ else
+ echo debian build not enabled
+ fi
+ else
+ echo skipping debian build due to failed build.
+ fi
+fi
+
+# check status and upload results to S3
+if $succeeded
+then
+ if $build_viewer
+ then
+ begin_section Upload Installer
+ # Upload installer
+ package=$(installer_$arch)
+ if [ x"$package" = x ] || test -d "$package"
+ then
+ # Coverity doesn't package, so it's ok, anything else is fail
+ succeeded=$build_coverity
+ else
+ # Upload base package.
+ upload_item installer "$package" binary/octet-stream
+ upload_item quicklink "$package" binary/octet-stream
+ [ -f $build_dir/summary.json ] && upload_item installer $build_dir/summary.json text/plain
+
+ # Upload additional packages.
+ for package_id in $additional_packages
+ do
+ package=$(installer_$arch "$package_id")
+ if [ x"$package" != x ]
+ then
+ upload_item installer "$package" binary/octet-stream
+ upload_item quicklink "$package" binary/octet-stream
+ else
+ record_failure "Failed to find additional package for '$package_id'."
+ fi
+ done
+
+ case "$last_built_variant" in
+ Release)
+ # Upload crash reporter files
+ for symbolfile in $symbolfiles
+ do
+ upload_item symbolfile "$build_dir/$symbolfile" binary/octet-stream
+ done
+
+ # Upload the actual dependencies used
+ if [ -r "$build_dir/packages/installed-packages.xml" ]
+ then
+ upload_item installer "$build_dir/packages/installed-packages.xml" text/xml
+ fi
+
+ # Upload the llphysicsextensions_tpv package, if one was produced
+ # *TODO: Make this an upload-extension
+ if [ -r "$build_dir/llphysicsextensions_package" ]
+ then
+ llphysicsextensions_package=$(cat $build_dir/llphysicsextensions_package)
+ upload_item private_artifact "$llphysicsextensions_package" binary/octet-stream
+ else
+ echo "No llphysicsextensions_package"
+ fi
+ ;;
+ *)
+ echo "Skipping mapfile for $last_built_variant"
+ ;;
+ esac
+
+ # Run upload extensions
+ if [ -d ${build_dir}/packages/upload-extensions ]; then
+ for extension in ${build_dir}/packages/upload-extensions/*.sh; do
+ begin_section "Upload Extenstion $extension"
+ . $extension
+ end_section "Upload Extenstion $extension"
+ done
+ fi
+
+ # Upload stub installers
+ upload_stub_installers "$build_dir_stubs"
+ fi
+ end_section Upload Installer
+ else
+ echo skipping upload of installer
+ fi
+else
+ echo skipping upload of installer due to failed build.
+fi
+
+# The branch independent build.sh script invoking this script will finish processing
+$succeeded || exit 1