mirror of
https://github.com/nasa/fpp.git
synced 2025-12-11 03:05:32 -06:00
161 lines
3.4 KiB
Bash
Executable File
161 lines
3.4 KiB
Bash
Executable File
#!/bin/sh -e
|
|
|
|
# ----------------------------------------------------------------------
|
|
# FPP release builder
|
|
# ----------------------------------------------------------------------
|
|
# To use this script, you must first
|
|
#
|
|
# 1. Install GraalVM and native-image.
|
|
#
|
|
# 2. Set the environment variable GRAALVM_JAVA_HOME.
|
|
#
|
|
# 3. To pass flags to native-image, set the environment variable
|
|
# FPP_NATIVE_IMAGE_FLAGS.
|
|
#
|
|
# See README.adoc.
|
|
# ----------------------------------------------------------------------
|
|
|
|
# Print and evaluate a command
|
|
evalp()
|
|
{
|
|
echo "$@"
|
|
$@
|
|
}
|
|
|
|
# Get tool names from a directory
|
|
get_tool_names()
|
|
{
|
|
prefix="fpp-"
|
|
dir=$1
|
|
for file in $dir/$prefix*
|
|
do
|
|
base=`basename $file`
|
|
result="${base#$prefix}"
|
|
echo $result
|
|
done
|
|
}
|
|
|
|
# Print a phase of the process
|
|
print_phase()
|
|
{
|
|
echo "----------------------------------------------------------------------"
|
|
echo $1
|
|
echo "----------------------------------------------------------------------"
|
|
}
|
|
|
|
# Check that GRAALVM_JAVA_HOME is set
|
|
if test -z "$GRAALVM_JAVA_HOME"
|
|
then
|
|
echo "[ERROR] Environment variable GRAALVM_JAVA_HOME is not set" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
# Run in the directory where this script is located
|
|
cd `dirname $0`
|
|
|
|
# Set local variables
|
|
native_bin="native-fpp-`uname`-`uname -m`"
|
|
native_image="$GRAALVM_JAVA_HOME/bin/native-image"
|
|
meta_inf_dir="lib/src/main/resources/META-INF/native-image"
|
|
release_tgz="$native_bin.tar.gz"
|
|
# Use gtar if it's available
|
|
# The default tar has issues on Mac OS on GitHub
|
|
if which gtar
|
|
then
|
|
tar=`which gtar`
|
|
else
|
|
tar=tar
|
|
fi
|
|
|
|
# Make directories
|
|
mkdir -p "$meta_inf_dir"
|
|
mkdir -p "$native_bin"
|
|
|
|
print_phase "Version information"
|
|
|
|
# Print version information
|
|
echo "C compiler version"
|
|
cc --version
|
|
echo "Native Image Version"
|
|
$native_image --version
|
|
|
|
print_phase "Installing JVM tools in bin"
|
|
|
|
# Install jar files in bin
|
|
./install
|
|
|
|
print_phase "Constructing binary tools in $native_bin"
|
|
|
|
# Get the tool names from bin
|
|
tool_names=`get_tool_names bin`
|
|
|
|
jar_file="bin/fpp.jar"
|
|
out_file="$native_bin/fpp"
|
|
echo "Building fpp"
|
|
evalp "$native_image" $FPP_NATIVE_IMAGE_FLAGS \
|
|
--no-fallback --install-exit-handlers \
|
|
-jar "$jar_file" "$out_file"
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "[ERROR] Failed to build $out_file"
|
|
exit 1
|
|
fi
|
|
sync; sync; sync;
|
|
if ! $out_file --help 1>/dev/null
|
|
then
|
|
echo "[ERROR] $out_file not executable"
|
|
exit 1
|
|
fi
|
|
|
|
# Use GraalVM to convert the jar files to native binaries
|
|
for tool in $tool_names
|
|
do
|
|
echo '#!/bin/sh
|
|
"`dirname $0`/fpp" '$tool' "$@"' > $native_bin/fpp-$tool
|
|
chmod +x $native_bin/fpp-$tool
|
|
done
|
|
sync; sync; sync;
|
|
|
|
# Clean up the native directory
|
|
rm -f "$native_bin"/*.txt
|
|
|
|
# Install the native binaries
|
|
evalp rm -r "bin"
|
|
evalp cp -r "$native_bin" "bin"
|
|
sync; sync; sync;
|
|
|
|
print_phase "Testing the binary tools"
|
|
|
|
# Test the native binaries
|
|
./test
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "[ERROR] Native unit tests failed"
|
|
exit 1
|
|
fi
|
|
|
|
print_phase "Constructing the release archive $release_tgz"
|
|
|
|
# Create the tar ball
|
|
evalp $tar -czf "$release_tgz" "$native_bin"
|
|
sync; sync; sync;
|
|
|
|
# Verify the tar ball
|
|
evalp mkdir -p check-tar
|
|
(cd check-tar; evalp $tar -xvf "../$release_tgz")
|
|
sync; sync; sync;
|
|
for file in `ls "$native_bin"`
|
|
do
|
|
if ! evalp diff -q "$native_bin/$file check-tar/$native_bin/$file"
|
|
then
|
|
echo "[ERROR] Archive creation failed"
|
|
exit 1
|
|
fi
|
|
done
|
|
evalp rm -r check-tar
|
|
|
|
# Print status
|
|
echo "Release archive written to $release_tgz with size `du -hs $release_tgz`"
|
|
|
|
print_phase "Success"
|