Merge pull request #3645 from op-jenkins/op-build-update_043_5-25-2020

op-build update 5-25-2020
diff --git a/ci/build-all-defconfigs.sh b/ci/build-all-defconfigs.sh
index f21b847..955120c 100755
--- a/ci/build-all-defconfigs.sh
+++ b/ci/build-all-defconfigs.sh
@@ -67,6 +67,11 @@
 	echo -n "${major}"
 }
 
+function sha1sum_dir
+{
+	echo -n "$(find $1 -type f -print0 | sort -z | xargs -0 sha1sum | sed -e 's/ .*//' | tr -d '[:space:]' | sha1sum | sed -e 's/ .*//')"
+}
+
 function build_sdk
 {
 # $1 is the defconfig
@@ -100,6 +105,16 @@
 		--disable ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV \
 		--enable INSTALL_LIBSTDCPP
 
+	# Enable toolchains we'll need to be built as part of the SDK, and make sure we
+	# consider them to make the sdk unique
+	buildroot/utils/config --file $SDK_BUILD_DIR/.config --package \
+		--enable P8_PORE_TOOLCHAIN  --enable HOST_P8_PORE_BINUTILS \
+		--enable PPE42_TOOLCHAIN --enable HOST_PPE42_GCC --enable HOST_PPE42_BINUTILS
+
+	HASH_PROPERTIES="$HASH_PROPERTIES $(sha1sum_dir openpower/package/p8-pore-binutils/)"
+	HASH_PROPERTIES="$HASH_PROPERTIES $(sha1sum_dir openpower/package/ppe42-gcc/)"
+	HASH_PROPERTIES="$HASH_PROPERTIES $(sha1sum_dir openpower/package/ppe42-binutils/)"
+
 	# As we are disabling BR2_LINUX_KERNEL, capture Kernel version if any
 	# to prevent it from defaulting to the last on olddefconfig
 	KERNEL_VER=$(buildroot/utils/config --file $SDK_BUILD_DIR/.config --state LINUX_KERNEL_CUSTOM_VERSION_VALUE)
@@ -250,6 +265,24 @@
 		buildroot/utils/config --file $O/.config --enable TOOLCHAIN_EXTERNAL_CXX
 	fi
 
+	# Our SDK will always have p8-pore-toolchain enabled, but
+	# only use it if we require it
+	P8_PORE_REQUIRED=$(buildroot/utils/config --file $O/.config --package --state P8_PORE_TOOLCHAIN)
+	if [ "$P8_PORE_REQUIRED" = "y" ]; then
+		buildroot/utils/config --file $O/.config --enable PACKAGE_P8_PORE_TOOLCHAIN_EXTERNAL \
+			--set-str P8_PORE_TOOLCHAIN_EXTERNAL_PATH $SDK_DIR/host
+	fi
+
+	# Our SDK will always have ppe42-toolchain enabled, but
+	# only use it if we require it
+	PPE42_REQUIRED=$(buildroot/utils/config --file $O/.config --package --state PPE42_TOOLCHAIN)
+	if [ "$PPE42_REQUIRED" = "y" ]; then
+		buildroot/utils/config --file $O/.config --enable PACKAGE_PPE42_TOOLCHAIN_EXTERNAL \
+			--set-str PPE42_TOOLCHAIN_EXTERNAL_PATH $SDK_DIR/host
+	fi
+
+
+
 	# The Kernel Headers requested MUST be the same as the one
 	# provided by the SDK (i.e., it's part of the hash)
 	HEADERS_VER=$(buildroot/utils/config --file $O/.config --state TOOLCHAIN_HEADERS_AT_LEAST)
diff --git a/openpower/Config.in b/openpower/Config.in
index b6decad..412dedb 100644
--- a/openpower/Config.in
+++ b/openpower/Config.in
@@ -1,6 +1,7 @@
 menu "OpenPower"
 
 source "$BR2_EXTERNAL_OP_BUILD_PATH/platform/Config.in"
+source "$BR2_EXTERNAL_OP_BUILD_PATH/toolchain/Config.in"
 
 menu "OpenPower Packages"
 if BR2_OPENPOWER_PLATFORM
diff --git a/openpower/configs/firenze_defconfig b/openpower/configs/firenze_defconfig
index 18d5d4e..7223ce2 100644
--- a/openpower/configs/firenze_defconfig
+++ b/openpower/configs/firenze_defconfig
@@ -45,6 +45,7 @@
 BR2_TARGET_ROOTFS_CPIO_XZ=y
 BR2_OPENPOWER_PLATFORM=y
 BR2_OPENPOWER_POWER8=y
+# BR2_PACKAGE_P8_PORE_TOOLCHAIN is not set
 # BR2_PACKAGE_HOSTBOOT_P8 is not set
 # BR2_PACKAGE_HOSTBOOT_BINARIES is not set
 # BR2_PACKAGE_MACHINE_XML is not set
@@ -52,7 +53,6 @@
 BR2_OPENPOWER_CONFIG_NAME="openpower-firenze"
 BR2_PACKAGE_PETITBOOT=y
 BR2_PACKAGE_PETITBOOT_MTD=y
-# BR2_PACKAGE_HOST_P8_PORE_BINUTILS is not set
 # BR2_PACKAGE_CAPP_UCODE is not set
 BR2_PACKAGE_LOADKEYS=y
 # BR2_PACKAGE_IMA_CATALOG is not set
diff --git a/openpower/configs/opal_defconfig b/openpower/configs/opal_defconfig
index fcc24a9..804e47c 100644
--- a/openpower/configs/opal_defconfig
+++ b/openpower/configs/opal_defconfig
@@ -43,6 +43,7 @@
 BR2_TARGET_ROOTFS_INITRAMFS=y
 BR2_OPENPOWER_PLATFORM=y
 BR2_OPENPOWER_POWER8=y
+# BR2_PACKAGE_P8_PORE_TOOLCHAIN is not set
 # BR2_PACKAGE_HOST_OPENPOWER_FFS is not set
 # BR2_PACKAGE_HOSTBOOT_P8 is not set
 # BR2_PACKAGE_HOSTBOOT_BINARIES is not set
@@ -51,8 +52,6 @@
 BR2_OPENPOWER_CONFIG_NAME="opal"
 BR2_PACKAGE_PETITBOOT=y
 BR2_PACKAGE_PETITBOOT_MTD=y
-# BR2_PACKAGE_HOST_P8_PORE_BINUTILS is not set
-# BR2_PACKAGE_OCC_P8 is not set
 # BR2_PACKAGE_CAPP_UCODE is not set
 BR2_SKIBOOT_DEVICETREE=y
 # BR2_PACKAGE_IMA_CATALOG is not set
diff --git a/openpower/configs/pseries_defconfig b/openpower/configs/pseries_defconfig
index 8f8c167..5a3b39f 100644
--- a/openpower/configs/pseries_defconfig
+++ b/openpower/configs/pseries_defconfig
@@ -47,6 +47,7 @@
 BR2_TARGET_ROOTFS_CPIO_XZ=y
 BR2_OPENPOWER_PLATFORM=y
 BR2_OPENPOWER_POWER8=y
+# BR2_PACKAGE_P8_PORE_TOOLCHAIN is not set
 # BR2_PACKAGE_HOSTBOOT_P8 is not set
 # BR2_PACKAGE_HOSTBOOT_BINARIES is not set
 # BR2_PACKAGE_MACHINE_XML is not set
@@ -54,7 +55,6 @@
 BR2_OPENPOWER_CONFIG_NAME="openpower-firenze"
 BR2_PACKAGE_PETITBOOT=y
 BR2_PACKAGE_PETITBOOT_MTD=y
-# BR2_PACKAGE_HOST_P8_PORE_BINUTILS is not set
 # BR2_PACKAGE_CAPP_UCODE is not set
 BR2_PACKAGE_LOADKEYS=y
 # BR2_PACKAGE_IMA_CATALOG is not set
diff --git a/openpower/configs/zz_defconfig b/openpower/configs/zz_defconfig
index 117e248..9e52abd 100644
--- a/openpower/configs/zz_defconfig
+++ b/openpower/configs/zz_defconfig
@@ -45,6 +45,7 @@
 BR2_TARGET_ROOTFS_CPIO_XZ=y
 BR2_OPENPOWER_PLATFORM=y
 BR2_OPENPOWER_POWER9=y
+# BR2_PACKAGE_PPE42_TOOLCHAIN is not set
 # BR2_PACKAGE_HOST_OPENPOWER_FFS is not set
 # BR2_PACKAGE_HOSTBOOT is not set
 # BR2_PACKAGE_HOSTBOOT_BINARIES is not set
@@ -54,11 +55,7 @@
 # BR2_TARGET_SKIBOOT_XZ is not set
 BR2_PACKAGE_PETITBOOT=y
 BR2_PACKAGE_PETITBOOT_MTD=y
-# BR2_PACKAGE_HCODE is not set
-# BR2_PACKAGE_OCC is not set
 # BR2_PACKAGE_CAPP_UCODE is not set
 BR2_PACKAGE_LOADKEYS=y
-# BR2_PACKAGE_HOST_PPE42_BINUTILS is not set
-# BR2_PACKAGE_HOST_PPE42_GCC is not set
 # BR2_PACKAGE_IMA_CATALOG is not set
 # BR2_PACKAGE_HOST_SB_SIGNING_UTILS is not set
diff --git a/openpower/external.mk b/openpower/external.mk
index e8f46f1..2e4d7ce 100644
--- a/openpower/external.mk
+++ b/openpower/external.mk
@@ -1,3 +1,7 @@
+# OpenPower Toolchain
+include $(sort $(wildcard $(BR2_EXTERNAL_OP_BUILD_PATH)/toolchain/*/*.mk))
+
+# OpenPower Packages
 include $(sort $(wildcard $(BR2_EXTERNAL_OP_BUILD_PATH)/package/*.mk))
 include $(sort $(wildcard $(BR2_EXTERNAL_OP_BUILD_PATH)/package/*/*.mk))
 
diff --git a/openpower/package/Config.in b/openpower/package/Config.in
index 903e6cb..34468f5 100755
--- a/openpower/package/Config.in
+++ b/openpower/package/Config.in
@@ -7,7 +7,6 @@
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/machine-xml/Config.in"
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/openpower-pnor/Config.in"
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/petitboot/Config.in"
-source "$BR2_EXTERNAL_OP_BUILD_PATH/package/p8-pore-binutils/Config.in"
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/hcode/Config.in"
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/occ/Config.in"
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/occ-p8/Config.in"
@@ -15,8 +14,6 @@
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/skiboot/Config.in"
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/libflash/Config.in"
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/loadkeys/Config.in"
-source "$BR2_EXTERNAL_OP_BUILD_PATH/package/ppe42-binutils/Config.in"
-source "$BR2_EXTERNAL_OP_BUILD_PATH/package/ppe42-gcc/Config.in"
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/ima-catalog/Config.in"
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/sbe/Config.in"
 source "$BR2_EXTERNAL_OP_BUILD_PATH/package/sb-signing-utils/Config.in"
diff --git a/openpower/package/hcode/Config.in b/openpower/package/hcode/Config.in
index 6a5130f..d1610b9 100644
--- a/openpower/package/hcode/Config.in
+++ b/openpower/package/hcode/Config.in
@@ -1,6 +1,7 @@
 config BR2_PACKAGE_HCODE
         bool "hcode"
         default y if (BR2_OPENPOWER_PLATFORM && BR2_OPENPOWER_POWER9)
+        depends on BR2_PACKAGE_HAS_PPE42_TOOLCHAIN
         select BR2_CPP
         help
             Project to build the hcode firmware codebase
diff --git a/openpower/package/hcode/hcode.mk b/openpower/package/hcode/hcode.mk
index c97d54a..1e4e889 100644
--- a/openpower/package/hcode/hcode.mk
+++ b/openpower/package/hcode/hcode.mk
@@ -12,7 +12,7 @@
 HCODE_INSTALL_IMAGES = YES
 HCODE_INSTALL_TARGET = NO
 
-HCODE_DEPENDENCIES = host-binutils host-ppe42-gcc hostboot-binaries
+HCODE_DEPENDENCIES = host-binutils host-ppe42-toolchain hostboot-binaries
 
 HW_IMAGE_BIN_PATH=output/images/hw_image
 HW_IMAGE_BIN=p9n.hw_image.bin
diff --git a/openpower/package/occ-p8/Config.in b/openpower/package/occ-p8/Config.in
index 0137e94..3fb3b86 100644
--- a/openpower/package/occ-p8/Config.in
+++ b/openpower/package/occ-p8/Config.in
@@ -1,6 +1,7 @@
 config BR2_PACKAGE_OCC_P8
         bool "OCC for P8"
         default y if (BR2_OPENPOWER_PLATFORM && BR2_OPENPOWER_POWER8)
+        depends on BR2_PACKAGE_HAS_P8_PORE_TOOLCHAIN
         select BR2_CPP
         help
             Project to build OCC
diff --git a/openpower/package/occ-p8/occ-p8.mk b/openpower/package/occ-p8/occ-p8.mk
index a925a53..7630497 100644
--- a/openpower/package/occ-p8/occ-p8.mk
+++ b/openpower/package/occ-p8/occ-p8.mk
@@ -16,7 +16,7 @@
 OCC_P8_STAGING_DIR = $(STAGING_DIR)/occ
 
 OCC_P8_IMAGE_BIN_PATH = src/image.bin
-OCC_P8_DEPENDENCIES = host-binutils host-p8-pore-binutils
+OCC_P8_DEPENDENCIES = host-binutils host-p8-pore-toolchain
 
 define OCC_P8_BUILD_CMDS
         cd $(@D)/src && \
diff --git a/openpower/package/occ/Config.in b/openpower/package/occ/Config.in
index d9df0b3..d3be09d 100644
--- a/openpower/package/occ/Config.in
+++ b/openpower/package/occ/Config.in
@@ -1,6 +1,7 @@
 config BR2_PACKAGE_OCC
         bool "OCC (POWER9)"
         default y if (BR2_OPENPOWER_PLATFORM && BR2_OPENPOWER_POWER9)
+        depends on BR2_PACKAGE_HAS_PPE42_TOOLCHAIN
         select BR2_CPP
         help
             Project to build OCC
diff --git a/openpower/package/occ/occ.mk b/openpower/package/occ/occ.mk
index 39ad15e..7d8c582 100644
--- a/openpower/package/occ/occ.mk
+++ b/openpower/package/occ/occ.mk
@@ -18,7 +18,7 @@
 
 OCC_IMAGE_BIN_PATH = obj/image.bin
 
-OCC_DEPENDENCIES = host-binutils host-ppe42-gcc
+OCC_DEPENDENCIES = host-binutils host-ppe42-toolchain
 ifeq ($(BR2_OCC_GPU_BIN_BUILD),y)
 	OCC_DEPENDENCIES += hostboot-binaries
 endif
diff --git a/openpower/package/openpower-pnor/openpower-pnor.mk b/openpower/package/openpower-pnor/openpower-pnor.mk
index 39f89b0..e834097 100644
--- a/openpower/package/openpower-pnor/openpower-pnor.mk
+++ b/openpower/package/openpower-pnor/openpower-pnor.mk
@@ -73,11 +73,11 @@
 GENERATED_PNOR_LAYOUT_FILES = $(shell find "$(OPENPOWER_PNOR_SCRATCH_DIR)" -maxdepth 1 -name "*WithOffsets.xml")
 
 FILES_TO_TAR = $(HOSTBOOT_BUILD_IMAGES_DIR)/* \
-               $(OUTPUT_BUILD_DIR)/skiboot-$(BR2_SKIBOOT_VERSION)/skiboot.elf \
-               $(OUTPUT_BUILD_DIR)/skiboot-$(BR2_SKIBOOT_VERSION)/skiboot.map \
-               $(OUTPUT_BUILD_DIR)/linux-$(BR2_LINUX_KERNEL_VERSION)/.config \
-               $(OUTPUT_BUILD_DIR)/linux-$(BR2_LINUX_KERNEL_VERSION)/vmlinux \
-               $(OUTPUT_BUILD_DIR)/linux-$(BR2_LINUX_KERNEL_VERSION)/System.map \
+               $(OUTPUT_BUILD_DIR)/skiboot-$(SKIBOOT_VERSION)/skiboot.elf \
+               $(OUTPUT_BUILD_DIR)/skiboot-$(SKIBOOT_VERSION)/skiboot.map \
+               $(OUTPUT_BUILD_DIR)/linux-$(LINUX_VERSION)/.config \
+               $(OUTPUT_BUILD_DIR)/linux-$(LINUX_VERSION)/vmlinux \
+               $(OUTPUT_BUILD_DIR)/linux-$(LINUX_VERSION)/System.map \
                $(OUTPUT_IMAGES_DIR)/zImage.epapr \
                $(GENERATED_PNOR_LAYOUT_FILES)
 
@@ -133,7 +133,7 @@
             -payload_filename $(BR2_SKIBOOT_LID_XZ_NAME) \
             -binary_dir $(BINARIES_DIR) \
             -bootkernel_filename $(LINUX_IMAGE_NAME) \
-	    -ocmbfw_version $(BR2_OCMB_EXPLORER_FW_VERSION) \
+	    -ocmbfw_version $(OCMB_EXPLORER_FW_VERSION) \
 	    -ocmbfw_url $(BR2_OCMB_EXPLORER_FW_URL) \
 	    -ocmbfw_original_filename $(BINARIES_DIR)/$(BR2_OCMBFW_FILENAME) \
 	    -ocmbfw_binary_filename $(OPENPOWER_PNOR_SCRATCH_DIR)/$(BR2_OCMBFW_PROCESSED_FILENAME) \
diff --git a/openpower/package/p8-pore-binutils/Config.in b/openpower/package/p8-pore-binutils/Config.in
index a29397a..db06064 100644
--- a/openpower/package/p8-pore-binutils/Config.in
+++ b/openpower/package/p8-pore-binutils/Config.in
@@ -1,6 +1,11 @@
 config BR2_PACKAGE_HOST_P8_PORE_BINUTILS
         bool "p8-pore-binutils"
-        default y if (BR2_OPENPOWER_POWER8)
+        select BR2_PACKAGE_HAS_P8_PORE_TOOLCHAIN
         select BR2_CPP
         help
             Project to build the P8 PORE binutils
+
+if BR2_PACKAGE_HOST_P8_PORE_BINUTILS
+config BR2_PACKAGE_PROVIDES_P8_PORE_TOOLCHAIN
+        default "p8-pore-binutils"
+endif
diff --git a/openpower/package/p8-pore-binutils/p8-pore-binutils.mk b/openpower/package/p8-pore-binutils/p8-pore-binutils.mk
index 880dc09..00477a6 100644
--- a/openpower/package/p8-pore-binutils/p8-pore-binutils.mk
+++ b/openpower/package/p8-pore-binutils/p8-pore-binutils.mk
@@ -8,10 +8,11 @@
 P8_PORE_BINUTILS_SITE ?= $(call github,open-power,p8-pore-binutils,$(P8_PORE_BINUTILS_VERSION))
 P8_PORE_BINUTILS_LICENSE = GPLv3+
 P8_PORE_BINUTILS_LICENSE_FILES = COPYING3 COPYING.LIB
+P8_PORE_BINUTILS_PROVIDES = p8-pore-toolchain
 HOST_P8_PORE_BINUTILS_DEPENDENCIES = host-binutils
 
-P8_PORE_BINUTILS_DIR = $(STAGING_DIR)/p8-pore-binutils
-P8_PORE_BINUTILS_BIN = $(STAGING_DIR)/p8-pore-binutils/linux
+P8_PORE_BINUTILS_DIR = $(HOST_DIR)/$(P8_PORE_TOOLCHAIN_DIR)
+P8_PORE_BINUTILS_BIN = $(HOST_DIR)/$(P8_PORE_TOOLCHAIN_BIN)
 
 define HOST_P8_PORE_BINUTILS_BUILD_CMDS
         cd $(@D) && \
diff --git a/openpower/package/p8-pore-toolchain-external/Config.in b/openpower/package/p8-pore-toolchain-external/Config.in
new file mode 100644
index 0000000..cad96c0
--- /dev/null
+++ b/openpower/package/p8-pore-toolchain-external/Config.in
@@ -0,0 +1,19 @@
+config BR2_PACKAGE_P8_PORE_TOOLCHAIN_EXTERNAL
+	bool "p8-pore-toolchain-external"
+	select BR2_PACKAGE_HAS_P8_PORE_TOOLCHAIN
+	help
+	  Use an external P8 PORE toolchain
+
+if BR2_PACKAGE_P8_PORE_TOOLCHAIN_EXTERNAL
+config BR2_PACKAGE_PROVIDES_P8_PORE_TOOLCHAIN
+	default "p8-pore-toolchain-external"
+
+config BR2_P8_PORE_TOOLCHAIN_EXTERNAL_PATH
+	string "External P8 PORE toolchain path"
+	help
+	  Pathname to where the external P8 PORE toolchain
+	  is installed. The binutils are expected to be
+	  fully contained within the
+	  "sysroot/p8-pore-toolchain" directory
+endif
+
diff --git a/openpower/package/p8-pore-toolchain-external/p8-pore-toolchain-external.mk b/openpower/package/p8-pore-toolchain-external/p8-pore-toolchain-external.mk
new file mode 100644
index 0000000..c88864a
--- /dev/null
+++ b/openpower/package/p8-pore-toolchain-external/p8-pore-toolchain-external.mk
@@ -0,0 +1,22 @@
+################################################################################
+#
+# p8-pore-toolchain-external
+#
+################################################################################
+P8_PORE_TOOLCHAIN_EXTERNAL_REDISTRIBUTE = NO
+P8_PORE_TOOLCHAIN_EXTERNAL_SITE =
+P8_PORE_TOOLCHAIN_EXTERNAL_SOURCE =
+P8_PORE_TOOLCHAIN_EXTERNAL_PROVIDES = p8-pore-toolchain
+P8_PORE_TOOLCHAIN_EXTERNAL_PATH = \
+	$(call qstrip,$(BR2_P8_PORE_TOOLCHAIN_EXTERNAL_PATH))/$(P8_PORE_TOOLCHAIN_DIR)
+
+define HOST_P8_PORE_TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS
+	test -e $(P8_PORE_TOOLCHAIN_EXTERNAL_PATH)
+endef
+
+define HOST_P8_PORE_TOOLCHAIN_EXTERNAL_INSTALL_CMDS
+	ln -snf $(P8_PORE_TOOLCHAIN_EXTERNAL_PATH) $(HOST_DIR)/$(P8_PORE_TOOLCHAIN_DIR)
+
+endef
+
+$(eval $(host-generic-package))
diff --git a/openpower/package/ppe42-binutils/Config.in b/openpower/package/ppe42-binutils/Config.in
index 824e557..a878732 100644
--- a/openpower/package/ppe42-binutils/Config.in
+++ b/openpower/package/ppe42-binutils/Config.in
@@ -1,6 +1,5 @@
 config BR2_PACKAGE_HOST_PPE42_BINUTILS
         bool "ppe42-binutils"
-        default y if (BR2_OPENPOWER_PLATFORM && BR2_OPENPOWER_POWER9)
         select BR2_CPP
         help
             Project to build the PPE42 PORE binutils
diff --git a/openpower/package/ppe42-binutils/ppe42-binutils.mk b/openpower/package/ppe42-binutils/ppe42-binutils.mk
index 0c365b8..90abbf4 100644
--- a/openpower/package/ppe42-binutils/ppe42-binutils.mk
+++ b/openpower/package/ppe42-binutils/ppe42-binutils.mk
@@ -10,8 +10,8 @@
 
 PPE42_BINUTILS_DEPENDENCIES = host-binutils
 
-PPE42_BINUTILS_DIR = $(STAGING_DIR)/ppe42-binutils
-PPE42_BINUTILS_BIN = $(STAGING_DIR)/ppe42-binutils/linux
+PPE42_BINUTILS_DIR = $(HOST_DIR)/$(PPE42_TOOLCHAIN_DIR)
+PPE42_BINUTILS_BIN = $(HOST_DIR)/$(PPE42_TOOLCHAIN_BIN)
 
 define HOST_PPE42_BINUTILS_BUILD_CMDS
         cd $(@D) && \
diff --git a/openpower/package/ppe42-gcc/Config.in b/openpower/package/ppe42-gcc/Config.in
index d66418d..b7361bb 100644
--- a/openpower/package/ppe42-gcc/Config.in
+++ b/openpower/package/ppe42-gcc/Config.in
@@ -1,6 +1,12 @@
 config BR2_PACKAGE_HOST_PPE42_GCC
         bool "ppe42-gcc"
-        default y if (BR2_OPENPOWER_PLATFORM && BR2_OPENPOWER_POWER9)
+        select BR2_PACKAGE_HAS_PPE42_TOOLCHAIN
+        select BR2_PACKAGE_PPE42_BINUTILS
         select BR2_CPP
         help
             Project to build the PPE42 gcc
+
+if BR2_PACKAGE_HOST_PPE42_GCC
+config BR2_PACKAGE_PROVIDES_PPE42_TOOLCHAIN
+        default "ppe42-gcc"
+endif
diff --git a/openpower/package/ppe42-gcc/ppe42-gcc.mk b/openpower/package/ppe42-gcc/ppe42-gcc.mk
index 518e458..8aa73ce 100644
--- a/openpower/package/ppe42-gcc/ppe42-gcc.mk
+++ b/openpower/package/ppe42-gcc/ppe42-gcc.mk
@@ -10,9 +10,10 @@
 
 PPE42_GCC_DEPENDENCIES = ppe42-binutils gmp mpfr mpc
 HOST_PPE42_GCC_DEPENDENCIES = host-ppe42-binutils host-gmp host-mpfr host-mpc
+PPE42_GCC_PROVIDES = ppe42-toolchain
 
-PPE42_GCC_DIR = $(STAGING_DIR)/ppe42-binutils
-PPE42_GCC_BIN = $(STAGING_DIR)/ppe42-binutils/linux
+PPE42_GCC_DIR = $(HOST_DIR)/$(PPE42_TOOLCHAIN_DIR)
+PPE42_GCC_BIN = $(HOST_DIR)/$(PPE42_TOOLCHAIN_BIN)
 
 define HOST_PPE42_GCC_BUILD_CMDS
         cd $(@D) && \
diff --git a/openpower/package/ppe42-toolchain-external/Config.in b/openpower/package/ppe42-toolchain-external/Config.in
new file mode 100644
index 0000000..10b58db
--- /dev/null
+++ b/openpower/package/ppe42-toolchain-external/Config.in
@@ -0,0 +1,18 @@
+config BR2_PACKAGE_PPE42_TOOLCHAIN_EXTERNAL
+	bool "ppe42-toolchain-external"
+	select BR2_PACKAGE_HAS_PPE42_TOOLCHAIN
+	help
+	  Use an external PPE42 toolchain
+
+if BR2_PACKAGE_PPE42_TOOLCHAIN_EXTERNAL
+config BR2_PACKAGE_PROVIDES_PPE42_TOOLCHAIN
+	default "ppe42-toolchain-external"
+
+config BR2_PPE42_TOOLCHAIN_EXTERNAL_PATH
+	string "External PPE42 toolchain path"
+	help
+	  Pathname to where the external PPE42 toolchain is
+	  installed. The compiler is expected to be fully
+	  contained within the "sysroot/ppe42-toolchain"
+	  directory
+endif
diff --git a/openpower/package/ppe42-toolchain-external/ppe42-toolchain-external.mk b/openpower/package/ppe42-toolchain-external/ppe42-toolchain-external.mk
new file mode 100644
index 0000000..1fb9f00
--- /dev/null
+++ b/openpower/package/ppe42-toolchain-external/ppe42-toolchain-external.mk
@@ -0,0 +1,23 @@
+################################################################################
+#
+# ppe42-toolchain-external
+#
+################################################################################
+PPE42_TOOLCHAIN_EXTERNAL_REDISTRIBUTE = NO
+PPE42_TOOLCHAIN_EXTERNAL_SITE =
+PPE42_TOOLCHAIN_EXTERNAL_SOURCE =
+PPE42_TOOLCHAIN_EXTERNAL_PROVIDES = ppe42-toolchain
+PPE42_TOOLCHAIN_EXTERNAL_PATH = \
+	$(call qstrip,$(BR2_PPE42_TOOLCHAIN_EXTERNAL_PATH))/$(PPE42_TOOLCHAIN_DIR)
+
+define HOST_PPE42_TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS
+        test -e $(PPE42_TOOLCHAIN_EXTERNAL_PATH)
+endef
+
+define HOST_PPE42_TOOLCHAIN_EXTERNAL_INSTALL_CMDS
+        ln -snf $(PPE42_TOOLCHAIN_EXTERNAL_PATH) $(HOST_DIR)/$(PPE42_TOOLCHAIN_DIR)
+
+endef
+
+$(eval $(host-generic-package))
+
diff --git a/openpower/package/sbe/Config.in b/openpower/package/sbe/Config.in
index 2291255..e5f1d46 100644
--- a/openpower/package/sbe/Config.in
+++ b/openpower/package/sbe/Config.in
@@ -3,6 +3,7 @@
         default y if (BR2_OPENPOWER_PLATFORM && BR2_OPENPOWER_POWER9)
         select BR2_CPP
         depends on BR2_PACKAGE_HCODE
+        depends on BR2_PACKAGE_HAS_PPE42_TOOLCHAIN
         help
             Project to build the sbe firmware codebase
 
diff --git a/openpower/package/sbe/sbe.mk b/openpower/package/sbe/sbe.mk
index 121e2c4..2f6d5b4 100644
--- a/openpower/package/sbe/sbe.mk
+++ b/openpower/package/sbe/sbe.mk
@@ -8,7 +8,7 @@
 SBE_SITE = $(call github,open-power,sbe,$(SBE_VERSION))
 
 SBE_LICENSE = Apache-2.0
-SBE_DEPENDENCIES = host-ppe42-gcc hcode
+SBE_DEPENDENCIES = host-ppe42-toolchain hcode
 
 SBE_INSTALL_IMAGES = YES
 SBE_INSTALL_TARGET = NO
diff --git a/openpower/toolchain/Config.in b/openpower/toolchain/Config.in
new file mode 100644
index 0000000..dc5b205
--- /dev/null
+++ b/openpower/toolchain/Config.in
@@ -0,0 +1,6 @@
+menu "OpenPower Toolchain"
+
+source "$BR2_EXTERNAL_OP_BUILD_PATH/toolchain/ppe42-toolchain/Config.in"
+source "$BR2_EXTERNAL_OP_BUILD_PATH/toolchain/p8-pore-toolchain/Config.in"
+
+endmenu
diff --git a/openpower/toolchain/p8-pore-toolchain/Config.in b/openpower/toolchain/p8-pore-toolchain/Config.in
new file mode 100644
index 0000000..c03422b
--- /dev/null
+++ b/openpower/toolchain/p8-pore-toolchain/Config.in
@@ -0,0 +1,27 @@
+menuconfig BR2_PACKAGE_P8_PORE_TOOLCHAIN
+	bool "p8-pore-toolchain"
+	default y if (BR2_OPENPOWER_POWER8)
+	help
+	  Build the PORE toolchain required to build the
+	  POWER8 OCC firmware
+
+if BR2_PACKAGE_P8_PORE_TOOLCHAIN
+choice
+	prompt "P8 PORE Toolchain Type"
+	help
+	  Select whether to build the P8 PORE toolchain or
+	  provide an external one
+
+source "$BR2_EXTERNAL_OP_BUILD_PATH/package/p8-pore-binutils/Config.in"
+source "$BR2_EXTERNAL_OP_BUILD_PATH/package/p8-pore-toolchain-external/Config.in"
+
+endchoice
+
+config BR2_PACKAGE_HAS_P8_PORE_TOOLCHAIN
+	bool
+
+config BR2_PACKAGE_PROVIDES_P8_PORE_TOOLCHAIN
+	depends on BR2_PACKAGE_HAS_P8_PORE_TOOLCHAIN
+	string
+
+endif
diff --git a/openpower/toolchain/p8-pore-toolchain/p8-pore-toolchain.mk b/openpower/toolchain/p8-pore-toolchain/p8-pore-toolchain.mk
new file mode 100644
index 0000000..7936be5
--- /dev/null
+++ b/openpower/toolchain/p8-pore-toolchain/p8-pore-toolchain.mk
@@ -0,0 +1,9 @@
+################################################################################
+#
+# p8-pore-toolchain
+#
+################################################################################
+P8_PORE_TOOLCHAIN_DIR = $(STAGING_SUBDIR)/p8-pore-toolchain
+P8_PORE_TOOLCHAIN_BIN = $(STAGING_SUBDIR)/p8-pore-toolchain/linux
+
+$(eval $(host-virtual-package))
diff --git a/openpower/toolchain/ppe42-toolchain/Config.in b/openpower/toolchain/ppe42-toolchain/Config.in
new file mode 100644
index 0000000..a2d6aa3
--- /dev/null
+++ b/openpower/toolchain/ppe42-toolchain/Config.in
@@ -0,0 +1,33 @@
+
+menuconfig BR2_PACKAGE_PPE42_TOOLCHAIN
+	bool "ppe42-toolchain"
+	default y if (BR2_OPENPOWER_POWER9)
+	help
+	  Build the PPE42 toolchain required to build the
+	  POWER9 firmware for OCC, SBE and HCODE
+
+if BR2_PACKAGE_PPE42_TOOLCHAIN
+
+choice
+	prompt "PPE42 Toolchain Type"
+	help
+	  Select whether to build the PPE42 toolchain or
+	  provide an external one
+
+source "$BR2_EXTERNAL_OP_BUILD_PATH/package/ppe42-gcc/Config.in"
+source "$BR2_EXTERNAL_OP_BUILD_PATH/package/ppe42-toolchain-external/Config.in"
+
+endchoice
+
+if BR2_PACKAGE_HOST_PPE42_GCC
+source "$BR2_EXTERNAL_OP_BUILD_PATH/package/ppe42-binutils/Config.in"
+endif
+
+config BR2_PACKAGE_HAS_PPE42_TOOLCHAIN
+	bool
+
+config BR2_PACKAGE_PROVIDES_PPE42_TOOLCHAIN
+	depends on BR2_PACKAGE_HAS_PPE42_TOOLCHAIN
+	string
+
+endif
diff --git a/openpower/toolchain/ppe42-toolchain/ppe42-toolchain.mk b/openpower/toolchain/ppe42-toolchain/ppe42-toolchain.mk
new file mode 100644
index 0000000..cca0af3
--- /dev/null
+++ b/openpower/toolchain/ppe42-toolchain/ppe42-toolchain.mk
@@ -0,0 +1,9 @@
+################################################################################
+#
+# ppe42-toolchain
+#
+################################################################################
+PPE42_TOOLCHAIN_DIR = $(STAGING_SUBDIR)/ppe42-toolchain
+PPE42_TOOLCHAIN_BIN = $(STAGING_SUBDIR)/ppe42-toolchain/linux
+
+$(eval $(host-virtual-package))