blob: 62751002af0c6064241daf49d39d7c6f520ea65e [file] [log] [blame]
#!/bin/bash
set -e # fail on errors
PROG_DIR=$(readlink -f $(dirname "$0"))
cd "$PROG_DIR"
DRY="echo" # default to dry mode unless -f is specified
FILTER="" # name of a specific jar to update (default: update them all)
MK_MERGE_MSG="1" # 1 to update the MERGE_MSG, empty to do not generate it
MERGE_MSG1="" # msg to generate
MERGE_MSG2="" # msg to generate
while [[ -n "$1" ]]; do
if [[ "$1" == "-f" ]]; then
DRY=""
elif [[ "$1" == "-m" ]]; then
MK_MERGE_MSG=""
elif [[ $1 =~ ^[a-z]+ ]]; then
FILTER="$FILTER ${1/.jar/} "
else
echo "Unknown argument: $1"
echo "Usage: $0 [project_to_update] [-f] [-m]"
echo " -f: force actually generating/modifying files."
echo " -m: do NOT generate a .git/MERGE_MSG"
echo " (default: updates all jars.)"
exit 1
fi
shift
done
# Define projects to build and files to copy.
function list_projects() {
add_project assetstudio
add_project common
add_project ddmlib
add_project dvlib
add_project jobb etc/jobb etc/jobb.bat
add_project layoutlib_api
add_project lint_api
add_project lint "cli/etc/lint|etc/lint" "cli/etc/lint.bat|etc/lint.bat"
add_project lint_checks
add_project manifmerger
#add_project rule_api -- TODO do this one next
add_project sdk_common
add_project sdklib
add_project sdkuilib in:tools/swt
add_project swtmenubar in:tools/swt
}
# ----
# List of targets to build, e.g. :jobb:jar
BUILD_LIST_base=""
BUILD_LIST_swt=""
# List of files to copy.
# Syntax:
# relative/dir (copy, relative to src & dest)
# src/rel/dir|dst/rel/dir (copy, with different destination name)
# @relative_script (executes script in dest/proj dir)
COPY_LIST_base=""
COPY_LIST_swt=""
function get_map() {
#$1=map name (BUILD_LIST or COPY_LIST)
#$2=map key (base or swt)
eval local V=\$$1_$2
echo $V
}
function append_map() {
#$1=map name (BUILD_LIST or COPY_LIST)
#$2=map key (base or swt)
#$3=value to append (will be space separated)
eval local V=\$$1_$2
eval $1_$2=\"$V $3\"
}
function add_project() {
# $1=project name
# $2=optional in:tools/swt repo (default: tools/base)
# $2...=optional files to copy (relative to project dir)
local proj=$1 src dst f
shift
if [[ -n "$FILTER" && "${FILTER/ $proj /}" == "$FILTER" ]]; then
echo "## Skipping project $proj"
return
fi
local repo="base"
if [[ "$1" == "in:tools/swt" ]]; then
repo="swt"
shift
fi
echo "## Updating project tools/$repo/$proj"
# Request to build the jar for that project
append_map BUILD_LIST $repo ":$proj:prebuiltJar"
# Copy all the optional files
while [[ -n "$1" ]]; do
f=$1
src="${f%%|*}" # strip part after | if any
dst="${f##*|}" # strip part before | if any
if [[ ${src:0:1} != "/" ]]; then src=$proj/$src; fi
append_map COPY_LIST $repo "$src|$dst"
shift
done
return 0
}
function build() {
echo
local repo=$1
local buildlist=$(get_map BUILD_LIST $repo)
if [[ -n "$buildlist" ]]; then
local names=${buildlist//:/}
names=${names//prebuiltJar/}
MERGE_MSG1="$MERGE_MSG1
tools/$repo: Changed $names"
local SHA1=$( cd ../../tools/$repo ; git show-ref --head --hash HEAD )
MERGE_MSG2="$MERGE_MSG2
tools/$repo @ $SHA1"
fi
# To build tools/swt, we'll need to first locally publish some
# libs from tools/base.
if [[ "$repo" == "base" && -n $(get_map BUILD_LIST swt) ]]; then
echo "## PublishLocal in tools/base (needed for tools/swt)"
buildlist="$buildlist publishLocal"
fi
if [[ -z "$buildlist" ]]; then
echo "## WARNING: nothing to build in tools/$repo."
return 1
else
echo "## Building tools/$repo: $buildlist"
( D="$PWD" ; cd ../../tools/$repo ; $DRY ./gradlew -PprebuiltPath="$D" $buildlist )
return 0
fi
}
function copy_files() {
local repo=$1 src dst dstdir
echo
local copylist=$(get_map COPY_LIST $repo)
if [[ -z "$copylist" ]]; then
echo "## WARNING: nothing to copy in tools/$repo."
else
for f in $copylist; do
if [[ "${f/@//}" == "$f" ]]; then
src="${f%%|*}" # strip part after | if any
dst="${f##*|}" # strip part before | if any
if [[ ${src:0:1} != "/" ]]; then src=../../tools/$repo/$src; fi
dstdir=$(dirname $dst)
if [[ ! -d $dstdir ]]; then $DRY mkdir -p $dstdir; fi
$DRY cp -v $src $dst
else
# syntax is proj/@script_name
d="${f%%@*}" # string part after @, that's the proj dir name
f="${f##*@}" # strip part before @, script name is what's left.
echo "## Execute $d => $f"
( cd "$d" && pwd && $DRY $f )
fi
done
fi
}
function merge_msg() {
local dst=.git/MERGE_MSG
if [[ -n $DRY ]]; then
echo "The following would be output to $dst (use -m to prevent this):"
dst=/dev/stdout
fi
cat >> $dst <<EOMSG
Update SDK prebuilts.
$MERGE_MSG1
Origin:$MERGE_MSG2
EOMSG
}
list_projects
for r in base swt; do
if build $r; then
copy_files $r
fi
done
if [[ $MK_MERGE_MSG ]]; then merge_msg; fi
if [[ -n $DRY ]]; then
echo
echo "## WARNING: DRY MODE. Run with -f to actually copy files."
fi