Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
151 lines (132 loc) · 4.19 KB
/
Copy pathMakefile
File metadata and controls
151 lines (132 loc) · 4.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# ----------------------------
# Config
# ----------------------------
BASE_DIR := $(shell cd $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) && pwd)
IMAGE_NAME ?= sepen/crux-multiarch
PLATFORMS ?= linux/amd64 linux/arm64 linux/arm/v7 linux/386
FOLDERS := 3.7 3.8
LATEST := 3.8
# Detect docker or podman
HAVE_DOCKER := $(shell command -v docker 2>/dev/null)
HAVE_PODMAN := $(shell command -v podman 2>/dev/null)
ifeq ($(HAVE_DOCKER),)
ifeq ($(HAVE_PODMAN),)
$(error Neither docker nor podman found in PATH)
else
ENGINE := podman
endif
else
ENGINE := docker
endif
# ----------------------------
# Helpers
# ----------------------------
iso2tar = \
ISO_FILE=$1; \
TAR_FILE=$$(basename $$ISO_FILE .iso).tar; \
EXTRACT_DIR=$$(mktemp -d iso2tar.XXXXXX); \
echo ">> Extracting $$ISO_FILE to $$TAR_FILE"; \
if bsdtar -tf $$ISO_FILE >/dev/null 2>&1; then \
bsdtar -C $$EXTRACT_DIR -xf $$ISO_FILE; \
elif command -v 7z >/dev/null 2>&1; then \
7z x $$ISO_FILE -o$$EXTRACT_DIR >/dev/null; \
else \
echo "ERROR: neither bsdtar nor 7z can extract $$ISO_FILE"; exit 1; \
fi; \
tar -cf $$TAR_FILE -C $$EXTRACT_DIR .; \
rm -rf $$EXTRACT_DIR; \
echo ">> Created $$TAR_FILE"
# ----------------------------
# Targets
# ----------------------------
.PHONY: all prepare build push manifest clean
all: build push
prepare:
@for FOLDER in $(FOLDERS); do \
$(MAKE) -C $(BASE_DIR)/$$FOLDER prepare-targets ; \
done
# ----------------------------
# Docker Buildx
# ----------------------------
ifeq ($(ENGINE),docker)
build: prepare
@echo ">> Building multi-arch image (no push)"
@for FOLDER in $(FOLDERS); do \
docker buildx build --platform=$(shell echo $(PLATFORMS) | tr ' ' ',') \
-t $(IMAGE_NAME):$$FOLDER \
-f $(BASE_DIR)/$$FOLDER/Dockerfile \
--load \
$(BASE_DIR)/$$FOLDER ; \
done
push: prepare
@echo ">> Building and pushing multi-arch image"
@for FOLDER in $(FOLDERS); do \
if [ "$$FOLDER" = "$(LATEST)" ]; then \
docker buildx build --platform=$(shell echo $(PLATFORMS) | tr ' ' ',') \
-t $(IMAGE_NAME):$$FOLDER \
-t $(IMAGE_NAME):latest \
-f $(BASE_DIR)/$$FOLDER/Dockerfile \
--push \
$(BASE_DIR)/$$FOLDER ; \
else \
docker buildx build --platform=$(shell echo $(PLATFORMS) | tr ' ' ',') \
-t $(IMAGE_NAME):$$FOLDER \
-f $(BASE_DIR)/$$FOLDER/Dockerfile \
--push \
$(BASE_DIR)/$$FOLDER ; \
fi ; \
done
manifest:
@for FOLDER in $(FOLDERS); do \
docker buildx imagetools inspect $(IMAGE_NAME):$$FOLDER ; \
done
clean:
@echo "Nothing to clean for Docker Buildx"
endif
# ----------------------------
# Podman multi-arch
# ----------------------------
ifeq ($(ENGINE),podman)
build: prepare
@echo ">> Building multi-arch image with Podman"
@for FOLDER in $(FOLDERS); do \
echo ">> Remove previous images and manifests"; \
podman rmi -f $(IMAGE_NAME):$$FOLDER || true ; \
podman manifest rm $(IMAGE_NAME):$$FOLDER || true ; \
echo ">> Create an empty manifest" ; \
podman manifest create $(IMAGE_NAME):$$FOLDER ; \
echo ">> Build and add each platform to the manifest" ; \
for PLATFORM in $(PLATFORMS); do \
echo ">> Building for $$PLATFORM"; \
podman build --platform $$PLATFORM \
--manifest $(IMAGE_NAME):$$FOLDER \
-f $(BASE_DIR)/$$FOLDER/Dockerfile \
$(BASE_DIR)/$$FOLDER ; \
done ; \
done
push:
@for FOLDER in $(FOLDERS); do \
if [ "$$FOLDER" = "$(LATEST)" ]; then \
echo ">> Pushing manifest $(IMAGE_NAME):$$FOLDER and latest to Docker Hub"; \
podman tag $(IMAGE_NAME):$$FOLDER $(IMAGE_NAME):latest ; \
podman manifest push --all $(IMAGE_NAME):$$FOLDER \
docker://docker.io/$(IMAGE_NAME):$$FOLDER ; \
podman manifest push --all $(IMAGE_NAME):latest \
docker://docker.io/$(IMAGE_NAME):latest ; \
else \
echo ">> Pushing manifest $(IMAGE_NAME):$$FOLDER to Docker Hub"; \
podman manifest push --all $(IMAGE_NAME):$$FOLDER \
docker://docker.io/$(IMAGE_NAME):$$FOLDER ; \
fi ; \
done
manifest:
@for FOLDER in $(FOLDERS); do \
echo ">> Inspecting manifest $(IMAGE_NAME):$$FOLDER"; \
podman manifest inspect $(IMAGE_NAME):$$FOLDER | jq . ; \
done
clean:
@for FOLDER in $(FOLDERS); do \
podman rmi -f $(IMAGE_NAME):$$FOLDER || true ; \
podman manifest rm $(IMAGE_NAME):$$FOLDER || true ; \
done
endif