Add support for kernel config fragments

Extend functionality of -C command-line switch to support kernel
fragments. Kernel fragments are sets of config variables that
override main kernel config values. They can be used if only
a relatively minor variation of the main config is required.
Multiple fragments can be specified after main config name
in a -C switch value separated by a coma.

Change-Id: Ia91de0680cba35f258340504d1b71292a33be18f
Reviewed-on: https://cos-review.googlesource.com/c/cos/tools/+/32380
Cloud-Build: GCB Service account <228075978874@cloudbuild.gserviceaccount.com>
Reviewed-by: Meena Shanmugam <meenashanmugam@google.com>
Tested-by: Oleksandr Tymoshenko <ovt@google.com>
diff --git a/src/cmd/cos_kernel_devenv/README.md b/src/cmd/cos_kernel_devenv/README.md
index 01df10b..b6d156d 100644
--- a/src/cmd/cos_kernel_devenv/README.md
+++ b/src/cmd/cos_kernel_devenv/README.md
@@ -88,7 +88,7 @@
 
 ```
 Usage: /devenv.sh [-k | -m | -i] [-Hcd] [-A <x86_64|arm64>]
-    [-C <kernelconfig>] [-O  <objdir>]
+    [-C <kernelconfig>[,fragment1.config,...]] [-O  <objdir>]
     [-B <build> -b <board> | -R <release> | -G <bucket>]
     [-t <toolchain_version>] [VAR=value ...] [target ...]
 
@@ -99,7 +99,9 @@
                 build number developer can specify the branch name
                 to use the latest build off that branch.
                 Example: main-R93, release-R89. Requires -b option.
-  -C <config>   kernel config target. Example: lakitu_defconfig
+  -C <configs>  kernel configs target. Example: lakitu_defconfig.
+                It's also possible to specify main config and fragments
+                separated by coma, i.e.: lakitu_defconfig,google/xfstest.config
   -G <bucket>   seed the toolchain and kernel headers from the custom
                 GCS bucket <bucket>. Directory structure needs to conform
                 to the COS standard. 
diff --git a/src/cmd/cos_kernel_devenv/devenv.sh b/src/cmd/cos_kernel_devenv/devenv.sh
index 75bbcd8..ba62b40 100755
--- a/src/cmd/cos_kernel_devenv/devenv.sh
+++ b/src/cmd/cos_kernel_devenv/devenv.sh
@@ -18,7 +18,7 @@
 readonly RETCODE_ERROR=1
 RELEASE_ID=""  # Loaded from host during execution
 BUILD_DIR="" # based on RELEASE_ID
-KERNEL_CONFIG="defconfig"
+KERNEL_CONFIGS="defconfig"
 BUILD_DEBUG_PACKAGE="false"
 BUILD_HEADERS_PACKAGE="false"
 CLEAN_BEFORE_BUILD="false"
@@ -380,7 +380,7 @@
   if [[ "${CLEAN_BEFORE_BUILD}" = "true" ]]; then
     kmake "$@" mrproper
   fi
-  kmake "$@" "${KERNEL_CONFIG}"
+  kmake "$@" "${KERNEL_CONFIGS[@]}"
   local -r version=$(kmake "$@" -s kernelrelease)
   kmake "$@" "${image_target}" modules
   INSTALL_MOD_PATH="${tmproot_dir}" kmake "$@" modules_install
@@ -427,7 +427,7 @@
 usage() {
 cat 1>&2 <<__EOUSAGE__
 Usage: $0 [-k | -m | -i] [-cdH] [-A <x86_64|arm64>]
-    [-C <kernelconfig>] [-O  <objdir>]
+    [-C <kernelconfig>[,fragment1.config,...]] [-O  <objdir>]
     [-B <build> -b <board> | -R <release> | -G <bucket>]
     [-t <toolchain_version>] [VAR=value ...] [target ...]
 
@@ -438,7 +438,9 @@
                 build number developer can specify the branch name
                 to use the latest build off that branch.
                 Example: main-R93, release-R89. Requires -b option.
-  -C <config>   kernel config target. Example: lakitu_defconfig
+  -C <configs>  kernel configs target. Example: lakitu_defconfig.
+                It's also possible to specify main config and fragments
+                separated by coma, i.e.: lakitu_defconfig,google/xfstest.config
   -G <bucket>   seed the toolchain and kernel headers from the custom
                 GCS bucket <bucket>. Directory structure needs to conform
                 to the COS standard.
@@ -477,7 +479,7 @@
     case "${o}" in
       A) KERNEL_ARCH=${OPTARG} ;;
       B) BUILD_ID=${OPTARG} ;;
-      C) KERNEL_CONFIG=${OPTARG} ;;
+      C) KERNEL_CONFIGS=(${OPTARG//,/ }) ;;
       G) custom_bucket=${OPTARG} ;;
       H) BUILD_HEADERS_PACKAGE="true" ;;
       O) KBUILD_OUTPUT=${OPTARG} ;;