kconfig/kconfig.mk
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jan 17 23:06:02 2010 +0100 (2010-01-17)
changeset 1740 c57458bb354d
parent 1155 21e86e18f344
child 1803 2c0ed9ec9a8c
permissions -rw-r--r--
configure: do not require hg when configuring in an hg clone

When configuring in an hg clone, we need hg to compute the version string.
It can happen that users do not have Mercurial (eg. if they got a snapshot
rather that they did a full clone). In this case, we can still run, of
course, so simply fill the version string with a sufficiently explicit
value, that does not require hg. The date is a good candidate.
     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 ifeq ($(shell uname -o 2>/dev/null || echo unknown),Cygwin)
    86 $(obj)/mconf: LDFLAGS += -Wl,--enable-auto-import
    87 endif
    88 
    89 # These are generated files:
    90 ALL_OBJS = $(sort $(COMMON_OBJ) $(LX_OBJ) $(conf_OBJ) $(mconf_OBJ))
    91 ALL_DEPS = $(sort $(COMMON_DEP) $(LX_DEP) $(conf_DEP) $(mconf_DEP))
    92 
    93 # Cheesy auto-dependencies
    94 # Only parse the following if a configurator was called, to avoid building
    95 # dependencies when not needed (eg. list-steps, list-samples...)
    96 # We must be carefull what we enclose, because we need some of the variable
    97 # definitions for clean (and distclean) at least.
    98 # Just protecting the "-include $(DEPS)" line should be sufficient.
    99 
   100 ifneq ($(strip $(MAKECMDGOALS)),)
   101 ifneq ($(strip $(filter $(configurators),$(MAKECMDGOALS))),)
   102 
   103 DEPS = $(COMMON_DEP)
   104 ifneq ($(strip $(filter oldconfig,$(MAKECMDGOALS))),)
   105 DEPS += $(conf_DEP)
   106 endif
   107 ifneq ($(strip $(filter menuconfig,$(MAKECMDGOALS))),)
   108 DEPS += $(mconf_DEP) $(LX_DEP)
   109 endif
   110 
   111 -include $(DEPS)
   112 
   113 endif # MAKECMDGOALS contains a configurator rule
   114 endif # MAKECMDGOALS != ""
   115 
   116 # Each .o or .dep *can not* directly depend on kconfig/, because kconfig can
   117 # be touched during the build (who's touching it, btw?) so each .o or .dep
   118 # would be re-built when it sould not be.
   119 # So manually check for presence of $(obj) (ie. kconfig), and only mkdir
   120 # if needed. After all, that's not so bad...
   121 # mkdir $(obj)/lxdialog, because we need it, and incidentally, that
   122 # also creates $(obj).
   123 define check_kconfig_dir
   124 	$(SILENT)if [ ! -d $(obj)/lxdialog ]; then  \
   125 	   $(ECHO) "  MKDIR $(obj)";           \
   126 	   mkdir -p $(obj)/lxdialog;        \
   127 	 fi
   128 endef
   129 
   130 # Build the dependency for C files
   131 %.dep: %.c $(CT_LIB_DIR)/kconfig/kconfig.mk
   132 	$(check_kconfig_dir)
   133 	@$(ECHO) "  DEP   $@"
   134 	$(SILENT)$(HOST_CC) $(CFLAGS) $(EXTRA_CFLAGS) -MM $< |$(sed) -r -e 's|([^:]+.o)( *:+)|$(<:.c=.o) $@\2|;' >$@
   135 
   136 # Build C files
   137 %.o: %.c $(CT_LIB_DIR)/kconfig/kconfig.mk
   138 	$(check_kconfig_dir)
   139 	@$(ECHO) "  CC    $@"
   140 	$(SILENT)$(HOST_CC) $(CFLAGS) $(EXTRA_CFLAGS) -o $@ -c $<
   141 
   142 # Actual link
   143 $(obj)/mconf: $(COMMON_OBJ) $(LX_OBJ) $(mconf_OBJ)
   144 	@$(ECHO) '  LD    $@'
   145 	$(SILENT)$(HOST_LD) -o $@ $^ $(LDFLAGS) $(EXTRA_LDFLAGS)
   146 
   147 $(obj)/conf: $(COMMON_OBJ) $(conf_OBJ)
   148 	@$(ECHO) '  LD    $@'
   149 	$(SILENT)$(HOST_LD) -o $@ $^ $(LDFLAGS) $(EXTRA_LDFLAGS)
   150 
   151 #-----------------------------------------------------------
   152 # Cleaning up the mess...
   153 
   154 clean::
   155 	@$(ECHO) "  CLEAN kconfig"
   156 	$(SILENT)rm -f kconfig/{,m}conf{,.exe} $(ALL_OBJS) $(ALL_DEPS)
   157 	$(SILENT)rmdir --ignore-fail-on-non-empty kconfig{/lxdialog,} 2>/dev/null || true