blob: 403fcd275b661164ff45e488fa2b297f586717c1 [file]
#!/bin/bash
RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$USER}/gaudi"
CONFIG_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/gaudi.config"
CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/gaudi"
MAVEN_REPOSITORY="https://repo1.maven.org/maven2"
if test -f "$CONFIG_FILE"; then
. "$CONFIG_FILE"
fi
BUILD_DIR=build
FINGERPRINT_FILE="$BUILD_DIR/fingerprint"
SOURCES_DIR="src"
RESOURCES_DIR="resources"
COMPILE_ONLY_RESOURCES_DIR="compile-only-resources"
RUNTIME_ONLY_RESOURCES_DIR="run-only-resources"
CLASSES_DIR="$BUILD_DIR/classes"
GENERATED_DIR="$BUILD_DIR/generated-sources/javac"
DEPENDENCIES_FILE="$BUILD_DIR/dependencies.lock"
if test -f build-info.sh; then
. ./build-info.sh
fi
SELF="$0"
case "$1" in
init)
NAME="$2"
if test -z "$ROOT_PACKAGE_NAME"; then
echo "Specify ROOT_PACKAGE_NAME in $CONFIG_FILE file" >&2
exit 2
fi
PACKAGE_NAME="$ROOT_PACKAGE_NAME.$(echo "$NAME" | sed 's/[._-]//g')"
mkdir $NAME
mkdir $NAME/resources
PACKAGE_DIR="$NAME/src/$(echo "$PACKAGE_NAME" | sed 's%\.%/%g')"
mkdir -p "$PACKAGE_DIR"
(
echo "package $PACKAGE_NAME;"
echo
echo "public class Main {"
echo " public static void main(String[] args) {"
echo ' System.out.println("Hello, World");'
echo " }"
echo "}"
) > "$PACKAGE_DIR/Main.java"
echo "MAIN_CLASS=$PACKAGE_NAME.Main" > $NAME/build-info.sh
;;
resolve)
echo "Manual resolution is required: create $DEPENDENCIES_FILE file manually"
echo "dependencies.lock format is as follows:"
echo
echo ARTIFACT1_NAME ARTIFACT1_VERSION
echo ARTIFACT2_NAME ARTIFACT2_VERSION
echo ...
echo ARTIFACT_N_NAME ARTIFACT_N_VERSION
echo
echo "For example junit launcher can be specified like:"
echo
echo org.junit.platform.junit-platform-console-standalone 1.0.0
;;
download)
URL="$2"
FILE="$3"
echo "$(date '+%Y-%m-%dT%H:%M:%S') Downloading $URL ..." >&2
curl -fs "$URL" > "$FILE.part"
if test "$?" -eq 0; then
mv "$FILE.part" "$FILE"
echo "$(date '+%Y-%m-%dT%H:%M:%S') Downloading $URL ... done." >&2
exit 0
else
echo "Error downloading: $URL" >&2
echo "$(date '+%Y-%m-%dT%H:%M:%S') Downloading $URL ... error." >&2
exit 2
fi
;;
artifact-versions)
ARTIFACT="$2"
ARTIFACT_AS_PATH="$(echo "$ARTIFACT" | sed 's%\.%/%g')"
TEMPFILE="$(mktemp --suffix=.xml)"
curl -s "$MAVEN_REPOSITORY/$ARTIFACT_AS_PATH/maven-metadata.xml" > "$TEMPFILE"
echo "cat metadata/versioning/versions/version/text()" \
| xmllint -shell "$TEMPFILE" 2>/dev/null \
| sed '/^ -------$/d;/^\/ > -------$/d;/^\/ > $/d'
rm "$TEMPFILE"
;;
artifact-file)
ARTIFACT="$2"
VERSION="$3"
mkdir -p "$CACHE_DIR"
ARTIFACT_AS_PATH="$(echo "$ARTIFACT" | sed 's%\.%/%g')"
ARTIFACT_BASE_NAME=$(basename "$ARTIFACT_AS_PATH")
ARTIFACT_RELATIVE_PATH="$ARTIFACT_AS_PATH/$VERSION/$ARTIFACT_BASE_NAME-$VERSION.jar"
ARTIFACT_FILE="$CACHE_DIR/$ARTIFACT_RELATIVE_PATH"
if test -f "$ARTIFACT_FILE"; then
echo "$ARTIFACT_FILE"
else
URL="$MAVEN_REPOSITORY/$ARTIFACT_RELATIVE_PATH"
mkdir -p "$(dirname "$ARTIFACT_FILE")"
mkdir -p "$RUNTIME_DIR"
flock "$RUNTIME_DIR/lock" "$SELF" download "$URL" "$ARTIFACT_FILE" && echo "$ARTIFACT_FILE"
fi
;;
classpath)
if ! test -f $DEPENDENCIES_FILE; then
echo "WARNING: Classpath is empty: Does not exist: $DEPENDENCIES_FILE" >&2
exit 0
else
cat "$DEPENDENCIES_FILE" | (
CLASSPATH=""
while read ARTIFACT VERSION; do
ARTIFACT_FILE="$($SELF artifact-file $ARTIFACT $VERSION)"
if ! test "$?" -eq 0; then
exit 2
fi
if test -n "$CLASSPATH"; then
CLASSPATH="$CLASSPATH:$ARTIFACT_FILE"
else
CLASSPATH="$ARTIFACT_FILE"
fi
done
echo "$CLASSPATH"
)
fi
;;
compile-classpath)
CLASSPATH="$("$SELF" classpath)"
RESULT="$?"
if ! test "$RESULT" -eq 0; then
exit "$RESULT"
else
if test -d "$COMPILE_ONLY_RESOURCES_DIR"; then
if test -n "$CLASSPATH"; then
CLASSPATH="$COMPILE_ONLY_RESOURCES_DIR:$CLASSPATH"
else
CLASSPATH="$COMPILE_ONLY_RESOURCES_DIR"
fi
fi
echo "$CLASSPATH"
fi
;;
compile)
CLASSPATH="$("$SELF" compile-classpath)"
RESULT="$?"
if ! test "$RESULT" -eq 0; then
exit "$RESULT"
else
if ! test -d "$SOURCES_DIR"; then
echo "Sources directory does not exist: $SOURCES_DIR" >&2
exit 2
fi
echo "======================================================================================"
echo " COMPILING "
echo "======================================================================================"
echo
SOURCES="$(find "$SOURCES_DIR" -type f -name '*.java' | sort)"
RESOURCES=""
if test -d "$RESOURCES_DIR"; then
RESOURCES="$(find "$RESOURCES_DIR" -type f | sort)"
fi
for D1 in "$RESOURCES_DIR" "$RUN_ONLY_RESOURCES_DIR" "$COMPILE_ONLY_RESOURCES_DIR"; do
for D2 in "$RESOURCES_DIR" "$RUN_ONLY_RESOURCES_DIR" "$COMPILE_ONLY_RESOURCES_DIR"; do
if test "$D1" '!=' "$D2" && test -d "$D1" && test -d "$D2"; then
LIST1=$(mktemp)
LIST2=$(mktemp)
BEFORE_EXIT=(rm "$LIST1" "$LIST2")
find "$D1" -type f -printf '%P\n' | sort > "$LIST1"
find "$D2" -type f -printf '%P\n' | sort > "$LIST2"
if test "$(join "$LIST1" "$LIST2" | wc -l)" -gt 0; then
echo "ERROR: You have same entries in $RESOURCES_DIR and $COMPILE_ONLY_RESOURCES_DIR." >&2
echo " Every resource should be present in one and only one directory" >&2
echo >&2
join "$LIST1" "$LIST2" | sed 's/^/ /g'
"${BEFORE_EXIT[@]}"
exit 2
fi
"${BEFORE_EXIT[@]}"
fi
done
done
for D in "$RESOURCES_DIR" "$COMPILE_ONLY_RESOURCES_DIR"; do
ANNOTATION_PROCESSOR_DISCOVERY_FILE="$META-INF/services/javax.annotation.processing.Processor"
if test -f "$D/$ANNOTATION_PROCESSOR_DISCOVERY_FILE"; then
echo "ERROR: compilation is impossible with annotation processors service discovery file: $D/$ANNOTATION_PROCESSOR_DISCOVERY_FILE" >&2
echo " Move it to run time only resources directory for compilation to succeed: $RUN_ONLY_RESOURCES_DIR/$ANNOTATION_PROCESSOR_DISCOVERY_FILE" >&2
exit 2
fi
done
FINGERPRINT="$(sha1sum $SOURCES $RESOURCES | sha1sum | awk '{print $1}')"
if test -f "$FINGERPRINT_FILE"; then
OLD_FINGERPRINT="$(cat "$FINGERPRINT_FILE")"
if test "$FINGERPRINT" '=' "$OLD_FINGERPRINT"; then
echo "Up to date!"
exit 0
fi
rm "$FINGERPRINT_FILE"
fi
rm -rf "$CLASSES_DIR"
rm -rf "$GENERATED_DIR"
mkdir -p "$CLASSES_DIR"
mkdir -p "$GENERATED_DIR"
if test -d "$RESOURCES_DIR"; then
cp -r "$RESOURCES_DIR"/* "$CLASSES_DIR"
fi
javac \
-cp "$CLASSPATH" \
-sourcepath '' \
-encoding UTF-8 \
-source 8 \
-target 8 \
-Werror \
-Xlint:all \
-d "$CLASSES_DIR" \
-s "$GENERATED_DIR" \
$SOURCES
RESULT="$?"
if test -d "$RUN_ONLY_RESOURCES_DIR"; then
cp -r "$RUN_ONLY_RESOURCES_DIR"/* "$CLASSES_DIR"
fi
echo "$FINGERPRINT" > "$FINGERPRINT_FILE"
echo
echo
echo
exit "$RESULT"
fi
;;
run-classpath)
CLASSPATH="$("$SELF" classpath)"
RESULT="$?"
if ! test "$RESULT" -eq 0; then
exit "$RESULT"
else
if test -n "$CLASSPATH"; then
CLASSPATH="$CLASSES_DIR:$CLASSPATH"
else
CLASSPATH="$CLASSES_DIR"
fi
echo "$CLASSPATH"
fi
;;
run)
if test -z "$MAIN_CLASS"; then
echo MAIN_CLASS is not specified. Please specify main class in build-info.sh >&2
exit 2
else
$SELF compile && (
CLASSPATH="$("$SELF" run-classpath)"
RESULT="$?"
if ! test "$RESULT" -eq 0; then
exit "$RESULT"
else
echo "======================================================================================"
echo " RUNNING "
echo "======================================================================================"
echo
java -cp "$CLASSPATH" "$MAIN_CLASS"
RESULT="$?"
echo
echo
echo
exit "$RESULT"
fi
)
fi
;;
esac