ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/target/sdk/Config.in b/target/sdk/Config.in
new file mode 100644
index 0000000..9fee5ab
--- /dev/null
+++ b/target/sdk/Config.in
@@ -0,0 +1,18 @@
+config SDK
+	bool "Build the OpenWrt SDK"
+	depends on !EXTERNAL_TOOLCHAIN
+	default BUILDBOT
+	help
+	  This is essentially a stripped-down version of the buildroot
+	  with a precompiled toolchain. It can be used to develop and
+	  test packages for OpenWrt before including them in the buildroot
+
+config SDK_LLVM_BPF
+	bool "Build the LLVM-BPF toolchain tarball"
+	depends on BPF_TOOLCHAIN_BUILD_LLVM
+	select NEED_BPF_TOOLCHAIN
+	default BUILDBOT
+	help
+	  This is a tarball of the precompiled LLVM toolchain suitable
+	  for unpacking into the buildroot/SDK. It is used to build packages
+	  that ship with eBPF kernel modules
diff --git a/target/sdk/Makefile b/target/sdk/Makefile
new file mode 100644
index 0000000..a2eb35c
--- /dev/null
+++ b/target/sdk/Makefile
@@ -0,0 +1,200 @@
+# 
+# Copyright (C) 2006-2014 OpenWrt.org
+# Copyright (C) 2016 LEDE Project
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/kernel.mk
+include $(INCLUDE_DIR)/version.mk
+include $(INCLUDE_DIR)/download.mk
+
+override MAKEFLAGS=
+
+SDK_NAME:=$(VERSION_DIST_SANITIZED)-sdk-$(if $(CONFIG_VERSION_FILENAMES),$(VERSION_NUMBER)-)$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET))$(if $(GCCV),_gcc-$(GCCV))$(DIR_SUFFIX).$(HOST_OS)-$(HOST_ARCH)
+SDK_BUILD_DIR:=$(BUILD_DIR)/$(SDK_NAME)
+
+STAGING_SUBDIR_HOST := staging_dir/host
+STAGING_SUBDIR_TARGET := staging_dir/$(TARGET_DIR_NAME)
+STAGING_SUBDIR_TOOLCHAIN := staging_dir/toolchain-$(ARCH)$(ARCH_SUFFIX)_gcc-$(GCCV)_$(LIBC)$(if $(CONFIG_arm),_eabi)
+
+BUNDLER_PATH := $(subst $(space),:,$(filter-out $(TOPDIR)/%,$(subst :,$(space),$(PATH))))
+BUNDLER_COMMAND := PATH=$(BUNDLER_PATH) $(XARGS) $(SCRIPT_DIR)/bundle-libraries.sh $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)
+
+EXCLUDE_DIRS:= \
+	*/stamp \
+	*/stampfiles \
+	*/man \
+	*/info \
+	*/root-* \
+	*.install.clean \
+	*.install.flags \
+	*.install \
+	*/share/locale
+
+SDK_DIRS = \
+		$(STAGING_SUBDIR_HOST) \
+		$(STAGING_SUBDIR_TOOLCHAIN)
+
+GIT_URL:=$(shell git config --get remote.origin.url 2>/dev/null)
+GIT_URL:=$(if $(CONFIG_BUILDBOT),$(filter git://% http://% https://%,$(GIT_URL)),$(GIT_URL))
+GIT_COMMIT:=$(shell git rev-parse HEAD 2>/dev/null)
+GIT_BRANCH:=$(filter-out master HEAD,$(shell git rev-parse --abbrev-ref HEAD 2>/dev/null))
+GIT_TAGNAME:=$(shell git show-ref --tags --dereference 2>/dev/null | sed -ne '/^$(GIT_COMMIT) / { s|^.*/||; s|\^.*||; p }')
+
+BASE_FEED:=$(if $(GIT_URL),src-git-full base $(GIT_URL)$(if $(GIT_BRANCH),;$(GIT_BRANCH),$(if $(GIT_TAGNAME),;$(GIT_TAGNAME))))
+BASE_FEED:=$(if $(BASE_FEED),$(BASE_FEED),$(shell cd $(TOPDIR); LC_ALL=C git svn info 2>/dev/null | sed -ne 's/^URL: /src-gitsvn base /p'))
+BASE_FEED:=$(if $(BASE_FEED),$(BASE_FEED),$(shell cd $(TOPDIR); LC_ALL=C svn info 2>/dev/null | sed -ne 's/^URL: /src-svn base /p'))
+BASE_FEED:=$(if $(BASE_FEED),$(BASE_FEED),src-git-full base $(PROJECT_GIT)/openwrt/openwrt.git$(if $(GIT_BRANCH),;$(GIT_BRANCH),$(if $(GIT_TAGNAME),;$(GIT_TAGNAME))))
+
+KDIR_BASE = $(patsubst $(TOPDIR)/%,%,$(LINUX_DIR))
+KDIR_ARCHES = $(LINUX_KARCH)
+
+# arch/arm64/ includes reference files in arch/arm/, so we'll need both
+ifeq ($(LINUX_KARCH),arm64)
+  KDIR_ARCHES += arm
+endif
+
+KERNEL_FILES_ARCH = \
+	Makefile* \
+	module.lds \
+	Kbuild.platforms \
+	*/Platform \
+	include \
+	*/include \
+	scripts \
+	kernel/asm-offsets.s \
+	kernel/module.lds
+
+ifeq ($(LINUX_KARCH),powerpc)
+  KERNEL_FILES_ARCH += lib/crtsavres.o
+endif
+
+KERNEL_FILES_BASE := \
+	.config \
+	Makefile \
+	scripts \
+	tools/objtool \
+	include \
+	Module.symvers \
+	modules.builtin \
+	$(foreach arch,$(KDIR_ARCHES),$(addprefix arch/$(arch)/,$(KERNEL_FILES_ARCH)))
+
+KERNEL_FILES := $(patsubst $(TOPDIR)/%,%,$(wildcard $(addprefix $(LINUX_DIR)/,$(KERNEL_FILES_BASE))))
+
+# The kernel source hosts various userspace utilities sources.
+# These are packaged separately from the kernel and kernel modules.
+# The source has to be included here to be buildable by the SDK.
+#
+USERSPACE_UTILS_FILES := \
+	tools/build \
+	tools/leds \
+	tools/power/cpupower \
+	tools/scripts \
+	tools/spi \
+	tools/thermal/tmon \
+	tools/usb/usbip
+
+USERSPACE_FILES := $(patsubst $(TOPDIR)/%,%,$(wildcard $(addprefix $(LINUX_DIR)/,$(USERSPACE_UTILS_FILES))))
+
+all: compile
+
+$(BIN_DIR)/$(SDK_NAME).tar.zst: clean
+	mkdir -p \
+		$(SDK_BUILD_DIR)/dl \
+		$(SDK_BUILD_DIR)/package \
+		$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_TARGET)/include \
+		$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_TARGET)/usr/include
+
+	$(CP) -L $(INCLUDE_DIR) $(SCRIPT_DIR) $(SDK_BUILD_DIR)/
+	$(TAR) -cf - -C $(TOPDIR) \
+		`cd $(TOPDIR); find $(KDIR_BASE)/ -name \*.ko` \
+		`cd $(TOPDIR); find $(KDIR_BASE)/firmware/ -newer $(KDIR_BASE)/firmware/Makefile \
+			-type f -name '*.bin' -or -name '*.cis' -or -name '*.csp' -or -name '*.dsp' -or -name '*.fw'` \
+		$(foreach exclude,$(EXCLUDE_DIRS),--exclude="$(exclude)") \
+		$(SDK_DIRS) $(KERNEL_FILES) | \
+		$(TAR) -xf - -C $(SDK_BUILD_DIR)
+
+	$(TAR) -cf - -C $(TOPDIR) $(USERSPACE_FILES) | \
+		$(TAR) -xf - -C $(SDK_BUILD_DIR)
+
+	(cd $(SDK_BUILD_DIR); find $(STAGING_SUBDIR_HOST)/bin $(STAGING_SUBDIR_HOST)/usr/bin \
+		$(STAGING_SUBDIR_HOST)/llvm-bpf/bin $(STAGING_SUBDIR_HOST)/llvm-bpf/libexec \
+		$(STAGING_SUBDIR_TOOLCHAIN)/bin $(STAGING_SUBDIR_TOOLCHAIN)/*/bin $(STAGING_SUBDIR_TOOLCHAIN)/libexec \
+		$(KDIR_BASE) \
+		-type f | $(BUNDLER_COMMAND))
+
+	@-( \
+		find \
+			$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/bin \
+			$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/usr/bin \
+			$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/llvm-bpf/bin \
+			$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/llvm-bpf/libexec \
+			$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_TOOLCHAIN)/bin \
+			$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_TOOLCHAIN)/*/bin \
+			$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_TOOLCHAIN)/libexec \
+			-type f; \
+		find \
+			$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/lib \
+			$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/llvm-bpf/lib \
+			$(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/usr/lib \
+			-type f -name \*.so\*; \
+	) | xargs strip 2>/dev/null >/dev/null
+
+	mkdir -p $(SDK_BUILD_DIR)/target/linux
+	$(CP) $(GENERIC_PLATFORM_DIR) $(PLATFORM_DIR) $(SDK_BUILD_DIR)/target/linux/
+	rm -rf \
+		$(SDK_BUILD_DIR)/target/linux/*/files* \
+		$(SDK_BUILD_DIR)/target/linux/*/patches*
+	./convert-config.pl $(TOPDIR)/.config > $(SDK_BUILD_DIR)/Config-build.in
+	$(CP) -L \
+		$(TOPDIR)/LICENSES \
+		$(TOPDIR)/COPYING \
+		$(TOPDIR)/rules.mk \
+		./files/Config.in \
+		./files/Makefile \
+		./files/include/prepare.mk \
+		./files/README.md \
+		$(SDK_BUILD_DIR)/
+	mkdir -p $(SDK_BUILD_DIR)/package/kernel
+	$(CP) \
+		$(TOPDIR)/package/Makefile \
+		$(TOPDIR)/package/libs/toolchain \
+		$(SDK_BUILD_DIR)/package/
+	$(CP) \
+		$(TOPDIR)/package/kernel/linux \
+		$(SDK_BUILD_DIR)/package/kernel/
+
+	-rm -rf $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/.prereq-build
+	-rm -rf $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/doc
+	-rm -rf $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/share/doc
+
+	-rm -f $(SDK_BUILD_DIR)/feeds.conf.default
+	$(if $(BASE_FEED),echo "$(BASE_FEED)" > $(SDK_BUILD_DIR)/feeds.conf.default)
+	if [ -f $(TOPDIR)/feeds.conf ]; then \
+		cat $(TOPDIR)/feeds.conf >> $(SDK_BUILD_DIR)/feeds.conf.default; \
+	else \
+		cat $(TOPDIR)/feeds.conf.default >> $(SDK_BUILD_DIR)/feeds.conf.default; \
+	fi
+	$(SED) 's,^# REVISION:=.*,REVISION:=$(REVISION),g' $(SDK_BUILD_DIR)/include/version.mk
+	$(SED) 's,^# SOURCE_DATE_EPOCH:=.*,SOURCE_DATE_EPOCH:=$(SOURCE_DATE_EPOCH),g' $(SDK_BUILD_DIR)/include/version.mk
+	$(SED) '/LINUX_VERMAGIC:=/ { s,unknown,$(LINUX_VERMAGIC),g }' $(SDK_BUILD_DIR)/include/kernel.mk
+	find $(SDK_BUILD_DIR) -name .git | $(XARGS) rm -rf
+	find $(SDK_BUILD_DIR) -name .svn | $(XARGS) rm -rf
+	find $(SDK_BUILD_DIR) -name CVS | $(XARGS) rm -rf
+	-make -C $(SDK_BUILD_DIR)/scripts/config clean
+
+	(cd $(BUILD_DIR); \
+		tar -I '$(STAGING_DIR_HOST)/bin/zstd -T0 --ultra -20' -cf $@ $(SDK_NAME) \
+		--mtime="$(shell date --date=@$(SOURCE_DATE_EPOCH))"; \
+	)
+
+download:
+prepare:
+compile: $(BIN_DIR)/$(SDK_NAME).tar.zst
+install: compile
+
+clean:
+	rm -rf $(SDK_BUILD_DIR) $(BIN_DIR)/$(SDK_NAME).tar.zst
diff --git a/target/sdk/convert-config.pl b/target/sdk/convert-config.pl
new file mode 100755
index 0000000..08189df
--- /dev/null
+++ b/target/sdk/convert-config.pl
@@ -0,0 +1,65 @@
+#!/usr/bin/env perl
+use strict;
+
+while (<>) {
+	my $match;
+	my $var;
+	my $val;
+	my $type;
+	chomp;
+	next if /^CONFIG_SIGNED_PACKAGES/;
+
+	if (/^CONFIG_((BINARY)|(DOWNLOAD))_FOLDER=(.*)$/) {
+		# We don't want to preserve the build setting of
+		# BINARY_FOLDER and DOWNLOAD_FOLDER.
+		$var = "$1_FOLDER";
+		$val = '""';
+		$type = "string";
+	} elsif (/^CONFIG_([^=]+)=(.*)$/) {
+		$var = $1;
+		$val = $2;
+
+		next if $var eq 'ALL';
+
+		if ($val eq 'y') {
+			$type = "bool";
+		} elsif ($val eq 'm') {
+			$type = "tristate";
+		} elsif ($val =~ /^".*"$/) {
+			$type = "string";
+		} elsif ($val =~ /^\d+$/) {
+			$type = "int";
+		} else {
+			warn "WARNING: no type found for symbol CONFIG_$var=$val\n";
+			next;
+		}
+	} elsif (/^# CONFIG_BUSYBOX_(.*) is not set/) {
+		$var = "BUSYBOX_$1";
+		$val = 'n';
+		$type = "bool";
+	} else {
+		# We don't want to preserve a record of deselecting
+		# packages because we may want build them in the SDK.
+		# non-package configs however may be important to preserve
+		# the same compilation settings for packages that get
+		# recompiled in the SDK.
+		# Also we want avoid preserving image generation settings
+		# because we set those while in ImageBuilder
+		next if /^(# )?CONFIG_PACKAGE/;
+		next if /^(# )?CONFIG_TARGET/;
+		if (/^# CONFIG_(.*) is not set/) {
+			$var = $1;
+			$val = 'n';
+			$type = "bool";
+                }
+	}
+
+	if (($var ne '') && ($type ne '') && ($val ne '')) {
+		print <<EOF;
+config $var
+	$type
+	default $val
+
+EOF
+	}
+}
diff --git a/target/sdk/files/Config.in b/target/sdk/files/Config.in
new file mode 100644
index 0000000..0cf68fa
--- /dev/null
+++ b/target/sdk/files/Config.in
@@ -0,0 +1,154 @@
+mainmenu "OpenWrt Configuration"
+
+menu "Global build settings"
+
+	config ALL_NONSHARED
+		bool "Select all target specific packages by default"
+		default ALL
+
+	config ALL_KMODS
+		bool "Select all kernel module packages by default"
+		default ALL
+
+	config ALL
+		bool "Select all userspace packages by default"
+		default y
+
+	config SIGNED_PACKAGES
+		bool "Cryptographically sign package lists"
+		default y
+
+	comment "General build options"
+
+	config BUILD_PATENTED
+		default n
+		bool "Compile with support for patented functionality"
+		help
+		  When this option is disabled, software which provides patented functionality
+		  will not be built.  In case software provides optional support for patented
+		  functionality, this optional support will get disabled for this package.
+
+	config BUILD_NLS
+		default n
+		bool "Compile with full language support"
+		help
+		  When this option is enabled, packages are built with the full versions of
+		  iconv and GNU gettext instead of the default OpenWrt stubs.
+
+	comment "Package build options"
+
+	config DEBUG
+		bool
+		prompt "Compile packages with debugging info"
+		help
+		  Adds -g3 to the CFLAGS.
+
+	comment "Stripping options"
+
+	choice
+		prompt "Binary stripping method"
+		default USE_STRIP   if USE_GLIBC
+		default USE_SSTRIP
+		help
+		  Select the binary stripping method you wish to use.
+
+		config NO_STRIP
+			bool "none"
+			help
+			  This will install unstripped binaries (useful for native
+			  compiling/debugging).
+
+		config USE_STRIP
+			bool "strip"
+			help
+			  This will install binaries stripped using strip from binutils.
+
+		config USE_SSTRIP
+			bool "sstrip"
+			depends on !USE_GLIBC
+			help
+			  This will install binaries stripped using sstrip.
+	endchoice
+
+	config STRIP_ARGS
+		string
+		prompt "Strip arguments"
+		depends on USE_STRIP
+		default "--strip-unneeded --remove-section=.comment --remove-section=.note" if DEBUG
+		default "--strip-all"
+		help
+		  Specifies arguments passed to the strip command when stripping binaries.
+
+endmenu
+
+menu "Advanced configuration options (for developers)"
+
+	config BROKEN
+		bool "Show broken packages"
+
+	config DOWNLOAD_FOLDER
+		string "Download folder"
+		default ""
+		help
+		  Store downloaded source bundles in this directory.
+		  If not set then defaults to './dl', which is removed by operations such as
+		  'git clean -xdf' or 'make distclean'.
+		  This option is useful if you have a low bandwidth Internet connection, and by
+		  setting a path outside the OpenWrt tree downloads will be saved.
+
+	config LOCALMIRROR
+		string "Local mirror for source packages"
+		default ""
+
+	config AUTOREBUILD
+		bool "Automatic rebuild of packages"
+		default y
+		help
+		  Automatically rebuild packages when their files change.
+
+	config AUTOREMOVE
+		bool "Automatic removal of build directories"
+		default y
+		help
+		  Automatically delete build directories after make target completed.
+		  This allows you to symlink build_dir into a scratch location, e.g. a ramdisk,
+		  which does not have enough space to keep a complete build_dir.
+
+	config CCACHE
+		bool "Use ccache"
+		help
+		  Compiler cache; see https://ccache.samba.org/
+
+	config CCACHE_DIR
+		string "Set ccache directory" if CCACHE
+		default ""
+		help
+		  Store ccache in this directory.
+		  If not set, uses './.ccache'
+
+	config BUILD_LOG
+		bool "Enable log files during build process"
+		help
+		  If enabled, log files will be written to the ./log directory.
+
+	config SRC_TREE_OVERRIDE
+		bool "Enable package source tree override"
+		help
+		  If enabled, you can force a package to use a git tree as source
+		  code instead of the normal tarball. Create a symlink 'git-src'
+		  in the package directory, pointing to the .git tree that you want
+		  to pull the source code from.
+
+endmenu
+
+config IN_SDK
+	default y
+	bool
+
+config MODULES
+	bool
+	default y
+	modules
+
+source "Config-build.in"
+source "tmp/.config-package.in"
diff --git a/target/sdk/files/Makefile b/target/sdk/files/Makefile
new file mode 100644
index 0000000..89c6a10
--- /dev/null
+++ b/target/sdk/files/Makefile
@@ -0,0 +1,62 @@
+# Makefile for OpenWrt
+#
+# Copyright (C) 2007-2015 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+TOPDIR:=${CURDIR}
+LC_ALL:=C
+LANG:=C
+SDK:=1
+export TOPDIR LC_ALL LANG SDK
+
+world:
+
+DISTRO_PKG_CONFIG:=$(shell $(TOPDIR)/scripts/command_all.sh pkg-config | grep '/usr' -m 1)
+
+export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH))
+export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH)
+
+ifneq ($(OPENWRT_BUILD),1)
+  override OPENWRT_BUILD=1
+  export OPENWRT_BUILD
+
+  empty:=
+  space:= $(empty) $(empty)
+  _SINGLE=export MAKEFLAGS=$(space);
+
+  include $(TOPDIR)/include/debug.mk
+  include $(TOPDIR)/include/depends.mk
+  include $(TOPDIR)/include/toplevel.mk
+else
+  include rules.mk
+  include $(INCLUDE_DIR)/depends.mk
+  include $(INCLUDE_DIR)/subdir.mk
+  include package/Makefile
+
+$(package/stamp-compile): $(BUILD_DIR)/.prepared
+$(BUILD_DIR)/.prepared: Makefile
+	@mkdir -p $$(dirname $@)
+	@touch $@
+
+clean: FORCE
+	git clean -f -d $(STAGING_DIR); true
+	git clean -f -d $(BUILD_DIR); true
+	git clean -f -d $(BIN_DIR); true
+
+dirclean: clean
+	git reset --hard HEAD
+	git clean -f -d
+	rm -rf feeds/
+
+# check prerequisites before starting to build
+prereq: $(package/stamp-prereq) ;
+
+world: prepare $(package/stamp-compile) FORCE
+	@$(MAKE) package/index
+
+.PHONY: clean dirclean prereq prepare world
+
+endif
diff --git a/target/sdk/files/README.md b/target/sdk/files/README.md
new file mode 100644
index 0000000..6699dff
--- /dev/null
+++ b/target/sdk/files/README.md
@@ -0,0 +1,11 @@
+This is the OpenWrt SDK. It contains a stripped-down version of
+the buildroot. You can use it to test/develop packages without
+having to compile your own toolchain or any of the libraries
+included with OpenWrt.
+
+To use it, just put your buildroot-compatible package directory
+(including its dependencies) in the subdir 'package/' and run
+'make' from this directory.
+
+To make dependency handling easier, you can use ./scripts/feeds
+to install any core package that you need
diff --git a/target/sdk/files/include/prepare.mk b/target/sdk/files/include/prepare.mk
new file mode 100644
index 0000000..76bad05
--- /dev/null
+++ b/target/sdk/files/include/prepare.mk
@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2015 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+prepare: .git/config
+
+.git/config:
+	@( \
+		printf "Initializing SDK ... "; \
+		git init -q .; \
+		find . -mindepth 1 -maxdepth 1 -not -name feeds | xargs git add; \
+		git commit -q -m "Initial state"; \
+		echo "ok."; \
+	)