[OpenWrt-Devel] [PATCH 13/14] target/sdk: Allow building a more complete SDK from within an SDK

openwrt at daniel.thecshore.com openwrt at daniel.thecshore.com
Sun Jan 3 01:03:01 EST 2016


From: Daniel Dickinson <openwrt at daniel.thecshore.com>

This patch allows using and SDK to build additional packages to
create a more complete SDK (e.g. you could start with a base
system SDK and use it to create an SDK that has libraries from
both base and packages feed).  This allows for new workflows
that build a common base and then branch in different directions
depending on the type of system being build (e.g. router vs.
NAS).

Signed-off-by: Daniel Dickinson <openwrt at daniel.thecshore.com>
---
 .gitignore                    |  3 +-
 config/Config-build.in        |  2 ++
 config/Config-version.in      | 26 ++++++++---------
 target/Makefile               |  6 ++--
 target/imagebuilder/Config.in |  1 +
 target/sdk/Config-in-sdk.in   |  8 ++++++
 target/sdk/Config.in          | 20 +++++++++++++
 target/sdk/Makefile           | 67 +++++++++++++++++++++++++++++++++++++++----
 target/sdk/files/Config.in    | 20 +++++++++++--
 target/sdk/files/Makefile     | 10 +++++--
 10 files changed, 135 insertions(+), 28 deletions(-)
 create mode 100644 target/sdk/Config-in-sdk.in

diff --git a/.gitignore b/.gitignore
index cd86e34..eb85c1f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,7 +15,8 @@
 /files
 /package/feeds
 /package/openwrt-packages
-key-build*
+key-base*
+key-sdk*
 *.orig
 *.rej
 *~
diff --git a/config/Config-build.in b/config/Config-build.in
index 5867f53..bf10922 100644
--- a/config/Config-build.in
+++ b/config/Config-build.in
@@ -21,6 +21,8 @@ menu "Global build settings"
 	config BUILD_KEY_TYPE
 		string
 		prompt "Name for build key with signed package lists"
+		default "base" if !IN_SDK
+		default "sdk" if IN_SDK
 		depends on SIGNED_PACKAGES
 
 	comment "General build options"
diff --git a/config/Config-version.in b/config/Config-version.in
index f995b92..e48afd9 100644
--- a/config/Config-version.in
+++ b/config/Config-version.in
@@ -96,18 +96,18 @@ if VERSIONOPT
 			Enable this to include the version number in firmware image, SDK-
 			and Image Builder archive file names
 
-	config VERSION_FLAVOUR
-		string
-		prompt "Release flavour"
-		help
-			This is an optional string that gets added to
-			output filenames and is part of the version id,
-			which identifies a 'flavour' of build (for example
-			for differentiating between SDK's/images build with
-			NAS vs router appropriate settings).
-			It is enabled by default when using the SDK
-			and building a second SDK (so filenames will
-			be distinct).
-
 endif
 
+config VERSION_FLAVOUR
+	string
+	prompt "Release flavour" if (VERSIONOPT || IN_SDK)
+	help
+		This is an optional string that gets added to
+		output filenames and is part of the version id,
+		which identifies a 'flavour' of build (for example
+		for differentiating between SDK's/images build with
+		NAS vs router appropriate settings).
+		It is enabled by default when using the SDK
+		and building a second SDK (so filenames will
+		be distinct).
+
diff --git a/target/Makefile b/target/Makefile
index cb68454..420d87b 100644
--- a/target/Makefile
+++ b/target/Makefile
@@ -6,9 +6,9 @@
 #
 curdir:=target
 
