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