restructure kernel/Makefile

Signed-off-by: Avi Deitcher <avi@deitcher.net>
This commit is contained in:
Avi Deitcher 2024-01-24 18:16:16 +02:00
parent 421b48d43a
commit 752a35b1aa

View File

@ -12,13 +12,13 @@
# which is specific to a given kernel. perf packages are tagged the same way # which is specific to a given kernel. perf packages are tagged the same way
# kernel packages. # kernel packages.
RM = rm -f
# Name and Org on Hub # Name and Org on Hub
ORG?=linuxkit ORG?=linuxkit
PLATFORMS?=linux/amd64,linux/arm64 PLATFORMS?=linux/amd64,linux/arm64
IMAGE?=kernel IMAGE?=kernel
IMAGE_BCC:=kernel-bcc IMAGE_BCC:=kernel-bcc
IMAGE_PERF:=kernel-perf IMAGE_PERF:=kernel-perf
IMAGE_ZFS:=zfs-kmod
IMAGE_BUILDER=linuxkit/alpine:146f540f25cd92ec8ff0c5b0c98342a9a95e479e IMAGE_BUILDER=linuxkit/alpine:146f540f25cd92ec8ff0c5b0c98342a9a95e479e
# You can specify an extra options for the Makefile. This will: # You can specify an extra options for the Makefile. This will:
@ -26,9 +26,6 @@ IMAGE_BUILDER=linuxkit/alpine:146f540f25cd92ec8ff0c5b0c98342a9a95e479e
# - append $(EXTRA) to the CONFIG_LOCALVERSION of your kernel # - append $(EXTRA) to the CONFIG_LOCALVERSION of your kernel
EXTRA?= EXTRA?=
# You can enable debug options for the Makefile. This will:
# - append a config-dbg to the kernel config for your kernel/arch
# - append -dbg to the CONFIG_LOCALVERSION of your kernel
DEBUG?= DEBUG?=
ifeq ($(HASH),) ifeq ($(HASH),)
@ -44,14 +41,16 @@ endif
PUSH_MANIFEST:=$(shell git rev-parse --show-toplevel)/scripts/push-manifest.sh PUSH_MANIFEST:=$(shell git rev-parse --show-toplevel)/scripts/push-manifest.sh
ARCH := $(shell uname -m) ARCH := $(shell uname -m)
ifeq ($(ARCH),x86_64) ifeq ($(ARCH),$(filter $(ARCH),x86_64 amd64))
SUFFIX=-amd64 SUFFIX=-amd64
ARCH=x86_64
endif endif
ifeq ($(ARCH),$(filter $(ARCH),aarch64 arm64)) ifeq ($(ARCH),$(filter $(ARCH),aarch64 arm64))
SUFFIX=-arm64 SUFFIX=-arm64
ARCH=aarch64
endif endif
TAG=$(HASH)$(DIRTY) HASHTAG=$(HASH)$(DIRTY)
BUILD_LABEL=--label org.mobyproject.linuxkit.kernel.buildimage=$(IMAGE_BUILDER) BUILD_LABEL=--label org.mobyproject.linuxkit.kernel.buildimage=$(IMAGE_BUILDER)
@ -66,221 +65,127 @@ endif
LABELS=$(REPO_LABEL) $(COMMIT_LABEL) $(BUILD_LABEL) LABELS=$(REPO_LABEL) $(COMMIT_LABEL) $(BUILD_LABEL)
KERNEL_VERSIONS=
.PHONY: build push
# Targets:
# build: Builds all kernels
# push: Pushes and sign all tagged kernel images to hub
build:
push:
.PHONY: notdirty .PHONY: notdirty
notdirty: notdirty:
@if [ x"$(DIRTY)" != x ]; then echo "Your repository is not clean. Will not push image"; exit 1; fi @if [ x"$(DIRTY)" != x ]; then echo "Your repository is not clean. Will not push image"; exit 1; fi
# utility function
SPACE := $(eval) $(eval)
PERIOD := .
series = $(word 1,$(subst ., ,$(1))).$(word 2,$(subst ., ,$(1))).x
# A template for defining kernel build # word 1 is the release, word 2 is the tool
# Arguments: RELEASESEP := PART
# $1: Full kernel version, e.g., 4.9.22 toolname = $(word 2, $(subst $(RELEASESEP), ,$(1)))
# $2: Kernel "series", e.g., 4.9.x toolkernel = $(word 1, $(subst $(RELEASESEP), ,$(1)))
# $3: Build a specific kernel like -rt: Preempt-RT (used as suffix for image) toolimageextension = -$(call toolname,$(1)):$(call toolkernel,$(1))$(EXTRA)$(DEBUG)
# This defines targets like: toolimagebase = $(ORG)/$(IMAGE)$(call toolimageextension,$(1))
# build_4.9.x and push_4.9.x and adds them as dependencies toolimagehash = $(call toolimagebase,$(1))-$(HASHTAG)$(SUFFIX)
# to the global targets toolimagenohash = $(call toolimagebase,$(1))$(SUFFIX)
# Set $3 to "-rt", to build Preempt-RT kernels. This defines targets like toolkernelimage = $(ORG)/$(IMAGE):$(call toolkernel,$(1))$(EXTRA)$(DEBUG)-$(HASHTAG)$(SUFFIX)
# build_4.14.x-rt and adds "-rt" to the hub image name. baseimageextension = :$(1)$(EXTRA)$(DEBUG)
# Set $4 to "-dbg", to build debug kernels. This defines targets like baseimage = $(ORG)/$(IMAGE)$(call baseimageextension,$(1))
# build_4.9.x-dbg and adds "-dbg" to the hub image name. uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
# Set $3 to "-rt" and $4 to "-dbg" to build debug Preempt-RT kernel. cross_product = $(foreach p,$(1),$(addprefix $(p),$(2)))
define kernel
ifeq ($(4),)
KERNEL_VERSIONS+=$(1)
endif
buildx_$(2)$(3)$(4): Dockerfile Makefile $(wildcard patches-$(2)/*) $(wildcard config-$(2)*) config-dbg #
docker pull $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG) || \ # Kernel versions to build.
docker buildx build \ # Use all for kernels to be built on all platforms; use KERNELS_x86_64 or KERNELS_aarch64 for platform-specific kernels
--platform=$(PLATFORMS) --push \ KERNELS_all=6.6.13 5.15.27
--build-arg KERNEL_VERSION=$(1) \ KERNELS_x86_64=
--build-arg KERNEL_SERIES=$(2) \ KERNELS_aarch64=
--build-arg EXTRA=$(3) \
--build-arg DEBUG=$(4) \
--build-arg BUILD_IMAGE=$(IMAGE_BUILDER) \
$(LABELS) \
--no-cache -t $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG) .
build_$(2)$(3)$(4): Dockerfile Makefile $(wildcard patches-$(2)/*) $(wildcard config-$(2)*) config-dbg # deprecated versions. You might still be able to build them, but they are not built by default or supported
docker pull $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) || \ # Use all for kernels to be built on all platforms; use DEPRECATED_x86_64 or DEPRECATED_aarch64 for platform-specific kernels
DEPRECATED_all=5.10.104 5.11.4-rt
DEPRECATED_x86_64=5.4.172
DEPRECATED_aarch64=
KERNELS?=$(KERNELS_all) $(KERNELS_$(ARCH))
DEPRECATED?=$(DEPRECATED_all) $(DEPRECATED_$(ARCH))
# we build all tools across all platforms and kernels that we build
TOOLS=bcc perf
# kernel versions used for kconfig
KERNEL_VERSIONS=$(call uniq,$(foreach l,$(KERNELS),$(word 1,$(subst -, ,$(l)))))
.PHONY: build push setforce show-tags
# Targets:
# build: Builds all kernels
# push: Pushes and sign all tagged kernel images to hub
setforce:
$(eval FORCE=1)
build: $(addprefix build-,$(KERNELS))
push: $(addprefix push-,$(KERNELS))
show-tags: $(addprefix show-tag-,$(KERNELS))
build-%: buildkernel-% buildtools-%;
buildkernel-%: buildkerneldeps-% buildplainkernel-% builddebugkernel-%;
buildkerneldeps-%: Dockerfile Makefile $(wildcard patches-$(call series,$*)/*) $(wildcard config-$(call series,$*)*) ;
buildplainkernel-%: buildkerneldeps-%
$(eval BASEIMAGE=$(call baseimage,$*))
$(eval TARGETIMAGE=$(BASEIMAGE)-$(HASHTAG)$(SUFFIX))
$(eval EXTRATOOL=$(addprefix -,$(word 2,$(subst -, ,$*))))
([ -z "$(FORCE)" ] && docker pull $(TARGETIMAGE)) || \
docker build \ docker build \
--build-arg KERNEL_VERSION=$(1) \ --build-arg KERNEL_VERSION=$* \
--build-arg KERNEL_SERIES=$(2) \ --build-arg KERNEL_SERIES=$(call series,$*) \
--build-arg EXTRA=$(3) \ --build-arg EXTRA=$(EXTRATOOL) \
--build-arg DEBUG=$(4) \ --build-arg DEBUG=$(DEBUG) \
--build-arg BUILD_IMAGE=$(IMAGE_BUILDER) \ --build-arg BUILD_IMAGE=$(IMAGE_BUILDER) \
$(LABELS) \ $(LABELS) \
--no-cache -t $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) . --no-cache -t $(TARGETIMAGE) .
builddebugkernel-%: buildkerneldeps-%
$(MAKE) buildplainkernel-$* DEBUG=-dbg
forcebuild_$(2)$(3)$(4): Dockerfile Makefile $(wildcard patches-$(2)/*) $(wildcard config-$(2)*) config-dbg push-%: notdirty build-% pushkernel-% tagbuilder-% pushtools-%;
docker build \
--build-arg KERNEL_VERSION=$(1) \
--build-arg KERNEL_SERIES=$(2) \
--build-arg EXTRA=$(3) \
--build-arg DEBUG=$(4) \
--build-arg BUILD_IMAGE=$(IMAGE_BUILDER) \
$(LABELS) \
--no-cache -t $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) .
push_$(2)$(3)$(4): notdirty build_$(2)$(3)$(4) tagbuilder-%: notdirty
docker pull $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) || \ $(eval BUILDER_IMAGE=$(call baseimage,$*)-builder)
(docker push $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) && \ docker tag $(IMAGE_BUILDER) $(BUILDER_IMAGE)$(SUFFIX) && \
docker tag $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) $(ORG)/$(IMAGE):$(1)$(3)$(4)$(SUFFIX) && \ docker push $(BUILDER_IMAGE)$(SUFFIX) && \
docker push $(ORG)/$(IMAGE):$(1)$(3)$(4)$(SUFFIX) && \ $(PUSH_MANIFEST) $(BUILDER_IMAGE)
$(PUSH_MANIFEST) $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE):$(1)$(3)$(4))
forcepush_$(2)$(3)$(4): notdirty forcebuild_$(2)$(3)$(4) pushtagpush-%:
docker push $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) && \ $(eval BASEIMAGE=$(ORG)/$(IMAGE)$*)
docker tag $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) $(ORG)/$(IMAGE):$(1)$(3)$(4)$(SUFFIX) && \ $(eval HASHIMAGE=$(BASEIMAGE)-$(HASHTAG))
docker push $(ORG)/$(IMAGE):$(1)$(3)$(4)$(SUFFIX) && \ $(eval SUFFIXEDIMAGE=$(BASEIMAGE)$(SUFFIX))
$(PUSH_MANIFEST) $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG) && \ $(eval HASHANDSUFFIXIMAGE=$(HASHIMAGE)$(SUFFIX))
$(PUSH_MANIFEST) $(ORG)/$(IMAGE):$(1)$(3)$(4) ([ -z "$(FORCE)" ] && docker pull $(HASHANDSUFFIXIMAGE)) || \
(docker push $(HASHANDSUFFIXIMAGE) && \
docker tag $(HASHANDSUFFIXIMAGE) $(SUFFIXEDIMAGE) && \
docker push $(SUFFIXEDIMAGE) && \
$(PUSH_MANIFEST) $(HASHIMAGE) && \
$(PUSH_MANIFEST) $(BASEIMAGE))
# tag the builder and create the manifest pushkernel-%:
tagbuilder_$(2)$(3)$(4): notdirty $(MAKE) pushtagpush-$(call baseimageextension,$*)
docker tag $(IMAGE_BUILDER) $(ORG)/$(IMAGE):$(1)$(3)$(4)-builder$(SUFFIX) && \
docker push $(ORG)/$(IMAGE):$(1)$(3)$(4)-builder$(SUFFIX) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE):$(1)$(3)$(4)-builder
show-tag-%:
@echo $(eval BASEIMAGE=$(call baseimage,$*))-$(HASHTAG)
show-tag_$(2)$(3)$(4): buildtools-%: $(addprefix buildtool-%$(RELEASESEP),$(TOOLS));
@echo $(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)
build: build_$(2)$(3)$(4) buildtool-%:
forcebuild: forcebuild_$(2)$(3)$(4) $(eval TARGETIMAGE=$(call toolimagehash,$*))
push: push_image tagbuilder $(eval KERNELIMAGE=$(call toolkernelimage,$*))
push_image: push_$(2)$(3)$(4) $(eval TOOL=$(call toolname,$*))
forcepush: forcepush_image tagbuilder ([ -z "$(FORCE)" ] && docker pull $(TARGETIMAGE)) || \
forcepush_image: forcepush_$(2)$(3)$(4) docker build -f Dockerfile.$(TOOL) \
tagbuilder: tagbuilder_$(2)$(3)$(4) --build-arg IMAGE=$(KERNELIMAGE) \
show-tags: show-tag_$(2)$(3)$(4)
# Only build perf only on x86 and recent LTS and latest stable kernels
ifeq ($(ARCH),x86_64)
ifeq ($(2), $(filter $(2),5.15.x 5.10.x 5.4.x))
build_perf_$(2)$(3)$(4): build_$(2)$(3)$(4)
docker pull $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)-$(TAG)$(SUFFIX) || \
docker build -f Dockerfile.perf \
--build-arg IMAGE=$(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) \
--build-arg BUILD_IMAGE=$(IMAGE_BUILDER) \ --build-arg BUILD_IMAGE=$(IMAGE_BUILDER) \
--no-cache --network=none $(LABEL) -t $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)-$(TAG)$(SUFFIX) . --no-cache $(LABEL) -t $(TARGETIMAGE) .
forcebuild_perf_$(2)$(3)$(4): build_$(2)$(3)$(4) pushtools-%: $(addprefix pushtool-%$(RELEASESEP),$(TOOLS));
docker build -f Dockerfile.perf \
--build-arg IMAGE=$(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) \
--build-arg BUILD_IMAGE=$(IMAGE_BUILDER) \
--no-cache --network=none $(LABEL) -t $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)-$(TAG)$(SUFFIX) .
push_perf_$(2)$(3)$(4): notdirty build_perf_$(2)$(3)$(4) pushtool-%:
docker pull $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)-$(TAG)$(SUFFIX) || \ $(MAKE) pushtagpush-$(call toolimageextension,$*)
(docker push $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)-$(TAG)$(SUFFIX) && \
docker tag $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)-$(TAG)$(SUFFIX) $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)$(SUFFIX) && \
docker push $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)$(SUFFIX) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)-$(TAG) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4))
forcepush_perf_$(2)$(3)$(4): notdirty forcebuild_perf_$(2)$(3)$(4)
docker push $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)-$(TAG)$(SUFFIX) && \
docker tag $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)-$(TAG)$(SUFFIX) $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)$(SUFFIX) && \
docker push $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)$(SUFFIX) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)-$(TAG) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE_PERF):$(1)$(3)$(4)
build: build_perf_$(2)$(3)$(4)
forcebuild: forcebuild_perf_$(2)$(3)$(4)
push: push_perf_$(2)$(3)$(4)
forcepush: forcepush_perf_$(2)$(3)$(4)
endif
endif
# Only build bcc only on x86 and recent LTS and latest stable kernels
ifeq ($(ARCH),x86_64)
ifeq ($(2), $(filter $(2),5.15.x 5.10.x 5.4.x))
build_bcc_$(2)$(3)$(4): build_$(2)$(3)$(4)
docker pull $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)-$(TAG)$(SUFFIX) || \
docker build -f Dockerfile.bcc \
--build-arg IMAGE=$(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) \
--build-arg BUILD_IMAGE=$(IMAGE_BUILDER) \
--no-cache $(LABEL) -t $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)-$(TAG)$(SUFFIX) .
forcebuild_bcc_$(2)$(3)$(4): build_$(2)$(3)$(4)
docker build -f Dockerfile.bcc \
--build-arg IMAGE=$(ORG)/$(IMAGE):$(1)$(3)$(4)-$(TAG)$(SUFFIX) \
--build-arg BUILD_IMAGE=$(IMAGE_BUILDER) \
--no-cache $(LABEL) -t $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)-$(TAG)$(SUFFIX) .
push_bcc_$(2)$(3)$(4): notdirty build_bcc_$(2)$(3)$(4)
docker pull $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)-$(TAG)$(SUFFIX) || \
(docker push $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)-$(TAG)$(SUFFIX) && \
docker tag $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)-$(TAG)$(SUFFIX) $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)$(SUFFIX) && \
docker push $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)$(SUFFIX) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)-$(TAG) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4))
forcepush_bcc_$(2)$(3)$(4): notdirty forcebuild_bcc_$(2)$(3)$(4)
docker push $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)-$(TAG)$(SUFFIX) && \
docker tag $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)-$(TAG)$(SUFFIX) $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)$(SUFFIX) && \
docker push $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)$(SUFFIX) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)-$(TAG) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE_BCC):$(1)$(3)$(4)
build: build_bcc_$(2)$(3)$(4)
forcebuild: forcebuild_bcc_$(2)$(3)$(4)
push: push_bcc_$(2)$(3)$(4)
forcepush: forcepush_bcc_$(2)$(3)$(4)
endif
endif
ifeq ($(4),)
# ZFS does not compile against -dbg kernels because CONFIG_DEBUG_LOCK_ALLOC
# is incompatible with CDDL, apparently (this is ./configure check)
build_zfs_$(2)$(3): build_$(2)$(3)
docker pull $(ORG)/$(IMAGE_ZFS):$(1)$(3)-$(TAG)$(SUFFIX) || \
docker build -f Dockerfile.zfs \
--build-arg IMAGE=$(ORG)/$(IMAGE):$(1)$(3)-$(TAG)$(SUFFIX) \
--build-arg BUILD_IMAGE=$(IMAGE_BUILDER) \
--no-cache $(LABEL) -t $(ORG)/$(IMAGE_ZFS):$(1)$(3)-$(TAG)$(SUFFIX) .
push_zfs_$(2)$(3): notdirty build_zfs_$(2)$(3)
docker pull $(ORG)/$(IMAGE_ZFS):$(1)$(3)-$(TAG)$(SUFFIX) || \
(docker push $(ORG)/$(IMAGE_ZFS):$(1)$(3)-$(TAG)$(SUFFIX) && \
docker tag $(ORG)/$(IMAGE_ZFS):$(1)$(3)-$(TAG)$(SUFFIX) $(ORG)/$(IMAGE_ZFS):$(1)$(3)$(SUFFIX) && \
docker push $(ORG)/$(IMAGE_ZFS):$(1)$(3)$(SUFFIX) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE_ZFS):$(1)$(3)-$(TAG) && \
$(PUSH_MANIFEST) $(ORG)/$(IMAGE_ZFS):$(1)$(3))
endif
endef
#
# Build Targets
# Debug targets only for latest stable and LTS stable
#
ifeq ($(ARCH),x86_64)
$(eval $(call kernel,5.15.27,5.15.x,$(EXTRA),$(DEBUG)))
$(eval $(call kernel,5.15.27,5.15.x,,-dbg))
$(eval $(call kernel,5.10.104,5.10.x,$(EXTRA),$(DEBUG)))
$(eval $(call kernel,5.4.172,5.4.x,$(EXTRA),$(DEBUG)))
$(eval $(call kernel,5.11.4,5.11.x,-rt,))
else ifeq ($(ARCH),$(filter $(ARCH),aarch64 arm64))
$(eval $(call kernel,5.15.27,5.15.x,$(EXTRA),$(DEBUG)))
$(eval $(call kernel,5.10.104,5.10.x,$(EXTRA),$(DEBUG)))
$(eval $(call kernel,5.11.4,5.11.x,-rt,))
endif
# Target for kernel config # Target for kernel config
kconfig: kconfig: