override basedir ::= $(dir $(lastword $(MAKEFILE_LIST)))/.. override BUILD_FILES ::= $(BUILD_FILES) build/etc/s6-rc/compiled # No override here so that it can be overridden in host/rootfs/default.nix. dest ::= build/rootfs.erofs all: .PHONY: all $(dest): $(basedir)/scripts/make-erofs.sh $(PACKAGES_FILE) $(addprefix image/,$(FILES)) $(BUILD_FILES) build/empty build/fifo file-list.mk set -euo pipefail; ( \ cat $(PACKAGES_FILE) ;\ for file in $(FILES) $(LINKS); do printf 'image/%s\n%s\n' "$$file" "$$file"; done ;\ for file in $(BUILD_FILES); do printf '%s\n%s\n' "$$file" "$${file#build/}"; done ;\ $(and $(DIRS),printf 'build/empty\n%s\n' $(DIRS);)\ $(and $(FIFOS),printf 'build/fifo\n%s\n' $(FIFOS);)\ ) | $(basedir)/scripts/make-erofs.sh $@ clean: -chmod -Rf +w build rm -rf build .PHONY: clean build/fifo: mkdir -p build mkfifo -m 0600 $@ build/empty: mkdir -p $@ update-file-list: $(basedir)/scripts/genfiles.awk image > file-list.mk .PHONY: update-file-list .PHONY: $(error cannot make .PHONY!) # s6-rc-compile's input is a directory, but that doesn't play nice # with Make, because it won't know to update if some file in the # directory is changed, or a file is created or removed in a # subdirectory. Using the whole source directory could also end up # including files that aren't intended to be part of the input, like # temporary editor files or .license files. So for all these reasons, # only explicitly listed files are made available to s6-rc-compile. build/etc/s6-rc/compiled: $(addprefix image/,$(S6_RC_FILES)) file-list.mk mkdir -p build/etc/s6-rc rm -rf $@ set -euo pipefail; \ dir=$$(mktemp -d); \ { tar -C image -c $(S6_RC_FILES) | tar -C "$$dir" -x --strip-components 2;}; \ s6-rc-compile $@ $$dir; \ exit=$$?; rm -r $$dir; exit $$exit