{
  lib,
  kaem,
  mes-libc,
  buildPlatform,
}:

rec {

  # Recompile libc: crt{1,n,i}, libtcc.a, libc.a, libgetopt.a
  recompileLibc =
    {
      tcc,
      pname,
      version,
      src,
      libtccOptions,
      libtccSources ? [
        "${src}/lib/libtcc1.c"
        "${src}/lib/va_list.c"
      ],
      libtccObjects ? [
        "libtcc1.o"
        "va_list.o"
      ],
    }:
    let

      crt = kaem.runCommand "crt" { } ''
        mkdir -p ''${out}/lib
        ${tcc}/bin/tcc ${mes-libc.CFLAGS} -c -o ''${out}/lib/crt1.o ${mes-libc}/lib/crt1.c
        ${tcc}/bin/tcc ${mes-libc.CFLAGS} -c -o ''${out}/lib/crtn.o ${mes-libc}/lib/crtn.c
        ${tcc}/bin/tcc ${mes-libc.CFLAGS} -c -o ''${out}/lib/crti.o ${mes-libc}/lib/crti.c
      '';

      library =
        let
          compileCmd = options: source: "${tcc}/bin/tcc ${options} -c ${source}";
        in
        libName: options: sources: objs:
        kaem.runCommand "${libName}.a" { } ''
          ${lib.strings.concatMapStringsSep "\n" (compileCmd options) sources}
          ${tcc}/bin/tcc -ar cr ''${out} ${lib.strings.concatStringsSep " " objs}
        '';

      libtcc1 = library "libtcc1" libtccOptions libtccSources libtccObjects;
      libc = library "libc" mes-libc.CFLAGS [ "${mes-libc}/lib/libc.c" ] [ "libc.o" ];
      libgetopt = library "libgetopt" mes-libc.CFLAGS [ "${mes-libc}/lib/libgetopt.c" ] [ "libgetopt.o" ];
    in
    kaem.runCommand "${pname}-libs-${version}" { } ''
      mkdir -p ''${out}/lib
      cp ${crt}/lib/crt1.o ''${out}/lib
      cp ${crt}/lib/crtn.o ''${out}/lib
      cp ${crt}/lib/crti.o ''${out}/lib
      cp ${libtcc1} ''${out}/lib/libtcc1.a
      cp ${libc} ''${out}/lib/libc.a
      cp ${libgetopt} ''${out}/lib/libgetopt.a
    '';

  buildTinyccMes =
    {
      pname,
      version,
      src,
      prev,
      buildOptions,
      libtccSources ? [
        "${src}/lib/libtcc1.c"
        "${src}/lib/va_list.c"
      ],
      libtccObjects ? [
        "libtcc1.o"
        "va_list.o"
      ],
      libtccBuildOptions,
      meta,
    }:
    let
      tccTarget =
        {
          i686-linux = "I386";
          x86_64-linux = "X86_64";
        }
        .${buildPlatform.system};
      options = lib.strings.concatStringsSep " " buildOptions;
      libtccOptions = lib.strings.concatStringsSep " " (
        [
          "-c"
          "-D"
          "TCC_TARGET_${tccTarget}=1"
        ]
        ++ libtccBuildOptions
      );
      compiler =
        kaem.runCommand "${pname}-${version}"
          {
            inherit pname version meta;
            passthru.tests = {
              get-version =
                result:
                kaem.runCommand "${pname}-get-version-${version}" { } ''
                  ${result}/bin/tcc -version
                  mkdir ''${out}
                '';
              chain =
                result:
                kaem.runCommand "${pname}-chain-${version}" { } ''
                  echo ${prev.compiler.tests.chain or prev.compiler.tests.get-version};
                  ${result}/bin/tcc -version
                  mkdir ''${out}
                '';
            };
          }
          ''
            catm config.h
            mkdir -p ''${out}/bin
            ${prev.compiler}/bin/tcc \
              -B ${prev.libs}/lib \
              -g \
              -v \
              -o ''${out}/bin/tcc \
              -D BOOTSTRAP=1 \
              ${options} \
              -I . \
              -I ${src} \
              -D TCC_TARGET_${tccTarget}=1 \
              -D CONFIG_TCCDIR=\"\" \
              -D CONFIG_SYSROOT=\"\" \
              -D CONFIG_TCC_CRTPREFIX=\"{B}\" \
              -D CONFIG_TCC_ELFINTERP=\"\" \
              -D CONFIG_TCC_LIBPATHS=\"{B}\" \
              -D CONFIG_TCC_SYSINCLUDEPATHS=\"${src}/include:${mes-libc}/include\" \
              -D TCC_LIBGCC=\"libc.a\" \
              -D TCC_LIBTCC1=\"libtcc1.a\" \
              -D CONFIG_TCCBOOT=1 \
              -D CONFIG_TCC_STATIC=1 \
              -D CONFIG_USE_LIBGCC=1 \
              -D TCC_MES_LIBC=1 \
              -D TCC_VERSION=\"0.9.28-${version}\" \
              -D ONE_SOURCE=1 \
              ${src}/tcc.c
          '';
      libs = recompileLibc {
        inherit
          pname
          version
          src
          libtccOptions
          libtccSources
          libtccObjects
          ;
        tcc = compiler;
      };
    in
    {
      inherit prev compiler libs;
    };
}
