config/config.mk
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Mar 29 00:15:32 2010 +0200 (2010-03-29)
changeset 1864 758d5137fe87
parent 1269 17e37102a037
child 1868 89f16f038b92
permissions -rw-r--r--
scripts/populate: optimise search loop

Curently, populate will iterate over all ELF (shared objects|executables)
to look for missing NEEDED DSOs, adding to the list at every iterations
of the search loop.

Instead of looking again at previously handled ELF files, recursively
resolve every ELf files.

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