<div dir="ltr"><div><div>Would someone review and comment on the below patch please?  <br><br></div>thanks,<br><br></div>TP<br><br><div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 3, 2016 at 3:26 PM, Toan Pham <span dir="ltr"><<a href="mailto:tpham3783@gmail.com" target="_blank">tpham3783@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><br></div><div>Presently, Openwrt reads default config filename ".config" or from $(HOME)/.openwrt/defconfig if it exists.  This patch will allow users to specify an alternative config file (using relative or absolute path) from the command line.   ie)<br><br></div><div>make TARGET_CONFIG=/src/build/config/boardXYZ.config <br><br><br></div><div>This patch is introduced because in the future, i would like to be able to treat OpenWrt SDK as a blackbox.  Users can build multiple targets without polluting the SDE environment by being able to specify an input config file and an output target directory.  For example:<br><br></div><div>make TARGET_CONFIG=/tmp/test.config TARGET_OUTPUT_DIR=/tmp/testboard<br><br></div><div>where, TARGET_OUTPUT_DIR would contain the output results like: bin, build_dir, staging_dir<br><br></div><div>Another advantage of the above example is that it allows building on tmpfs, which would sufficiently speed up build time.<br><br></div><div>Please review and comment!  thanks!<br></div><div><br>Signed-off-by: Toan Pham <<a href="mailto:tpham3783@gmail.com" target="_blank">tpham3783@gmail.com</a>><br>---<br>diff --git a/Makefile b/Makefile<br>index 8ba2bfc..452bef2 100644<br>--- a/Makefile<br>+++ b/Makefile<br>@@ -62,7 +62,7 @@ $(BUILD_DIR)/.prepared: Makefile<br>     @mkdir -p $$(dirname $@)<br>     @touch $@<br> <br>-tmp/.prereq_packages: .config<br>+tmp/.prereq_packages: $(TARGET_CONFIG) <br>     unset ERROR; \<br>     for package in $(sort $(prereq-y) $(prereq-m)); do \<br>         $(_SINGLE)$(NO_TRACE_MAKE) -s -r -C package/$$package prereq || ERROR=1; \<br>@@ -83,7 +83,7 @@ prereq: $(target/stamp-prereq) tmp/.prereq_packages<br>         exit 1; \<br>     fi<br> <br>-prepare: .config $(tools/stamp-install) $(toolchain/stamp-install)<br>+prepare: $(TARGET_CONFIG) $(tools/stamp-install) $(toolchain/stamp-install)<br> world: prepare $(target/stamp-compile) $(package/stamp-compile) $(package/stamp-install) $(target/stamp-install) FORCE<br>     $(_SINGLE)$(SUBMAKE) -r package/index<br> <br>diff --git a/include/<a href="http://kernel-build.mk" target="_blank">kernel-build.mk</a> b/include/<a href="http://kernel-build.mk" target="_blank">kernel-build.mk</a><br>index a52c90d..f732d03 100644<br>--- a/include/<a href="http://kernel-build.mk" target="_blank">kernel-build.mk</a><br>+++ b/include/<a href="http://kernel-build.mk" target="_blank">kernel-build.mk</a><br>@@ -102,7 +102,7 @@ define BuildKernel<br>         echo; \<br>     ) > $$@<br> <br>-  $(STAMP_CONFIGURED): $(STAMP_PREPARED) $(LINUX_KCONFIG_LIST) $(TOPDIR)/.config<br>+  $(STAMP_CONFIGURED): $(STAMP_PREPARED) $(LINUX_KCONFIG_LIST) $(TARGET_CONFIG)<br>     $(Kernel/Configure)<br>     touch $$@<br> <br>diff --git a/include/<a href="http://kernel-defaults.mk" target="_blank">kernel-defaults.mk</a> b/include/<a href="http://kernel-defaults.mk" target="_blank">kernel-defaults.mk</a><br>index 406fd46..3cfcdb3 100644<br>--- a/include/<a href="http://kernel-defaults.mk" target="_blank">kernel-defaults.mk</a><br>+++ b/include/<a href="http://kernel-defaults.mk" target="_blank">kernel-defaults.mk</a><br>@@ -107,11 +107,11 @@ endef<br> define Kernel/Configure/Default<br>     $(LINUX_CONF_CMD) > $(LINUX_DIR)/.config.target<br> # copy CONFIG_KERNEL_* settings over to .config.target<br>-    awk '/^(#[[:space:]]+)?CONFIG_KERNEL/{sub("CONFIG_KERNEL_","CONFIG_");print}' $(TOPDIR)/.config >> $(LINUX_DIR)/.config.target<br>+    awk '/^(#[[:space:]]+)?CONFIG_KERNEL/{sub("CONFIG_KERNEL_","CONFIG_");print}' $(TARGET_CONFIG) >> $(LINUX_DIR)/.config.target<br>     echo "# CONFIG_KALLSYMS_EXTRA_PASS is not set" >> $(LINUX_DIR)/.config.target<br>     echo "# CONFIG_KALLSYMS_ALL is not set" >> $(LINUX_DIR)/.config.target<br>     echo "CONFIG_KALLSYMS_UNCOMPRESSED=y" >> $(LINUX_DIR)/.config.target<br>-    $(SCRIPT_DIR)/<a href="http://metadata.pl" target="_blank">metadata.pl</a> kconfig $(TMP_DIR)/.packageinfo $(TOPDIR)/.config $(KERNEL_PATCHVER) > $(LINUX_DIR)/.config.override<br>+    $(SCRIPT_DIR)/<a href="http://metadata.pl" target="_blank">metadata.pl</a> kconfig $(TMP_DIR)/.packageinfo $(TARGET_CONFIG) $(KERNEL_PATCHVER) > $(LINUX_DIR)/.config.override<br>     $(SCRIPT_DIR)/<a href="http://kconfig.pl" target="_blank">kconfig.pl</a> 'm+' '+' $(LINUX_DIR)/.config.target /dev/null $(LINUX_DIR)/.config.override > $(LINUX_DIR)/.config.set<br>     $(call Kernel/SetNoInitramfs)<br>     rm -rf $(KERNEL_BUILD_DIR)/modules<br>diff --git a/include/<a href="http://toplevel.mk" target="_blank">toplevel.mk</a> b/include/<a href="http://toplevel.mk" target="_blank">toplevel.mk</a><br>index 9709302..2d45c9c 100644<br>--- a/include/<a href="http://toplevel.mk" target="_blank">toplevel.mk</a><br>+++ b/include/<a href="http://toplevel.mk" target="_blank">toplevel.mk</a><br>@@ -58,7 +58,7 @@ else<br> endif<br> <br> ifeq ($(FORCE),)<br>-  .config scripts/config/conf scripts/config/mconf: staging_dir/host/.prereq-build<br>+  $(TARGET_CONFIG) scripts/config/conf scripts/config/mconf: staging_dir/host/.prereq-build<br> endif<br> <br> SCAN_COOKIE?=$(shell echo $$$$)<br>@@ -90,10 +90,10 @@ prepare-tmpinfo: FORCE<br>     ./scripts/<a href="http://metadata.pl" target="_blank">metadata.pl</a> package_subdirs tmp/.packageinfo > tmp/.packagesubdirs || { rm -f tmp/.packagesubdirs; false; }<br>     touch $(TOPDIR)/tmp/.build<br> <br>-.config: ./scripts/config/conf $(if $(CONFIG_HAVE_DOT_CONFIG),,prepare-tmpinfo)<br>-    @+if [ \! -e .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \<br>-        [ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \<br>-        $(_SINGLE)$(NO_TRACE_MAKE) menuconfig $(PREP_MK); \<br>+$(TARGET_CONFIG): ./scripts/config/conf $(if $(CONFIG_HAVE_DOT_CONFIG),,prepare-tmpinfo)<br>+    @+if [ \! -e $(TARGET_CONFIG) ] || ! grep CONFIG_HAVE_DOT_CONFIG $(TARGET_CONFIG) >/dev/null; then \<br>+        [ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig $(TARGET_CONFIG); \<br>+        $(NO_TRACE_MAKE) menuconfig $(PREP_MK); \<br>     fi<br> <br> scripts/config/mconf:<br>@@ -105,15 +105,16 @@ scripts/config/conf:<br>     @$(_SINGLE)$(SUBMAKE) -s -C scripts/config conf CC="$(HOSTCC_WRAPPER)"<br> <br> config: scripts/config/conf prepare-tmpinfo FORCE<br>-    $< Config.in<br>+    KCONFIG_CONFIG=$(TARGET_CONFIG) $< Config.in<br> <br> config-clean: FORCE<br>     $(_SINGLE)$(NO_TRACE_MAKE) -C scripts/config clean<br> <br> defconfig: scripts/config/conf prepare-tmpinfo FORCE<br>-    touch .config<br>-    @if [ -e $(HOME)/.openwrt/defconfig ]; then cp $(HOME)/.openwrt/defconfig .config; fi<br>-    $< --defconfig=.config Config.in<br>+    touch $(TARGET_CONFIG) <br>+    @if [ -e $(HOME)/.openwrt/defconfig ]; then cp $(HOME)/.openwrt/defconfig $(TARGET_CONFIG); fi<br>+    $< --defconfig=$(TARGET_CONFIG) Config.in<br>+    [ -f .config ] && mv .config $(TARGET_CONFIG)<br> <br> confdefault-y=allyes<br> confdefault-m=allmod<br>@@ -121,15 +122,15 @@ confdefault-n=allno<br> confdefault:=$(confdefault-$(CONFDEFAULT))<br> <br> oldconfig: scripts/config/conf prepare-tmpinfo FORCE<br>-    $< --$(if $(confdefault),$(confdefault),old)config Config.in<br>+    KCONFIG_CONFIG=$(TARGET_CONFIG) $< --$(if $(confdefault),$(confdefault),old)config Config.in<br> <br> menuconfig: scripts/config/mconf prepare-tmpinfo FORCE<br>-    if [ \! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then \<br>+    if [ \! -e $(TARGET_CONFIG) -a -e $(HOME)/.openwrt/defconfig ]; then \<br>         cp $(HOME)/.openwrt/defconfig .config; \<br>     fi<br>-    $< Config.in<br>+    KCONFIG_CONFIG=$(TARGET_CONFIG) $< Config.in<br> <br>-prepare_kernel_conf: .config FORCE<br>+prepare_kernel_conf: $(TARGET_CONFIG) FORCE<br> <br> ifeq ($(wildcard staging_dir/host/bin/quilt),)<br>   prepare_kernel_conf:<br>@@ -142,7 +143,7 @@ kernel_oldconfig: prepare_kernel_conf<br>     $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux oldconfig<br> <br> kernel_menuconfig: prepare_kernel_conf<br>-    $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux menuconfig<br>+    $(MAKE) -C target/linux menuconfig <br> <br> kernel_nconfig: prepare_kernel_conf<br>     $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux nconfig<br>@@ -165,16 +166,16 @@ staging_dir/host/.prereq-build: include/<a href="http://prereq-build.mk" target="_blank">prereq-build.mk</a><br> printdb: FORCE<br>     @$(_SINGLE)$(NO_TRACE_MAKE) -p $@ V=99 DUMP_TARGET_DB=1 2>&1<br> <br>-download: .config FORCE<br>+download: $(TARGET_CONFIG) FORCE<br>     @+$(SUBMAKE) tools/download<br>     @+$(SUBMAKE) toolchain/download<br>     @+$(SUBMAKE) package/download<br>     @+$(SUBMAKE) target/download<br> <br>-clean dirclean: .config<br>+clean dirclean: $(TARGET_CONFIG) <br>     @+$(SUBMAKE) -r $@<br> <br>-prereq:: prepare-tmpinfo .config<br>+prereq:: prepare-tmpinfo $(TARGET_CONFIG) <br>     @+$(NO_TRACE_MAKE) -r -s $@<br> <br> WARN_PARALLEL_ERROR = $(if $(BUILD_LOG),,$(and $(filter -j,$(MAKEFLAGS)),$(findstring s,$(OPENWRT_VERBOSE))))<br>@@ -183,7 +184,7 @@ ifeq ($(SDK),1)<br> <br> %::<br>     @+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq<br>-    @./scripts/config/conf --defconfig=.config Config.in<br>+    @./scripts/config/conf --defconfig=$(TARGET_CONFIG) Config.in<br>     @+$(ULIMIT_FIX) $(SUBMAKE) -r $@<br> <br> else<br>@@ -191,9 +192,9 @@ else<br> %::<br>     @+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq<br>     @( \<br>-        cp .config tmp/.config; \<br>+        cp $(TARGET_CONFIG) tmp/.config; \<br>         ./scripts/config/conf --defconfig=tmp/.config -w tmp/.config Config.in > /dev/null 2>&1; \<br>-        if ./scripts/<a href="http://kconfig.pl" target="_blank">kconfig.pl</a> '>' .config tmp/.config | grep -q CONFIG; then \<br>+        if ./scripts/<a href="http://kconfig.pl" target="_blank">kconfig.pl</a> '>' $(TARGET_CONFIG) tmp/.config | grep -q CONFIG; then \<br>             printf "$(_R)WARNING: your configuration is out of sync. Please run make menuconfig, oldconfig or defconfig!$(_N)\n" >&2; \<br>         fi \<br>     )<br>@@ -232,7 +233,7 @@ distclean:<br>     @$(_SINGLE)$(SUBMAKE) -C scripts/config clean<br> <br> ifeq ($(findstring v,$(DEBUG)),)<br>-  .SILENT: symlinkclean clean dirclean distclean config-clean download help tmpinfo-clean .config scripts/config/mconf scripts/config/conf menuconfig staging_dir/host/.prereq-build tmp/.prereq-package prepare-tmpinfo<br>+  .SILENT: symlinkclean clean dirclean distclean config-clean download help tmpinfo-clean $(TARGET_CONFIG) scripts/config/mconf scripts/config/conf menuconfig staging_dir/host/.prereq-build tmp/.prereq-package prepare-tmpinfo<br> endif<br> .PHONY: help FORCE<br> .NOTPARALLEL:<br>diff --git a/package/Makefile b/package/Makefile<br>index 1a78fde..acc2307 100644<br>--- a/package/Makefile<br>+++ b/package/Makefile<br>@@ -184,7 +184,8 @@ $(curdir)/preconfig:<br> <br> $(curdir)/flags-install:= -j1<br> <br>-$(eval $(call stampfile,$(curdir),package,prereq,.config))<br>+#$(eval $(call stampfile,$(curdir),package,prereq,.config))<br>+$(eval $(call stampfile,$(curdir),package,prereq,$(TARGET_CONFIG)))<br> $(eval $(call stampfile,$(curdir),package,cleanup,$(TMP_DIR)/.build))<br> $(eval $(call stampfile,$(curdir),package,compile,$(TMP_DIR)/.build))<br> $(eval $(call stampfile,$(curdir),package,install,$(TMP_DIR)/.build))<br>diff --git a/package/utils/busybox/Makefile b/package/utils/busybox/Makefile<br>index 6a55d56..c31b857 100644<br>--- a/package/utils/busybox/Makefile<br>+++ b/package/utils/busybox/Makefile<br>@@ -27,7 +27,7 @@ PKG_LICENSE_FILES:=LICENSE archival/libarchive/bz/LICENSE<br> include $(INCLUDE_DIR)/<a href="http://package.mk" target="_blank">package.mk</a><br> <br> ifeq ($(DUMP),)<br>-  STAMP_CONFIGURED:=$(strip $(STAMP_CONFIGURED))_$(shell $(SH_FUNC) grep '^CONFIG_BUSYBOX_' $(TOPDIR)/.config | md5s)<br>+  STAMP_CONFIGURED:=$(strip $(STAMP_CONFIGURED))_$(shell $(SH_FUNC) grep '^CONFIG_BUSYBOX_' $(TARGET_CONFIG) | md5s)<br> endif<br> <br> ifneq ($(findstring c,$(OPENWRT_VERBOSE)),)<br>@@ -62,7 +62,7 @@ export KCONFIG_NOTIMESTAMP=1<br> <br> define Build/Configure<br>     rm -f $(PKG_BUILD_DIR)/.configured*<br>-    grep 'CONFIG_BUSYBOX_$(BUSYBOX_SYM)' $(TOPDIR)/.config | sed -e "s,\\(# \)\\?CONFIG_BUSYBOX_$(BUSYBOX_SYM)_\\(.*\\),\\1CONFIG_\\2,g" > $(PKG_BUILD_DIR)/.config<br>+    grep 'CONFIG_BUSYBOX_$(BUSYBOX_SYM)' $(TARGET_CONFIG) | sed -e "s,\\(# \)\\?CONFIG_BUSYBOX_$(BUSYBOX_SYM)_\\(.*\\),\\1CONFIG_\\2,g" > $(PKG_BUILD_DIR)/.config<br>     yes 'n' | $(MAKE) -C $(PKG_BUILD_DIR) \<br>         CC="$(TARGET_CC)" \<br>         CROSS_COMPILE="$(TARGET_CROSS)" \<br>diff --git a/<a href="http://rules.mk" target="_blank">rules.mk</a> b/<a href="http://rules.mk" target="_blank">rules.mk</a><br>index 22807da..691b393 100644<br>--- a/<a href="http://rules.mk" target="_blank">rules.mk</a><br>+++ b/<a href="http://rules.mk" target="_blank">rules.mk</a><br>@@ -8,8 +8,16 @@<br> ifneq ($(__rules_inc),1)<br> __rules_inc=1<br> <br>+TARGET_CONFIG?=$(TOPDIR)/.config<br>+<br>+ifneq ("$(wildcard $(TARGET_CONFIG))","")<br>+  override TARGET_CONFIG:=$(TARGET_CONFIG)<br>+else<br>+  override TARGET_CONFIG:=$(TOPDIR)/$(TARGET_CONFIG)<br>+endif<br>+<br> ifeq ($(DUMP),)<br>-  -include $(TOPDIR)/.config<br>+  -include $(TARGET_CONFIG)<br> endif<br> include $(TOPDIR)/include/<a href="http://debug.mk" target="_blank">debug.mk</a><br> include $(TOPDIR)/include/<a href="http://verbose.mk" target="_blank">verbose.mk</a><br>diff --git a/target/Makefile b/target/Makefile<br>index cb68454..c9c8e33 100644<br>--- a/target/Makefile<br>+++ b/target/Makefile<br>@@ -12,7 +12,7 @@ $(curdir)/builddirs-install:=linux $(if $(CONFIG_SDK),sdk) $(if $(CONFIG_IB),ima<br> <br> $(curdir)/imagebuilder/install:=$(curdir)/linux/install<br> <br>-$(eval $(call stampfile,$(curdir),target,prereq,.config))<br>+$(eval $(call stampfile,$(curdir),target,prereq,$(TARGET_CONFIG)))<br> $(eval $(call stampfile,$(curdir),target,compile,$(TMP_DIR)/.build))<br> $(eval $(call stampfile,$(curdir),target,install,$(TMP_DIR)/.build))<br> <br>diff --git a/target/linux/Makefile b/target/linux/Makefile<br>index f7bbdff..95cd417 100644<br>--- a/target/linux/Makefile<br>+++ b/target/linux/Makefile<br>@@ -10,4 +10,4 @@ include $(INCLUDE_DIR)/<a href="http://target.mk" target="_blank">target.mk</a><br> export TARGET_BUILD=1<br> <br> prereq clean download prepare compile install menuconfig nconfig oldconfig update refresh: FORCE<br>-    @+$(NO_TRACE_MAKE) -C $(BOARD) $@<br>+    @+$(NO_TRACE_MAKE) -C $(BOARD) $@ <br>diff --git a/target/sdk/Makefile b/target/sdk/Makefile<br>index 857a6b7..7ef69db 100644<br>--- a/target/sdk/Makefile<br>+++ b/target/sdk/Makefile<br>@@ -92,11 +92,11 @@ $(BIN_DIR)/$(SDK_NAME).tar.bz2: clean<br>     rm -rf \<br>         $(SDK_BUILD_DIR)/target/linux/*/files* \<br>         $(SDK_BUILD_DIR)/target/linux/*/patches*<br>-    ./<a href="http://convert-config.pl" target="_blank">convert-config.pl</a> $(TOPDIR)/.config > $(SDK_BUILD_DIR)/Config-build.in<br>+    ./<a href="http://convert-config.pl" target="_blank">convert-config.pl</a> $(TARGET_CONFIG) > $(SDK_BUILD_DIR)/Config-build.in<br>     $(CP) -L \<br>         $(TOPDIR)/LICENSE \<br>         $(TOPDIR)/<a href="http://rules.mk" target="_blank">rules.mk</a> \<br>-        $(TOPDIR)/.config \<br>+        $(TARGET_CONFIG) \<br>         ./files/Config.in \<br>         ./files/Makefile \<br>         ./files/include/<a href="http://prepare.mk" target="_blank">prepare.mk</a> \<br>diff --git a/toolchain/Makefile b/toolchain/Makefile<br>index cd5399e..7479615 100644<br>--- a/toolchain/Makefile<br>+++ b/toolchain/Makefile<br>@@ -53,7 +53,7 @@ endif<br> <br> ifndef DUMP_TARGET_DB<br> ifneq ($(ARCH),)<br>-  $(TOOLCHAIN_DIR)/<a href="http://info.mk" target="_blank">info.mk</a>: .config<br>+  $(TOOLCHAIN_DIR)/<a href="http://info.mk" target="_blank">info.mk</a>:  $(TARGET_CONFIG) <br>     @for dir in $(TOOLCHAIN_DIR); do ( \<br>         $(if $(QUIET),,set -x;) \<br>         mkdir -p "$$dir"; \<br>@@ -68,7 +68,7 @@ endif<br> endif<br> <br> # prerequisites for the individual targets<br>-$(curdir)/ := .config prereq<br>+$(curdir)/ := $(TARGET_CONFIG) prereq<br> $(curdir)//prepare = $(STAGING_DIR)/.prepared $(TOOLCHAIN_DIR)/<a href="http://info.mk" target="_blank">info.mk</a> $(tools/stamp-install)<br> $(curdir)//compile = $(1)/prepare<br> $(curdir)//install = $(1)/compile<br>diff --git a/tools/Makefile b/tools/Makefile<br>index 187655e..64ebcbd 100644<br>--- a/tools/Makefile<br>+++ b/tools/Makefile<br>@@ -126,7 +126,7 @@ $(curdir)//prepare = $(STAGING_DIR)/.prepared $(STAGING_DIR_HOST)/.prepared<br> $(curdir)//compile = $(STAGING_DIR)/.prepared $(STAGING_DIR_HOST)/.prepared<br> <br> # prerequisites for the individual targets<br>-$(curdir)/ := .config prereq<br>+$(curdir)/ := $(TARGET_CONFIG) prereq<br> $(curdir)//install = $(1)/compile<br> <br> tools_enabled = $(foreach tool,$(sort $(tools-y) $(tools-)),$(if $(filter $(tool),$(tools-y)),y,n))<br><br><br><br><br></div><div><br><br><br></div><div><br></div></div>
</blockquote></div><br></div></div></div></div></div>