-$(curdir)/builddirs:=linux sdk imagebuilder toolchain
-$(curdir)/builddirs-default:=linux
-$(curdir)/builddirs-install:=linux $(if $(CONFIG_SDK),sdk) $(if $(CONFIG_IB),imagebuilder) $(if $(CONFIG_MAKE_TOOLCHAIN),toolchain)
+$(curdir)/builddirs:=$(if $(CONFIG_IN_SDK),,linux) sdk $(if $(CONFIG_IN_SDK),,imagebuilder toolchain)
+$(curdir)/builddirs-default:=$(if $(CONFIG_IN_SDK),,linux)
+$(curdir)/builddirs-install:=$(if $(CONFIG_IN_SDK),,linux) $(if $(CONFIG_SDK),sdk) $(if $(CONFIG_IN_SDK),,$(if $(CONFIG_IB),imagebuilder) $(if $(CONFIG_MAKE_TOOLCHAIN),toolchain))
 
 $(curdir)/imagebuilder/install:=$(curdir)/linux/install
 
diff --git a/target/imagebuilder/Config.in b/target/imagebuilder/Config.in
index 9f50b46..af29411 100644
--- a/target/imagebuilder/Config.in
+++ b/target/imagebuilder/Config.in
@@ -9,6 +9,7 @@ config IB
 
 config IB_STANDALONE
 	bool "Include package repositories"
+	default n if SDK_CORE
 	default y
 	depends on IB
 	help
diff --git a/target/sdk/Config-in-sdk.in b/target/sdk/Config-in-sdk.in
new file mode 100644
index 0000000..7ed95dc
--- /dev/null
+++ b/target/sdk/Config-in-sdk.in
@@ -0,0 +1,8 @@
+config SDK
+	bool "Build the OpenWrt SDK"
+	depends on !EXTERNAL_TOOLCHAIN || EXTERNAL_TOOLCHAIN_SDK
+	help
+	  Build a second-stage SDK that contain everything in this
+	  SDK plus the STAGING_DIR results of compiling packages
+	  selected for build.
+
diff --git a/target/sdk/Config.in b/target/sdk/Config.in
index 1a82149..52fb30a 100644
--- a/target/sdk/Config.in
+++ b/target/sdk/Config.in
@@ -6,4 +6,24 @@ config SDK
 	  with a precompiled toolchain. It can be used to develop and
 	  test packages for OpenWrt before including them in the buildroot
 
