Unverified Commit a4c5ee1f authored by John Ericson's avatar John Ericson Committed by GitHub
Browse files

Merge pull request #231894 from Ericson2314/parallel-bootstrap

minimal-bootstrap: Parallelize + separate compilers & libs
parents 7c2a79ba 5b2b3950
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -20,11 +20,18 @@ lib.makeScope
    mes = callPackage ./mes { };
    mes-libc = callPackage ./mes/libc.nix { };

    inherit (callPackage ./stage0-posix { }) kaem m2libc mescc-tools mescc-tools-extra;
    stage0-posix = callPackage ./stage0-posix { };

    inherit (self.stage0-posix) kaem m2libc mescc-tools mescc-tools-extra;

    tinycc-bootstrappable = callPackage ./tinycc/bootstrappable.nix { };
    tinycc-mes = callPackage ./tinycc/mes.nix { };

    inherit (callPackage ./utils.nix { }) fetchurl derivationWithMeta writeTextFile writeText;

    test = kaem.runCommand "minimal-bootstrap-test" {} ''
      echo ${mes.compiler.tests.get-version}
      echo ${tinycc-mes.compiler.tests.chain}
      mkdir ''${out}
    '';
  })
+3 −3
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ let
        ./configure \
          --build i686-pc-linux-gnu \
          --host i686-pc-linux-gnu \
          CC="${tinycc-mes}/bin/tcc -static" \
          CC="${tinycc.compiler}/bin/tcc -B ${tinycc.libs}/lib -static" \
          ac_cv_func_dup=no
    - `ac_cv_func_dup` disabled as mes-libc doesn't implement tmpfile()

