kconfig/kconfig.mk
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Fri Oct 17 14:26:53 2008 +0000 (2008-10-17)
changeset 944 a6e9767c8ef9
parent 942 86f3e28fa3cc
child 945 d0e5f04d2e06
permissions -rw-r--r--
Fix saving samples when the uClibc config file is already saved.

/trunk/scripts/saveSample.sh | 4 2 2 0
/trunk/samples/arm-unknown-linux-uclibcgnueabi/crosstool.config | 140 71 69 0 ++++++++-------
/trunk/samples/arm-unknown-linux-uclibcgnueabi/reported.by | 3 3 0 0 +
3 files changed, 76 insertions(+), 71 deletions(-)
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@926
     8
#-----------------------------------------------------------
yann@926
     9
# Some static /configuration/
yann@926
    10
yann@1
    11
KCONFIG_TOP = config/config.in
yann@926
    12
obj = kconfig
yann@925
    13
PHONY += clean help oldconfig menuconfig defoldconfig
yann@1
    14
yann@926
    15
#-----------------------------------------------------------
yann@926
    16
# List all config files, source and generated
yann@97
    17
yann@926
    18
# Build the list of all source config files
yann@926
    19
STATIC_CONFIG_FILES = $(patsubst $(CT_LIB_DIR)/%,%,$(shell find $(CT_LIB_DIR)/config -type f -name '*.in' 2>/dev/null))
yann@926
    20
# ... and how to access them:
yann@926
    21
$(STATIC_CONFIG_FILES): config
yann@88
    22
yann@926
    23
# Build a list of per-component-type source config files
yann@926
    24
