On 2018-09-05 20:59, Martin Buchholz wrote:
So ... Magnus, are you happy with the current state of the proposed patch?
I'm sorry Martin, but I can't figure out what the current state is. I tried backtracking the discussion but failed. :( Can you please repost the currently proposed patch?



On Tue, Sep 4, 2018 at 11:50 PM, Magnus Ihse Bursie <magnus.ihse.bur...@oracle.com <mailto:magnus.ihse.bur...@oracle.com>> wrote:


    For the gcc toolchain this can not be the case:
    # Minimum supported linker versions, empty means unspecified
    TOOLCHAIN_MINIMUM_LD_VERSION_gcc="2.18"

    We make sure we have an ld that supports the basic flags we assume.


feature tests are better than version tests.
I've heard that argument many times, and I've never agreed with it. In some cases, feature tests work. They typically work if someone has designed a clear API and included a feature test in it. A lot of additional POSIX functionality works that way. This means that you can rest assure that if the feature is present, then you know what you are going to get.

In most of the rest of the world, functionality does not raise to that golden standard. Gcc adds a flag in one version, but it's buggy. A later version fixes the bugs. A later version still changes the behavior of the flag. Functionality that we depend on works or does not works depending on the intersection of things like our code, compiler version, operating system, and so on.

In my experience, it's a rare thing for a feature test to actually work. Version tests, on the other hand, tests against a specific setup, that can be tested and proven to work. The downside of version tests is that they are often open-ended; we say that "anything above this version is supposed to work", even though we have not tested with gcc 8 or 9. The alternative is to say that "we've tested this between gcc 4.7 and 7.3 and will only support it for this version span", but that is in most cases more likely to break when gcc 8 comes along.


Because there are various linkers in play (old GNU ld, gold, lld, macosx ld, BSD ld) and we'd like our compilers to work the same way on various platforms, I'm vaguely unhappy with TOOLCHAIN_MINIMUM_LD_VERSION_gcc. It looks like TOOLCHAIN_EXTRACT_LD_VERSION is another place where we conflate toolchains and operating systems.

The linker is often in a situation where it's conflated between toolchain and operating system. :-) I think it's more due to how the linker is positioned/perceived, than due to a fault of ours. On Windows, for instance, the linker is clearly a part of the toolchain. On solaris, there's a system linker and the solstudio does not distribute any linker on their own. On linux, the gcc toolchain actually allows you to select linker (gold, etc), but arguably they belong to the gcc toolchain rather than the OS.

    We can add a similar check for the clang toolchain, if you want.

    Mixing and matching compilers and linkers willy-nilly is not a
    supported build option


As always, I am for portability and for toolchain competition.  I'd like to be able to build with Intel's icc toolchain.

That might be a noble goal, but it's not realistic. There's a huge cost involved with supporting different combinations; the combinatorial matrix blows up quickly, and if these different combinations are not regularly tested, they *will* break.

That being said, I'm too in general in favor of supporting more rather than less. But only as long as there's no high price to pay for the common/reasonable combinations.

/Magnus

Reply via email to