mirror of
https://github.com/Nexoniarz/Finch.git
synced 2026-11-03 00:44:27 +00:00
The compiler runs on Windows (and has seeds for macOS)
Windows: the compiler made from bootstrap/windows-x86_64.ll runs under Wine, compiles itself to the same IR, builds an exe of itself, and every test program passes through it. It needed: Windows-sized unsigned long for libclang's unsaved file, no 'cross' when Windows builds for Windows, --target passed to libclang (libclang.dll assumes MSVC), the MinGW triple always in the IR, FINCH_LDFLAGS, .exe names and FINCH_LLVM_INCLUDE in bootstrap/build.sh, winseed.sh/winbuild.sh. macOS: seeds for arm64 and x86-64 made with the 11.3 SDK; IR is accepted by clang, nothing has run on a Mac yet. CI gets a windows and a macos job. UNTESTED on real Windows/macOS runners. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015f73FesGZGYPkmDvUcj6QX
This commit is contained in:
parent
3e45b62812
commit
b53e0910d8
18 changed files with 398686 additions and 45576 deletions
|
|
@ -7,6 +7,8 @@ the compiler's own LLVM IR, one file per system:
|
|||
|---|---|---|
|
||||
| `linux-x86_64.ll` | Linux x86-64 | built and tested here and in CI |
|
||||
| `linux-aarch64.ll` | Linux ARM64 | made with the ARM64 cross compiler; CI builds and tests it on an ARM64 runner |
|
||||
| `windows-x86_64.ll` | Windows x86-64 (MinGW: llvm-mingw's clang + libclang.dll) | built and run under Wine: it compiles itself, and every test program runs |
|
||||
| `macos-arm64.ll`, `macos-x86_64.ll` | macOS | made on Linux with the macOS 11.3 SDK; checked as IR only (nobody has run them yet) |
|
||||
|
||||
`bootstrap/build.sh` compiles the seed with `clang` (and the runtime, and libclang) into `build/finch0`; `finch0` builds
|
||||
`src/` into `finch1`; `finch1` builds `src/` again into `build/finch`; the two must make the same IR, or the script stops.
|
||||
|
|
@ -32,8 +34,12 @@ For another system, from a machine that has that system's headers and a cross co
|
|||
FINCH_CC=aarch64-linux-gnu-gcc build/finch ir src/main.fch --target arm64 > bootstrap/linux-aarch64.ll
|
||||
```
|
||||
|
||||
## macOS and Windows
|
||||
## Windows and macOS
|
||||
|
||||
There is no seed for them yet: it needs Apple's or Microsoft's headers, which can't be had on Linux. Until there is one,
|
||||
programs for macOS and Windows are built from Linux with `--target macos|windows`, and the compiler's older C++ version
|
||||
(branch `before-bootstrap`) is the way to get a compiler that runs there.
|
||||
Windows: `windows-x86_64.ll` is made by `bootstrap/winseed.sh` on Linux (llvm-mingw's MinGW headers and the headers of an
|
||||
official LLVM for Windows); `bootstrap/winbuild.sh` turns it into `finch.exe` for trying under Wine. On a Windows machine
|
||||
`bootstrap/build.sh` does the same from Git Bash: put llvm-mingw's `bin` in PATH and set `FINCH_LIBCLANG` (the path of
|
||||
`libclang.dll`), `FINCH_LLVM_INCLUDE` (its `include` folder) and `FINCH_LDFLAGS=-L<folder of libclang.dll>`.
|
||||
|
||||
macOS: the seeds were made with the macOS 11.3 SDK; `brew install llvm@21` gives clang and libclang; the CI job sets
|
||||
`FINCH_CLANG`, `FINCH_LIBCLANG` and `FINCH_LLVM_INCLUDE`. If the macOS build fails, that job is where it shows first.
|
||||
|
|
|
|||
|
|
@ -20,26 +20,32 @@ case "$(uname -s)-$(uname -m)" in
|
|||
MINGW*|MSYS*|CYGWIN*) seed=windows-x86_64 ;;
|
||||
*) echo "bootstrap: no seed for $(uname -s) $(uname -m) (see bootstrap/README.md)" >&2; exit 1 ;;
|
||||
esac
|
||||
EXE=
|
||||
case $seed in windows-*) EXE=.exe ;; esac
|
||||
[ -f "bootstrap/$seed.ll" ] || { echo "bootstrap: bootstrap/$seed.ll is missing" >&2; exit 1; }
|
||||
|
||||
CLANG=${FINCH_CLANG:-clang}
|
||||
LIBS=${FINCH_LIBCLANG:--lclang}
|
||||
INC=
|
||||
[ -z "${FINCH_LLVM_INCLUDE:-}" ] || INC="-I $FINCH_LLVM_INCLUDE" # where clang-c/Index.h is, if clang does not find it itself
|
||||
export FINCH_RT=$PWD/runtime/finch_rt.c
|
||||
# Windows: libclang.dll has to sit next to the programs that use it (FINCH_LIBCLANG is then the path of that dll)
|
||||
if [ -n "$EXE" ]; then cp "$LIBS" build/; fi
|
||||
|
||||
echo "bootstrap: seed ($seed) -> build/finch0"
|
||||
$CLANG -O1 -w "bootstrap/$seed.ll" runtime/finch_rt.c -o build/finch0 -lm $LIBS
|
||||
echo "bootstrap: build/finch0 packs the runtime and std into src/embedded.fch"
|
||||
bootstrap/pack.sh build/finch0
|
||||
echo "bootstrap: build/finch0 builds the compiler -> build/finch1"
|
||||
build/finch0 build src/main.fch -o build/finch1
|
||||
echo "bootstrap: build/finch1 builds the compiler -> build/finch"
|
||||
build/finch1 build src/main.fch -o build/finch
|
||||
$CLANG -O1 -w "bootstrap/$seed.ll" runtime/finch_rt.c -o build/finch0$EXE -lm $LIBS
|
||||
echo "bootstrap: build/finch0$EXE packs the runtime and std into src/embedded.fch"
|
||||
bootstrap/pack.sh build/finch0$EXE
|
||||
echo "bootstrap: build/finch0$EXE builds the compiler -> build/finch1"
|
||||
build/finch0$EXE build src/main.fch -o build/finch1$EXE $INC
|
||||
echo "bootstrap: build/finch1$EXE builds the compiler -> build/finch"
|
||||
build/finch1$EXE build src/main.fch -o build/finch$EXE $INC
|
||||
|
||||
# a compiler that builds itself must come out the same however many times it does
|
||||
build/finch1 ir src/main.fch > build/stage1.ll
|
||||
build/finch ir src/main.fch > build/stage2.ll
|
||||
build/finch1$EXE ir src/main.fch $INC > build/stage1.ll
|
||||
build/finch$EXE ir src/main.fch $INC > build/stage2.ll
|
||||
if cmp -s build/stage1.ll build/stage2.ll; then
|
||||
echo "bootstrap: build/finch1 and build/finch make the same IR ($(wc -l < build/stage2.ll) lines): done"
|
||||
echo "bootstrap: build/finch1$EXE and build/finch make the same IR ($(wc -l < build/stage2.ll) lines): done"
|
||||
else
|
||||
echo "bootstrap: the compiler does not reproduce itself (build/stage1.ll and build/stage2.ll differ)" >&2
|
||||
exit 1
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
117504
bootstrap/macos-arm64.ll
Normal file
117504
bootstrap/macos-arm64.ll
Normal file
File diff suppressed because one or more lines are too long
117509
bootstrap/macos-x86_64.ll
Normal file
117509
bootstrap/macos-x86_64.ll
Normal file
File diff suppressed because one or more lines are too long
8
bootstrap/winbuild.sh
Executable file
8
bootstrap/winbuild.sh
Executable file
|
|
@ -0,0 +1,8 @@
|
|||
#!/bin/sh
|
||||
# Builds build/win/finch.exe from bootstrap/windows-x86_64.ll on Linux (to try the Windows compiler under Wine):
|
||||
# bootstrap/winbuild.sh <llvm-mingw dir> <LLVM-for-Windows dir>
|
||||
set -eu
|
||||
cd "$(dirname "$0")/.."
|
||||
mkdir -p build/win
|
||||
"$1/bin/x86_64-w64-mingw32-clang" -O1 -w bootstrap/windows-x86_64.ll runtime/finch_rt.c -o build/win/finch.exe "$2/bin/libclang.dll"
|
||||
cp "$2/bin/libclang.dll" build/win/
|
||||
117654
bootstrap/windows-x86_64.ll
Normal file
117654
bootstrap/windows-x86_64.ll
Normal file
File diff suppressed because one or more lines are too long
9
bootstrap/winseed.sh
Executable file
9
bootstrap/winseed.sh
Executable file
|
|
@ -0,0 +1,9 @@
|
|||
#!/bin/sh
|
||||
# Makes bootstrap/windows-x86_64.ll from Linux, with a Linux-hosted llvm-mingw (MinGW headers) and the headers of an
|
||||
# official LLVM for Windows (clang-c/Index.h):
|
||||
# bootstrap/winseed.sh <finch> <llvm-mingw dir> <LLVM-for-Windows dir>
|
||||
set -eu
|
||||
cd "$(dirname "$0")/.."
|
||||
finch=$1; mingw=$2; llvm=$3
|
||||
PATH="$mingw/bin:$PATH" FINCH_CC="$mingw/bin/x86_64-w64-mingw32-clang" "$finch" ir src/main.fch --target windows -I "$llvm/include" > bootstrap/windows-x86_64.ll
|
||||
echo "wrote bootstrap/windows-x86_64.ll"
|
||||
Loading…
Reference in a new issue