yann@1: # =========================================================================== yann@197: # crosstool-NG configuration targets yann@1: # These targets are used from top-level makefile yann@1: yann@945: # The place where the kconfig stuff lies yann@926: obj = kconfig yann@926: yann@926: #----------------------------------------------------------- yann@926: # The configurators rules yann@182: yann@2454: configurators = menuconfig nconfig oldconfig yann@946: PHONY += $(configurators) yann@945: yann@946: $(configurators): config_files yann@946: yann@946: menuconfig: $(obj)/mconf yann@959: @$(ECHO) " CONF $(KCONFIG_TOP)" yann@940: $(SILENT)$< $(KCONFIG_TOP) yann@1: yann@2454: nconfig: $(obj)/nconf yann@2454: @$(ECHO) " CONF $(KCONFIG_TOP)" yann@2454: $(SILENT)$< $(KCONFIG_TOP) yann@2454: yann@946: oldconfig: $(obj)/conf .config yann@945: @$(ECHO) " CONF $(KCONFIG_TOP)" yann@2448: $(SILENT)$< --silent$@ $(KCONFIG_TOP) yann@1: yann@1803: # Always be silent, the stdout an be >.config yann@1803: extractconfig: yann@1803: @awk 'BEGIN { dump=0; } \ yann@1803: dump==1 && $$0~/^\[.....\][[:space:]]+(# |)CT_/ { \ yann@1803: $$1=""; \ yann@1803: gsub("^[[:space:]]",""); \ yann@1803: print; \ yann@1803: } \ yann@1803: $$0~/Dumping user-supplied crosstool-NG configuration: done in/ { \ yann@1803: dump=0; \ yann@1803: } \ yann@1803: $$0~/Dumping user-supplied crosstool-NG configuration$$/ { \ yann@1803: dump=1; \ yann@1803: }' yann@1803: yann@926: #----------------------------------------------------------- yann@1: # Help text used by make help yann@926: yann@176: help-config:: yann@333: @echo ' menuconfig - Update current config using a menu based program' yann@333: @echo ' oldconfig - Update current config using a provided .config as base' yann@1803: @echo ' extractconfig - Extract to stdout the configuration items from a' yann@1803: @echo ' build.log file piped to stdin' yann@1: yann@926: #----------------------------------------------------------- yann@940: # Hmmm! Cheesy build! yann@940: # Or: where I can unveil my make-fu... :-] yann@1: yann@940: # Oh! Files not here are there, in fact! :-) yann@940: vpath %.c $(CT_LIB_DIR) yann@940: vpath %.h $(CT_LIB_DIR) yann@1: yann@940: # What is the compiler? yann@940: HOST_CC ?= gcc -funsigned-char yann@959: HOST_LD ?= gcc yann@959: yann@959: # Helpers yann@2448: check_gettext = $(CT_LIB_DIR)/kconfig/check.sh yann@959: check_lxdialog = $(CT_LIB_DIR)/kconfig/lxdialog/check-lxdialog.sh yann@959: yann@959: # Build flags yann@2650: CFLAGS = -DCONFIG_=\"CT_\" -DPACKAGE="\"crosstool-NG $(CT_VERSION)\"" yann@959: LDFLAGS = yann@182: yann@943: # Compiler flags to use gettext yann@959: INTL_CFLAGS = $(shell $(SHELL) $(check_gettext) $(HOST_CC) $(EXTRA_CFLAGS)) yann@943: yann@940: # Compiler and linker flags to use ncurses yann@959: NCURSES_CFLAGS = $(shell $(SHELL) $(check_lxdialog) -ccflags) yann@2125: NCURSES_LDFLAGS = $(shell $(SHELL) $(check_lxdialog) -ldflags $(HOST_CC)) yann@2125: yann@2125: # Check that we have the required ncurses stuff installed for lxdialog (menuconfig) yann@2125: dochecklxdialog: yann@2125: $(SILENT)$(SHELL) $(check_lxdialog) -check $(HOST_CC) $(NCURSES_CFLAGS) $(NCURSES_LDFLAGS) yann@182: yann@959: # Common source files yann@959: COMMON_SRC = kconfig/zconf.tab.c yann@959: COMMON_OBJ = $(patsubst %.c,%.o,$(COMMON_SRC)) yann@959: COMMON_DEP = $(patsubst %.o,%.dep,$(COMMON_OBJ)) yann@959: $(COMMON_OBJ) $(COMMON_DEP): CFLAGS += $(INTL_CFLAGS) yann@959: yann@959: # lxdialog source files yann@959: LX_SRC = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/kconfig/lxdialog/*.c)) yann@959: LX_OBJ = $(patsubst %.c,%.o,$(LX_SRC)) yann@959: LX_DEP = $(patsubst %.o,%.dep,$(LX_OBJ)) yann@959: $(LX_OBJ) $(LX_DEP): CFLAGS += $(NCURSES_CFLAGS) $(INTL_CFLAGS) yann@816: yann@940: # What's needed to build 'conf' yann@959: conf_SRC = kconfig/conf.c yann@959: conf_OBJ = $(patsubst %.c,%.o,$(conf_SRC)) yann@959: conf_DEP = $(patsubst %.o,%.dep,$(conf_OBJ)) yann@959: $(conf_OBJ) $(conf_DEP): CFLAGS += $(INTL_CFLAGS) yann@816: yann@940: # What's needed to build 'mconf' yann@959: mconf_SRC = kconfig/mconf.c yann@940: mconf_OBJ = $(patsubst %.c,%.o,$(mconf_SRC)) yann@959: mconf_DEP = $(patsubst %.c,%.dep,$(mconf_SRC)) yann@959: $(mconf_OBJ) $(mconf_DEP): CFLAGS += $(NCURSES_CFLAGS) $(INTL_CFLAGS) yann@959: $(obj)/mconf: LDFLAGS += $(NCURSES_LDFLAGS) yann@2454: yann@2454: # What's needed to build 'nconf' yann@2454: nconf_SRC = kconfig/nconf.c kconfig/nconf.gui.c yann@2454: nconf_OBJ = $(patsubst %.c,%.o,$(nconf_SRC)) yann@2454: nconf_DEP = $(patsubst %.c,%.dep,$(nconf_SRC)) yann@2454: $(nconf_OBJ) $(nconf_DEP): CFLAGS += $(INTL_CFLAGS) yann@2454: $(obj)/nconf: LDFLAGS += -lmenu -lpanel -lncurses yann@2454: yann@2454: # Under Cygwin, we need to auto-import some libs (which ones, exactly?) yann@2454: # for mconf and nconf to lin properly. yann@1087: ifeq ($(shell uname -o 2>/dev/null || echo unknown),Cygwin) yann@1087: $(obj)/mconf: LDFLAGS += -Wl,--enable-auto-import yann@2454: $(obj)/nconf: LDFLAGS += -Wl,--enable-auto-import yann@1087: endif yann@959: yann@959: # These are generated files: yann@2454: ALL_OBJS = $(sort $(COMMON_OBJ) $(LX_OBJ) $(conf_OBJ) $(mconf_OBJ) $(nconf_OBJ)) yann@2454: ALL_DEPS = $(sort $(COMMON_DEP) $(LX_DEP) $(conf_DEP) $(mconf_DEP) $(nconf_DEP)) yann@1: yann@940: # Cheesy auto-dependencies yann@946: # Only parse the following if a configurator was called, to avoid building yann@946: # dependencies when not needed (eg. list-steps, list-samples...) antony@2564: # We must be careful what we enclose, because we need some of the variable yann@946: # definitions for clean (and distclean) at least. yann@946: # Just protecting the "-include $(DEPS)" line should be sufficient. yann@2125: # And in case we want menuconfig, we have to check that lxdialog yann@2125: # can find a curses lib. yann@946: yann@946: ifneq ($(strip $(MAKECMDGOALS)),) yann@946: ifneq ($(strip $(filter $(configurators),$(MAKECMDGOALS))),) yann@946: yann@959: DEPS = $(COMMON_DEP) yann@959: ifneq ($(strip $(filter oldconfig,$(MAKECMDGOALS))),) yann@959: DEPS += $(conf_DEP) yann@959: endif yann@959: ifneq ($(strip $(filter menuconfig,$(MAKECMDGOALS))),) yann@959: DEPS += $(mconf_DEP) $(LX_DEP) yann@2125: $(COMMON_OBJ) $(COMMON_DEP): |dochecklxdialog yann@2125: $(LX_OBJ) $(LX_DEP): |dochecklxdialog yann@2125: $(mconf_OBJ) $(mconf_DEP): |dochecklxdialog yann@959: endif yann@2454: ifneq ($(strip $(filter nconfig,$(MAKECMDGOALS))),) yann@2454: DEPS += $(nconf_DEP) yann@2454: endif yann@959: yann@945: -include $(DEPS) yann@940: yann@946: endif # MAKECMDGOALS contains a configurator rule yann@946: endif # MAKECMDGOALS != "" yann@946: yann@959: # Each .o or .dep *can not* directly depend on kconfig/, because kconfig can yann@959: # be touched during the build (who's touching it, btw?) so each .o or .dep antony@2564: # would be re-built when it should not be. yann@959: # So manually check for presence of $(obj) (ie. kconfig), and only mkdir yann@959: # if needed. After all, that's not so bad... yann@959: # mkdir $(obj)/lxdialog, because we need it, and incidentally, that yann@959: # also creates $(obj). yann@959: define check_kconfig_dir yann@940: $(SILENT)if [ ! -d $(obj)/lxdialog ]; then \ yann@940: $(ECHO) " MKDIR $(obj)"; \ yann@940: mkdir -p $(obj)/lxdialog; \ yann@940: fi yann@959: endef yann@959: yann@959: # Build the dependency for C files yann@959: %.dep: %.c $(CT_LIB_DIR)/kconfig/kconfig.mk yann@959: $(check_kconfig_dir) yann@940: @$(ECHO) " DEP $@" yann@1155: $(SILENT)$(HOST_CC) $(CFLAGS) $(EXTRA_CFLAGS) -MM $< |$(sed) -r -e 's|([^:]+.o)( *:+)|$(<:.c=.o) $@\2|;' >$@ yann@940: yann@959: # Build C files yann@940: %.o: %.c $(CT_LIB_DIR)/kconfig/kconfig.mk yann@959: $(check_kconfig_dir) yann@940: @$(ECHO) " CC $@" yann@943: $(SILENT)$(HOST_CC) $(CFLAGS) $(EXTRA_CFLAGS) -o $@ -c $< yann@940: yann@959: # Actual link yann@959: $(obj)/mconf: $(COMMON_OBJ) $(LX_OBJ) $(mconf_OBJ) yann@940: @$(ECHO) ' LD $@' yann@1087: $(SILENT)$(HOST_LD) -o $@ $^ $(LDFLAGS) $(EXTRA_LDFLAGS) yann@940: yann@2454: $(obj)/nconf: $(COMMON_OBJ) $(nconf_OBJ) yann@2454: @$(ECHO) ' LD $@' yann@2454: $(SILENT)$(HOST_LD) -o $@ $^ $(LDFLAGS) $(EXTRA_LDFLAGS) yann@2454: yann@959: $(obj)/conf: $(COMMON_OBJ) $(conf_OBJ) yann@940: @$(ECHO) ' LD $@' yann@1087: $(SILENT)$(HOST_LD) -o $@ $^ $(LDFLAGS) $(EXTRA_LDFLAGS) yann@1: yann@926: #----------------------------------------------------------- yann@926: # Cleaning up the mess... yann@926: yann@1: clean:: yann@940: @$(ECHO) " CLEAN kconfig" yann@2454: $(SILENT)rm -f kconfig/{,m,n}conf{,.exe} $(ALL_OBJS) $(ALL_DEPS) yann@940: $(SILENT)rmdir --ignore-fail-on-non-empty kconfig{/lxdialog,} 2>/dev/null || true