#!/bin/bash set -e source /ci/common.sh # We divide the package list into 'pkgs_stable' and 'pkgs_latest'. The trade-off # is that latest stuff may not have a binpkg available, but of course we get # better test coverage with the bleeding edge then. pkgs_stable=( app-portage/portage-utils dev-build/cmake dev-vcs/git # language support dev-python/cython dev-python/lxml dev-python/pip virtual/fortran dev-lang/nasm dev-lang/vala dev-lang/python:2.7 dev-java/openjdk-bin dev-util/bindgen dev-libs/elfutils dev-libs/protobuf # modules dev-util/gdbus-codegen dev-util/glib-utils dev-libs/gobject-introspection dev-util/itstool dev-util/wayland-scanner dev-libs/wayland-protocols dev-libs/wayland # custom deps dev-libs/boost net-libs/libpcap dev-util/gtk-doc media-libs/libwmf sys-cluster/openmpi sci-libs/netcdf media-libs/libsdl2 dev-cpp/gtest sci-libs/hdf5 dev-qt/linguist-tools dev-qt/qtwidgets:5 llvm-core/llvm dev-qt/qtdeclarative:6 dev-qt/qttools net-print/cups dev-util/vulkan-headers media-libs/vulkan-loader # misc app-admin/sudo app-text/doxygen sys-devel/bison sys-devel/reflex sys-devel/gettext # needed by vala x11-libs/gtk+ # TODO: vulkan-validation-layers # TODO: cuda #dev-cpp/gtkmm:3.0 #dev-java/openjdk-bin:8 #dev-lang/go #dev-lang/mono #dev-lang/python #dev-lang/rust-bin #dev-libs/wayland #dev-libs/wayland-protocols #dev-python/pypy3 #dev-vcs/mercurial #gnustep-base/gnustep-base #media-gfx/graphviz #sci-libs/netcdf-fortran #llvm-core/clang #x11-libs/gtk+:3 ) pkgs_latest=( dev-build/autoconf dev-build/automake # ~arch only sci-libs/scalapack ) pkgs=( "${pkgs_stable[@]}" "${pkgs_latest[@]}" ) emerge-webrsync --quiet # This means we can't really take advantage of the binhost but a lot of the # advantages of using Gentoo in CI come from the bleeding edge side. # With full ~arch, we don't get binpkgs for much at all. Instead, let's just # do ~arch for the test deps we have. #echo 'ACCEPT_KEYWORDS="~amd64"' >> /etc/portage/make.conf printf "%s\n" ${pkgs[@]} >> /var/lib/portage/world printf "%s\n" ${pkgs_latest[@]} >> /etc/portage/package.accept_keywords/meson cat /etc/portage/package.accept_keywords/meson cat <<-EOF > /etc/portage/package.accept_keywords/misc dev-lang/python EOF mkdir /etc/portage/binrepos.conf || true mkdir /etc/portage/profile || true cat <<-EOF > /etc/portage/package.use/ci dev-cpp/gtkmm X media-libs/libglvnd X media-libs/freetype harfbuzz x11-libs/cairo X x11-libs/libxkbcommon X dev-lang/rust clippy rustfmt dev-lang/rust-bin clippy rustfmt dev-libs/boost python sci-libs/hdf5 cxx # slimmed binpkg, nomesa media-libs/libsdl2 -opengl -wayland -alsa -dbus -gles2 -udev -vulkan # Some of these settings are needed just to get the binpkg but # aren't negative to have anyway sys-devel/gcc ada d jit >=sys-devel/gcc-13 ada objc objc++ sys-devel/gcc pgo lto sys-libs/zlib static-libs EOF cat <<-EOF >> /etc/portage/make.conf EMERGE_DEFAULT_OPTS="--complete-graph --quiet=y --quiet-build=y --jobs=$(nproc) --load-average=$(nproc)" EMERGE_DEFAULT_OPTS="\${EMERGE_DEFAULT_OPTS} --autounmask-write --autounmask-continue --autounmask-keep-keywords=y --autounmask-use=y" EMERGE_DEFAULT_OPTS="\${EMERGE_DEFAULT_OPTS} --binpkg-respect-use=y" # prevent painfully verbose Github Actions logs. FETCHCOMMAND='wget --no-show-progress -t 3 -T 60 --passive-ftp -O "\\\${DISTDIR}/\\\${FILE}" "\\\${URI}"' # Fortran is no longer enabled by default in 23.0, but we do need and use it. USE="\${USE} fortran" FEATURES="\${FEATURES} parallel-fetch parallel-install -merge-sync" FEATURES="\${FEATURES} getbinpkg binpkg-request-signature" # These don't work in Docker, so reduce noise in logs FEATURES="\${FEATURES} -ipc-sandbox -network-sandbox -pid-sandbox" EOF # Maybe we could enable all Pythons / add multiple jobs with diff. Python impls? #echo '*/* PYTHON_TARGETS: python3_10 python3_11 python3_12' >> /etc/portage/package.use/python # The below is for cases where we want non-default Python (either to get # better coverage from something older, or something newer) #echo '*/* PYTHON_TARGETS: python3_12' >> /etc/portage/package.use/python #cat <<-EOF >> /etc/portage/profile/use.mask #-python_targets_python3_12 #-python_single_target_python3_12 #EOF #cat <<-EOF >> /etc/portage/profile/use.stable.mask #-python_targets_python3_12 #-python_single_target_python3_12 #EOF echo 'dev-lang/python ensurepip' >> /etc/portage/package.use/python # Silly mono circular dep #USE=minimal emerge --oneshot dev-lang/mono # If we don't want to do this, we could use the 'portage' container instead # so the stage3/repo match. emerge --update --deep --changed-use @world qlop -d 'yesterday' env-update && . /etc/profile rm /usr/lib/python/EXTERNALLY-MANAGED python3 -m ensurepip install_python_packages python3 -m pip install "${base_python_pkgs[@]}" echo "source /etc/profile" >> /ci/env_vars.sh # For inexplicable reasons, Gentoo only packages valac as valac-$(version) so # no software can locate it. Parse the installed version out of portage and # export it to meson. VALA_VER=$(portageq best_version / dev-lang/vala) VALA_VER=${VALA_VER#dev-lang/vala-} VALA_VER=${VALA_VER%.*} echo "export VALAC=/usr/bin/valac-${VALA_VER}" >> /ci/env_vars.sh echo "export VAPIGEN=/usr/bin/vapigen-${VALA_VER}" >> /ci/env_vars.sh # Cleanup to avoid including large contents in the docker image. # We don't need cache files that are side artifacts of installing packages. # We also don't need the gentoo tree -- the official docker image doesn't # either, and expects you to use emerge-webrsync once you need it. rm -rf /var/cache/binpkgs rm -rf /var/cache/distfiles rm -rf /var/db/repos/gentoo