ARCH_CONFIG_FILES   = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/arch/*.in))
yann@926
    25
KERNEL_CONFIG_FILES = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/kernel/*.in))
yann@926
    26
CC_CONFIG_FILES     = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/cc/*.in))
yann@926
    27
LIBC_CONFIG_FILES   = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/libc/*.in))
yann@926
    28
DEBUG_CONFIG_FILES  = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/debug/*.in))
yann@926
    29
TOOL_CONFIG_FILES   = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/tools/*.in))
yann@182
    30
yann@926
    31
# Build the list of generated config files
yann@926
    32
GEN_CONFIG_FILES = config.gen/arch.in     \
yann@926
    33
                   config.gen/kernel.in   \
yann@926
    34
                   config.gen/cc.in       \
yann@926
    35
                   config.gen/libc.in     \
yann@926
    36
                   config.gen/tools.in    \
yann@926
    37
                   config.gen/debug.in
yann@926
    38
# ... and how to access them:
yann@926
    39
# Generated files depends on kconfig.mk (this file) because it has the
yann@926
    40
# functions needed to build the genrated files, and thus they might
yann@926
    41
# need re-generation if kconfig.mk changes
yann@926
    42
$(GEN_CONFIG_FILES): config.gen                         \
yann@861
    43
                     $(CT_LIB_DIR)/kconfig/kconfig.mk
yann@182
    44
yann@926
    45
# KCONFIG_TOP should already be in STATIC_CONFIG_FILES, anyway...
yann@926
    46
CONFIG_FILES = $(sort $(KCONFIG_TOP) $(STATIC_CONFIG_FILES) $(GEN_CONFIG_FILES))
yann@182
    47
yann@926
    48
# Where to access to the source config files from
yann@926
    49
config:
yann@940
    50
	@$(ECHO) "  LN    config"
yann@940
    51
	$(SILENT)ln -s $(CT_LIB_DIR)/config config
yann@926
    52
yann@926
    53
# Where to store the generated config files into
yann@926
    54
config.gen:
yann@940
    55
	@$(ECHO) "  MKDIR config.gen"
yann@940
    56
	$(SILENT)mkdir -p config.gen
yann@926
    57
yann@926
    58
#-----------------------------------------------------------
yann@926
    59
# Build list of per-component-type items to easily build generated files
yann@926
    60
yann@926
    61
ARCHS   = $(patsubst config/arch/%.in,%,$(ARCH_CONFIG_FILES))
yann@926
    62
KERNELS = $(patsubst config/kernel/%.in,%,$(KERNEL_CONFIG_FILES))
yann@926
    63
CCS     = $(patsubst config/cc/%.in,%,$(CC_CONFIG_FILES))
yann@926
    64
LIBCS   = $(patsubst config/libc/%.in,%,$(LIBC_CONFIG_FILES))
yann@926
    65
DEBUGS  = $(patsubst config/debug/%.in,%,$(DEBUG_CONFIG_FILES))
yann@926
    66
TOOLS   = $(patsubst config/tools/%.in,%,$(TOOL_CONFIG_FILES))
yann@926
    67
yann@926
    68
#-----------------------------------------------------------
yann@926
    69
# Helper functions to ease building generated config files
yann@926
    70
yann@926
    71
# The function 'build_gen_choice_in' builds a choice-menu of a list of
yann@926
    72
# components in the given list, also adding source-ing of associazted
yann@926
    73
# config files:
yann@912
    74
# $1 : destination file
yann@912
    75
# $2 : name for the entries family (eg. Architecture, kernel...)
yann@912
    76
# $3 : prefix for the choice entries (eg. ARCH, KERNEL...)
yann@912
    77
# $4 : base directory containing config files
yann@912
    78
# $5 : list of config entries (eg. for architectures: "alpha arm ia64"...,
yann@912
    79
#      and for kernels: "bare-metal linux"...)
yann@912
    80
# Example to build the kernels generated config file:
yann@920
    81
# $(call build_gen_choice_in,config.gen/kernel.in,Target OS,KERNEL,config/kernel,$(KERNELS))
yann@912
    82
define build_gen_choice_in
yann@940
    83
	@$(ECHO) '  IN    $(1)'
yann@940
    84
	$(SILENT)(echo "# $(2) menu";                                       \
yann@920
    85
	  echo "# Generated file, do not edit!!!";                          \
yann@920
    86
	  echo "";                                                          \
yann@920
    87
	  echo "choice";                                                    \
yann@920
    88
	  echo "    bool";                                                  \
yann@920
    89
	  echo "    prompt \"$(2)\"";                                       \
yann@920
    90
	  echo "";                                                          \
yann@920
    91
	  for entry in $(5); do                                             \
yann@920
    92
	    file="$(4)/$${entry}.in";                                       \
yann@920
    93
	    _entry=$$(echo "$${entry}" |sed -r -s -e 's/[-.+]/_/g;');       \
yann@920
    94
	    echo "config $(3)_$${_entry}";                                  \
yann@920
    95
	    echo "    bool";                                                \
yann@920
    96
	    printf "    prompt \"$${entry}";                                \
yann@920
    97
	    if grep -E '^# +EXPERIMENTAL$$' $${file} >/dev/null 2>&1; then  \
yann@920
    98
	      echo " (EXPERIMENTAL)\"";                                     \
yann@920
    99
	      echo "    depends on EXPERIMENTAL";                           \
yann@920
   100
	    else                                                            \
yann@920
   101
	      echo "\"";                                                    \
yann@920
   102
	    fi;                                                             \
yann@920
   103
	  done;                                                             \
yann@920
   104
	  echo "";                                                          \
yann@920
   105
	  echo "endchoice";                                                 \
yann@920
   106
	  for entry in $(5); do                                             \
yann@920
   107
	    file="$(4)/$${entry}.in";                                       \
yann@920
   108
	    _entry=$$(echo "$${entry}" |sed -r -s -e 's/[-.+]/_/g;');       \
yann@920
   109
	    echo "";                                                        \
yann@920
   110
	    echo "if $(3)_$${_entry}";                                      \
yann@920
   111
	    echo "config $(3)";                                             \
yann@920
   112
	    echo "    default \"$${entry}\" if $(3)_$${_entry}";            \
yann@920
   113
	    echo "source $${file}";                                         \
yann@920
   114
	    echo "endif";                                                   \
yann@920
   115
	  done;                                                             \
yann@912
   116
	 ) >$(1)
yann@912
   117
endef
yann@628
   118
yann@926
   119
# The function 'build_gen_menu_in' builds a menuconfig for each component in
yann@926
   120
# the given list, source-ing the associated files conditionnaly:
yann@916
   121
# $1 : destination file
yann@916
   122
# $2 : name of entries family (eg. Tools, Debug...)
yann@916
   123
# $3 : prefix for the menu entries (eg. TOOL, DEBUG)
yann@916
   124
# $4 : base directory containing config files
yann@916
   125
# $5 : list of config entries (eg. for tools: "libelf sstrip"..., and for
yann@916
   126
#      debug: "dmalloc duma gdb"...)
yann@916
   127
# Example to build the tools generated config file:
yann@916
   128
# $(call build_gen_menu_in,config.gen/tools.in,Tools,TOOL,config/tools,$(TOOLS))
yann@916
   129
define build_gen_menu_in
yann@940
   130
	@$(ECHO) '  IN    $(1)'
yann@940
   131
	$(SILENT)(echo "# $(2) facilities menu";                            \
yann@916
   132
	  echo "# Generated file, do not edit!!!";                          \
yann@916
   133
	  echo "";                                                          \
yann@916
   134
	  for entry in $(5); do                                             \
yann@916
   135
	    file="$(4)/$${entry}.in";                                       \
yann@916
   136
	    _entry=$$(echo "$${entry}" |sed -r -s -e 's/[-.+]/_/g;');       \
yann@916
   137
	    echo "menuconfig $(3)_$${_entry}";                              \
yann@916
   138
	    echo "    bool";                                                \
yann@916
   139
	    printf "    prompt \"$${entry}";                                \
yann@916
   140
	    if grep -E '^# +EXPERIMENTAL$$' $${file} >/dev/null 2>&1; then  \
yann@916
   141
	      echo " (EXPERIMENTAL)\"";                                     \
yann@916
   142
	      echo "    depends on EXPERIMENTAL";                           \
yann@916
   143
	    else                                                            \
yann@916
   144
	      echo "\"";                                                    \
yann@916
   145
	    fi;                                                             \
yann@916
   146
	    echo "if $(3)_$${_entry}";                                      \
yann@916
   147
	    echo "source $${file}";                                         \
yann@916
   148
	    echo "endif";                                                   \
yann@916
   149
	    echo "";                                                        \
yann@916
   150
	  done;                                                             \
yann@916
   151
	 ) >$(1)
yann@916
   152
endef
yann@916
   153
yann@926
   154
#-----------------------------------------------------------
yann@926
   155
# The rules for the generated config files
yann@916
   156
yann@926
   157
config.gen/arch.in: $(ARCH_CONFIG_FILES)
yann@926
   158
	$(call build_gen_choice_in,$@,Target Architecture,ARCH,config/arch,$(ARCHS))
yann@861
   159
yann@926
   160
config.gen/kernel.in: $(KERNEL_CONFIG_FILES)
yann@926
   161
	$(call build_gen_choice_in,$@,Target OS,KERNEL,config/kernel,$(KERNELS))
yann@182
   162
yann@926
   163
config.gen/cc.in: $(CC_CONFIG_FILES)
yann@926
   164
	$(call build_gen_choice_in,$@,C compiler,CC,config/cc,$(CCS))
yann@926
   165
yann@926
   166
config.gen/libc.in: $(LIBC_CONFIG_FILES)
yann@926
   167
	$(call build_gen_choice_in,$@,C library,LIBC,config/libc,$(LIBCS))
yann@926
   168
yann@926
   169
config.gen/tools.in: $(TOOL_CONFIG_FILES)
yann@926
   170
	$(call build_gen_menu_in,$@,Tools,TOOL,config/tools,$(TOOLS))
yann@926
   171
yann@926
   172
config.gen/debug.in: $(DEBUG_CONFIG_FILES)
yann@926
   173
	$(call build_gen_menu_in,$@,Debug,DEBUG,config/debug,$(DEBUGS))
yann@926
   174
yann@926
   175
#-----------------------------------------------------------
yann@926
   176
# The configurators rules
yann@182
   177
yann@940
   178
menuconfig: $(obj)/mconf $(CONFIG_FILES)
yann@940
   179
	$(SILENT)$< $(KCONFIG_TOP)
yann@1
   180
yann@942
   181
oldconfig: $(obj)/conf .config $(CONFIG_FILES)
yann@940
   182
	$(SILENT)$< -s $(KCONFIG_TOP)
yann@1
   183
yann@942
   184
defoldconfig: $(obj)/conf .config $(CONFIG_FILES)
yann@940
   185
	$(SILENT)yes "" |$< -s $(KCONFIG_TOP)
yann@159
   186
yann@926
   187
#-----------------------------------------------------------
yann@1
   188
# Help text used by make help
yann@926
   189
yann@176
   190
help-config::
yann@333
   191
	@echo  '  menuconfig         - Update current config using a menu based program'
yann@333
   192
	@echo  '  oldconfig          - Update current config using a provided .config as base'
yann@940
   193
	@echo  '  defoldconfig       - As oldconfig, above, but using defaults for new options'
yann@1
   194
yann@926
   195
#-----------------------------------------------------------
yann@940
   196
# Hmmm! Cheesy build!
yann@940
   197
# Or: where I can unveil my make-fu... :-]
yann@1
   198
yann@940
   199
# Oh! Files not here are there, in fact! :-)
yann@940
   200
vpath %.c $(CT_LIB_DIR)
yann@940
   201
vpath %.h $(CT_LIB_DIR)
yann@1
   202
yann@940
   203
# What is the compiler?
yann@940
   204
HOST_CC ?= gcc -funsigned-char
yann@182
   205
yann@943
   206
# Compiler flags to use gettext
yann@943
   207
EXTRA_CFLAGS += $(shell $(SHELL) $(CT_LIB_DIR)/kconfig/check-gettext.sh $(HOST_CC) $(CFLAGS))
yann@943
   208
yann@940
   209
# Compiler and linker flags to use ncurses
yann@943
   210
EXTRA_CFLAGS += $(shell $(SHELL) $(CT_LIB_DIR)/kconfig/lxdialog/check-lxdialog.sh -ccflags)
yann@943
   211
EXTRA_LDFLAGS += $(shell $(SHELL) $(CT_LIB_DIR)/kconfig/lxdialog/check-lxdialog.sh -ldflags $(HOST_CC))
yann@182
   212
yann@940
   213
# Common source files, and lxdialog source files
yann@940
   214
SRC = kconfig/zconf.tab.c
yann@940
   215
LXSRC = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/kconfig/lxdialog/*.c))
yann@816
   216
yann@940
   217
# What's needed to build 'conf'
yann@940
   218
conf_SRC  = $(SRC) kconfig/conf.c
yann@940
   219
conf_OBJ  = $(patsubst %.c,%.o,$(conf_SRC))
yann@816
   220
yann@940
   221
# What's needed to build 'mconf'
yann@940
   222
mconf_SRC = $(SRC) $(LXSRC) kconfig/mconf.c
yann@940
   223
mconf_OBJ = $(patsubst %.c,%.o,$(mconf_SRC))
yann@1
   224
yann@940
   225
# Cheesy auto-dependencies
yann@940
   226
DEPS = $(patsubst %.c,%.d,$(sort $(conf_SRC) $(mconf_SRC)))
yann@940
   227
yann@940
   228
# This is not very nice, as they will get rebuild even if (dist)cleaning... :-(
yann@940
   229
# Should look into the Linux kernel Kbuild to see how they do that...
yann@940
   230
# To really make me look into this, keep the annoying "DEP xxx" messages.
yann@940
   231
# Also see the comment for the "%.o: %c" rule below
yann@940
   232
%.d: %.c $(CT_LIB_DIR)/kconfig/kconfig.mk
yann@940
   233
	$(SILENT)if [ ! -d $(obj)/lxdialog ]; then  \
yann@940
   234
	   $(ECHO) "  MKDIR $(obj)";           \
yann@940
   235
	   mkdir -p $(obj)/lxdialog;        \
yann@940
   236
	 fi
yann@940
   237
	@$(ECHO) "  DEP   $@"
yann@943
   238
	$(SILENT)$(HOST_CC) $(CFLAGS) $(EXTRA_CFLAGS) -MM $< |sed -r -e 's|([^:]+.o)( *:+)|$(<:.c=.o) $@\2|;' >$@
yann@940
   239
-include $(DEPS)
yann@940
   240
yann@940
   241
# Each .o must depend on the corresponding .c (obvious, isn't it?),
yann@940
   242
# but *can not* depend on kconfig/, because kconfig can be touched
yann@940
   243
# during the build (who's touching it, btw?) so each .o would be
yann@940
   244
# re-built when they sould not be.
yann@940
   245
# So manually check for presence of $(obj) (ie. kconfig), and only mkdir
yann@940
   246
# if needed. After all, that's not so bad...
yann@940
   247
# mkdir $(obj)/lxdialog, because we need it, and incidentally, that
yann@940
   248
# also creates $(obj).
yann@940
   249
# Also rebuild the object files is the makefile is changed
yann@940
   250
%.o: %.c $(CT_LIB_DIR)/kconfig/kconfig.mk
yann@940
   251
	$(SILENT)if [ ! -d $(obj)/lxdialog ]; then  \
yann@940
   252
	   $(ECHO) "  MKDIR $(obj)";           \
yann@940
   253
	   mkdir -p $(obj)/lxdialog;        \
yann@940
   254
	 fi
yann@940
   255
	@$(ECHO) "  CC    $@"
yann@943
   256
	$(SILENT)$(HOST_CC) $(CFLAGS) $(EXTRA_CFLAGS) -o $@ -c $<
yann@940
   257
yann@940
   258
$(obj)/mconf: $(mconf_OBJ)
yann@940
   259
	@$(ECHO) '  LD    $@'
yann@943
   260
	$(SILENT)$(HOST_CC) $(CFLAGS) $(EXTRA_CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) -o $@ $^
yann@940
   261
yann@940
   262
$(obj)/conf: $(conf_OBJ)
yann@940
   263
	@$(ECHO) '  LD    $@'
yann@943
   264
	$(SILENT)$(HOST_CC) $(CFLAGS) $(EXTRA_CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) -o $@ $^
yann@1
   265
yann@926
   266
#-----------------------------------------------------------
yann@926
   267
# Cleaning up the mess...
yann@926
   268
yann@1
   269
clean::
yann@940
   270
	@$(ECHO) "  CLEAN kconfig"
yann@940
   271
	$(SILENT)rm -f kconfig/{,m}conf $(conf_OBJ) $(mconf_OBJ) $(DEPS)
yann@940
   272
	$(SILENT)rmdir --ignore-fail-on-non-empty kconfig{/lxdialog,} 2>/dev/null || true
yann@940
   273
	@$(ECHO) "  CLEAN config"
yann@940
   274
	$(SILENT)rm -f config 2>/dev/null || true
yann@940
   275
	@$(ECHO) "  CLEAN config.gen"
yann@940
   276
	$(SILENT)rm -rf config.gen