From f1c0186b2f0dd8eb14df1de1bda3dd7e79866dcb Mon Sep 17 00:00:00 2001 From: "Yann E. MORIN\"" Date: Sun, 3 Jul 2011 23:02:16 +0200 Subject: config: move multi-line shell commands from Makefile to script Maintaining thos multi-line shell commands in a Makefile rule is a real PITA. Move the two affected rules (build_gen_choice_in and build_gen_menu_in to a shell script. Signed-off-by: "Yann E. MORIN" diff --git a/config/config.mk b/config/config.mk index 4946967..fe45075 100644 --- a/config/config.mk +++ b/config/config.mk @@ -31,10 +31,13 @@ GEN_CONFIG_FILES = config.gen/arch.in \ config.gen/libc.in \ config.gen/debug.in # ... and how to access them: -# Generated files depends on config.mk (this file) because it has the -# functions needed to build the genrated files, and thus they might -# need re-generation if config.mk changes -$(GEN_CONFIG_FILES): config.gen \ +# Generated files depends on the gen_in_frags script because it has the +# functions needed to build the genrated files, and thus they might need +# re-generation if it changes. +# They also depends on config.mk (this file) because it has the dependency +# rules, and thus they might need re-generation if the deps change. +$(GEN_CONFIG_FILES): config.gen \ + $(CT_LIB_DIR)/scripts/gen_in_frags.sh \ $(CT_LIB_DIR)/config/config.mk # Helper entry for the configurators @@ -61,133 +64,29 @@ LIBCS = $(patsubst config/libc/%.in,%,$(LIBC_CONFIG_FILES)) DEBUGS = $(patsubst config/debug/%.in,%,$(DEBUG_CONFIG_FILES)) #----------------------------------------------------------- -# Helper functions to ease building generated config files - -# The function 'build_gen_choice_in' builds a choice-menu of a list of -# components in the given list, also adding source-ing of associazted -# config files: -# $1 : destination file -# $2 : name for the entries family (eg. Architecture, kernel...) -# $3 : prefix for the choice entries (eg. ARCH, KERNEL...) -# $4 : base directory containing config files -# $5 : generate backend conditionals if Y, don't if anything else -# $6 : list of config entries (eg. for architectures: "alpha arm ia64"..., -# and for kernels: "bare-metal linux"...) -# Example to build the kernels generated config file: -# $(call build_gen_choice_in,config.gen/kernel.in,Target OS,KERNEL,config/kernel,$(KERNELS)) -define build_gen_choice_in - @$(ECHO) ' IN $(1)' - $(SILENT)(echo "# $(2) menu"; \ - echo "# Generated file, do not edit!!!"; \ - echo ""; \ - echo "choice GEN_CHOICE_$(3)"; \ - echo " bool"; \ - echo " prompt \"$(2)\""; \ - echo ""; \ - for entry in $(6); do \ - file="$(4)/$${entry}.in"; \ - _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;'); \ - echo "config $(3)_$${_entry}"; \ - echo " bool"; \ - echo " prompt \"$${entry}\""; \ - if [ "$(5)" = "Y" ]; then \ - echo " depends on $(3)_$${_entry}_AVAILABLE"; \ - fi; \ - $(sed) -r -e '/^## depends on /!d; s/^## / /;' $${file} 2>/dev/null; \ - $(sed) -r -e '/^## select /!d; s/^## / /;' $${file} 2>/dev/null; \ - if grep -E '^## help' $${file} >/dev/null 2>&1; then \ - echo " help"; \ - $(sed) -r -e '/^## help ?/!d; s/^## help ?/ /;' $${file} 2>/dev/null;\ - fi; \ - echo ""; \ - done; \ - echo "endchoice"; \ - for entry in $(6); do \ - file="$(4)/$${entry}.in"; \ - _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;'); \ - echo ""; \ - if [ "$(5)" = "Y" ]; then \ - echo "config $(3)_$${_entry}_AVAILABLE"; \ - echo " bool"; \ - echo " default y if BACKEND_$(3) = \"$${entry}\" || BACKEND_$(3) = \"\" || ! BACKEND"; \ - fi; \ - echo "if $(3)_$${_entry}"; \ - echo "config $(3)"; \ - echo " default \"$${entry}\" if $(3)_$${_entry}"; \ - echo "source \"$${file}\""; \ - echo "endif"; \ - done; \ - ) >$(1) - $(SILENT)(echo "# $(2) second part options"; \ - echo "# Generated file, do not edit!!!"; \ - for entry in $(6); do \ - file="$(4)/$${entry}.in"; \ - _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;'); \ - if [ -f "$${file}.2" ]; then \ - echo ""; \ - echo "if $(3)_$${_entry}"; \ - echo "comment \"$${entry} other options\""; \ - echo "source \"$${file}.2\""; \ - echo "endif"; \ - fi; \ - done; \ - ) >$(1).2 -endef - -# The function 'build_gen_menu_in' builds a menuconfig for each component in -# the given list, source-ing the associated files conditionnaly: -# $1 : destination file -# $2 : name of entries family (eg. Tools, Debug...) -# $3 : prefix for the menu entries (eg. DEBUG) -# $4 : base directory containing config files -# $5 : list of config entries (eg. for debug: "dmalloc duma gdb"...) -# Example to build the generated debug config file: -# $(call build_gen_menu_in,config.gen/debug.in,Debug,DEBUG,config/debug,$(DEBUGS)) -define build_gen_menu_in - @$(ECHO) ' IN $(1)' - $(SILENT)(echo "# $(2) facilities menu"; \ - echo "# Generated file, do not edit!!!"; \ - echo ""; \ - for entry in $(5); do \ - file="$(4)/$${entry}.in"; \ - _entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;'); \ - echo "menuconfig $(3)_$${_entry}"; \ - echo " bool"; \ - echo " prompt \"$${entry}\""; \ - $(sed) -r -e '/^## depends on /!d; s/^## / /;' $${file} 2>/dev/null; \ - $(sed) -r -e '/^## select /!d; s/^## / /;' $${file} 2>/dev/null; \ - if grep -E '^## help' $${file} >/dev/null 2>&1; then \ - echo " help"; \ - $(sed) -r -e '/^## help ?/!d; s/^## help ?/ /;' $${file} 2>/dev/null;\ - fi; \ - echo ""; \ - echo "if $(3)_$${_entry}"; \ - echo "source \"$${file}\""; \ - echo "endif"; \ - echo ""; \ - done; \ - ) >$(1) -endef - -#----------------------------------------------------------- # The rules for the generated config files # WARNING! If a .in file disapears between two runs, that will NOT be detected! config.gen/arch.in: $(ARCH_CONFIG_FILES) $(ARCH_CONFIG_FILES_2) - $(call build_gen_choice_in,$@,Target Architecture,ARCH,config/arch,Y,$(ARCHS)) + @$(ECHO) ' IN $(@)' + $(SILENT)$(CT_LIB_DIR)/scripts/gen_in_frags.sh choice "$@" "Target Architecture" "ARCH" "config/arch" "Y" $(ARCHS) config.gen/kernel.in: $(KERNEL_CONFIG_FILES) $(KERNEL_CONFIG_FILES_2) - $(call build_gen_choice_in,$@,Target OS,KERNEL,config/kernel,Y,$(KERNELS)) + @$(ECHO) ' IN $(@)' + $(SILENT)$(CT_LIB_DIR)/scripts/gen_in_frags.sh choice "$@" "Target OS" "KERNEL" "config/kernel" "Y" $(KERNELS) config.gen/cc.in: $(CC_CONFIG_FILES) $(CC_CONFIG_FILES_2) - $(call build_gen_choice_in,$@,C compiler,CC,config/cc,,$(CCS)) + @$(ECHO) ' IN $(@)' + $(SILENT)$(CT_LIB_DIR)/scripts/gen_in_frags.sh choice "$@" "C compiler" "CC" "config/cc" "N" $(CCS) config.gen/libc.in: $(LIBC_CONFIG_FILES) $(LIBC_CONFIG_FILES_2) - $(call build_gen_choice_in,$@,C library,LIBC,config/libc,Y,$(LIBCS)) + @$(ECHO) ' IN $(@)' + $(SILENT)$(CT_LIB_DIR)/scripts/gen_in_frags.sh choice "$@" "C library" "LIBC" "config/libc" "Y" $(LIBCS) config.gen/debug.in: $(DEBUG_CONFIG_FILES) - $(call build_gen_menu_in,$@,Debug,DEBUG,config/debug,$(DEBUGS)) + @$(ECHO) ' IN $(@)' + $(SILENT)$(CT_LIB_DIR)/scripts/gen_in_frags.sh menu "$@" "Debug facilities" "DEBUG" "config/debug" $(DEBUGS) #----------------------------------------------------------- # Cleaning up the mess... diff --git a/scripts/gen_in_frags.sh b/scripts/gen_in_frags.sh new file mode 100755 index 0000000..2451495 --- /dev/null +++ b/scripts/gen_in_frags.sh @@ -0,0 +1,158 @@ +#!/bin/sh +set -e + +# This scripts generates either a choice or a menuconfig +# with the specified entries. +# +# Usage: +# generate a choice: +# gen_in_frags.sh choice