@@ -148,7 +148,7 @@ in
kaem.runCommand "${pname}-${version}" {
  inherit pname version;

  nativeBuildInputs = [ tinycc gnupatch ];
  nativeBuildInputs = [ tinycc.compiler gnupatch ];

  meta = with lib; {
    description = "A tool to control the generation of non-source files from sources";
@@ -174,7 +174,7 @@ kaem.runCommand "${pname}-${version}" {
  cp lib/fnmatch.in.h lib/fnmatch.h

  # Compile
  alias CC="tcc ${lib.concatStringsSep " " CFLAGS}"
  alias CC="tcc -B ${tinycc.libs}/lib ${lib.concatStringsSep " " CFLAGS}"
  ${lib.concatMapStringsSep "\n" (f: "CC -c ${f}") sources}

  # Link
+2 −2
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@ in
kaem.runCommand "${pname}-${version}" {
  inherit pname version;

  nativeBuildInputs = [ tinycc ];
  nativeBuildInputs = [ tinycc.compiler ];

  meta = with lib; {
    description = "GNU Patch, a program to apply differences to files";
@@ -91,7 +91,7 @@ kaem.runCommand "${pname}-${version}" {
  catm config.h

  # Build
  alias CC="tcc ${lib.concatStringsSep " " CFLAGS}"
  alias CC="tcc -B ${tinycc.libs}/lib ${lib.concatStringsSep " " CFLAGS}"
  ${lib.concatMapStringsSep "\n" (f: "CC -c ${f}") sources}

  # Link
+2 −1
Original line number Diff line number Diff line
@@ -20,7 +20,8 @@ kaem.runCommand "${pname}-${version}" {
  };
} ''
  mkdir -p ''${out}/bin
  ${mes}/bin/mes --no-auto-compile -e main ${mes}/bin/mescc.scm -- \
  ${mes.compiler}/bin/mes --no-auto-compile -e main ${mes.srcPost.bin}/bin/mescc.scm -- \
    -L ${mes.libs}/lib \
    -lc+tcc \
    -o ''${out}/bin/ln \
    ${src}
+197 −147
Original line number Diff line number Diff line
@@ -6,6 +6,12 @@
, m2libc
, mescc-tools
}:

# Maintenance note:
# Build steps have been adapted from build-aux/bootstrap.sh.in
# as well as the live-bootstrap project
# https://github.com/fosslinux/live-bootstrap/blob/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/mes-0.24.2/mes-0.24.2.kaem

let
  pname = "mes";
  version = "0.24.2";
@@ -28,26 +34,6 @@ let
  # add symlink() to libc+tcc so we can use it in ln-boot
  libc_tcc_SOURCES = sources.libc_tcc_SOURCES ++ [ "lib/linux/symlink.c" ];

  compile = sources:
    lib.concatMapStringsSep
      "\n"
      (f: ''CC -c ''${MES_PREFIX}/${f}'')
      sources;
  replaceExt = ext: source:
    lib.replaceStrings
      [ ".c" ]
      [ ext ]
      (builtins.baseNameOf source);
  archive = out: sources:
    "catm ${out} ${lib.concatMapStringsSep " " (replaceExt ".o") sources}";
  sourceArchive = out: sources:
    "catm ${out} ${lib.concatMapStringsSep " " (replaceExt ".s") sources}";
in
kaem.runCommand "${pname}-${version}" {
  inherit pname version;

  passthru = { inherit src nyacc; };

  meta = with lib; {
    description = "Scheme interpreter and C compiler for bootstrapping";
    homepage = "https://www.gnu.org/software/mes";
@@ -55,20 +41,18 @@ kaem.runCommand "${pname}-${version}" {
    maintainers = with maintainers; [ emilytrau ];
    platforms = [ "i686-linux" ];
  };
}
# Maintenance note:
# Build steps have been adapted from build-aux/bootstrap.sh.in
# as well as the live-bootstrap project
# https://github.com/fosslinux/live-bootstrap/blob/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/mes-0.24.2/mes-0.24.2.kaem
''

  srcPost = kaem.runCommand "${pname}-src-${version}" {
    outputs = [ "out" "bin" ];
    inherit meta;
  } ''
    # Unpack source
    ungz --file ${src} --output mes.tar
  mkdir ''${out} ''${out}/bin ''${out}/share
  cd ''${out}/share
    mkdir ''${out}
    cd ''${out}
    untar --non-strict --file ''${NIX_BUILD_TOP}/mes.tar # ignore symlinks

  MES_PREFIX=''${out}/share/mes-${version}
  LIBDIR=''${MES_PREFIX}/lib
    MES_PREFIX=''${out}/mes-${version}

    cd ''${MES_PREFIX}

@@ -122,68 +106,134 @@ kaem.runCommand "${pname}-${version}" {
    replace --file ''${mescc_in} --output ''${mescc_in} --match-on @VERSION@ --replace-with ${version}
    replace --file ''${mescc_in} --output ''${mescc_in} --match-on @mes_cpu@ --replace-with x86
    replace --file ''${mescc_in} --output ''${mescc_in} --match-on @mes_kernel@ --replace-with linux
  cp ''${mescc_in} ''${out}/bin/mescc.scm
    mkdir -p ''${bin}/bin
    cp ''${mescc_in} ''${bin}/bin/mescc.scm

    # Build mes-m2
    mes_cpu=x86
    stage0_cpu=x86
    kaem --verbose --strict --file kaem.run
  cp bin/mes-m2 ''${out}/bin/mes-m2
  chmod 555 ''${out}/bin/mes-m2
    cp bin/mes-m2 ''${bin}/bin/mes-m2
    chmod 555 ''${bin}/bin/mes-m2
  '';

  srcPrefix = "${srcPost.out}/mes-${version}";

  cc = "${srcPost.bin}/bin/mes-m2";
  ccArgs = [
    "-e" "main"
    "${srcPost.bin}/bin/mescc.scm"
    "--"
    "-D" "HAVE_CONFIG_H=1"
    "-I" "${srcPrefix}/include"
    "-I" "${srcPrefix}/include/linux/x86"
  ];

  CC = toString ([ cc ] ++ ccArgs);

  stripExt = source:
    lib.replaceStrings
      [ ".c" ]
      [ "" ]
      (builtins.baseNameOf source);

  compile = source: kaem.runCommand (stripExt source) {} ''
    mkdir ''${out}
    cd ''${out}
    ${CC} -c ${srcPrefix}/${source}
  '';

  crt1 = compile "/lib/linux/x86-mes-mescc/crt1.c";

  getRes = suffix: res: "${res}/${res.name}${suffix}";

  archive = out: sources:
    "catm ${out} ${lib.concatMapStringsSep " " (getRes ".o") sources}";
  sourceArchive = out: sources:
    "catm ${out} ${lib.concatMapStringsSep " " (getRes ".s") sources}";

  mkLib = libname: sources: let
    os = map compile sources;
  in kaem.runCommand "${pname}-${libname}-${version}" {
    inherit meta;
  } ''
    LIBDIR=''${out}/lib
    mkdir -p ''${LIBDIR}
    cd ''${LIBDIR}

    ${archive "${libname}.a" os}
    ${sourceArchive "${libname}.s" os}
  '';

  libc-mini = mkLib "libc-mini" libc_mini_SOURCES;
  libmescc = mkLib "libmescc" libmescc_SOURCES;
  libc = mkLib "libc" libc_SOURCES;
  libc_tcc = mkLib "libc+tcc" libc_tcc_SOURCES;

  # Recompile Mes and Mes C library using mes-m2 bootstrapped Mes
  cd ''${NIX_BUILD_TOP}
  alias CC="''${out}/bin/mes-m2 -e main ''${out}/bin/mescc.scm -- -D HAVE_CONFIG_H=1 -I ''${MES_PREFIX}/include -I ''${MES_PREFIX}/include/linux/x86"
  libs = kaem.runCommand "${pname}-m2-libs-${version}" {
    inherit pname version;

    passthru.tests.get-version = result: kaem.runCommand "${pname}-get-version-${version}" {} ''
      ${result}/bin/mes --version
      mkdir ''${out}
    '';

    inherit meta;
  }
  ''
    LIBDIR=''${out}/lib
    mkdir -p ''${out} ''${LIBDIR}

    mkdir -p ''${LIBDIR}/x86-mes

    # crt1.o
  CC -c ''${MES_PREFIX}/lib/linux/x86-mes-mescc/crt1.c
  cp crt1.o ''${LIBDIR}/x86-mes
  cp crt1.s ''${LIBDIR}/x86-mes
    cp ${crt1}/crt1.o ''${LIBDIR}/x86-mes
    cp ${crt1}/crt1.s ''${LIBDIR}/x86-mes

    # libc-mini.a
  ${compile libc_mini_SOURCES}
  ${archive "libc-mini.a" libc_mini_SOURCES}
  ${sourceArchive "libc-mini.s" libc_mini_SOURCES}
  cp libc-mini.a ''${LIBDIR}/x86-mes
  cp libc-mini.s ''${LIBDIR}/x86-mes
    cp ${libc-mini}/lib/libc-mini.a ''${LIBDIR}/x86-mes
    cp ${libc-mini}/lib/libc-mini.s ''${LIBDIR}/x86-mes

    # libmescc.a
  ${compile libmescc_SOURCES}
  ${archive "libmescc.a" libmescc_SOURCES}
  ${sourceArchive "libmescc.s" libmescc_SOURCES}
  cp libmescc.a ''${LIBDIR}/x86-mes
  cp libmescc.s ''${LIBDIR}/x86-mes
    cp ${libmescc}/lib/libmescc.a ''${LIBDIR}/x86-mes
    cp ${libmescc}/lib/libmescc.s ''${LIBDIR}/x86-mes

    # libc.a
  ${compile libc_SOURCES}
  ${archive "libc.a" libc_SOURCES}
  ${sourceArchive "libc.s" libc_SOURCES}
  cp libc.a ''${LIBDIR}/x86-mes
  cp libc.s ''${LIBDIR}/x86-mes
    cp ${libc}/lib/libc.a ''${LIBDIR}/x86-mes
    cp ${libc}/lib/libc.s ''${LIBDIR}/x86-mes

    # libc+tcc.a
  # optimisation: don't recompile common libc sources
  ${compile (lib.subtractLists libc_SOURCES libc_tcc_SOURCES)}
  ${archive "libc+tcc.a" libc_tcc_SOURCES}
  ${sourceArchive "libc+tcc.s" libc_tcc_SOURCES}
  cp libc+tcc.a ''${LIBDIR}/x86-mes
  cp libc+tcc.s ''${LIBDIR}/x86-mes
    cp ${libc_tcc}/lib/libc+tcc.a ''${LIBDIR}/x86-mes
    cp ${libc_tcc}/lib/libc+tcc.s ''${LIBDIR}/x86-mes
  '';

  # Build mes itself
  ${compile mes_SOURCES}
  ''${out}/bin/mes-m2 -e main ''${out}/bin/mescc.scm -- \
  compiler = kaem.runCommand "${pname}-${version}" {
    inherit pname version;

    passthru.tests.get-version = result: kaem.runCommand "${pname}-get-version-${version}" {} ''
      ${result}/bin/mes --version
      mkdir ''${out}
    '';

    inherit meta;
  }
  ''
    mkdir -p ''${out}/bin

    ${srcPost.bin}/bin/mes-m2 -e main ${srcPost.bin}/bin/mescc.scm -- \
      --base-address 0x08048000 \
    -L ''${MES_PREFIX}/lib \
    -L . \
      -L ''${srcPrefix}/lib \
      -L ${libs}/lib \
      -lc \
      -lmescc \
      -nostdlib \
      -o ''${out}/bin/mes \
    crt1.o \
    ${lib.concatMapStringsSep " " (replaceExt ".o") mes_SOURCES}

  # Check
  ''${out}/bin/mes --version
''
      ${libs}/lib/x86-mes/crt1.o \
      ${lib.concatMapStringsSep " " (getRes ".o") (map compile mes_SOURCES)}
  '';
in {
  inherit srcPost srcPrefix nyacc;
  inherit compiler libs;
}
Loading