Use arch-specific rootfs

- boot and rootfs can now be built for multiple architectures without
conflicting with each other.
- Kokoro generates arm64 and armhf versions of the mmc image, root
filesystems, and sdcard image. It also generates a recovery sdcard.
- Tighten up the partition-table %.img wildcard.

Change-Id: Ieb9a073bf4b94af7f731f3685c457e9c020b0c83
diff --git a/boot.mk b/boot.mk
index 6732a06..e49f85d 100644
--- a/boot.mk
+++ b/boot.mk
@@ -18,9 +18,9 @@
 
 include $(ROOTDIR)/build/preamble.mk
 
-boot: $(PRODUCT_OUT)/boot.img
+boot: $(PRODUCT_OUT)/boot_$(USERSPACE_ARCH).img
 
-$(PRODUCT_OUT)/boot.img: | out-dirs
+$(PRODUCT_OUT)/boot_$(USERSPACE_ARCH).img: | out-dirs
 	$(LOG) boot fallocate
 	fallocate -l $(BOOT_SIZE_MB)M $@
 	mkfs.ext2 -F $@
@@ -30,6 +30,6 @@
 	@echo "boot - builds the kernel and boot partition"
 
 clean::
-	rm -f $(PRODUCT_OUT)/boot.img
+	rm -f $(PRODUCT_OUT)/boot_*.img
 
 .PHONY:: boot
diff --git a/kokoro/build.sh b/kokoro/build.sh
index 434fa7d..6c4c95b 100644
--- a/kokoro/build.sh
+++ b/kokoro/build.sh
@@ -42,8 +42,16 @@
     ;;
 esac
 
-m docker-all
-m docker-sdcard
+ARCHES="armhf arm64"
+
+for arch in ${ARCHES}
+do
+  export USERSPACE_ARCH=${arch}
+  m docker-all
+  m docker-sdcard
+  unset USERSPACE_ARCH
+done
+
 m docker-recovery
 
 pushd ${ROOTDIR}
@@ -52,20 +60,35 @@
   -o ${PRODUCT_OUT}/manifest.xml
 popd
 
