Add apex module dpkg rules

Change-Id: Id3edaf3c658d83891e82bb3796c5e8e5b5bf7e2b
diff --git a/Makefile b/Makefile
index 640b7c9..5b8e08a 100644
--- a/Makefile
+++ b/Makefile
@@ -34,6 +34,7 @@
 include $(ROOTDIR)/build/debootstrap.mk
 include $(ROOTDIR)/build/img2simg.mk
 include $(ROOTDIR)/build/kernel.mk
+include $(ROOTDIR)/build/kernel-modules.mk
 include $(ROOTDIR)/build/partition-table.mk
 include $(ROOTDIR)/build/packages.mk
 include $(ROOTDIR)/build/prereqs.mk
diff --git a/apex-debian/changelog b/apex-debian/changelog
new file mode 100644
index 0000000..55d09df
--- /dev/null
+++ b/apex-debian/changelog
@@ -0,0 +1,5 @@
+apex (1.0-0) stable; urgency=medium
+
+  * Initial release. 
+
+ -- AIY Projects <support-aiyprojects@google.com>  Fri, 01 Jun 2018 00:00:00 -0800
diff --git a/apex-debian/compat b/apex-debian/compat
new file mode 100644
index 0000000..f599e28
--- /dev/null
+++ b/apex-debian/compat
@@ -0,0 +1 @@
+10
diff --git a/apex-debian/control b/apex-debian/control
new file mode 100644
index 0000000..f706219
--- /dev/null
+++ b/apex-debian/control
@@ -0,0 +1,9 @@
+Source: apex
+Maintainer: AIY Projects <support-aiyprojects@google.com>
+
+Package: apex
+Section: main
+Priority: optional
+Architecture: arm64
+Depends: 
+Description: apex kernel module for AIY Board
diff --git a/apex-debian/copyright b/apex-debian/copyright
new file mode 100644
index 0000000..2f13fb3
--- /dev/null
+++ b/apex-debian/copyright
@@ -0,0 +1,7 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: apex
+Source: https://aiyprojects.withgoogle.com
+
+Files: *
+Copyright: Copyright 2018 Google, LLC <support-aiyprojects@google.com>
+License: Apache-2.0
diff --git a/apex-debian/rules b/apex-debian/rules
new file mode 100755
index 0000000..39f3175
--- /dev/null
+++ b/apex-debian/rules
@@ -0,0 +1,27 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+# Uncomment this to turn on verbose mode.
+# export DH_VERBOSE=1
+
+kdist_image:
+	$(ROOT_CMD) dh_testroot
+	$(ROOT_CMD) dh_prep
+	$(ROOT_CMD) $(MAKE) -C $(KSRC) O=$(KOUT) M=$(shell pwd) modules
+	$(ROOT_CMD) $(MAKE) INSTALL_MOD_PATH=$(shell pwd)/debian/apex \
+                      -C $(KSRC) O=$(KOUT) M=$(shell pwd) modules_install
+	$(ROOT_CMD) find $(shell pwd)/debian/apex/ -type f ! -name '*.ko' | xargs rm -f
+	$(ROOT_CMD) dh_installmodules
+	$(ROOT_CMD) dh_compress
+	$(ROOT_CMD) dh_fixperms
+	$(ROOT_CMD) dh_installdeb
+	$(ROOT_CMD) dh_gencontrol
+	$(ROOT_CMD) dh_md5sums
+	$(ROOT_CMD) dh_builddeb --destdir=$(KOUT)/../..
+	$(ROOT_CMD) dh_prep
+
+kdist_clean:
+	$(ROOT_CMD) $(MAKE) clean
+
+%:
+	dh $@
diff --git a/kernel-modules.mk b/kernel-modules.mk
new file mode 100644
index 0000000..db67d5b
--- /dev/null
+++ b/kernel-modules.mk
@@ -0,0 +1,28 @@
+ifeq ($(ROOTDIR),)
+$(error $$ROOTDIR IS NOT DEFINED -- don\'t forget to source setup.sh)
+endif
+
+include $(ROOTDIR)/build/preamble.mk
+
+MODULES_DIRS := $(wildcard $(ROOTDIR)/modules/*)
+MODULES := $(foreach module,$(MODULES_DIRS),$(notdir $(module)))
+
+define make-module-target
+$1: $(PRODUCT_OUT)/.$1
+$(PRODUCT_OUT)/.$1: $(shell find $(ROOTDIR)/modules/$1 -type f) $(KERNEL_OUT_DIR)/.config $(KERNEL_OUT_DIR)/arch/arm64/boot/Image
+	mkdir -p $(PRODUCT_OUT)/obj/MODULE_OBJ/$1/debian
+	cp -afs $(ROOTDIR)/modules/$1/* $(PRODUCT_OUT)/obj/MODULE_OBJ/$1
+	cp -r $(ROOTDIR)/build/$1-debian/* $(PRODUCT_OUT)/obj/MODULE_OBJ/$1/debian/
+	+cd $(PRODUCT_OUT)/obj/MODULE_OBJ/$1; \
+		DEB_HOST_ARCH=arm64 \
+		ROOT_CMD=fakeroot \
+		$(KERNEL_OPTIONS) \
+		KSRC=$(KERNEL_SRC_DIR) \
+		KOUT=$(KERNEL_OUT_DIR) \
+		debian/rules kdist_image
+endef
+
+$(foreach module,$(MODULES),$(eval $(call make-module-target,$(module))))
+
+modules:: $(foreach module,$(MODULES),$(PRODUCT_OUT)/.$(module))
+.PHONY:: modules
\ No newline at end of file
diff --git a/kernel.mk b/kernel.mk
index 8a790dd..a4affaf 100644
--- a/kernel.mk
+++ b/kernel.mk
@@ -4,35 +4,30 @@
 
 include $(ROOTDIR)/build/preamble.mk
 
-# Kernel directories
-KERNEL_SRC_DIR := $(ROOTDIR)/linux-imx
-KERNEL_OUT_DIR := $(PRODUCT_OUT)/obj/KERNEL_OBJ
-
-$(KERNEL_OUT_DIR)/.config: $(ROOTDIR)/build/defconfig
+$(KERNEL_OUT_DIR):
 	mkdir -p $(KERNEL_OUT_DIR)
-	cp -afs $(ROOTDIR)/linux-imx/* $(KERNEL_OUT_DIR)
-	+make -C $(KERNEL_SRC_DIR) O=$(KERNEL_OUT_DIR) ARCH=arm64 CROSS_COMPILE=$(TOOLCHAIN) mrproper defconfig
+
+$(KERNEL_OUT_DIR)/.config: $(ROOTDIR)/build/defconfig | $(KERNEL_OUT_DIR)
+	+make -C $(KERNEL_SRC_DIR) O=$(KERNEL_OUT_DIR) $(KERNEL_OPTIONS) mrproper defconfig
 	cat $(ROOTDIR)/build/defconfig | tee -a $(KERNEL_OUT_DIR)/.config
 
 $(KERNEL_OUT_DIR)/arch/arm64/boot/Image: $(KERNEL_OUT_DIR)/.config
-		+make -C $(KERNEL_SRC_DIR) O=$(KERNEL_OUT_DIR) ARCH=arm64 CROSS_COMPILE=$(TOOLCHAIN) Image modules dtbs
+		+make -C $(KERNEL_SRC_DIR) O=$(KERNEL_OUT_DIR) $(KERNEL_OPTIONS) Image modules dtbs
 
 kernel: $(KERNEL_OUT_DIR)/arch/arm64/boot/Image $(KERNEL_OUT_DIR)/arch/arm64/boot/dts/freescale/fsl-imx8mq-phanbell.dtb
 
 $(PRODUCT_OUT)/linux-image-4.9.51-aiy_1_arm64.deb: $(KERNEL_OUT_DIR)/.config
-	cd $(KERNEL_OUT_DIR); MFLAGS="" MAKEFLAGS="" make-kpkg --rootcmd fakeroot --arch arm64 \
-		--cross-compile $(TOOLCHAIN) --revision 1 --append-to-version=-aiy \
-		-j $(shell nproc) --overlay-dir=$(ROOTDIR)/build/kernel-overlay \
-		kernel_image kernel_headers
-	mv $(KERNEL_OUT_DIR)/../*.deb $(PRODUCT_OUT)
+	+make -C $(KERNEL_SRC_DIR) O=$(KERNEL_OUT_DIR) $(KERNEL_OPTIONS) \
+		KDEB_PKGVERSION=1 KBUILD_IMAGE=Image deb-pkg
+	mv $(KERNEL_OUT_DIR)/../linux-image-4.9.51-aiy_1_arm64.deb $(PRODUCT_OUT)
+	mv $(KERNEL_OUT_DIR)/../linux-headers-4.9.51-aiy_1_arm64.deb $(PRODUCT_OUT)
 
 targets::
 	@echo "kernel - builds the kernel and boot partition"
 
 clean::
 	+make -C $(KERNEL_SRC_DIR) mrproper
-
-# Mark the deb as phony so we enxure that we rely on the kbuild system for
+# Mark the deb as phony so we ensure that we rely on the kbuild system for
 # incremental builds.
 .PHONY:: kernel \
          $(KERNEL_OUT_DIR)/arch/arm64/boot/dts/freescale/fsl-imx8mq-phanbell.dtb \
diff --git a/packages.mk b/packages.mk
index ccd8296..56723c3 100644
--- a/packages.mk
+++ b/packages.mk
@@ -1,3 +1,9 @@
+ifeq ($(ROOTDIR),)
+$(error $$ROOTDIR IS NOT DEFINED -- don\'t forget to source setup.sh)
+endif
+
+include $(ROOTDIR)/build/preamble.mk
+
 PACKAGES_DIRS := $(wildcard $(ROOTDIR)/packages/*)
 PACKAGES := $(foreach package,$(PACKAGES_DIRS),$(notdir $(package)))
 
diff --git a/preamble.mk b/preamble.mk
index c8ae891..2d243d7 100644
--- a/preamble.mk
+++ b/preamble.mk
@@ -4,6 +4,11 @@
 # Globally useful directories
 TOOLCHAIN := $(ROOTDIR)/toolchain/bin/aarch64-linux-android-
 
+# Kernel directories and options
+KERNEL_SRC_DIR := $(ROOTDIR)/linux-imx
+KERNEL_OUT_DIR := $(PRODUCT_OUT)/obj/KERNEL_OBJ
+KERNEL_OPTIONS := ARCH=arm64 CROSS_COMPILE=$(TOOLCHAIN) LOCALVERSION=-aiy
+
 # Used by debootstrap and rootfs both
 DEBOOTSTRAP_TARBALL := $(ROOTDIR)/cache/debootstrap.tgz
 DEBOOTSTRAP_TARBALL_SHA256 := $(ROOTDIR)/cache/debootstrap.tgz.sha256sum
diff --git a/rootfs.mk b/rootfs.mk
index f55df8d..1accb7f 100644
--- a/rootfs.mk
+++ b/rootfs.mk
@@ -93,7 +93,9 @@
 $(ROOTFS_PATCHED_IMG): $(ROOTFS_RAW_IMG) \
                        $(ROOTDIR)/build/boot.mk \
                        $(PRODUCT_OUT)/linux-image-4.9.51-aiy_1_arm64.deb \
-                       | $(PRODUCT_OUT)/boot.img
+                       | $(PRODUCT_OUT)/boot.img \
+                         modules \
+                         packages
 	cp -r $(ROOTFS_RAW_IMG) $(ROOTFS_PATCHED_IMG)
 	mkdir -p $(ROOTFS_DIR)
 	-sudo umount $(ROOTFS_DIR)/boot