Files
Terrasaur/mkPackage.bash
2025-07-30 11:24:30 -04:00

258 lines
9.3 KiB
Bash
Executable File

#!/bin/bash
# Configure these for the package
packageName=Terrasaur
appPackage="terrasaur"
scriptPath=$(
cd "$(dirname "$0")" || exit 1
pwd -P
)
srcPath="${scriptPath}/src/main/java"
srcFile="${srcPath}/${appPackage}/utils/AppVersion.java"
appSrcDir="${appPackage}/apps"
function build_jar() {
rev=$1
cd "${scriptPath}" || exit 1
# store the version number in pom.xml
cp -p pom.xml pom.bak
sed "s,<version>0.0.1-SNAPSHOT</version>,<version>$rev</version>,g" pom.bak >pom.xml
# install dependencies to the local maven repository
if [ -d dependency ]; then
cd dependency || exit 1
for pom in *.pom; do
base=$(basename "$pom" .pom)
jar="${base}.jar"
# Extract groupId, artifactId, and version from the POM file
groupId=$(grep -m1 '<groupId>' "$pom" | sed -E 's|.*<groupId>(.*)</groupId>.*|\1|' | tr '.' '/')
artifactId=$(grep -m1 '<artifactId>' "$pom" | sed -E 's|.*<artifactId>(.*)</artifactId>.*|\1|')
version=$(grep -m1 '<version>' "$pom" | sed -E 's|.*<version>(.*)</version>.*|\1|')
if [ -z "$groupId" ] || [ -z "$artifactId" ] || [ -z "$version" ]; then
echo "Skipping ${base}: Unable to extract Maven coordinates."
continue
fi
# Construct the expected JAR and POM paths in the local Maven repository
repo_path="$HOME/.m2/repository/$groupId/$artifactId/$version"
jar_path="$repo_path/$artifactId-$version.jar"
pom_path="$repo_path/$artifactId-$version.pom"
if [ -f "$jar_path" ] || [ -f "$pom_path" ]; then
echo "${base} is already installed in local repository."
continue
fi
# Install the artifact
if [ -e "$jar" ]; then
mvn -q install:install-file -Dfile="$jar" -DpomFile="$pom"
else
mvn -q install:install-file -Dfile="$pom" -DpomFile="$pom"
fi
echo "Installed ${base} in local repository"
done
cd ..
else
# install the third party jar files
mvn -q install:install-file -Dfile=3rd-party/"${ARCH}"/spice/spice.jar -DgroupId=gov.nasa.jpl.naif -DartifactId=spice -Dversion=N0067 -Dpackaging=jar
mvn -q install:install-file -Dfile=3rd-party/"${ARCH}"/vtk/lib/java/vtk.jar -DgroupId=com.kitware -DartifactId=vtk-apl -Dversion=9.2.6-apl -Dpackaging=jar
# Deploy to surfshop
# echo mvn deploy:deploy-file -Dfile=3rd-party/"${ARCH}"/spice/spice.jar -DgroupId=gov.nasa.jpl.naif -DartifactId=spice -Dversion=N0067 -Dpackaging=jar -DrepositoryId=third-party -Durl=http://surfshop:8082/artifactory/libs-3rdparty-local/
# echo mvn deploy:deploy-file -Dfile=3rd-party/"${ARCH}"/vtk/lib/java/vtk.jar -DgroupId=com.kitware -DartifactId=vtk-apl -Dversion=9.2.6-apl -Dpackaging=jar -DrepositoryId=third-party -Durl=http://surfshop:8082/artifactory/libs-3rdparty-local/
fi
# ARCH needed for maven-surefire-plugin
export ARCH
mvn clean install
# restore the old pom file
mv pom.bak pom.xml
# install the maven products
rsync -a "${scriptPath}"/target/${packageName}.jar "${libDir}"
rsync -a "${scriptPath}"/target/${packageName}_lib "${libDir}"
# shellcheck disable=SC2086
rsync -a "${scriptPath}"/3rd-party/ ${libDir}
}
function make_scripts() {
classes=$(jar tf ${scriptPath}/target/${packageName}.jar | grep $appSrcDir | grep -v '\$' | grep -v "package-info" | grep -v "Immutable" | grep class)
for class in $classes; do
base=$(basename "$class" ".class")
tool=${scriptDir}/${base}
path=$(dirname "$class" | sed 's,/,.,g').${base}
echo "#!/bin/bash" >${tool}
echo 'script_dir=$(dirname $(which $0))' >>${tool}
echo 'script_dir=$(cd $script_dir; pwd -P)' >>${tool}
echo 'root=$(dirname $script_dir)' >>${tool}
echo 'MEMSIZE=""' >>${tool}
echo 'ARCH=$(uname -s)_$(uname -m)' >>${tool}
echo 'export PATH="${root}/lib/${ARCH}/altwg:${root}/lib/${ARCH}/spice/JNISpice/exe:${PATH}"' >>${tool}
echo 'JAVA_LIBRARY_PATH=""' >>${tool}
echo 'if [ ! -z $JAVA_HOME ]; then' >>${tool}
echo ' JAVA_LIBRARY_PATH="${JAVA_HOME}/lib:${JAVA_LIBRARY_PATH}"' >>${tool}
echo 'fi' >>${tool}
echo 'JAVA_LIBRARY_PATH="${root}/lib/${ARCH}/spice/JNISpice/lib:${JAVA_LIBRARY_PATH}"' >>${tool}
echo 'JAVA_LIBRARY_PATH="${root}/lib/${ARCH}/vtk/lib:${JAVA_LIBRARY_PATH}"' >>${tool}
echo 'JAVA_LIBRARY_PATH="${root}/lib/${ARCH}/vtk/lib/java/vtk-$(uname -s)-$(uname -m):${JAVA_LIBRARY_PATH}"' >>${tool}
echo 'if [ "$(uname -s)" == "Darwin" ]; then' >>${tool}
echo ' MEMSIZE=$(sysctl hw.memsize | awk '\''{print int($2/1024)}'\'')' >>${tool}
echo ' export DYLD_LIBRARY_PATH=$JAVA_LIBRARY_PATH' >>${tool}
echo 'elif [ "$(uname -s)" == "Linux" ]; then' >>${tool}
echo ' MEMSIZE=$(grep MemTotal /proc/meminfo | awk '\''{print $2}'\'')' >>${tool}
echo ' export LD_LIBRARY_PATH=$JAVA_LIBRARY_PATH' >>${tool}
echo 'fi' >>${tool}
echo 'java=$(which java)' >>${tool}
echo 'if [ -z "$java" ]; then' >>${tool}
echo ' echo "Java executable not found in your PATH"' >>${tool}
echo ' exit 1' >>${tool}
echo 'fi' >>${tool}
echo 'fullVersion=$($java -version 2>&1 | head -1 |awk -F\" '\''{print $2}'\'')' >>${tool}
echo 'version=$(echo $fullVersion | awk -F\. '\''{print $1}'\'')' >>${tool}
echo 'if [ "$version" -lt "'$REQUIRED_JAVA_VERSION'" ];then' >>${tool}
echo ' echo "minimum Java version required is '$REQUIRED_JAVA_VERSION'. Version found is $fullVersion."' >>${tool}
echo ' exit 1' >>${tool}
echo 'fi' >>${tool}
echo '$java' "-Djava.library.path=\${JAVA_LIBRARY_PATH} -Xmx\${MEMSIZE}K -cp \${root}/lib/*:\${root}/lib/${packageName}_lib/* $path \"\$@\"" >>${tool}
chmod +x ${tool}
done
}
function make_doc {
cwd=$(pwd)
# build javadoc
javadoc -quiet -Xdoclint:none -cp ${libDir}/*:${libDir}/${packageName}_lib/* -d ${docDir}/javadoc -sourcepath ${srcPath} -subpackages ${appPackage} -overview ${docDir}/src/overview.html
/bin/rm -fr "${docDir}"/src
# sphinx
cd ${scriptPath}/doc || exit 1
python3 -m venv "${scriptPath}"/venv
source "${scriptPath}"/venv/bin/activate
site_package_path=$(python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')
if [ -z "$PYTHONPATH" ]; then
export PYTHONPATH=$site_package_path
else
export PYTHONPATH=$site_package_path:$PYTHONPATH
fi
python3 -m pip --default-timeout=1000 install -U sphinx
python3 -m pip --default-timeout=1000 install sphinx-theme-pd
./make_doc.bash ${scriptDir}
sphinx-build -b html . _build
rsync -a _build/ ${docDir}
/bin/rm -fr toolDescriptions tools/shortDescriptions.rst tools/index.rst _build
cd "$cwd" || exit 1
}
### Don't need to modify anything below this line
# update maven-compiler-plugin block in pom if this version changes
REQUIRED_JAVA_VERSION=21
java=$(which java)
if [ -z $java ]; then
echo "Java executable not found in your PATH"
exit 0
fi
fullVersion=$(java -version 2>&1 | head -1 | awk -F\" '{print $2}')
version=$(echo $fullVersion | awk -F\. '{print $1}')
if [ "$version" -lt "$REQUIRED_JAVA_VERSION" ]; then
echo "minimum Java version required is $REQUIRED_JAVA_VERSION. Version found is $fullVersion."
exit 0
fi
if [ -d .git ]; then
date=$(git log -1 --format=%cd --date=format:%Y.%m.%d)
rev=$(git rev-parse --verify --short HEAD)
if [[ $(git diff --stat) != '' ]]; then
echo 'WARNING: the following files have not been checked in:'
git status --short
echo "waiting for 5 seconds ..."
sleep 5
rev=${rev}M
fi
else
date=$(date -u +"%Y.%m.%d")
rev="UNVERSIONED"
fi
ARCH=$(uname -s)_$(uname -m)
pkgBase=${packageName}-${date}
scriptDir=${pkgBase}/scripts
scriptDir=$(
mkdir -p "${scriptDir}"
cd "${scriptDir}" || exit 1
pwd -P
)
libDir=${pkgBase}/lib
libDir=$(
mkdir -p "${libDir}"
cd "${libDir}" || exit 1
pwd -P
)
docDir=${pkgBase}/doc
docDir=$(
mkdir -p "${docDir}"
cd "${docDir}" || exit 1
pwd -P
)
if [ ! -d ${scriptPath}/3rd-party/${ARCH} ]; then
echo "third party libraries should be installed in 3rd-party/${ARCH}. Please install them and run this script again."
exit 0
fi
# Build the jar file
build_jar ${rev}
# create the executable scripts
make_scripts
# create documentation
make_doc
# Create distribution files for each architecture
mkdir -p dist
for arch in 3rd-party/*; do
this_arch=$(basename "$arch")
tarfile=./dist/${pkgBase}-${rev}_${this_arch}.tar
tar --exclude='lib' -cf "$tarfile" "${pkgBase}"
tar rf "$tarfile" "${pkgBase}"/lib/"${this_arch}" "${pkgBase}"/lib/${packageName}.jar "${pkgBase}"/lib/${packageName}_lib
gzip "${tarfile}"
echo "Created ${tarfile}.gz"
done
mvn -q -Dmdep.copyPom=true dependency:copy-dependencies
rsync -a README.md CHANGELOG.md LICENSE.md mkPackage.bash pom.xml doc src target/dependency "${pkgBase}"-src/
tar cfz ./dist/"${pkgBase}"-${rev}-src.tar.gz ./"${pkgBase}"-src
echo -e "\nCreated ./dist/${pkgBase}-${rev}-src.tar.gz"
/bin/rm -fr ./"${pkgBase}" ./"${pkgBase}"-src
if [ -d .git ]; then
git restore "$srcFile"
fi