2023-08-01 05:19:26 -07:00
|
|
|
#!/usr/bin/make -f
|
|
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
|
2023-12-26 06:52:43 -07:00
|
|
|
# in case debian/rules is executed directly
|
|
|
|
export DEB_RULES_REQUIRES_ROOT := no
|
|
|
|
|
2023-08-01 05:19:26 -07:00
|
|
|
include debian/rules.vars
|
|
|
|
|
kbuild: deb-pkg: support DEB_BUILD_OPTIONS=parallel=N in debian/rules
'make srcdeb-pkg' generates a source package, which you can build
later by using dpkg-buildpackage.
In older dpkg versions, 'dpkg-buildpackage --jobs=N' sets not only
DEB_BUILD_OPTIONS but also MAKEFLAGS. Hence, passing -j or --jobs
to dpkg-buildpackage was enough for kicking the parallel execution.
The behavior was changed by commit 1d0ea9b2ba3f ("dpkg-buildpackage:
Change -j, --jobs semantics to non-force mode") of dpkg project. [1]
Since then, 'dpkg-buildpackage --jobs=N' sets only DEB_BUILD_OPTIONS,
which is not parsed by the current debian/rules. To build the package
in parallel, you need to pass the alternative --jobs-force option or
set the MAKEFLAGS environment variable.
Debian policy [2] suggests the following code snippet for debian/rules.
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
MAKEFLAGS += -j$(NUMJOBS)
endif
I tweaked the code to filter out parallel=1 and passed --jobs=1 to
dpkg-buildpackage from scripts/Makefile.package. It is needed to force
'make deb-pkg' without the -j option to run in serial. Please note that
dpkg-buildpackage sets parallel=<nproc> in DEB_BUILD_OPTIONS by default
(that is, --jobs=auto is the default) and --jobs=1 is needed to restore
the serial execution. When dpkg-buildpackage is invoked from Kbuild,
the number of jobs is inherited from the top level Makefile. Passing
--jobs=1 to dpkg-buildpackage allows debian/rules to skip parsing
DEB_BUILD_OPTIONS.
[1] https://salsa.debian.org/dpkg-team/dpkg/-/commit/1d0ea9b2ba3f6a2de5b1a6ff55f3df7b71f73db6
[2] https://www.debian.org/doc/debian-policy/ch-source.html#s-debianrules-options
Reported-by: Bastian Germann <bage@linutronix.de>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2023-08-20 15:18:02 -07:00
|
|
|
ifneq (,$(filter-out parallel=1,$(filter parallel=%,$(DEB_BUILD_OPTIONS))))
|
|
|
|
NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
|
|
|
|
MAKEFLAGS += -j$(NUMJOBS)
|
|
|
|
endif
|
|
|
|
|
2024-01-13 03:43:36 -07:00
|
|
|
# When KBUILD_VERBOSE is undefined (presumably you are directly working with
|
|
|
|
# the debianized tree), show verbose logs unless DEB_BUILD_OPTION=terse is set.
|
|
|
|
ifeq ($(origin KBUILD_VERBOSE),undefined)
|
|
|
|
ifeq (,$(filter terse,$(DEB_BUILD_OPTIONS)))
|
|
|
|
export KBUILD_VERBOSE := 1
|
2024-01-13 03:43:37 -07:00
|
|
|
else
|
|
|
|
Q := @
|
2024-01-13 03:43:36 -07:00
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
2023-12-26 06:52:39 -07:00
|
|
|
revision = $(lastword $(subst -, ,$(shell dpkg-parsechangelog -S Version)))
|
|
|
|
CROSS_COMPILE ?= $(filter-out $(DEB_BUILD_GNU_TYPE)-, $(DEB_HOST_GNU_TYPE)-)
|
|
|
|
make-opts = ARCH=$(ARCH) KERNELRELEASE=$(KERNELRELEASE) KBUILD_BUILD_VERSION=$(revision) $(addprefix CROSS_COMPILE=,$(CROSS_COMPILE))
|
2023-12-26 06:52:38 -07:00
|
|
|
|
2024-01-13 03:43:38 -07:00
|
|
|
binary-targets := $(addprefix binary-, image image-dbg headers libc-dev)
|
|
|
|
|
|
|
|
all-packages = $(shell dh_listpackages)
|
|
|
|
image-package = $(filter linux-image-% user-%, $(filter-out %-dbg, $(all-packages)))
|
|
|
|
image-dbg-package = $(filter %-dbg, $(all-packages))
|
|
|
|
libc-dev-package = $(filter linux-libc-dev, $(all-packages))
|
|
|
|
headers-package = $(filter linux-headers-%, $(all-packages))
|
|
|
|
|
|
|
|
mk-files = $(patsubst binary-%,debian/%.files,$1)
|
|
|
|
package = $($(@:binary-%=%-package))
|
|
|
|
|
|
|
|
# DH_OPTION is an environment variable common for all debhelper commands.
|
|
|
|
# We could 'export' it, but here it is passed from the command line to clarify
|
|
|
|
# which package is being processed in the build log.
|
|
|
|
DH_OPTIONS = -p$(package)
|
|
|
|
|
|
|
|
define binary
|
2024-01-13 03:43:39 -07:00
|
|
|
$(Q)dh_testdir $(DH_OPTIONS)
|
|
|
|
$(Q)dh_testroot $(DH_OPTIONS)
|
|
|
|
$(Q)dh_prep $(DH_OPTIONS)
|
2024-01-13 03:43:38 -07:00
|
|
|
$(Q)+$(MAKE) $(make-opts) run-command KBUILD_RUN_COMMAND='+$$(srctree)/scripts/package/builddeb $(package)'
|
|
|
|
$(Q)dh_installdocs $(DH_OPTIONS)
|
|
|
|
$(Q)dh_installchangelogs $(DH_OPTIONS)
|
|
|
|
$(Q)dh_compress $(DH_OPTIONS)
|
|
|
|
$(Q)dh_fixperms $(DH_OPTIONS)
|
|
|
|
$(Q)dh_gencontrol $(DH_OPTIONS) -- -f$(call mk-files,$@)
|
|
|
|
$(Q)dh_md5sums $(DH_OPTIONS)
|
|
|
|
$(Q)dh_builddeb $(DH_OPTIONS) -- $(addprefix -Z,$(KDEB_COMPRESS))
|
|
|
|
endef
|
|
|
|
|
|
|
|
.PHONY: $(binary-targets)
|
|
|
|
$(binary-targets): build-arch
|
|
|
|
$(Q)truncate -s0 $(call mk-files,$@)
|
|
|
|
$(if $(package),$(binary))
|
|
|
|
|
2023-08-01 05:19:26 -07:00
|
|
|
.PHONY: binary binary-indep binary-arch
|
|
|
|
binary: binary-arch binary-indep
|
|
|
|
binary-indep: build-indep
|
2024-01-13 03:43:38 -07:00
|
|
|
binary-arch: $(binary-targets)
|
|
|
|
$(Q)cat $(call mk-files,$^) > debian/files
|
2023-08-01 05:19:26 -07:00
|
|
|
|
|
|
|
.PHONY: build build-indep build-arch
|
|
|
|
build: build-arch build-indep
|
|
|
|
build-indep:
|
|
|
|
build-arch:
|
2024-01-13 03:43:37 -07:00
|
|
|
$(Q)$(MAKE) $(make-opts) olddefconfig
|
|
|
|
$(Q)$(MAKE) $(make-opts) $(if $(filter um,$(ARCH)),,headers) all
|
2023-08-01 05:19:26 -07:00
|
|
|
|
|
|
|
.PHONY: clean
|
|
|
|
clean:
|
2024-01-13 03:43:39 -07:00
|
|
|
$(Q)dh_clean
|
|
|
|
$(Q)rm -rf debian/deb-env.vars* debian/*.files
|
2024-01-13 03:43:37 -07:00
|
|
|
$(Q)$(MAKE) ARCH=$(ARCH) clean
|
kbuild: deb-pkg: set DEB_* variables if debian/rules is directly executed
Since commit 491b146d4c13 ("kbuild: builddeb: Eliminate debian/arch
use"), direct execution of debian/rules results in the following error:
dpkg-architecture: error: unknown option 'DEB_HOST_MULTIARCH'
The current code:
dpkg-architecture -a$DEB_HOST_ARCH -qDEB_HOST_MULTIARCH
... does not look sensible because:
- For this code to work correctly, DEB_HOST_ARCH must be pre-defined,
which is true when the packages are built via dpkg-buildpackage.
In this case, DEB_HOST_MULTIARCH is also likely defined, hence there
is no need to query DEB_HOST_MULTIARCH in the first place.
- If DEB_HOST_MULTIARCH is undefined, DEB_HOST_ARCH is likely undefined
too. So, you cannot query DEB_HOST_MULTIARCH in this way. This is
mostly the case where debian/rules is directly executed.
When debian/rules is directly executed, querying DEB_HOST_MUCHARCH is
not enough because we need to know DEB_{BUILD,HOST}_GNU_TYPE as well.
All DEB_* variables are defined when the package build is initiated by
dpkg-buildpackage, but otherwise, let's call dpkg-architecture to set
all DEB_* environment variables.
This requires dpkg 1.20.6 or newer because --print-format option
was added in dpkg commit 7c54fa2b232e ("dpkg-architecture: Add a
--print-format option").
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Reviewed-by: Nicolas Schier <n.schier@avm.de>
2023-12-26 06:52:40 -07:00
|
|
|
|
|
|
|
# If DEB_HOST_ARCH is empty, it is likely that debian/rules was executed
|
|
|
|
# directly. Run 'dpkg-architecture --print-set --print-format=make' to
|
|
|
|
# generate a makefile construct that exports all DEB_* variables.
|
|
|
|
ifndef DEB_HOST_ARCH
|
|
|
|
include debian/deb-env.vars
|
|
|
|
|
|
|
|
debian/deb-env.vars:
|
2024-01-13 03:43:37 -07:00
|
|
|
$(Q)dpkg-architecture -a$$(cat debian/arch) --print-set --print-format=make > $@.tmp
|
|
|
|
$(Q)mv $@.tmp $@
|
kbuild: deb-pkg: set DEB_* variables if debian/rules is directly executed
Since commit 491b146d4c13 ("kbuild: builddeb: Eliminate debian/arch
use"), direct execution of debian/rules results in the following error:
dpkg-architecture: error: unknown option 'DEB_HOST_MULTIARCH'
The current code:
dpkg-architecture -a$DEB_HOST_ARCH -qDEB_HOST_MULTIARCH
... does not look sensible because:
- For this code to work correctly, DEB_HOST_ARCH must be pre-defined,
which is true when the packages are built via dpkg-buildpackage.
In this case, DEB_HOST_MULTIARCH is also likely defined, hence there
is no need to query DEB_HOST_MULTIARCH in the first place.
- If DEB_HOST_MULTIARCH is undefined, DEB_HOST_ARCH is likely undefined
too. So, you cannot query DEB_HOST_MULTIARCH in this way. This is
mostly the case where debian/rules is directly executed.
When debian/rules is directly executed, querying DEB_HOST_MUCHARCH is
not enough because we need to know DEB_{BUILD,HOST}_GNU_TYPE as well.
All DEB_* variables are defined when the package build is initiated by
dpkg-buildpackage, but otherwise, let's call dpkg-architecture to set
all DEB_* environment variables.
This requires dpkg 1.20.6 or newer because --print-format option
was added in dpkg commit 7c54fa2b232e ("dpkg-architecture: Add a
--print-format option").
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Reviewed-by: Nicolas Schier <n.schier@avm.de>
2023-12-26 06:52:40 -07:00
|
|
|
endif
|