config/config.mk
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed May 18 23:00:46 2011 +0200 (2011-05-18)
changeset 2467 200836977ce6
parent 2445 7000b634ba04
child 2484 d1a8c2ae7946
permissions -rw-r--r--
config: rename variables that are arrays

Make it explicit that a variable is an array bu the name of the variable.
It will be used later when .config gets munged to allow both multiple
arguments and arguments with spaces at the same time to be passed from the
configuration down to the build scripts.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
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@2444
    83
	  echo "choice GEN_CHOICE_$(3)";                                        \
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@1868
    93
	    if [ "$(5)" = "Y" ]; then                                           \
yann@1877
    94
	      echo "    depends on $(3)_$${_entry}_AVAILABLE";                  \
yann@1868
    95
	    fi;                                                                 \
yann@2444
    96
	    sed -r -e '/^## depends on /!d; s/^## /    /;' $${file} 2>/dev/null;\
yann@2444
    97
	    sed -r -e '/^## select /!d; s/^## /    /;' $${file} 2>/dev/null;    \
yann@2445
    98
	    if grep -E '^## help' $${file} >/dev/null 2>&1; then                        \
yann@2445
    99
	      echo "    help";                                                          \
yann@2445
   100
	      sed -r -e '/^## help ?/!d; s/^## help ?/      /;' $${file} 2>/dev/null;   \
yann@2445
   101
	    fi;                                                                         \
yann@1256
   102
	    echo "";                                                            \
yann@1159
   103
	  done;                                                                 \
yann@1159
   104
	  echo "endchoice";                                                     \
yann@1868
   105
	  for entry in $(6); do                                                 \
yann@1159
   106
	    file="$(4)/$${entry}.in";                                           \
yann@1159
   107
	    _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;');        \
yann@1159
   108
	    echo "";                                                            \
yann@1877
   109
	    if [ "$(5)" = "Y" ]; then                                                                           \
yann@1877
   110
	      echo "config $(3)_$${_entry}_AVAILABLE";                                                          \
yann@1877
   111
	      echo "    bool";                                                                                  \
yann@1877
   112
	      echo "    default n if ! ( BACKEND_$(3) = \"$${entry}\" || BACKEND_$(3) = \"\" || ! BACKEND )";   \
yann@1877
   113
	      echo "    default y if BACKEND_$(3) = \"$${entry}\" || BACKEND_$(3) = \"\" || ! BACKEND";         \
yann@1877
   114
	    fi;                                                                                                 \
yann@1159
   115
	    echo "if $(3)_$${_entry}";                                          \
yann@1159
   116
	    echo "config $(3)";                                                 \
yann@1159
   117
	    echo "    default \"$${entry}\" if $(3)_$${_entry}";                \
yann@1870
   118
	    echo "source \"$${file}\"";                                         \
yann@1159
   119
	    echo "endif";                                                       \
yann@1159
   120
	  done;                                                                 \
yann@912
   121
	 ) >$(1)
yann@1976
   122
	$(SILENT)(echo "# $(2) second part options";                            \
yann@1976
   123
	  echo "# Generated file, do not edit!!!";                              \
yann@1976
   124
	  for entry in $(6); do                                                 \
yann@1976
   125
	    file="$(4)/$${entry}.in";                                           \
yann@1976
   126
	    _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;');        \
yann@1976
   127
	    if [ -f "$${file}.2" ]; then                                        \
yann@1976
   128
	      echo "";                                                          \
yann@1976
   129
	      echo "if $(3)_$${_entry}";                                        \
yann@1976
   130
	      echo "comment \"$${entry} other options\"";                       \
yann@1976
   131
	      echo "source \"$${file}.2\"";                                     \
yann@1976
   132
	      echo "endif";                                                     \
yann@1976
   133
	    fi;                                                                 \
yann@1976
   134
	  done;                                                                 \
yann@1976
   135
	 ) >$(1).2
yann@912
   136
endef
yann@628
   137
yann@926
   138
# The function 'build_gen_menu_in' builds a menuconfig for each component in
yann@926
   139
# the given list, source-ing the associated files conditionnaly:
yann@916
   140
# $1 : destination file
yann@916
   141
# $2 : name of entries family (eg. Tools, Debug...)
yann@1854
   142
# $3 : prefix for the menu entries (eg. DEBUG)
yann@916
   143
