diff --git a/Kconfig b/Kconfig index 9611cf773e..2cf2424812 100644 --- a/Kconfig +++ b/Kconfig @@ -19,7 +19,19 @@ config PYTHON help The executable name/path that is used to run python. On some systems Python 2.x may need to be invoked as python2. -endmenu + +config MAKE_WARN_UNDEFINED_VARIABLES + bool "'make' warns on undefined variables" + default "y" + help + Adds --warn-undefined-variables to MAKEFLAGS. This causes make to + print a warning any time an undefined variable is referenced. + + This option helps find places where a variable reference is misspelled + or otherwise missing, but it can be unwanted if you have Makefiles which + depend on undefined variables expanding to an empty string. + +endmenu # SDK tool configuration source "$COMPONENT_KCONFIGS_PROJBUILD" diff --git a/components/bootloader/Makefile.projbuild b/components/bootloader/Makefile.projbuild index 7a35dc8ad1..db7f4f0a24 100644 --- a/components/bootloader/Makefile.projbuild +++ b/components/bootloader/Makefile.projbuild @@ -13,6 +13,7 @@ BOOTLOADER_BUILD_DIR=$(abspath $(BUILD_DIR_BASE)/bootloader) BOOTLOADER_BIN=$(BOOTLOADER_BUILD_DIR)/bootloader.bin # signing key path is resolved relative to the project directory +CONFIG_SECURE_BOOT_SIGNING_KEY ?= SECURE_BOOT_SIGNING_KEY=$(abspath $(call dequote,$(CONFIG_SECURE_BOOT_SIGNING_KEY))) export SECURE_BOOT_SIGNING_KEY # used by bootloader_support component @@ -107,7 +108,7 @@ $(BOOTLOADER_DIGEST_BIN): $(BOOTLOADER_BIN) $(SECURE_BOOTLOADER_KEY) @echo "DIGEST $(notdir $@)" $(Q) $(ESPSECUREPY) digest_secure_bootloader -k $(SECURE_BOOTLOADER_KEY) -o $@ $< -else +else # CONFIG_SECURE_BOOT_ENABLED && !CONFIG_SECURE_BOOTLOADER_REFLASHABLE && !CONFIG_SECURE_BOOTLOADER_ONE_TIME_FLASH bootloader: @echo "Invalid bootloader target: bad sdkconfig?" @exit 1 diff --git a/components/esp32/Kconfig b/components/esp32/Kconfig index 86932c3bf8..837a73afad 100644 --- a/components/esp32/Kconfig +++ b/components/esp32/Kconfig @@ -846,7 +846,7 @@ config ESP32_WIFI_NVS_ENABLED endmenu # Wi-Fi -menu Phy +menu PHY config ESP32_PHY_CALIBRATION_AND_DATA_STORAGE bool "Do phy calibration and store calibration data in NVS" diff --git a/components/esp32/component.mk b/components/esp32/component.mk index a8cd8606c7..2ed8980522 100644 --- a/components/esp32/component.mk +++ b/components/esp32/component.mk @@ -3,8 +3,9 @@ # COMPONENT_SRCDIRS := . hwcrypto +LIBS ?= ifndef CONFIG_NO_BLOBS -LIBS := core rtc net80211 pp wpa smartconfig coexist wps wpa2 phy +LIBS += core rtc net80211 pp wpa smartconfig coexist wps wpa2 phy endif #Linker scripts used to link the final application. @@ -18,7 +19,7 @@ ifndef CONFIG_SPIRAM_CACHE_WORKAROUND LINKER_SCRIPTS += esp32.rom.spiram_incompatible_fns.ld endif -ifeq ("$(CONFIG_NEWLIB_NANO_FORMAT)","y") +ifdef CONFIG_NEWLIB_NANO_FORMAT LINKER_SCRIPTS += esp32.rom.nanofmt.ld endif diff --git a/components/esptool_py/Makefile.projbuild b/components/esptool_py/Makefile.projbuild index b35dc11126..dce6b0af28 100644 --- a/components/esptool_py/Makefile.projbuild +++ b/components/esptool_py/Makefile.projbuild @@ -6,6 +6,8 @@ ESPFLASHMODE ?= $(CONFIG_ESPTOOLPY_FLASHMODE) ESPFLASHFREQ ?= $(CONFIG_ESPTOOLPY_FLASHFREQ) ESPFLASHSIZE ?= $(CONFIG_ESPTOOLPY_FLASHSIZE) +CONFIG_ESPTOOLPY_COMPRESSED ?= + PYTHON ?= $(call dequote,$(CONFIG_PYTHON)) # two commands that can be used from other components diff --git a/components/freertos/component.mk b/components/freertos/component.mk index 4496355a0e..7841d8f694 100644 --- a/components/freertos/component.mk +++ b/components/freertos/component.mk @@ -5,7 +5,3 @@ COMPONENT_ADD_LDFLAGS += -Wl,--undefined=uxTopUsedPriority COMPONENT_ADD_INCLUDEDIRS := include COMPONENT_PRIV_INCLUDEDIRS := include/freertos - -#ifdef CONFIG_SYSVIEW_ENABLE -#COMPONENT_ADD_INCLUDEDIRS += app_trace -#endif diff --git a/components/lwip/component.mk b/components/lwip/component.mk index 204e94fa72..f85759bedb 100644 --- a/components/lwip/component.mk +++ b/components/lwip/component.mk @@ -9,7 +9,9 @@ COMPONENT_ADD_INCLUDEDIRS := \ apps/ping ifdef CONFIG_PPP_SUPPORT -LWIP_PPP_DIRS := netif/ppp/polarssl netif/ppp +LWIP_PPP_DIRS := netif/ppp/polarssl netif/ppp +else +LWIP_PPP_DIRS := endif COMPONENT_SRCDIRS := \ diff --git a/components/newlib/component.mk b/components/newlib/component.mk index 0bf6275bf2..05ef6bee8d 100644 --- a/components/newlib/component.mk +++ b/components/newlib/component.mk @@ -1,20 +1,19 @@ - -ifeq ("$(CONFIG_SPIRAM_CACHE_WORKAROUND)","y") +ifdef CONFIG_SPIRAM_CACHE_WORKAROUND LIBC_PATH := $(COMPONENT_PATH)/lib/libc-psram-workaround.a LIBM_PATH := $(COMPONENT_PATH)/lib/libm-psram-workaround.a else -ifeq ("$(CONFIG_NEWLIB_NANO_FORMAT)","y") +ifdef CONFIG_NEWLIB_NANO_FORMAT LIBC_PATH := $(COMPONENT_PATH)/lib/libc_nano.a else LIBC_PATH := $(COMPONENT_PATH)/lib/libc.a -endif +endif # CONFIG_NEWLIB_NANO_FORMAT LIBM_PATH := $(COMPONENT_PATH)/lib/libm.a -endif +endif # CONFIG_SPIRAM_CACHE_WORKAROUND COMPONENT_ADD_LDFLAGS := $(LIBC_PATH) $(LIBM_PATH) -lnewlib diff --git a/docs/api-guides/build-system.rst b/docs/api-guides/build-system.rst index a86698e4cc..34e35de3de 100644 --- a/docs/api-guides/build-system.rst +++ b/docs/api-guides/build-system.rst @@ -351,6 +351,17 @@ Some tips for debugging the esp-idf build system: For more debugging tips and general make information, see the `GNU Make Manual`. +.. _warn-undefined-variables: + +Warning On Undefined Variables +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, the build process will print a warning if an undefined variable is referenced (like ``$(DOES_NOT_EXIST)``). This can be useful to find errors in variable names. + +If you don't want this behaviour, it can be disabled by disabling :ref:`CONFIG_MAKE_WARN_UNDEFINED_VARIABLES`. + +Note that this option doesn't trigger a warning if ``ifdef`` or ``ifndef`` are used in Makefiles. + Overriding Parts of the Project ------------------------------- diff --git a/docs/api-reference/kconfig.rst b/docs/api-reference/kconfig.rst index 21bcf6b380..28c4439aab 100644 --- a/docs/api-reference/kconfig.rst +++ b/docs/api-reference/kconfig.rst @@ -25,4 +25,13 @@ By convention, all option names are upper case with underscores. When Kconfig ge .. include:: /_build/inc/kconfig.inc -.. _Kconfig: https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt \ No newline at end of file +Customisations +============== + +Because IDF builds by default with :ref:`warn-undefined-variables`, when the Kconfig tool generates Makefiles (the ``auto.conf`` file) its behaviour has been customised. In normal Kconfig, a variable which is set to "no" is undefined. In IDF's version of Kconfig, this variable is defined in the Makefile but has an empty value. + +(Note that ``ifdef`` and ``ifndef`` can still be used in Makefiles, because they test if a variable is defined *and has a non-empty value*.) + +When generating header files for C & C++, the behaviour is not customised - so ``#ifdef`` can be used to test if a boolean config item is set or not. + +.. _Kconfig: https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt diff --git a/make/common.mk b/make/common.mk index 82652e63d7..ea39421cb0 100644 --- a/make/common.mk +++ b/make/common.mk @@ -19,6 +19,7 @@ endif # # if V=1, $(summary) does nothing and $(details) will echo extra details # if V is unset or not 1, $(summary) echoes a summary and $(details) does nothing +VERBOSE ?= V ?= $(VERBOSE) ifeq ("$(V)","1") summary := @true @@ -26,9 +27,13 @@ details := @echo else summary := @echo details := @true +endif # disable echoing of commands, directory names MAKEFLAGS += --silent + +ifdef CONFIG_MAKE_WARN_UNDEFINED_VARIABLES +MAKEFLAGS += --warn-undefined-variables endif # General make utilities diff --git a/make/component_wrapper.mk b/make/component_wrapper.mk index f9bdec672f..751668d4b0 100644 --- a/make/component_wrapper.mk +++ b/make/component_wrapper.mk @@ -63,6 +63,13 @@ define compile_only_if_not $(eval $(if $(1), $(call compile_exclude, $(2)), $(call compile_include, $(2)))) endef +COMPONENT_ADD_LINKER_DEPS ?= +COMPONENT_DEPENDS ?= +COMPONENT_EXTRA_CLEAN ?= +COMPONENT_EXTRA_INCLUDES ?= +COMPONENT_OBJEXCLUDE ?= +COMPONENT_OBJINCLUDE ?= +COMPONENT_SUBMODULES ?= ################################################################################ # 2) Include the component.mk for the specific component (COMPONENT_MAKEFILE) to @@ -105,6 +112,7 @@ COMPONENT_EMBED_OBJS ?= $(addsuffix .bin.o,$(notdir $(COMPONENT_EMBED_FILES))) $ # variable with all the include dirs from all the components in random order. This # means we can accidentally grab a header from another component before grabbing our own. # To make sure that does not happen, re-order the includes so ours come first. +COMPONENT_PRIV_INCLUDEDIRS ?= OWN_INCLUDES:=$(abspath $(addprefix $(COMPONENT_PATH)/,$(COMPONENT_PRIV_INCLUDEDIRS) $(COMPONENT_ADD_INCLUDEDIRS))) COMPONENT_INCLUDES := $(OWN_INCLUDES) $(filter-out $(OWN_INCLUDES),$(COMPONENT_INCLUDES)) @@ -139,7 +147,7 @@ endef # component-specific feature, please don't! What you want is a # Makefile.projbuild for your component (see docs/build-system.rst for # more.) -component_project_vars.mk:: +component_project_vars.mk: $(details) "Building component project variables list $(abspath $@)" @echo '# Automatically generated build file. Do not edit.' > $@ @echo 'COMPONENT_INCLUDES += $(call MakeVariablePath,$(addprefix $(COMPONENT_PATH)/,$(COMPONENT_ADD_INCLUDEDIRS)))' >> $@ @@ -178,6 +186,8 @@ clean: rm -f $(CLEAN_FILES) endif +DEBUG_FLAGS ?= -ggdb + # Include all dependency files already generated -include $(COMPONENT_OBJS:.o=.d) @@ -266,10 +276,6 @@ $(foreach binfile,$(COMPONENT_EMBED_FILES), $(eval $(call GenerateEmbedTarget,$( $(foreach txtfile,$(COMPONENT_EMBED_TXTFILES), $(eval $(call GenerateEmbedTarget,$(txtfile),txt))) -# generate targets to create binary embed directories -$(foreach bindir,$(sort $(dir $(COMPONENT_EMBED_FILES))), $(eval $(call GenerateBuildDirTarget,$(bindir)))) - - else # COMPONENT_CONFIG_ONLY is set build: diff --git a/make/project.mk b/make/project.mk index d22a1b1dd0..9846872a28 100644 --- a/make/project.mk +++ b/make/project.mk @@ -56,6 +56,7 @@ $(error esp-idf build system doesn't support running 'clean' targets along with endif endif +OS ?= # make IDF_PATH a "real" absolute path # * works around the case where a shell character is embedded in the environment variable value. @@ -113,6 +114,7 @@ export BUILD_DIR_BASE # or the directory contains subdirectories which are components.) # The project Makefile can override these component dirs, or add extras via EXTRA_COMPONENT_DIRS ifndef COMPONENT_DIRS +EXTRA_COMPONENT_DIRS ?= COMPONENT_DIRS := $(PROJECT_PATH)/components $(EXTRA_COMPONENT_DIRS) $(IDF_PATH)/components $(PROJECT_PATH)/main endif export COMPONENT_DIRS @@ -146,15 +148,18 @@ export COMPONENTS COMPONENT_PATHS := $(foreach comp,$(COMPONENTS),$(firstword $(foreach cd,$(COMPONENT_DIRS),$(wildcard $(dir $(cd))$(comp) $(cd)/$(comp))))) # If TESTS_ALL set to 1, set TEST_COMPONENTS_LIST to all components +ifdef TESTS_ALL ifeq ($(TESTS_ALL),1) TEST_COMPONENTS_LIST := $(COMPONENTS) -else +else # TESTS_ALL not empty and not 1 # otherwise, use TEST_COMPONENTS TEST_COMPONENTS_LIST := $(TEST_COMPONENTS) endif +else # TESTS_ALL unset +TEST_COMPONENTS_LIST := +endif TEST_COMPONENT_PATHS := $(foreach comp,$(TEST_COMPONENTS_LIST),$(firstword $(foreach dir,$(COMPONENT_DIRS),$(wildcard $(dir)/$(comp)/test)))) -TEST_COMPONENT_NAMES := $(foreach comp,$(TEST_COMPONENT_PATHS),$(lastword $(subst /, ,$(dir $(comp))))_test) - +TEST_COMPONENT_NAMES := $(foreach comp,$(TEST_COMPONENT_PATHS),$(lastword $(subst /, ,$(dir $(comp))))_test) # Initialise project-wide variables which can be added to by # each component. @@ -166,6 +171,7 @@ TEST_COMPONENT_NAMES := $(foreach comp,$(TEST_COMPONENT_PATHS),$(lastword $(sub COMPONENT_INCLUDES := COMPONENT_LDFLAGS := COMPONENT_SUBMODULES := +COMPONENT_LIBRARIES := # COMPONENT_PROJECT_VARS is the list of component_project_vars.mk generated makefiles # for each component. @@ -206,6 +212,7 @@ endif IDF_VER := $(shell cd ${IDF_PATH} && git describe --always --tags --dirty) # Set default LDFLAGS +EXTRA_LDFLAGS ?= LDFLAGS ?= -nostdlib \ -u call_user_start_cpu0 \ $(EXTRA_LDFLAGS) \ @@ -228,6 +235,8 @@ LDFLAGS ?= -nostdlib \ # CPPFLAGS used by C preprocessor # If any flags are defined in application Makefile, add them at the end. +CPPFLAGS ?= +EXTRA_CPPFLAGS ?= CPPFLAGS := -DESP_PLATFORM -D IDF_VER=\"$(IDF_VER)\" -MMD -MP $(CPPFLAGS) $(EXTRA_CPPFLAGS) # Warnings-related flags relevant both for C and C++ @@ -247,13 +256,13 @@ COMMON_FLAGS = \ -nostdlib # Optimization flags are set based on menuconfig choice -ifneq ("$(CONFIG_OPTIMIZATION_LEVEL_RELEASE)","") +ifdef CONFIG_OPTIMIZATION_LEVEL_RELEASE OPTIMIZATION_FLAGS = -Os else OPTIMIZATION_FLAGS = -Og endif -ifeq ("$(CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED)", "y") +ifdef CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED CPPFLAGS += -DNDEBUG endif @@ -263,6 +272,8 @@ DEBUG_FLAGS ?= -ggdb # List of flags to pass to C compiler # If any flags are defined in application Makefile, add them at the end. +CFLAGS ?= +EXTRA_CFLAGS ?= CFLAGS := $(strip \ -std=gnu99 \ $(OPTIMIZATION_FLAGS) $(DEBUG_FLAGS) \ @@ -273,6 +284,8 @@ CFLAGS := $(strip \ # List of flags to pass to C++ compiler # If any flags are defined in application Makefile, add them at the end. +CXXFLAGS ?= +EXTRA_CXXFLAGS ?= CXXFLAGS := $(strip \ -std=gnu++11 \ -fno-exceptions \ @@ -289,8 +302,16 @@ export CFLAGS CPPFLAGS CXXFLAGS HOSTCC := $(CC) HOSTLD := $(LD) HOSTAR := $(AR) +ifdef OBJCOPY HOSTOBJCOPY := $(OBJCOPY) +else +HOSTOBJCOPY := objcopy +endif +ifdef SIZE HOSTSIZE := $(SIZE) +else +HOSTSIZE := size +endif export HOSTCC HOSTLD HOSTAR HOSTOBJCOPY SIZE # Set target compiler. Defaults to whatever the user has @@ -333,6 +354,7 @@ endif # # also depends on additional dependencies (linker scripts & binary libraries) # stored in COMPONENT_LINKER_DEPS, built via component.mk files' COMPONENT_ADD_LINKER_DEPS variable +COMPONENT_LINKER_DEPS ?= $(APP_ELF): $(foreach libcomp,$(COMPONENT_LIBRARIES),$(BUILD_DIR_BASE)/$(libcomp)/lib$(libcomp).a) $(COMPONENT_LINKER_DEPS) $(COMPONENT_PROJECT_VARS) $(summary) LD $(patsubst $(PWD)/%,%,$@) $(CC) $(LDFLAGS) -o $@ -Wl,-Map=$(APP_MAP) @@ -434,7 +456,7 @@ check-submodules: $(IDF_PATH)/$(1)/.git $(IDF_PATH)/$(1)/.git: @echo "WARNING: Missing submodule $(1)..." [ -e ${IDF_PATH}/.git ] || ( echo "ERROR: esp-idf must be cloned from git to work."; exit 1) - [ -x $(which git) ] || ( echo "ERROR: Need to run 'git submodule init $(1)' in esp-idf root directory."; exit 1) + [ -x $$(which git) ] || ( echo "ERROR: Need to run 'git submodule init $(1)' in esp-idf root directory."; exit 1) @echo "Attempting 'git submodule update --init $(1)' in esp-idf root directory..." cd ${IDF_PATH} && git submodule update --init $(1) diff --git a/make/project_config.mk b/make/project_config.mk index c92d5292ef..0a212cd287 100644 --- a/make/project_config.mk +++ b/make/project_config.mk @@ -16,8 +16,8 @@ SDKCONFIG ?= $(PROJECT_PATH)/sdkconfig SDKCONFIG_DEFAULTS ?= $(PROJECT_PATH)/sdkconfig.defaults # reset MAKEFLAGS as the menuconfig makefile uses implicit compile rules -$(KCONFIG_TOOL_DIR)/mconf $(KCONFIG_TOOL_DIR)/conf: - MAKEFLAGS=$(ORIGINAL_MAKEFLAGS) CC=$(HOSTCC) LD=$(HOSTLD) \ +$(KCONFIG_TOOL_DIR)/mconf $(KCONFIG_TOOL_DIR)/conf: $(wildcard $(KCONFIG_TOOL_DIR)/*.c) + MAKEFLAGS="" CC=$(HOSTCC) LD=$(HOSTLD) \ $(MAKE) -C $(KCONFIG_TOOL_DIR) ifeq ("$(wildcard $(SDKCONFIG))","") @@ -42,7 +42,7 @@ define RunConf $(KCONFIG_TOOL_DIR)/$1 $(IDF_PATH)/Kconfig endef -ifeq ("$(MAKE_RESTARTS)","") +ifndef MAKE_RESTARTS # menuconfig, defconfig and "GENCONFIG" configuration generation only # ever run on the first make pass, subsequent passes don't run these # (make often wants to re-run them as the conf tool can regenerate the @@ -92,6 +92,6 @@ endif .PHONY: config-clean defconfig menuconfig config-clean: - $(summary RM CONFIG) - $(MAKE) -C $(KCONFIG_TOOL_DIR) clean + $(summary) RM CONFIG + MAKEFLAGS="" $(MAKE) -C $(KCONFIG_TOOL_DIR) clean rm -rf $(BUILD_DIR_BASE)/include/config $(BUILD_DIR_BASE)/include/sdkconfig.h diff --git a/tools/kconfig/.gitignore b/tools/kconfig/.gitignore index 977c274ce3..1950c8cb1b 100644 --- a/tools/kconfig/.gitignore +++ b/tools/kconfig/.gitignore @@ -2,6 +2,7 @@ # Generated files # config* +*.d *.lex.c *.tab.c *.tab.h diff --git a/tools/kconfig/Makefile b/tools/kconfig/Makefile index 9680b74109..c421365f2e 100644 --- a/tools/kconfig/Makefile +++ b/tools/kconfig/Makefile @@ -145,7 +145,7 @@ check-lxdialog := lxdialog/check-lxdialog.sh # Use recursively expanded variables so we do not call gcc unless # we really need to do so. (Do not call gcc as part of make mrproper) CFLAGS += $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags) \ - -DLOCALE + -DLOCALE -MD # =========================================================================== # Shared Makefile for the various kconfig executables: @@ -173,7 +173,7 @@ gconf-objs := gconf.o zconf.tab.o hostprogs-y := conf nconf mconf kxgettext qconf gconf -clean-files := qconf.moc .tmp_qtcheck .tmp_gtkcheck +clean-files := qconf.moc .tmp_qtcheck .tmp_gtkcheck *.d clean-files += zconf.tab.c zconf.lex.c zconf.hash.c gconf.glade.h clean-files += $(conf-objs) $(mconf-objs) conf mconf $(lxdialog) @@ -309,3 +309,6 @@ zconf.tab.c: zconf.y clean: rm -f $(clean-files) + +-include $(wildcard *.d) +-include $(wildcard lxdialog/*.d) diff --git a/tools/kconfig/confdata.c b/tools/kconfig/confdata.c index 1e3d1f35b2..2a8d5b54d6 100644 --- a/tools/kconfig/confdata.c +++ b/tools/kconfig/confdata.c @@ -141,7 +141,7 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p) sym->flags |= def_flags; break; } - if (p[0] == 'n') { + if (p[0] == 'n' || p[0] == '\0') { sym->def[def].tri = no; sym->flags |= def_flags; break; @@ -490,12 +490,7 @@ kconfig_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg) case S_BOOLEAN: case S_TRISTATE: if (*value == 'n') { - bool skip_unset = (arg != NULL); - - if (!skip_unset) - fprintf(fp, "# %s%s is not set\n", - CONFIG_, sym->name); - return; + value = ""; } break; default: @@ -986,17 +981,21 @@ int conf_write_autoconf(void) conf_write_heading(out_h, &header_printer_cb, NULL); + /* write symbols to auto.conf, tristate and header files */ for_all_symbols(i, sym) { - sym_calc_value(sym); - if (!(sym->flags & SYMBOL_WRITE) || !sym->name) - continue; - - /* write symbol to auto.conf, tristate and header files */ - conf_write_symbol(out, sym, &kconfig_printer_cb, (void *)1); - - conf_write_symbol(tristate, sym, &tristate_printer_cb, (void *)1); - - conf_write_symbol(out_h, sym, &header_printer_cb, NULL); + if (!sym->name) continue; + if ((sym->flags & SYMBOL_WRITE) || + /* + * If the symbol is disabled by dependency we still want it in auto.conf + * so that all possible variables are always defined. + */ + (sym->dir_dep.expr != NULL && sym->dir_dep.tri == no)) { + conf_write_symbol(out, sym, &kconfig_printer_cb, NULL); + } + if (sym->flags & SYMBOL_WRITE) { + conf_write_symbol(tristate, sym, &tristate_printer_cb, NULL); + conf_write_symbol(out_h, sym, &header_printer_cb, NULL); + } } fclose(out); fclose(tristate);