| #!/bin/sh |
| # |
| # A small script used to update the content of libcxx/ to a newer |
| # version of libc++. |
| # |
| |
| PROGDIR=$(dirname "$0") |
| PROGNAME=$(basename "$0") |
| |
| # Assume this script is under tools/ |
| NDK_LIBCXX_DIR=$(cd "$PROGDIR"/.. && pwd) |
| |
| # Sanitize environment. |
| set -e |
| export LANG=C |
| export LC_ALL=C |
| |
| # Helper functions |
| VERBOSE=1 |
| |
| run () { |
| if [ "$VERBOSE" -gt 1 ]; then |
| echo "COMMAND: $@" |
| fi |
| case $VERBOSE in |
| 0|1) |
| "$@" >/dev/null 2>&1 |
| ;; |
| 2) |
| "$@" >/dev/null |
| ;; |
| *) |
| "$@" |
| ;; |
| esac |
| } |
| |
| log () { |
| if [ "$VERBOSE" -gt 1 ]; then |
| printf "%s\n" "$@" |
| fi |
| } |
| |
| get_config_field () { |
| cat "$NDK_LIBCXX_DIR"/upstream.config | awk '$1 == "'$1':" { print $2; }' |
| } |
| |
| # Process command line. |
| |
| DO_HELP= |
| NO_CLEANUP= |
| |
| for opt; do |
| case $opt in |
| --verbose) |
| VERBOSE=$(( $VERBOSE + 1 )) |
| ;; |
| --help) |
| DO_HELP=true |
| ;; |
| --no-cleanup) |
| NO_CLEANUP=true |
| ;; |
| -*) |
| echo "ERROR: Unknown option '$opt'. See --help." |
| exit 1 |
| ;; |
| esac |
| done |
| |
| if [ "$DO_HELP" ]; then |
| echo "Usage: $PROGNAME [options]" |
| echo "" |
| echo "This script is used to update the LLVM libc++ sources to a" |
| echo "more recent version." |
| echo "" |
| echo "Valid options:" |
| echo " --help Print this message." |
| echo " --verbose Increase verbosity." |
| echo " --no-cleanup Don't remove build directory on exit." |
| echo "" |
| exit 0 |
| fi |
| |
| # Create build directory. |
| BUILD_DIR=/tmp/ndk-$USER/llvm-libc++/build |
| mkdir -p "$BUILD_DIR" && rm -rf "$BUILD_DIR"/* |
| |
| # Ensure it is cleared when this script exits. |
| run_on_exit () { |
| if [ -z "$NO_CLEANUP" ]; then |
| # Remove temporary build directory. |
| rm -rf "$BUILD_DIR" |
| fi |
| } |
| trap "run_on_exit \$?" EXIT QUIT HUP TERM INT |
| |
| # Get upstream SVN and revision number. |
| SVN_URL=$(get_config_field svn) |
| if [ -z "$SVN_URL" ]; then |
| echo "ERROR: Can't find SVN upstream in upstream.config!" |
| exit 1 |
| fi |
| |
| REVISION=$(get_config_field revision) |
| if [ -z "$REVISION" ]; then |
| echo "ERROR: Can't find upstream revision in upstream.config!" |
| exit 1 |
| fi |
| |
| run cd $BUILD_DIR && |
| echo "Checking out $SVN_URL@$REVISION" |
| run svn co $SVN_URL@$REVISION libcxx > /dev/null |
| run cd libcxx |
| |
| echo "Creating git repository and 'master' branch." |
| run git init |
| echo \ |
| ".gitignore |
| .svn/ |
| " > .gitignore |
| |
| run git add . |
| run git add -f .gitignore |
| run git commit -m "upstream @$REVISION" |
| |
| echo "Create 'ndk' branch and apply patches.android/*" |
| run git branch ndk master |
| run git checkout ndk |
| if [ -d "$NDK_LIBCXX_DIR/patches.android" ]; then |
| ( |
| set +e; |
| run git am "$NDK_LIBCXX_DIR"/patches.android/* |
| if [ "$?" != 0 ]; then |
| echo "A problem occured while applying the patches!!" |
| exit 1 |
| fi |
| ) |
| fi |
| |
| echo "Updating to newer upstream revision" |
| run git checkout master |
| run git tag revision-$REVISION HEAD |
| |
| run svn update |
| NEW_REVISION=$(svn info | awk '$1 == "Revision:" { print $2; }') |
| echo "Found new revision: $NEW_REVISION (was $REVISION)" |
| |
| ADDED_FILES=$(git ls-files -o --exclude-standard) |
| MODIFIED_FILES=$(git ls-files -m) |
| REMOVED_FILES=$(git ls-files -d) |
| log "ADDED_FILES='$ADDED_FILES'" |
| log "MODIFIED_FILES='$MODIFIED_FILES'" |
| log "REMOVED_FILES='$REMOVED_FILES'" |
| CHANGED= |
| if [ -n "$ADDED_FILES" ]; then |
| run git add $ADDED_FILES |
| CHANGED=true |
| fi |
| if [ -n "$MODIFIED_FILES" ]; then |
| run git add $MODIFIED_FILES |
| CHANGED=true |
| fi |
| if [ -n "$REMOVED_FILES" ]; then |
| run git rm -f $REMOVED_FILES |
| CHANGED=true |
| fi |
| |
| if [ -z "$CHANGED" ]; then |
| echo "No changes detected. Exiting." |
| exit 0 |
| fi |
| |
| ADDED_COUNT=$(echo "$ADDED_FILES" | wc -l) |
| MODIFIED_COUNT=$(echo "$MODIFIED_FILES" | wc -l) |
| REMOVED_COUNT=$(echo "$REMOVED_FILES" | wc -l) |
| echo "Commiting changes ($ADDED_COUNT new, $MODIFIED_COUNT changed, $REMOVED_COUNT deleted)" |
| run git commit -m "upstream @$NEW_REVISION" |
| run git tag revision-$NEW_REVISION |
| |
| echo "Updating NDK branch." |
| run git checkout ndk |
| run git tag android-0 HEAD |
| run git rebase revision-$NEW_REVISION |
| |
| echo "Re-creating new Android patches." |
| run git format-patch -k -o "$BUILD_DIR"/patches.android revision-$NEW_REVISION |
| run git format-patch -k -o "$BUILD_DIR"/patches.libcxx android-0 |
| |
| echo "Updating local sources" |
| run cd "$NDK_LIBCXX_DIR"/libcxx |
| for PATCH in "$BUILD_DIR"/patches.libcxx/*.patch; do |
| ( |
| set +e |
| run patch -p1 < "$PATCH" |
| if [ $? != 0 ]; then |
| echo "ERROR: Can't apply $PATCH properly!" |
| exit 1 |
| fi |
| ) |
| done |
| |
| echo "Updating local patches" |
| run cd "$NDK_LIBCXX_DIR" |
| run git rm -f patches.android/* |
| run cp "$BUILD_DIR"/patches.android/* patches.android/ |
| run git add patches.android/* |
| |
| echo "Updating upstream.config" |
| sed -i -e "s|revision: $REVISION|revision: $NEW_REVISION|" "$NDK_LIBCXX_DIR"/upstream.config |
| git add "$NDK_LIBCXX_DIR"/upstream.config |
| |
| echo "Done updating to $NEW_REVISION." |