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: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
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
[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…