diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 79bd19b..0000000 --- a/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -gitignore* diff --git a/lib/build.sh b/lib/build.sh index 218da8f..1a0461a 100644 --- a/lib/build.sh +++ b/lib/build.sh @@ -6,7 +6,8 @@ set_compile_opts() { unset LDFLAGS C_FLAGS CXX_FLAGS CPP_FLAGS \ CONFIGURE_FLAGS MESON_FLAGS \ RUSTFLAGS CMAKE_FLAGS \ - FFMPEG_EXTRA_FLAGS + FFMPEG_EXTRA_FLAGS \ + CARGO_FLAGS CARGO_CINSTALL_FLAGS export LDFLAGS C_FLAGS CXX_FLAGS CPP_FLAGS \ CONFIGURE_FLAGS MESON_FLAGS \ RUSTFLAGS CMAKE_FLAGS \ @@ -14,22 +15,29 @@ set_compile_opts() { # set job count for all builds JOBS="$(nproc)" - - mapfile -t pkgconfigDirs < <(find "${PREFIX}" -type d -name pkgconfig) - for d in "${pkgconfigDirs[@]}"; do - if [[ ${d} =~ '64' ]]; then - MACHINE_LIB="${d}" - fi - done - test "${MACHINE_LIB}" == '' && return 1 - pkgconfigString="${pkgconfigDirs[*]}" - PKG_CONFIG_PATH="${pkgconfigString// /:}" + # set library/pkgconfig directory + LIBDIR="${PREFIX}/lib" # set prefix flags - CONFIGURE_FLAGS+=("--prefix=${PREFIX}") - MESON_FLAGS+=("--prefix" "${PREFIX}") - CMAKE_FLAGS+=("-DCMAKE_PREFIX_PATH=${PREFIX}") - CMAKE_FLAGS+=("-DCMAKE_INSTALL_PREFIX=${PREFIX}") + CONFIGURE_FLAGS+=( + "--prefix=${PREFIX}" + "--libdir=${LIBDIR}" + ) + MESON_FLAGS+=( + "--prefix" "${PREFIX}" + "--libdir" "lib" + "--bindir" "bin" + ) + CMAKE_FLAGS+=( + "-DCMAKE_PREFIX_PATH=${PREFIX}" + "-DCMAKE_INSTALL_PREFIX=${PREFIX}" + "-DCMAKE_INSTALL_LIBDIR=lib" + ) + CARGO_CINSTALL_FLAGS=( + "--prefix" "${PREFIX}" + "--libdir" "${LIBDIR}" + ) + PKG_CONFIG_PATH="${LIBDIR}/pkgconfig" export PKG_CONFIG_PATH export PKG_CONFIG_DEBUG_SPEW=1 @@ -48,13 +56,17 @@ set_compile_opts() { CONFIGURE_FLAGS+=('--enable-lto') MESON_FLAGS+=("-Db_lto=true") RUSTFLAGS+=("-C lto=yes" "-C inline-threshold=1000" "-C codegen-units=1") + CARGO_BUILD_TYPE=release + CARGO_FLAGS+=("--${CARGO_BUILD_TYPE}") else echo_info "building without LTO" LTO_SWITCH='OFF' LTO_FLAG='' MESON_FLAGS+=("-Db_lto=false") RUSTFLAGS+=("-C lto=no") + CARGO_BUILD_TYPE=debug fi + CARGO_CINSTALL_FLAGS+=("--${CARGO_BUILD_TYPE}") # setting optimization level if [[ ${OPT_LVL} == '' ]]; then @@ -77,10 +89,10 @@ set_compile_opts() { PKG_CFG_FLAGS='--static' LIB_SUFF='a' else - LDFLAGS+=("-Wl,-rpath,${MACHINE_LIB}") + LDFLAGS+=("-Wl,-rpath,${LIBDIR}") CONFIGURE_FLAGS+=('--enable-shared') CMAKE_FLAGS+=("-DBUILD_SHARED_LIBS=ON") - CMAKE_FLAGS+=("-DCMAKE_INSTALL_RPATH=${PREFIX}/lib;${MACHINE_LIB}") + CMAKE_FLAGS+=("-DCMAKE_INSTALL_RPATH=${LIBDIR}") FFMPEG_EXTRA_FLAGS+=('--enable-rpath') LIB_SUFF='so' fi @@ -111,6 +123,7 @@ set_compile_opts() { dump_arr CMAKE_FLAGS dump_arr MESON_FLAGS dump_arr PKG_CFG_FLAGS + dump_arr CARGO_CINSTALL_FLAGS # extra ffmpeg flags FFMPEG_EXTRA_FLAGS+=( @@ -130,12 +143,12 @@ set_compile_opts() { test -d "${CARGO_HOME}" || echo_exit "CARGO_HOME does not exist" export RUSTUP_HOME CARGO_HOME - # cargo does not have an easy way to install into system directories unset SUDO_CARGO - if [[ ${SUDO} != '' ]]; then - export SUDO_CARGO="${SUDO} --preserve-env=PATH,RUSTUP_HOME,CARGO_HOME" + if [[ ${SUDO_MODIFY} == '' ]]; then + SUDO_CARGO='' + else + SUDO_CARGO="${SUDO} --preserve-env=PATH,RUSTUP_HOME,CARGO_HOME" fi - echo FB_COMPILE_OPTS_SET=1 } @@ -289,13 +302,16 @@ build() { test -d "${BUILD_DIR}" || mkdir -p "${BUILD_DIR}" test -d "${PREFIX}/bin/" || mkdir -p "${PREFIX}/bin/" + # check if we need to install with sudo + unset SUDO_MODIFY testfile="${PREFIX}/ffmpeg-build-testfile" - if ! touch "${testfile}" 2>/dev/null; then - # we cannot modify the install prefix - # so we need to use sudo - ${SUDO} mkdir -p "${PREFIX}/bin/" + if touch "${testfile}" 2>/dev/null; then + SUDO_MODIFY='' + else + SUDO_MODIFY="${SUDO}" + ${SUDO_MODIFY} mkdir -p "${PREFIX}/bin/" fi - test -f "${testfile}" && ${SUDO} rm "${testfile}" + test -f "${testfile}" && ${SUDO_MODIFY} rm "${testfile}" for build in "${FFMPEG_ENABLES[@]}"; do do_build "${build}" || return 1 @@ -305,26 +321,41 @@ build() { return 0 } +### RUST ### build_hdr10plus_tool() { - cargo build --release || return 1 - ${SUDO} cp target/release/hdr10plus_tool "${PREFIX}/bin/" || return 1 + cargo build "${CARGO_FLAGS[@]}" || return 1 + ${SUDO_MODIFY} cp \ + "target/${CARGO_BUILD_TYPE}/hdr10plus_tool" \ + "${PREFIX}/bin/" || return 1 # build libhdr10plus cd hdr10plus || return 1 - cargo cbuild --release || return 1 - ${SUDO_CARGO} bash -lc "cargo cinstall --prefix=${PREFIX} --release" || return 1 + cargo cbuild "${CARGO_FLAGS[@]}" || return 1 + ${SUDO_CARGO} bash -lc "cargo cinstall ${CARGO_CINSTALL_FLAGS[*]}" || return 1 } - build_dovi_tool() { - cargo build --release || return 1 - ${SUDO} cp target/release/dovi_tool "${PREFIX}/bin/" || return 1 + cargo build "${CARGO_FLAGS[@]}" || return 1 + ${SUDO_MODIFY} cp \ + "target/${CARGO_BUILD_TYPE}/dovi_tool" \ + "${PREFIX}/bin/" || return 1 # build libdovi cd dolby_vision || return 1 - cargo cbuild --release || return 1 - ${SUDO_CARGO} bash -lc "cargo cinstall --prefix=${PREFIX} --release" || return 1 + cargo cbuild "${CARGO_FLAGS[@]}" || return 1 + ${SUDO_CARGO} bash -lc "cargo cinstall ${CARGO_CINSTALL_FLAGS[*]}" || return 1 +} +build_librav1e() { + cargo build "${CARGO_FLAGS[@]}" || return 1 + ${SUDO_MODIFY} cp \ + "target/${CARGO_BUILD_TYPE}/rav1e" \ + "${PREFIX}/bin/" || return 1 + + # build librav1e + cargo cbuild "${CARGO_FLAGS[@]}" || return 1 + ${SUDO_CARGO} bash -lc "cargo cinstall ${CARGO_CINSTALL_FLAGS[*]}" || return 1 } +### CMAKE ### build_libsvtav1() { cmake \ "${CMAKE_FLAGS[@]}" \ @@ -333,9 +364,8 @@ build_libsvtav1() { -DBUILD_TESTING=OFF \ -DCOVERAGE=OFF || return 1 ccache make -j"${JOBS}" || return 1 - ${SUDO} make -j"${JOBS}" install || return 1 + ${SUDO_MODIFY} make -j"${JOBS}" install || return 1 } - build_libsvtav1_psy() { local hdr10pluslib="$(find "${PREFIX}" -type f -name "libhdr10plus-rs.${LIB_SUFF}")" local dovilib="$(find "${PREFIX}" -type f -name "libdovi.${LIB_SUFF}")" @@ -351,17 +381,8 @@ build_libsvtav1_psy() { -DLIBDOVI_LIBRARY="${dovilib}" \ . || return 1 ccache make -j"${JOBS}" || return 1 - ${SUDO} make -j"${JOBS}" install || return 1 + ${SUDO_MODIFY} make -j"${JOBS}" install || return 1 } - -build_librav1e() { - cargo build --release || return 1 - ${SUDO} cp target/release/rav1e "${PREFIX}/bin/" || return 1 - - cargo cbuild --release || return 1 - ${SUDO_CARGO} bash -lc "cargo cinstall --prefix=${PREFIX} --release" || return 1 -} - build_libaom() { cmake \ "${CMAKE_FLAGS[@]}" \ @@ -369,26 +390,17 @@ build_libaom() { -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 + ${SUDO_MODIFY} make -j"${JOBS}" install || return 1 } +### MESON ### 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 + ${SUDO_MODIFY} ninja -vC build.user install || return 1 } - build_libvmaf() { cd libvmaf || return 1 python3 -m virtualenv .venv @@ -399,10 +411,19 @@ build_libvmaf() { "${MESON_FLAGS[@]}" \ -Denable_float=true || exit 1 ccache ninja -vC build.user || exit 1 - ${SUDO} ninja -vC build.user install || exit 1 + ${SUDO_MODIFY} ninja -vC build.user install || exit 1 ) || return 1 } +### AUTOTOOLS ### +build_libopus() { + ./configure \ + "${CONFIGURE_FLAGS[@]}" \ + --disable-doc || return 1 + ccache make -j"${JOBS}" || return 1 + ${SUDO_MODIFY} make -j"${JOBS}" install || return 1 + return 0 +} build_ffmpeg() { for enable in "${FFMPEG_ENABLES[@]}"; do test "${enable}" == 'libsvtav1_psy' && enable='libsvtav1' @@ -421,6 +442,6 @@ build_ffmpeg() { --disable-txtpages \ --disable-autodetect || return 1 ccache make -j"${JOBS}" || return 1 - ${SUDO} make -j"${JOBS}" install || return 1 + ${SUDO_MODIFY} make -j"${JOBS}" install || return 1 return 0 } diff --git a/lib/docker.sh b/lib/docker.sh index 83fd045..fb983ac 100644 --- a/lib/docker.sh +++ b/lib/docker.sh @@ -6,6 +6,14 @@ VALID_DOCKER_IMAGES=( 'debian-12' 'archlinux-latest' ) +DOCKER_WORKDIR='/workdir' +DOCKER_RUN_FLAGS=( + --rm + -v "${REPO_DIR}:${DOCKER_WORKDIR}" + -w "${DOCKER_WORKDIR}" + -u "$(id -u):$(id -g)" + -e "DEBUG=${DEBUG}" +) check_docker() { if missing_cmd docker; then @@ -39,6 +47,7 @@ echo_platform() { echo "${platKernel}/${platCpu}" } +# sets DISTROS validate_selected_image() { local selectedImage="${1:-}" for distro in "${VALID_DOCKER_IMAGES[@]}"; do @@ -78,10 +87,8 @@ docker_build_image() { # specific file for evaluated package manager info distroPkgMgr="${DOCKER_DIR}/${distro}-pkg_mgr" # get package manager info - docker run --rm \ - --platform "$(echo_platform)" \ - -v "${REPO_DIR}":/workdir \ - -w /workdir \ + docker run \ + "${DOCKER_RUN_FLAGS[@]}" \ "${dockerDistro}" \ bash -c "./scripts/print_pkg_mgr.sh" | tr -d '\r' >"${distroPkgMgr}" # shellcheck disable=SC1090 @@ -103,6 +110,7 @@ docker_build_image() { echo 'ENV PATH="~/.cargo/bin:$PATH"' echo 'RUN rustup default stable && rustup update stable' echo 'RUN cargo install cargo-c' + echo "WORKDIR ${DOCKER_WORKDIR}" } >"${dockerfile}" @@ -178,10 +186,8 @@ docker_run_image() { fi echo_info "running ffmpeg build for ${image_tag}" - docker run --rm \ - -v "${REPO_DIR}":/workdir \ - -w /workdir \ - -e DEBUG="${DEBUG}" \ + docker run \ + "${DOCKER_RUN_FLAGS[@]}" \ "${image_tag}" \ ./scripts/build.sh || return 1 done @@ -194,10 +200,24 @@ docker_build_multiarch_image() { validate_selected_image "$@" || return 1 check_docker || return 1 PLATFORM='linux/amd64,linux/arm64' - docker buildx create \ - --use \ - --platform="${PLATFORM}" \ - --name my-multiplatform-builder \ - --driver=docker-container + + # check if we need to create multiplatform builder + local buildxPlats="$(docker buildx inspect | grep Platforms)" + IFS=',' + local createBuilder=0 + for plat in $PLATFORM; do + grep -q "${plat}" <<<"${buildxPlats}" || createBuilder=1 + done + unset IFS + + if [[ ${createBuilder} == 1 ]]; then + echo_info "creating multiplatform (${PLATFORM}) docker builder" + docker buildx create \ + --use \ + --platform="${PLATFORM}" \ + --name my-multiplatform-builder \ + --driver=docker-container + fi + docker_build_image "$@" } diff --git a/lib/install_deps.sh b/lib/install_deps.sh index 913c619..33d43ae 100644 --- a/lib/install_deps.sh +++ b/lib/install_deps.sh @@ -52,7 +52,7 @@ print_req_pkgs() { ) local common_linux_pkgs=( "${common_pkgs[@]}" clang valgrind - curl bc lshw xxd pkgconf + curl bc lshw xxd pkgconf sudo ) # shellcheck disable=SC2034 local apt_get_pkgs=(