Skip to content

Instantly share code, notes, and snippets.

@pjz
Last active August 20, 2022 00:25
Show Gist options
  • Save pjz/1202b3e01eb95dd61023e8b796543aa0 to your computer and use it in GitHub Desktop.
Save pjz/1202b3e01eb95dd61023e8b796543aa0 to your computer and use it in GitHub Desktop.
Zig from source
LLVM_PROJECT=llvm-project-14
LLVM_BASE=Downloads/$(LLVM_PROJECT)
LLVM_INST=$(LLVM_BASE)/local
ZIG2 := $(shell realpath stage2/bin/zig)
ZIG3 := $(shell realpath stage3/bin/zig)
ZIG4 := $(shell realpath stage4/bin/zig)
build Downloads:
mkdir $@
build/Makefile: build
INST_PREFIX=`realpath $(LLVM_INST)` ;\
echo "llvm should be at $$INST_PREFIX" ;\
cd build ; \
cmake .. -DCMAKE_PREFIX_PATH=$$INST_PREFIX
LLVM_TOOLS=$(LLVM_INST)/bin/llvc $(LLVM_INST)/bin/lld $(LLVM_INST)/bin/clang
.PHONY: stage1
build/stage1/bin/zig stage1: build/Makefile $(LLVM_TOOLS)
cd build ; \
make -j6 install
LOG_OPTS=--verbose-link --verbose-air
# Major "--debug-log" targets are: compilation, module, sema, codegen, and link
#LOG_OPTS=-Dlog=true --debug-log sema
#LOG_OPTS=
.PHONY: stage2
stage2/bin/zig stage2: build/stage1/bin/zig
./build/stage1/bin/zig build -p stage2 -Denable-llvm
stage3/bin/zig stage3: stage2/bin/zig
./stage2/bin/zig build -p stage3 -Denable-llvm -Dconfig_h=build/config.h $(LOG_OPTS) >stage3_air.log 2>&1
stage4/bin/zig stage4: stage3/bin/zig
./stage3/bin/zig build -p stage4 -Denable-llvm -Dconfig_h=build/config.h $(LOG_OPTS) >stage4_air.log 2>&1
# not really necessary, but another datapoint for reproducible build comparison
stage5/bin/zig stage5: stage4/bin/zig
rm -rf zig-cache ;\
./stage4/bin/zig build -p stage5 -Denable-llvm -Dconfig_h=build/config.h $(LOG_OPTS) >stage5_air.log 2>&1
airdiff: stage34_air.diff
stage34_air.diff: stage4
diff stage[34]_air.log > stage34_air.diff
zirs:
cd test/cases ;\
for z in *.zig ; do \
$(ZIG3) build-exe -Denable-llvm --verbose-air $z >$${z}.air3 ; \
$(ZIG4) build-exe -Denable-llvm --verbose-air $z >$${z}.air4 ; \
done
# local llvm build
$(LLVM_BASE): Downloads
cd Downloads ; \
git clone --depth 1 --branch release/14.x https://github.com/llvm/llvm-project $(LLVM_PROJECT)
llvc: $(LLVM_INST)/bin/llvc
$(LLVM_INST)/bin/llvc: $(LLVM_BASE)
INST_PREFIX=`realpath $(LLVM_INST)` ;\
cd $</llvm ; \
mkdir -p build-release ; \
cd build-release ; \
cmake .. -DCMAKE_INSTALL_PREFIX=$$INST_PREFIX -DCMAKE_PREFIX_PATH=$$INST_PREFIX -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_LIBXML2=OFF -G Ninja -DLLVM_PARALLEL_LINK_JOBS=1 ; \
ninja install
lld: $(LLVM_INST)/bin/lld
$(LLVM_INST)/bin/lld: $(LLVM_BASE)
INST_PREFIX=`realpath $(LLVM_INST)` ;\
cd $</lld ; \
mkdir -p build-release ; \
cd build-release ; \
cmake .. -DCMAKE_INSTALL_PREFIX=$$INST_PREFIX -DCMAKE_PREFIX_PATH=$$INST_PREFIX -DCMAKE_BUILD_TYPE=Release -G Ninja -DLLVM_PARALLEL_LINK_JOBS=1 -DCMAKE_CXX_STANDARD=17 ;\
ninja install
clang: $(LLVM_INST)/bin/clang
$(LLVM_INST)/bin/clang: $(LLVM_BASE)
INST_PREFIX=`realpath $(LLVM_INST)` ;\
cd $</clang ; \
mkdir -p build-release ; \
cd build-release ; \
cmake .. -DCMAKE_INSTALL_PREFIX=$$INST_PREFIX -DCMAKE_PREFIX_PATH=$$INST_PREFIX -DCMAKE_BUILD_TYPE=Release -G Ninja -DLLVM_PARALLEL_LINK_JOBS=1 ;\
ninja install
.PHONY: llvm-tools
llvm-tools: $(LLVM_TOOLS)
clean-zig:
rm -rf build zig-cache ~/.cache/zig stage[12345]
clean-llvm:
rm -rf $(LLVM_BASE)/{llvm,lld,clang}/build-release $(LLVM_INST)
clean-all-llvm:
rm -rf Downloads
clean-all: clean-zig clean-all-llvm
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment