Skip to content

Commit ddb5ab7

Browse files
committed
Makefile: rules for generating debian/ubuntu packages.
Add rules for generating debian and ubuntu packages, both natively or using a cross-building docker image we generate as necessary.
1 parent 194b990 commit ddb5ab7

File tree

1 file changed

+78
-7
lines changed

1 file changed

+78
-7
lines changed

Makefile

Lines changed: 78 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,32 @@ TAR_UPDATE := $(TAR) -uf
4848
TAR_COMPRESS := bzip2
4949
TAR_SUFFIX := bz2
5050

51+
# Metadata for packages, changelog, etc.
52+
USER_NAME ?= $(shell git config user.name)
53+
USER_EMAIL ?= $(shell git config user.email)
54+
BUILD_DATE ?= $(shell date -R)
55+
56+
HOST_DISTRO ?= $(shell [ -f /etc/os-release ] && eval `cat /etc/os-release`; echo $$ID)
57+
DEB_DISTRO ?= ubuntu
58+
5159
# RPM spec files we might want to generate.
5260
SPEC_FILES = $(shell find packaging -name \*.spec.in | sed 's/.spec.in/.spec/g' | uniq)
5361

5462
# Systemd collateral.
5563
SYSTEMD_DIRS = $(shell find cmd -name \*.service -o -name \*.socket | sed 's:cmd/::g;s:/.*::g'|uniq)
5664
SYSCONF_DIRS = $(shell find cmd -name \*.sysconf | sed 's:cmd/::g;s:/.*::g' | uniq)
5765

66+
# Extra options to pass to docker (for instance --network host).
67+
DOCKER_OPTIONS =
68+
69+
# Docker boilerplate/commands to build debian/ubuntu packages.
70+
DOCKER_DEB_BUILD := mkdir -p /build && cd /build && \
71+
git clone /input/cri-resource-manager && cd /build/cri-resource-manager && \
72+
make BUILD_DIRS=cri-resmgr deb
73+
74+
# Where to leave built packages, if/when we build them in containers.
75+
PACKAGES_DIR = packages
76+
5877
# Be quiet by default but let folks override it with Q= on the command line.
5978
Q := @
6079

@@ -129,7 +148,7 @@ image-%:
129148
fi; \
130149
echo "Vendoring dependencies..."; \
131150
go mod vendor && \
132-
scripts/build/docker-build --network=host $$buildopts $$src; \
151+
scripts/build/docker-build $(DOCKER_OPTIONS) $$buildopts $$src; \
133152
rc=$$?; \
134153
rm -fr vendor; \
135154
exit $$rc
@@ -176,7 +195,7 @@ test:
176195
$(GO_MODULES)
177196

178197
#
179-
# Rules for building dist-tarballs, SPEC-files and RPMs.
198+
# Rule for building dist-tarballs, SPEC files, RPMs, debian collateral, deb's.
180199
#
181200

182201
dist:
@@ -196,11 +215,10 @@ spec: clean-spec $(SPEC_FILES)
196215
%.spec:
197216
$(Q)echo "Generating RPM spec file $@..."; \
198217
eval `$(GIT_ID) .` && \
199-
cat $@.in | \
200-
sed "s/__VERSION__/$$rpmversion/g" | \
201-
sed "s/__TARVERSION__/$$gitversion/g" | \
202-
sed "s/__BUILDID__/$$gitbuildid/g" \
203-
> $@
218+
cp $@.in $@ && \
219+
sed -E -i -e "s/__VERSION__/$$rpmversion/g" \
220+
-e "s/__TARVERSION__/$$gitversion/g" \
221+
-e "s/__BUILDID__/$$gitbuildid/g" $@
204222

205223
clean-spec:
206224
$(Q)rm -f $(SPEC_FILES)
@@ -217,6 +235,59 @@ src.rpm source-rpm: spec dist
217235
cp cri-resource-manager*.tar.bz2 ~/rpmbuild/SOURCES && \
218236
rpmbuild -bs ~/rpmbuild/SPECS/cri-resource-manager.spec
219237

238+
debian/%: packaging/deb.in/%
239+
$(Q)echo "Generating debian packaging file $@..."; \
240+
mkdir -p debian; \
241+
eval `$(GIT_ID) .` && \
242+
tarball=cri-resource-manager-$$gitversion.tar && \
243+
cp $< $@ && \
244+
sed -E -i -e "s/__PACKAGE__/cri-resource-manager/g" \
245+
-e "s/__TARBALL__/$$tarball/g" \
246+
-e "s/__VERSION__/$$debversion/g" \
247+
-e "s/__AUTHOR__/$(USER_NAME)/g" \
248+
-e "s/__EMAIL__/$(USER_EMAIL)/g" \
249+
-e "s/__DATE__/$(BUILD_DATE)/g" \
250+
-e "s/__BUILD_DIRS__/$(BUILD_DIRS)/g" $@
251+
252+
clean-deb:
253+
$(Q)rm -f debian
254+
255+
deb: debian/changelog debian/control debian/rules debian/compat dist
256+
$(Q)if [ -z "$$BUILD_CONTAINER" -a "$(HOST_DISTRO)" != "$(DEB_DISTRO)" ]; then \
257+
$(MAKE) deb-docker-$(DEB_DISTRO); \
258+
exit $$?; \
259+
fi; \
260+
dpkg-buildpackage -uc
261+
262+
deb-docker-%: docker/%-build
263+
$(Q)distro=$(patsubst deb-docker-%,%,$@); \
264+
builddir=build/docker/$$distro; \
265+
outdir=$(PACKAGES_DIR)/$$distro; \
266+
echo "Docker cross-building $$distro packages..."; \
267+
mkdir -p $(PACKAGES_DIR)/$$distro && \
268+
rm -fr $$builddir && mkdir -p $$builddir && \
269+
docker run --rm -ti $(DOCKER_OPTIONS) --user $(shell echo $$USER) \
270+
--env USER_NAME="$(USER_NAME)" --env USER_EMAIL=$(USER_EMAIL) \
271+
-v $$(pwd):/input/cri-resource-manager \
272+
-v $$(pwd)/$$builddir:/build \
273+
-v $$(pwd)/$$outdir:/output \
274+
$$distro-build /bin/bash -c "export DEB_DISTRO=$$distro; $(DOCKER_DEB_BUILD)" && \
275+
cp $$builddir/cri-resource-manager*.* $$outdir && \
276+
rm -fr $$builddir
277+
278+
ubuntu-packages:
279+
$(MAKE) DEB_DISTRO=ubuntu deb
280+
281+
debian-packages:
282+
$(MAKE) DEB_DISTRO=debian deb
283+
284+
# Build a docker image (for distro cross-building).
285+
docker/%: dockerfiles/Dockerfile.%
286+
$(Q)img=$(patsubst docker/%,%,$@); \
287+
docker rm $$img || : && \
288+
echo "Building cross-build docker image $$img..."; \
289+
scripts/build/docker-build-image $$img --container $(DOCKER_OPTIONS)
290+
220291
# Rule for recompiling a changed protobuf.
221292
%.pb.go: %.proto
222293
$(Q)echo "Generating go code ($@) for updated protobuf $<..."; \

0 commit comments

Comments
 (0)