[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH v2 18/23] build: Pre-process Config.uk within kconfig



The kconfig external library were processed in the Makefile. With
this patch we use the kconfig preprocess feature to generate the
necessary Config.uk files

Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>
---
 Config.uk                             |  23 ++----
 Makefile                              |  88 +++++++++-------------
 lib/Config.uk                         |   8 --
 plat/Config.uk                        |   4 -
 support/scripts/uk_build_configure.sh | 102 ++++++++++++++++++++++++++
 5 files changed, 142 insertions(+), 83 deletions(-)
 create mode 100755 support/scripts/uk_build_configure.sh

diff --git a/Config.uk b/Config.uk
index 21ae657f..01a7ac85 100644
--- a/Config.uk
+++ b/Config.uk
@@ -3,16 +3,6 @@
 # see https://www.kernel.org/doc/Documentation/kbuild/Config.in-language.txt.
 #
 mainmenu "Unikraft/$(UK_FULLVERSION) Configuration"
-config KCONFIG_APP_IN
-       string
-       default "$(KCONFIG_APP_IN)"
-config KCONFIG_ELIB_IN
-       string
-       default "$(KCONFIG_ELIB_IN)"
-config KCONFIG_EPLAT_IN
-       string
-       default "$(KCONFIG_EPLAT_IN)"
-
 config UK_FULLVERSION
        string
        default "$(UK_FULLVERSION)"
@@ -22,6 +12,9 @@ config UK_CODENAME
 config UK_ARCH
        string
        default "$(UK_ARCH)"
+config NO_APP
+       def_bool $(shell,test $(UK_BASE) = $(UK_APP) && echo y || echo n)
+
 config UK_BASE
        string
        default "$(UK_BASE)"
@@ -37,13 +30,11 @@ menu "Architecture Selection"
 endmenu
 
 menu "Platform Configuration"
-       source "plat/Config.uk"
-       source "$(KCONFIG_EPLAT_IN)"
+       source "$(shell,$(UK_BASE)/support/scripts/uk_build_configure.sh -p 
'$(KCONFIG_PLAT_DIR)' -o '$(KCONFIG_PLAT_IN)')"
 endmenu
 
 menu "Library Configuration"
-       source "lib/Config.uk"
-       source "$(KCONFIG_ELIB_IN)"
+       source "$(shell,$(UK_BASE)/support/scripts/uk_build_configure.sh -e 
'$(KCONFIG_LIB_DIR)' -o '$(KCONFIG_LIB_IN)')"
 endmenu
 
 menu "Build Options"
@@ -182,9 +173,9 @@ config CROSS_COMPILE
 #        system.
 endmenu
 
-if UK_APP != UK_BASE
+if !NO_APP
        menu "Application Options"
-               source "$(KCONFIG_APP_IN)"
+               source 
"$(shell,$(UK_BASE)/support/scripts/uk_build_configure.sh -a 
'$(KCONFIG_APP_DIR)')"
        endmenu
 endif
 
diff --git a/Makefile b/Makefile
index ba47832c..00d01c2b 100644
--- a/Makefile
+++ b/Makefile
@@ -125,6 +125,8 @@ endif
 ELIB_DIR := $(realpath $(patsubst %/,%,$(patsubst %.,%,$(ELIB_DIR))))
 
 # KConfig settings
+
+CONFIG_UK_PLAT        := $(CONFIG_UK_BASE)/plat/
 CONFIG_DIR            := $(CONFIG_UK_APP)
 CONFIG_CONFIG_IN      := $(CONFIG_UK_BASE)/Config.uk
 CONFIG                := $(CONFIG_UK_BASE)/support/kconfig.new
@@ -137,9 +139,12 @@ UK_FIXDEP             := $(KCONFIG_DIR)/fixdep
 KCONFIG_AUTOCONFIG    := $(KCONFIG_DIR)/auto.conf
 KCONFIG_TRISTATE      := $(KCONFIG_DIR)/tristate.config
 KCONFIG_AUTOHEADER    := $(UK_GENERATED_INCLUDES)/uk/_config.h
