Loading...
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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 | # SPDX-License-Identifier: GPL-2.0-only # Makefile for the different targets used to generate full packages of a kernel include $(srctree)/scripts/Kbuild.include include $(srctree)/scripts/Makefile.lib KERNELPATH := kernel-$(subst -,_,$(KERNELRELEASE)) # Include only those top-level files that are needed by make, plus the GPL copy TAR_CONTENT := Documentation LICENSES arch block certs crypto drivers fs \ include init io_uring ipc kernel lib mm net rust \ samples scripts security sound tools usr virt \ .config Makefile \ Kbuild Kconfig COPYING $(wildcard localversion*) quiet_cmd_src_tar = TAR $(2).tar.gz cmd_src_tar = \ if test "$(objtree)" != "$(srctree)"; then \ echo >&2; \ echo >&2 " ERROR:"; \ echo >&2 " Building source tarball is not possible outside the"; \ echo >&2 " kernel source tree. Don't set KBUILD_OUTPUT"; \ echo >&2; \ false; \ fi ; \ tar -I $(KGZIP) -c $(RCS_TAR_IGNORE) -f $(2).tar.gz \ --transform 's:^:$(2)/:S' $(TAR_CONTENT) $(3) # Git # --------------------------------------------------------------------------- filechk_HEAD = git -C $(srctree) rev-parse --verify HEAD 2>/dev/null .tmp_HEAD: check-git FORCE $(call filechk,HEAD) PHONY += check-git check-git: @if ! $(srctree)/scripts/check-git; then \ echo >&2 "error: creating source package requires git repository"; \ false; \ fi git-config-tar.gz = -c tar.tar.gz.command="$(KGZIP)" git-config-tar.bz2 = -c tar.tar.bz2.command="$(KBZIP2)" git-config-tar.lzma = -c tar.tar.lzma.command="$(LZMA)" git-config-tar.xz = -c tar.tar.xz.command="$(XZ)" git-config-tar.zst = -c tar.tar.zst.command="$(ZSTD)" quiet_cmd_archive = ARCHIVE $@ cmd_archive = git -C $(srctree) $(git-config-tar$(suffix $@)) archive \ --output=$$(realpath $@) $(archive-args) suffix-gzip := .gz suffix-bzip2 := .bz2 suffix-lzma := .lzma suffix-xz := .xz # Linux source tarball # --------------------------------------------------------------------------- linux-tarballs := $(addprefix linux, .tar.gz .tar.bz2 .tar.lzma .tar.xz) targets += $(linux-tarballs) $(linux-tarballs): archive-args = --prefix=linux/ $$(cat $<) $(linux-tarballs): .tmp_HEAD FORCE $(call if_changed,archive) # rpm-pkg srcrpm-pkg binrpm-pkg # --------------------------------------------------------------------------- quiet_cmd_mkspec = GEN $@ cmd_mkspec = $(srctree)/scripts/package/mkspec > $@ kernel.spec: FORCE $(call cmd,mkspec) PHONY += rpm-sources rpm-sources: linux.tar.gz $(Q)mkdir -p rpmbuild/SOURCES $(Q)ln -f linux.tar.gz rpmbuild/SOURCES/linux.tar.gz $(Q)cp $(KCONFIG_CONFIG) rpmbuild/SOURCES/config $(Q)$(srctree)/scripts/package/gen-diff-patch rpmbuild/SOURCES/diff.patch PHONY += rpm-pkg srcrpm-pkg binrpm-pkg rpm-pkg: private build-type := a srcrpm-pkg: private build-type := s binrpm-pkg: private build-type := b rpm-pkg srcrpm-pkg: rpm-sources rpm-pkg srcrpm-pkg binrpm-pkg: kernel.spec +$(strip rpmbuild -b$(build-type) kernel.spec \ --define='_topdir $(abspath rpmbuild)' \ $(if $(filter a b, $(build-type)), \ --target $(UTS_MACHINE)-linux --build-in-place --noprep --define='_smp_mflags %{nil}' \ $$(rpm -q rpm >/dev/null 2>&1 || echo --nodeps)) \ $(if $(filter b, $(build-type)), \ --without devel) \ $(RPMOPTS)) # deb-pkg srcdeb-pkg bindeb-pkg # --------------------------------------------------------------------------- KDEB_SOURCE_COMPRESS ?= gzip supported-deb-source-compress := gzip bzip2 lzma xz PHONY += linux.tar.unsupported-deb-src-compress linux.tar.unsupported-deb-src-compress: @echo "error: KDEB_SOURCE_COMPRESS=$(KDEB_SOURCE_COMPRESS) is not supported. The supported values are: $(supported-deb-source-compress)" >&2 @false debian-orig-suffix := \ $(strip $(if $(filter $(supported-deb-source-compress), $(KDEB_SOURCE_COMPRESS)), \ $(suffix-$(KDEB_SOURCE_COMPRESS)),.unsupported-deb-src-compress)) quiet_cmd_debianize = GEN $@ cmd_debianize = $(srctree)/scripts/package/mkdebian $(mkdebian-opts) debian: FORCE $(call cmd,debianize) PHONY += debian-orig debian-orig: private source = $(shell dpkg-parsechangelog -S Source) debian-orig: private version = $(shell dpkg-parsechangelog -S Version | sed 's/-[^-]*$$//') debian-orig: private orig-name = $(source)_$(version).orig.tar$(debian-orig-suffix) debian-orig: mkdebian-opts = --need-source debian-orig: linux.tar$(debian-orig-suffix) debian $(Q)if [ "$$(df --output=target .. 2>/dev/null)" = "$$(df --output=target $< 2>/dev/null)" ]; then \ ln -f $< ../$(orig-name); \ else \ cp $< ../$(orig-name); \ fi KBUILD_PKG_ROOTCMD ?= 'fakeroot -u' PHONY += deb-pkg srcdeb-pkg bindeb-pkg deb-pkg: private build-type := source,binary srcdeb-pkg: private build-type := source bindeb-pkg: private build-type := binary deb-pkg srcdeb-pkg: debian-orig bindeb-pkg: debian deb-pkg srcdeb-pkg bindeb-pkg: +$(strip dpkg-buildpackage \ --build=$(build-type) --no-pre-clean --unsigned-changes \ $(if $(findstring source, $(build-type)), \ --unsigned-source --compression=$(KDEB_SOURCE_COMPRESS)) \ $(if $(findstring binary, $(build-type)), \ --rules-file='$(MAKE) -f debian/rules' --jobs=1 -r$(KBUILD_PKG_ROOTCMD) -a$$(cat debian/arch), \ --no-check-builddeps) \ $(DPKG_FLAGS)) # snap-pkg # --------------------------------------------------------------------------- PHONY += snap-pkg snap-pkg: rm -rf $(objtree)/snap mkdir $(objtree)/snap $(MAKE) clean $(call cmd,src_tar,$(KERNELPATH)) sed "s@KERNELRELEASE@$(KERNELRELEASE)@; \ s@SRCTREE@$(shell realpath $(KERNELPATH).tar.gz)@" \ $(srctree)/scripts/package/snapcraft.template > \ $(objtree)/snap/snapcraft.yaml cd $(objtree)/snap && \ snapcraft --target-arch=$(UTS_MACHINE) # dir-pkg tar*-pkg - tarball targets # --------------------------------------------------------------------------- tar-install: FORCE $(Q)$(MAKE) -f $(srctree)/Makefile +$(Q)$(srctree)/scripts/package/buildtar $@ compress-tar.gz = -I "$(KGZIP)" compress-tar.bz2 = -I "$(KBZIP2)" compress-tar.xz = -I "$(XZ)" compress-tar.zst = -I "$(ZSTD)" quiet_cmd_tar = TAR $@ cmd_tar = cd $<; tar cf ../$@ $(compress-tar$(suffix $@)) --owner=root --group=root --sort=name * dir-tarballs := $(addprefix linux-$(KERNELRELEASE)-$(ARCH), .tar .tar.gz .tar.bz2 .tar.xz .tar.zst) $(dir-tarballs): tar-install $(call cmd,tar) PHONY += dir-pkg dir-pkg: tar-install @echo "Kernel tree successfully created in $<" PHONY += tar-pkg tar-pkg: linux-$(KERNELRELEASE)-$(ARCH).tar @: tar%-pkg: linux-$(KERNELRELEASE)-$(ARCH).tar.% FORCE @: # perf-tar*-src-pkg - generate a source tarball with perf source # --------------------------------------------------------------------------- .tmp_perf: $(Q)mkdir .tmp_perf .tmp_perf/HEAD: .tmp_HEAD | .tmp_perf $(call cmd,copy) quiet_cmd_perf_version_file = GEN $@ cmd_perf_version_file = cd $(srctree)/tools/perf; util/PERF-VERSION-GEN $(dir $(abspath $@)) # PERF-VERSION-FILE and .tmp_HEAD are independent, but this avoids updating the # timestamp of PERF-VERSION-FILE. # The best is to fix tools/perf/util/PERF-VERSION-GEN. .tmp_perf/PERF-VERSION-FILE: .tmp_HEAD $(srctree)/tools/perf/util/PERF-VERSION-GEN | .tmp_perf $(call cmd,perf_version_file) perf-archive-args = --add-file=$$(realpath $(word 2, $^)) \ --add-file=$$(realpath $(word 3, $^)) \ $$(cat $(word 2, $^))^{tree} $$(cat $<) perf-tarballs := $(addprefix perf-$(KERNELVERSION), .tar .tar.gz .tar.bz2 .tar.xz .tar.zst) targets += $(perf-tarballs) $(perf-tarballs): archive-args = --prefix=perf-$(KERNELVERSION)/ $(perf-archive-args) $(perf-tarballs): tools/perf/MANIFEST .tmp_perf/HEAD .tmp_perf/PERF-VERSION-FILE FORCE $(call if_changed,archive) PHONY += perf-tar-src-pkg perf-tar-src-pkg: perf-$(KERNELVERSION).tar @: perf-tar%-src-pkg: perf-$(KERNELVERSION).tar.% FORCE @: # Help text displayed when executing 'make help' # --------------------------------------------------------------------------- PHONY += help help: @echo ' rpm-pkg - Build both source and binary RPM kernel packages' @echo ' srcrpm-pkg - Build only the source kernel RPM package' @echo ' binrpm-pkg - Build only the binary kernel RPM package' @echo ' deb-pkg - Build both source and binary deb kernel packages' @echo ' srcdeb-pkg - Build only the source kernel deb package' @echo ' bindeb-pkg - Build only the binary kernel deb package' @echo ' snap-pkg - Build only the binary kernel snap package' @echo ' (will connect to external hosts)' @echo ' dir-pkg - Build the kernel as a plain directory structure' @echo ' tar-pkg - Build the kernel as an uncompressed tarball' @echo ' targz-pkg - Build the kernel as a gzip compressed tarball' @echo ' tarbz2-pkg - Build the kernel as a bzip2 compressed tarball' @echo ' tarxz-pkg - Build the kernel as a xz compressed tarball' @echo ' tarzst-pkg - Build the kernel as a zstd compressed tarball' @echo ' perf-tar-src-pkg - Build the perf source tarball with no compression' @echo ' perf-targz-src-pkg - Build the perf source tarball with gzip compression' @echo ' perf-tarbz2-src-pkg - Build the perf source tarball with bz2 compression' @echo ' perf-tarxz-src-pkg - Build the perf source tarball with xz compression' @echo ' perf-tarzst-src-pkg - Build the perf source tarball with zst compression' PHONY += FORCE FORCE: # Read all saved command lines and dependencies for the $(targets) we # may be building above, using $(if_changed{,_dep}). As an # optimization, we don't need to read them if the target does not # exist, we will rebuild anyway in that case. existing-targets := $(wildcard $(sort $(targets))) -include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) .PHONY: $(PHONY) |