major rework

This commit is contained in:
2025-07-27 11:50:38 -05:00
parent 1c50eb61f5
commit 2b7faac58c
19 changed files with 947 additions and 796 deletions

View File

@@ -1,24 +0,0 @@
#!/usr/bin/env bash
FB_FUNC_NAMES+=('build_docker_images')
FB_FUNC_DESCS['build_docker_images']='build docker images with required dependencies pre-installed'
build_docker_images() {
DISTROS=( debian ubuntu archlinux fedora )
DOCKERFILE_DIR="${IGN_DIR}/Dockerfiles"
test -d "${DOCKERFILE_DIR}" || mkdir -p "${DOCKERFILE_DIR}"
for distro in "${DISTROS[@]}"; do
echo "\
FROM ${distro}
COPY scripts/ /ffmpeg-builder/scripts/
COPY main.sh /ffmpeg-builder/
RUN bash -c 'source /ffmpeg-builder/main.sh ; install_deps' || exit 1" \
> "${DOCKERFILE_DIR}/Dockerfile_${distro}"
image_tag="ffmpeg_builder_${distro}"
dockerfile="Dockerfile_${distro}"
echo_info "building ${image_tag}"
docker build \
-t "${image_tag}" \
-f "${DOCKERFILE_DIR}/${dockerfile}" \
"${REPO_DIR}/"
done
}

View File

