blob: dc9418db66f3c7524b1d83489cc290c01dadf7c1 [file] [log] [blame]
#!/bin/bash
# ABOUT THIS SCRIPT
# This script is designed to be used by a SWT *developer*,
# to simplify daily swt rebuilds for testing and debugging of SWT native bindings.
# (It's not a build script to be used by a server in production).
#
# It uses SWT's build script ()*1) and adds extra functionality:
# - Builds SWT's JNI native code (libswt-*-xyzz.so) with debugging support enabled by default
# * Also prints number of warnigns found. (Useful to see if new warnings were introduced)
# - Cleans up binary git repository holding '.so' filse
# * This prevents the situation where when you checkout an older swt patch and
# rebuild, swt would use some newer .so's instead of the newly compiled once.
# - Copies .classpath_gtk to .classpatch
# * This is to deal with changes in .classpath_gtk
#
# [1] ~/git/eclipse.platform.swt/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/build.sh
SCRIPT_VERSION=3
# [CONFIG] Find directory where this script is being executed from.
#############################################################
# The method below works even if the script is called via symlink
# http://stackoverflow.com/questions/59895/getting-the-source-directory-of-a-bash-script-from-within
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
SCRIPT_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
cd ${SCRIPT_DIR}
# [CONFIG END] ALL FUNCTIONAL CODE SHOULD BE BELOW THIS LINE. Otherwise it'll break if you run this script form a sym-link.
# Utility functions
####################
func_echo_info () {
GREEN='\033[0;32m'
NC='\033[0m' # No Color
echo -e "${GREEN}${@}${NC}"
}
func_echo_input () {
PURPLE='\033[0;35m'
NC='\033[0m' # No Color
echo -e "${PURPLE}${@}${NC}"
}
func_echo_error () {
RED='\033[0;31m'
NC='\033[0m' # No Color
echo -e "${RED}*** ${@}${NC}"
}
func_echo_info "Starting SWT rebuild script version: $SCRIPT_VERSION"
# 0) Find SWT's project directory
###############################
func_echo_info "\n[Step 1] Looking for SWT project directory"
# Try relative path.
SWT_PROJECT_DIR=$(readlink -e "../../org.eclipse.swt") #get absolute path based on relative path.
if [ -e "${SWT_PROJECT_DIR}/.classpath_gtk" ] && cat "${SWT_PROJECT_DIR}/META-INF/MANIFEST.MF" | grep "Bundle-SymbolicName: org.eclipse.swt" ; then
func_echo_info "[Step 1] ** Found SWT project directory: $SWT_PROJECT_DIR";
else
# Try hard-coded path (in case script is moved)
HARD_CODED_PATH="${HOME}/git/eclipse.platform.swt/bundles/org.eclipse.swt"
if [ -e "${HARD_CODED_PATH}/.classpath_gtk" ] && cat "${HARD_CODED_PATH}/META-INF/MANIFEST.MF" | grep "Bundle-SymbolicName: org.eclipse.swt" ; then
func_echo_info "[Step 1] ** SWT project directory found via hard coded path"
SWT_PROJECT_DIR="$HARD_CODED_PATH";
else
func_echo_error "[Step 1] Could not find SWT project neither in: \n$SWT_PROJECT_DIR\nnor in:\n$HARD_CODED_PATH\nYou probably need to build swt project."
exit 1;
fi
fi
# 1) Fix '.classpath' for SWT project and for snippets.
#######################################################
# Sometimes .classpath_gtk is updated in commits, e.g when a class folder is added/removed.
# Because renaming .classpath is done manually, this often leads to errors about missing source folders.
# Fix: re-copy the .classpath on every lib rebuild.
func_echo_info "\n[Step 0] Copying .classpath_gtk files to .classpath in SWT project & Snippets"
cd $SWT_PROJECT_DIR
if [ -e .classpath_gtk ] && cat META-INF/MANIFEST.MF | grep "Bundle-SymbolicName: org.eclipse.swt" ; then
(set -x ; cp .classpath_gtk .classpath)
else
func_echo_error "[Step 0] I was expecting to be in:\n/git/eclipse.platform.swt/bundles/org.eclipse.swt\nBut I'm in $(pwd)"
exit 1 # failed
fi
# Navigate to snippets.
cd "../../examples/org.eclipse.swt.snippets/"
if [ -e .classpath_gtk ] && cat META-INF/MANIFEST.MF | grep "Bundle-SymbolicName: org.eclipse.swt.snippets"; then
(set -x ; cp .classpath_gtk .classpath)
else
func_echo_error "[Step 0] I was expecting to be in snippet repository: /examples/org.eclipse.swt.snippets/ , but I'm in $(pwd)"
error 1 #failed
fi
# 2) Clean up old '.so' files from binary repository
####################################################
cd "$SWT_PROJECT_DIR"
func_echo_info "\n[Step 2] Cleaning up of old '.so' lib files from binary git repository"
# Try to find output directory for 'so' files.
# 2.1 First try to git binary folder from build.sh
# 2.2 Failing that (e.g old SWT repo), try to guess.
# 2.1
if [ ! -e "${SWT_PROJECT_DIR}/bin/library/build.sh" ]; then
func_echo_error "[Step 2] Could not find 'build.sh'. You probably need to build swt project. This script fixed the classpath, so try building SWT and running this script again."
exit 1; # failed.
fi
cd "${SWT_PROJECT_DIR}/bin/library/"
# Check if build.sh is new enough to produce OUTPUT dir (older versions didn't)
if grep --quiet '\-\-print-outputdir-and-exit' build.sh ; then
# We ask build.sh where OUTPUT is, because output is platform dependent.
SO_OUTPUT_DIR="$(./build.sh --print-outputdir-and-exit | grep -i OUTPUT_DIR= | cut -f2 -d '=')" # no trailing '/'
if [ "$?" -ne 0 ]; then
func_echo_error "[Step 2] build.sh failed to provide OUTPUT directory"
exit 1; # Failure
fi
else
# 2.2 Try to guess the output directory.
SO_OUTPUT_DIR="$HOME/git/eclipse.platform.swt.binaries/bundles/org.eclipse.swt.gtk.$(uname -s | tr '[:upper:]' '[:lower:]').$(uname -i)"
fi
# Sanity check: Make sure swt binary repo exists and that it contains related MANIFEST. I look for 'SWT-Arch'
# We don't want to run 'git clean -xdf' in some unexpected directory.
if [ -e "${SO_OUTPUT_DIR}/META-INF/MANIFEST.MF" ]; then
if [ "$(cat $SO_OUTPUT_DIR/META-INF/MANIFEST.MF | grep 'SWT\-Arch' | wc -l)" = 1 ]; then
cd "$SO_OUTPUT_DIR"
func_echo_info "[Step 2] Found binary folder: $(pwd)"
else
func_echo_error "[Step 2] Found binary folder: \n$SO_OUTPUT_DIR \n but META-INF/MANIFEST.MF doesn't look like it belongs to SWT"
exit 1 # Failure
fi
else
func_echo_error "[Step 2] Could not find binary folder as indicated by build.sh:\n $SO_OUTPUT_DIR"
exit 1 # Failure
fi
# 2.2) Clean up binary repo:
func_echo_info "[Step 2] ** [1/2] Removing newly added files. (This removes old 'so' files. Prevents newer files to be loaded when you need to debug older commits):"
(set -x; git clean -xdf)
func_echo_info "[Step 2] ** 1/2] Undoing changes to existing files. (This removes 'so' files that overrode the existing so files. [same version])"
(set -x; git reset --hard)
# 3) Rebuild swt bindings. make_linux.mak should copy them to binary folder.
#########################
func_echo_info "\n[Step 3] Rebuilding SWT bindings and copying them into binary folder"
cd "$SWT_PROJECT_DIR/bin/library/"
#3.1) Check that we're in the right place
if [ ! -e build.sh ]; then
func_echo_error "[Step 3] Hmmm. I got lost somewhere. Was looking for build.sh file, which is normally in /eclipse.platform.swt/bundles/org.eclipse.swt/library/bin/. But currently I'm in $(pwd) , and I cannot find build.sh"
exit 1 # Fail
fi
#3.2) Rebuilg gtk bindings with debug support enabled by default
export SWT_LIB_DEBUG=1
temp_log_file="$(mktemp)" # Keep log so we can count warnings after.
# 'script' command logs commands and their output.
# This is used instead of output redirection to preserve make colouring output,
# while at the same time capture log for parsing.
# (Dev note: old 'build.sh' did not have '-gtk-all' paramater and 'install' was broken.
# For really old SWT builds, may need to manually copy '.so' files and manually specify GTK3)
script --quiet --return --command " ./build.sh -gtk-all install" $temp_log_file #"script" cmd preserves color coding during logging.
if [ "$?" -ne 0 ]; then # Failed
func_echo_error "[Step 3] Building native glue code failed. Exiting"
rm "$temp_log_file"
exit 1 # Failed
else # Success
WARNING_COUNT=$(cat $temp_log_file | grep warning | wc -l)
func_echo_info "[Step 3] Bindings compiled sucessfully"
func_echo_error "[Step 3] ** Warning count: $WARNING_COUNT "
rm "$temp_log_file"
fi
func_echo_info "Finished"