config/config.mk
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Jun 08 23:26:54 2010 +0200 (2010-06-08)
changeset 1976 2d90ec981ba3
parent 1878 2c577664a23d
child 2444 896cb0d36c1a
permissions -rw-r--r--
config: add support for a second part of the generated choices

Some components have configuration options that can depend on
generic options, so they should go below those.

uClibc for example:
- has its own options (wchar...)
- uses the generic options (threads...)
- if linuxthreads chosen, offers two impls

So we need to be able to split the components options in 2,
one part that is above the generic options, and one part that
ends up below the generic options.
yann@1
     1
# ===========================================================================
yann@945
     2
# crosstool-NG genererated config files
yann@1
     3
# These targets are used from top-level makefile
yann@1
     4
yann@926
     5
#-----------------------------------------------------------
yann@1001
     6
# List all config files, wether sourced or generated
yann@97
     7
yann@945
     8
# The top-level config file to be used be configurators
yann@945
     9
KCONFIG_TOP = config/config.in
yann@945
    10
yann@926
    11
# Build the list of all source config files
yann@1976
    12
STATIC_CONFIG_FILES = $(patsubst $(CT_LIB_DIR)/%,%,$(shell find $(CT_LIB_DIR)/config -type f \( -name '*.in' -o -name '*.in.2' \) 2>/dev/null))
yann@926
    13
# ... and how to access them:
yann@926
    14
$(STATIC_CONFIG_FILES): config
yann@88
    15
yann@926
    16
# Build a list of per-component-type source config files
yann@1976
    17
