This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 9ce4de6 support building external code into the OS, similar to how
"external" apps work
9ce4de6 is described below
commit 9ce4de634d7a74ae72dbe9b7037578c08bef8b4e
Author: Matias N <[email protected]>
AuthorDate: Mon Sep 14 16:51:31 2020 -0300
support building external code into the OS, similar to how "external" apps
work
This works by having the build system look for nuttx/external/Kconfig
to determine whether this directory is present or not. nuttx/external
is gitignored in order to be added by the final user but not to be
commited into the repo. Tipically this will by a symbolic link, just like
apps/external.
Inside external/ a Makefile should be placed with the same structure
than any nuttx/ subdirectory (eg: nuttx/drivers/). The
nuttx/external/Kconfig will be sourced and any options defined there will
appear at the bottom of menuconfig (unless options are conditioned on
menus, in which case they will appear accordingly).
The purpose is to allow arch/board independent code, which for any
reason is not to be upstreamed (propietary, not relevant for mainline,
testing, etc), to be built into the OS during OS building stage. This
way the user does not need to fork the NuttX repo to do so. This feature
complements well with external apps and custom board support.
---
.external-dummy/Kconfig | 1 +
.external-dummy/README.md | 2 ++
.gitignore | 1 +
Kconfig | 12 ++++++++++++
tools/Directories.mk | 5 +++++
tools/FlatLibs.mk | 6 ++++++
tools/KernelLibs.mk | 6 ++++++
tools/LibTargets.mk | 6 ++++++
tools/Makefile.unix | 23 +++++++++++++++--------
tools/Makefile.win | 19 +++++++++++++------
tools/ProtectedLibs.mk | 6 ++++++
11 files changed, 73 insertions(+), 14 deletions(-)
diff --git a/.external-dummy/Kconfig b/.external-dummy/Kconfig
new file mode 100644
index 0000000..8e28fe6
--- /dev/null
+++ b/.external-dummy/Kconfig
@@ -0,0 +1 @@
+# This is supposed to be empty
diff --git a/.external-dummy/README.md b/.external-dummy/README.md
new file mode 100644
index 0000000..150147a
--- /dev/null
+++ b/.external-dummy/README.md
@@ -0,0 +1,2 @@
+This directory exists to hold an empty Kconfig which is used
+when no nuttx/external is present.
diff --git a/.gitignore b/.gitignore
index cdb922c..44615e6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,3 +46,4 @@
core
Make*.dep
uImage
+/external
diff --git a/Kconfig b/Kconfig
index 3a4bce3..331e3bd 100644
--- a/Kconfig
+++ b/Kconfig
@@ -1826,3 +1826,15 @@ endmenu
menu "Application Configuration"
source "$APPSDIR/Kconfig"
endmenu
+
+# Support optionally including external code
+# into the OS build. EXTERNALDIR will be used
+# to either point to 'nuttx/external' or
+# 'nuttx/.external-dummy', if 'nuttx/external'
+# does not contain a Kconfig file
+
+config EXTERNALDIR
+ string
+ option env="EXTERNALDIR"
+
+source "$EXTERNALDIR/Kconfig"
diff --git a/tools/Directories.mk b/tools/Directories.mk
index f6c0602..a033dff 100644
--- a/tools/Directories.mk
+++ b/tools/Directories.mk
@@ -72,6 +72,11 @@ endif
KERNDEPDIRS += sched drivers boards $(ARCH_SRC)
KERNDEPDIRS += fs binfmt
+
+ifeq ($(EXTERNALDIR),external)
+ KERNDEPDIRS += external
+endif
+
CONTEXTDIRS = boards fs $(APPDIR)
CLEANDIRS += pass1
diff --git a/tools/FlatLibs.mk b/tools/FlatLibs.mk
index 657481f..c7669a6 100644
--- a/tools/FlatLibs.mk
+++ b/tools/FlatLibs.mk
@@ -48,6 +48,12 @@ USERLIBS =
NUTTXLIBS += staging$(DELIM)libdrivers$(LIBEXT)
+# External code support
+
+ifeq ($(EXTERNALDIR),external)
+ NUTTXLIBS += staging$(DELIM)libexternal$(LIBEXT)
+endif
+
# Add libraries for board support
NUTTXLIBS += staging$(DELIM)libboards$(LIBEXT)
diff --git a/tools/KernelLibs.mk b/tools/KernelLibs.mk
index e50da99..8dbb715 100644
--- a/tools/KernelLibs.mk
+++ b/tools/KernelLibs.mk
@@ -47,6 +47,12 @@ USERLIBS =
NUTTXLIBS += staging$(DELIM)libdrivers$(LIBEXT)
+# External code support
+
+ifeq ($(EXTERNALDIR),external)
+ NUTTXLIBS += staging$(DELIM)libexternal$(LIBEXT)
+endif
+
# Add libraries for board support
NUTTXLIBS += staging$(DELIM)libboards$(LIBEXT)
diff --git a/tools/LibTargets.mk b/tools/LibTargets.mk
index b5c4e98..e04a6a6 100644
--- a/tools/LibTargets.mk
+++ b/tools/LibTargets.mk
@@ -106,6 +106,12 @@ drivers$(DELIM)libdrivers$(LIBEXT): pass2dep
staging$(DELIM)libdrivers$(LIBEXT): drivers$(DELIM)libdrivers$(LIBEXT)
$(Q) $(call INSTALL_LIB,$<,$@)
+external$(DELIM)libexternal$(LIBEXT): pass2dep
+ $(Q) $(MAKE) -C external libexternal$(LIBEXT) EXTRAFLAGS="$(KDEFINE)
$(EXTRAFLAGS)"
+
+staging$(DELIM)libexternal$(LIBEXT): external$(DELIM)libexternal$(LIBEXT)
+ $(Q) $(call INSTALL_LIB,$<,$@)
+
binfmt$(DELIM)libbinfmt$(LIBEXT): pass2dep
$(Q) $(MAKE) -C binfmt libbinfmt$(LIBEXT) EXTRAFLAGS="$(KDEFINE)
$(EXTRAFLAGS)"
diff --git a/tools/Makefile.unix b/tools/Makefile.unix
index 52ccd3c..2744485 100644
--- a/tools/Makefile.unix
+++ b/tools/Makefile.unix
@@ -63,6 +63,13 @@ CONFIG_APPS_DIR = ../apps
endif
APPDIR := $(realpath ${shell if [ -r $(CONFIG_APPS_DIR)/Makefile ]; then echo
"$(CONFIG_APPS_DIR)"; fi})
+# External code support
+# If external/ contains a Kconfig, we define the EXTERNALDIR variable to
'external'
+# so that main Kconfig can find it. Otherwise, we redirect it to a dummy
Kconfig
+# This is due to kconfig inability to do conditional inclusion.
+
+EXTERNALDIR := $(shell if [ -r $(TOPDIR)/external/Kconfig ]; then echo
'external'; else echo '.external-dummy'; fi)
+
# CONTEXTDIRS include directories that have special, one-time pre-build
# requirements. Normally this includes things like auto-generation of
# configuration specific files or creation of configurable symbolic links
@@ -455,28 +462,28 @@ pass2dep: context tools/mkdeps$(HOSTEXEEXT)
tools/cnvwindeps$(HOSTEXEEXT)
# file in the NuttX tools GIT repository for additional information.
config: apps_preconfig
- $(Q) APPSDIR=${CONFIG_APPS_DIR} kconfig-conf Kconfig
+ $(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-conf
Kconfig
oldconfig: apps_preconfig
- $(Q) APPSDIR=${CONFIG_APPS_DIR} kconfig-conf --oldconfig Kconfig
+ $(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-conf
--oldconfig Kconfig
olddefconfig: apps_preconfig
- $(Q) APPSDIR=${CONFIG_APPS_DIR} kconfig-conf --olddefconfig Kconfig
+ $(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-conf
--olddefconfig Kconfig
menuconfig: apps_preconfig
- $(Q) APPSDIR=${CONFIG_APPS_DIR} kconfig-mconf Kconfig
+ $(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR)
kconfig-mconf Kconfig
nconfig: apps_preconfig
- $(Q) APPSDIR=${CONFIG_APPS_DIR} kconfig-nconf Kconfig
+ $(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR)
kconfig-nconf Kconfig
qconfig: apps_preconfig
- $(Q) APPSDIR=${CONFIG_APPS_DIR} kconfig-qconf Kconfig
+ $(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR)
kconfig-qconf Kconfig
gconfig: apps_preconfig
- $(Q) APPSDIR=${CONFIG_APPS_DIR} kconfig-gconf Kconfig
+ $(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR)
kconfig-gconf Kconfig
savedefconfig: apps_preconfig
- $(Q) APPSDIR=${CONFIG_APPS_DIR} kconfig-conf --savedefconfig
defconfig.tmp Kconfig
+ $(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-conf
--savedefconfig defconfig.tmp Kconfig
$(Q) sed -i -e "/CONFIG_APPS_DIR=/d" defconfig.tmp
$(Q) grep "CONFIG_ARCH=" .config >> defconfig.tmp
$(Q) grep "^CONFIG_ARCH_CHIP_" .config >> defconfig.tmp; true
diff --git a/tools/Makefile.win b/tools/Makefile.win
index e6d793e..bde2f73 100644
--- a/tools/Makefile.win
+++ b/tools/Makefile.win
@@ -48,6 +48,13 @@ CONFIG_APPS_DIR = ..\apps
endif
APPDIR := $(realpath ${shell if exist "$(CONFIG_APPS_DIR)\Makefile" echo
$(CONFIG_APPS_DIR)})
+# External code support
+# If external/ contains a Kconfig, we define the EXTERNALDIR variable to
'external'
+# so that main Kconfig can find it. Otherwise, we redirect it to a dummy
Kconfig
+# This is due to kconfig inability to do conditional inclusion.
+
+EXTERNALDIR := $(shell if [ -r $(TOPDIR)\external\Kconfig ]; then echo
'external'; else echo '.external-dummy'; fi)
+
# CONTEXTDIRS include directories that have special, one-time pre-build
# requirements. Normally this includes things like auto-generation of
# configuration specific files or creation of configurable symbolic links
@@ -411,22 +418,22 @@ pass2dep: context tools\mkdeps$(HOSTEXEEXT)
# misc\tools\README.txt for additional information.
config: apps_preconfig
- $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& kconfig-conf
Kconfig
+ $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set
EXTERNALDIR=$(EXTERNALDIR)& kconfig-conf Kconfig
oldconfig: apps_preconfig
- $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& kconfig-conf
--oldconfig Kconfig
+ $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set
EXTERNALDIR=$(EXTERNALDIR)& kconfig-conf --oldconfig Kconfig
olddefconfig: apps_preconfig
- $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& kconfig-conf
--olddefconfig Kconfig
+ $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set
EXTERNALDIR=$(EXTERNALDIR)& kconfig-conf --olddefconfig Kconfig
menuconfig: configenv apps_preconfig
- $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& kconfig-mconf
Kconfig
+ $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set
EXTERNALDIR=$(EXTERNALDIR)& kconfig-mconf Kconfig
nconfig: apps_preconfig
- $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& kconfig-nconf
Kconfig
+ $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set
EXTERNALDIR=$(EXTERNALDIR)& kconfig-nconf Kconfig
savedefconfig: apps_preconfig
- $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& kconfig-conf
--savedefconfig defconfig.tmp Kconfig
+ $(Q) set APPSDIR=$(patsubst "%",%,${CONFIG_APPS_DIR})& set
EXTERNALDIR=$(EXTERNALDIR)& kconfig-conf --savedefconfig defconfig.tmp Kconfig
$(Q) sed -i -e "/CONFIG_APPS_DIR=/d" defconfig.tmp
$(Q) grep "CONFIG_ARCH=" .config >> defconfig.tmp
-$(Q) grep "^CONFIG_ARCH_CHIP_" .config >> defconfig.tmp
diff --git a/tools/ProtectedLibs.mk b/tools/ProtectedLibs.mk
index 306b53e..a978042 100644
--- a/tools/ProtectedLibs.mk
+++ b/tools/ProtectedLibs.mk
@@ -48,6 +48,12 @@ USERLIBS =
NUTTXLIBS += staging$(DELIM)libdrivers$(LIBEXT)
+# External code support
+
+ifeq ($(EXTERNALDIR),external)
+ NUTTXLIBS += staging$(DELIM)libexternal$(LIBEXT)
+endif
+
# Add libraries for board support
NUTTXLIBS += staging$(DELIM)libboards$(LIBEXT)