# $4 : base directory containing config files
yann@1854
   144
# $5 : list of config entries (eg. for debug: "dmalloc duma gdb"...)
yann@1854
   145
# Example to build the generated debug config file:
yann@1854
   146
# $(call build_gen_menu_in,config.gen/debug.in,Debug,DEBUG,config/debug,$(DEBUGS))
yann@916
   147
define build_gen_menu_in
yann@940
   148
	@$(ECHO) '  IN    $(1)'
yann@1159
   149
	$(SILENT)(echo "# $(2) facilities menu";                                \
yann@1159
   150
	  echo "# Generated file, do not edit!!!";                              \
yann@1159
   151
	  echo "";                                                              \
yann@1159
   152
	  for entry in $(5); do                                                 \
yann@1159
   153
	    file="$(4)/$${entry}.in";                                           \
yann@1159
   154
	    _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;');        \
yann@1159
   155
	    echo "menuconfig $(3)_$${_entry}";                                  \
yann@1159
   156
	    echo "    bool";                                                    \
yann@1269
   157
	    echo "    prompt \"$${entry}\"";                                    \
yann@2444
   158
	    sed -r -e '/^## depends on /!d; s/^## /    /;' $${file} 2>/dev/null;\
yann@2444
   159
	    sed -r -e '/^## select /!d; s/^## /    /;' $${file} 2>/dev/null;    \
yann@2445
   160
	    if grep -E '^## help' $${file} >/dev/null 2>&1; then                        \
yann@2445
   161
	      echo "    help";                                                          \
yann@2445
   162
	      sed -r -e '/^## help ?/!d; s/^## help ?/      /;' $${file} 2>/dev/null;   \
yann@2445
   163
	    fi;                                                                         \
yann@2444
   164
	    echo "";                                                            \
yann@1159
   165
	    echo "if $(3)_$${_entry}";                                          \
yann@1870
   166
	    echo "source \"$${file}\"";                                         \
yann@1159
   167
	    echo "endif";                                                       \
yann@1159
   168
	    echo "";                                                            \
yann@1159
   169
	  done;                                                                 \
yann@916
   170
	 ) >$(1)
yann@916
   171
endef
yann@916
   172
yann@926
   173
#-----------------------------------------------------------
yann@926
   174
# The rules for the generated config files
yann@916
   175
yann@1976
   176
# WARNING! If a .in file disapears between two runs, that will NOT be detected!
yann@1976
   177
yann@1976
   178
config.gen/arch.in: $(ARCH_CONFIG_FILES) $(ARCH_CONFIG_FILES_2)
yann@1868
   179
	$(call build_gen_choice_in,$@,Target Architecture,ARCH,config/arch,Y,$(ARCHS))
yann@861
   180
yann@1976
   181
config.gen/kernel.in: $(KERNEL_CONFIG_FILES) $(KERNEL_CONFIG_FILES_2)
yann@1868
   182
	$(call build_gen_choice_in,$@,Target OS,KERNEL,config/kernel,Y,$(KERNELS))
yann@182
   183
yann@1976
   184
config.gen/cc.in: $(CC_CONFIG_FILES) $(CC_CONFIG_FILES_2)
yann@1868
   185
	$(call build_gen_choice_in,$@,C compiler,CC,config/cc,,$(CCS))
yann@926
   186
yann@1976
   187
config.gen/libc.in: $(LIBC_CONFIG_FILES) $(LIBC_CONFIG_FILES_2)
yann@1878
   188
	$(call build_gen_choice_in,$@,C library,LIBC,config/libc,Y,$(LIBCS))
yann@926
   189
yann@926
   190
config.gen/debug.in: $(DEBUG_CONFIG_FILES)
yann@926
   191
	$(call build_gen_menu_in,$@,Debug,DEBUG,config/debug,$(DEBUGS))
yann@926
   192
yann@926
   193
#-----------------------------------------------------------
yann@926
   194
# Cleaning up the mess...
yann@926
   195
yann@1
   196
clean::
yann@940
   197
	@$(ECHO) "  CLEAN config"
yann@940
   198
	$(SILENT)rm -f config 2>/dev/null || true
yann@940
   199
	@$(ECHO) "  CLEAN config.gen"
yann@940
   200
	$(SILENT)rm -rf config.gen