I wanted to write this blog entry because this isn’t the first time I’ve rediscovered this bit of Gentoo functionality, and I suspect it will not be the last.
Recently my GCC upgrade from sys-devel/gcc:12
to sys-devel/gcc:13
, and because I build most of my system with LTO, “bad things” started happening (mostly when building newer packages, LTO bytecode mismatch). I found myself wanting to rebuild all of the packages built prior to gcc:13
being installed… and remembered that at some point I had figured out this exact problem on an older system of mine through the use of Gentoo portage sets.
Gentoo’s portage’s set support is quite extensive, including a bunch of set classes that can control how packages are selected (like AgeSet
and CategorySet
). My goal was to make a set, like @older_gcc
, that contained all of the packages built before the current gcc
. I briefly considered using AgeSet
, which lets you specify a number of days ago, and then you specify whether to select packages newer than that day, or older. Something like:
[older_gcc]
class = portage.sets.dbapi.AgetSet
age = 1
mode = older
But, that configuration doesn’t cover any packages that might have installed today before gcc:13
. Also, I’ll probably forget to run this next time gcc
does a major update, and I’ll have to update the age parameter.
It was here than I remembered doing something else many years ago, but I could not find anything relevant in the portage documentation. After digging through the portage source code, I found DateSet
. This class allows one to specify a package as a point of reference! This is exactly what I wanted. As such, I’ve now added the following to my /etc/portage/sets.conf
:
[older_gcc]
class = portage.sets.dbapi.DateSet
package = sys-devel/gcc
As far as I can tell from checking with emerge -pv @older_gcc
, everything looks to be selected properly.
Hopefully this is the last time I rediscover this bit of functionality…