crosstool-ng/samples/samples.mk
Alexey Neyman 196f62e18c Upgrade script for uClibc retirement
Run samples through upgrade and fix accumulated breakages:

*-centos6-*: After 2.12.2 retirement, the samples selected most recent
glibc (2.34) which also forced kernels 3.2+. Revert to 2.12.1 and
2.6.32.71, respectively. Interestingly, 2.12.1 was marked as being used
in CentOS6, but the samples selected 2.12.2. Anyway, CentOS6 is EOL now
and glibc 2.12 is going to be marked obsolete, and retired soon.

arc-*: Make TARGET_VENDOR match the sample's name; otherwise `ct-ng
saveconfig` places the config file into a different location.

Fix 'savedefconfig' which was not saving the configuration file version
(CT_VCHECK was set to 'load' after CT_LoadConfig call).

Signed-off-by: Alexey Neyman <stilor@att.net>
2022-02-11 00:47:50 -08:00

257 lines
11 KiB
Makefile

# Makefile to manage samples
# ----------------------------------------------------------
# Build the list of available samples
CT_TOP_SAMPLES := $(patsubst $(CT_TOP_DIR)/samples/%/crosstool.config,%,$(sort $(wildcard $(CT_TOP_DIR)/samples/*/crosstool.config)))
CT_LIB_SAMPLES := $(filter-out $(CT_TOP_SAMPLES),$(patsubst $(CT_LIB_DIR)/samples/%/crosstool.config,%,$(sort $(wildcard $(CT_LIB_DIR)/samples/*/crosstool.config))))
CT_SAMPLES := $(shell echo $(sort $(CT_TOP_SAMPLES) $(CT_LIB_SAMPLES)) \
|$(sed) -r -e 's/ /\n/g;' \
|$(sed) -r -e 's/(.*),(.*)/\2,\1/;' \
|sort \
|$(sed) -r -e 's/(.*),(.*)/\2,\1/;' \
)
# If set to yes on command line, updates the sample configuration
# instead of just dumping the diff.
CT_UPDATE_SAMPLES := no
# ----------------------------------------------------------
# This part deals with the samples help entries
help-config::
@echo ' show-config - Show a brief overview of current configuration'
@echo ' saveconfig - Save current config as a preconfigured target'
help-samples::
@echo ' list-samples - Prints the list of all samples (for scripting)'
@echo ' show-<sample> - Show a brief overview of <sample> (list with list-samples)'
@echo ' <sample> - Preconfigure crosstool-NG with <sample> (list with list-samples)'
@echo ' build-all[.#] - Build *all* samples (list with list-samples) and install in'
@echo ' $${CT_PREFIX} (set to ~/x-tools by default)'
help-distrib::
@echo ' check-samples - Verify if samples need updates due to Kconfig changes'
@echo ' update-samples - Regenerate sample configurations using the current Kconfig'
help-env::
@echo ' CT_PREFIX=dir - Install samples in dir (see action "build-all", above).'
# ----------------------------------------------------------
# This part deals with printing samples information
# Print the details of current configuration
PHONY += show-config
show-config: .config
@cp .config .config.sample
@$(bash) $(CT_LIB_DIR)/scripts/show-config.sh -v current
@rm -f .config.sample
# Prints the details of a sample
PHONY += $(patsubst %,show-%,$(CT_SAMPLES))
$(patsubst %,show-%,$(CT_SAMPLES)): show-%:
@KCONFIG_CONFIG=$$(pwd)/.config.sample \
CT_VCHECK=load \
$(CONF) --defconfig=$(call sample_dir,$*)/crosstool.config \
$(KCONFIG_TOP) >/dev/null
@$(bash) $(CT_LIB_DIR)/scripts/show-config.sh -v $*
@rm -f .config.sample
# Prints the details of all samples
PHONY += show-all
show-all: $(patsubst %,show-%,$(CT_SAMPLES))
# print the list of all available samples
PHONY += list-samples
list-samples: list-samples-pre $(patsubst %,list-%,$(CT_SAMPLES))
@echo ' L (Local) : sample was found in current directory'
@echo ' G (Global) : sample was installed with crosstool-NG'
@echo ' X (EXPERIMENTAL): sample may use EXPERIMENTAL features'
@echo ' B (BROKEN) : sample is currently broken'
@echo ' O (OBSOLETE) : sample needs to be upgraded'
PHONY += list-samples-pre
list-samples-pre: FORCE
@echo 'Status Sample name'
PHONY += $(patsubst %,list-%,$(CT_SAMPLES))
$(patsubst %,list-%,$(CT_SAMPLES)): list-%:
@KCONFIG_CONFIG=$$(pwd)/.config.sample \
CT_VCHECK=load \
$(CONF) --defconfig=$(call sample_dir,$*)/crosstool.config \
$(KCONFIG_TOP) >/dev/null
@$(bash) $(CT_LIB_DIR)/scripts/show-config.sh $*
@rm -f .config.sample
PHONY += list-samples-short
list-samples-short: FORCE
$(SILENT)for s in $(CT_SAMPLES); do \
printf "%s\n" "$${s}"; \
done
# Check one sample. Note that we are not loading but rather copying the defconfig;
# loading it while it contains some removed options would reset them to currently
# supported default values.
PHONY += $(patsubst %,check-%,$(CT_SAMPLES))
$(patsubst %,check-%,$(CT_SAMPLES)): check-%:
@set -e; export KCONFIG_CONFIG=$$(pwd)/.config.sample; \
CT_NG_SAMPLE=$(call sample_dir,$*)/crosstool.config; \
cp $${CT_NG_SAMPLE} .config.sample; \
CT_UPGRADECONFIG=yes \
$(bash) $(CT_LIB_DIR)/scripts/version-check.sh .config.sample &>/dev/null; \
CT_VCHECK=load $(CONF) -s --olddefconfig \
$(KCONFIG_TOP) &>/dev/null; \
CT_VCHECK=save $(CONF) -s --savedefconfig=$$(pwd)/.defconfig \
$(KCONFIG_TOP) &>/dev/null; \
if ! cmp -s "$${CT_NG_SAMPLE}" .defconfig; then \
if [ $(CT_UPDATE_SAMPLES) = yes ]; then \
echo "Updating $*"; \
mv .defconfig "$${CT_NG_SAMPLE}"; \
else \
echo "$* needs update:"; \
diff -d -U 0 "$${CT_NG_SAMPLE}" .defconfig |tail -n +4; \
fi; \
fi
@rm -f .config.sample* .defconfig
check-samples: $(patsubst %,check-%,$(CT_SAMPLES))
update-samples:
$(SILENT)$(MAKE) -rf $(CT_NG) check-samples CT_UPDATE_SAMPLES=yes
# ----------------------------------------------------------
# This part deals with saving/restoring samples
PHONY += samples
samples:
@$(CT_ECHO) ' MKDIR $@'
$(SILENT)mkdir -p $@
# Save a sample
saveconfig: .config samples
$(SILENT)CONF=$(CONF) $(bash) $(CT_LIB_DIR)/scripts/saveSample.sh
# The 'sample_dir' function prints the directory in which the sample is,
# searching first in local samples, then in global samples
define sample_dir
$$( [ -d $(CT_TOP_DIR)/samples/$(1) ] && echo "$(CT_TOP_DIR)/samples/$(1)" || echo "$(CT_LIB_DIR)/samples/$(1)")
endef
# How we do recall one sample
PHONY += $(CT_SAMPLES)
$(CT_SAMPLES): check-config
@$(CT_ECHO) " CONF $@"
$(SILENT)CT_VCHECK=load $(CONF) --defconfig=$(call sample_dir,$@)/crosstool.config $(KCONFIG_TOP)
@CT_VCHECK=strict $(bash) $(CT_LIB_DIR)/scripts/version-check.sh .config
@echo
@echo '***********************************************************'
@echo
$(SILENT)( . $(call sample_dir,$@)/reported.by; \
echo "Initially reported by: $${reporter_name}"; \
echo "URL: $${reporter_url}"; \
if [ -n "$${reporter_comment}" ]; then \
echo ; \
echo "Comment:"; \
printf "$${reporter_comment}\n"; \
fi; \
echo ; \
echo '***********************************************************'; \
)
$(SILENT)if $(grep) -E '^CT_EXPERIMENTAL=y$$' .config >/dev/null 2>&1; then \
echo ; \
echo 'WARNING! This sample may enable experimental features.'; \
echo ' Please be sure to review the configuration prior'; \
echo ' to building and using your toolchain!'; \
echo 'Now, you have been warned!'; \
echo ; \
echo '***********************************************************'; \
fi
@echo
@echo 'Now configured for "$@"'
# ----------------------------------------------------------
# Some helper functions
__comma = ,
host_triplet = $(if $(findstring $(__comma),$(1)),$(firstword $(subst $(__comma), ,$(1))))
target_triplet = $(if $(findstring $(__comma),$(1)),$(word 2,$(subst $(__comma), ,$(1))),$(1))
# Create the rule to build a sample
# $1: sample name (target tuple, or host/target tuples separated by a comma)
define build_sample
@$(CT_ECHO) ' CONF $(1)'
$(SILENT)CT_VCHECK=load $(CONF) -s --defconfig=$(call sample_dir,$(1))/crosstool.config $(KCONFIG_TOP)
$(SILENT)[ -n "$(CT_PREFIX)" ] && $(sed) -i -r -e 's:^(CT_PREFIX=).*$$:\1"$(CT_PREFIX)":;' .config || :
$(SILENT)$(sed) -i -r -e 's:^.*(CT_LOG_(WARN|INFO|EXTRA|DEBUG|ALL)).*$$:# \1 is not set:;' .config
$(SILENT)$(sed) -i -r -e 's:^.*(CT_LOG_ERROR).*$$:\1=y:;' .config
$(SILENT)$(sed) -i -r -e 's:^(CT_LOG_LEVEL_MAX)=.*$$:\1="ERROR":;' .config
$(SILENT)$(CONF) -s --oldconfig $(KCONFIG_TOP)
@$(CT_ECHO) ' BUILD $(1)'
$(SILENT)h=$(call host_triplet,$(1)); \
if [ -n "$${h}" -a -r ".build-all/PASS/$${h}/prefix" ]; then \
PATH=`cat .build-all/PASS/$${h}/prefix`/bin:$${PATH}; \
fi; \
if $(MAKE) -rf $(CT_NG) V=0 build; then \
status=PASS; \
elif [ -e $(call sample_dir,$(1))/broken ]; then \
status=XFAIL; \
else \
status=FAIL; \
fi; \
printf '\r %-5s %s\n' $$status '$(1)'; \
mkdir -p .build-all/$$status/$(1); \
bzip2 < build.log > .build-all/$$status/$(1)/build.log.bz2; \
if [ "$$status" = PASS ]; then \
blddir=`$(bash) $(CT_LIB_DIR)/scripts/show-tuple.sh '$${CT_BUILD_TOP_DIR}'`; \
[ -z "$(CT_PRESERVE_PASSED_BUILDS)" ] && rm -rf $${blddir}; \
$(bash) $(CT_LIB_DIR)/scripts/show-tuple.sh '$${CT_PREFIX_DIR}' > .build-all/PASS/$(1)/prefix; \
fi; \
:
endef
# ----------------------------------------------------------
# Build samples for use (not regtest!)
# Check that PREFIX is set if building samples
ifneq ($(strip $(MAKECMDGOALS)),)
ifneq ($(strip $(filter $(patsubst %,build-%,$(CT_SAMPLES)) build-all,$(MAKECMDGOALS))),)
endif # MAKECMDGOALS contains a build sample rule
endif # MAKECMDGOALS != ""
# Build a single sample
$(patsubst %,build-%,$(CT_SAMPLES)): build-%:
$(call build_sample,$*)
# Cross samples (build==host)
CT_SAMPLES_CROSS = $(strip $(foreach s,$(CT_SAMPLES),$(if $(findstring $(__comma),$(s)),, $(s))))
# Canadian cross (build!=host)
CT_SAMPLES_CANADIAN = $(strip $(foreach s,$(CT_SAMPLES),$(if $(findstring $(__comma),$(s)), $(s),)))
# Build all samples; first, build simple cross as canadian configurations may depend on
# build-to-host cross being pre-built.
build-all: build-all-pre $(patsubst %,build-%,$(CT_SAMPLES_CROSS) $(CT_SAMPLES_CANADIAN))
@echo
@if [ -d .build-all/PASS ]; then \
echo 'Success:'; \
(cd .build-all/PASS && ls | sed 's/^/ - /'); \
echo; \
fi
@if [ -d .build-all/XFAIL ]; then \
echo 'Expected failure:'; \
(cd .build-all/XFAIL && ls | sed 's/^/ - /'); \
echo; \
fi
@if [ -d .build-all/FAIL ]; then \
echo 'Failure:'; \
(cd .build-all/FAIL && ls | sed 's/^/ - /'); \
echo; \
fi
@[ ! -d .build-all/FAIL ]
build-all-pre:
@rm -rf .build-all
# Build all samples, overiding the number of // jobs per sample
build-all.%:
$(SILENT)$(MAKE) -rf $(CT_NG) build-all CT_JOBS=$*