| |
| |
| # Set TMPDIR to a reasonable default if it isn't already set, so that mktmp(1) can be |
| # succinctly and portably used. |
| if [ "x${TMPDIR}" = "x" ] ; then |
| TMPDIR="/tmp" |
| fi |
| |
| # Record the directory from which this script was run in case |
| # we need to re-run it as part of the autoupdate. |
| ORIGINAL_WORKING_DIRECTORY="$PWD" |
| |
| # Keep track of the project root directory. |
| PROJECT_ROOT="$PWD" |
| |
| # Test for running buck daemon. |
| BUCKD_DIR="${PROJECT_ROOT}/.buckd" |
| BUCKD_LOG_FILE="${BUCKD_DIR}/buckd.log" |
| BUCKD_PID_FILE="${BUCKD_DIR}/buckd.pid" |
| BUCKD_PORT_FILE="${BUCKD_DIR}/buckd.port" |
| BUCKD_RUNNING=0 |
| kill -0 `cat "$BUCKD_PID_FILE" 2> /dev/null` &> /dev/null || BUCKD_RUNNING=1 |
| |
| # Navigate to the root of the Buck project. |
| pushd "$BUCK_BIN_DIRECTORY" > /dev/null |
| pushd .. > /dev/null |
| BUCK_DIRECTORY="$PWD" |
| |
| # If there is a .buckversion file in the project root, then make sure that Buck is at that version. |
| # The only way to override this is to include a .nobuckcheck file in the project root. |
| if [ -e "${PROJECT_ROOT}/.nobuckcheck" ]; then |
| echo >&2 ":::" |
| echo >&2 "::: '.nobuckcheck' file is present. Not updating buck" |
| echo >&2 ":::" |
| elif [ -e "${PROJECT_ROOT}/.buckversion" ]; then |
| BUCK_COMMIT_HASH_AND_BRANCH=`cat ${PROJECT_ROOT}/.buckversion` |
| |
| BUCK_REQUIRED_VERSION=`echo ${BUCK_COMMIT_HASH_AND_BRANCH} | awk -F':' '{print $1}'` |
| BUCK_REQUIRED_BRANCH=`echo ${BUCK_COMMIT_HASH_AND_BRANCH} | awk -F':' '{print $2}'` |
| |
| # If the hash is in not in the user's repository, do a `git fetch`. |
| if ! git cat-file -e "$BUCK_REQUIRED_VERSION"; then |
| if [ -e "${BUCK_REQUIRED_BRANCH}" ]; then |
| git fetch --all |
| else |
| git fetch origin $BUCK_REQUIRED_BRANCH |
| fi |
| fi |
| |
| |
| BUCK_CURRENT_VERSION=`git rev-parse HEAD` |
| |
| function restartBuck() |
| { |
| # Rerun command with new version of buck. |
| cd "$ORIGINAL_WORKING_DIRECTORY" |
| "$SOURCE" "$@" |
| exit $? |
| } |
| |
| # Note that this test succeeds if you have local changes in your Buck repository that have not |
| # been committed. |
| if [ "$BUCK_REQUIRED_VERSION" != "$BUCK_CURRENT_VERSION" ]; then |
| echo "Buck is at ${BUCK_CURRENT_VERSION}," |
| echo "but should be ${BUCK_REQUIRED_VERSION}." |
| echo "Buck is updating itself." |
| echo "To disable this, add a '.nobuckcheck' file to your project root." |
| echo "In general, you should only disable this if you are developing Buck." |
| |
| # Now that the version is guaranteed to be in the user's repository, |
| # checkout that hash. |
| git checkout $BUCK_REQUIRED_VERSION |
| |
| # Now that we have updated the repository, we should rebuild Buck. |
| ant clean |
| |
| # Rerun this script after checking out the new version. |
| restartBuck $@ |
| fi |
| fi |
| |
| # Get current buck version. |
| |
| # Whether or not the repo is dirty (contains untracked files or modified |
| # tracked files). |
| BUCK_REPOSITORY_DIRTY=0 |
| |
| # Whether or not the repo contains changes to tracked files. |
| BUCK_REPOSITORY_LOCAL_CHANGES=0 |
| BUCK_CURRENT_VERSION="N/A" |
| BUCK_VERSION_TIMESTAMP=-1 |
| if [ -d ".git" ]; then |
| # Make sure buck gets passed the right version. |
| BUCK_CURRENT_VERSION=`git rev-parse HEAD` |
| BUCK_VERSION_TIMESTAMP=`git log --pretty=format:%ct -1 HEAD` |
| |
| # if the output of "git status -s" is non-empty. |
| if [ -n "`git status -s`" ]; then |
| BUCK_REPOSITORY_DIRTY=1 |
| fi |
| # If the output of "git ls-files -m" is non-empty, buck has local changes to |
| # tracked files that can't be cleaned automatically with `git clean -fd`. |
| if [ -n "`git ls-files -m`" ]; then |
| BUCK_REPOSITORY_LOCAL_CHANGES=1 |
| fi |
| fi |
| |
| # Compute a version string that uniquely incorporates the current git revision |
| # and local modifications (if any) to managed files that are relevant to |
| # building/running the buck application. |
| if [ "${BUCK_REPOSITORY_DIRTY}" = "0" ] ; then |
| BUCK_VERSION_UID="${BUCK_CURRENT_VERSION}" |
| else |
| if [ -d ".git" ] ; then |
| function computeLocalHash() |
| { |
| # Get git tree for current revision. |
| git_tree_in=`git log -n1 --pretty=format:%T HEAD` |
| |
| # Generate git tree as it would exist if current local changes were |
| # committed. |
| git_tree_out=$( |
| git_index_file=`mktemp ${TMPDIR}/buck-git-index.XXXXXX` || exit 1 |
| export GIT_INDEX_FILE="${git_index_file}" |
| git read-tree ${git_tree_in} || exit 1 |
| git update-index --add --remove `git diff --name-only HEAD` || exit 1 |
| git write-tree || exit 1 |
| rm -f "${git_index_file}" |
| ) |
| |
| # Compute UID based on relevant portions of the output git tree. |
| buck_version_uid_input=`mktemp "${TMPDIR}/buck-version-uid-input.XXXXXX"` || exit 1 |
| git ls-tree --full-tree ${git_tree_out} > ${buck_version_uid_input} || exit 1 |
| BUCK_VERSION_UID=`git hash-object ${buck_version_uid_input}` || exit 1 |
| rm -f "${buck_version_uid_input}" |
| } |
| if [ -e "${PROJECT_ROOT}/.nobuckcheck" ] || [ ! -e "${PROJECT_ROOT}/.buckversion" ]; then |
| computeLocalHash |
| else |
| if [ "${BUCK_REPOSITORY_LOCAL_CHANGES}" = "1" ] ; then |
| # If the buck repo is dirty but has local changes, warn the user, but we |
| # can't clean the repo for them. |
| echo ":: Your buck directory has local modifications, and therefore" |
| echo ":: builds will not be able to use a distributed cache." |
| echo ":: The following files must be either reverted or committed:" |
| git ls-files -m |
| BUCK_CLEAN_REPO_IF_DIRTY=N |
| fi |
| if [ -z "$BUCK_CLEAN_REPO_IF_DIRTY" ]; then |
| echo ":: Your local buck directory is dirty, and therefore builds will" |
| echo ":: not be able to use a distributed cache." |
| echo ":: Do you want to clean your buck directory? [y/N]" |
| read BUCK_CLEAN_REPO_IF_DIRTY |
| fi |
| if [[ "$(echo $BUCK_CLEAN_REPO_IF_DIRTY | tr '[:lower:]' '[:upper:]')" =~ ^Y.* ]]; then |
| git clean -fd |
| # Restart buck just in case the files we just deleted in any way |
| # affected this file. |
| restartBuck $@ |
| else |
| computeLocalHash |
| fi |
| fi |
| else |
| BUCK_VERSION_UID="N/A" |
| fi |
| fi |
| |
| # Make sure that Buck has been built. |
| if [ ! -e "build/buck.jar" ]; then |
| |
| if [ $BUCKD_RUNNING -eq 0 ] && [ -e "$BUCKD_PID_FILE" ]; then |
| echo "Killing buckd before building buck" |
| kill `cat "$BUCKD_PID_FILE"` || true |
| fi |
| |
| echo "No sign of buck.jar -- building Buck!" |
| # Note the jar file will not be used, |
| # but serves to represent whether everything has been built. |
| ant clean && ant |
| |
| if [ $BUCKD_RUNNING -eq 0 ] && [ -e "${BUCK_BIN_DIRECTORY}/buckd" ]; then |
| echo "Restarting buckd after building buck" |
| "${BUCK_BIN_DIRECTORY}/buckd" |
| fi |
| fi |
| |
| # Pop back to the original directory. |
| popd > /dev/null |
| popd > /dev/null |
| |
| # Path to Python interpreter will be tried to find. If not found, Jython will be used. |
| PYTHON_INTERP_FALLBACK=${BUCK_DIRECTORY}/bin/jython |
| |
| # Note that if $RELATIVE_PATH_TO_BUCK_PY changes, then the default value of |
| # com.facebook.buck.json.BuildFileToJsonParser#PATH_TO_BUCK_PY |
| # needs to be updated. |
| RELATIVE_PATH_TO_BUCK_PY=src/com/facebook/buck/parser/buck.py |
| PATH_TO_BUCK_PY="${BUCK_DIRECTORY}/$RELATIVE_PATH_TO_BUCK_PY" |
| |
| BUCK_PATH_TO_CUSTOM_DX="" |
| |
| # Run Buck "unpacked": specifying its individual classpath elements rather than from a |
| # single monolithic JAR file that includes all of its dependencies. This speeds up Buck development |
| # because `ant compile` takes much less time to rebuild Buck than `ant jar` does. |
| BUCK_JAVA_CLASSPATH="${BUCK_DIRECTORY}/src:\ |
| ${BUCK_DIRECTORY}/build/classes:\ |
| ${BUCK_DIRECTORY}/lib/args4j.jar:\ |
| ${BUCK_DIRECTORY}/lib/ddmlib-r21.jar:\ |
| ${BUCK_DIRECTORY}/lib/guava-15.0.jar:\ |
| ${BUCK_DIRECTORY}/lib/ini4j-0.5.2.jar:\ |
| ${BUCK_DIRECTORY}/lib/jackson-annotations-2.0.5.jar:\ |
| ${BUCK_DIRECTORY}/lib/jackson-core-2.0.5.jar:\ |
| ${BUCK_DIRECTORY}/lib/jackson-databind-2.0.5.jar:\ |
| ${BUCK_DIRECTORY}/lib/jsr305.jar:\ |
| ${BUCK_DIRECTORY}/lib/nailgun-server-0.9.2-SNAPSHOT.jar:\ |
| ${BUCK_DIRECTORY}/lib/sdklib.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/asm/asm-debug-all-4.1.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/astyanax-cassandra-1.56.38.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/astyanax-core-1.56.38.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/astyanax-thrift-1.56.38.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/cassandra-1.2.3.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/cassandra-thrift-1.2.3.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/commons-cli-1.1.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/commons-codec-1.2.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/commons-lang-2.6.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/high-scale-lib-1.1.2.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/joda-time-2.2.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/libthrift-0.7.0.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/log4j-1.2.16.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/slf4j-api-1.7.2.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/astyanax/slf4j-log4j12-1.7.2.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/gson/gson-2.2.4.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/jetty/jetty-all-9.0.4.v20130625.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/jetty/servlet-api.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/neo4j/geronimo-jta_1.1_spec-1.1.1.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/neo4j/lucene-core-3.6.2.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/neo4j/neo4j-kernel-2.0.0-M05.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/neo4j/neo4j-lucene-index-2.0.0-M05.jar:\ |
| ${BUCK_DIRECTORY}/third-party/java/xz-java-1.3/xz-1.3.jar:\ |
| " |
| |
| BUCK_JAVA_ARGS="\ |
| -XX:MaxPermSize=256m \ |
| -Xmx1000m \ |
| -Djava.awt.headless=true \ |
| -Dbuck.testrunner_classes=${BUCK_DIRECTORY}/build/testrunner/classes \ |
| -Dbuck.abi_processor_classes=${BUCK_DIRECTORY}/build/abi_processor/classes \ |
| -Dbuck.path_to_emma_jar=${BUCK_DIRECTORY}/third-party/java/emma-2.0.5312/out/emma-2.0.5312.jar \ |
| -Dbuck.test_util_no_tests_dir=true \ |
| -Dbuck.path_to_python_interp=${PYTHON_INTERP_FALLBACK} \ |
| -Dbuck.path_to_buck_py=${PATH_TO_BUCK_PY} \ |
| -Dbuck.path_to_intellij_py=${BUCK_DIRECTORY}/src/com/facebook/buck/command/intellij.py \ |
| -Dbuck.git_commit=${BUCK_CURRENT_VERSION} \ |
| -Dbuck.git_commit_timestamp=${BUCK_VERSION_TIMESTAMP} \ |
| -Dbuck.git_dirty=${BUCK_REPOSITORY_DIRTY} \ |
| -Dbuck.quickstart_origin_dir=${BUCK_DIRECTORY}/src/com/facebook/buck/cli/quickstart/android \ |
| -Dbuck.version_uid=${BUCK_VERSION_UID} \ |
| -Dbuck.dx=${BUCK_PATH_TO_CUSTOM_DX} \ |
| -Dbuck.buckd_dir=${BUCKD_DIR} \ |
| -Dlog4j.configuration=file:${BUCK_DIRECTORY}/config/log4j.properties \ |
| ${BUCK_EXTRA_JAVA_ARGS}" |
| |
| # To debug BUCK, set BUCK_DEBUG_MODE in your environment to anything non-empty, |
| # then connect to port 8888. |
| if [ "$BUCK_DEBUG_MODE" ]; then |
| arg="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8888" |
| BUCK_JAVA_ARGS="$BUCK_JAVA_ARGS $arg" |
| fi |