Add rules for building guest VM base ramdisk
The guest VM ramdisk is a combination of "base ramdisk" (containing the
init process and test binaries/resources) and a "vendor ramdisk"
(containing kernel modules).
This CL adds build rules that build the base ramdisk, an LZ4-compressed
CPIO archive built using a genrule. Sources are specified as target
modules and paths within the CPIO archive are provided in the same order.
A Bash script parses the information and places all files into a common
directory before calling `mkbootfs` on that directory and compressing
the result.
Test: m virt_hostside_tests_initramfs_base
Change-Id: Id9b4f0c87c97c7167572d4196497676c6d9469ad
diff --git a/tests/hostside/Android.bp b/tests/hostside/Android.bp
new file mode 100644
index 0000000..bfe215d
--- /dev/null
+++ b/tests/hostside/Android.bp
@@ -0,0 +1,30 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Ramdisk containing /init and test binaries/resources needed inside guest.
+genrule {
+ name: "virt_hostside_tests_initramfs_base",
+ tools: [
+ "mkbootfs",
+ "lz4",
+ ],
+ tool_files: ["scripts/place_files.sh"],
+ out: ["initramfs.lz4"],
+ srcs: [
+ ":virt_hostside_tests_guest_init",
+ ],
+ cmd: "$(location scripts/place_files.sh) $(in) -- " +
+ "$(genDir)/root/init " +
+ "&& $(location mkbootfs) $(genDir)/root | $(location lz4) -fq - $(out)",
+}
diff --git a/tests/hostside/scripts/place_files.sh b/tests/hostside/scripts/place_files.sh
new file mode 100755
index 0000000..f0a9603
--- /dev/null
+++ b/tests/hostside/scripts/place_files.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+##
+## Copyright (C) 2020 The Android Open Source Project
+##
+## Licensed under the Apache License, Version 2.0 (the "License");
+## you may not use this file except in compliance with the License.
+## You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+##
+
+set -euo pipefail
+
+# Wrapper around 'expr' that handles the fact that it returns code 1
+# if the result is zero/null. That messes with 'set -e'.
+function expr {
+ eval 'val=$($(which expr) $@); ret=$?'
+ if [ "$ret" != 0 -a "$ret" != 1 ]
+ then
+ return $ret
+ fi
+ echo "$val"
+}
+
+ARGS=( "$@" )
+NUM_ARGS=${#ARGS[@]}
+
+POS_DIVIDER=-1
+for i in $(seq 0 $(expr $NUM_ARGS - 1))
+do
+ if [ "${ARGS[$i]}" == "--" ]
+ then
+ if [ "$POS_DIVIDER" -eq -1 ]
+ then
+ POS_DIVIDER=$i
+ else
+ echo "Multiple dividers in command line inputs" 1>&2
+ exit 1
+ fi
+ fi
+done
+
+if [ "$POS_DIVIDER" -eq -1 ]
+then
+ echo "Divider expected among command line inputs" 1>&2
+ exit 1
+fi
+
+NUM_INPUT=${POS_DIVIDER}
+NUM_OUTPUT=$(expr $NUM_ARGS - $POS_DIVIDER - 1)
+
+if [ "$NUM_INPUT" -ne "$NUM_OUTPUT" ]
+then
+ echo "Number of inputs does not match number of outputs" 1>&2
+ exit 1
+fi
+
+for i in $(seq 0 $(expr $NUM_INPUT - 1))
+do
+ INPUT="${ARGS[$i]}"
+ OUTPUT="${ARGS[$NUM_INPUT + $i + 1]}"
+ mkdir -p "$(dirname "$OUTPUT")"
+ cp "$INPUT" "$OUTPUT"
+done