kconfig/kconfig.mk
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Oct 22 16:56:23 2008 +0000 (2008-10-22)
changeset 959 955712a44ff0
parent 946 253df9d80065
child 1087 5be36a4b304d
permissions -rw-r--r--
Enhance the kconfig stuff build procedure:
- better allocate CFLAGS/LDFLAGS to object and dependency files
- only include the needed dependency files
- cleanly handle the kconfig/ check and creation
- use HOST_LD to link, not HOST_CC (even if both are set to 'gcc' for now)
- get rid of defoldconfig, it does not make much sense using it.

/trunk/kconfig/kconfig.mk | 110 66 44 0 ++++++++++++++++++++++++++++++++---------------------
1 file changed, 66 insertions(+), 44 deletions(-)
     1 # ===========================================================================
     2 # crosstool-NG configuration targets
     3 # These targets are used from top-level makefile
     4 
     5 # Derive the project version from, well, the project version:
     6 export PROJECTVERSION=$(CT_VERSION)
     7 
     8 # The place where the kconfig stuff lies
     9 obj = kconfig
    10 
    11 #-----------------------------------------------------------
    12 # The configurators rules
    13 
    14 configurators = menuconfig oldconfig
    15 PHONY += $(configurators)
    16 
    17 $(configurators): config_files
    18 
    19 menuconfig: $(obj)/mconf
    20 	@$(ECHO) "  CONF  $(KCONFIG_TOP)"
    21 	$(SILENT)$< $(KCONFIG_TOP)
    22 
    23 oldconfig: $(obj)/conf .config
    24 	@$(ECHO) "  CONF  $(KCONFIG_TOP)"
    25 	$(SILENT)$< -s $(KCONFIG_TOP)
    26 
    27 #-----------------------------------------------------------
    28 # Help text used by make help
    29 
    30 help-config::
    31 	@echo  '  menuconfig         - Update current config using a menu based program'
    32 	@echo  '  oldconfig          - Update current config using a provided .config as base'
    33 
    34 #-----------------------------------------------------------
    35 # Hmmm! Cheesy build!
    36 # Or: where I can unveil my make-fu... :-]
    37 
    38 # Oh! Files not here are there, in fact! :-)
    39 vpath %.c $(CT_LIB_DIR)
    40 vpath %.h $(CT_LIB_DIR)
    41 
    42 # What is the compiler?
    43 HOST_CC ?= gcc -funsigned-char
    44 HOST_LD ?= gcc
    45 
    46 # Helpers
    47 check_gettext = $(CT_LIB_DIR)/kconfig/check-gettext.sh
    48 check_lxdialog = $(CT_LIB_DIR)/kconfig/lxdialog/check-lxdialog.sh
    49 
    50 # Build flags
    51 CFLAGS = 
    52 LDFLAGS =
    53 
    54 # Compiler flags to use gettext
    55 INTL_CFLAGS = $(shell $(SHELL) $(check_gettext) $(HOST_CC) $(EXTRA_CFLAGS))
    56 
    57 # Compiler and linker flags to use ncurses
    58 NCURSES_CFLAGS = $(shell $(SHELL) $(check_lxdialog) -ccflags)
    59 NCURSES_LDFLAGS = $(shell $(SHELL) $(check_lxdialog) -ldflags $(HOST_CC) $(LX_FLAGS) $(EXTRA_CFLAGS))
    60 
    61 # Common source files
    62 COMMON_SRC = kconfig/zconf.tab.c
    63 COMMON_OBJ = $(patsubst %.c,%.o,$(COMMON_SRC))
    64 COMMON_DEP = $(patsubst %.o,%.dep,$(COMMON_OBJ))
    65 $(COMMON_OBJ) $(COMMON_DEP): CFLAGS += $(INTL_CFLAGS)
    66 
    67 # lxdialog source files
    68 LX_SRC = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/kconfig/lxdialog/*.c))
    69 LX_OBJ = $(patsubst %.c,%.o,$(LX_SRC))
    70 LX_DEP = $(patsubst %.o,%.dep,$(LX_OBJ))
    71 $(LX_OBJ) $(LX_DEP): CFLAGS += $(NCURSES_CFLAGS) $(INTL_CFLAGS)
    72 
    73 # What's needed to build 'conf'
    74 conf_SRC = kconfig/conf.c
    75 conf_OBJ = $(patsubst %.c,%.o,$(conf_SRC))
    76 conf_DEP = $(patsubst %.o,%.dep,$(conf_OBJ))
    77 $(conf_OBJ) $(conf_DEP): CFLAGS += $(INTL_CFLAGS)
    78 
    79 # What's needed to build 'mconf'
    80 mconf_SRC = kconfig/mconf.c
    81 mconf_OBJ = $(patsubst %.c,%.o,$(mconf_SRC))
    82 mconf_DEP = $(patsubst %.c,%.dep,$(mconf_SRC))
    83 $(mconf_OBJ) $(mconf_DEP): CFLAGS += $(NCURSES_CFLAGS) $(INTL_CFLAGS)
    84 $(obj)/mconf: LDFLAGS += $(NCURSES_LDFLAGS)
    85 
    86 # These are generated files:
    87 ALL_OBJS = $(sort $(COMMON_OBJ) $(LX_OBJ) $(conf_OBJ) $(mconf_OBJ))
    88 ALL_DEPS = $(sort $(COMMON_DEP) $(LX_DEP) $(conf_DEP) $(mconf_DEP))
    89 
    90 # Cheesy auto-dependencies
    91 # Only parse the following if a configurator was called, to avoid building
    92 # dependencies when not needed (eg. list-steps, list-samples...)
    93 # We must be carefull what we enclose, because we need some of the variable
    94 # definitions for clean (and distclean) at least.
    95 # Just protecting the "-include $(DEPS)" line should be sufficient.
    96 
    97 ifneq ($(strip $(MAKECMDGOALS)),)
    98 ifneq ($(strip $(filter $(configurators),$(MAKECMDGOALS))),)
    99 
   100 DEPS = $(COMMON_DEP)
   101 ifneq ($(strip $(filter oldconfig,$(MAKECMDGOALS))),)
   102 DEPS += $(conf_DEP)
   103 endif
   104 ifneq ($(strip $(filter menuconfig,$(MAKECMDGOALS))),)
   105 DEPS += $(mconf_DEP) $(LX_DEP)
   106 endif
   107 
   108 -include $(DEPS)
   109 
   110 endif # MAKECMDGOALS contains a configurator rule
   111 endif # MAKECMDGOALS != ""
   112 
   113 # Each .o or .dep *can not* directly depend on kconfig/, because kconfig can
   114 # be touched during the build (who's touching it, btw?) so each .o or .dep
   115 # would be re-built when it sould not be.
   116 # So manually check for presence of $(obj) (ie. kconfig), and only mkdir
   117 # if needed. After all, that's not so bad...
   118 # mkdir $(obj)/lxdialog, because we need it, and incidentally, that
   119 # also creates $(obj).
   120 define check_kconfig_dir
   121 	$(SILENT)if [ ! -d $(obj)/lxdialog ]; then  \
   122 	   $(ECHO) "  MKDIR $(obj)";           \
   123 	   mkdir -p $(obj)/lxdialog;        \
   124 	 fi
   125 endef
   126 
   127 # Build the dependency for C files
   128 %.dep: %.c $(CT_LIB_DIR)/kconfig/kconfig.mk
   129 	$(check_kconfig_dir)
   130 	@$(ECHO) "  DEP   $@"
   131 	$(SILENT)$(HOST_CC) $(CFLAGS) $(EXTRA_CFLAGS) -MM $< |sed -r -e 's|([^:]+.o)( *:+)|$(<:.c=.o) $@\2|;' >$@
   132 
   133 # Build C files
   134 %.o: %.c $(CT_LIB_DIR)/kconfig/kconfig.mk
   135 	$(check_kconfig_dir)
   136 	@$(ECHO) "  CC    $@"
   137 	$(SILENT)$(HOST_CC) $(CFLAGS) $(EXTRA_CFLAGS) -o $@ -c $<
   138 
   139 # Actual link
   140 $(obj)/mconf: $(COMMON_OBJ) $(LX_OBJ) $(mconf_OBJ)
   141 	@$(ECHO) '  LD    $@'
   142 	$(SILENT)$(HOST_LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -o $@ $^
   143 
   144 $(obj)/conf: $(COMMON_OBJ) $(conf_OBJ)
   145 	@$(ECHO) '  LD    $@'
   146 	$(SILENT)$(HOST_LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -o $@ $^
   147 
   148 #-----------------------------------------------------------
   149 # Cleaning up the mess...
   150 
   151 clean::
   152 	@$(ECHO) "  CLEAN kconfig"
   153 	$(SILENT)rm -f kconfig/{,m}conf $(ALL_OBJS) $(ALL_DEPS)
   154 	$(SILENT)rmdir --ignore-fail-on-non-empty kconfig{/lxdialog,} 2>/dev/null || true