@@ -1,409 +0,0 @@
#!/usr/bin/env bash
set_compile_opts() {
unset CLEAN OPT_LVL LDFLAGS \
C_FLAGS CXX_FLAGS CPP_FLAGS \
CONFIGURE_FLAGS MESON_FLAGS \
RUSTFLAGS CMAKE_FLAGS \
FFMPEG_EXTRA_FLAGS \
PKG_CONFIG_PATH
export CLEAN OPT_LVL LDFLAGS \
C_FLAGS CXX_FLAGS CPP_FLAGS \
CONFIGURE_FLAGS MESON_FLAGS \
RUSTFLAGS CMAKE_FLAGS \
FFMPEG_EXTRA_FLAGS \
PKG_CONFIG_PATH
# set job count for all builds
JOBS="$(nproc)"
export JOBS
MACHINE="$(cc -dumpmachine)"
test "${MACHINE}" != '' || return 1
export MACHINE
MACHINE_LIB="${PREFIX}/lib/${MACHINE}"
# set prefix flags
CONFIGURE_FLAGS+=("--prefix=${PREFIX}")
MESON_FLAGS+=("--prefix" "${PREFIX}")
CMAKE_FLAGS+=("-DCMAKE_PREFIX_PATH=${PREFIX}")
CMAKE_FLAGS+=("-DCMAKE_INSTALL_PREFIX=${PREFIX}")
PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}"
PKG_CONFIG_PATH="${MACHINE_LIB}/pkgconfig:${PKG_CONFIG_PATH}"
echo_info "PKG_CONFIG_PATH = ${PKG_CONFIG_PATH}"
# add prefix include
C_FLAGS+=("-I${PREFIX}/include")
# enabling a clean build
if test "$(jq .clean "${COMPILE_CFG}")" == 'true'; then
CLEAN="${SUDO} rm -rf"
echo_info "performing clean build"
else
CLEAN='void'
fi
# enabling link-time optimization
# shellcheck disable=SC2034
unset LTO_SWITCH LTO_FLAG LTO_BOOL
export LTO_SWITCH LTO_FLAG LTO_BOOL
if test "$(jq .lto "${COMPILE_CFG}")" == 'true'; then
echo_info "building with LTO"
LTO_SWITCH='ON'
LTO_FLAG='-flto'
C_FLAGS+=("${LTO_FLAG}")
CONFIGURE_FLAGS+=('--enable-lto')
MESON_FLAGS+=("-Db_lto=true")
RUSTFLAGS+=("-C lto=yes" "-C inline-threshold=1000" "-C codegen-units=1")
else
echo_info "building without LTO"
LTO_SWITCH='OFF'
LTO_FLAG=''
MESON_FLAGS+=("-Db_lto=false")
RUSTFLAGS+=("-C lto=no")
fi
# setting optimization level
OPT_LVL="$(jq .optimization "${COMPILE_CFG}")"
if test "${OPT_LVL}" == ''; then
OPT_LVL='0'
fi
C_FLAGS+=("-O${OPT_LVL}")
RUSTFLAGS+=("-C opt-level=${OPT_LVL}")
MESON_FLAGS+=("--optimization=${OPT_LVL}")
echo_info "building with optimization: ${OPT_LVL}"
# static/shared linking
unset PKG_CFG_FLAGS LIB_SUFF
export PKG_CFG_FLAGS LIB_SUFF
isStatic="$(test "$(jq .static "${COMPILE_CFG}")" == 'true' ; echo $?)"
isShared="$(test "$(jq .shared "${COMPILE_CFG}")" == 'true' ; echo $?)"
if test $((isStatic + isShared)) -eq 2; then
echo_exit "Cannot have static and shared compile options"
fi
if test "${isStatic}" -eq 0; then
LDFLAGS+=('-static')
CONFIGURE_FLAGS+=('--enable-static')
CMAKE_FLAGS+=("-DBUILD_SHARED_LIBS=OFF")
MESON_FLAGS+=('--default-library=static')
CMAKE_FLAGS+=("-DCMAKE_EXE_LINKER_FLAGS='-static'")
PKG_CFG_FLAGS='--static'
LIB_SUFF='a'
fi
if test "${isShared}" -eq 0; then
LDFLAGS+=("-Wl,-rpath,${MACHINE_LIB}")
CONFIGURE_FLAGS+=('--enable-shared')
CMAKE_FLAGS+=("-DBUILD_SHARED_LIBS=ON")
CMAKE_FLAGS+=("-DCMAKE_INSTALL_RPATH=${PREFIX}/lib;${MACHINE_LIB}")
FFMPEG_EXTRA_FLAGS+=('--enable-rpath')
LIB_SUFF='so'
fi
# architecture/cpu compile flags
export CPU ARCH
CPU="$(jq -r .cpu "${COMPILE_CFG}")"
ARCH="$(jq -r .arch "${COMPILE_CFG}")"
# arm prefers -mcpu over -march
# https://community.arm.com/arm-community-blogs/b/tools-software-ides-blog/posts/compiler-flags-across-architectures-march-mtune-and-mcpu
arch_flags=""
test_arch="$(uname -m)"
if [[ "${test_arch}" == "x86_64" ]]; then
arch_flags="-march=${CPU}"
elif [[ "${test_arch}" == "aarch64" || \
"${test_arch}" == "arm64" ]]
then
arch_flags="-mcpu=${CPU}"
fi
C_FLAGS+=("${arch_flags}")
CXX_FLAGS=("${C_FLAGS[@]}")
CPP_FLAGS=("${C_FLAGS[@]}")
RUSTFLAGS+=("-C target-cpu=${CPU}")
CMAKE_FLAGS+=("-DCMAKE_C_FLAGS='${C_FLAGS[*]}'")
CMAKE_FLAGS+=("-DCMAKE_CXX_FLAGS='${CXX_FLAGS[*]}'")
MESON_FLAGS+=("-Dc_args=${C_FLAGS[*]}" "-Dcpp_args=${CPP_FLAGS[*]}")
dump_arr CONFIGURE_FLAGS
dump_arr C_FLAGS
dump_arr RUSTFLAGS
dump_arr CMAKE_FLAGS
dump_arr MESON_FLAGS
dump_arr PKG_CFG_FLAGS
# extra ffmpeg flags
if [[ "${TARGET_WINDOWS}" == '1' ]]; then
FFMPEG_EXTRA_FLAGS+=(
'--cross-prefix=x86_64-w64-mingw32-'
'--target-os=mingw32'
'--cc=x86_64-w64-mingw32-gcc'
'--cxx=x86_64-w64-mingw32-g++'
'--ar=x86_64-w64-mingw32-gcc-ar'
'--ranlib=x86_64-w64-mingw32-gcc-ranlib'
'--nm=x86_64-w64-mingw32-gcc-nm'
)
fi
FFMPEG_EXTRA_FLAGS+=(
"--extra-cflags=\"${C_FLAGS[*]}\""
"--extra-cxxflags=\"${CXX_FLAGS[*]}\""
"--extra-ldflags=\"${LDFLAGS[*]}\""
)
dump_arr FFMPEG_EXTRA_FLAGS
# shellcheck disable=SC2178
RUSTFLAGS="${RUSTFLAGS[*]}"
# make sure RUSTUP_HOME and CARGO_HOME are defined
if [[ "${RUSTUP_HOME}" == '' ]]; then
RUSTUP_HOME="${HOME}/.rustup"
test -d "${RUSTUP_HOME}" || echo_exit "RUSTUP_HOME does not exist"
fi
if [[ "${CARGO_HOME}" == '' ]]; then
CARGO_HOME="${HOME}/.rustup"
test -d "${CARGO_HOME}" || echo_exit "CARGO_HOME does not exist"
fi
export RUSTUP_HOME CARGO_HOME
unset SUDO_CARGO
if [[ "${SUDO}" != '' ]]; then
export SUDO_CARGO="${SUDO} --preserve-env=PATH,RUSTUP_HOME,CARGO_HOME"
fi
echo
}
get_json_conf() {
local build="${1}"
# make sure there is a build config for the enabled build
test "$(jq -r ".${build}" "$BUILD_CFG")" == 'null' && return 1
unset ver ext url deps extracted_dir
export ver ext url deps extracted_dir
ver="$(jq -r ".${build}.ver" "$BUILD_CFG")"
ext="$(jq -r ".${build}.ext" "$BUILD_CFG")"
eval "url=\"$(jq -r ".${build}.url" "$BUILD_CFG")\""
jq -r ".${build}.deps[]" "$BUILD_CFG" >/dev/null 2>/dev/null && \
mapfile -t deps < <(jq -r ".${build}.deps[]" "$BUILD_CFG")
jq -r ".${build}.deps[]" "$BUILD_CFG" >/dev/null 2>/dev/null && \
mapfile -t deps < <(jq -r ".${build}.deps[]" "$BUILD_CFG")
extracted_dir="${BUILD_DIR}/${build}-v${ver}"
}
download_release() {
local build="${1}"
# set env for wget download
get_json_conf "${build}" || return 1
local base_path="${build}-v${ver}"
local base_dl_path="${DL_DIR}/${base_path}"
# remove other versions of a download
for wrong_ver_dl in "${DL_DIR}/${build}"*; do
if [[ "${wrong_ver_dl}" =~ ${base_path} ]]; then
continue
fi
test -f "${wrong_ver_dl}" || continue
echo_warn "removing wrong version: ${wrong_ver_dl}"
rm -rf "${wrong_ver_dl}"
done
# remove other versions of a build
for wrong_ver_build in "${BUILD_DIR}/${build}"*; do
if [[ "${wrong_ver_build}" =~ ${base_path} ]]; then
continue
fi
test -d "${wrong_ver_build}" || continue
echo_warn "removing wrong version: ${extracted_dir}"
rm -rf "${wrong_ver_build}"
done
# create new build dir for clean builds
test -d "${extracted_dir}" && \
${CLEAN} "${extracted_dir}"
if test "${ext}" != "git"; then
wget_out="${base_dl_path}.${ext}"
# download archive if not present
if ! test -f "${wget_out}"; then
echo_info "downloading ${build}"
echo_if_fail wget "${url}" -O "${wget_out}"
fi
# create new build directory
test -d "${extracted_dir}" || \
{
mkdir "${extracted_dir}"
tar -xf "${wget_out}" --strip-components=1 -C "${extracted_dir}"
}
else
# for git downloads
test -d "${base_dl_path}" || \
git clone "${url}" "${base_dl_path}" || return 1
# create new build directory
test -d "${extracted_dir}" || \
cp -r "${base_dl_path}" "${extracted_dir}" || return 1
fi
}
FB_FUNC_NAMES+=('do_build')
# shellcheck disable=SC2034
FB_FUNC_DESCS['do_build']='build a specific project'
# shellcheck disable=SC2034
FB_FUNC_COMPLETION['do_build']="${BUILDS[*]}"
do_build() {
local build="${1}"
download_release "${build}" || return 1
get_json_conf "${build}" || return 1
for dep in "${deps[@]}"; do
do_build "${dep}" || return 1
done
get_json_conf "${build}" || return 1
echo_info "building ${build}"
pushd "$extracted_dir" >/dev/null || return 1
echo_if_fail build_"${build}"
retval=$?
popd >/dev/null || return 1
test ${retval} -eq 0 || return ${retval}
echo_pass "built ${build}"
}
FB_FUNC_NAMES+=('build')
# shellcheck disable=SC2034
FB_FUNC_DESCS['build']='build ffmpeg with desired configuration'
build() {
test -d "${DL_DIR}" || mkdir -p "${DL_DIR}"
test -d "${CCACHE_DIR}" || mkdir -p "${CCACHE_DIR}"
test -d "${BUILD_DIR}" || mkdir -p "${BUILD_DIR}"
test -d "${PREFIX}/bin/" || mkdir -p "${PREFIX}/bin/"
unset SUDO
testfile="${PREFIX}/ffmpeg-build-testfile"
if ! touch "${testfile}" 2> /dev/null; then
# we cannot modify the install prefix
# so we need to use sudo
test "$(id -u)" -eq 0 || SUDO=sudo
export SUDO
${SUDO} mkdir -p "${PREFIX}/bin/"
fi
test -f "${testfile}" && ${SUDO} rm "${testfile}"
for build in "${FFMPEG_ENABLES[@]}"; do
do_build "${build}" || return 1
done
do_build "ffmpeg" || return 1
return 0
}
build_hdr10plus_tool() {
ccache cargo build --release || return 1
${SUDO} cp target/release/hdr10plus_tool "${PREFIX}/bin/" || return 1
# build libhdr10plus
cd hdr10plus || return 1
ccache cargo cbuild --release || return 1
${SUDO_CARGO} bash -lc "cargo cinstall --prefix=${PREFIX} --release" || return 1
}
build_dovi_tool() {
ccache cargo build --release || return 1
${SUDO} cp target/release/dovi_tool "${PREFIX}/bin/" || return 1
# build libdovi
cd dolby_vision || return 1
ccache cargo cbuild --release || return 1
${SUDO_CARGO} bash -lc "cargo cinstall --prefix=${PREFIX} --release" || return 1
}
build_libsvtav1() {
cmake \
"${CMAKE_FLAGS[@]}" \
-DSVT_AV1_LTO="${LTO_SWITCH}" \
-DENABLE_AVX512=ON \
-DBUILD_TESTING=OFF \
-DCOVERAGE=OFF || return 1
ccache make -j"${JOBS}" || return 1
${SUDO} make -j"${JOBS}" install || return 1
}
build_libsvtav1_psy() {
cmake \
"${CMAKE_FLAGS[@]}" \
-DSVT_AV1_LTO="${LTO_SWITCH}" \
-DBUILD_TESTING=OFF \
-DENABLE_AVX512=ON \
-DCOVERAGE=OFF \
-DLIBDOVI_FOUND=1 \
-DLIBHDR10PLUS_RS_FOUND=1 \
-DLIBHDR10PLUS_RS_LIBRARY="${MACHINE_LIB}/libhdr10plus-rs.${LIB_SUFF}" \
-DLIBDOVI_LIBRARY="${MACHINE_LIB}/libdovi.${LIB_SUFF}" || return 1
ccache make -j"${JOBS}" || return 1
${SUDO} make -j"${JOBS}" install || return 1
}
build_librav1e() {
ccache cargo build --release || return 1
${SUDO} cp target/release/rav1e "${PREFIX}/bin/" || return 1
ccache cargo cbuild --release || return 1
${SUDO_CARGO} bash -lc "cargo cinstall --prefix=${PREFIX} --release" || return 1
}
build_libaom() {
cmake \
"${CMAKE_FLAGS[@]}" \
-B build.user \
-DENABLE_TESTS=OFF || return 1
cd build.user || return 1
ccache make -j"${JOBS}" || return 1
${SUDO} make -j"${JOBS}" install || return 1
}
build_libopus() {
./configure \
"${CONFIGURE_FLAGS[@]}" \
--disable-doc || return 1
ccache make -j"${JOBS}" || return 1
${SUDO} make -j"${JOBS}" install || return 1
return 0
}
build_libdav1d() {
meson \
setup . build.user \
"${MESON_FLAGS[@]}" || return 1
ccache ninja -vC build.user || return 1
${SUDO} ninja -vC build.user install || return 1
}
build_libvmaf() {
cd libvmaf || return 1
python3 -m virtualenv .venv
(
source .venv/bin/activate
meson \
setup . build.user \
"${MESON_FLAGS[@]}" \
-Denable_float=true || exit 1
ccache ninja -vC build.user || exit 1
${SUDO} ninja -vC build.user install || exit 1
) || return 1
}
build_ffmpeg() {
for enable in "${FFMPEG_ENABLES[@]}"; do
test "${enable}" == 'libsvtav1_psy' && enable='libsvtav1'
CONFIGURE_FLAGS+=("--enable-${enable}")
done
./configure \
"${CONFIGURE_FLAGS[@]}" \
"${FFMPEG_EXTRA_FLAGS[@]}" \
--pkg-config='pkg-config' \
--pkg-config-flags="${PKG_CFG_FLAGS}" \
--cpu="${CPU}" --arch="${ARCH}" \
--enable-gpl --enable-version3 \
--enable-nonfree \
--disable-htmlpages \
--disable-podpages \
--disable-txtpages \
--disable-autodetect || return 1
ccache make -j"${JOBS}" || return 1
${SUDO} make -j"${JOBS}" install || return 1
return 0
}

