diff --git a/debian/Makefile.subarch b/debian/Makefile.subarch new file mode 100644 index 000000000..e650fb6c5 --- /dev/null +++ b/debian/Makefile.subarch @@ -0,0 +1,225 @@ +# +# This Makefile executes the unpack/build/binary targets for a single +# subarch, which is passed in the subarch variable. Empty subarch +# variable means that we are building for an arch without the subarch. +# Additionally, variables version, abiname and ktver are +# expected to be available (need to be exported from the parent process). +# It is possible to override the flavours by setting the flavours +# variable. +# +# This Makefile is run from the debian subdir +# +SHELL := sh -e +debver := $(version)-$(abiname) +uver := $(subst .,_,$(version)) +debnum := -$(abiname) +kbpkg := kernel-kbuild-$(version)-$(abiname) +# This will eventually have to be changed to a command, applying +# the debian's patches from the local tree (arch/patches?) +kpatch := /usr/src/kernel-patches/all/$(version)/apply/debian $(version)-$(ktver) +DEBIAN_UPSTREAM_VERSION := $(version) +ifeq (,$(DEB_HOST_ARCH)) + DEB_HOST_ARCH := $(shell dpkg-architecture -qDEB_HOST_ARCH) + DEB_BUILD_ARCH := $(shell dpkg-architecture -qDEB_BUILD_ARCH) +endif +export version debnum DEBIAN_UPSTREAM_VERSION + +karch := $(DEB_HOST_ARCH) +# +# Build the list of common config files to be included +# +ifeq ($(subarch),none) + basedir := arch/$(karch) + append := +else + basedir := arch/$(karch)/$(subarch) + append := -$(subarch) +endif +default := $(basedir)/config.default +configs := $(notdir $(wildcard $(basedir)/config.*)) +configs := $(filter-out config.common config.default, $(configs)) +tkdir := kernel-source-$(version) +kdir := kernel-source-$(version)-$(subarch) +ifndef flavours + flavours := $(patsubst config.%,%,$(configs)) +endif + +-include $(basedir)/Makefile.inc + +# +# Here we construct the command lines for different make-kpkg +# calls (build, kernel-image, kernel-headers) based on the values +# of variables defined so far and provided by the arch/subarch +# in Makefile.inc. @flavour@ in the expressions is going to be +# replaced by the flavour for which the command is run. +# +kpkg_headers_cmd := HEADER_CLEAN_HOOK='$(CURDIR)/header-install-$(subarch)' +kpkg_headers_cmd += make-kpkg --append-to-version $(debnum)$(append) +kpkg_build_cmd := make-kpkg --append-to-version $(debnum)-@flavour@ +ifdef added_patches + kpkg_headers_cmd += --added_patches $(subst @uver@,$(uver),$(added_patches)) + kpkg_build_cmd += --added_patches $(subst @uver@,$(uver),$(added_patches)) +endif +ifdef build_subarch + kpkg_build_cmd += --subarch $(build_subarch) +endif +ifdef headers_subarch + kpkg_headers_cmd += --subarch $(headers_subarch) +endif +ifdef build_makeflags + kpkg_build_cmd := MAKEFLAGS=$(build_makeflags) $(kpkg_build_cmd) +endif +# +# Note that next variable (kpkg_image_pre) is not going to be evaluated +# immediately. When referenced, the variable $* will have the current +# flavour for which the command is executed. So if this flavour will +# happen to be in the image_prefix_flavours list, the call to make-kpkg +# will be prepended with contents if image_prefix. +# +kpkg_image_pre = $(if $(filter $*,$(image_prefix_flavours)),$(image_prefix)) +kpkg_image_cmd := $(kpkg_build_cmd) --initrd kernel_image +kpkg_build_cmd += build +kpkg_headers_cmd += kernel-headers +ifndef headers_dirs + headers_dirs = $(karch) +endif +ifneq (no,$(include_common_config)) + ccommon := arch/config.common +endif +ccommon += arch/$(karch)/config.common arch/$(karch)/$(subarch)/config.common +# +# Here we build lists of directories and stamps which we will depend on. +# For each class of such targets there is a pattern rule which will catch +# it and do the right thing. +# +bdirs := $(addprefix build-$(subarch)-, $(flavours)) +bstamps := $(addprefix build-stamp-$(subarch)-, $(flavours)) +istamps := $(addprefix install-stamp-$(subarch)-, $(flavours)) +# +# Targets +# +unpack: unpack-stamp-$(subarch) +unpack-stamp-$(subarch): $(configs) header-install-$(subarch) $(bdirs) + touch unpack-stamp-$(subarch) + +build: build-stamp-$(subarch) +build-stamp-$(subarch): unpack-stamp-$(subarch) $(bstamps) + touch build-stamp-$(subarch) + +binary-indep: build +binary-arch: build headers-stamp $(istamps) + mv *.deb ../.. + +install-stamp-$(subarch)-%: build-$(subarch)-% build-stamp-$(subarch)-% + cp -al $< install-$*; + cd install-$*; \ + $(strip $(kpkg_image_pre) $(subst @flavour@,$*,$(kpkg_image_cmd))) + cat install-$*/debian/files >> files; + rm -rf install-$*; + touch install-stamp-$(subarch)-$* + +headers-stamp: $(kdir) + dh_testdir + dh_clean -k + dh_installdirs + cp $(default) $(kdir)/.config + cd $(kdir); $(kpkg_headers_cmd) + cat $(kdir)/debian/files >> files + touch headers-stamp + +binary: binary-indep binary-arch + +header-install-$(subarch): templates/header-install.in + sed -e 's,@kbpkg@,$(kbpkg),g' \ + -e 's,@ksource_dir@,$(CURDIR)/$(kdir),g' \ + -e 's,@headers_dirs@,$(headers_dirs),g' \ + -e 's,@headers_extra@,$(headers_extra),g' \ + templates/header-install.in > header-install-$(subarch) + chmod u+x header-install-$(subarch) +# +# The way to make the correct package names is to make a +# subarch-specific post-install script... +# +post-install-$(subarch): templates/post-install.in + sed -e 's,@initrd_modules@,$(initrd_modules),' \ + -e 's,@append_subarch@,$(append),' \ + templates/post-install.in > post-install-$(subarch) +# +# Generates the kernel config file for a subarch by merging +# the arch-independent config file (arch/config.common), +# arch-specific config file (arch/$(karch)/config.common), +# and subarch specific one (arch/$(karch)/config.subarch). +# It is possible to avoid the inclusion of the arch-indep +# config file by setting include_common_config = no in the +# arch/$(karch)/Makefile.inc. +# +config.%: + @echo "configs=$(configs)" + @echo "Generating configuration file $@:" + rm -f $@ + for i in $(ccommon); do \ + if [ -f $${i} ]; then \ + cat $${i} >> $@; \ + fi; \ + done +# Flavour config file must be present + cat $(basedir)/$@ >> $@ + +$(kdir): post-install-$(subarch) + dh_testdir + tar jxf /usr/src/$(tkdir).tar.bz2 + mkdir -p $(tkdir)/debian + cp debian/changelog $(tkdir)/debian + cp debian/control $(tkdir)/debian + cp debian/copyright $(tkdir)/debian + touch $(tkdir)/debian/official + install post-install-$(subarch) $(tkdir)/debian/post-install + cd $(tkdir) && $(kpatch) +# Arch/subarch-specific patches + if [ -d $(basedir)/patches ] && \ + [ -s $(basedir)/patches/list ]; then \ + cd $(tkdir); \ + for i in $$(cat ../$(basedir)/patches/list); do \ + patch -p1 < ../$(basedir)/patches/$${i}; \ + done; \ + fi + mv $(tkdir) $@ +# +# This target performs a build for a particular flavour. Note +# that in this file it should be always placed *before* the +# build-$(subarch)-% target, which creates the build directory. +# +# Some arches have extra arch/${ARCH}/kernel/asm-offsets.s files +# which have to be included in kernel-headers. The problem is that +# they are only generated during build and we never performed a +# full build in the directory $(kdir) where kernel-headers are +# built. So, after build we check whether current build arch has +# such a file and symlink it into the $(kdir) if necessary. +# Note that to get into the kernel-headers package the arch/subarch +# still needs variables headers_dirs and headers_extra set. +# +build-stamp-$(subarch)-%: build-$(subarch)-% + dh_testdir + PATH=$$PWD/bin:$$PATH; \ + cd $<; \ + $(subst @flavour@,$*,$(kpkg_build_cmd)); \ + $(if $(image_postproc),$(image_postproc),true); \ + arch=$$(basename $$(readlink include/asm)); \ + arch="$${arch#asm-}"; \ + src="arch/$${arch}/kernel/asm-offsets.s"; \ + dst="../$(kdir)/$${src}"; \ + if [ -f "$${src}" ] && [ ! -e "$${dst}" ]; then \ + ln -s "$$(pwd)/$${src}" "$${dst}"; \ + fi + touch build-stamp-$(subarch)-$* +# +# Creates a build directory for a particular flavour +# +build-$(subarch)-%: $(kdir) config.% + dh_testdir + if [ ! -d $@ ]; then \ + cp -al $(kdir) $@; \ + cp config.$* $@/.config; \ + fi + +.PHONY: build unpack binary-indep binary-arch binary