-if [[ -f ${PRODUCT_OUT}/u-boot.imx && \
-      -f ${PRODUCT_OUT}/boot.img && \
-      -f ${PRODUCT_OUT}/partition-table-8gb.img && \
-      -f ${PRODUCT_OUT}/rootfs.img && \
-      -f ${PRODUCT_OUT}/sdcard.img && \
-      -f ${PRODUCT_OUT}/manifest.xml ]]; then
-  cp ${ROOTDIR}/board/flash.sh ${KOKORO_ARTIFACTS_DIR}
-  chmod -x ${KOKORO_ARTIFACTS_DIR}/flash.sh
-  cp ${PRODUCT_OUT}/u-boot.imx ${KOKORO_ARTIFACTS_DIR}
-  cp ${PRODUCT_OUT}/boot.img ${KOKORO_ARTIFACTS_DIR}
-  cp ${PRODUCT_OUT}/partition-table-*.img ${KOKORO_ARTIFACTS_DIR}
-  cp ${PRODUCT_OUT}/rootfs.img ${KOKORO_ARTIFACTS_DIR}
-  cp ${PRODUCT_OUT}/sdcard.img ${KOKORO_ARTIFACTS_DIR}
-  cp ${PRODUCT_OUT}/manifest.xml ${KOKORO_ARTIFACTS_DIR}
-else
-  exit 1
-fi
+ARTIFACTS+="${ROOTDIR}/board/flash.sh "
+ARTIFACTS+="${PRODUCT_OUT}/u-boot.imx "
+ARTIFACTS+="${PRODUCT_OUT}/manifest.xml "
+ARTIFACTS+="${PRODUCT_OUT}/recovery.img "
+ARTIFACTS+="${PRODUCT_OUT}/partition-table-8gb.img "
+ARTIFACTS+="${PRODUCT_OUT}/partition-table-16gb.img "
+ARTIFACTS+="${PRODUCT_OUT}/partition-table-64gb.img "
+
+for arch in ${ARCHES}
+do
+  ARTIFACTS+="${PRODUCT_OUT}/boot_${arch}.img "
+  ARTIFACTS+="${PRODUCT_OUT}/rootfs_${arch}.img "
+  ARTIFACTS+="${PRODUCT_OUT}/sdcard_${arch}.img "
+done
+
+# Check existence of artifacts, exit if one is missing
+for artifact in ${ARTIFACTS}
+do
+  if [[ ! -f ${artifact} ]]; then
+    echo "${artifact} not found!"
+    exit 1
+  fi
+done
+
+# Copy all artifacts to KOKORO_ARTIFACTS_DIR
+for artifact in ${ARTIFACTS}
+do
+  cp ${artifact} ${KOKORO_ARTIFACTS_DIR}
+done
+
+# Clear executable bit from artifacts
+chmod -x ${KOKORO_ARTIFACTS_DIR}/*
diff --git a/kokoro/common.cfg b/kokoro/common.cfg
index 77c58e0..976bbf6 100644
--- a/kokoro/common.cfg
+++ b/kokoro/common.cfg
@@ -1,19 +1,18 @@
 gfile_resources: "/x20/teams/spacepark/enterprise/kokoro/prod/spacepark/enterprise/docker/aiy-board-builder.tar"
 gfile_resources: "/x20/teams/spacepark/enterprise/kokoro/prod/spacepark/enterprise/pbuilder/base.tgz"
-gfile_resources: "/x20/teams/spacepark/enterprise/kokoro/prod/spacepark/enterprise/rootfs/latest/rootfs.raw.img"
-gfile_resources: "/x20/teams/spacepark/enterprise/kokoro/prod/spacepark/enterprise/rootfs/latest/rootfs.raw.img.sha256sum"
+gfile_resources: "/x20/teams/spacepark/enterprise/kokoro/prod/spacepark/enterprise/rootfs/latest/"
 
 action {
   define_artifacts {
-    regex: "boot.img"
+    regex: "boot*.img"
     regex: "flash.sh"
     regex: "manifest.xml"
     regex: "partition-table-*.img"
     regex: "recovery.img"
-    regex: "rootfs.img"
-    regex: "rootfs.raw.img"
-    regex: "rootfs.raw.img.sha256sum"
-    regex: "sdcard.img"
+    regex: "rootfs*.img"
+    regex: "rootfs*.raw.img"
+    regex: "rootfs*.raw.img.sha256sum"
+    regex: "sdcard*.img"
     regex: "u-boot.imx"
   }
 }
diff --git a/kokoro/rootfs.sh b/kokoro/rootfs.sh
index 53a6bdc..5efedd4 100644
--- a/kokoro/rootfs.sh
+++ b/kokoro/rootfs.sh
@@ -10,13 +10,38 @@
 export IS_GLINUX=true
 export ROOTFS_FETCH_TARBALL=false
 export FETCH_PACKAGES=false
-export PREBUILT_DOCKER_ROOT=$KOKORO_GFILE_DIR
+export PREBUILT_DOCKER_ROOT=${KOKORO_GFILE_DIR}
 
 # Install haveged on the host to provide extra entropy.
 sudo apt-get install -y haveged
 sudo /etc/init.d/haveged start
 
-m docker-rootfs_raw
+ARCHES="armhf arm64"
 
-cp ${PRODUCT_OUT}/obj/ROOTFS/rootfs.raw.img $KOKORO_ARTIFACTS_DIR
-cp ${PRODUCT_OUT}/obj/ROOTFS/rootfs.raw.img.sha256sum $KOKORO_ARTIFACTS_DIR
+for arch in ${ARCHES}
+do
+  USERSPACE_ARCH=${arch} m docker-rootfs_raw
+done
+
+for arch in ${ARCHES}
+do
+  ARTIFACTS+="${PRODUCT_OUT}/obj/ROOTFS/rootfs_${arch}.raw.img "
+  ARTIFACTS+="${PRODUCT_OUT}/obj/ROOTFS/rootfs_${arch}.raw.img.sha256sum "
+done
+
+for artifact in ${ARTIFACTS}
+do
+  if [[ ! -f ${artifact} ]]; then
+    echo "${artifact} not found!"
+    exit 1
+  fi
+done
+
+for artifact in ${ARTIFACTS}
+do
+  cp ${artifact} ${KOKORO_ARTIFACTS_DIR}
+done
+
+# For now, symlink rootfs_arm64 to rootfs.
+# Remove when nothing depends on rootfs.img existing.
+ln -sf rootfs_arm64.img ${KOKORO_ARTIFACTS_DIR}/rootfs.img
diff --git a/packages.mk b/packages.mk
index 39746eb..f1fd191 100644
--- a/packages.mk
+++ b/packages.mk
@@ -131,7 +131,7 @@
 packages-tarball: $(ROOTDIR)/cache/packages.tgz
 $(ROOTDIR)/cache/packages.tgz: $(ALL_PACKAGE_TARGETS) | out-dirs
 	$(ROOTDIR)/build/update_packages.sh
-	tar -C $(PRODUCT_OUT) -czf $@ packages
+	tar -C $(PRODUCT_OUT) --overwrite -czf $@ packages
 
 packages:: $(ALL_PACKAGE_TARGETS)
 
diff --git a/partition-table.mk b/partition-table.mk
index 94e558f..40f2047 100644
--- a/partition-table.mk
+++ b/partition-table.mk
@@ -54,11 +54,11 @@
 $(TARGET_64GB_IMG): $(SOURCE_JSON)
 $(TARGET_64GB_IMG): MMC_SIZE = $(MMC_64GB)
 
-$(PRODUCT_OUT)/%.json: $(SOURCE_JSON)
+$(PRODUCT_OUT)/partition-table-%.json: $(SOURCE_JSON)
 	mkdir -p $(@D)
 	$(BPTTOOL) make_table --disk_size $(MMC_SIZE) --input $< --output_json $@
 
-$(PRODUCT_OUT)/%.img: $(SOURCE_JSON)
+$(PRODUCT_OUT)/partition-table-%.img: $(SOURCE_JSON)
 	mkdir -p $(@D)
 	$(BPTTOOL) make_table --disk_size $(MMC_SIZE) --input $< --output_gpt $@
 
diff --git a/rootfs.mk b/rootfs.mk
index 9bcab6f..e0d5529 100644
--- a/rootfs.mk
+++ b/rootfs.mk
@@ -19,8 +19,11 @@
 include $(ROOTDIR)/build/preamble.mk
 
 ROOTFS_DIR := $(PRODUCT_OUT)/obj/ROOTFS/rootfs
-ROOTFS_RAW_IMG := $(PRODUCT_OUT)/obj/ROOTFS/rootfs.raw.img
-ROOTFS_PATCHED_IMG := $(PRODUCT_OUT)/obj/ROOTFS/rootfs.patched.img
+ROOTFS_IMG := $(PRODUCT_OUT)/rootfs_$(USERSPACE_ARCH).img
+ROOTFS_RAW_IMG := $(PRODUCT_OUT)/obj/ROOTFS/rootfs_$(USERSPACE_ARCH).raw.img
+ROOTFS_PATCHED_IMG := $(PRODUCT_OUT)/obj/ROOTFS/rootfs_$(USERSPACE_ARCH).patched.img
+ROOTFS_RAW_CACHE_PATH := $(TARBALL_FETCH_ROOT_DIRECTORY)/$(ROOTFS_REVISION)/rootfs_$(USERSPACE_ARCH).raw.img
+ROOTFS_RAW_LOCAL_CACHE_PATH := $(ROOTDIR)/cache/rootfs_$(USERSPACE).raw.img
 
 ROOTFS_FETCH_TARBALL ?= $(IS_GLINUX)
 ROOTFS_REVISION ?= latest
@@ -66,8 +69,10 @@
     $(info *** Building packages locally, set FETCH_PACKAGES=true to use prebuilts)
 endif
 
+$(ROOTFS_DIR):
+	mkdir -p $(ROOTFS_DIR)
 
-rootfs: $(PRODUCT_OUT)/rootfs.img
+rootfs: $(ROOTFS_IMG)
 	$(LOG) rootfs finished
 
 rootfs_raw: $(ROOTFS_RAW_IMG)
@@ -77,16 +82,16 @@
 	sudo $(ROOTDIR)/build/fix_permissions.sh -p $(ROOTDIR)/build/permissions.txt -t $(ROOTFS_DIR)
 
 ifeq ($(ROOTFS_FETCH_TARBALL),true)
-$(ROOTFS_RAW_IMG): $(TARBALL_FETCH_ROOT_DIRECTORY)/$(ROOTFS_REVISION)/rootfs.raw.img
+$(ROOTFS_RAW_IMG): $(ROOTFS_RAW_CACHE_PATH)
 	$(LOG) rootfs raw-fetch
 	mkdir -p $(dir $(ROOTFS_RAW_IMG))
 	cp $< $<.sha256sum $(dir $(ROOTFS_RAW_IMG))
 	$(LOG) rootfs raw-fetch finished
-else ifeq ($(shell test -f $(ROOTDIR)/cache/rootfs.raw.img && echo found),found)
-$(ROOTFS_RAW_IMG): $(ROOTDIR)/cache/rootfs.raw.img
+else ifeq ($(shell test -f $(ROOTFS_RAW_LOCAL_CACHE_PATH) && echo found),found)
+$(ROOTFS_RAW_IMG): $(ROOTFS_RAW_LOCAL_CACHE_PATH)
 	$(LOG) rootfs raw-cache
 	mkdir -p $(dir $(ROOTFS_RAW_IMG))
-	cp $(ROOTDIR)/cache/rootfs.raw.img $(ROOTFS_RAW_IMG)
+	cp $(ROOTFS_RAW_LOCAL_CACHE_PATH) $(ROOTFS_RAW_IMG)
 	sha256sum $(ROOTFS_RAW_IMG) > $(ROOTFS_RAW_IMG).sha256sum
 	$(LOG) rootfs raw-cache finished
 else
@@ -134,8 +139,9 @@
 endif
 
 $(ROOTFS_PATCHED_IMG): $(ROOTFS_PATCHED_DEPS) \
-                       | $(PRODUCT_OUT)/boot.img \
-                         /usr/bin/qemu-$(QEMU_ARCH)-static
+                       | $(PRODUCT_OUT)/boot_$(USERSPACE_ARCH).img \
+                         /usr/bin/qemu-$(QEMU_ARCH)-static \
+                         $(ROOTFS_DIR)
 	$(LOG) rootfs patch
 	cp $(ROOTFS_RAW_IMG) $(ROOTFS_PATCHED_IMG).wip
 	mkdir -p $(ROOTFS_DIR)
@@ -143,7 +149,7 @@
 	-sudo umount $(ROOTFS_DIR)
 	sudo mount -o loop $(ROOTFS_PATCHED_IMG).wip $(ROOTFS_DIR)
 	-sudo mkdir -p $(ROOTFS_DIR)/boot
-	sudo mount -o loop $(PRODUCT_OUT)/boot.img $(ROOTFS_DIR)/boot
+	sudo mount -o loop $(PRODUCT_OUT)/boot_$(USERSPACE_ARCH).img $(ROOTFS_DIR)/boot
 	-sudo mkdir -p $(ROOTFS_DIR)/dev
 	sudo mount -o bind /dev $(ROOTFS_DIR)/dev
 	sudo cp /usr/bin/qemu-$(QEMU_ARCH)-static $(ROOTFS_DIR)/usr/bin
@@ -179,15 +185,15 @@
 	mv $(ROOTFS_PATCHED_IMG).wip $(ROOTFS_PATCHED_IMG)
 	$(LOG) rootfs patch finished
 
-$(PRODUCT_OUT)/rootfs.img: $(HOST_OUT)/bin/img2simg $(ROOTFS_PATCHED_IMG)
+$(ROOTFS_IMG): $(HOST_OUT)/bin/img2simg $(ROOTFS_PATCHED_IMG)
 	$(LOG) rootfs img2simg
-	$(HOST_OUT)/bin/img2simg $(ROOTFS_PATCHED_IMG) $(PRODUCT_OUT)/rootfs.img
+	$(HOST_OUT)/bin/img2simg $(ROOTFS_PATCHED_IMG) $(ROOTFS_IMG)
 	$(LOG) rootfs img2simg finished
 
 clean::
 	if mount |grep -q $(ROOTFS_DIR); then sudo umount -R $(ROOTFS_DIR); fi
 	if [[ -d $(ROOTFS_DIR) ]]; then rmdir $(ROOTFS_DIR); fi
-	rm -f $(ROOTFS_PATCHED_IMG) $(ROOTFS_RAW_IMG) $(PRODUCT_OUT)/rootfs.img
+	rm -f $(ROOTFS_PATCHED_IMG) $(ROOTFS_RAW_IMG) $(ROOTFS_IMG)
 
 targets::
 	@echo "rootfs - runs multistrap to build the rootfs tree"