-KCONFIG_APP_IN        := $(KCONFIG_DIR)/app.uk
-KCONFIG_EPLAT_IN      := $(KCONFIG_DIR)/eplat.uk
-KCONFIG_ELIB_IN       := $(KCONFIG_DIR)/elib.uk
+KCONFIG_APP_DIR       := $(CONFIG_UK_APP)
+KCONFIG_LIB_IN        := $(KCONFIG_DIR)/libs.uk
+KCONFIG_DEF_PLATS     := $(addprefix $(CONFIG_UK_PLAT),linuxu kvm xen)
+KCONFIG_LIB_DIR       := $(CONFIG_UK_BASE)/lib $(ELIB_DIR)
+KCONFIG_PLAT_DIR      := $(KCONFIG_DEF_PLATS) $(EPLAT_DIR) $(CONFIG_UK_PLAT)
+KCONFIG_PLAT_IN       := $(KCONFIG_DIR)/plat.uk
 
 # Makefile support scripts
 SCRIPTS_DIR := $(CONFIG_UK_BASE)/support/scripts
@@ -638,36 +643,6 @@ endif
 HOSTCFLAGS = $(CFLAGS_FOR_BUILD)
 export HOSTCFLAGS
 
-# auto-generated KConfig files for including external app
-$(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) $(KCONFIG_EPLAT_IN): %: %.new
-       @cmp -s $^ $@; if [ $$? -ne 0 ]; then cp $^ $@; fi
-
-$(KCONFIG_APP_IN).new:
-       @echo '# external application' > $@
-ifneq ($(CONFIG_UK_BASE),$(CONFIG_UK_APP))
-       @echo 'source "$(APP_DIR)/Config.uk"' >> $@
-else
-       @echo 'comment "No external application specified"' >> $@
-endif
-
-# auto-generated KConfig files for including external libraries
-$(KCONFIG_ELIB_IN).new:
-       @echo '# external libraries' > $@
-       @$(foreach E,$(ELIB_DIR), \
-               echo 'source "$(E)/Config.uk"' >> $@; \
-       )
-
-# auto-generated KConfig file for including
-# external platform libraries to the menu
-$(KCONFIG_EPLAT_IN).new:
-       @echo '# external platform libraries' > $@
-       @$(foreach E,$(EPLAT_DIR), \
-               echo 'source "$(E)/Config.uk"' >> $@; \
-       )
-
-# enforce execution
-.PHONY: $(KCONFIG_APP_IN).new $(KCONFIG_ELIB_IN).new $(KCONFIG_EPLAT_IN).new
-
 KCONFIG_TOOLS = conf mconf gconf nconf qconf fixdep
 KCONFIG_TOOLS := $(addprefix $(KCONFIG_DIR)/,$(KCONFIG_TOOLS))
 
@@ -694,9 +669,11 @@ COMMON_CONFIG_ENV = \
        UK_FULLVERSION="$(UK_FULLVERSION)" \
        UK_CODENAME="$(UK_CODENAME)" \
        UK_ARCH="$(CONFIG_UK_ARCH)" \
-       KCONFIG_APP_IN="$(KCONFIG_APP_IN)" \
-       KCONFIG_ELIB_IN="$(KCONFIG_ELIB_IN)" \
-       KCONFIG_EPLAT_IN="$(KCONFIG_EPLAT_IN)" \
+       KCONFIG_APP_DIR="$(KCONFIG_APP_DIR)" \
+       KCONFIG_LIB_DIR="$(KCONFIG_LIB_DIR)" \
+       KCONFIG_LIB_IN="$(KCONFIG_LIB_IN)" \
+       KCONFIG_PLAT_DIR="$(KCONFIG_PLAT_DIR)" \
+       KCONFIG_PLAT_IN="$(KCONFIG_PLAT_IN)" \
        UK_NAME="$(CONFIG_UK_NAME)"
 
 PHONY += scriptconfig iscriptconfig kmenuconfig guiconfig dumpvarsconfig
@@ -719,35 +696,36 @@ iscriptconfig: $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN) $(KCONFI
           kconf = kconfiglib.Kconfig('$(UK_CONFIG)'); \
           print('A Kconfig instance \'kconf\' for the architecture $(ARCH) has 
been created.')"
 
-kmenuconfig:$(KCONFIG_DIR)/fixdep $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
-       @$(COMMON_CONFIG_ENV) $(kpython) $(CONFIGLIB)/menuconfig.py 
$(CONFIG_CONFIG_IN)
+kmenuconfig:$(KCONFIG_DIR)/fixdep
+       @$(COMMON_CONFIG_ENV) $(kpython) $(CONFIGLIB)/menuconfig.py \
+               $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-guiconfig: $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) $(KCONFIG_EPLAT_IN)
+guiconfig: $(KCONFIG_DIR)/fixdep
        @$(kpython) $(CONFIGLIB)/guiconfig.py $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-dumpvarsconfig: $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) $(KCONFIG_EPLAT_IN)
