samples/samples.mk
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Sun May 11 23:43:52 2014 +0200 (2014-05-11)
changeset 3320 78af1c99bc6d
parent 3168 9b991363c01c
child 3325 069f43a215cc
permissions -rw-r--r--
scripts/functions: add target_endian_le and target_endian_be

We currently define target_endian_el and target_endian_eb to be the
tuple extension depending on endianness, defined to be respectively
'el' or 'eb' according to the endianness.

Some architecture do not use 'el' or 'eb', but use 'le' or 'be'.

Provide that as well, as two new variables: target_endian_le and
target_endian_be.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Cody P Schafer <dev@codyps.com>
     1 # Makefile to manage samples
     2 
     3 # ----------------------------------------------------------
     4 # Build the list of available samples
     5 CT_TOP_SAMPLES := $(patsubst $(CT_TOP_DIR)/samples/%/crosstool.config,%,$(wildcard $(CT_TOP_DIR)/samples/*/crosstool.config))
     6 CT_LIB_SAMPLES := $(filter-out $(CT_TOP_SAMPLES),$(patsubst $(CT_LIB_DIR)/samples/%/crosstool.config,%,$(wildcard $(CT_LIB_DIR)/samples/*/crosstool.config)))
     7 CT_SAMPLES := $(shell echo $(sort $(CT_TOP_SAMPLES) $(CT_LIB_SAMPLES))  \
     8                       |$(sed) -r -e 's/ /\n/g;'                         \
     9                       |$(sed) -r -e 's/(.*),(.*)/\2,\1/;'               \
    10                       |sort                                             \
    11                       |$(sed) -r -e 's/(.*),(.*)/\2,\1/;'               \
    12                )
    13 
    14 # ----------------------------------------------------------
    15 # This part deals with the samples help entries
    16 
    17 help-config::
    18 	@echo  '  saveconfig         - Save current config as a preconfigured target'
    19 
    20 help-samples::
    21 	@echo  '  list-samples       - prints the list of all samples (for scripting)'
    22 	@echo  '  show-<sample>      - show a brief overview of <sample> (list with list-samples)'
    23 	@echo  '  <sample>           - preconfigure crosstool-NG with <sample> (list with list-samples)'
    24 	@echo  '  build-all[.#]      - Build *all* samples (list with list-samples) and install in'
    25 	@echo  '                       $${CT_PREFIX} (which you must set)'
    26 
    27 help-distrib::
    28 	@echo  '  wiki-samples       - Print a DokuWiki table of samples'
    29 
    30 help-env::
    31 	@echo  '  CT_PREFIX=dir      - install samples in dir (see action "build-all", above).'
    32 
    33 # ----------------------------------------------------------
    34 # This part deals with printing samples information
    35 
    36 # Print the details of current configuration
    37 PHONY += show-config
    38 show-config: .config
    39 	@cp .config .config.sample
    40 	@$(CT_LIB_DIR)/scripts/showSamples.sh -v current
    41 	@rm -f .config.sample
    42 
    43 # Prints the details of a sample
    44 PHONY += $(patsubst %,show-%,$(CT_SAMPLES))
    45 $(patsubst %,show-%,$(CT_SAMPLES)): config_files
    46 	@KCONFIG_CONFIG=$$(pwd)/.config.sample	\
    47 	    $(CONF) --defconfig=$(call sample_dir,$(patsubst show-%,%,$(@)))/crosstool.config   \
    48 	            $(KCONFIG_TOP) >/dev/null
    49 	@$(CT_LIB_DIR)/scripts/showSamples.sh -v $(patsubst show-%,%,$(@))
    50 	@rm -f .config.sample
    51 
    52 # Prints the details of all samples
    53 PHONY += show-all
    54 show-all: $(patsubst %,show-%,$(CT_SAMPLES))
    55 
    56 # print the list of all available samples
    57 PHONY += list-samples
    58 list-samples: list-samples-pre $(patsubst %,list-%,$(CT_SAMPLES))
    59 	@echo ' L (Local)       : sample was found in current directory'
    60 	@echo ' G (Global)      : sample was installed with crosstool-NG'
    61 	@echo ' X (EXPERIMENTAL): sample may use EXPERIMENTAL features'
    62 	@echo ' B (BROKEN)      : sample is currently broken'
    63 
    64 PHONY += list-samples-pre
    65 list-samples-pre: FORCE
    66 	@echo 'Status  Sample name'
    67 
    68 PHONY += $(patsubst %,list-%,$(CT_SAMPLES))
    69 $(patsubst %,list-%,$(CT_SAMPLES)): config_files
    70 	@KCONFIG_CONFIG=$$(pwd)/.config.sample	\
    71 	    $(CONF) --defconfig=$(call sample_dir,$(patsubst list-%,%,$(@)))/crosstool.config   \
    72 	            $(KCONFIG_TOP) >/dev/null
    73 	@$(CT_LIB_DIR)/scripts/showSamples.sh $(patsubst list-%,%,$(@))
    74 	@rm -f .config.sample
    75 
    76 PHONY += list-samples-short
    77 list-samples-short: FORCE
    78 	$(SILENT)for s in $(CT_SAMPLES); do \
    79 	    printf "%s\n" "$${s}";          \
    80 	done
    81 
    82 # Check one sample
    83 PHONY += $(patsubst %,check-%,$(CT_SAMPLES))
    84 $(patsubst %,check-%,$(CT_SAMPLES)): config_files
    85 	@export KCONFIG_CONFIG=$$(pwd)/.config.sample;                                  \
    86 	 CT_NG_SAMPLE=$(call sample_dir,$(patsubst check-%,%,$(@)))/crosstool.config;   \
    87 	 $(CONF) --defconfig=$${CT_NG_SAMPLE} $(KCONFIG_TOP) >/dev/null;                \
    88 	 $(CONF) --savedefconfig=$$(pwd)/.defconfig $(KCONFIG_TOP) >/dev/null;          \
    89 	 old_sha1=$$( sha1sum "$${CT_NG_SAMPLE}" |cut -d ' ' -f 1 );                    \
    90 	 new_sha1=$$( sha1sum .defconfig |cut -d ' ' -f 1 );                            \
    91 	 if [ $${old_sha1} != $${new_sha1} ]; then                                      \
    92 	    echo "$(patsubst check-%,%,$(@)) needs update:";                            \
    93 	    diff -du0 "$${CT_NG_SAMPLE}" .defconfig |tail -n +4;                        \
    94 	 fi
    95 	@rm -f .config.sample* .defconfig
    96 
    97 check-samples: $(patsubst %,check-%,$(CT_SAMPLES))
    98 
    99 PHONY += wiki-samples
   100 wiki-samples: wiki-samples-pre $(patsubst %,wiki-%,$(CT_SAMPLES)) wiki-samples-post
   101 
   102 wiki-samples-pre: FORCE
   103 	$(SILENT)$(CT_LIB_DIR)/scripts/showSamples.sh -w
   104 
   105 wiki-samples-post: FORCE
   106 	$(SILENT)$(CT_LIB_DIR)/scripts/showSamples.sh -W $(CT_SAMPLES)
   107 
   108 $(patsubst %,wiki-%,$(CT_SAMPLES)): config_files
   109 	$(SILENT)KCONFIG_CONFIG=$$(pwd)/.config.sample	\
   110 	    $(CONF) --defconfig=$(call sample_dir,$(patsubst wiki-%,%,$(@)))/crosstool.config   \
   111 	            $(KCONFIG_TOP) >/dev/null
   112 	$(SILENT)$(CT_LIB_DIR)/scripts/showSamples.sh -w $(patsubst wiki-%,%,$(@))
   113 	$(SILENT)rm -f .config.sample
   114 
   115 # ----------------------------------------------------------
   116 # This part deals with saving/restoring samples
   117 
   118 PHONY += samples
   119 samples:
   120 	@$(ECHO) '  MKDIR $@'
   121 	$(SILENT)mkdir -p $@
   122 
   123 # Save a sample
   124 saveconfig: .config samples
   125 	$(SILENT)$(CT_LIB_DIR)/scripts/saveSample.sh
   126 
   127 # The 'sample_dir' function prints the directory in which the sample is,
   128 # searching first in local samples, then in global samples
   129 define sample_dir
   130 $$( [ -d $(CT_TOP_DIR)/samples/$(1) ] && echo "$(CT_TOP_DIR)/samples/$(1)" || echo "$(CT_LIB_DIR)/samples/$(1)")
   131 endef
   132 
   133 # How we do recall one sample
   134 PHONY += $(CT_SAMPLES)
   135 $(CT_SAMPLES): config_files
   136 	@$(ECHO) "  CONF  $(KCONFIG_TOP)"
   137 	$(SILENT)$(CONF) --defconfig=$(call sample_dir,$@)/crosstool.config $(KCONFIG_TOP)
   138 	@echo
   139 	@echo  '***********************************************************'
   140 	@echo
   141 	$(SILENT)( . $(call sample_dir,$@)/reported.by;                             \
   142 	   echo "Initially reported by: $${reporter_name}";                         \
   143 	   echo "URL: $${reporter_url}";                                            \
   144 	   if [ -n "$${reporter_comment}" ]; then                                   \
   145 	     echo  ;                                                                \
   146 	     echo  "Comment:";                                                      \
   147 	     printf "$${reporter_comment}\n";                                       \
   148 	   fi;                                                                      \
   149 	   echo  ;                                                                  \
   150 	   echo  '***********************************************************';     \
   151 	 )
   152 	$(SILENT)if $(grep) -E '^CT_EXPERIMENTAL=y$$' .config >/dev/null 2>&1; then \
   153 	   echo  ;                                                                  \
   154 	   echo  'WARNING! This sample may enable experimental features.';          \
   155 	   echo  '         Please be sure to review the configuration prior';       \
   156 	   echo  '         to building and using your toolchain!';                  \
   157 	   echo  'Now, you have been warned!';                                      \
   158 	   echo  ;                                                                  \
   159 	   echo  '***********************************************************';     \
   160 	 fi
   161 	@echo
   162 	@echo  'Now configured for "$@"'
   163 
   164 # ----------------------------------------------------------
   165 # Some helper functions
   166 
   167 # Create the rule to build a sample
   168 # $1: sample tuple
   169 # $2: prefix
   170 define build_sample
   171 	@$(ECHO) '  CONF  $(1)'
   172 	$(SILENT)cp $(call sample_dir,$(1))/crosstool.config .config
   173 	$(SILENT)$(sed) -i -r -e 's:^(CT_PREFIX_DIR=).*$$:\1"$(2)":;' .config
   174 	$(SILENT)$(sed) -i -r -e 's:^.*(CT_LOG_(WARN|INFO|EXTRA|DEBUG|ALL)).*$$:# \1 is not set:;' .config
   175 	$(SILENT)$(sed) -i -r -e 's:^.*(CT_LOG_ERROR).*$$:\1=y:;' .config
   176 	$(SILENT)$(sed) -i -r -e 's:^(CT_LOG_LEVEL_MAX)=.*$$:\1="ERROR":;' .config
   177 	$(SILENT)$(sed) -i -r -e 's:^.*(CT_LOG_TO_FILE).*$$:\1=y:;' .config
   178 	$(SILENT)$(sed) -i -r -e 's:^.*(CT_LOG_PROGRESS_BAR).*$$:\1=y:;' .config
   179 	$(SILENT)$(MAKE) -rf $(CT_NG) V=0 oldconfig
   180 	@$(ECHO) '  BUILD $(1)'
   181 	$(SILENT)$(MAKE) -rf $(CT_NG) V=0 build
   182 endef
   183 
   184 # ----------------------------------------------------------
   185 # Build samples for use (not regtest!)
   186 
   187 # Check that PREFIX is set if building samples
   188 ifneq ($(strip $(MAKECMDGOALS)),)
   189 ifneq ($(strip $(filter $(patsubst %,build-%,$(CT_SAMPLES)) build-all,$(MAKECMDGOALS))),)
   190 
   191 ifeq ($(strip $(CT_PREFIX)),)
   192 $(error Please set 'CT_PREFIX' to where you want to install generated toolchain samples!)
   193 endif
   194 
   195 endif # MAKECMDGOALS contains a build sample rule
   196 endif # MAKECMDGOALS != ""
   197 
   198 # Build a single sample
   199 $(patsubst %,build-%,$(CT_SAMPLES)):
   200 	$(call build_sample,$(patsubst build-%,%,$@),$(CT_PREFIX)/$(patsubst build-%,%,$@))
   201 
   202 # Build al samples
   203 build-all: $(patsubst %,build-%,$(CT_SAMPLES))
   204 
   205 # Build all samples, overiding the number of // jobs per sample
   206 build-all.%:
   207 	$(SILENT)$(MAKE) -rf $(CT_NG) V=$(V) $(shell echo "$(@)" |$(sed) -r -e 's|^([^.]+)\.([[:digit:]]+)$$|\1 CT_JOBS=\2|;')
   208