| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 1 | QUIET_TEST := @ |
| 2 | |
| 3 | include Makefile.targets |
| 4 | |
| 5 | CC := ccache cc |
| 6 | MAKECMD := make |
| 7 | MAKEARGS := CONFIG_EVERYTHING=yes |
| Nico Huber | 619d9c0 | 2024-04-20 17:51:20 +0200 | [diff] [blame] | 8 | MESONCMD := meson |
| 9 | MESONARGS := -D programmer=all -D classic_cli_print_wiki=enabled --auto-features enabled |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 10 | |
| 11 | spc := |
| 12 | spc := $(spc) $(spc) |
| 13 | |
| Nico Huber | f8785ae | 2025-03-02 13:05:34 +0100 | [diff] [blame] | 14 | # Replace %$(2) -> %/$(2), e.g. armv5 with arm/v5 etc. |
| 15 | preproc_subst = $(if $(2),$(call preproc_arch,$(patsubst %$(2),%/$(2),$(1)),$(3)),$(1)) |
| 16 | preproc_arch = $(call preproc_subst,$(1),$(firstword $(2)),$(wordlist 2,$(words $(2)),$(2))) |
| 17 | |
| Nico Huber | 05f0f7c | 2023-03-03 17:08:16 +0000 | [diff] [blame] | 18 | # Get stem of multiarch tags of the form `stem[-variation]:arch-version` |
| 19 | ma_stem = $(word 1,$(subst -,$(spc),$(subst :,$(spc),$(subst \:,$(spc),$(1))))) |
| 20 | # Get stem of official tags of the form `arch/stem:version` |
| 21 | official_stem = $(word 2,$(subst /,$(spc),$(subst :,$(spc),$(subst \:,$(spc),$(1))))) |
| Nico Huber | f8785ae | 2025-03-02 13:05:34 +0100 | [diff] [blame] | 22 | # Get arch prefix of official tags |
| 23 | official_arch = $(word 1,$(subst /,$(spc),$(1))) |
| 24 | # Create a platform string from the arch prefix, e.g. arm32v5 -> linux/arm/v5 |
| 25 | official_plat = linux/$(patsubst arm32%,arm%,$(call preproc_arch,$(call official_arch,$(1)),v5 v6 v7 v8)) |
| Nico Huber | 05f0f7c | 2023-03-03 17:08:16 +0000 | [diff] [blame] | 26 | |
| 27 | ident = $(subst /,_,$(subst :,_,$(subst \:,_,$(1)))) |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 28 | |
| Nico Huber | 6f6a1c3 | 2023-03-17 12:56:49 +0000 | [diff] [blame] | 29 | include Makefile.env |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 30 | include Makefile.anita |
| Nico Huber | e332db7 | 2025-03-01 13:45:56 +0100 | [diff] [blame] | 31 | include Makefile.cross |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 32 | |
| Nico Huber | 05f0f7c | 2023-03-03 17:08:16 +0000 | [diff] [blame] | 33 | # $(1): mani tag |
| 34 | # $(2): from tag |
| 35 | # $(3): Dockerfile suffix |
| Nico Huber | f8785ae | 2025-03-02 13:05:34 +0100 | [diff] [blame] | 36 | # $(4): platform (optional) |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 37 | define build_template |
| Nico Huber | 05f0f7c | 2023-03-03 17:08:16 +0000 | [diff] [blame] | 38 | Dockerfile.$(call ident,$(1)): Dockerfile.$(3) mani-wrapper.sh |
| 39 | $(QUIET_SETUP)sed -e 's|^FROM manibase|FROM $(2)|' $$< >$$@ |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 40 | |
| 41 | .INTERMEDIATE: Dockerfile.$(call ident,$(1)) |
| 42 | |
| Nico Huber | dea8984 | 2025-03-02 13:13:31 +0100 | [diff] [blame] | 43 | $(1)-build: Dockerfile.$(call ident,$(1)) source-check-build |
| Nico Huber | f8785ae | 2025-03-02 13:05:34 +0100 | [diff] [blame] | 44 | $(QUIET_SETUP)docker build . \ |
| 45 | $(addprefix --platform$(spc),$(4)) -f $$< -t mani/$(1) \ |
| 46 | --build-arg IDENT=$(call ident,$(1)) $$(DOCKER_BUILD_ARGS) |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 47 | endef |
| 48 | |
| 49 | $(foreach tag,$(MULTIARCH_TAGS), \ |
| Nico Huber | 05f0f7c | 2023-03-03 17:08:16 +0000 | [diff] [blame] | 50 | $(eval $(call build_template,$(tag),multiarch/$(tag),$(call ma_stem,$(tag))))) |
| 51 | |
| 52 | $(foreach tag,$(OFFICIAL_TAGS), \ |
| Nico Huber | f8785ae | 2025-03-02 13:05:34 +0100 | [diff] [blame] | 53 | $(eval $(call build_template,$(tag),$(tag),$(call official_stem,$(tag)),$(call official_plat,$(tag))))) |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 54 | |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 55 | djgpp\:6.1.0-build: %-build: Dockerfile.djgpp mani-wrapper.sh |
| Nico Huber | fb433ba | 2023-03-04 19:09:47 +0000 | [diff] [blame] | 56 | $(QUIET_SETUP)docker build . -f $< -t mani/$* --build-arg IDENT=$(call ident,$*) |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 57 | |
| Nico Huber | dea8984 | 2025-03-02 13:13:31 +0100 | [diff] [blame] | 58 | source-build: Dockerfile.source |
| 59 | $(QUIET_SETUP)\ |
| 60 | SRC_TMP=$$(mktemp -d -p .) && \ |
| 61 | { git clone $${TEST_LOCAL:-../../} $${SRC_TMP} && \ |
| 62 | docker build . --build-arg SRC_TMP=$${SRC_TMP} -f $< -t mani/source; \ |
| 63 | rm -rf $${SRC_TMP}; } |
| 64 | |
| Nico Huber | e332db7 | 2025-03-01 13:45:56 +0100 | [diff] [blame] | 65 | $(addsuffix -check-build,source git cross $(NONCROSS_TAGS)): %-check-build: |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 66 | $(QUIET_SETUP)\ |
| 67 | [ $$(docker image ls -q mani/$*) ] \ |
| 68 | || $(MAKE) $*-build $(if $(QUIET_SETUP),>/dev/null 2>/dev/null) |
| Nico Huber | e332db7 | 2025-03-01 13:45:56 +0100 | [diff] [blame] | 69 | $(addsuffix -check-build,$(CROSS_TAGS)): cross-check-build |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 70 | |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 71 | $(ALL_TAGS): export QUIET_SETUP=$(QUIET_TEST) |
| Nico Huber | 725a19e | 2022-12-11 00:01:04 +0100 | [diff] [blame] | 72 | $(ALL_TAGS): export TEST_REMOTE?=$(if $(TEST_LOCAL),\ |
| Nico Huber | c3b02dc | 2023-08-12 01:13:45 +0200 | [diff] [blame] | 73 | git://mani-git/flashprog.git,\ |
| Nico Huber | 39152af | 2024-04-20 16:42:33 +0200 | [diff] [blame] | 74 | https://review.sourcearcade.org/flashprog.git) |
| Nico Huber | 25ea717 | 2023-03-03 17:06:30 +0000 | [diff] [blame] | 75 | $(ALL_TAGS): export TEST_REVISION?=$(if $(TEST_LOCAL),HEAD,main) |
| Nico Huber | 725a19e | 2022-12-11 00:01:04 +0100 | [diff] [blame] | 76 | $(ALL_TAGS): %: %-check-build mani-net $(if $(TEST_LOCAL),local-git) |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 77 | $(QUIET_TEST)docker rm -f mani_$(call ident,$*) >/dev/null 2>&1 || true |
| 78 | $(QUIET_TEST)\ |
| 79 | docker run \ |
| Nico Huber | 48b1fde | 2022-12-11 17:15:27 +0000 | [diff] [blame] | 80 | $(MANI_DOCKER_ARGS) \ |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 81 | --env IDENT=$(call ident,$*) \ |
| Nico Huber | fb433ba | 2023-03-04 19:09:47 +0000 | [diff] [blame] | 82 | --volume manicache:/ccache \ |
| Nico Huber | bfe6484 | 2022-12-10 23:54:24 +0100 | [diff] [blame] | 83 | --network=manibuilder \ |
| Nico Huber | e332db7 | 2025-03-01 13:45:56 +0100 | [diff] [blame] | 84 | --name mani_$(call ident,$*) mani/$(patsubst cross-%,cross,$*) \ |
| Nico Huber | aa359a7 | 2022-12-10 23:52:46 +0100 | [diff] [blame] | 85 | "git fetch $(TEST_REMOTE) $(TEST_REVISION) && \ |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 86 | git checkout FETCH_HEAD && \ |
| Nico Huber | 619d9c0 | 2024-04-20 17:51:20 +0200 | [diff] [blame] | 87 | export CC='$(CC)' STRIP='$(STRIP)' LIBS_BASE='$(LIBS_BASE)' && \ |
| 88 | export MAKECMD='$(MAKECMD)' MAKEARGS='$(subst ',\\\",$(MAKEARGS))' && \ |
| 89 | export MESONCMD='$(MESONCMD)' MESONARGS='$(subst ',\\\",$(MESONARGS))' && \ |
| 90 | export CPUS=$${CPUS:-1} $(ENV_VARS) && \ |
| 91 | ./test_build.sh" \ |
| Nico Huber | d4fbbb4 | 2022-12-11 17:02:57 +0000 | [diff] [blame] | 92 | $(if $(QUIET_TEST),>/dev/null 2>&1) \ |
| 93 | || { RET=$$?; echo $*: $${RET}; exit $${RET}; } |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 94 | |
| 95 | $(addsuffix -shell,$(ALL_TAGS)): %-shell: %-check-build |
| 96 | $(QUIET_SETUP)\ |
| 97 | if [ $$(docker ps -a -q -f name=mani_$(call ident,$*)) ]; then \ |
| 98 | docker commit mani_$(call ident,$*) mani_run/$* && \ |
| 99 | docker run --rm -it \ |
| Nico Huber | 48b1fde | 2022-12-11 17:15:27 +0000 | [diff] [blame] | 100 | $(MANI_DOCKER_ARGS) \ |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 101 | --env IDENT=$(call ident,$*) \ |
| Nico Huber | fb433ba | 2023-03-04 19:09:47 +0000 | [diff] [blame] | 102 | --volume manicache:/ccache \ |
| Nico Huber | bfe6484 | 2022-12-10 23:54:24 +0100 | [diff] [blame] | 103 | --network=manibuilder \ |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 104 | --entrypoint /bin/sh mani_run/$* \ |
| 105 | /home/mani/mani-wrapper.sh \ |
| 106 | $(patsubst %,"%",$(SHELL_ARG)); \ |
| 107 | docker image rm mani_run/$*; \ |
| 108 | else \ |
| 109 | docker run --rm -it \ |
| Nico Huber | 48b1fde | 2022-12-11 17:15:27 +0000 | [diff] [blame] | 110 | $(MANI_DOCKER_ARGS) \ |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 111 | --env IDENT=$(call ident,$*) \ |
| Nico Huber | fb433ba | 2023-03-04 19:09:47 +0000 | [diff] [blame] | 112 | --volume manicache:/ccache \ |
| Nico Huber | bfe6484 | 2022-12-10 23:54:24 +0100 | [diff] [blame] | 113 | --network=manibuilder \ |
| Nico Huber | e332db7 | 2025-03-01 13:45:56 +0100 | [diff] [blame] | 114 | mani/$(patsubst cross-%,cross,$*) \ |
| 115 | $(patsubst %,"%",$(SHELL_ARG)); \ |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 116 | fi |
| 117 | |
| 118 | .PHONY: $(foreach s,-build -check-build -shell, $(addsuffix $(s),$(ALL_TAGS))) |
| 119 | |
| 120 | register: |
| 121 | docker build . \ |
| 122 | -f Dockerfile.qemu-user-static \ |
| Nico Huber | 93bffcd | 2023-03-03 17:15:40 +0000 | [diff] [blame] | 123 | -t mani/qemu-user-static |
| 124 | docker run --rm --privileged mani/qemu-user-static --reset -p yes |
| Nico Huber | c0b52db | 2022-12-15 12:42:32 +0000 | [diff] [blame] | 125 | |
| Nico Huber | bfe6484 | 2022-12-10 23:54:24 +0100 | [diff] [blame] | 126 | mani-net: |
| 127 | $(QUIET_SETUP)\ |
| 128 | if [ -z "$$(docker network ls -qf name=manibuilder)" ]; then \ |
| 129 | docker network create manibuilder \ |
| 130 | $(if $(QUIET_SETUP),>/dev/null); \ |
| 131 | fi |
| 132 | |
| Nico Huber | fb9c18a | 2022-12-10 23:59:19 +0100 | [diff] [blame] | 133 | git-build: Dockerfile.git |
| 134 | $(QUIET_SETUP)docker build . -f $< -t mani/git |
| 135 | |
| 136 | local-git: TEST_LOCAL_GIT:=$(abspath $(wildcard \ |
| 137 | $(TEST_LOCAL)$(if $(filter %.git,$(TEST_LOCAL)),,/.git))) |
| 138 | local-git: git-check-build mani-net |
| 139 | $(QUIET_SETUP)\ |
| 140 | if [ -z "$(TEST_LOCAL_GIT)" ]; then \ |
| 141 | echo '$${TEST_LOCAL} should point to a Git repository.'; \ |
| 142 | exit 1; \ |
| 143 | fi; \ |
| 144 | if [ -n "$$(docker container ls -qf name=mani-git)" ]; then \ |
| 145 | if docker inspect -f '{{ .Mounts }}' mani-git | \ |
| 146 | grep -q ' $(TEST_LOCAL_GIT) '; then \ |
| 147 | exit 0; \ |
| 148 | else \ |
| 149 | docker stop mani-git >/dev/null; \ |
| 150 | fi; \ |
| 151 | fi; \ |
| 152 | docker run --rm --detach \ |
| 153 | --name mani-git \ |
| Nico Huber | c3b02dc | 2023-08-12 01:13:45 +0200 | [diff] [blame] | 154 | --volume=$(TEST_LOCAL_GIT):/git/flashprog.git:ro \ |
| Nico Huber | fb9c18a | 2022-12-10 23:59:19 +0100 | [diff] [blame] | 155 | --network=manibuilder \ |
| 156 | mani/git $(if $(QUIET_SETUP),>/dev/null) |
| 157 | |
| 158 | .PHONY: register mani-net git-build local-git |