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