1
scripts/build.sh Symbolic link
View File

@@ -0,0 +1 @@
entry.sh

View File

@@ -0,0 +1 @@
entry.sh

View File

@@ -1,73 +0,0 @@
#!/usr/bin/env bash
# shellcheck disable=SC2034
# ANSI colors
RED='\e[0;31m'
CYAN='\e[0;36m'
GREEN='\e[0;32m'
YELLOW='\e[0;33m'
NC='\e[0m'
# echo wrappers
echo_fail() { echo -e "${RED}FAIL${NC}:" "$@" ; }
echo_info() { echo -e "${CYAN}INFO${NC}:" "$@" ; }
echo_pass() { echo -e "${GREEN}PASS${NC}:" "$@" ; }
echo_warn() { echo -e "${YELLOW}WARN${NC}:" "$@" ; }
echo_exit() { echo_fail "$@" ; exit 1 ; }
void() { echo "$@" >/dev/null ; }
echo_if_fail() {
local cmd=("$@")
local out="${TMP_DIR}/.stdout-${RANDOM}"
local err="${TMP_DIR}/.stderr-${RANDOM}"
test -d "${TMP_DIR}" || mkdir -p "${TMP_DIR}"
# set trace to the cmdEvalTrace and open file descriptor
local cmdEvalTrace="${TMP_DIR}/.cmdEvalTrace-${RANDOM}"
exec 5> "${cmdEvalTrace}"
export BASH_XTRACEFD=5
set -x
"${cmd[@]}" >"${out}" 2>"${err}"
local retval=$?
# unset and close file descriptor
set +x
exec 5>&-
# parse out relevant part of the trace
local cmdEvalLines=()
cmd=()
while IFS= read -r line; do
cmdEvalLines+=("${line}")
done < "${cmdEvalTrace}"
local cmdEvalLineNum=${#cmdEvalLines[@]}
for ((i=1; i < cmdEvalLineNum-2; i++)); do
local trimmedCmd="${cmdEvalLines[${i}]}"
trimmedCmd="${trimmedCmd/+ /}"
cmd+=("${trimmedCmd}")
done
if ! test ${retval} -eq 0; then
echo
echo_fail "command failed:"
printf "%s\n" "${cmd[@]}"
echo_warn "command output:"
tail -n 10 "${out}"
tail -n 10 "${err}"
echo
fi
rm "${out}" "${err}" "${cmdEvalTrace}"
return ${retval}
}
dump_arr() {
arr_name="$1"
declare -n arr
arr="${arr_name}"
arr_exp=("${arr[@]}")
test "${#arr_exp}" -gt 0 || return 0
echo_info "${arr_name}"
printf "\t%s\n" "${arr_exp[@]}"
}

1
scripts/do_build.sh Symbolic link
View File

@@ -0,0 +1 @@
entry.sh

View File

@@ -0,0 +1 @@
entry.sh

7
scripts/entry.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/usr/bin/env bash
cd "$(dirname "$(readlink -f $0)")/.."
. main.sh
FB_RUNNING_AS_SCRIPT=1
scr_name="$(bash_basename $0)"
cmd="${scr_name//.sh/}"
$cmd $@

View File

@@ -1,193 +0,0 @@
#!/usr/bin/env bash
# shellcheck disable=SC2317
# shellcheck disable=SC2034
determine_darwin_pkg_mgr() {
if ! command -v brew >/dev/null; then
echo_warning "brew not found"
echo_info "install brew:"
# shellcheck disable=SC2016
echo '/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"'
return 1
fi
PKG_MGR=brew
check_pkg_exists() {
"${PKG_MGR}" list --formula "${1}" >/dev/null
}
PKG_MGR_UPD="${PKG_MGR} update"
PKG_MGR_INST="${PKG_MGR} install"
}
determine_linux_debian_pkg_mgr() {
if command -v apt-get >/dev/null; then
PKG_MGR=apt-get
else
echo_fail "no package manager found"
return 1
fi
check_pkg_exists() {
dpkg -l "${1}" >/dev/null 2>/dev/null
}
export DEBIAN_FRONTEND=noninteractive
PKG_MGR_UPD="${SUDO} ${PKG_MGR} update"
PKG_MGR_INST="${SUDO} ${PKG_MGR} install -y"
}
determine_linux_arch_pkg_mgr() {
if command -v pacman >/dev/null; then
PKG_MGR=pacman
else
echo_fail "no package manager found"
return 1
fi
check_pkg_exists() {
local pkg_check="${1}"
"${PKG_MGR}" -Qi "${pkg_check}" >/dev/null 2>/dev/null
}
PKG_MGR_UPD="${SUDO} ${PKG_MGR} -Syy"
PKG_MGR_INST="${SUDO} ${PKG_MGR} -S --noconfirm --needed"
}
determine_linux_fedora_pkg_mgr() {
if command -v dnf >/dev/null; then
PKG_MGR=dnf
else
echo_fail "no package manager found"
return 1
fi
check_pkg_exists() {
local pkg_check="${1}"
test "${pkg_check}" == 'wget' && pkg_check=wget2
"${PKG_MGR}" list -q --installed "${pkg_check}" >/dev/null 2>/dev/null
}
PKG_MGR_UPD="${SUDO} ${PKG_MGR} check-update"
PKG_MGR_INST="${SUDO} ${PKG_MGR} install -y"
}
determine_os() {
unset OS
local UNAME="$(uname)"
if test "${UNAME}" == 'Linux'; then
# shellcheck disable=SC1091
source /etc/os-release
OS="${UNAME}-${ID_LIKE}"
elif test "${UNAME}" == 'Darwin'; then
OS="${UNAME}"
else
echo_exit "Unable to determine OS for ${UNAME}"
fi
export OS
OS="${OS,,}"
OS="${OS//-/_}"
if test "$(jq -r ".target_windows" "$COMPILE_CFG")" == 'true'; then
echo_info "targeting windows"
export TARGET_WINDOWS=1
OS+="_windows"
fi
return 0
}
determine_pkg_mgr() {
unset PKG_MGR PKG_MGR_UPD PKG_MGR_INST
determine_"${OS}"_pkg_mgr
return 0
}
check_for_req_pkgs() {
echo_info "OS=${OS}"
echo_info "checking for required packages"
local common_pkgs=(
autoconf automake cmake libtool
texinfo wget nasm yasm python3
meson doxygen jq ccache gawk
)
# shellcheck disable=SC2034
local brew_pkgs=(
"${common_pkgs[@]}" pkgconf
mkvtoolnix pipx
)
local common_linux_pkgs=(
"${common_pkgs[@]}" clang valgrind
curl bc lshw xxd pkgconf
)
# shellcheck disable=SC2034
local apt_get_pkgs=(
"${common_linux_pkgs[@]}" build-essential
git-core libass-dev libfreetype6-dev
libsdl2-dev libva-dev libvdpau-dev
libvorbis-dev libxcb1-dev pipx
libxcb-shm0-dev libxcb-xfixes0-dev
zlib1g-dev libssl-dev ninja-build
gobjc++ mawk libnuma-dev
mediainfo mkvtoolnix libgtest-dev
)
# shellcheck disable=SC2034
local pacman_pkgs=(
"${common_linux_pkgs[@]}" base-devel
python-pipx ninja
)
# shellcheck disable=SC2034
local dnf_pkgs=(
"${common_linux_pkgs[@]}" openssl-devel
pipx ninja-build
)
if [[ "${TARGET_WINDOWS}" -eq 1 ]]; then
apt_get_pkgs+=(gcc-mingw-w64 g++-mingw-w64)
fi
local req_pkgs_env_name="${PKG_MGR/-/_}_pkgs"
declare -n req_pkgs="${req_pkgs_env_name}"
local missing_pkgs=()
for pkg in "${req_pkgs[@]}"; do
check_pkg_exists "${pkg}" || missing_pkgs+=("${pkg}")
done
if ! test "${#missing_pkgs}" -eq 0; then
echo_warn "missing packages:" "${missing_pkgs[@]}"
# shellcheck disable=SC2086
${PKG_MGR_UPD}
# shellcheck disable=SC2086
${PKG_MGR_INST} "${missing_pkgs[@]}" || return 1
fi
echo_pass "packages from ${PKG_MGR} installed"
echo_if_fail pipx install virtualenv || return 1
echo_if_fail pipx ensurepath || return 1
echo_pass "pipx is installed"
# shellcheck disable=SC1091
test -f "${HOME}/.cargo/env" && source "${HOME}/.cargo/env"
if ! command -v cargo >/dev/null; then
echo_warn "missing cargo"
if ! command -v rustup >/dev/null; then
echo_warn "missing rustup"
echo_warn "installing rustup"
curl https://sh.rustup.rs -sSf | sh -s -- -y
# shellcheck disable=SC2016
grep -q 'source "${HOME}/.cargo/env"' "${HOME}/.bashrc" || \
echo 'source "${HOME}/.cargo/env"' >> "${HOME}/.bashrc"
# shellcheck disable=SC1091
source "${HOME}/.bashrc"
fi
fi
echo_if_fail rustup default stable
echo_if_fail rustup update stable
echo_pass "rustup is installed"
echo_if_fail cargo install cargo-c || return 1
echo_pass "cargo-c is installed"
echo_pass "all required packages installed"
return 0
}
FB_FUNC_NAMES+=('install_deps')
FB_FUNC_DESCS['install_deps']='install required dependencies'
install_deps() {
unset SUDO
test "$(id -u)" -eq 0 || SUDO=sudo
determine_pkg_mgr || return 1
check_for_req_pkgs || return 1
}

1
scripts/install_deps.sh Symbolic link
View File

@@ -0,0 +1 @@
entry.sh

1
scripts/print_cmds.sh Symbolic link
View File

@@ -0,0 +1 @@
entry.sh