blob: 1b9570694c1560c37199cf5839b9517ad4685e66 [file] [log] [blame]
#!/usr/bin/env bash
set -e
##
## Copyright (C) 2016 The Android Open Source Project
##
## Licensed under the Apache License, Version 2.0 (the "License");
## you may not use this file except in compliance with the License.
## You may obtain a copy of the License at
##
## http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.
##
##
## Build and stage the source.android.com website.
##
## Usage:
## From the repo's root directory (croot):
## $ ./docs/source.android.com/scripts/build2stage.sh [options] server-number
##
## To build/stage from anywhere, add an alias or scripts/ to PATH.
##
## Examples:
## Build and stage on staging instance 13:
## $ build2stage.sh 13
## Build and generate reference docs, stage on instance 13:
## $ build2stage.sh -r 13
## Build only (outputs to out/target/common/docs/online-sac):
## $ build2stage.sh -b
## Stage only (using existing build):
## $ build2stage.sh -s 13
##
## The script uses some environmental variables that can be set locally or
## in /etc/profile.d/build2stage-conf.sh, or passed via the command-line:
##
## Change output directory used for generated files:
## $ OUT_DIR=/path/to/dir build2stage.sh -b
## Change build target:
## $ BUILD_TARGET=aosp_x86_64 build2stage.sh -b
## Location of staging tool and output directory:
## $ AE_STAGING=/path/to/ae_staging OUT_DIR=/path/to/dir build2stage 13
##
## This script attempts to determine if called from within a gitc client and
## set the output directory accordingly. If it's not building correctly, you can
## try setting the REPO_ROOT and OUT_DIR variables in your environment.
usage() {
echo "Usage: $(basename $0) [options] server-number"
echo "Options:"
echo " -r Generate reference docs (HAL, TradeFed)"
echo " -b Build docs without staging"
echo " -s Stage only using an existing build"
echo " -h Print this help and exit"
}
# Arguments required
if [ $# -eq 0 ]; then
usage
exit 1
fi
##
## VARS
##
# Sourced for env vars
: ${AE_STAGING_CONF:="/etc/profile.d/build2stage-conf.sh"}
# Retrieve App Engine staging config 'AE_STAGING' (and other vars if there)
if [ -e "$AE_STAGING_CONF" ]; then
source "$AE_STAGING_CONF"
fi
LOG_PREFIX="[$(basename $0)]"
# Lunch build config
: ${BUILD_TARGET:="aosp_arm-eng"}
# gitc clients should output to a different directory.
# Test if using gitc by checking user's current dir or this script's location
GITC_CLIENT_PREFIX="/gitc/manifest-rw"
GITC_CONF="/gitc/.config"
if [ -f "$GITC_CONF" ]; then
GITC_OUT_PREFIX=$(grep 'gitc_dir' "$GITC_CONF" 2>/dev/null | cut -d '=' -f2)
fi
## SET REPO ROOT
# If user is currently within a gitc client dir, use that project as repo root
if [[ -z "$REPO_ROOT" && "$(pwd -P)" == "${GITC_CLIENT_PREFIX}/"* ]]; then
gitc_client_name=$(echo "$(pwd -P)" | cut -d '/' -f4) #get 3rd dir name
REPO_ROOT="${GITC_CLIENT_PREFIX}/${gitc_client_name}"
fi
# If not set, determine repo root relative to location of this script itself
: ${REPO_ROOT:="$(cd $(dirname $0)/../../..; pwd -P)"}
## SET OUTPUT DIR
# If repo root within gitc client, set gitc output directory
if [[ -z "$OUT_DIR" && "$REPO_ROOT" == "${GITC_CLIENT_PREFIX}/"* ]]; then
gitc_client_name=$(echo "$REPO_ROOT" | cut -d '/' -f4) #get 3rd dir name
OUT_DIR="${GITC_OUT_PREFIX}/${gitc_client_name}/out"
fi
# Directory for output files
: ${OUT_DIR:="${REPO_ROOT}/out"}
# Docs output directory and where to stage from
OUT_DIR_SAC="${OUT_DIR}/target/common/docs/online-sac"
## PARSE OPTIONS
while getopts "bsrh" opt; do
case $opt in
b) BUILD_ONLY_FLAG=1;;
s) STAGE_ONLY_FLAG=1;;
r) BUILD_REF_HAL=1; BUILD_REF_TRADEFED=1;;
h | *)
usage
exit 0
;;
esac
done
##
## CHECK ARGS
##
# Get final command-line arg
for last; do true; done
STAGING_NUM="$last"
if [ -z "$BUILD_ONLY_FLAG" ]; then
# Must be a number
if ! [[ "$STAGING_NUM" =~ ^[0-9]+$ ]] ; then
echo "${LOG_PREFIX} Error: Argument for server instance must be a number" 1>&2
usage
exit 1
fi
fi
if [ -n "$STAGE_ONLY_FLAG" ] && [ ! -d "$OUT_DIR_SAC" ]; then
echo "${LOG_PREFIX} Error: Unable to stage without a build" 1>&2
exit 1
fi
# If staging, require staging config
if [ -z "$BUILD_ONLY_FLAG" ] && [ -z "$AE_STAGING" ]; then
echo "${LOG_PREFIX} Error: No value for AE_STAGING" 1>&2
echo "Set in local environment or ${AE_STAGING_CONF}" 1>&2
exit 1
fi
if [ ! -d "$REPO_ROOT" ]; then
echo "${LOG_PREFIX} Error: Repo directory doesn't exist: ${REPO_ROOT}" 1>&2
exit 1
fi
if [ ! -d "$(dirname $OUT_DIR)" ]; then
echo "${LOG_PREFIX} Error: Output root dir doesn't exist: $(dirname $OUT_DIR)" 1>&2
exit 1
fi
##
## BUILD DOCS
##
echo "${LOG_PREFIX} Using repo: ${REPO_ROOT}"
echo "${LOG_PREFIX} Output dir: ${OUT_DIR}"
if [ -n "$STAGE_ONLY_FLAG" ]; then
echo "${LOG_PREFIX} Not building"
else
cd "$REPO_ROOT"
# Delete old output
if [ -d "$OUT_DIR_SAC" ]; then
echo "${LOG_PREFIX} Removing old build: ${OUT_DIR_SAC}"
rm -rf "$OUT_DIR_SAC"*
fi
# Initialize the build environment
source build/make/envsetup.sh
# Select a target and finish setting up the environment
lunch "$BUILD_TARGET"
# Build the docs and output to: out/target/common/docs/online-sac
make online-sac-docs
# Reference dir used for tradefed
rm -rf "${OUT_DIR_SAC}/reference"
rm "${OUT_DIR_SAC}/navtree_data.js"
if [ -n "$BUILD_REF_HAL" ]; then
# HAL reference
if command -v doxygen >/dev/null 2>&1; then
#run doxygen
make setup-hal-ref #docs/source.android.com/Android.mk
#will use central js files instead
rm "${OUT_DIR_SAC}/devices/halref/jquery.js"
rm "${OUT_DIR_SAC}/devices/halref/functions_~.html"
else
echo "${LOG_PREFIX} Error: Requires doxygen to build HAL reference" 1>&2
exit 1
fi
fi
if [ -n "$BUILD_REF_TRADEFED" ]; then
# Trade Federation reference
make tradefed-docs
make setup-tradefed-ref #docs/source.android.com/Android.mk
fi
fi
##
## STAGE DOCS
##
if [ -n "$BUILD_ONLY_FLAG" ]; then
echo "${LOG_PREFIX} Not staging"
else
# Make sure there's something to stage
if [ ! -d "$OUT_DIR_SAC" ]; then
echo "${LOG_PREFIX} Error: Unable to stage without a build directory" 1>&2
exit 1
fi
## Set staging server
# Parse current value for yaml key 'application'
STAGING_SERVER=$(cat "${OUT_DIR_SAC}/app.yaml" | grep "^application:" | \
cut -d ':' -f2- | tr -d ' ')
# Remove any trailing numbers in case it's already been set
STAGING_SERVER=$(echo "$STAGING_SERVER" | sed 's/[0-9]\{1,10\}$//')
# Set new staging server
STAGING_SERVER="${STAGING_SERVER}${STAGING_NUM}"
tmpfile=$(mktemp /tmp/app.yaml.XXXX)
# Replace application key in tmp app.yaml with specified staging server
sed "s/^application:.*/application: ${STAGING_SERVER}/" \
"${OUT_DIR_SAC}/app.yaml" > "$tmpfile"
# Copy in new app.yaml content
cp "$tmpfile" "${OUT_DIR_SAC}/app.yaml"
rm "$tmpfile"
echo "${LOG_PREFIX} Configured stage for ${STAGING_SERVER}"
## Stage
##
echo "${LOG_PREFIX} Start staging ..."
# Stage to specified server
if $AE_STAGING update "$OUT_DIR_SAC"; then
echo "${LOG_PREFIX} Content now available at staging instance ${STAGING_NUM}"
else
echo "${LOG_PREFIX} Error: Unable to stage to ${STAGING_SERVER}" 1>&2
exit 1
fi
fi