4 comments

  • fuhsnn 3 minutes ago
    For those who are making indie C compiler that doesn't pretend to be __GNUC__ but want to compile real world projects, slimcc's test script[1] and platform header hacks[2] might save you some time. [1] https://github.com/fuhsnn/slimcc/blob/main/scripts/linux_thi...

    [2] https://github.com/fuhsnn/slimcc/blob/main/slimcc_headers/pl... slimcc_headers/platform_fix/

    Some more fun stories:

    - Game projects default to using SIMD so for example SDL and STB you always need to pass -DSDL_DISABLE_IMMINTRIN_H and -DSTB_NO_SIMD

    - math.h's NAN usually implemented with (0.0f / 0.0f), which will print "-nan" with printf, some projects test suite fails because of it (they expected "nan").

    - NetBSD's sys/cdefs.h straight up #error's if you don't pretend to be GCC or PCC.

    - Some projects can't compile without __attribute__((always_inline)) because they use it on non-static functions.

    - Many projects probe -fvisibility in the build system and pass -fvisibility=hidden to compile, but in the headers they gate __attribute__((visibility(default))) behind __GNUC__ checks, so you'll get missing symbols.

    - Some projects use if(0) { undefined_function() } to fake static_assert(), there is even a bug report from QEMU to Clang because it failed to optimize in -O0 a certain `if` written this way.

    - Even if you define __STDC_NO_VLA__, projects might fall back to alloca() code path that's untested and broken (python and jemalloc both had this problem, already reported)

    - Valkey has broken __builtin_ctzll fallback that nobody noticed (reported).

    - Zig's C bootstrap path expects the compiler to have GCC/Clang-tier optimization and stack overflows if you don't (reported).

    - I implemented __has_extension in the hope that projects can use it to query gnu_asm; but SQLite broke because they use __has_extension(c_atomic) to query GNU atomics builtin, but c_atomic actually meant for C11 _Atomic (IMO they should use __has_builtin)

  • WalterBright 34 minutes ago
    Yes, when I implemented ImportC (a C compiler built in to the D compiler), I had to spend a lot of time finding ways to work with all the nutburger nonsense in the various .h files.

    https://github.com/dlang/dmd/blob/master/druntime/src/import...

    https://github.com/dlang/dmd/blob/master/druntime/src/__impo...

  • whizzter 1 hour ago
    One of my pet-peeves with C projects is that it's so often more or less "works on my machine" when written by Linux users (as a Windows and FreeBSD user it often hits you on both those platforms).

    The article highlights a typical piece:

      #if !(defined __GNUC__ || defined __clang__ || defined __TINYC__)
      # define __attribute__(xyz)     /* Ignore */
      #endif
    
    There is no reason that !defined check to not include a check for __attribute__ already being defined (a custom compiler author could then force an define for __attribute__ that translates to an internal __mycompiler__attribute__ replacement by default).

    But outside of that, just trying to compile on FreeBSD you often run into systemd dependencies or other non-posix behaviors (Not to mention on Windows but I'm not here to bring on flamewars so I'll leave that part).

    • dooglius 15 minutes ago
      The preceding comment indicates that the intent is to support other compilers. I think a better approach is to define __glibc_attribute__ based on compiler support and to stick to that within glibc since there's no reason to think that another compiler's attributes have the same semantics as GNU C's.
    • kps 22 minutes ago
      >One of my pet-peeves with C projects is that it's so often more or less "works on my machine"

      “All the world's a VAX”

      https://groups.google.com/g/comp.lang.c/c/CYgWkWdWCcQ/m/thMt...

      https://www.lysator.liu.se/c/ten-commandments.html

    • BadBadJellyBean 26 minutes ago
      If it is an open source project then that is quite alright with me. An open source author doesn't need to support all platforms. Only those they care about. If someone else wants support for another platform they have the source.
    • formerly_proven 1 hour ago
      For a bunch of software categories there isn't really much point to support Windows at all these days. We've had "developed for unix, ported to Windows" software for a long time and it often doesn't work that well, because the agreement even for fairly basic stuff is not that large between the two.
      • whizzter 23 minutes ago
        1: My point isn't "developer on unix, ported to Windows", it's "developed on linux, maybe works elsewhere".

        2: You could easily compile Samba yourself for FreeBSD in the past, last time I tried a new version it broke in what I remember being due to linux-isms (yes there is ports, but being reliant on older versions if ports maintainers can't keep up isn't a good thing).

        3: The only "fairly basic" stuff that's hugely different is mostly the absence/reliance on shell-scripts (when building), but that has little to do with the actual code function (Personally I often used Node scripts in those scenarios, Python scripts would probably be an improvement since there's no reason it couldn't be everywhere).

        I used to use Tremor to decode Ogg audio (no UI needs, just binary data in, arrays of primitive values in audio buffers out), early versions were easy to compile under Windows but building later versions were buried in shell scripts generating headers,etc for no real good reason (maybe to help port when working on a Linux workstation to other embedded devices but made the code less easily compilable by default), the core functionality only really needed a C compiler as early versions showed.

        I can agree that something with advanced UI's like Blender (that relies on GL/3d rendering for UI) might not be easily portable, but when algortihm libraries often requires heavy reworking it's not a good thing (Here I think Github has helped since people has had an easier time to contribute, it's a sad thing that people are moving away due to the AI-crap).

        In the end, it's not about _actual_ differences but more of a superiority complex of Linux users that is the main roadblock.

      • zephen 1 hour ago
        There's portability between systems, which as you note, has ever-diminishing returns.

        Then there's portability between compilers, which, as the article notes, glibc is also completely hostile to (except for anointed compilers) for no good reason whatsoever.

      • jdw64 45 minutes ago
        [dead]
  • gritzko 36 minutes ago
    What is the feasible way to test code against the matrix of compilers/oses?
    • aDyslecticCrow 6 minutes ago
      And architectures. Probably a bunch of build servers or a swarm of docker, qemu, and VMs, with a good test coverage to detect behaviour differences.

      In practice, the compiler is an often an omitted dependency of any c code.