let system = "x86_64-linux"; ARCH_DIR = "x86"; ARCH = "x86"; ELF_ARCH = "i386"; stage0-src = builtins.fetchGit { url = "https://github.com/oriansj/stage0-posix.git"; rev = "74f1e36f35c28d7854eddfde963917c404764ede"; submodules = true; }; arch-src = "${stage0-src}/${ARCH_DIR}"; out = builtins.placeholder "out"; run = name: args: derivation { inherit name system; builder = builtins.head args; args = builtins.tail args; }; hex0 = run "hex0" [ "${stage0-src}/bootstrap-seeds/POSIX/${ARCH_DIR}/hex0-seed" "${arch-src}/hex0_${ARCH_DIR}.hex0" out ]; hex1 = run "hex1" [ hex0 "${arch-src}/hex1_${ARCH_DIR}.hex0" out ]; catm = run "catm" [ hex0 "${arch-src}/catm_${ARCH_DIR}.hex0" out ]; hex2-0 = run "hex2-0" [ hex1 "${arch-src}/hex2_${ARCH_DIR}.hex1" out ]; arch-elf-hex2 = "${arch-src}/ELF-${ELF_ARCH}.hex2"; cat = name: args: run name ([ catm out ] ++ args); buildHex2 = name: elf: src: run name [ hex2-0 (cat "${name}-src" [ elf src ]) out ]; M0 = buildHex2 "M0" arch-elf-hex2 "${arch-src}/M0_${ARCH_DIR}.hex2"; buildM0 = name: elf: src: buildHex2 name elf (run "${name}-m0" [ M0 src out ]); cc = buildM0 "cc_${ARCH}" arch-elf-hex2 "${arch-src}/cc_${ARCH}.M1"; M2 = let M2-0-c = cat "M2-0.c" [ "${stage0-src}/M2libc/${ARCH}/linux/bootstrap.c" "${stage0-src}/M2-Planet/cc.h" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/M2-Planet/cc_globals.c" "${stage0-src}/M2-Planet/cc_reader.c" "${stage0-src}/M2-Planet/cc_strings.c" "${stage0-src}/M2-Planet/cc_types.c" "${stage0-src}/M2-Planet/cc_core.c" "${stage0-src}/M2-Planet/cc_macro.c" "${stage0-src}/M2-Planet/cc.c" ]; M2-0-M1 = run "M2-0.M1" [ cc M2-0-c out ]; M2-0-0-M1 = cat "M2-0-0.m1" [ "${arch-src}/${ARCH}_defs.M1" "${arch-src}/libc-core.M1" M2-0-M1 ]; in buildM0 "M2" arch-elf-hex2 M2-0-0-M1; libc-elf-hex2 = "${stage0-src}/M2libc/${ARCH}/ELF-${ARCH}.hex2"; libc-elf-debug-hex2 = "${stage0-src}/M2libc/${ARCH}/ELF-${ARCH}-debug.hex2"; blood-elf-0 = let blood-elf-0-M1 = run "blood-elf-0.M1" [ M2 "--architecture" ARCH "-f" "${stage0-src}/M2libc/${ARCH}/linux/bootstrap.c" "-f" "${stage0-src}/M2libc/bootstrappable.c" "-f" "${stage0-src}/mescc-tools/stringify.c" "-f" "${stage0-src}/mescc-tools/blood-elf.c" "--bootstrap-mode" "-o" out ]; blood-elf-0-0-M1 = cat "blood-elf-0-0.M1" [ "${arch-src}/${ARCH}_defs.M1" "${arch-src}/libc-core.M1" blood-elf-0-M1 ]; in buildM0 "blood-elf-0" libc-elf-hex2 blood-elf-0-0-M1; runBloodelf = blood-elf: name: src: run name [ blood-elf "--64" "--little-endian" "-f" src "-o" out ]; M1-0 = let M1-macro-0-M1 = run "M1-macro-0.M1" [ M2 "--architecture" ARCH "-f" "${stage0-src}/M2libc/${ARCH}/linux/bootstrap.c" "-f" "${stage0-src}/M2libc/bootstrappable.c" "-f" "${stage0-src}/mescc-tools/stringify.c" "-f" "${stage0-src}/mescc-tools/M1-macro.c" "--bootstrap-mode" "--debug" "-o" out ]; M1-macro-0-footer-M1 = runBloodelf blood-elf-0 "M1-macro-0-footer.M1" M1-macro-0-M1; M1-macro-0-0-M1 = cat "M1-macro-0-0.M1" [ "${arch-src}/${ARCH}_defs.M1" "${arch-src}/libc-core.M1" M1-macro-0-M1 M1-macro-0-footer-M1 ]; in buildM0 "M1-0" libc-elf-debug-hex2 M1-macro-0-0-M1; hex2-1 = let hex2_linker-1-M1 = run "hex2_linker-1.M1" [ M2 "--architecture" ARCH "-f" "${stage0-src}/M2libc/sys/types.h" "-f" "${stage0-src}/M2libc/stddef.h" "-f" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "-f" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "-f" "${stage0-src}/M2libc/${ARCH}/linux/sys/stat.c" "-f" "${stage0-src}/M2libc/stdlib.c" "-f" "${stage0-src}/M2libc/stdio.c" "-f" "${stage0-src}/M2libc/bootstrappable.c" "-f" "${stage0-src}/mescc-tools/hex2.h" "-f" "${stage0-src}/mescc-tools/hex2_linker.c" "-f" "${stage0-src}/mescc-tools/hex2_word.c" "-f" "${stage0-src}/mescc-tools/hex2.c" "--debug" "-o" out ]; hex2_linker-1-footer-M1 = runBloodelf blood-elf-0 "hex2_linker-1-footer.M1" hex2_linker-1-M1; hex2_linker-1-hex2 = run "hex2_linker-1.hex2" [ M1-0 "--architecture" ARCH "--little-endian" "-f" "${stage0-src}/M2libc/${ARCH}/${ARCH}_defs.M1" "-f" "${stage0-src}/M2libc/${ARCH}/libc-full.M1" "-f" hex2_linker-1-M1 "-f" hex2_linker-1-footer-M1 "-o" out ]; in buildHex2 "hex2-1" libc-elf-debug-hex2 hex2_linker-1-hex2; buildM1 = deps: name: srcs: let M1-src = run "${name}.M1" ( [ M2 "--architecture" ARCH ] ++ (builtins.concatMap (x: [ "-f" x ]) srcs) ++ [ "--debug" "-o" out ] ); M1-footer-src = runBloodelf deps.blood-elf "${name}-footer.M1" M1-src; hex2-src = run "${name}.hex2" [ deps.M1 "--architecture" ARCH "--little-endian" "-f" "${stage0-src}/M2libc/${ARCH}/${ARCH}_defs.M1" "-f" "${stage0-src}/M2libc/${ARCH}/libc-full.M1" "-f" M1-src "-f" M1-footer-src "-o" out ]; in run name [ deps.hex2 "--architecture" ARCH "--little-endian" "--base-address" "0x00600000" "-f" libc-elf-debug-hex2 "-f" hex2-src "-o" out ]; M1 = buildM1 { M1 = M1-0; hex2 = hex2-1; blood-elf = blood-elf-0; } "M1" [ "${stage0-src}/M2libc/sys/types.h" "${stage0-src}/M2libc/stddef.h" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "${stage0-src}/M2libc/string.c" "${stage0-src}/M2libc/stdlib.c" "${stage0-src}/M2libc/stdio.c" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/mescc-tools/stringify.c" "${stage0-src}/mescc-tools/M1-macro.c" ]; hex2 = buildM1 { inherit M1; hex2 = hex2-1; blood-elf = blood-elf-0; } "hex2" [ "${stage0-src}/M2libc/sys/types.h" "${stage0-src}/M2libc/stddef.h" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "${stage0-src}/M2libc/${ARCH}/linux/sys/stat.c" "${stage0-src}/M2libc/stdlib.c" "${stage0-src}/M2libc/stdio.c" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/mescc-tools/hex2.h" "${stage0-src}/mescc-tools/hex2_linker.c" "${stage0-src}/mescc-tools/hex2_word.c" "${stage0-src}/mescc-tools/hex2.c" ]; buildPhase11 = buildM1 { inherit M1 hex2; blood-elf = blood-elf-0; }; kaem = buildPhase11 "kaem" [ "${stage0-src}/M2libc/sys/types.h" "${stage0-src}/M2libc/stddef.h" "${stage0-src}/M2libc/string.c" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "${stage0-src}/M2libc/stdlib.c" "${stage0-src}/M2libc/stdio.c" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/mescc-tools/Kaem/kaem.h" "${stage0-src}/mescc-tools/Kaem/variable.c" "${stage0-src}/mescc-tools/Kaem/kaem_globals.c" "${stage0-src}/mescc-tools/Kaem/kaem.c" ]; M2-Mesoplanet = buildPhase11 "M2-Mesoplanet" [ "${stage0-src}/M2libc/sys/types.h" "${stage0-src}/M2libc/stddef.h" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "${stage0-src}/M2libc/${ARCH}/linux/sys/stat.c" "${stage0-src}/M2libc/stdlib.c" "${stage0-src}/M2libc/stdio.c" "${stage0-src}/M2libc/string.c" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/M2-Mesoplanet/cc.h" "${stage0-src}/M2-Mesoplanet/cc_globals.c" "${stage0-src}/M2-Mesoplanet/cc_env.c" "${stage0-src}/M2-Mesoplanet/cc_reader.c" "${stage0-src}/M2-Mesoplanet/cc_spawn.c" "${stage0-src}/M2-Mesoplanet/cc_core.c" "${stage0-src}/M2-Mesoplanet/cc_macro.c" "${stage0-src}/M2-Mesoplanet/cc.c" ]; blood-elf = buildPhase11 "blood-elf" [ "${stage0-src}/M2libc/sys/types.h" "${stage0-src}/M2libc/stddef.h" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "${stage0-src}/M2libc/stdlib.c" "${stage0-src}/M2libc/stdio.c" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/mescc-tools/stringify.c" "${stage0-src}/mescc-tools/blood-elf.c" ]; buildPhase14 = buildM1 { inherit M1 hex2 blood-elf; }; get_machine = buildPhase14 "get_machine" [ "${stage0-src}/M2libc/sys/types.h" "${stage0-src}/M2libc/stddef.h" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "${stage0-src}/M2libc/stdlib.c" "${stage0-src}/M2libc/stdio.c" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/mescc-tools/get_machine.c" ]; M2-Planet = buildPhase14 "M2-Planet" [ "${stage0-src}/M2libc/sys/types.h" "${stage0-src}/M2libc/stddef.h" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "${stage0-src}/M2libc/stdlib.c" "${stage0-src}/M2libc/stdio.c" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/M2-Planet/cc.h" "${stage0-src}/M2-Planet/cc_globals.c" "${stage0-src}/M2-Planet/cc_reader.c" "${stage0-src}/M2-Planet/cc_strings.c" "${stage0-src}/M2-Planet/cc_types.c" "${stage0-src}/M2-Planet/cc_core.c" "${stage0-src}/M2-Planet/cc_macro.c" "${stage0-src}/M2-Planet/cc.c" ]; # after this point, we rely on PATH so we have to build up a bin dir that we # can use for that so we need mkdir, chmod and cp mkdir0 = buildPhase14 "mkdir0" [ "${stage0-src}/M2libc/sys/types.h" "${stage0-src}/M2libc/stddef.h" "${stage0-src}/M2libc/string.c" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "${stage0-src}/M2libc/${ARCH}/linux/sys/stat.c" "${stage0-src}/M2libc/stdlib.c" "${stage0-src}/M2libc/stdio.c" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/mescc-tools-extra/mkdir.c" ]; chmod0 = buildPhase14 "chmod0" [ "${stage0-src}/M2libc/sys/types.h" "${stage0-src}/M2libc/stddef.h" "${stage0-src}/M2libc/string.c" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "${stage0-src}/M2libc/${ARCH}/linux/sys/stat.c" "${stage0-src}/M2libc/stdlib.c" "${stage0-src}/M2libc/stdio.c" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/mescc-tools-extra/chmod.c" ]; cp0 = buildPhase14 "cp0" [ "${stage0-src}/M2libc/sys/types.h" "${stage0-src}/M2libc/stddef.h" "${stage0-src}/M2libc/string.c" "${stage0-src}/M2libc/${ARCH}/linux/fcntl.c" "${stage0-src}/M2libc/${ARCH}/linux/unistd.c" "${stage0-src}/M2libc/stdlib.c" "${stage0-src}/M2libc/stdio.c" "${stage0-src}/M2libc/bootstrappable.c" "${stage0-src}/mescc-tools-extra/cp.c" ]; makeBin = name: attrs: let getEnv = builtins.replaceStrings ["-"] [""]; script = map (x: '' ''${cp0} ''${${getEnv x}} ''${out}/bin/${x} ''${chmod0} 0700 ''${out}/bin/${x} '') (builtins.attrNames attrs); env = builtins.listToAttrs ( map (x: { name = (getEnv x); value = attrs."${x}"; }) (builtins.attrNames attrs)); in derivation (env // { inherit system; name = "buildtools0"; inherit mkdir0 chmod0 cp0; builder = kaem; args = ["--file" (builtins.toFile "builder.kaem" '' ''${mkdir0} -p ''${out}/bin ${builtins.concatStringsSep "\n" script} '')]; }); buildtools0 = makeBin "buildtools0" { inherit kaem hex2 blood-elf get_machine M1 M2-Planet M2-Mesoplanet ; }; buildWithC = name: attrs: script: derivation (attrs // { inherit system name; src = stage0-src; mkdir = mkdir0; M2LIBC_PATH = "${stage0-src}/M2libc"; PATH = "${buildtools0}/bin"; builder = kaem; args = ["--file" (builtins.toFile "builder.kaem" script)]; }); mescc-tools-extra = buildWithC "mescc-tools-extra" {} '' set -ex alias CC="M2-Mesoplanet --architecture ${ARCH} -f" BINDIR=''${out}/bin ''${mkdir} -p ''${BINDIR} cd ''${src}/mescc-tools-extra CC sha256sum.c -o ''${BINDIR}/sha256sum CC match.c -o ''${BINDIR}/match CC mkdir.c -o ''${BINDIR}/mkdir CC untar.c -o ''${BINDIR}/untar CC ungz.c -o ''${BINDIR}/ungz CC catm.c -o ''${BINDIR}/catm CC cp.c -o ''${BINDIR}/cp CC chmod.c -o ''${BINDIR}/chmod ''; in { inherit hex0 hex1 catm hex2-0 M0 cc M2 blood-elf-0 M1-0 hex2-1 M1 hex2 kaem M2-Mesoplanet blood-elf get_machine M2-Planet makeBin buildtools0 mescc-tools-extra ; }