1pmu-events-y += pmu-events.o 2JSON = $(shell find pmu-events/arch -name '*.json' -o -name '*.csv') 3JSON_DIRS = $(shell find pmu-events/arch -type d) 4JDIR_TEST = pmu-events/arch/test 5JSON_TEST = $(shell [ -d $(JDIR_TEST) ] && \ 6 find $(JDIR_TEST) -name '*.json') 7JEVENTS_PY = pmu-events/jevents.py 8METRIC_PY = pmu-events/metric.py 9METRIC_TEST_PY = pmu-events/metric_test.py 10EMPTY_PMU_EVENTS_C = pmu-events/empty-pmu-events.c 11PMU_EVENTS_C = $(OUTPUT)pmu-events/pmu-events.c 12METRIC_TEST_LOG = $(OUTPUT)pmu-events/metric_test.log 13TEST_EMPTY_PMU_EVENTS_C = $(OUTPUT)pmu-events/test-empty-pmu-events.c 14EMPTY_PMU_EVENTS_TEST_LOG = $(OUTPUT)pmu-events/empty-pmu-events.log 15LEGACY_CACHE_PY = pmu-events/make_legacy_cache.py 16LEGACY_CACHE_JSON = $(OUTPUT)pmu-events/arch/common/common/legacy-cache.json 17 18ifeq ($(JEVENTS_ARCH),) 19JEVENTS_ARCH=$(SRCARCH) 20endif 21JEVENTS_MODEL ?= all 22 23# 24# Locate/process JSON files in pmu-events/arch/ 25# directory and create tables in pmu-events.c. 26# 27 28ifeq ($(NO_JEVENTS),1) 29$(PMU_EVENTS_C): $(EMPTY_PMU_EVENTS_C) 30 $(call rule_mkdir) 31 $(Q)$(call echo-cmd,gen)cp $< $@ 32else 33# Functions to extract the model from a extra-metrics.json or extra-metricgroups.json path. 34model_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/extra-metric.*\.json@\1@') 35vendor_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/[^/]*/extra-metric.*\.json@\1@') 36 37# Copy checked-in json to OUTPUT for generation if it's an out of source build 38ifneq ($(OUTPUT),) 39# Remove all output directories when any source directory timestamp changes 40# so there are no stale deleted files 41JSON_DIRS_ROOT = $(OUTPUT)pmu-events/arch/ 42$(JSON_DIRS_ROOT): $(JSON_DIRS) 43 $(Q)$(call echo-cmd,gen)rm -rf $@ 44 $(Q)mkdir -p $@ 45 46$(OUTPUT)pmu-events/arch/%: pmu-events/arch/% $(JSON_DIRS_ROOT) 47 $(call rule_mkdir) 48 $(Q)$(call echo-cmd,gen)cp $< $@ 49endif 50 51$(LEGACY_CACHE_JSON): $(LEGACY_CACHE_PY) $(JSON_DIRS_ROOT) 52 $(call rule_mkdir) 53 $(Q)$(call echo-cmd,gen)$(PYTHON) $(LEGACY_CACHE_PY) > $@ 54 55GEN_METRIC_DEPS := pmu-events/metric.py pmu-events/common_metrics.py 56 57# Generate AMD Json 58ZENS = $(shell ls -d pmu-events/arch/x86/amdzen*) 59ZEN_METRICS = $(foreach x,$(ZENS),$(OUTPUT)$(x)/extra-metrics.json) 60ZEN_METRICGROUPS = $(foreach x,$(ZENS),$(OUTPUT)$(x)/extra-metricgroups.json) 61 62$(ZEN_METRICS): pmu-events/amd_metrics.py $(GEN_METRIC_DEPS) 63 $(call rule_mkdir) 64 $(Q)$(call echo-cmd,gen)$(PYTHON) $< $(call model_name,$@) pmu-events/arch > $@ 65 66$(ZEN_METRICGROUPS): pmu-events/amd_metrics.py $(GEN_METRIC_DEPS) 67 $(call rule_mkdir) 68 $(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call model_name,$@) pmu-events/arch > $@ 69 70# Generate ARM Json 71ARMS = $(shell ls -d pmu-events/arch/arm64/arm/*|grep -v cmn) 72ARM_METRICS = $(foreach x,$(ARMS),$(OUTPUT)$(x)/extra-metrics.json) 73ARM_METRICGROUPS = $(foreach x,$(ARMS),$(OUTPUT)$(x)/extra-metricgroups.json) 74 75$(ARM_METRICS): pmu-events/arm64_metrics.py $(GEN_METRIC_DEPS) 76 $(call rule_mkdir) 77 $(Q)$(call echo-cmd,gen)$(PYTHON) $< $(call vendor_name,$@) $(call model_name,$@) pmu-events/arch > $@ 78 79$(ARM_METRICGROUPS): pmu-events/arm64_metrics.py $(GEN_METRIC_DEPS) 80 $(call rule_mkdir) 81 $(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call vendor_name,$@) $(call model_name,$@) pmu-events/arch > $@ 82 83# Generate Intel Json 84INTELS = $(shell ls -d pmu-events/arch/x86/*|grep -v amdzen|grep -v mapfile.csv) 85INTEL_METRICS = $(foreach x,$(INTELS),$(OUTPUT)$(x)/extra-metrics.json) 86INTEL_METRICGROUPS = $(foreach x,$(INTELS),$(OUTPUT)$(x)/extra-metricgroups.json) 87 88$(INTEL_METRICS): pmu-events/intel_metrics.py $(GEN_METRIC_DEPS) 89 $(call rule_mkdir) 90 $(Q)$(call echo-cmd,gen)$(PYTHON) $< $(call model_name,$@) pmu-events/arch > $@ 91 92$(INTEL_METRICGROUPS): pmu-events/intel_metrics.py $(GEN_METRIC_DEPS) 93 $(call rule_mkdir) 94 $(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call model_name,$@) pmu-events/arch > $@ 95 96GEN_JSON = $(patsubst %,$(OUTPUT)%,$(JSON)) \ 97 $(LEGACY_CACHE_JSON) \ 98 $(JSON_DIRS) \ 99 $(ZEN_METRICS) $(ZEN_METRICGROUPS) \ 100 $(ARM_METRICS) $(ARM_METRICGROUPS) \ 101 $(INTEL_METRICS) $(INTEL_METRICGROUPS) 102 103$(METRIC_TEST_LOG): $(METRIC_TEST_PY) $(METRIC_PY) 104 $(call rule_mkdir) 105 $(Q)$(call echo-cmd,test)$(PYTHON) $< 2> $@ || (cat $@ && false) 106 107$(TEST_EMPTY_PMU_EVENTS_C): $(GEN_JSON) $(JSON_TEST) $(JEVENTS_PY) $(METRIC_PY) $(METRIC_TEST_LOG) 108 $(call rule_mkdir) 109 $(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) none none $(OUTPUT)pmu-events/arch $@ 110 111$(EMPTY_PMU_EVENTS_TEST_LOG): $(EMPTY_PMU_EVENTS_C) $(TEST_EMPTY_PMU_EVENTS_C) 112 $(call rule_mkdir) 113 $(Q)$(call echo-cmd,test)diff -u $^ 2> $@ || (cat $@ && false) 114 115ifdef MYPY 116 PMU_EVENTS_PY_TESTS := $(wildcard *.py) 117 PMU_EVENTS_MYPY_TEST_LOGS := $(JEVENTS_PY_TESTS:%=%.mypy_log) 118else 119 PMU_EVENTS_MYPY_TEST_LOGS := 120endif 121 122$(OUTPUT)%.mypy_log: % 123 $(call rule_mkdir) 124 $(Q)$(call echo-cmd,test)mypy "$<" > $@ || (cat $@ && rm $@ && false) 125 126ifdef PYLINT 127 PMU_EVENTS_PY_TESTS := $(wildcard *.py) 128 PMU_EVENTS_PYLINT_TEST_LOGS := $(JEVENTS_PY_TESTS:%=%.pylint_log) 129else 130 PMU_EVENTS_PYLINT_TEST_LOGS := 131endif 132 133$(OUTPUT)%.pylint_log: % 134 $(call rule_mkdir) 135 $(Q)$(call echo-cmd,test)pylint "$<" > $@ || (cat $@ && rm $@ && false) 136 137$(PMU_EVENTS_C): $(GEN_JSON) $(JSON_TEST) $(JEVENTS_PY) $(METRIC_PY) $(METRIC_TEST_LOG) \ 138 $(EMPTY_PMU_EVENTS_TEST_LOG) $(PMU_EVENTS_MYPY_TEST_LOGS) $(PMU_EVENTS_PYLINT_TEST_LOGS) 139 $(call rule_mkdir) 140 $(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) $(JEVENTS_ARCH) $(JEVENTS_MODEL) $(OUTPUT)pmu-events/arch $@ 141endif 142 143# pmu-events.c file is generated in the OUTPUT directory so it needs a 144# separate rule to depend on it properly 145$(OUTPUT)pmu-events/pmu-events.o: $(PMU_EVENTS_C) 146 $(call rule_mkdir) 147 $(call if_changed_dep,cc_o_c) 148