ARCH_CONFIG_FILES     = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/arch/*.in))
yann@1976
    18
ARCH_CONFIG_FILES_2   = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/arch/*.in.2))
yann@1976
    19
KERNEL_CONFIG_FILES   = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/kernel/*.in))
yann@1976
    20
KERNEL_CONFIG_FILES_2 = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/kernel/*.in.2))
yann@1976
    21
CC_CONFIG_FILES       = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/cc/*.in))
yann@1976
    22
CC_CONFIG_FILES_2     = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/cc/*.in.2))
yann@1976
    23
LIBC_CONFIG_FILES     = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/libc/*.in))
yann@1976
    24
LIBC_CONFIG_FILES_2   = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/libc/*.in.2))
yann@1976
    25
DEBUG_CONFIG_FILES    = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/debug/*.in))
yann@182
    26
yann@926
    27
# Build the list of generated config files
yann@926
    28
GEN_CONFIG_FILES = config.gen/arch.in     \
yann@926
    29
                   config.gen/kernel.in   \
yann@926
    30
                   config.gen/cc.in       \
yann@926
    31
                   config.gen/libc.in     \
yann@926
    32
                   config.gen/debug.in
yann@926
    33
# ... and how to access them:
yann@945
    34
# Generated files depends on config.mk (this file) because it has the
yann@926
    35
# functions needed to build the genrated files, and thus they might
yann@945
    36
# need re-generation if config.mk changes
yann@926
    37
$(GEN_CONFIG_FILES): config.gen                         \
yann@945
    38
                     $(CT_LIB_DIR)/config/config.mk
yann@182
    39
yann@945
    40
# Helper entry for the configurators
yann@945
    41
PHONY += config_files
yann@945
    42
config_files: $(STATIC_CONFIG_FILES) $(GEN_CONFIG_FILES)
yann@182
    43
yann@926
    44
# Where to access to the source config files from
yann@926
    45
config:
yann@940
    46
	@$(ECHO) "  LN    config"
yann@940
    47
	$(SILENT)ln -s $(CT_LIB_DIR)/config config
yann@926
    48
yann@926
    49
# Where to store the generated config files into
yann@926
    50
config.gen:
yann@940
    51
	@$(ECHO) "  MKDIR config.gen"
yann@940
    52
	$(SILENT)mkdir -p config.gen
yann@926
    53
yann@926
    54
#-----------------------------------------------------------
yann@926
    55
# Build list of per-component-type items to easily build generated files
yann@926
    56
yann@926
    57
ARCHS   = $(patsubst config/arch/%.in,%,$(ARCH_CONFIG_FILES))
yann@926
    58
KERNELS = $(patsubst config/kernel/%.in,%,$(KERNEL_CONFIG_FILES))
yann@926
    59
CCS     = $(patsubst config/cc/%.in,%,$(CC_CONFIG_FILES))
yann@926
    60
LIBCS   = $(patsubst config/libc/%.in,%,$(LIBC_CONFIG_FILES))
yann@926
    61
DEBUGS  = $(patsubst config/debug/%.in,%,$(DEBUG_CONFIG_FILES))
yann@926
    62
yann@926
    63
#-----------------------------------------------------------
yann@926
    64
# Helper functions to ease building generated config files
yann@926
    65
yann@926
    66
# The function 'build_gen_choice_in' builds a choice-menu of a list of
yann@926
    67
# components in the given list, also adding source-ing of associazted
yann@926
    68
# config files:
yann@912
    69
# $1 : destination file
yann@912
    70
# $2 : name for the entries family (eg. Architecture, kernel...)
yann@912
    71
# $3 : prefix for the choice entries (eg. ARCH, KERNEL...)
yann@912
    72
# $4 : base directory containing config files
yann@1868
    73
# $5 : generate backend conditionals if Y, don't if anything else
yann@1868
    74
# $6 : list of config entries (eg. for architectures: "alpha arm ia64"...,
yann@912
    75
#      and for kernels: "bare-metal linux"...)
yann@912
    76
# Example to build the kernels generated config file:
yann@920
    77
# $(call build_gen_choice_in,config.gen/kernel.in,Target OS,KERNEL,config/kernel,$(KERNELS))
yann@912
    78
define build_gen_choice_in
yann@940
    79
	@$(ECHO) '  IN    $(1)'
yann@1159
    80
	$(SILENT)(echo "# $(2) menu";                                           \
yann@1159
    81
	  echo "# Generated file, do not edit!!!";                              \
yann@1159
    82
	  echo "";                                                              \
yann@1159
    83
	  echo "choice";                                                        \
yann@1159
    84
	  echo "    bool";                                                      \
yann@1159
    85
	  echo "    prompt \"$(2)\"";                                           \
yann@1159
    86
	  echo "";                                                              \
yann@1868
    87
	  for entry in $(6); do                                                 \
yann@1159
    88
	    file="$(4)/$${entry}.in";                                           \
yann@1159
    89
	    _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;');        \
yann@1159
    90
	    echo "config $(3)_$${_entry}";                                      \
yann@1159
    91
	    echo "    bool";                                                    \
yann@1269
    92
	    echo "    prompt \"$${entry}\"";                                    \
yann@1269
    93
	    dep_val=$$($(grep) -E '^# depends on ' $${file} 2>/dev/null);       \
yann@1269
    94
	    if [ -n "$${dep_val}" ]; then                                       \
yann@1269
    95
	      echo "    $${dep_val#\# }";                                       \
yann@1159
    96
	    fi;                                                                 \
yann@1868
    97
	    if [ "$(5)" = "Y" ]; then                                           \
yann@1877
    98
	      echo "    depends on $(3)_$${_entry}_AVAILABLE";                  \
yann@1868
    99
	    fi;                                                                 \
yann@1256
   100
	    echo "";                                                            \
yann@1159
   101
	  done;                                                                 \
yann@1159
   102
	  echo "endchoice";                                                     \
yann@1868
   103
	  for entry in $(6); do                                                 \
yann@1159
   104
	    file="$(4)/$${entry}.in";                                           \
yann@1159
   105
	    _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;');        \
yann@1159
   106
	    echo "";                                                            \
yann@1877
   107
	    if [ "$(5)" = "Y" ]; then                                                                           \
yann@1877
   108
	      echo "config $(3)_$${_entry}_AVAILABLE";                                                          \
yann@1877
   109
	      echo "    bool";                                                                                  \
yann@1877
   110
	      echo "    default n if ! ( BACKEND_$(3) = \"$${entry}\" || BACKEND_$(3) = \"\" || ! BACKEND )";   \
yann@1877
   111
	      echo "    default y if BACKEND_$(3) = \"$${entry}\" || BACKEND_$(3) = \"\" || ! BACKEND";         \
yann@1877
   112
	    fi;                                                                                                 \
yann@1159
   113
	    echo "if $(3)_$${_entry}";                                          \
yann@1159
   114
	    echo "config $(3)";                                                 \
yann@1159
   115
	    echo "    default \"$${entry}\" if $(3)_$${_entry}";                \
yann@1870
   116
	    echo "source \"$${file}\"";                                         \
yann@1159
   117
	    echo "endif";                                                       \
yann@1159
   118
	  done;                                                                 \
yann@1178
   119
	  echo "";                                                              \
yann@1178
   120
	  for file in $(wildcard $(4)/*.in-common); do                          \
yann@1870
   121
	    echo "source \"$${file}\"";                                         \
yann@1178
   122
	  done;                                                                 \
yann@912
   123
	 ) >$(1)
yann@1976
   124
	$(SILENT)(echo "# $(2) second part options";                            \
yann@1976
   125
	  echo "# Generated file, do not edit!!!";                              \
yann@1976
   126
	  for entry in $(6); do                                                 \
yann@1976
   127
	    file="$(4)/$${entry}.in";                                           \
yann@1976
   128
	    _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;');        \
yann@1976
   129
	    if [ -f "$${file}.2" ]; then                                        \
yann@1976
   130
	      echo "";                                                          \
yann@1976
   131
	      echo "if $(3)_$${_entry}";                                        \
yann@1976
   132
	      echo "comment \"$${entry} other options\"";                       \
yann@1976
   133
	      echo "source \"$${file}.2\"";                                     \
yann@1976
   134
	      echo "endif";                                                     \
yann@1976
   135
	    fi;                                                                 \
yann@1976
   136
	  done;                                                                 \
yann@1976
   137
	 ) >$(1).2
yann@912
   138
endef
yann@628
   139
yann@926
   140
# The function 'build_gen_menu_in' builds a menuconfig for each component in
yann@926
   141
# the given list, source-ing the associated files conditionnaly:
yann@916
   142
# $1 : destination file
yann@916
   143
# $2 : name of entries family (eg. Tools, Debug...)
yann@1854
   144
# $3 : prefix for the menu entries (eg. DEBUG)
yann@916
   145
# $4 : base directory containing config files
yann@1854
   146
# $5 : list of config entries (eg. for debug: "dmalloc duma gdb"...)
yann@1854
   147
# Example to build the generated debug config file:
yann@1854
   148
# $(call build_gen_menu_in,config.gen/debug.in,Debug,DEBUG,config/debug,$(DEBUGS))
yann@916
   149
define build_gen_menu_in
yann@940
   150
	@$(ECHO) '  IN    $(1)'
yann@1159
   151
	$(SILENT)(echo "# $(2) facilities menu";                                \
yann@1159
   152
	  echo "# Generated file, do not edit!!!";                              \
yann@1159
   153
	  echo "";                                                              \
yann@1159
   154
	  for entry in $(5); do                                                 \
yann@1159
   155
	    file="$(4)/$${entry}.in";                                           \
yann@1159
   156
	    _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;');        \
yann@1159
   157
	    echo "menuconfig $(3)_$${_entry}";                                  \
yann@1159
   158
	    echo "    bool";                                                    \
yann@1269
   159
	    echo "    prompt \"$${entry}\"";                                    \
yann@1269
   160
	    dep_val=$$($(grep) -E '^# depends on ' $${file} 2>/dev/null);       \
yann@1269
   161
	    if [ -n "$${dep_val}" ]; then                                       \
yann@1269
   162
	      echo "    $${dep_val#\# }";                                       \
yann@1159
   163
	    fi;                                                                 \
yann@1159
   164
	    echo "if $(3)_$${_entry}";                                          \
yann@1870
   165
	    echo "source \"$${file}\"";                                         \
yann@1159
   166
	    echo "endif";                                                       \
yann@1159
   167
	    echo "";                                                            \
yann@1159
   168
	  done;                                                                 \
yann@916
   169
	 ) >$(1)
yann@916
   170
endef
yann@916
   171
yann@926
   172
#-----------------------------------------------------------
yann@926
   173
# The rules for the generated config files
yann@916
   174
yann@1976
   175
# WARNING! If a .in file disapears between two runs, that will NOT be detected!
yann@1976
   176
yann@1976
   177
config.gen/arch.in: $(ARCH_CONFIG_FILES) $(ARCH_CONFIG_FILES_2)
yann@1868
   178
	$(call build_gen_choice_in,$@,Target Architecture,ARCH,config/arch,Y,$(ARCHS))
yann@861
   179
yann@1976
   180
config.gen/kernel.in: $(KERNEL_CONFIG_FILES) $(KERNEL_CONFIG_FILES_2)
yann@1868
   181
	$(call build_gen_choice_in,$@,Target OS,KERNEL,config/kernel,Y,$(KERNELS))
yann@182
   182
yann@1976
   183
config.gen/cc.in: $(CC_CONFIG_FILES) $(CC_CONFIG_FILES_2)
yann@1868
   184
	$(call build_gen_choice_in,$@,C compiler,CC,config/cc,,$(CCS))
yann@926
   185
yann@1976
   186
config.gen/libc.in: $(LIBC_CONFIG_FILES) $(LIBC_CONFIG_FILES_2)
yann@1878
   187
	$(call build_gen_choice_in,$@,C library,LIBC,config/libc,Y,$(LIBCS))
yann@926
   188
yann@926
   189
config.gen/debug.in: $(DEBUG_CONFIG_FILES)
yann@926
   190
	$(call build_gen_menu_in,$@,Debug,DEBUG,config/debug,$(DEBUGS))
yann@926
   191
yann@926
   192
#-----------------------------------------------------------
yann@926
   193
# Cleaning up the mess...
yann@926
   194
yann@1
   195
clean::
yann@940
   196
	@$(ECHO) "  CLEAN config"
yann@940
   197
	$(SILENT)rm -f config 2>/dev/null || true
yann@940
   198
	@$(ECHO) "  CLEAN config.gen"
yann@940
   199
	$(SILENT)rm -rf config.gen