blob: 7109ce281de6f5b5d9a6fad68ebcf076258f62c8 [file] [log] [blame]
Nico Huberc0b52db2022-12-15 12:42:32 +00001QUIET_TEST := @
2
3include Makefile.targets
4
5CC := ccache cc
6MAKECMD := make
7MAKEARGS := CONFIG_EVERYTHING=yes
Nico Huber619d9c02024-04-20 17:51:20 +02008MESONCMD := meson
9MESONARGS := -D programmer=all -D classic_cli_print_wiki=enabled --auto-features enabled
Nico Huberc0b52db2022-12-15 12:42:32 +000010
11spc :=
12spc := $(spc) $(spc)
13
Nico Huberf8785ae2025-03-02 13:05:34 +010014# Replace %$(2) -> %/$(2), e.g. armv5 with arm/v5 etc.
15preproc_subst = $(if $(2),$(call preproc_arch,$(patsubst %$(2),%/$(2),$(1)),$(3)),$(1))
16preproc_arch = $(call preproc_subst,$(1),$(firstword $(2)),$(wordlist 2,$(words $(2)),$(2)))
17
Nico Huber05f0f7c2023-03-03 17:08:16 +000018# Get stem of multiarch tags of the form `stem[-variation]:arch-version`
19ma_stem = $(word 1,$(subst -,$(spc),$(subst :,$(spc),$(subst \:,$(spc),$(1)))))
20# Get stem of official tags of the form `arch/stem:version`
21official_stem = $(word 2,$(subst /,$(spc),$(subst :,$(spc),$(subst \:,$(spc),$(1)))))
Nico Huberf8785ae2025-03-02 13:05:34 +010022# Get arch prefix of official tags
23official_arch = $(word 1,$(subst /,$(spc),$(1)))
24# Create a platform string from the arch prefix, e.g. arm32v5 -> linux/arm/v5
25official_plat = linux/$(patsubst arm32%,arm%,$(call preproc_arch,$(call official_arch,$(1)),v5 v6 v7 v8))
Nico Huber05f0f7c2023-03-03 17:08:16 +000026
27ident = $(subst /,_,$(subst :,_,$(subst \:,_,$(1))))
Nico Huberc0b52db2022-12-15 12:42:32 +000028
Nico Huber6f6a1c32023-03-17 12:56:49 +000029include Makefile.env
Nico Huberc0b52db2022-12-15 12:42:32 +000030include Makefile.anita
Nico Hubere332db72025-03-01 13:45:56 +010031include Makefile.cross
Nico Huberc0b52db2022-12-15 12:42:32 +000032
Nico Huber05f0f7c2023-03-03 17:08:16 +000033# $(1): mani tag
34# $(2): from tag
35# $(3): Dockerfile suffix
Nico Huberf8785ae2025-03-02 13:05:34 +010036# $(4): platform (optional)
Nico Huberc0b52db2022-12-15 12:42:32 +000037define build_template
Nico Huber05f0f7c2023-03-03 17:08:16 +000038Dockerfile.$(call ident,$(1)): Dockerfile.$(3) mani-wrapper.sh
39 $(QUIET_SETUP)sed -e 's|^FROM manibase|FROM $(2)|' $$< >$$@
Nico Huberc0b52db2022-12-15 12:42:32 +000040
41.INTERMEDIATE: Dockerfile.$(call ident,$(1))
42
Nico Huberdea89842025-03-02 13:13:31 +010043$(1)-build: Dockerfile.$(call ident,$(1)) source-check-build
Nico Huberf8785ae2025-03-02 13:05:34 +010044 $(QUIET_SETUP)docker build . \
45 $(addprefix --platform$(spc),$(4)) -f $$< -t mani/$(1) \
46 --build-arg IDENT=$(call ident,$(1)) $$(DOCKER_BUILD_ARGS)
Nico Huberc0b52db2022-12-15 12:42:32 +000047endef
48
49$(foreach tag,$(MULTIARCH_TAGS), \
Nico Huber05f0f7c2023-03-03 17:08:16 +000050 $(eval $(call build_template,$(tag),multiarch/$(tag),$(call ma_stem,$(tag)))))
51
52$(foreach tag,$(OFFICIAL_TAGS), \
Nico Huberf8785ae2025-03-02 13:05:34 +010053 $(eval $(call build_template,$(tag),$(tag),$(call official_stem,$(tag)),$(call official_plat,$(tag)))))
Nico Huberc0b52db2022-12-15 12:42:32 +000054
Nico Huberc0b52db2022-12-15 12:42:32 +000055djgpp\:6.1.0-build: %-build: Dockerfile.djgpp mani-wrapper.sh
Nico Huberfb433ba2023-03-04 19:09:47 +000056 $(QUIET_SETUP)docker build . -f $< -t mani/$* --build-arg IDENT=$(call ident,$*)
Nico Huberc0b52db2022-12-15 12:42:32 +000057
Nico Huberdea89842025-03-02 13:13:31 +010058source-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 Hubere332db72025-03-01 13:45:56 +010065$(addsuffix -check-build,source git cross $(NONCROSS_TAGS)): %-check-build:
Nico Huberc0b52db2022-12-15 12:42:32 +000066 $(QUIET_SETUP)\
67 [ $$(docker image ls -q mani/$*) ] \
68 || $(MAKE) $*-build $(if $(QUIET_SETUP),>/dev/null 2>/dev/null)
Nico Hubere332db72025-03-01 13:45:56 +010069$(addsuffix -check-build,$(CROSS_TAGS)): cross-check-build
Nico Huberc0b52db2022-12-15 12:42:32 +000070
Nico Huberc0b52db2022-12-15 12:42:32 +000071$(ALL_TAGS): export QUIET_SETUP=$(QUIET_TEST)
Nico Huber725a19e2022-12-11 00:01:04 +010072$(ALL_TAGS): export TEST_REMOTE?=$(if $(TEST_LOCAL),\
Nico Huberc3b02dc2023-08-12 01:13:45 +020073 git://mani-git/flashprog.git,\
Nico Huber39152af2024-04-20 16:42:33 +020074 https://review.sourcearcade.org/flashprog.git)
Nico Huber25ea7172023-03-03 17:06:30 +000075$(ALL_TAGS): export TEST_REVISION?=$(if $(TEST_LOCAL),HEAD,main)
Nico Huber725a19e2022-12-11 00:01:04 +010076$(ALL_TAGS): %: %-check-build mani-net $(if $(TEST_LOCAL),local-git)
Nico Huberc0b52db2022-12-15 12:42:32 +000077 $(QUIET_TEST)docker rm -f mani_$(call ident,$*) >/dev/null 2>&1 || true
78 $(QUIET_TEST)\
79 docker run \
Nico Huber48b1fde2022-12-11 17:15:27 +000080 $(MANI_DOCKER_ARGS) \
Nico Huberc0b52db2022-12-15 12:42:32 +000081 --env IDENT=$(call ident,$*) \
Nico Huberfb433ba2023-03-04 19:09:47 +000082 --volume manicache:/ccache \
Nico Huberbfe64842022-12-10 23:54:24 +010083 --network=manibuilder \
Nico Hubere332db72025-03-01 13:45:56 +010084 --name mani_$(call ident,$*) mani/$(patsubst cross-%,cross,$*) \
Nico Huberaa359a72022-12-10 23:52:46 +010085 "git fetch $(TEST_REMOTE) $(TEST_REVISION) && \
Nico Huberc0b52db2022-12-15 12:42:32 +000086 git checkout FETCH_HEAD && \
Nico Huber619d9c02024-04-20 17:51:20 +020087 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 Huberd4fbbb42022-12-11 17:02:57 +000092 $(if $(QUIET_TEST),>/dev/null 2>&1) \
93 || { RET=$$?; echo $*: $${RET}; exit $${RET}; }
Nico Huberc0b52db2022-12-15 12:42:32 +000094
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 Huber48b1fde2022-12-11 17:15:27 +0000100 $(MANI_DOCKER_ARGS) \
Nico Huberc0b52db2022-12-15 12:42:32 +0000101 --env IDENT=$(call ident,$*) \
Nico Huberfb433ba2023-03-04 19:09:47 +0000102 --volume manicache:/ccache \
Nico Huberbfe64842022-12-10 23:54:24 +0100103 --network=manibuilder \
Nico Huberc0b52db2022-12-15 12:42:32 +0000104 --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 Huber48b1fde2022-12-11 17:15:27 +0000110 $(MANI_DOCKER_ARGS) \
Nico Huberc0b52db2022-12-15 12:42:32 +0000111 --env IDENT=$(call ident,$*) \
Nico Huberfb433ba2023-03-04 19:09:47 +0000112 --volume manicache:/ccache \
Nico Huberbfe64842022-12-10 23:54:24 +0100113 --network=manibuilder \
Nico Hubere332db72025-03-01 13:45:56 +0100114 mani/$(patsubst cross-%,cross,$*) \
115 $(patsubst %,"%",$(SHELL_ARG)); \
Nico Huberc0b52db2022-12-15 12:42:32 +0000116 fi
117
118.PHONY: $(foreach s,-build -check-build -shell, $(addsuffix $(s),$(ALL_TAGS)))
119
120register:
121 docker build . \
122 -f Dockerfile.qemu-user-static \
Nico Huber93bffcd2023-03-03 17:15:40 +0000123 -t mani/qemu-user-static
124 docker run --rm --privileged mani/qemu-user-static --reset -p yes
Nico Huberc0b52db2022-12-15 12:42:32 +0000125
Nico Huberbfe64842022-12-10 23:54:24 +0100126mani-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 Huberfb9c18a2022-12-10 23:59:19 +0100133git-build: Dockerfile.git
134 $(QUIET_SETUP)docker build . -f $< -t mani/git
135
136local-git: TEST_LOCAL_GIT:=$(abspath $(wildcard \
137 $(TEST_LOCAL)$(if $(filter %.git,$(TEST_LOCAL)),,/.git)))
138local-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 Huberc3b02dc2023-08-12 01:13:45 +0200154 --volume=$(TEST_LOCAL_GIT):/git/flashprog.git:ro \
Nico Huberfb9c18a2022-12-10 23:59:19 +0100155 --network=manibuilder \
156 mani/git $(if $(QUIET_SETUP),>/dev/null)
157
158.PHONY: register mani-net git-build local-git