config/config.mk
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Aug 30 19:33:48 2009 +0200 (2009-08-30)
changeset 1497 1b90f0b34c80
parent 1256 acf1944ef6a4
child 1854 02b74bd4373f
permissions -rw-r--r--
config: move down companion libraries sub-menu

Move the companion libraries sub-menu down the main menu.
That way, the user does not need to go back and forth in the menu
to change options set by the different components that select the
companion libraries (binutils, gcc, gdb).
     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' 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 KERNEL_CONFIG_FILES = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/kernel/*.in))
    19 CC_CONFIG_FILES     = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/cc/*.in))
    20 LIBC_CONFIG_FILES   = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/libc/*.in))
    21 DEBUG_CONFIG_FILES  = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/debug/*.in))
    22 TOOL_CONFIG_FILES   = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/tools/*.in))
    23 
    24 # Build the list of generated config files
    25 GEN_CONFIG_FILES = config.gen/arch.in     \
    26                    config.gen/kernel.in   \
    27                    config.gen/cc.in       \
    28                    config.gen/libc.in     \
    29                    config.gen/tools.in    \
    30                    config.gen/debug.in
    31 # ... and how to access them:
    32 # Generated files depends on config.mk (this file) because it has the
    33 # functions needed to build the genrated files, and thus they might
    34 # need re-generation if config.mk changes
    35 $(GEN_CONFIG_FILES): config.gen                         \
    36                      $(CT_LIB_DIR)/config/config.mk
    37 
    38 # Helper entry for the configurators
    39 PHONY += config_files
    40 config_files: $(STATIC_CONFIG_FILES) $(GEN_CONFIG_FILES)
    41 
    42 # Where to access to the source config files from
    43 config:
    44 	@$(ECHO) "  LN    config"
    45 	$(SILENT)ln -s $(CT_LIB_DIR)/config config
    46 
    47 # Where to store the generated config files into
    48 config.gen:
    49 	@$(ECHO) "  MKDIR config.gen"
    50 	$(SILENT)mkdir -p config.gen
    51 
    52 #-----------------------------------------------------------
    53 # Build list of per-component-type items to easily build generated files
    54 
    55 ARCHS   = $(patsubst config/arch/%.in,%,$(ARCH_CONFIG_FILES))
    56 KERNELS = $(patsubst config/kernel/%.in,%,$(KERNEL_CONFIG_FILES))
    57 CCS     = $(patsubst config/cc/%.in,%,$(CC_CONFIG_FILES))
    58 LIBCS   = $(patsubst config/libc/%.in,%,$(LIBC_CONFIG_FILES))
    59 DEBUGS  = $(patsubst config/debug/%.in,%,$(DEBUG_CONFIG_FILES))
    60 TOOLS   = $(patsubst config/tools/%.in,%,$(TOOL_CONFIG_FILES))
    61 
    62 #-----------------------------------------------------------
    63 # Helper functions to ease building generated config files
    64 
    65 # The function 'build_gen_choice_in' builds a choice-menu of a list of
    66 # components in the given list, also adding source-ing of associazted
    67 # config files:
    68 # $1 : destination file
    69 # $2 : name for the entries family (eg. Architecture, kernel...)
    70 # $3 : prefix for the choice entries (eg. ARCH, KERNEL...)
    71 # $4 : base directory containing config files
    72 # $5 : list of config entries (eg. for architectures: "alpha arm ia64"...,
    73 #      and for kernels: "bare-metal linux"...)
    74 # Example to build the kernels generated config file:
    75 # $(call build_gen_choice_in,config.gen/kernel.in,Target OS,KERNEL,config/kernel,$(KERNELS))
    76 define build_gen_choice_in
    77 	@$(ECHO) '  IN    $(1)'
    78 	$(SILENT)(echo "# $(2) menu";                                           \
    79 	  echo "# Generated file, do not edit!!!";                              \
    80 	  echo "";                                                              \
    81 	  echo "choice";                                                        \
    82 	  echo "    bool";                                                      \
    83 	  echo "    prompt \"$(2)\"";                                           \
    84 	  echo "";                                                              \
    85 	  for entry in $(5); do                                                 \
    86 	    file="$(4)/$${entry}.in";                                           \
    87 	    _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;');        \
    88 	    echo "config $(3)_$${_entry}";                                      \
    89 	    echo "    bool";                                                    \
    90 	    echo "    prompt \"$${entry}\"";                                    \
    91 	    dep_val=$$($(grep) -E '^# depends on ' $${file} 2>/dev/null);       \
    92 	    if [ -n "$${dep_val}" ]; then                                       \
    93 	      echo "    $${dep_val#\# }";                                       \
    94 	    fi;                                                                 \
    95 	    echo "";                                                            \
    96 	  done;                                                                 \
    97 	  echo "endchoice";                                                     \
    98 	  for entry in $(5); do                                                 \
    99 	    file="$(4)/$${entry}.in";                                           \
   100 	    _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;');        \
   101 	    echo "";                                                            \
   102 	    echo "if $(3)_$${_entry}";                                          \
   103 	    echo "config $(3)";                                                 \
   104 	    echo "    default \"$${entry}\" if $(3)_$${_entry}";                \
   105 	    echo "source $${file}";                                             \
   106 	    echo "endif";                                                       \
   107 	  done;                                                                 \
   108 	  echo "";                                                              \
   109 	  for file in $(wildcard $(4)/*.in-common); do                          \
   110 	    echo "source $${file}";                                             \
   111 	  done;                                                                 \
   112 	 ) >$(1)
   113 endef
   114 
   115 # The function 'build_gen_menu_in' builds a menuconfig for each component in
   116 # the given list, source-ing the associated files conditionnaly:
   117 # $1 : destination file
   118 # $2 : name of entries family (eg. Tools, Debug...)
   119 # $3 : prefix for the menu entries (eg. TOOL, DEBUG)
   120 # $4 : base directory containing config files
   121 # $5 : list of config entries (eg. for tools: "libelf sstrip"..., and for
   122 #      debug: "dmalloc duma gdb"...)
   123 # Example to build the tools generated config file:
   124 # $(call build_gen_menu_in,config.gen/tools.in,Tools,TOOL,config/tools,$(TOOLS))
   125 define build_gen_menu_in
   126 	@$(ECHO) '  IN    $(1)'
   127 	$(SILENT)(echo "# $(2) facilities menu";                                \
   128 	  echo "# Generated file, do not edit!!!";                              \
   129 	  echo "";                                                              \
   130 	  for entry in $(5); do                                                 \
   131 	    file="$(4)/$${entry}.in";                                           \
   132 	    _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;');        \
   133 	    echo "menuconfig $(3)_$${_entry}";                                  \
   134 	    echo "    bool";                                                    \
   135 	    echo "    prompt \"$${entry}\"";                                    \
   136 	    dep_val=$$($(grep) -E '^# depends on ' $${file} 2>/dev/null);       \
   137 	    if [ -n "$${dep_val}" ]; then                                       \
   138 	      echo "    $${dep_val#\# }";                                       \
   139 	    fi;                                                                 \
   140 	    echo "if $(3)_$${_entry}";                                          \
   141 	    echo "source $${file}";                                             \
   142 	    echo "endif";                                                       \
   143 	    echo "";                                                            \
   144 	  done;                                                                 \
   145 	 ) >$(1)
   146 endef
   147 
   148 #-----------------------------------------------------------
   149 # The rules for the generated config files
   150 
   151 config.gen/arch.in: $(ARCH_CONFIG_FILES)
   152 	$(call build_gen_choice_in,$@,Target Architecture,ARCH,config/arch,$(ARCHS))
   153 
   154 config.gen/kernel.in: $(KERNEL_CONFIG_FILES)
   155 	$(call build_gen_choice_in,$@,Target OS,KERNEL,config/kernel,$(KERNELS))
   156 
   157 config.gen/cc.in: $(CC_CONFIG_FILES)
   158 	$(call build_gen_choice_in,$@,C compiler,CC,config/cc,$(CCS))
   159 
   160 config.gen/libc.in: $(LIBC_CONFIG_FILES)
   161 	$(call build_gen_choice_in,$@,C library,LIBC,config/libc,$(LIBCS))
   162 
   163 config.gen/tools.in: $(TOOL_CONFIG_FILES)
   164 	$(call build_gen_menu_in,$@,Tools,TOOL,config/tools,$(TOOLS))
   165 
   166 config.gen/debug.in: $(DEBUG_CONFIG_FILES)
   167 	$(call build_gen_menu_in,$@,Debug,DEBUG,config/debug,$(DEBUGS))
   168 
   169 #-----------------------------------------------------------
   170 # Cleaning up the mess...
   171 
   172 clean::
   173 	@$(ECHO) "  CLEAN config"
   174 	$(SILENT)rm -f config 2>/dev/null || true
   175 	@$(ECHO) "  CLEAN config.gen"
   176 	$(SILENT)rm -rf config.gen