I make relies on having an independently callable C preprocessor that
they make assumptions what the output from it look (which is not
anything laid down by a standard or the like). We used to use Imake
extensively to build our code base, and tehre were platforms I had to
bring along my own CPP because the one for the compiler didn’t work for
the purpose (mostly issues with space and tab substitutions). We
eventually switched to CMAKE.