Posts tagged portage
Portage
Configure the following for Portage.
Emerge
Emerge the following packages:
app-emacs/company-ebuild
dev-util/pkgcheck
Company-Ebuild should pull in app-emacs/ebuild-mode, if that does not happen, then report a bug ;-D
Standard
Add the following to your user's Emacs initialization file. The initialization file is either ~/.emacs.d/init.el or ~/.config/emacs/init.el for newer versions of GNU Emacs.
|
|
(require 'ebuild-mode)
(require 'company-ebuild)
(require 'flycheck)
(require 'flycheck-pkgcheck)
(add-hook 'ebuild-mode-hook 'company-ebuild-setup)
(add-hook 'ebuild-mode-hook 'flycheck-mode)
(add-hook 'ebuild-mode-hook 'flycheck-pkgcheck-setup)
|
Use-Package
We can also configure our environment using a use-package macro that simplifies the setup a little bit.
To use the below configuration the app-emacs/use-package package will have to be installed.
|
|
(require 'use-package)
(use-package ebuild-mode
:defer t
:mode "\\.\\(ebuild\\|eclass\\)\\'"
:hook
((ebuild-mode . company-ebuild-setup)
(ebuild-mode . flycheck-mode)
(ebuild-mode . flycheck-pkgcheck-setup)))
|
The :defer t and :mode "..." enable deferred loading which theoretically speeds up GNU Emacs initialization time at the cost of running the whole use-package block of ebuild-mode configuration when the :mode condition is met.
Potential benefits
Running tests
- test BEFORE (
src_test) and AFTER (pkg_postinst) installation
- test if and how services break if they are not reloaded
- test buildsystem configuration
- sandbox enforces strict and consistent build rules
- benchmarking with different compilation flags and libraries versions/releases
Configuration matrix
We can test across Cartesian product of different configuration settings, like:
- USE flags
- MAKEOPTS
- CFLAGS, CXXFLAGS, CPPFLAGS, LDFAGS, RUSTFLAGS, etc.
- arches (cross-compilation or run in qemu)
- static linking
- supported releases & versions of libraries (eg. glibc & musl)
Also, we could create diffs of installed files across different merges.
Reproducibility
- mini overlay with ::gentoo or any other (eg. company's own) as master
- record VCS (eg. git) hash of the dependent overlays
Binaries
- grab dependencies from binhosts
- distribute built binaries (maybe upload to a company's own artifacts server)
- make AppImages
Getting there
How do we run this?
Do we want to write a proper tool, which we probably do or do we just run Portage + shells scripts?
Do we want to run under root, user, in eprefix, maybe all in docker?
Configuration files
The .portci directory contains the configuration.
Bug 799626
Link: bugs.gentoo.org/799626
Instead of using Ansible, Python, Yaml or Scheme we might use something similar to this for simple configuration, or if gets merged to upstream Portage the better.
Worth mentioning is the idea from Michał Górny who proposes to configure portage with toml files, like the example given in the bug report.
|
|
[package.unmask]
~virtual/libcrypt-2
[package.use.mask]
sys-libs/libxcrypt -system -split-usr
[package.use.force]
sys-libs/glibc -crypt
|
Also, package.x + Toml == a match made in heaven, it looks very nice!
Switching from a git repository hosting
For nearly 2 years I have been synchronizing settings between my Gentoo machines via a git repository that is installed system-wide via portage itself.
This actually gets a little tiresome and slow as the package that installs the configuration has to be re-installed each time we want to update the settings.
So I thought it could be cool if I can just push files around between my machines with one command. Now: we can use rsync or scp but /etc/portage is owned by root so we either have to change the permissions to a user we use to ssh or a group that user is in.
Portage users
First change portage permissions of /etc/portage, now all users in the portage group will be able to modify the configuration
|
|
chown -R root:portage /etc/portage
chmod -R g+w /etc/portage
|
Synchronizing
We can do a rsync from different machine with:
|
|
rsync -r /etc/portage REMOTEHOST:/etc --exclude=".git" --exclude="make.profile" --copy-unsafe-links
|
Reminder that this can also be done as a cron job!
Portage snapshots with git
Probably the best thing I got out of genlica is that I engineered a script to automatically do a git commit of the changes to the portage configuration.
Emerge git
|
|
emerge --noreplace --verbose dev-vcs/git
|
Copy the file that does the snapshots
|
|
mkdir -p /etc/portage/postsync.d
curl -o /etc/portage/postsync.d/99-degitmerge.sh "https://gitlab.com/xgqt/genlica/-/raw/master/portage/postsync.d/99-degitmerge.sh"
|
Intro
Backing up using this method takes a lot less space - ~60MB (without distfiles) and can be restored on almost any system (running portage) and tweaked afterwards for, say, CPU architecture. I've created a a short script with similar method in here.
What we need
- ebuild repositories are installed with git
- distfiles (those might be gone when we want to replicate)
Backup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 |
# System info
emerge --info > info.txt
# Portage tree
cp -Lr /etc/portage .
# Portage layout
tree -a -L 2 /etc/portage > layout.txt
# Packages in @world
cp /var/lib/portage/world .
# Installed sets
cp /var/lib/portage/world_sets .
# Installed packages (with versions)
qlist --installed --nocolor --umap > qlist-use.txt
qlist --installed --nocolor --verbose > qlist-ver.txt
# Distfiles
cp -rv "$(portageq envvar DISTDIR)" distfiles
# Ebuild database
cp -r /var/db/pkg pkgdb
|
Restoration
To faithfully restore the system perform those actions as root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
# Copy the portage tree to /etc
rm -dr /etc/portage
cp -r portage /etc/portage
# Checkout the gentoo repo to a commit specified in info.txt
cd "$(portageq get_repo_path / gentoo)"
git checkout # <commit ID>
# Copy distfiles
cp -r distfiles/* "$(portageq envvar DISTDIR)"/
# Fake-install @world and sets
cp world /var/lib/portage/world
cp world_sets /var/lib/portage/world_sets
# Emerge the exact packages from qlist-ver.txt
emerge --keep-going=y -1Oav $(sed 's/^/=/' qlist-ver.txt)
|