fpp/compiler/release
2025-09-04 11:08:29 -07:00

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"