| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- EMPTY_PMU_EVENTS_C = pmu-events/empty-pmu-events.c
- # pmu-events.c will be generated by jevents.py or copied from EMPTY_PMU_EVENTS_C
- PMU_EVENTS_C = $(OUTPUT)pmu-events/pmu-events.c
- pmu-events-y += pmu-events.o
- # pmu-events.c file is generated in the OUTPUT directory so it needs a
- # separate rule to depend on it properly
- $(OUTPUT)pmu-events/pmu-events.o: $(PMU_EVENTS_C)
- $(call rule_mkdir)
- $(call if_changed_dep,cc_o_c)
- # Message for $(call echo-cmd,cp), possibly remove the src file from
- # the destination to save space in the build log.
- quiet_cmd_cp = COPY $(patsubst %$<,%,$@) <- $<
- # --- NO_JEVENTS=1 build ---
- ifeq ($(NO_JEVENTS),1)
- $(PMU_EVENTS_C): $(EMPTY_PMU_EVENTS_C)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,cp)cp $< $@
- else
- # --- Regular build ---
- # Setup the JEVENTS_ARCH and JEVENTS_MODEL
- ifeq ($(JEVENTS_ARCH),)
- JEVENTS_ARCH=$(SRCARCH)
- endif
- JEVENTS_MODEL ?= all
- # The input json/csv files
- SRC_DIR := pmu-events/arch
- ifeq ($(JEVENTS_ARCH),all)
- SRC_JSON := $(shell find $(SRC_DIR) -name '*.json' -o -name '*.csv')
- else
- SRC_JSON := $(shell find $(SRC_DIR)/common $(SRC_DIR)/test $(SRC_DIR)/$(JEVENTS_ARCH) -name '*.json' -o -name '*.csv')
- endif
- # Python to build the generic legacy cache events
- LEGACY_CACHE_PY = pmu-events/make_legacy_cache.py
- LEGACY_CACHE_JSON = $(OUTPUT)pmu-events/arch/common/common/legacy-cache.json
- GEN_JSON = $(LEGACY_CACHE_JSON)
- $(LEGACY_CACHE_JSON): $(LEGACY_CACHE_PY)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,gen)$(PYTHON) $(LEGACY_CACHE_PY) > $@
- # Python to generate architectural metrics
- GEN_METRIC_DEPS := pmu-events/metric.py pmu-events/common_metrics.py
- # Functions to extract the model from an extra-metrics.json or extra-metricgroups.json path.
- model_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/extra-metric.*\.json@\1@')
- vendor_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/[^/]*/extra-metric.*\.json@\1@')
- ifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),x86 all))
- # Generate AMD Json
- ZENS = $(shell ls -d pmu-events/arch/x86/amdzen*)
- ZEN_METRICS = $(foreach x,$(ZENS),$(OUTPUT)$(x)/extra-metrics.json)
- ZEN_METRICGROUPS = $(foreach x,$(ZENS),$(OUTPUT)$(x)/extra-metricgroups.json)
- GEN_JSON += $(ZEN_METRICS) $(ZEN_METRICGROUPS)
- $(ZEN_METRICS): pmu-events/amd_metrics.py $(GEN_METRIC_DEPS)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,gen)$(PYTHON) $< $(call model_name,$@) pmu-events/arch > $@
- $(ZEN_METRICGROUPS): pmu-events/amd_metrics.py $(GEN_METRIC_DEPS)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call model_name,$@) pmu-events/arch > $@
- endif
- ifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),arm64 all))
- # Generate ARM Json
- ARMS = $(shell ls -d pmu-events/arch/arm64/arm/*|grep -v cmn)
- ARM_METRICS = $(foreach x,$(ARMS),$(OUTPUT)$(x)/extra-metrics.json)
- ARM_METRICGROUPS = $(foreach x,$(ARMS),$(OUTPUT)$(x)/extra-metricgroups.json)
- GEN_JSON += $(ARM_METRICS) $(ARM_METRICGROUPS)
- $(ARM_METRICS): pmu-events/arm64_metrics.py $(GEN_METRIC_DEPS)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,gen)$(PYTHON) $< $(call vendor_name,$@) $(call model_name,$@) pmu-events/arch > $@
- $(ARM_METRICGROUPS): pmu-events/arm64_metrics.py $(GEN_METRIC_DEPS)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call vendor_name,$@) $(call model_name,$@) pmu-events/arch > $@
- endif
- ifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),x86 all))
- # Generate Intel Json
- INTELS = $(shell ls -d pmu-events/arch/x86/*|grep -v amdzen|grep -v mapfile.csv)
- INTEL_METRICS = $(foreach x,$(INTELS),$(OUTPUT)$(x)/extra-metrics.json)
- INTEL_METRICGROUPS = $(foreach x,$(INTELS),$(OUTPUT)$(x)/extra-metricgroups.json)
- GEN_JSON += $(INTEL_METRICS) $(INTEL_METRICGROUPS)
- $(INTEL_METRICS): pmu-events/intel_metrics.py $(GEN_METRIC_DEPS)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,gen)$(PYTHON) $< $(call model_name,$@) pmu-events/arch > $@
- $(INTEL_METRICGROUPS): pmu-events/intel_metrics.py $(GEN_METRIC_DEPS)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call model_name,$@) pmu-events/arch > $@
- endif
- OUT_DIR := $(OUTPUT)pmu-events/arch
- ifeq ($(OUTPUT),)
- OUT_JSON := $(SRC_JSON)
- ORPHAN_FILES :=
- else
- # Things that need to be built in the OUTPUT directory. Note, ensure
- # there is a slash after the directory name so that it matches what
- # $(dir) gives in COPY_RULE.
- OUT_JSON := $(patsubst $(SRC_DIR)/%,$(OUT_DIR)/%,$(SRC_JSON))
- OUT_DIRS := $(sort $(patsubst %/,%,$(dir $(OUT_JSON))))
- # Things already in the OUTPUT directory
- CUR_OUT_JSON := $(shell [ -d $(OUT_DIR) ] && find $(OUT_DIR) -type f)
- # Things in the OUTPUT directory but shouldn't be there as computed by
- # OUT_JSON and GEN_JSON.
- ORPHAN_FILES := $(filter-out $(OUT_JSON) $(GEN_JSON),$(CUR_OUT_JSON))
- # Message for $(call echo-cmd,mkd). There is already a mkdir message
- # but it assumes $@ is a file to mkdir the directory for.
- quiet_cmd_mkd = MKDIR $@
- $(OUT_DIRS):
- $(Q)$(call echo-cmd,mkd)mkdir -p $@
- # Explicitly generate rules to copy SRC_JSON files as $(dir) cannot
- # apply to $@ in a dependency. Exclude from the copy rules any that
- # look like they are copying generated json. This happens as a perf
- # build within the tools/perf directory will leave generated json
- # files within the tree, these then get picked up by SRC_JSON find.
- define COPY_RULE
- $(2): $(1) | $(3)
- $$(Q)$$(call echo-cmd,cp)cp $(1) $(2)
- endef
- $(foreach src,$(SRC_JSON), \
- $(eval dest := $(patsubst $(SRC_DIR)/%,$(OUT_DIR)/%,$(src))) \
- $(eval ddir := $(patsubst %/,%,$(dir $(dest)))) \
- $(if $(filter $(dest),$(GEN_JSON)),, \
- $(eval $(call COPY_RULE,$(src),$(dest),$(ddir))) \
- ) \
- )
- endif # ifneq ($(OUTPUT),)
- JEVENTS_PY = pmu-events/jevents.py
- METRIC_PY = pmu-events/metric.py
- # Rule to run the metric test.
- METRIC_TEST_PY = pmu-events/metric_test.py
- METRIC_TEST_LOG = $(OUTPUT)pmu-events/metric_test.log
- $(METRIC_TEST_LOG): $(METRIC_TEST_PY) $(METRIC_PY)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,test)$(PYTHON) $< 2> $@ || (cat $@ && false)
- # Rule to create then ensure the empty-pmu-events.c is in sync.
- TEST_EMPTY_PMU_EVENTS_C = $(OUTPUT)pmu-events/test-empty-pmu-events.c
- EMPTY_PMU_EVENTS_TEST_LOG = $(OUTPUT)pmu-events/empty-pmu-events.log
- $(TEST_EMPTY_PMU_EVENTS_C): $(OUT_JSON) $(GEN_JSON) $(JEVENTS_PY) $(METRIC_PY)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) none none $(OUTPUT)pmu-events/arch $@
- $(EMPTY_PMU_EVENTS_TEST_LOG): $(EMPTY_PMU_EVENTS_C) $(TEST_EMPTY_PMU_EVENTS_C)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,test)diff -u $^ 2> $@ || (cat $@ && false)
- # Dependencies for jevents.py
- JEVENTS_DEPS := $(OUT_JSON) $(GEN_JSON) $(JEVENTS_PY) $(METRIC_PY) $(EMPTY_PMU_EVENTS_TEST_LOG) $(METRIC_TEST_LOG)
- # Rules to run mypy if enabled.
- ifdef MYPY
- define MYPY_RULE
- $(2): $(1)
- $$(Q)$$(call echo-cmd,test)mypy $(1) > $(2) || (cat $(2) && rm $(2) && false)
- endef
- $(foreach src,$(wildcard pmu-events/*.py), \
- $(eval dest := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.mypy_log,$(src))) \
- $(eval $(call MYPY_RULE,$(src),$(dest))) \
- )
- MYPY_INPUTS := $(wildcard pmu-events/*.py)
- MYPY_OUTPUTS := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.mypy_log,$(MYPY_INPUTS))
- JEVENTS_DEPS += $(MYPY_OUTPUTS)
- endif
- # Rules to run pylint if enabled.
- ifdef PYLINT
- define PYLINT_RULE
- $(2): $(1)
- $$(Q)$$(call echo-cmd,test)pylint $(1) > $(2) || (cat $(2) && rm $(2) && false)
- endef
- $(foreach src,$(wildcard pmu-events/*.py), \
- $(eval dest := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.pylint_log,$(src))) \
- $(eval $(call PYLINT_RULE,$(src),$(dest))) \
- )
- PYLINT_INPUTS := $(wildcard pmu-events/*.py)
- PYLINT_OUTPUTS := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.pylint_log,$(PYLINT_INPUTS))
- JEVENTS_DEPS += $(PYLINT_OUTPUTS)
- endif
- # If there are orphaned files remove them.
- ifneq ($(strip $(ORPHAN_FILES)),)
- .PHONY: prune_orphans
- # Message for $(call echo-cmd,rm). Generally cleaning files isn't part
- # of a build step.
- quiet_cmd_rm = RM $^
- prune_orphans: $(ORPHAN_FILES)
- # The list of files can be long. Use xargs to prevent issues.
- $(Q)$(call echo-cmd,rm)echo "$^" | xargs rm -f
- JEVENTS_DEPS += prune_orphans
- endif
- # Finally, the rule to build pmu-events.c using jevents.py. All test
- # and inputs are dependencies.
- $(PMU_EVENTS_C): $(JEVENTS_DEPS)
- $(call rule_mkdir)
- $(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) $(JEVENTS_ARCH) $(JEVENTS_MODEL) $(OUT_DIR) $@
- endif # ifeq ($(NO_JEVENTS),1)
|