On Wed, Nov 17 2021, Carlo Arenas wrote: > On Wed, Nov 17, 2021 at 3:18 PM brian m. carlson > <sandals@xxxxxxxxxxxxxxxxxxxx> wrote: >> >> On 2021-11-17 at 03:01:57, Jeff King wrote: >> > My thinking was that breaking older compilers was preferable to breaking >> > non-gnu ones, because at least old ones go away eventually. But your >> > other email makes me wonder if those non-GNU ones may already be >> > overriding CFLAGS. >> >> Our only problem platform, as far as I can tell, is RHEL/CentOS 7. That >> uses GCC 4.8, and even Ubuntu 18.04 ships with GCC 7. > > There are several odd BSD platforms that are still stuck in pre-GPLv3 > gcc (AKA gcc 4.2.1) like OpenBSD Alpha, hppa, landisk (and maybe also > SPARC64 which is tier1) and that will need the same, there is indeed > also luna88k that uses an even older gcc but hopefully will be able to > work if it understands enough C99 and can be told to use it by this > flag. > >> > Still, if we can come up with a solution that breaks neither (with some >> > light auto-detection or heuristics in the Makefile), that could be the >> > best of both worlds. >> >> I can move COMPILER_FEATURES out of config.mak.dev and into Makefile so >> that we can make use of it. We'll need to depend on GCC 6 for this >> because we lack a way to distinguish 5.1 (which should work) from 5.0 >> (which will not). > > 5.0 works AFAIK, is anything older than 5 than does not as reported[1] > before, but it won't be still a good fit, since it only works for gcc > and clang AS-IS. > > Carlo > > [1] https://lore.kernel.org/git/CAPUEsphnCvK+RZ+h30ZarA1zo9yZ=ndEBrcAbKGf4W92j647vA@xxxxxxxxxxxxxx/ Rather than moving around COMPILER_FEATURES etc. we can just compile a C program as part of our Makefile auto-configuration. See the direction suggested in: https://lore.kernel.org/git/87bl6aypke.fsf@xxxxxxxxxxxxxxxxxxx/ That example is ad-hoc, but the right way to do this is: 1. Stick a C program somewhere, maybe git-autoconf/compiler.c 2. (Try to) Compile that unconditionally 3. Emit its output to a generated file that we then "include", which likewise if it fails indicate that in something the Makefile can "include". Since we set up that file-based dependency relationship we'll only do that auto-detection on the first build. This is really much simpler than fiddling with the version parsing shellscript, i.e. we can just compile a program with -std=c99 or whatever and see if it works, and if it does we stick that flag in CFLAGS or equivalent.