I've done multi-architecture out-of-tree build systems using GNU Make in the past, but I've just had to write my first multi-variant build system. I found multi-variants are much harder than multi-architectures, primarily because GNU Make's pattern-matching in pattern rules is too weak to parse multiple variant qualifiers out of a target name. Perhaps the recent addition of Guile to GNU Make would solve that problem, but I was reluctant to use it as I wanted to maintain compatibility with older versions of Make.