# Variables # --------- ZIG := zig BC := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) # Infos # ----- .PHONY: help ## Display this help screen help: @printf "\e[36m%-35s %s\e[0m\n" "Command" "Usage" @sed -n -e '/^## /{'\ -e 's/## //g;'\ -e 'h;'\ -e 'n;'\ -e 's/:.*//g;'\ -e 'G;'\ -e 's/\n/ /g;'\ -e 'p;}' Makefile | awk '{printf "\033[33m%-35s\033[0m%s\n", $$1, substr($$0,length($$1)+1)}' # $(ZIG) commands # ------------ .PHONY: build build-dev run run-release shell test bench download-zig wpt zig_version = $(shell grep 'recommended_zig_version = "' "vendor/zig-js-runtime/build.zig" | cut -d'"' -f2) kernel = $(shell uname -ms) ## Download the zig recommended version download-zig: ifeq ($(kernel), Darwin x86_64) $(eval target="macos") $(eval arch="x86_64") else ifeq ($(kernel), Darwin arm64) $(eval target="macos") $(eval arch="aarch64") else ifeq ($(kernel), Linux aarch64) $(eval target="linux") $(eval arch="aarch64") else ifeq ($(kernel), Linux arm64) $(eval target="linux") $(eval arch="aarch64") else ifeq ($(kernel), Linux x86_64) $(eval target="linux") $(eval arch="x86_64") else $(error "Unhandled kernel: $(kernel)") endif $(eval url = "https://ziglang.org/builds/zig-$(target)-$(arch)-$(zig_version).tar.xz") $(eval dest = "/tmp/zig-$(target)-$(arch)-$(zig_version).tar.xz") @printf "\e[36mDownload zig version $(zig_version)...\e[0m\n" @curl -o "$(dest)" -L "$(url)" || (printf "\e[33mBuild ERROR\e[0m\n"; exit 1;) @printf "\e[33mDownloaded $(dest)\e[0m\n" ## Build in release-safe mode build: @printf "\e[36mBuilding (release safe)...\e[0m\n" @$(ZIG) build -Doptimize=ReleaseSafe -Dengine=v8 || (printf "\e[33mBuild ERROR\e[0m\n"; exit 1;) @printf "\e[33mBuild OK\e[0m\n" ## Build in debug mode build-dev: @printf "\e[36mBuilding (debug)...\e[0m\n" @$(ZIG) build -Dengine=v8 || (printf "\e[33mBuild ERROR\e[0m\n"; exit 1;) @printf "\e[33mBuild OK\e[0m\n" ## Run the server in debug mode run: build @printf "\e[36mRunning...\e[0m\n" @./zig-out/bin/browsercore || (printf "\e[33mRun ERROR\e[0m\n"; exit 1;) ## Run a JS shell in debug mode shell: @printf "\e[36mBuilding shell...\e[0m\n" @$(ZIG) build shell -Dengine=v8 || (printf "\e[33mBuild ERROR\e[0m\n"; exit 1;) ## Run WPT tests wpt: @printf "\e[36mBuilding wpt...\e[0m\n" @$(ZIG) build wpt -Dengine=v8 -- --safe $(filter-out $@,$(MAKECMDGOALS)) || (printf "\e[33mBuild ERROR\e[0m\n"; exit 1;) wpt-summary: @printf "\e[36mBuilding wpt...\e[0m\n" @$(ZIG) build wpt -Dengine=v8 -- --safe --summary $(filter-out $@,$(MAKECMDGOALS)) || (printf "\e[33mBuild ERROR\e[0m\n"; exit 1;) ## Test test: @printf "\e[36mTesting...\e[0m\n" @$(ZIG) build test -Dengine=v8 || (printf "\e[33mTest ERROR\e[0m\n"; exit 1;) @printf "\e[33mTest OK\e[0m\n" # Install and build required dependencies commands # ------------ .PHONY: install-submodule .PHONY: install-zig-js-runtime install-zig-js-runtime-dev install-libiconv .PHONY: _install-netsurf install-netsurf clean-netsurf test-netsurf install-netsurf-dev .PHONY: install-mimalloc install-mimalloc-dev clean-mimalloc .PHONY: install-dev install ## Install and build dependencies for release install: install-submodule install-zig-js-runtime install-netsurf install-mimalloc ## Install and build dependencies for dev install-dev: install-submodule install-zig-js-runtime-dev install-netsurf-dev install-mimalloc-dev install-netsurf-dev: _install-netsurf install-netsurf-dev: OPTCFLAGS := -O0 -g -DNDEBUG install-netsurf: _install-netsurf install-netsurf: OPTCFLAGS := -DNDEBUG BC_NS := $(BC)vendor/netsurf ICONV := $(BC)vendor/libiconv # TODO: add Linux iconv path (I guess it depends on the distro) # TODO: this way of linking libiconv is not ideal. We should have a more generic way # and stick to a specif version. Maybe build from source. Anyway not now. _install-netsurf: install-libiconv @printf "\e[36mInstalling NetSurf...\e[0m\n" && \ ls $(ICONV) 1> /dev/null || (printf "\e[33mERROR: you need to install libiconv in your system (on MacOS on with Homebrew)\e[0m\n"; exit 1;) && \ export PREFIX=$(BC_NS) && \ export OPTLDFLAGS="-L$(ICONV)/lib" && \ export OPTCFLAGS="$(OPTCFLAGS) -I$(ICONV)/include" && \ printf "\e[33mInstalling libwapcaplet...\e[0m\n" && \ cd vendor/netsurf/libwapcaplet && \ BUILDDIR=$(BC_NS)/build/libwapcaplet make install && \ cd ../libparserutils && \ printf "\e[33mInstalling libparserutils...\e[0m\n" && \ BUILDDIR=$(BC_NS)/build/libparserutils make install && \ cd ../libhubbub && \ printf "\e[33mInstalling libhubbub...\e[0m\n" && \ BUILDDIR=$(BC_NS)/build/libhubbub make install && \ rm src/treebuilder/autogenerated-element-type.c && \ cd ../libdom && \ printf "\e[33mInstalling libdom...\e[0m\n" && \ BUILDDIR=$(BC_NS)/build/libdom make install && \ printf "\e[33mRunning libdom example...\e[0m\n" && \ cd examples && \ zig cc \ -I$(ICONV)/include \ -I$(BC_NS)/include \ -L$(ICONV)/lib \ -L$(BC_NS)/lib \ -liconv \ -ldom \ -lhubbub \ -lparserutils \ -lwapcaplet \ -o a.out \ dom-structure-dump.c \ $(ICONV)/lib/libiconv.a && \ ./a.out > /dev/null && \ rm a.out && \ printf "\e[36mDone NetSurf $(OS)\e[0m\n" clean-netsurf: @printf "\e[36mCleaning NetSurf build...\e[0m\n" && \ cd vendor/netsurf && \ rm -R build && \ rm -R lib && \ rm -R include test-netsurf: @printf "\e[36mTesting NetSurf...\e[0m\n" && \ export PREFIX=$(BC_NS) && \ export LDFLAGS="-L$(ICONV)/lib -L$(BC_NS)/lib" && \ export CFLAGS="-I$(ICONV)/include -I$(BC_NS)/include" && \ cd vendor/netsurf/libdom && \ BUILDDIR=$(BC_NS)/build/libdom make test install-libiconv: ifeq ("$(wildcard vendor/libiconv/lib/libiconv.a)","") @mkdir -p vendor/libiconv @cd vendor/libiconv && \ curl https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz | tar -xvzf - @cd vendor/libiconv/libiconv-1.17 && \ ./configure --prefix=$(BC)vendor/libiconv --enable-static && \ make && make install endif install-zig-js-runtime-dev: @cd vendor/zig-js-runtime && \ make install-dev install-zig-js-runtime: @cd vendor/zig-js-runtime && \ make install .PHONY: _build_mimalloc _build_mimalloc: @cd vendor/mimalloc && \ mkdir -p out/include && \ cp include/mimalloc.h out/include/ && \ cd out && \ cmake -DMI_BUILD_SHARED=OFF -DMI_BUILD_OBJECT=OFF -DMI_BUILD_TESTS=OFF -DMI_OVERRIDE=OFF $(OPTS) .. && \ make install-mimalloc-dev: _build_mimalloc install-mimalloc-dev: OPTS=-DCMAKE_BUILD_TYPE=Debug install-mimalloc-dev: @cd vendor/mimalloc/out && \ mv libmimalloc-debug.a libmimalloc.a install-mimalloc: _build_mimalloc clean-mimalloc: @rm -fr vendor/mimalloc/lib/* ## Init and update git submodule install-submodule: @git submodule init && \ git submodule update