+dumpvarsconfig:$(KCONFIG_DIR)/fixdep
        $(Q)$(kpython) $(CONFIGLIB)/examples/dumpvars.py $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-xconfig: $(KCONFIG_DIR)/qconf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+xconfig: $(KCONFIG_DIR)/qconf
        @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-gconfig: $(KCONFIG_DIR)/gconf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+gconfig: $(KCONFIG_DIR)/gconf
        @$(COMMON_CONFIG_ENV) srctree=$(CONFIG_UK_BASE) $< $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-menuconfig: $(KCONFIG_DIR)/mconf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+menuconfig: $(KCONFIG_DIR)/mconf
        @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-nconfig: $(KCONFIG_DIR)/nconf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+nconfig: $(KCONFIG_DIR)/nconf
        @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-config: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+config: $(KCONFIG_DIR)/conf
        @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
@@ -755,43 +733,43 @@ config: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) 
$(KCONFIG_ELIB_IN) $(KCONFIG_EPLAT
 # SKIP_LEGACY=y to disable the legacy options. However, in that case
 # no values are set for the legacy options so a subsequent oldconfig
 # will query them. Therefore, run an additional olddefconfig.
-oldconfig: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+oldconfig: $(KCONFIG_DIR)/conf
        @$(COMMON_CONFIG_ENV) $< --oldconfig $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-randconfig: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+randconfig: $(KCONFIG_DIR)/conf
        @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y $< --randconfig $(CONFIG_CONFIG_IN)
        @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-allyesconfig: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+allyesconfig: $(KCONFIG_DIR)/conf
        @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y $< --allyesconfig 
$(CONFIG_CONFIG_IN)
        @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-allnoconfig: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+allnoconfig: $(KCONFIG_DIR)/conf
        @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y $< --allnoconfig $(CONFIG_CONFIG_IN)
        @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-syncconfig: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+syncconfig: $(KCONFIG_DIR)/conf
        @$(COMMON_CONFIG_ENV) $< --syncconfig $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-olddefconfig: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+olddefconfig: $(KCONFIG_DIR)/conf
        @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
-defconfig: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+defconfig: $(KCONFIG_DIR)/conf
        @$(COMMON_CONFIG_ENV) $< --defconfig$(if $(DEFCONFIG),=$(DEFCONFIG)) 
$(CONFIG_CONFIG_IN)
        @$(SCRIPTS_DIR)/configupdate $(UK_CONFIG) $(UK_CONFIG_OUT)
 
 # Override the UK_DEFCONFIG from COMMON_CONFIG_ENV with the new defconfig
-%_defconfig: $(KCONFIG_DIR)/conf $(A)/configs/%_defconfig $(KCONFIG_APP_IN) 
$(KCONFIG_ELIB_IN) $(KCONFIG_EPLAT_IN)
+%_defconfig: $(KCONFIG_DIR)/conf $(A)/configs/%_defconfig
        @$(COMMON_CONFIG_ENV) UK_DEFCONFIG=$(A)/configs/$@ \
                $< --defconfig=$(A)/configs/$@ $(CONFIG_CONFIG_IN)
 
-savedefconfig: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) $(KCONFIG_ELIB_IN) 
$(KCONFIG_EPLAT_IN)
+savedefconfig: $(KCONFIG_DIR)/conf
        @$(COMMON_CONFIG_ENV) $< \
                --savedefconfig=$(if 
$(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig) \
                $(CONFIG_CONFIG_IN)
@@ -801,7 +779,7 @@ savedefconfig: $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) 
$(KCONFIG_ELIB_IN) $(KCONFI
 .PHONY: defconfig savedefconfig silentoldconfig
 
 # Regenerate $(KCONFIG_AUTOHEADER) whenever $(UK_CONFIG) changed
-$(KCONFIG_AUTOHEADER): $(UK_CONFIG) $(KCONFIG_DIR)/conf $(KCONFIG_APP_IN) 
$(KCONFIG_ELIB_IN) $(KCONFIG_EPLAT_IN)
+$(KCONFIG_AUTOHEADER): $(UK_CONFIG) $(KCONFIG_DIR)/conf
        @$(COMMON_CONFIG_ENV) $(KCONFIG_DIR)/conf --syncconfig 
$(CONFIG_CONFIG_IN)
 
 
diff --git a/lib/Config.uk b/lib/Config.uk
index 23e705d4..44311de3 100644
--- a/lib/Config.uk
+++ b/lib/Config.uk
@@ -20,11 +20,3 @@ config HAVE_SCHED
 config HAVE_NW_STACK
        bool
        default n
-
-
-################################################################################
-#
-# Library definitions
-#
-################################################################################
-source "lib/*/Config.uk"
diff --git a/plat/Config.uk b/plat/Config.uk
index 8a878eb0..0eb5a10b 100644
--- a/plat/Config.uk
+++ b/plat/Config.uk
@@ -1,7 +1,3 @@
-source "plat/xen/Config.uk"
-source "plat/kvm/Config.uk"
-source "plat/linuxu/Config.uk"
-
 menu "Platform Interface Options"
 config UKPLAT_MEMRNAME
        bool "Memory region names"
diff --git a/support/scripts/uk_build_configure.sh 
b/support/scripts/uk_build_configure.sh
new file mode 100755
index 00000000..1df8c5d9
--- /dev/null
+++ b/support/scripts/uk_build_configure.sh
@@ -0,0 +1,102 @@
+#!/bin/bash
+
+OPT_BASENAME=`basename $0`
+OPT_STRING="a:e:ho:p:"
+
+read -r -d '' OPT_HELP  <<- EOH
+       a - The application location
+       e - The location of the external libraries
+       p - The location of external platforms
+       o - The output configuration file
+       h - Print Usage
+EOH
+
+print_usage() {
+       printf "%s [%s]\n" ${OPT_BASENAME} ${OPT_STRING};
+       printf "%s\n" "${OPT_HELP}"
+}
+
+fetch_plats() {
+       local files=;
+       files=`find ${@} -maxdepth 1 -name "Config.uk"`
+       echo ${files}
+}
+
+fetch_libs() {
+       local files=;
+       files=`find ${@} -name "Config.uk"`
+       echo ${files}
+}
+
+fetch_app() {
+       local files=;
+       files=`find ${1} -name "Config.uk"`
+       echo ${files}
+}
+
+config_out_create() {
+
+       [[ -f ${2} ]] || touch ${2};
+
+       for file in ${1}
+       do
+               [[ -z `cat ${2} | grep ${file}` ]] && \
+                       { echo "source \"${file}\"" >> ${2}; }
+       done
+}
+
+if [ $# -eq 0 ];
+then
+       print_usage
+       exit 1;
+fi
+
+[[ -n ${CONFIG_UK_BASE} ]] && UK_BASE=${CONFIG_UK_BASE};
+[[ -n ${UK_BASE} ]] || UK_BASE=$(readlink -f $(dirname $0)/../..)
+
+CONFIG_FILES=;
+
+while getopts ${OPT_STRING} opt
+do
+       case ${opt} in
+       a)
+               APP_DIR="${OPTARG}"
+               [[ -d ${APP_DIR} ]] || \
+                       { echo "Cannot find the application"; exit 1; }
+               if [ ${UK_BASE} != ${APP_DIR} ]
+               then
+                       CONFIG_FILES=$(fetch_app ${APP_DIR})
+                       echo ${CONFIG_FILES};
+               else
+                       CONFIG_FILES=${BUILD_DIR}/app.uk
+                       [[ -f ${BUILD_DIR}/app.uk ]] || \
+                               { touch ${CONFIG_FILES}; }
+                       echo '# external application' >> ${CONFIG_FILES}
+                       echo 'comment "No external application specified"'\
+                                >> ${CONFIG_FILES}
+                       echo ${CONFIG_FILES};
+               fi
+               exit 0;
+       ;;
+       e)
+               CONFIG_FILES=`fetch_libs "${OPTARG}"`
+       ;;
+       p)
+               CONFIG_FILES=`fetch_plats "${OPTARG}"`
+       ;;
+       h)
+               print_usage;
+               exit 0;
+       ;;
+       o)
+               CONFIG_OUT_FILE=${OPTARG}
+       ;;
+       *)
+               print_usage
+               exit 1;
+       ;;
+       esac
+done
+
+config_out_create "${CONFIG_FILES}" ${CONFIG_OUT_FILE}
+echo ${CONFIG_OUT_FILE}
-- 
2.20.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.