+config SDK_CORE
+	bool "Build SDK with only Buildroot and Kernel"
+	depends on !EXTERNAL_TOOLCHAIN || EXTERNAL_TOOLCHAIN_SDK
+	depends on SDK
+
+	help
+	  This consists only the build machinery (e.g. toolchain),
+          kernel, and all packages from the source packages on which
+          the build machinery and toolchain depend (and likewise for
+          the full dependency chain).  It is intended to be able build
+          all packages including base packages and the 'full' SDK (that
+          is an SDK with STAGING_DIR populated with the results of
+          InstallDev sections of packages in base), but this core SDK
+          only the dependency to satisfy itself; to be useful one must
+	  build the dependencies for other packages (e.g. by taking this
+          SDK and adding the base feed and building what this SDK doesn't
+          provide (and that build can build the 'full' SDK).
+	  All packages selected by default by this option come from
+	  a source package on which there is a dependency from toolchain or
+          kernel being built.
 
diff --git a/target/sdk/Makefile b/target/sdk/Makefile
index 9b1c192..57c2c8a 100644
--- a/target/sdk/Makefile
+++ b/target/sdk/Makefile
@@ -66,7 +66,59 @@ KERNEL_FILES := $(patsubst $(TOPDIR)/%,%,$(wildcard $(addprefix $(LINUX_DIR)/,$(
 all: compile
 
 $(BIN_DIR)/$(SDK_NAME).tar.bz2: clean
+	rm -rf $(SDK_BUILD_DIR)/package
 	mkdir -p $(SDK_BUILD_DIR)/dl $(SDK_BUILD_DIR)/package
+	# The package Makefile is always needed
+	rm -f $(SDK_BUILD_DIR)/package/Makefile
+	$(CP) \
+		$(TOPDIR)/package/Makefile \
+		$(SDK_BUILD_DIR)/package/
+	# We want to always sign package builds unless deliberately turned off
+	# rm -f $(SDK_BUILD_DIR)/package/signing-key
+	$(CP) \
+		$(TOPDIR)/package/signing-key \
+		$(SDK_BUILD_DIR)/package/
+
+	# Busybox loooks in package subdir for Config.in files
+ 	# So let busybox work from SDK if present (e.g. via base feed)
+	# Note that the feed name must be base for this to work
+	# It would be non-trivial to genericize this
+	mkdir -p $(SDK_BUILD_DIR)/package/utils
+	rm -f $(SDK_BUILD_DIR)/package/utils/busybox
+	ln -s \
+		../../package/feeds/base/busybox \
+		$(SDK_BUILD_DIR)/package/utils/busybox
+
+	# Use placeholders for KConfig definitions not present in SDK (via conversion from
+	# .config to placeholders that maintain the current setting)
+	# Includes making sure signing key is used by default
+	mkdir -p $(SDK_BUILD_DIR)/config
+	$(TOPDIR)/target/convert-config.pl $(TOPDIR)/.config > $(SDK_BUILD_DIR)/config/fromdotconfig.in
+	# Mangle .config and suitable defaults for SDK
+	# Especially base kernel modules shouldn't be attempted to be rebuilt from SDK
+	case "$(BUILD_KEY_TYPE)" in \
+	sdk*) SDKNUM="$$(echo "$(BUILD_KEY_TYPE)" | sed -e 's/sdk\(.*\)/\1/')" ; \
+		if [ "$$SDKNUM" = "" ]; \
+		then export SDKNUM=0; \
+		fi; \
+		export SDKNUM=$$((SDKNUM + 2)) ; \
+		export NEXTSDKNUM=$$((SDKNUM + 1)) ; \
+		;; \
+	*) export SDKNUM="" ; \
+		export NEXTSDKNUM=2 ; \
+		;; \
+	esac; \
+		sed -e 's/CONFIG_SDK_CORE=y/# CONFIG_SDK_CORE is not set/' $(TOPDIR)/.config | \
+		sed -e 's/CONFIG_SDK=y/# CONFIG_SDK is not set/' | \
+		sed -e 's/CONFIG_ALL_KMODS=y/# CONFIG_ALL_KMODS is not set/' | \
+		sed -e 's/^#\? *CONFIG_ALL\(=\| is\).*/CONFIG_ALL=y/' | \
+		sed -e 's/CONFIG_BUILD_KEY_TYPE="base"/CONFIG_BUILD_KEY_TYPE="sdk"/' | \
+		sed -e 's/CONFIG_IB=y/# CONFIG_IB is not set/' | \
+		sed -e 's/CONFIG_MAKE_TOOLCHAIN=y/# CONFIG_MAKE_TOOLCHAIN is not set/' | \
+		sed -e "s/CONFIG_VERSION_FLAVOUR=\"\\(Stage[0-9]*\\)\\?\"/CONFIG_VERSION_FLAVOUR=\"Stage$${NEXTSDKNUM}\"/" | \
+		sed -e '$$a\CONFIG_IN_SDK=y' | \
+		sed -e "s/CONFIG_BUILD_KEY_TYPE=\"sdk[0-9]*\"/CONFIG_BUILD_KEY_TYPE=\"sdk$${SDKNUM}\"/" | \
+		sed -e "/CONFIG_PACKAGE_signing-key/a\\CONFIG_PACKAGE_signing-key-sdk$${SDKNUM}=m" >$(SDK_BUILD_DIR)/.config
 	$(CP) $(INCLUDE_DIR) $(SCRIPT_DIR) $(TOPDIR)/docs $(SDK_BUILD_DIR)/
 	$(TAR) -cf - -C $(TOPDIR) \
 		$(foreach exclude,$(EXCLUDE_DIRS),--exclude="$(exclude)") \
@@ -92,23 +144,26 @@ $(BIN_DIR)/$(SDK_NAME).tar.bz2: clean
 	rm -rf \
 		$(SDK_BUILD_DIR)/target/linux/*/files* \
 		$(SDK_BUILD_DIR)/target/linux/*/patches*
-	$(TOPDIR)/target/convert-config.pl $(TOPDIR)/.config > $(SDK_BUILD_DIR)/Config-build.in
+	mkdir -p $(SDK_BUILD_DIR)/target
+	$(CP) $(TOPDIR)/target/{sdk,Makefile,convert-config.pl} $(SDK_BUILD_DIR)/target/
 	$(CP) -L \
 		$(TOPDIR)/LICENSE \
 		$(TOPDIR)/rules.mk \
-		$(TOPDIR)/.config \
+		$(TOPDIR)/config \
 		./files/Config.in \
 		./files/Makefile \
 		./files/include/prepare.mk \
 		./files/README.SDK \
 		$(SDK_BUILD_DIR)/
-	$(CP) \
-		$(TOPDIR)/package/Makefile \
-		$(SDK_BUILD_DIR)/package/
-
 	# Prevent feeds install and/or rebuilt of packages already built (unless
 	# forced).
 	mkdir -p $(SDK_BUILD_DIR)/$(STAGING_DIR_TARGET)/pkgstamp
+	# SDK from SDK should remember previous SDK's built packages
+	if [ -d $(TOPDIR)/pkgstamp ]; then \
+		$(CP) \
+			$(TOPDIR)/pkgstamp \
+			$(SDK_BUILD_DIR)/; \
+	fi
 	-$(CP) $(STAGING_DIR)/pkgstamp-current/* $(SDK_BUILD_DIR)/pkgstamp/
 	-rm -f $(SDK_BUILD_DIR)/feeds.conf.default
 	$(if $(BASE_FEED),echo "$(BASE_FEED)" > $(SDK_BUILD_DIR)/feeds.conf.default)
diff --git a/target/sdk/files/Config.in b/target/sdk/files/Config.in
index 45f2faf..bce71f2 100644
--- a/target/sdk/files/Config.in
+++ b/target/sdk/files/Config.in
@@ -4,14 +4,28 @@
 # See /LICENSE for more information.
 #
 
+mainmenu "OpenWrt Configuration"
+
+source "config/fromdotconfig.in"
+
 config MODULES
+	option modules
 	bool
 	default y
-	option modules
 
-mainmenu "OpenWrt Configuration"
+config HAVE_DOT_CONFIG
+	bool
+	default y
+
+config IN_SDK
+	bool	
+	default y
+
+source "target/sdk/Config-in-sdk.in"
+
+source "config/Config-build.in"
 
-source "Config-build.in"
+source "config/Config-devel.in"
 
 source "config/Config-version.in"
 
diff --git a/target/sdk/files/Makefile b/target/sdk/files/Makefile
index 2edf7b3..86d309d 100644
--- a/target/sdk/files/Makefile
+++ b/target/sdk/files/Makefile
@@ -31,9 +31,15 @@ else
   include rules.mk
   include $(INCLUDE_DIR)/depends.mk
   include $(INCLUDE_DIR)/subdir.mk
+  include target/Makefile
   include package/Makefile
 
-$(package/stamp-compile): $(BUILD_DIR)/.prepared
+$(package/stamp-compile): $(BUILD_DIR)/.prepared $(target/stamp-cleanup)
+$(package/stamp-markforsdk): $(package/stamp-compile)
+$(package/stamp-install): $(package/stamp-compile) $(package/stamp-markforsdk)
+$(target/stamp-compile): $(package/stamp-compile) $(package/stamp-markforsdk)
+$(target/stamp-install): $(package/stamp-compile) $(package/stamp-markforsdk) $(target/stamp-compile)
+
 $(BUILD_DIR)/.prepared: Makefile
 	@mkdir -p $$(dirname $@)
 	@touch $@
@@ -51,7 +57,7 @@ dirclean: clean
 # check prerequisites before starting to build
 prereq: $(package/stamp-prereq) ;
 
-world: prepare $(package/stamp-compile) FORCE
+world: prepare $(target/stamp-compile) $(package/stamp-compile) $(target/stamp-install) FORCE
 	@$(MAKE) package/index
 
 .PHONY: clean dirclean prereq prepare world
-- 
2.4.3
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list