xref: /linux/tools/perf/pmu-events/Build (revision b2128290c29902315e632ea59e0504d6bc9e9b42)
1b777b3d2SIan RogersEMPTY_PMU_EVENTS_C = pmu-events/empty-pmu-events.c
236a1b006SIan Rogers# pmu-events.c will be generated by jevents.py or copied from EMPTY_PMU_EVENTS_C
3b777b3d2SIan RogersPMU_EVENTS_C	=  $(OUTPUT)pmu-events/pmu-events.c
4bb922345SIan RogersPMU_EVENTS_STRING_C = $(OUTPUT)pmu-events/pmu-events-string.c
5bb922345SIan Rogers
636a1b006SIan Rogerspmu-events-y	+= pmu-events.o
7bb922345SIan Rogersifneq ($(NO_JEVENTS),1)
8bb922345SIan Rogerspmu-events-y	+= pmu-events-string.o
9bb922345SIan Rogersendif
10e9d32c1bSJohn Garry
1136a1b006SIan Rogers# pmu-events.c file is generated in the OUTPUT directory so it needs a
1236a1b006SIan Rogers# separate rule to depend on it properly
1336a1b006SIan Rogers$(OUTPUT)pmu-events/pmu-events.o: $(PMU_EVENTS_C)
1436a1b006SIan Rogers	$(call rule_mkdir)
1536a1b006SIan Rogers	$(call if_changed_dep,cc_o_c)
1636a1b006SIan Rogers
17bb922345SIan Rogers$(OUTPUT)pmu-events/pmu-events-string.o: $(PMU_EVENTS_STRING_C)
18bb922345SIan Rogers	$(call rule_mkdir)
19bb922345SIan Rogers	$(call if_changed_dep,cc_o_c)
20bb922345SIan Rogers
2136a1b006SIan Rogers# Message for $(call echo-cmd,cp), possibly remove the src file from
2236a1b006SIan Rogers# the destination to save space in the build log.
2336a1b006SIan Rogersquiet_cmd_cp   = COPY    $(patsubst %$<,%,$@) <- $<
2436a1b006SIan Rogers
2536a1b006SIan Rogers# --- NO_JEVENTS=1 build ---
2636a1b006SIan Rogersifeq ($(NO_JEVENTS),1)
2736a1b006SIan Rogers$(PMU_EVENTS_C): $(EMPTY_PMU_EVENTS_C)
2836a1b006SIan Rogers	$(call rule_mkdir)
2936a1b006SIan Rogers	$(Q)$(call echo-cmd,cp)cp $< $@
3036a1b006SIan Rogerselse
3136a1b006SIan Rogers# --- Regular build ---
3236a1b006SIan Rogers
3336a1b006SIan Rogers# Setup the JEVENTS_ARCH and JEVENTS_MODEL
34b4f04660SIan Rogersifeq ($(JEVENTS_ARCH),)
35b4f04660SIan RogersJEVENTS_ARCH=$(SRCARCH)
36b4f04660SIan Rogersendif
375a09b1fdSIan RogersJEVENTS_MODEL ?= all
38b4f04660SIan Rogers
3936a1b006SIan Rogers# The input json/csv files
4036a1b006SIan RogersSRC_DIR		:= pmu-events/arch
4136a1b006SIan Rogersifeq ($(JEVENTS_ARCH),all)
4236a1b006SIan RogersSRC_JSON	:= $(shell find $(SRC_DIR) -name '*.json' -o -name '*.csv')
4300facc76SIan Rogerselse
4436a1b006SIan RogersSRC_JSON	:= $(shell find $(SRC_DIR)/common $(SRC_DIR)/test $(SRC_DIR)/$(JEVENTS_ARCH) -name '*.json' -o -name '*.csv')
4529166bd0SJames Clarkendif
464bb55de4SIan Rogers
4736a1b006SIan Rogers# Python to build the generic legacy cache events
4836a1b006SIan RogersLEGACY_CACHE_PY	=  pmu-events/make_legacy_cache.py
4936a1b006SIan RogersLEGACY_CACHE_JSON = $(OUTPUT)pmu-events/arch/common/common/legacy-cache.json
5036a1b006SIan RogersGEN_JSON = $(LEGACY_CACHE_JSON)
5136a1b006SIan Rogers
5236a1b006SIan Rogers$(LEGACY_CACHE_JSON): $(LEGACY_CACHE_PY)
530012e0faSIan Rogers	$(call rule_mkdir)
540012e0faSIan Rogers	$(Q)$(call echo-cmd,gen)$(PYTHON) $(LEGACY_CACHE_PY) > $@
550012e0faSIan Rogers
5636a1b006SIan Rogers# Python to generate architectural metrics
5782e53e7aSIan RogersGEN_METRIC_DEPS := pmu-events/metric.py pmu-events/common_metrics.py
5836a1b006SIan Rogers# Functions to extract the model from an extra-metrics.json or extra-metricgroups.json path.
59*90a815a2SIan Rogersmodel_name = $(notdir $(patsubst %/,%,$(dir $(1))))
60*90a815a2SIan Rogersvendor_name = $(notdir $(patsubst %/,%,$(dir $(patsubst %/,%,$(dir $(1))))))
6119eab0efSIan Rogers
6236a1b006SIan Rogersifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),x86 all))
6319eab0efSIan Rogers# Generate AMD Json
64*90a815a2SIan RogersZENS := $(shell ls -d pmu-events/arch/x86/amdzen*)
6519eab0efSIan RogersZEN_METRICS = $(foreach x,$(ZENS),$(OUTPUT)$(x)/extra-metrics.json)
6619eab0efSIan RogersZEN_METRICGROUPS = $(foreach x,$(ZENS),$(OUTPUT)$(x)/extra-metricgroups.json)
6736a1b006SIan RogersGEN_JSON += $(ZEN_METRICS) $(ZEN_METRICGROUPS)
6819eab0efSIan Rogers
6919eab0efSIan Rogers$(ZEN_METRICS): pmu-events/amd_metrics.py $(GEN_METRIC_DEPS)
7019eab0efSIan Rogers	$(call rule_mkdir)
716bd6c5efSIan Rogers	$(Q)$(call echo-cmd,gen)$(PYTHON) $< $(call model_name,$@) pmu-events/arch > $@
7219eab0efSIan Rogers
7319eab0efSIan Rogers$(ZEN_METRICGROUPS): pmu-events/amd_metrics.py $(GEN_METRIC_DEPS)
7419eab0efSIan Rogers	$(call rule_mkdir)
756bd6c5efSIan Rogers	$(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call model_name,$@) pmu-events/arch > $@
7619eab0efSIan Rogers
7736a1b006SIan Rogersendif
7836a1b006SIan Rogers
7936a1b006SIan Rogersifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),arm64 all))
8019eab0efSIan Rogers# Generate ARM Json
81*90a815a2SIan RogersARMS := $(shell ls -d pmu-events/arch/arm64/arm/*|grep -v cmn)
8219eab0efSIan RogersARM_METRICS = $(foreach x,$(ARMS),$(OUTPUT)$(x)/extra-metrics.json)
8319eab0efSIan RogersARM_METRICGROUPS = $(foreach x,$(ARMS),$(OUTPUT)$(x)/extra-metricgroups.json)
8436a1b006SIan RogersGEN_JSON += $(ARM_METRICS) $(ARM_METRICGROUPS)
8519eab0efSIan Rogers
8619eab0efSIan Rogers$(ARM_METRICS): pmu-events/arm64_metrics.py $(GEN_METRIC_DEPS)
8719eab0efSIan Rogers	$(call rule_mkdir)
886bd6c5efSIan Rogers	$(Q)$(call echo-cmd,gen)$(PYTHON) $< $(call vendor_name,$@) $(call model_name,$@) pmu-events/arch > $@
8919eab0efSIan Rogers
9019eab0efSIan Rogers$(ARM_METRICGROUPS): pmu-events/arm64_metrics.py $(GEN_METRIC_DEPS)
9119eab0efSIan Rogers	$(call rule_mkdir)
926bd6c5efSIan Rogers	$(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call vendor_name,$@) $(call model_name,$@) pmu-events/arch > $@
9319eab0efSIan Rogers
9436a1b006SIan Rogersendif
9536a1b006SIan Rogers
9636a1b006SIan Rogersifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),x86 all))
9719eab0efSIan Rogers# Generate Intel Json
98*90a815a2SIan RogersINTELS := $(shell ls -d pmu-events/arch/x86/*|grep -v amdzen|grep -v mapfile.csv)
9919eab0efSIan RogersINTEL_METRICS = $(foreach x,$(INTELS),$(OUTPUT)$(x)/extra-metrics.json)
10019eab0efSIan RogersINTEL_METRICGROUPS = $(foreach x,$(INTELS),$(OUTPUT)$(x)/extra-metricgroups.json)
10136a1b006SIan RogersGEN_JSON += $(INTEL_METRICS) $(INTEL_METRICGROUPS)
10219eab0efSIan Rogers
10319eab0efSIan Rogers$(INTEL_METRICS): pmu-events/intel_metrics.py $(GEN_METRIC_DEPS)
10419eab0efSIan Rogers	$(call rule_mkdir)
1056bd6c5efSIan Rogers	$(Q)$(call echo-cmd,gen)$(PYTHON) $< $(call model_name,$@) pmu-events/arch > $@
10619eab0efSIan Rogers
10719eab0efSIan Rogers$(INTEL_METRICGROUPS): pmu-events/intel_metrics.py $(GEN_METRIC_DEPS)
10819eab0efSIan Rogers	$(call rule_mkdir)
1096bd6c5efSIan Rogers	$(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call model_name,$@) pmu-events/arch > $@
11019eab0efSIan Rogers
11136a1b006SIan Rogersendif
11236a1b006SIan Rogers
11336a1b006SIan RogersOUT_DIR		:= $(OUTPUT)pmu-events/arch
11436a1b006SIan Rogers
11536a1b006SIan Rogersifeq ($(OUTPUT),)
11636a1b006SIan RogersOUT_JSON	:= $(SRC_JSON)
11736a1b006SIan RogersORPHAN_FILES	:=
11836a1b006SIan Rogerselse
11936a1b006SIan Rogers# Things that need to be built in the OUTPUT directory. Note, ensure
12036a1b006SIan Rogers# there is a slash after the directory name so that it matches what
12136a1b006SIan Rogers# $(dir) gives in COPY_RULE.
12236a1b006SIan RogersOUT_JSON	:= $(patsubst $(SRC_DIR)/%,$(OUT_DIR)/%,$(SRC_JSON))
12336a1b006SIan RogersOUT_DIRS	:= $(sort $(patsubst %/,%,$(dir $(OUT_JSON))))
12436a1b006SIan Rogers
12536a1b006SIan Rogers# Things already in the OUTPUT directory
12636a1b006SIan RogersCUR_OUT_JSON	:= $(shell [ -d $(OUT_DIR) ] && find $(OUT_DIR) -type f)
12736a1b006SIan Rogers
12836a1b006SIan Rogers# Things in the OUTPUT directory but shouldn't be there as computed by
12936a1b006SIan Rogers# OUT_JSON and GEN_JSON.
130bb922345SIan Rogers
13136a1b006SIan RogersORPHAN_FILES	:= $(filter-out $(OUT_JSON) $(GEN_JSON),$(CUR_OUT_JSON))
13236a1b006SIan Rogers
13336a1b006SIan Rogers# Message for $(call echo-cmd,mkd). There is already a mkdir message
13436a1b006SIan Rogers# but it assumes $@ is a file to mkdir the directory for.
13536a1b006SIan Rogersquiet_cmd_mkd  = MKDIR   $@
13636a1b006SIan Rogers
13736a1b006SIan Rogers$(OUT_DIRS):
13836a1b006SIan Rogers	$(Q)$(call echo-cmd,mkd)mkdir -p $@
13936a1b006SIan Rogers
14036a1b006SIan Rogers# Explicitly generate rules to copy SRC_JSON files as $(dir) cannot
14136a1b006SIan Rogers# apply to $@ in a dependency. Exclude from the copy rules any that
14236a1b006SIan Rogers# look like they are copying generated json. This happens as a perf
14336a1b006SIan Rogers# build within the tools/perf directory will leave generated json
14436a1b006SIan Rogers# files within the tree, these then get picked up by SRC_JSON find.
14536a1b006SIan Rogersdefine COPY_RULE
14636a1b006SIan Rogers$(2): $(1) | $(3)
14736a1b006SIan Rogers	$$(Q)$$(call echo-cmd,cp)cp $(1) $(2)
14836a1b006SIan Rogersendef
14936a1b006SIan Rogers$(foreach src,$(SRC_JSON), \
15036a1b006SIan Rogers    $(eval dest := $(patsubst $(SRC_DIR)/%,$(OUT_DIR)/%,$(src))) \
15136a1b006SIan Rogers    $(eval ddir := $(patsubst %/,%,$(dir $(dest)))) \
15236a1b006SIan Rogers    $(if $(filter $(dest),$(GEN_JSON)),, \
15336a1b006SIan Rogers        $(eval $(call COPY_RULE,$(src),$(dest),$(ddir))) \
15436a1b006SIan Rogers    ) \
15536a1b006SIan Rogers)
15636a1b006SIan Rogers
15736a1b006SIan Rogersendif # ifneq ($(OUTPUT),)
15836a1b006SIan Rogers
15936a1b006SIan RogersJEVENTS_PY	=  pmu-events/jevents.py
16036a1b006SIan RogersMETRIC_PY	=  pmu-events/metric.py
16136a1b006SIan Rogers
16236a1b006SIan Rogers# Rule to run the metric test.
16336a1b006SIan RogersMETRIC_TEST_PY	=  pmu-events/metric_test.py
16436a1b006SIan RogersMETRIC_TEST_LOG	=  $(OUTPUT)pmu-events/metric_test.log
1654bb55de4SIan Rogers
166b777b3d2SIan Rogers$(METRIC_TEST_LOG): $(METRIC_TEST_PY) $(METRIC_PY)
167b777b3d2SIan Rogers	$(call rule_mkdir)
168b777b3d2SIan Rogers	$(Q)$(call echo-cmd,test)$(PYTHON) $< 2> $@ || (cat $@ && false)
169b777b3d2SIan Rogers
17036a1b006SIan Rogers# Rule to create then ensure the empty-pmu-events.c is in sync.
17136a1b006SIan RogersTEST_EMPTY_PMU_EVENTS_C = $(OUTPUT)pmu-events/test-empty-pmu-events.c
17236a1b006SIan RogersEMPTY_PMU_EVENTS_TEST_LOG = $(OUTPUT)pmu-events/empty-pmu-events.log
17336a1b006SIan Rogers
17436a1b006SIan Rogers$(TEST_EMPTY_PMU_EVENTS_C): $(OUT_JSON) $(GEN_JSON) $(JEVENTS_PY) $(METRIC_PY)
1750fe881f1SIan Rogers	$(call rule_mkdir)
1764bb55de4SIan Rogers	$(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) none none $(OUTPUT)pmu-events/arch $@
1770fe881f1SIan Rogers
1780fe881f1SIan Rogers$(EMPTY_PMU_EVENTS_TEST_LOG): $(EMPTY_PMU_EVENTS_C) $(TEST_EMPTY_PMU_EVENTS_C)
1790fe881f1SIan Rogers	$(call rule_mkdir)
180b79f9a43SIan Rogers	$(Q)$(call echo-cmd,test)diff -u $^ 2> $@ || (cat $@ && false)
1810fe881f1SIan Rogers
18236a1b006SIan Rogers
18336a1b006SIan Rogers# Dependencies for jevents.py
18436a1b006SIan RogersJEVENTS_DEPS := $(OUT_JSON) $(GEN_JSON) $(JEVENTS_PY) $(METRIC_PY) $(EMPTY_PMU_EVENTS_TEST_LOG) $(METRIC_TEST_LOG)
18536a1b006SIan Rogers
18636a1b006SIan Rogers# Rules to run mypy if enabled.
187168910d0SIan Rogersifdef MYPY
18836a1b006SIan Rogersdefine MYPY_RULE
18936a1b006SIan Rogers$(2): $(1)
19036a1b006SIan Rogers	$$(Q)$$(call echo-cmd,test)mypy $(1) > $(2) || (cat $(2) && rm $(2) && false)
19136a1b006SIan Rogersendef
19236a1b006SIan Rogers$(foreach src,$(wildcard pmu-events/*.py), \
19336a1b006SIan Rogers    $(eval dest := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.mypy_log,$(src))) \
19436a1b006SIan Rogers    $(eval $(call MYPY_RULE,$(src),$(dest))) \
19536a1b006SIan Rogers)
19636a1b006SIan Rogers
19736a1b006SIan RogersMYPY_INPUTS := $(wildcard pmu-events/*.py)
19836a1b006SIan RogersMYPY_OUTPUTS := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.mypy_log,$(MYPY_INPUTS))
19936a1b006SIan RogersJEVENTS_DEPS += $(MYPY_OUTPUTS)
200168910d0SIan Rogersendif
201168910d0SIan Rogers
20236a1b006SIan Rogers# Rules to run pylint if enabled.
2038a54784eSIan Rogersifdef PYLINT
20436a1b006SIan Rogersdefine PYLINT_RULE
20536a1b006SIan Rogers$(2): $(1)
20636a1b006SIan Rogers	$$(Q)$$(call echo-cmd,test)pylint $(1) > $(2) || (cat $(2) && rm $(2) && false)
20736a1b006SIan Rogersendef
20836a1b006SIan Rogers$(foreach src,$(wildcard pmu-events/*.py), \
20936a1b006SIan Rogers    $(eval dest := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.pylint_log,$(src))) \
21036a1b006SIan Rogers    $(eval $(call PYLINT_RULE,$(src),$(dest))) \
21136a1b006SIan Rogers)
21236a1b006SIan Rogers
21336a1b006SIan RogersPYLINT_INPUTS := $(wildcard pmu-events/*.py)
21436a1b006SIan RogersPYLINT_OUTPUTS := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.pylint_log,$(PYLINT_INPUTS))
21536a1b006SIan RogersJEVENTS_DEPS += $(PYLINT_OUTPUTS)
2168a54784eSIan Rogersendif
2178a54784eSIan Rogers
21836a1b006SIan Rogers# If there are orphaned files remove them.
21936a1b006SIan Rogersifneq ($(strip $(ORPHAN_FILES)),)
22036a1b006SIan Rogers.PHONY: prune_orphans
2218a54784eSIan Rogers
22236a1b006SIan Rogers# Message for $(call echo-cmd,rm). Generally cleaning files isn't part
22336a1b006SIan Rogers# of a build step.
22497ab8968SMarkus Mayerquiet_cmd_rm = RM      ...$(words $^) orphan file(s)...
22536a1b006SIan Rogers
226b6712d91SMarkus Mayer# The list of files can be long. Use xargs to prevent issues.
22797ab8968SMarkus Mayerprune_orphans: $(ORPHAN_FILES)
228b6712d91SMarkus Mayer	$(Q)$(call echo-cmd,rm)echo "$^" | xargs rm -f
22936a1b006SIan Rogers
23036a1b006SIan RogersJEVENTS_DEPS += prune_orphans
23100facc76SIan Rogersendif
2327822a891SNamhyung Kim
23336a1b006SIan Rogers# Finally, the rule to build pmu-events.c using jevents.py. All test
23436a1b006SIan Rogers# and inputs are dependencies.
23536a1b006SIan Rogers$(PMU_EVENTS_C): $(JEVENTS_DEPS)
2367822a891SNamhyung Kim	$(call rule_mkdir)
237bb922345SIan Rogers	$(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) $(JEVENTS_ARCH) $(JEVENTS_MODEL) \
238bb922345SIan Rogers            $(OUT_DIR) $(PMU_EVENTS_C) $(PMU_EVENTS_STRING_C)
239bb922345SIan Rogers
240bb922345SIan Rogers$(PMU_EVENTS_STRING_C): $(PMU_EVENTS_C)
241bb922345SIan Rogers	@:
24236a1b006SIan Rogers
24336a1b006SIan Rogersendif # ifeq ($(NO_JEVENTS),1)
244