2023-01-23 15:44:23 +01:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Default values
|
2023-01-23 15:44:23 +01:00
|
|
|
URL="https://go.dev/dl/"
|
2026-02-06 09:52:43 +01:00
|
|
|
GITHUB_REPO="https://github.com/metabarcoding/obitools4"
|
2023-02-02 12:16:56 +01:00
|
|
|
INSTALL_DIR="/usr/local"
|
|
|
|
|
OBITOOLS_PREFIX=""
|
2026-02-06 09:52:43 +01:00
|
|
|
VERSION=""
|
|
|
|
|
LIST_VERSIONS=false
|
2026-03-13 11:59:00 +01:00
|
|
|
JOBS=1
|
2023-02-02 12:16:56 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Help message
|
2023-02-02 12:16:56 +01:00
|
|
|
function display_help {
|
|
|
|
|
echo "Usage: $0 [OPTIONS]"
|
|
|
|
|
echo ""
|
|
|
|
|
echo "Options:"
|
|
|
|
|
echo " -i, --install-dir Directory where obitools are installed "
|
2026-02-06 09:52:43 +01:00
|
|
|
echo " (e.g., use /usr/local not /usr/local/bin)."
|
2023-02-02 12:16:56 +01:00
|
|
|
echo " -p, --obitools-prefix Prefix added to the obitools command names if you"
|
|
|
|
|
echo " want to have several versions of obitools at the"
|
2026-02-06 09:52:43 +01:00
|
|
|
echo " same time on your system (e.g., -p g will produce "
|
2023-02-02 12:16:56 +01:00
|
|
|
echo " gobigrep command instead of obigrep)."
|
2026-02-06 09:52:43 +01:00
|
|
|
echo " -v, --version Install a specific version (e.g., 4.4.8)."
|
|
|
|
|
echo " If not specified, installs the latest version."
|
2026-03-13 11:59:00 +01:00
|
|
|
echo " -j, --jobs Number of parallel jobs for compilation (default: 1)."
|
2026-02-06 09:52:43 +01:00
|
|
|
echo " -l, --list List all available versions and exit."
|
2023-02-02 12:16:56 +01:00
|
|
|
echo " -h, --help Display this help message."
|
2026-02-06 09:52:43 +01:00
|
|
|
echo ""
|
|
|
|
|
echo "Examples:"
|
|
|
|
|
echo " $0 # Install latest version"
|
|
|
|
|
echo " $0 -l # List available versions"
|
|
|
|
|
echo " $0 -v 4.4.8 # Install specific version"
|
|
|
|
|
echo " $0 -i /opt/local # Install to custom directory"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# List available versions from GitHub releases
|
|
|
|
|
function list_versions {
|
|
|
|
|
echo "Fetching available versions..." 1>&2
|
|
|
|
|
echo ""
|
|
|
|
|
curl -s "https://api.github.com/repos/metabarcoding/obitools4/releases" \
|
|
|
|
|
| grep '"tag_name":' \
|
|
|
|
|
| sed -E 's/.*"tag_name": "Release_([0-9.]+)".*/\1/' \
|
|
|
|
|
| sort -V -r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Get latest version from GitHub releases
|
|
|
|
|
function get_latest_version {
|
|
|
|
|
curl -s "https://api.github.com/repos/metabarcoding/obitools4/releases" \
|
|
|
|
|
| grep '"tag_name":' \
|
|
|
|
|
| sed -E 's/.*"tag_name": "Release_([0-9.]+)".*/\1/' \
|
|
|
|
|
| sort -V -r \
|
|
|
|
|
| head -1
|
2023-02-02 12:16:56 +01:00
|
|
|
}
|
|
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Parse command line arguments
|
2023-02-02 12:16:56 +01:00
|
|
|
while [ "$#" -gt 0 ]; do
|
|
|
|
|
case "$1" in
|
|
|
|
|
-i|--install-dir)
|
|
|
|
|
INSTALL_DIR="$2"
|
|
|
|
|
shift 2
|
|
|
|
|
;;
|
|
|
|
|
-p|--obitools-prefix)
|
|
|
|
|
OBITOOLS_PREFIX="$2"
|
|
|
|
|
shift 2
|
|
|
|
|
;;
|
2026-02-06 09:52:43 +01:00
|
|
|
-v|--version)
|
|
|
|
|
VERSION="$2"
|
|
|
|
|
shift 2
|
|
|
|
|
;;
|
2026-03-13 11:59:00 +01:00
|
|
|
-j|--jobs)
|
|
|
|
|
JOBS="$2"
|
|
|
|
|
shift 2
|
|
|
|
|
;;
|
2026-02-06 09:52:43 +01:00
|
|
|
-l|--list)
|
|
|
|
|
LIST_VERSIONS=true
|
|
|
|
|
shift
|
|
|
|
|
;;
|
2023-02-02 12:16:56 +01:00
|
|
|
-h|--help)
|
2026-02-06 09:52:43 +01:00
|
|
|
display_help
|
2023-02-02 12:16:56 +01:00
|
|
|
exit 0
|
|
|
|
|
;;
|
|
|
|
|
*)
|
2026-02-06 09:52:43 +01:00
|
|
|
echo "Error: Unsupported option $1" 1>&2
|
|
|
|
|
display_help 1>&2
|
2023-02-02 12:16:56 +01:00
|
|
|
exit 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# List versions and exit if requested
|
|
|
|
|
if [ "$LIST_VERSIONS" = true ]; then
|
|
|
|
|
echo "Available OBITools4 versions:"
|
|
|
|
|
echo "=============================="
|
|
|
|
|
list_versions
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Determine version to install
|
|
|
|
|
if [ -z "$VERSION" ]; then
|
|
|
|
|
echo "Fetching latest version..." 1>&2
|
|
|
|
|
VERSION=$(get_latest_version)
|
|
|
|
|
if [ -z "$VERSION" ]; then
|
|
|
|
|
echo "Error: Could not determine latest version" 1>&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
echo "Latest version: $VERSION" 1>&2
|
|
|
|
|
else
|
|
|
|
|
echo "Installing version: $VERSION" 1>&2
|
|
|
|
|
fi
|
2023-01-23 15:44:23 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Construct source URL for the specified version
|
|
|
|
|
OBIURL4="${GITHUB_REPO}/archive/refs/tags/Release_${VERSION}.zip"
|
|
|
|
|
|
|
|
|
|
# The directory from where the script is run
|
|
|
|
|
DIR="$(pwd)"
|
2023-02-02 12:16:56 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Create temporary directory
|
2023-02-02 12:16:56 +01:00
|
|
|
WORK_DIR=$(mktemp -d "obitools4.XXXXXX")
|
2023-01-23 15:44:23 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Check if tmp dir was created
|
2023-01-23 15:44:23 +01:00
|
|
|
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
|
2026-02-06 09:52:43 +01:00
|
|
|
echo "Could not create temp dir" 1>&2
|
2023-01-23 15:44:23 +01:00
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2025-10-15 08:32:06 +02:00
|
|
|
mkdir -p "${WORK_DIR}/cache" \
|
2026-02-06 09:52:43 +01:00
|
|
|
|| (echo "Cannot create ${WORK_DIR}/cache directory" 1>&2
|
2025-10-15 08:32:06 +02:00
|
|
|
exit 1)
|
|
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Create installation directory
|
2026-03-13 11:59:00 +01:00
|
|
|
if ! mkdir -p "${INSTALL_DIR}/bin" 2>/dev/null; then
|
|
|
|
|
if [ ! -w "$(dirname "${INSTALL_DIR}")" ] && [ ! -w "${INSTALL_DIR}" ]; then
|
|
|
|
|
echo "Please enter your password for installing obitools in ${INSTALL_DIR}" 1>&2
|
|
|
|
|
sudo mkdir -p "${INSTALL_DIR}/bin"
|
|
|
|
|
else
|
|
|
|
|
echo "Error: Could not create ${INSTALL_DIR}/bin (check path or disk space)" 1>&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
fi
|
2023-02-02 12:21:49 +01:00
|
|
|
|
2023-06-07 17:54:02 +02:00
|
|
|
if [[ ! -d "${INSTALL_DIR}/bin" ]]; then
|
2026-02-06 09:52:43 +01:00
|
|
|
echo "Could not create ${INSTALL_DIR}/bin directory for installing obitools" 1>&2
|
2023-02-02 12:21:49 +01:00
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2025-03-27 16:45:02 +01:00
|
|
|
INSTALL_DIR="$(cd ${INSTALL_DIR} && pwd)"
|
2023-02-02 12:16:56 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
echo "================================" 1>&2
|
|
|
|
|
echo "OBITools4 Installation" 1>&2
|
|
|
|
|
echo "================================" 1>&2
|
|
|
|
|
echo "VERSION=$VERSION" 1>&2
|
|
|
|
|
echo "WORK_DIR=$WORK_DIR" 1>&2
|
|
|
|
|
echo "INSTALL_DIR=$INSTALL_DIR" 1>&2
|
|
|
|
|
echo "OBITOOLS_PREFIX=$OBITOOLS_PREFIX" 1>&2
|
|
|
|
|
echo "================================" 1>&2
|
2023-02-02 12:16:56 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
pushd "$WORK_DIR" > /dev/null || exit
|
2023-01-23 15:44:23 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Detect OS and architecture
|
2023-01-23 15:44:23 +01:00
|
|
|
OS=$(uname -a | awk '{print $1}')
|
|
|
|
|
ARCH=$(uname -m)
|
|
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
if [[ "$ARCH" == "x86_64" ]] ; then
|
|
|
|
|
ARCH="amd64"
|
2023-01-23 15:44:23 +01:00
|
|
|
fi
|
|
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
if [[ "$ARCH" == "aarch64" ]] ; then
|
|
|
|
|
ARCH="arm64"
|
2023-06-06 10:02:24 +02:00
|
|
|
fi
|
|
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Download and install Go
|
|
|
|
|
echo "Downloading Go..." 1>&2
|
|
|
|
|
GOFILE=$(curl -s "$URL" \
|
2023-01-23 15:44:23 +01:00
|
|
|
| grep 'class="download"' \
|
|
|
|
|
| grep "\.tar\.gz" \
|
|
|
|
|
| sed -E 's@^.*/dl/(go[1-9].+\.tar\.gz)".*$@\1@' \
|
|
|
|
|
| grep -i "$OS" \
|
|
|
|
|
| grep -i "$ARCH" \
|
|
|
|
|
| head -1)
|
|
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
GOURL=$(curl -s "${URL}${GOFILE}" \
|
2023-01-23 15:44:23 +01:00
|
|
|
| sed -E 's@^.*href="(.*\.tar\.gz)".*$@\1@')
|
2023-06-06 09:21:16 +02:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
echo "Installing Go from: $GOURL" 1>&2
|
|
|
|
|
|
2026-03-13 16:40:53 +01:00
|
|
|
curl --progress-bar "$GOURL" | tar zxf -
|
2023-01-23 15:44:23 +01:00
|
|
|
|
2023-06-06 10:11:37 +02:00
|
|
|
PATH="$(pwd)/go/bin:$PATH"
|
2023-06-06 10:13:13 +02:00
|
|
|
export PATH
|
2025-03-12 13:28:52 +01:00
|
|
|
GOPATH="$(pwd)/go"
|
|
|
|
|
export GOPATH
|
2025-11-04 18:08:39 +01:00
|
|
|
export GOCACHE="$(pwd)/cache"
|
2026-02-06 09:52:43 +01:00
|
|
|
|
|
|
|
|
echo "GOCACHE=$GOCACHE" 1>&2
|
2025-05-01 11:45:46 +02:00
|
|
|
mkdir -p "$GOCACHE"
|
2025-03-12 13:28:52 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Download OBITools4 source
|
|
|
|
|
echo "Downloading OBITools4 v${VERSION}..." 1>&2
|
|
|
|
|
echo "Source URL: $OBIURL4" 1>&2
|
2023-01-23 15:44:23 +01:00
|
|
|
|
2026-03-13 16:40:53 +01:00
|
|
|
if ! curl --progress-bar -L "$OBIURL4" > obitools4.zip; then
|
2026-02-06 09:52:43 +01:00
|
|
|
echo "Error: Could not download OBITools4 version ${VERSION}" 1>&2
|
|
|
|
|
echo "Please check that this version exists with: $0 --list" 1>&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2024-07-29 14:35:21 +02:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
unzip -q obitools4.zip
|
2023-01-23 15:44:23 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Find the extracted directory
|
|
|
|
|
OBITOOLS_DIR=$(ls -d obitools4-* 2>/dev/null | head -1)
|
2023-02-02 12:16:56 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
if [ -z "$OBITOOLS_DIR" ] || [ ! -d "$OBITOOLS_DIR" ]; then
|
|
|
|
|
echo "Error: Could not find extracted OBITools4 directory" 1>&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "Building OBITools4..." 1>&2
|
|
|
|
|
cd "$OBITOOLS_DIR" || exit
|
|
|
|
|
mkdir -p vendor
|
|
|
|
|
|
|
|
|
|
# Build with or without prefix
|
2023-02-02 12:16:56 +01:00
|
|
|
if [[ -z "$OBITOOLS_PREFIX" ]] ; then
|
2026-03-13 11:59:00 +01:00
|
|
|
make -j"${JOBS}" obitools GOFLAGS="-buildvcs=false"
|
2023-02-02 12:16:56 +01:00
|
|
|
else
|
2026-03-13 11:59:00 +01:00
|
|
|
make -j"${JOBS}" obitools GOFLAGS="-buildvcs=false" OBITOOLS_PREFIX="${OBITOOLS_PREFIX}"
|
2023-02-02 12:16:56 +01:00
|
|
|
fi
|
2023-01-23 15:44:23 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Install binaries
|
|
|
|
|
echo "Installing binaries to ${INSTALL_DIR}/bin..." 1>&2
|
2026-03-13 11:59:00 +01:00
|
|
|
if ! cp build/* "${INSTALL_DIR}/bin" 2>/dev/null; then
|
|
|
|
|
if [ ! -w "${INSTALL_DIR}/bin" ]; then
|
|
|
|
|
echo "Please enter your password for installing obitools in ${INSTALL_DIR}" 1>&2
|
|
|
|
|
sudo cp build/* "${INSTALL_DIR}/bin"
|
|
|
|
|
else
|
|
|
|
|
echo "Error: Could not copy binaries to ${INSTALL_DIR}/bin" 1>&2
|
|
|
|
|
echo " Source files: $(ls build/ 2>/dev/null || echo 'none found')" 1>&2
|
|
|
|
|
echo "" 1>&2
|
|
|
|
|
echo "The build directory has been preserved for manual recovery:" 1>&2
|
|
|
|
|
echo " $(pwd)/build/" 1>&2
|
|
|
|
|
echo "You can install manually with:" 1>&2
|
|
|
|
|
echo " cp $(pwd)/build/* ${INSTALL_DIR}/bin/" 1>&2
|
|
|
|
|
popd > /dev/null || true
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
fi
|
2023-01-27 14:50:45 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
popd > /dev/null || exit
|
2023-01-27 14:50:45 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
# Cleanup
|
|
|
|
|
echo "Cleaning up..." 1>&2
|
2025-03-12 13:28:52 +01:00
|
|
|
chmod -R +w "$WORK_DIR"
|
2023-06-07 17:54:02 +02:00
|
|
|
rm -rf "$WORK_DIR"
|
2023-01-27 14:50:45 +01:00
|
|
|
|
2026-02-06 09:52:43 +01:00
|
|
|
echo "" 1>&2
|
|
|
|
|
echo "================================" 1>&2
|
|
|
|
|
echo "OBITools4 v${VERSION} installed successfully!" 1>&2
|
|
|
|
|
echo "Binaries location: ${INSTALL_DIR}/bin" 1>&2
|
|
|
|
|
if [[ -n "$OBITOOLS_PREFIX" ]] ; then
|
|
|
|
|
echo "Command prefix: ${OBITOOLS_PREFIX}" 1>&2
|
|
|
|
|
fi
|
|
|
|
|
echo "================================" 1>&2
|