141 lines
3.2 KiB
Bash
Executable File
141 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
|
|
# For xnvme support, meson build system is required
|
|
# https://github.com/xnvme/xnvme
|
|
|
|
# Rebuilds a static Linux AMD64 fio binary with io_uring support.
|
|
# Output binary path: ./fio
|
|
|
|
# Directory where this script is located
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
TARGET_DIR="$SCRIPT_DIR/../../"
|
|
|
|
lastWORK_DIR=''
|
|
WORK_DIR=''
|
|
cd "$TARGET_DIR"
|
|
source "${TARGET_DIR}/lib/trim.sh"
|
|
|
|
|
|
createOrSetWorkDir()
|
|
{
|
|
# Check if previous WORK_DIR already set
|
|
if [ -f ".WORK_DIR" ]; then
|
|
lastWORK_DIR=$(cat .WORK_DIR)
|
|
fi
|
|
|
|
if [ ! -d "$lastWORK_DIR" ]; then
|
|
lastWORK_DIR=""
|
|
fi
|
|
|
|
|
|
# Either we don't have a previous WORK_DIR or it doesn't exist
|
|
if [ "$lastWORK_DIR" == "" ]; then
|
|
|
|
# printf "%-8s [CREATE]"
|
|
# Create one
|
|
declare -g WORK_DIR="$(mktemp -d)"
|
|
#printf "$WORK_DIR" > .WORK_DIR
|
|
else
|
|
# printf "%-8s [OK]"
|
|
declare -g WORK_DIR="$lastWORK_DIR"
|
|
fi
|
|
|
|
cd "$WORK_DIR"
|
|
}
|
|
|
|
ispinner "Setting up build environment..." &
|
|
createOrSetWorkDir
|
|
|
|
sleep 1
|
|
|
|
|
|
SPIN_PID=$!
|
|
kill $SPIN_PID
|
|
|
|
# echo "[OK]"
|
|
printf "\b\b\b\b[%s]\n" "" "OK"
|
|
|
|
printf "%-4s WORKDR_DIR: %s\n" "" "$WORK_DIR"
|
|
|
|
|
|
printf "%-4s We will now build fio in $WORK_DIR\n" ""
|
|
printf "%-4s Intermediate files will be deleted on completion\n" ""
|
|
printf "%-4s and binaries will be deposited in ./%s" " " $(basename "$SCRIPT_DIR")
|
|
|
|
|
|
# Delete the WORK_DIR on exit, so we don't leave a mess
|
|
trap 'rm -rf "$WORK_DIR"' EXIT
|
|
|
|
need_cmd() {
|
|
if ! command -v "$1" >/dev/null 2>&1; then
|
|
printf 'error: required command not found: %s\n' "$1" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
need_cmd git
|
|
need_cmd make
|
|
need_cmd gcc
|
|
need_cmd pkg-config
|
|
need_cmd file
|
|
need_cmd ldd
|
|
|
|
liburing_prefix="$WORK_DIR/liburing-static"
|
|
|
|
git clone --depth=1 https://github.com/axboe/liburing.git "$WORK_DIR/liburing"
|
|
|
|
|
|
# If we don't change into the directory, the stuff ends up directly in $WORK_DIR
|
|
cd "$WORK_DIR/liburing"
|
|
"$WORK_DIR/liburing/configure" --prefix="$liburing_prefix"
|
|
make -C "$WORK_DIR/liburing" -j"$(nproc)"
|
|
|
|
# There is no actual need to install it
|
|
# make -C "$WORK_DIR/liburing" install
|
|
|
|
printf "Status: %s\n" "$?"
|
|
echo "Finished building liburing?"
|
|
# exit
|
|
|
|
|
|
cd "$WORK_DIR"
|
|
git clone --depth=1 https://github.com/axboe/fio.git "$WORK_DIR/fio-src"
|
|
|
|
|
|
cd "$WORK_DIR/fio-src"
|
|
export PKG_CONFIG_PATH="${liburing_prefix}/lib/pkgconfig"
|
|
export PKG_CONFIG="pkg-config --static"
|
|
|
|
EXTFLAGS="-static" "$WORK_DIR/fio-src/configure" --disable-native --build-static
|
|
make -C "$WORK_DIR/fio-src" -j"$(nproc)"
|
|
|
|
printf "Status: %s\n" "$?"
|
|
|
|
cp "$WORK_DIR/fio-src/fio" "${TARGET_DIR}/fio-io_uring"
|
|
|
|
cd "$TARGET_DIR"
|
|
|
|
printf 'Verifying static linkage...\n'
|
|
file ./fio-io_uring
|
|
ldd ./fio-io_uring || true
|
|
|
|
printf 'Verifying io_uring engine...\n'
|
|
./fio-io_uring --enghelp | grep -E '(^|[[:space:]])io_uring([[:space:]]|$)'
|
|
|
|
printf 'Done. Rebuilt binary at %s/fio-io_uring\n' "${TARGET_DIR}"
|
|
|
|
|
|
|
|
# # Fetching libaio
|
|
# git clone https://github.com/anlongfei/libaio
|
|
# cd libaio
|
|
# make prefix=../build ENABLE_SHARED=false
|
|
# make prefix=../build ENABLE_SHARED=false install
|
|
|
|
# cd ../fio-src/
|
|
# export PKG_CONFIG_PATH="../build/lib/pkgconfig"
|
|
# export PKG_CONFIG="pkg-config --static"
|
|
# EXTFLAGS="-static" ./configure" --disable-native --build-static |