xref: /linux/tools/perf/pmu-events/Build (revision e716e69cf67bb45c49653b884f88d8e97f454f50)
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