xref: /unit/pkg/docker/Makefile (revision 2765:5e31d3ff500a)
1#!/usr/bin/make
2
3include ../../version
4include ../shasum.mak
5
6DEFAULT_VERSION := $(NXT_VERSION)
7
8VERSION ?= $(DEFAULT_VERSION)
9PATCHLEVEL ?= 1
10
11MODULES ?= go jsc node perl php python ruby wasm
12
13VARIANT ?= bullseye
14
15VERSIONS_minimal ?=
16CONTAINER_minimal ?= debian:$(VARIANT)-slim
17CONFIGURE_minimal ?=
18INSTALL_minimal ?=	version
19RUN_minimal ?=		/bin/true
20MODULE_PREBUILD_minimal ?= /bin/true
21
22VERSIONS_go ?=		1.21 1.22
23VARIANT_go ?=		$(VARIANT)
24$(foreach goversion, $(VERSIONS_go), $(eval CONTAINER_go$(goversion) = golang:$(goversion)-$(VARIANT_go)))
25CONFIGURE_go ?=		go --go-path=$$GOPATH
26INSTALL_go ?=		go-install-src libunit-install
27RUN_go ?=			/bin/true
28MODULE_PREBUILD_go ?= /bin/true
29
30VERSIONS_jsc ?=		11
31VARIANT_jsc ?=		jammy
32$(foreach jscversion, $(VERSIONS_jsc), $(eval CONTAINER_jsc$(jscversion) = eclipse-temurin:$(jscversion)-jdk-$(VARIANT_jsc)))
33CONFIGURE_jsc ?=	java --jars=/usr/share/unit-jsc-common/
34INSTALL_jsc ?=		java-shared-install java-install
35RUN_jsc ?=	 		rm -rf /root/.m2
36MODULE_PREBUILD_jsc ?= /bin/true
37
38VERSIONS_node ?=	20 21
39VARIANT_node ?=		$(VARIANT)
40$(foreach nodeversion, $(VERSIONS_node), $(eval CONTAINER_node$(nodeversion) = node:$(nodeversion)-$(VARIANT_node)))
41CONFIGURE_node ?=	nodejs --node-gyp=/usr/local/bin/node-gyp
42INSTALL_node ?=		node node-install libunit-install
43RUN_node ?=			rm -rf /root/.cache/ \&\& rm -rf /root/.npm
44MODULE_PREBUILD_node ?=	npm -g install node-gyp
45
46VERSIONS_perl ?=	5.36 5.38
47VARIANT_perl ?=		$(VARIANT)
48$(foreach perlversion, $(VERSIONS_perl), $(eval CONTAINER_perl$(perlversion) = perl:$(perlversion)-$(VARIANT_perl)))
49CONFIGURE_perl ?=	perl
50INSTALL_perl ?=		perl-install
51RUN_perl ?=			/bin/true
52MODULE_PREBUILD_perl ?=	/bin/true
53
54VERSIONS_php ?=		8.2 8.3
55VARIANT_php ?=		cli-$(VARIANT)
56$(foreach phpversion, $(VERSIONS_php), $(eval CONTAINER_php$(phpversion) = php:$(phpversion)-$(VARIANT_php)))
57CONFIGURE_php ?=	php
58INSTALL_php ?=		php-install
59RUN_php ?=			ldconfig
60MODULE_PREBUILD_php ?= /bin/true
61
62VERSIONS_python ?=  3.11 3.12
63VARIANT_python ?=	$(VARIANT)
64$(foreach pythonversion, $(VERSIONS_python), $(eval CONTAINER_python$(pythonversion) = python:$(pythonversion)-$(VARIANT_python)))
65CONFIGURE_python ?=	python --config=/usr/local/bin/python3-config
66INSTALL_python ?=	python3-install
67RUN_python ?=		/bin/true
68MODULE_PREBUILD_python ?= /bin/true
69
70VERSIONS_ruby ?=	3.2 3.3
71VARIANT_ruby ?=		$(VARIANT)
72$(foreach rubyversion, $(VERSIONS_ruby), $(eval CONTAINER_ruby$(rubyversion) = ruby:$(rubyversion)-$(VARIANT_ruby)))
73CONFIGURE_ruby ?=	ruby
74INSTALL_ruby ?=		ruby-install
75RUN_ruby ?=			gem install rack \&\& rm -rf /root/.local
76MODULE_PREBUILD_ruby ?=	/bin/true
77
78VERSIONS_wasm ?=
79CONTAINER_wasm ?= debian:$(VARIANT)-slim
80CONFIGURE_wasm ?= wasm --include-path=\`pwd\`/pkg/contrib/wasmtime/crates/c-api/include --lib-path=/usr/lib/\$$(dpkg-architecture -q DEB_HOST_MULTIARCH)/ \&\& ./configure wasm-wasi-component
81INSTALL_wasm ?=   wasm-install wasm-wasi-component-install
82RUN_wasm ?=       /bin/true
83
84define MODULE_PREBUILD_wasm
85apt-get install --no-install-recommends --no-install-suggests -y libclang-dev \\\n \
86\ \ \ \&\& export RUST_VERSION=1.76.0 \\\n \
87\ \ \ \&\& export RUSTUP_HOME=/usr/src/unit/rustup \\\n \
88\ \ \ \&\& export CARGO_HOME=/usr/src/unit/cargo \\\n    \
89\ \ \ \&\& export PATH=/usr/src/unit/cargo/bin:\$$PATH \\\n \
90\ \ \ \&\& dpkgArch="\$$\(dpkg --print-architecture\)" \\\n \
91\ \ \ \&\& case "\$${dpkgArch##*-}" in \\\n \
92\ \ \ \ \ \ amd64\) rustArch="x86_64-unknown-linux-gnu"; rustupSha256="0b2f6c8f85a3d02fde2efc0ced4657869d73fccfce59defb4e8d29233116e6db" ;; \\\n \
93\ \ \ \ \ \ arm64\) rustArch="aarch64-unknown-linux-gnu"; rustupSha256="673e336c81c65e6b16dcdede33f4cc9ed0f08bde1dbe7a935f113605292dc800" ;; \\\n \
94\ \ \ \ \ \ *\) echo \>\&2 "unsupported architecture: \$${dpkgArch}"; exit 1 ;; \\\n \
95\ \ \ \esac \\\n \
96\ \ \ \&\& url="https://static.rust-lang.org/rustup/archive/1.26.0/\$${rustArch}/rustup-init" \\\n \
97\ \ \ \&\& curl -L -O "\$$url" \\\n \
98\ \ \ \&\& echo "\$${rustupSha256} *rustup-init" | sha256sum -c - \\\n \
99\ \ \ \&\& chmod +x rustup-init \\\n \
100\ \ \ \&\& ./rustup-init -y --no-modify-path --profile minimal --default-toolchain \$$RUST_VERSION --default-host \$${rustArch} \\\n \
101\ \ \ \&\& rm rustup-init \\\n \
102\ \ \ \&\& rustup --version \\\n \
103\ \ \ \&\& cargo --version \\\n \
104\ \ \ \&\& rustc --version \\\n \
105\ \ \ \&\& make -C pkg/contrib .wasmtime \\\n \
106\ \ \ \&\& install -pm 755 pkg/contrib/wasmtime/target/release/libwasmtime.so /usr/lib/\$$\(dpkg-architecture -q DEB_HOST_MULTIARCH\)/
107endef
108
109default:
110	@echo "valid targets: all build dockerfiles library clean"
111
112MODVERSIONS = $(foreach module, $(MODULES), $(foreach modversion, $(shell for v in $(VERSIONS_$(module)); do echo $$v; done | sort -r), $(module)$(modversion))) wasm minimal
113
114modname = $(shell echo $1 | /usr/bin/tr -d '.01234567890-')
115
116dockerfiles: $(addprefix Dockerfile., $(MODVERSIONS))
117build: $(addprefix build-, $(MODVERSIONS))
118
119Dockerfile.%: ../../version template.Dockerfile
120	@echo "===> Building $@"
121	cat template.Dockerfile | sed \
122			-e 's,@@VERSION@@,$(VERSION),g' \
123			-e 's,@@PATCHLEVEL@@,$(PATCHLEVEL),g' \
124			-e 's,@@CONTAINER@@,$(CONTAINER_$*),g' \
125			-e 's,@@CONFIGURE@@,$(CONFIGURE_$(call modname, $*)),g' \
126			-e 's,@@INSTALL@@,$(INSTALL_$(call modname, $*)),g' \
127			-e 's,@@RUN@@,$(RUN_$(call modname, $*)),g' \
128			-e 's,@@MODULE_PREBUILD@@,$(MODULE_PREBUILD_$(call modname, $*)),g' \
129			-e 's,@@MODULE@@,$*,g' \
130			> $@
131
132build-%: Dockerfile.%
133	docker pull $(CONTAINER_$*)
134	docker build --no-cache -t unit:$(VERSION)-$* -f Dockerfile.$* .
135
136library:
137	@echo "# this file is generated via https://github.com/nginx/unit/blob/$(shell git describe --always --abbrev=0 HEAD)/pkg/docker/Makefile"
138	@echo ""
139	@echo "Maintainers: Unit Docker Maintainers <docker-maint@nginx.com> (@nginx)"
140	@echo "GitRepo: https://github.com/nginx/unit.git"
141	@previous=""; \
142	 for mod in $(MODVERSIONS); do \
143		echo ""; \
144		modname="$$( echo $$mod | tr -d '.0123456789-' )"; \
145		TAGS="$$mod $${mod%%.*} $$modname" ; \
146		TAGS="$$(echo $$TAGS | tr " " "\n" | sort -u -r | tr "\n" "," | sed "s/,/, /g")"; \
147		if [ "$$previous" = "$$modname" ]; then \
148			echo "Tags: $(VERSION)-$$mod, $$mod"; \
149		else \
150			if [ "$$mod" = "minimal" ]; then \
151				echo "Tags: $(VERSION)-$$mod, $${TAGS%, }, latest"; \
152			else \
153				echo "Tags: $(VERSION)-$$mod, $${TAGS%, }"; \
154			fi; \
155		fi; \
156		echo "Architectures: amd64, arm64v8"; \
157		echo "GitFetch: refs/heads/branches/packaging"; \
158		echo "GitCommit: $(shell git describe --always --abbrev=0 HEAD)"; \
159		echo "Directory: pkg/docker"; \
160		echo "File: Dockerfile.$$mod"; \
161		previous=$$(echo $$mod | tr -d '.0123456789-'); \
162	done
163
164diff: $(addprefix diff-, $(MODVERSIONS))
165
166diff-%:
167	@echo container-diff diff --type file daemon://$(CONTAINER_$*) daemon://unit:$(VERSION)-$*
168
169all: $(addprefix Dockerfile., $(MODVERSIONS))
170
171clean:
172	rm -f Dockerfile.*
173
174.PHONY: default build dockerfiles clean library
175