build_packages: allow people to specify a specific set of packages

This way we can tweak buildbot configs to install specific packages rather
than all of ChromeOS (useful for firmware builders).

BUG=chromium-os:19140
TEST=`cbuildbot {{x86,amd64}-generic,daisy}-paladin {amd64,arm,x86}-generic-full stout-release` passed
TEST=`./build_packages nano` installed just nano

Change-Id: I9c316d7c390ebe6ceade97cf33c1387dc83fb887
Reviewed-on: https://gerrit.chromium.org/gerrit/33266
Reviewed-by: Brian Harring <ferringb@chromium.org>
Commit-Ready: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/35318
diff --git a/build_packages b/build_packages
index ccf81c6..5f0bc68 100755
--- a/build_packages
+++ b/build_packages
@@ -25,13 +25,16 @@
 DEFINE_boolean withautotest "${FLAGS_TRUE}" \
   "Build autotest client code."
 
-FLAGS_HELP="usage: $(basename $0) [flags]
+FLAGS_HELP="usage: $(basename $0) [flags] [packages]
 
 build_packages updates the set of binary packages needed by Chrome OS. It will
 cross compile all packages that have been updated into the given target's root
 and build binary packages as a side-effect. The output packages will be picked
 up by the build_image script to put together a bootable Chrome OS image.
 
+If [packages] are specified, only build those specific packages (and any
+dependencies they might need).
+
 For the fastest builds, use --nowithautotest --noworkon.
 "
 show_help_if_requested "$@"
@@ -69,7 +72,6 @@
 # Parse command line
 FLAGS "$@" || exit 1
 eval set -- "${FLAGS_ARGV}"
-check_flags_only_and_allow_null_arg "$@" && set --
 
 # Die on any errors.
 switch_to_strict_mode
@@ -149,24 +151,28 @@
   CROS_WORKON_PKGS="${CROS_WORKON_PKGS} chromeos-base/chromeos-chrome"
 fi
 
-PACKAGES="chromeos-base/chromeos"
-if [[ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]]; then
-  PACKAGES="${PACKAGES} chromeos-base/chromeos-dev"
-fi
-if [[ "${FLAGS_withfactory}" -eq "${FLAGS_TRUE}" ]]; then
-  PACKAGES="${PACKAGES} chromeos-base/chromeos-factoryinstall"
-  PACKAGES="${PACKAGES} chromeos-base/factorytest-init"
-  PACKAGES="${PACKAGES} chromeos-base/chromeos-hwid"
-fi
-if [[ "${FLAGS_withtest}" -eq "${FLAGS_TRUE}" ]]; then
-  PACKAGES="${PACKAGES} chromeos-base/chromeos-test"
-fi
-if [[ "${FLAGS_withautotest}" -eq "${FLAGS_TRUE}" ]]; then
-  PACKAGES="${PACKAGES} chromeos-base/autotest-all"
+PACKAGES="$*"
+if [[ $# -eq 0 ]]; then
+  PACKAGES="chromeos-base/chromeos"
+  if [[ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]]; then
+    PACKAGES="${PACKAGES} chromeos-base/chromeos-dev"
+  fi
+  if [[ "${FLAGS_withfactory}" -eq "${FLAGS_TRUE}" ]]; then
+    PACKAGES="${PACKAGES} chromeos-base/chromeos-factoryinstall"
+    PACKAGES="${PACKAGES} chromeos-base/factorytest-init"
+    PACKAGES="${PACKAGES} chromeos-base/chromeos-hwid"
+  fi
+  if [[ "${FLAGS_withtest}" -eq "${FLAGS_TRUE}" ]]; then
+    PACKAGES="${PACKAGES} chromeos-base/chromeos-test"
+  fi
+  if [[ "${FLAGS_withautotest}" -eq "${FLAGS_TRUE}" ]]; then
+    PACKAGES="${PACKAGES} chromeos-base/autotest-all"
+  fi
 fi
 
 # Verify that all packages can be emerged from scratch, without any
 # backtracking. Only print the output if this step fails.
+info "Checking package dependencies are correct: ${PACKAGES}"
 if ! OUTPUT=$(emerge-${FLAGS_board} -pe --backtrack=0 ${PACKAGES} 2>&1); then
   printf "%s\n" "${OUTPUT}"
   die_notrace "emerge detected broken ebuilds. See error message above."
@@ -189,7 +195,7 @@
 tmpfile=$(mktemp -t tmp.build_packages-emerge.XXXXXX)
 trap "rm -f '${tmpfile}'" EXIT
 
-info "Merging board packages ${PACKAGES}"
+info "Merging board packages now"
 (
   set -o pipefail
   sudo -E ${EMERGE_BOARD_CMD} -uDNv ${EMERGE_FLAGS} ${PACKAGES} | \