diff --git a/Jenkinsfile b/Jenkinsfile index 7067b07..82ea6bd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,11 +1,23 @@ pipeline { - agent any // Specifies that the pipeline can run on any available agent - + agent none stages { - stage('Hello') { // Defines a stage named 'Hello' - steps { - echo 'Hello World!' // Prints "Hello World!" to the console + stage('Build Matrix') { + matrix { + agent { label "linux" } + axes { + axis { + name 'DISTRO' + values 'debian', 'ubuntu', 'archlinux', 'fedora' + } + } + stages { + stage('Build') { + steps { + echo "Do Build for ${DISTRO}" + } + } + } } } } -} \ No newline at end of file +} diff --git a/lib/build.sh b/lib/build.sh index 1a4c238..148db93 100644 --- a/lib/build.sh +++ b/lib/build.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash set_compile_opts() { + test "$FB_COMPILE_OPTS_SET" == 0 && return 0 + unset LDFLAGS C_FLAGS CXX_FLAGS CPP_FLAGS \ CONFIGURE_FLAGS MESON_FLAGS \ RUSTFLAGS CMAKE_FLAGS \ @@ -137,6 +139,8 @@ set_compile_opts() { export SUDO_CARGO="${SUDO} --preserve-env=PATH,RUSTUP_HOME,CARGO_HOME" fi echo + + FB_COMPILE_OPTS_SET=1 } get_build_conf() { @@ -255,6 +259,7 @@ do_build() { local build="${1:-''}" download_release "${build}" || return 1 get_build_conf "${build}" || return 1 + set_compile_opts || return 1 for dep in "${deps[@]}"; do do_build "${dep}" || return 1 done diff --git a/lib/common.sh b/lib/common.sh index eef3c1b..a135667 100644 --- a/lib/common.sh +++ b/lib/common.sh @@ -123,7 +123,3 @@ bash_basename() { printf '%s\n' "${tmp:-/}" } - -fb_running_as_script() { - return "$FB_RUNNING_AS_SCRIPT" -} diff --git a/lib/docker.sh b/lib/docker.sh old mode 100755 new mode 100644 index e2ebc4a..86732fa --- a/lib/docker.sh +++ b/lib/docker.sh @@ -1,26 +1,90 @@ #!/usr/bin/env bash +# shellcheck disable=SC2154 FB_FUNC_NAMES+=('docker_build_images') # FB_FUNC_DESCS used externally # shellcheck disable=SC2034 FB_FUNC_DESCS['docker_build_images']='build docker images with required dependencies pre-installed' docker_build_images() { - DISTROS=(debian ubuntu archlinux fedora) + DISTROS=('debian:bookworm' 'ubuntu:24.04' 'archlinux:latest' 'fedora:42') + # DISTROS=('debian:bookworm') DOCKERFILE_DIR="${IGN_DIR}/Dockerfiles" - test -d "${DOCKERFILE_DIR}" || mkdir -p "${DOCKERFILE_DIR}" + test -d "${DOCKERFILE_DIR}" && rm -rf "${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 "source package manager for ${image_tag}" + + # distro without problematic characters + distroFmt="${distro//:/-}" + # specific file for evaluated package manager info + distroFmtPkgMgr="${DOCKERFILE_DIR}/${distroFmt}-pkg_mgr" + # get package manager info + docker run --rm -it \ + -v "${REPO_DIR}":/workdir \ + -w /workdir \ + "${distro}" \ + bash -c "./scripts/print_pkg_mgr.sh" | tr -d '\r' >"${distroFmtPkgMgr}" + # shellcheck disable=SC1090 + source "${distroFmtPkgMgr}" + + dockerfile="${DOCKERFILE_DIR}/Dockerfile_${distroFmt}" + { + echo "FROM ${distro}" + echo 'SHELL ["/bin/bash", "-c"]' + echo "RUN ${pkg_mgr_update} && ${pkg_mgr_upgrade}" + echo "RUN ${pkg_install} ${req_pkgs}" + } >"${dockerfile}" + echo_info "building ${image_tag}" docker build \ -t "${image_tag}" \ - -f "${DOCKERFILE_DIR}/${dockerfile}" \ - "${REPO_DIR}/" + -f "${dockerfile}" \ + . + done +} + +# shellcheck disable=SC2154 +FB_FUNC_NAMES+=('docker_run_image') +# FB_FUNC_DESCS used externally +# shellcheck disable=SC2034 +FB_FUNC_DESCS['docker_run_image']='run docker images to build ffmpeg' +docker_run_image() { + DISTROS=('debian:bookworm' 'ubuntu:24.04' 'archlinux:latest' 'fedora:42') + # DISTROS=('debian:bookworm') + DOCKERFILE_DIR="${IGN_DIR}/Dockerfiles" + test -d "${DOCKERFILE_DIR}" && rm -rf "${DOCKERFILE_DIR}" + mkdir -p "${DOCKERFILE_DIR}" + for distro in "${DISTROS[@]}"; do + image_tag="ffmpeg_builder_${distro}" + echo_info "source package manager for ${image_tag}" + + # distro without problematic characters + distroFmt="${distro//:/-}" + # specific file for evaluated package manager info + distroFmtPkgMgr="${DOCKERFILE_DIR}/${distroFmt}-pkg_mgr" + # get package manager info + docker run --rm -it \ + -v "${REPO_DIR}":/workdir \ + -w /workdir \ + "${distro}" \ + bash -c "./scripts/print_pkg_mgr.sh" | tr -d '\r' >"${distroFmtPkgMgr}" + # shellcheck disable=SC1090 + source "${distroFmtPkgMgr}" + cat "${distroFmtPkgMgr}" + + dockerfile="${DOCKERFILE_DIR}/Dockerfile_${distroFmt}" + { + echo "FROM ${distro}" + echo 'SHELL ["/bin/bash", "-c"]' + echo "RUN ${pkg_mgr_update} && ${pkg_mgr_upgrade}" + echo "RUN ${pkg_install} ${req_pkgs}" + } >"${dockerfile}" + + echo_info "building ${image_tag}" + docker build \ + -t "${image_tag}" \ + -f "${dockerfile}" \ + . done } diff --git a/lib/install_deps.sh b/lib/install_deps.sh index 2c9fa71..2e3d02e 100644 --- a/lib/install_deps.sh +++ b/lib/install_deps.sh @@ -1,23 +1,24 @@ #!/usr/bin/env bash +# shellcheck disable=SC2120 determine_pkg_mgr() { # sudo used externally # shellcheck disable=SC2034 - test "$(id -u)" -eq 0 && SUDO='' || SUDO=sudo + test "$(id -u)" -eq 0 && SUDO='' || SUDO='sudo ' - # pkg-mgr update-cmd install-cmd check-cmd + # pkg-mgr update-cmd upgrade-cmd install-cmd check-cmd # shellcheck disable=SC2016 local PKG_MGR_MAP=' -brew:brew update:brew install:brew list --formula ${pkg} -apt-get:${SUDO} apt-get update: ${SUDO} apt-get install -y:dpkg -l ${pkg} -pacman:${SUDO} pacman -Syy:${SUDO} pacman -S --noconfirm --needed:pacman -Qi ${pkg} -dnf:${SUDO} dnf check-update:${SUDO} dnf install -y:dnf list -q --installed ${pkg} +brew:brew update:brew upgrade:brew install:brew list --formula ${pkg} +apt-get:${SUDO}apt-get update:${SUDO}apt-get upgrade -y:${SUDO}apt-get install -y:dpkg -l ${pkg} +pacman:${SUDO}pacman -Syy:${SUDO}pacman -Syu --noconfirm:${SUDO}pacman -S --noconfirm --needed:pacman -Qi ${pkg} +dnf:${SUDO}dnf check-update || true:${SUDO}dnf upgrade --refresh -y:${SUDO}dnf install -y:dnf list -q --installed ${pkg} ' local supported_pkg_mgr=() - unset pkg_mgr pkg_mgr_update pkg_install pkg_check + unset pkg_mgr pkg_mgr_update pkg_mgr_upgrade pkg_install pkg_check while read -r line; do test "${line}" == '' && continue - IFS=':' read -r pkg_mgr pkg_mgr_update pkg_install pkg_check <<<"${line}" + IFS=':' read -r pkg_mgr pkg_mgr_update pkg_mgr_upgrade pkg_install pkg_check <<<"${line}" supported_pkg_mgr+=("${pkg_mgr}") if ! has_cmd "${pkg_mgr}"; then pkg_mgr='' @@ -25,6 +26,7 @@ dnf:${SUDO} dnf check-update:${SUDO} dnf install -y:dnf list -q --installed ${pk fi # update/install may use SUDO eval "pkg_mgr_update=\"${pkg_mgr_update}\"" + eval "pkg_mgr_upgrade=\"${pkg_mgr_upgrade}\"" eval "pkg_install=\"${pkg_install}\"" break done <<<"${PKG_MGR_MAP}" @@ -37,8 +39,7 @@ dnf:${SUDO} dnf check-update:${SUDO} dnf install -y:dnf list -q --installed ${pk return 0 } -check_for_req_pkgs() { - echo_info "checking for required packages" +print_req_pkgs() { local common_pkgs=( autoconf automake cmake libtool texinfo nasm yasm python3 @@ -77,8 +78,27 @@ check_for_req_pkgs() { local req_pkgs_env_name="${pkg_mgr/-/_}_pkgs" declare -n req_pkgs="${req_pkgs_env_name}" + echo "${req_pkgs[@]}" +} + +FB_FUNC_NAMES+=('print_pkg_mgr') +# FB_FUNC_DESCS used externally +# shellcheck disable=SC2034 +FB_FUNC_DESCS['print_pkg_mgr']='print out evaluated package manager commands and required packages' +print_pkg_mgr() { + determine_pkg_mgr || return 1 + echo "export pkg_mgr=\"${pkg_mgr}\"" + echo "export pkg_mgr_update=\"${pkg_mgr_update}\"" + echo "export pkg_mgr_upgrade=\"${pkg_mgr_upgrade}\"" + echo "export pkg_install=\"${pkg_install}\"" + echo "export pkg_check=\"${pkg_check}\"" + echo "export req_pkgs=\"$(print_req_pkgs)\"" +} + +check_for_req_pkgs() { + echo_info "checking for required packages" local missing_pkgs=() - for pkg in "${req_pkgs[@]}"; do + for pkg in $(print_req_pkgs); do # pkg_check has ${pkg} unexpanded eval "pkg_check=\"${pkg_check}\"" ${pkg_check} "${pkg}" >/dev/null 2>&1 || missing_pkgs+=("${pkg}") diff --git a/main.sh b/main.sh index 375508d..17e5bf6 100755 --- a/main.sh +++ b/main.sh @@ -1,6 +1,13 @@ #!/usr/bin/env bash -REPO_DIR="$(cd "${BASH_SOURCE[0]//'main.sh'/}" && echo "$PWD")" +# set top dir +relativeRepoRoot="${BASH_SOURCE[0]//'main.sh'/}" +if [[ -d ${relativeRepoRoot} ]]; then + preloadCmd="cd ${relativeRepoRoot} &&" +fi +REPO_DIR="$(${preloadCmd} echo "$PWD")" +unset relativeRepoRoot preloadCmd + IGN_DIR="${REPO_DIR}/gitignore" TMP_DIR="${IGN_DIR}/tmp" DL_DIR="${IGN_DIR}/downloads" @@ -9,28 +16,28 @@ CCACHE_DIR="${IGN_DIR}/ccache" export REPO_DIR IGN_DIR TMP_DIR DL_DIR BUILD_DIR CCACHE_DIR # function names, descriptions, completions +unset FB_FUNC_NAMES FB_FUNC_DESCS FB_FUNC_COMPLETION FB_FUNC_NAMES=() -declare -A FB_FUNC_DESCS -declare -A FB_FUNC_COMPLETION +declare -A FB_FUNC_DESCS FB_FUNC_COMPLETION # can't have recursive generation FB_RUNNING_AS_SCRIPT=${FB_RUNNING_AS_SCRIPT:-0} -# no undefined variables -set -u +# shellcheck disable=SC2034 +FB_COMPILE_OPTS_SET=0 SCRIPT_DIR="${REPO_DIR}/scripts" ENTRY_SCRIPT="${SCRIPT_DIR}/entry.sh" src_scripts() { local SCRIPT_DIR="${REPO_DIR}/scripts" - rm "${SCRIPT_DIR}"*.sh if [[ $FB_RUNNING_AS_SCRIPT -eq 0 ]]; then + rm "${SCRIPT_DIR}"/*.sh # shellcheck disable=SC2016 echo '#!/usr/bin/env bash cd "$(dirname "$(readlink -f $0)")/.." +export FB_RUNNING_AS_SCRIPT=1 . main.sh -FB_RUNNING_AS_SCRIPT=1 scr_name="$(bash_basename $0)" cmd="${scr_name//.sh}" $cmd $@' >"${ENTRY_SCRIPT}" @@ -49,21 +56,21 @@ print_cmds() { echo -e "\n~~~ Usable Commands ~~~" for funcname in "${FB_FUNC_NAMES[@]}"; do echo -e "${CYAN}${funcname}${NC}:\n\t" "${FB_FUNC_DESCS[${funcname}]}" - fb_running_as_script || (cd "$SCRIPT_DIR" && ln -sf entry.sh "${funcname}.sh") + if [[ $FB_RUNNING_AS_SCRIPT -eq 0 ]]; then + (cd "$SCRIPT_DIR" && ln -sf entry.sh "${funcname}.sh") + fi done echo -e "~~~~~~~~~~~~~~~~~~~~~~~\n" } set_completions() { - set +u for funcname in "${FB_FUNC_NAMES[@]}"; do complete -W "${FB_FUNC_COMPLETION[${funcname}]}" "${funcname}" done - set -u } # shellcheck disable=SC1091 -source "${HOME}/.bashrc" +test -f "${HOME}/.bashrc" && source "${HOME}/.bashrc" src_scripts || return 1 determine_pkg_mgr || return 1 @@ -71,6 +78,7 @@ determine_pkg_mgr || return 1 # shellcheck disable=SC2154 test "${PREFIX}" == '' && PREFIX="${IGN_DIR}/${pkg_mgr}_sysroot" -set_compile_opts || return 1 -fb_running_as_script || print_cmds || return 1 +if [[ $FB_RUNNING_AS_SCRIPT -eq 0 ]]; then + print_cmds || return 1 +fi set_completions || return 1 diff --git a/scripts/build_docker_images.sh b/scripts/docker_run_image.sh similarity index 100% rename from scripts/build_docker_images.sh rename to scripts/docker_run_image.sh diff --git a/scripts/entry.sh b/scripts/entry.sh index 21a12bd..fe323d9 100755 --- a/scripts/entry.sh +++ b/scripts/entry.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash cd "$(dirname "$(readlink -f $0)")/.." +export FB_RUNNING_AS_SCRIPT=1 . main.sh -FB_RUNNING_AS_SCRIPT=1 scr_name="$(bash_basename $0)" cmd="${scr_name//.sh/}" $cmd $@ diff --git a/scripts/print_pkg_mgr.sh b/scripts/print_pkg_mgr.sh new file mode 120000 index 0000000..44b7711 --- /dev/null +++ b/scripts/print_pkg_mgr.sh @@ -0,0 +1 @@ +entry.sh \ No newline at end of file