diff --git a/Kconfig b/Kconfig index b7a1ac4e6db..3641b60b936 100644 --- a/Kconfig +++ b/Kconfig @@ -244,6 +244,15 @@ config APPS_DIR example, to include makefile fragments (e.g., .config or Make.defs) or to set up include file paths. +config BASE_DEFCONFIG + string "Base Configuration" + default "" + ---help--- + This will be automatically be updated by the configuration + script. This is the base configuration file that was used to create the + current configuration. It is useful for getting the current configuration + on runtime. + config BUILD_LOADABLE bool option modules diff --git a/tools/Unix.mk b/tools/Unix.mk index fbef72124aa..879ec7b865e 100644 --- a/tools/Unix.mk +++ b/tools/Unix.mk @@ -248,6 +248,13 @@ tools/mkconfig$(HOSTEXEEXT): $(Q) $(MAKE) -C tools -f Makefile.host mkconfig$(HOSTEXEEXT) include/nuttx/config.h: $(TOPDIR)/.config tools/mkconfig$(HOSTEXEEXT) + $(Q) grep -v "CONFIG_BASE_DEFCONFIG" "$(TOPDIR)/.config" > "$(TOPDIR)/.config.tmp" + $(Q) if ! cmp -s "$(TOPDIR)/.config.tmp" "$(TOPDIR)/.config.orig" ; then \ + sed -i.bak "/CONFIG_BASE_DEFCONFIG/s/\"$$/-dirty\"/" "$(TOPDIR)/.config"; \ + else \ + sed -i.bak "s/-dirty//g" "$(TOPDIR)/.config"; \ + fi + $(Q) rm -f "$(TOPDIR)/.config.tmp" "$(TOPDIR)/.config.bak" $(Q) tools/mkconfig $(TOPDIR) > $@.tmp $(Q) $(call TESTANDREPLACEFILE, $@.tmp, $@) @@ -685,6 +692,7 @@ gconfig: apps_preconfig savedefconfig: apps_preconfig $(Q) ${KCONFIG_ENV} ${KCONFIG_SAVEDEFCONFIG} $(Q) $(call kconfig_tweak_disable,defconfig.tmp,CONFIG_APPS_DIR) + $(Q) $(call kconfig_tweak_disable,defconfig.tmp,CONFIG_BASE_DEFCONFIG) $(Q) grep "CONFIG_ARCH=" .config >> defconfig.tmp $(Q) grep "^CONFIG_ARCH_CHIP_" .config >> defconfig.tmp; true $(Q) grep "CONFIG_ARCH_CHIP=" .config >> defconfig.tmp; true @@ -763,6 +771,7 @@ endif $(call DELFILE, defconfig) $(call DELFILE, .config) $(call DELFILE, .config.old) + $(call DELFILE, .config.orig) $(call DELFILE, .gdbinit) # Application housekeeping targets. The APPDIR variable refers to the user diff --git a/tools/Win.mk b/tools/Win.mk index 6a400278c5b..55e68b767da 100644 --- a/tools/Win.mk +++ b/tools/Win.mk @@ -235,6 +235,15 @@ tools\mkconfig$(HOSTEXEEXT): $(Q) $(MAKE) -C tools -f Makefile.host mkconfig$(HOSTEXEEXT) include\nuttx\config.h: $(TOPDIR)\.config tools\mkconfig$(HOSTEXEEXT) + $(Q) grep -v "CONFIG_BASE_DEFCONFIG" "$(TOPDIR)\.config" > "$(TOPDIR)\.config.tmp" +# In-place edit can mess up permissions on Windows + $(Q) if ! cmp -s "$(TOPDIR)\.config.tmp" "$(TOPDIR)\.config.orig" ; then \ + sed "/CONFIG_BASE_DEFCONFIG/s/\"$$/-dirty\"/" "$(TOPDIR)\.config" > "$(TOPDIR)\.config-temp"; \ + else \ + sed "s/-dirty//g" "$(TOPDIR)\.config" > "$(TOPDIR)\.config-temp"; \ + fi + $(Q) mv -f "$(TOPDIR)\.config-temp" "$(TOPDIR)\.config" + $(Q) rm -f "$(TOPDIR)\.config.tmp" $(Q) tools\mkconfig$(HOSTEXEEXT) $(TOPDIR) > include\nuttx\config.h # Targets used to create dependencies @@ -606,6 +615,7 @@ nconfig: savedefconfig: apps_preconfig $(Q) ${KCONFIG_ENV} kconfig-conf --savedefconfig defconfig.tmp Kconfig $(Q) kconfig-tweak --file defconfig.tmp -u CONFIG_APPS_DIR + $(Q) kconfig-tweak --file defconfig.tmp -u CONFIG_BASE_DEFCONFIG $(Q) grep "CONFIG_ARCH=" .config >> defconfig.tmp -$(Q) grep "^CONFIG_ARCH_CHIP_" .config >> defconfig.tmp -$(Q) grep "CONFIG_ARCH_CHIP=" .config >> defconfig.tmp @@ -684,6 +694,7 @@ endif $(call DELFILE, defconfig) $(call DELFILE, .config) $(call DELFILE, .config.old) + $(call DELFILE, .config.orig) # Application housekeeping targets. The APPDIR variable refers to the user # application directory. A sample apps\ directory is included with NuttX, diff --git a/tools/configure.c b/tools/configure.c index ccdb096eae6..958fbf04b50 100644 --- a/tools/configure.c +++ b/tools/configure.c @@ -104,6 +104,7 @@ static void disable_feature(const char *destconfig, const char *varname); static void set_host(const char *destconfig); static void configure(void); static void refresh(void); +static void save_original_config(void); /**************************************************************************** * Private Data @@ -1503,6 +1504,7 @@ static void configure(void) { FILE *stream; char *appdir = strdup(g_appdir); + char *boardcfg = strdup(g_boarddir); /* One complexity is if we are using Windows paths, but the * configuration needs POSIX paths (or vice versa). @@ -1555,13 +1557,17 @@ static void configure(void) if (!stream) { fprintf(stderr, - "ERROR: Failed to open %s for append mode mode: %s\n", + "ERROR: Failed to open %s for append mode: %s\n", destconfig, strerror(errno)); exit(EXIT_FAILURE); } fprintf(stream, "\n# Application configuration\n\n"); fprintf(stream, "CONFIG_APPS_DIR=\"%s\"\n", appdir); + + substitute(boardcfg, '\\', '/'); + fprintf(stream, "CONFIG_BASE_DEFCONFIG=\"%s\"\n", boardcfg); + fclose(stream); free(appdir); } @@ -1590,6 +1596,37 @@ static void refresh(void) } } +static void save_original_config(void) +{ + snprintf(g_buffer, BUFFER_SIZE, "%s%c.config", g_topdir, g_delim); + char *source_config = strdup(g_buffer); + snprintf(g_buffer, BUFFER_SIZE, "%s%c.config.orig", g_topdir, g_delim); + char *dest_config = strdup(g_buffer); + + FILE *src_file = fopen(source_config, "r"); + FILE *dest_file = fopen(dest_config, "w"); + + if (src_file == NULL || dest_file == NULL) + { + fprintf(stderr, "ERROR: Failed to open files\n"); + exit(EXIT_FAILURE); + } + + debug("save_original_config: Copying from %s to %s\n", + source_config, dest_config); + + while (fgets(g_buffer, BUFFER_SIZE, src_file) != NULL) + { + if (strstr(g_buffer, "CONFIG_BASE_DEFCONFIG") == NULL) + { + fputs(g_buffer, dest_file); + } + } + + fclose(src_file); + fclose(dest_file); +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -1621,5 +1658,8 @@ int main(int argc, char **argv, char **envp) debug("main: Refresh configuration\n"); refresh(); + + debug("main: Save original configuration\n"); + save_original_config(); return EXIT_SUCCESS; } diff --git a/tools/configure.sh b/tools/configure.sh index 5551eebcd0d..04344a28b18 100755 --- a/tools/configure.sh +++ b/tools/configure.sh @@ -176,6 +176,7 @@ fi src_config=${configpath}/defconfig dest_config="${TOPDIR}/.config" +original_config="${TOPDIR}/.config.orig" backup_config="${TOPDIR}/defconfig" if [ ! -r ${src_config} ]; then @@ -303,7 +304,17 @@ if [ "X${defappdir}" = "Xy" ]; then fi fi +# Update the CONFIG_BASE_DEFCONFIG setting + +posboardconfig=`echo "${boardconfig}" | sed -e 's/\\\\/\\//g'` +echo "CONFIG_BASE_DEFCONFIG=\"$posboardconfig\"" >> "${dest_config}" + # The saved defconfig files are all in compressed format and must be # reconstitued before they can be used. ${TOPDIR}/tools/sethost.sh $host $* + +# Save the original configuration file without CONFIG_BASE_DEFCONFIG +# for later comparison + +grep -v "CONFIG_BASE_DEFCONFIG" "${dest_config}" > "${original_config}"