yann@166: # Makefile to manage samples yann@63: yann@1001: # ---------------------------------------------------------- yann@166: # Build the list of available samples yann@182: CT_TOP_SAMPLES := $(patsubst $(CT_TOP_DIR)/samples/%/crosstool.config,%,$(wildcard $(CT_TOP_DIR)/samples/*/crosstool.config)) yann@182: CT_LIB_SAMPLES := $(filter-out $(CT_TOP_SAMPLES),$(patsubst $(CT_LIB_DIR)/samples/%/crosstool.config,%,$(wildcard $(CT_LIB_DIR)/samples/*/crosstool.config))) yann@1682: CT_SAMPLES := $(shell echo $(sort $(CT_TOP_SAMPLES) $(CT_LIB_SAMPLES)) \ yann@2722: |$(sed) -r -e 's/ /\n/g;' \ yann@2722: |$(sed) -r -e 's/(.*),(.*)/\2,\1/;' \ yann@2722: |sort \ yann@2722: |$(sed) -r -e 's/(.*),(.*)/\2,\1/;' \ yann@1682: ) yann@182: yann@1001: # ---------------------------------------------------------- yann@1001: # This part deals with the samples help entries yann@63: yann@176: help-config:: yann@333: @echo ' saveconfig - Save current config as a preconfigured target' yann@176: yann@176: help-samples:: yann@544: @echo ' list-samples - prints the list of all samples (for scripting)' yann@1876: @echo ' show- - show a brief overview of (list with list-samples)' yann@1876: @echo ' - preconfigure crosstool-NG with (list with list-samples)' yann@1876: @echo ' build-all[.#] - Build *all* samples (list with list-samples) and install in' yann@1025: @echo ' $${CT_PREFIX} (which you must set)' yann@176: yann@560: help-distrib:: yann@560: @echo ' wiki-samples - Print a DokuWiki table of samples' yann@560: yann@1025: help-env:: yann@1876: @echo ' CT_PREFIX=dir - install samples in dir (see action "build-all", above).' yann@1025: yann@1001: # ---------------------------------------------------------- yann@1001: # This part deals with printing samples information yann@1001: yann@1788: # Print the details of current configuration yann@1788: PHONY += show-config yann@1788: show-config: .config yann@1789: @export current_tuple=$(shell $(MAKE) -rf "$(CT_NG)" show-tuple ); \ yann@1789: $(CT_LIB_DIR)/scripts/showSamples.sh -v current yann@1788: yann@1001: # Prints the details of a sample yann@1001: PHONY += $(patsubst %,show-%,$(CT_SAMPLES)) yann@539: $(patsubst %,show-%,$(CT_SAMPLES)): yann@539: @$(CT_LIB_DIR)/scripts/showSamples.sh -v $(patsubst show-%,%,$(@)) yann@539: yann@1683: # Prints the details of all samples yann@1683: PHONY += show-all yann@1683: show-all: $(patsubst %,show-%,$(CT_SAMPLES)) yann@1683: yann@1001: # print the list of all available samples yann@544: PHONY += list-samples yann@1618: list-samples: FORCE yann@1876: $(SILENT)$(CT_LIB_DIR)/scripts/showSamples.sh $(CT_SAMPLES) yann@474: yann@2053: PHONY += list-samples-short yann@2053: list-samples-short: FORCE yann@2053: $(SILENT)for s in $(CT_SAMPLES); do \ yann@2053: printf "$${s}\n"; \ yann@2053: done yann@2053: yann@2053: PHONY += wiki-samples yann@1001: wiki-samples: yann@1001: $(SILENT)$(CT_LIB_DIR)/scripts/showSamples.sh -w $(CT_SAMPLES) yann@1001: yann@1001: # ---------------------------------------------------------- yann@1001: # This part deals with saving/restoring samples yann@1001: yann@1620: PHONY += samples yann@1620: samples: yann@1620: @$(ECHO) ' MKDIR $@' yann@1620: $(SILENT)mkdir -p $@ yann@1620: yann@1001: # Save a sample yann@1620: saveconfig: .config samples yann@1001: $(SILENT)$(CT_LIB_DIR)/scripts/saveSample.sh yann@1001: yann@1001: # The 'sample_dir' function prints the directory in which the sample is, yann@1001: # searching first in local samples, then in global samples yann@1001: define sample_dir yann@1001: $$( [ -d $(CT_TOP_DIR)/samples/$(1) ] && echo "$(CT_TOP_DIR)/samples/$(1)" || echo "$(CT_LIB_DIR)/samples/$(1)") yann@1001: endef yann@1001: yann@933: # How we do recall one sample yann@182: PHONY += $(CT_SAMPLES) yann@2981: $(CT_SAMPLES): config_files yann@2981: @$(ECHO) " CONF $(KCONFIG_TOP)" yann@2981: $(SILENT)$(CONF) --defconfig=$(call sample_dir,$@)/crosstool.config $(KCONFIG_TOP) yann@935: @echo yann@935: @echo '***********************************************************' yann@935: @echo yann@940: $(SILENT)( . $(call sample_dir,$@)/reported.by; \ yann@2725: echo "Initially reported by: $${reporter_name}"; \ yann@2725: echo "URL: $${reporter_url}"; \ yann@935: if [ -n "$${reporter_comment}" ]; then \ yann@935: echo ; \ yann@935: echo "Comment:"; \ yann@935: printf "$${reporter_comment}\n"; \ yann@935: fi; \ yann@935: echo ; \ yann@935: echo '***********************************************************'; \ yann@935: ) yann@1159: $(SILENT)if $(grep) -E '^CT_EXPERIMENTAL=y$$' .config >/dev/null 2>&1; then \ yann@940: echo ; \ yann@940: echo 'WARNING! This sample may enable experimental features.'; \ yann@940: echo ' Please be sure to review the configuration prior'; \ yann@940: echo ' to building and using your toolchain!'; \ yann@940: echo 'Now, you have been warned!'; \ yann@940: echo ; \ yann@940: echo '***********************************************************'; \ yann@822: fi yann@935: @echo yann@933: @echo 'Now configured for "$@"' yann@182: yann@1001: # ---------------------------------------------------------- yann@1025: # Some helper functions yann@166: yann@1025: # Create the rule to build a sample yann@1025: # $1: sample tuple yann@1025: # $2: prefix yann@1025: define build_sample yann@1067: @$(ECHO) ' CONF $(1)' yann@1025: $(SILENT)cp $(call sample_dir,$(1))/crosstool.config .config yann@1155: $(SILENT)$(sed) -i -r -e 's:^(CT_PREFIX_DIR=).*$$:\1"$(2)":;' .config yann@1155: $(SILENT)$(sed) -i -r -e 's:^.*(CT_LOG_(WARN|INFO|EXTRA|DEBUG|ALL)).*$$:# \1 is not set:;' .config yann@1155: $(SILENT)$(sed) -i -r -e 's:^.*(CT_LOG_ERROR).*$$:\1=y:;' .config yann@1155: $(SILENT)$(sed) -i -r -e 's:^(CT_LOG_LEVEL_MAX)=.*$$:\1="ERROR":;' .config yann@1155: $(SILENT)$(sed) -i -r -e 's:^.*(CT_LOG_TO_FILE).*$$:\1=y:;' .config yann@1155: $(SILENT)$(sed) -i -r -e 's:^.*(CT_LOG_PROGRESS_BAR).*$$:\1=y:;' .config yann@1067: $(SILENT)$(MAKE) -rf $(CT_NG) V=0 oldconfig yann@1025: @$(ECHO) ' BUILD $(1)' yann@1067: $(SILENT)$(MAKE) -rf $(CT_NG) V=0 build yann@1025: endef yann@230: yann@1025: # ---------------------------------------------------------- yann@1025: # Build samples for use (not regtest!) yann@230: yann@1025: # Check that PREFIX is set if building samples yann@1025: ifneq ($(strip $(MAKECMDGOALS)),) yann@1025: ifneq ($(strip $(filter $(patsubst %,build-%,$(CT_SAMPLES)) build-all,$(MAKECMDGOALS))),) yann@230: yann@1025: ifeq ($(strip $(CT_PREFIX)),) yann@1025: $(error Please set 'CT_PREFIX' to where you want to install generated toolchain samples!) yann@1025: endif yann@333: yann@1025: endif # MAKECMDGOALS contains a build sample rule yann@1025: endif # MAKECMDGOALS != "" yann@1025: yann@1025: # Build a single sample yann@1025: $(patsubst %,build-%,$(CT_SAMPLES)): yann@1025: $(call build_sample,$(patsubst build-%,%,$@),$(CT_PREFIX)/$(patsubst build-%,%,$@)) yann@1025: yann@1025: # Build al samples yann@1025: build-all: $(patsubst %,build-%,$(CT_SAMPLES)) yann@1025: yann@1025: # Build all samples, overiding the number of // jobs per sample yann@1025: build-all.%: yann@1155: $(SILENT)$(MAKE) -rf $(CT_NG) V=$(V) $(shell echo "$(@)" |$(sed) -r -e 's|^([^.]+)\.([[:digit:]]+)$$|\1 CT_JOBS=\2|;') yann@1025: