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