diff options
author | Michael Witten <mfwitten@gmail.com> | 2011-04-02 17:46:09 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2011-04-19 07:18:36 -0400 |
commit | ced465c400b23656ef2c4fbfb4add0e5b92e3d97 (patch) | |
tree | 58df4aa0275a03260a1773d418610a22fecf4957 /tools/perf/Makefile | |
parent | 3643b133f2cb8023e8cedcbef43215a99d7df561 (diff) |
perf tools: Makefile: PYTHON{,_CONFIG} to bandage Python 3 incompatibility
Currently, Python 3 is not supported by perf's code; this
can cause the build to fail for systems that have Python 3
installed as the default python:
python{,-config}
The Correct Solution is to write compatibility code so that
Python 3 works out-of-the-box.
However, users often have an ancillary Python 2 installed:
python2{,-config}
Therefore, a quick fix is to allow the user to specify those
ancillary paths as the python binaries that Makefile should
use, thereby avoiding Python 3 altogether; as an added benefit,
the Python binaries may be installed in non-standard locations
without the need for updating any PATH variable.
This commit adds the ability to set PYTHON and/or PYTHON_CONFIG
either as environment variables or as make variables on the
command line; the paths may be relative, and usually only PYTHON
is necessary in order for PYTHON_CONFIG to be defined implicitly.
Some rudimentary error checking is performed when the user
explicitly specifies a value for any of these variables.
In addition, this commit introduces significantly robust makefile
infrastructure for working with paths and communicating with the
shell; it's currently only used for handling Python, but I hope
it will prove useful in refactoring the makefiles.
Thanks to:
Raghavendra D Prabhu <rprabhu@wnohang.net>
for motivating this patch.
Acked-by: Raghavendra D Prabhu <rprabhu@wnohang.net>
Link: http://lkml.kernel.org/r/e987828e-87ec-4973-95e7-47f10f5d9bab-mfwitten@gmail.com
Signed-off-by: Michael Witten <mfwitten@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/Makefile')
-rw-r--r-- | tools/perf/Makefile | 97 |
1 files changed, 77 insertions, 20 deletions
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index aaf4dd3fd80..b5276c7e9be 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
@@ -5,6 +5,8 @@ endif | |||
5 | # The default target of this Makefile is... | 5 | # The default target of this Makefile is... |
6 | all: | 6 | all: |
7 | 7 | ||
8 | include config/utilities.mak | ||
9 | |||
8 | ifneq ($(OUTPUT),) | 10 | ifneq ($(OUTPUT),) |
9 | # check that the output directory actually exists | 11 | # check that the output directory actually exists |
10 | OUTDIR := $(shell cd $(OUTPUT) && /bin/pwd) | 12 | OUTDIR := $(shell cd $(OUTPUT) && /bin/pwd) |
@@ -13,6 +15,12 @@ endif | |||
13 | 15 | ||
14 | # Define V to have a more verbose compile. | 16 | # Define V to have a more verbose compile. |
15 | # | 17 | # |
18 | # Define PYTHON to point to the python binary if the default | ||
19 | # `python' is not correct; for example: PYTHON=python2 | ||
20 | # | ||
21 | # Define PYTHON_CONFIG to point to the python-config binary if | ||
22 | # the default `$(PYTHON)-config' is not correct. | ||
23 | # | ||
16 | # Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8 | 24 | # Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8 |
17 | # | 25 | # |
18 | # Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72. | 26 | # Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72. |
@@ -165,7 +173,7 @@ grep-libs = $(filter -l%,$(1)) | |||
165 | strip-libs = $(filter-out -l%,$(1)) | 173 | strip-libs = $(filter-out -l%,$(1)) |
166 | 174 | ||
167 | $(OUTPUT)python/perf.so: $(PYRF_OBJS) | 175 | $(OUTPUT)python/perf.so: $(PYRF_OBJS) |
168 | $(QUIET_GEN)CFLAGS='$(BASIC_CFLAGS)' python util/setup.py \ | 176 | $(QUIET_GEN)CFLAGS='$(BASIC_CFLAGS)' $(PYTHON_WORD) util/setup.py \ |
169 | --quiet build_ext \ | 177 | --quiet build_ext \ |
170 | --build-lib='$(OUTPUT)python' \ | 178 | --build-lib='$(OUTPUT)python' \ |
171 | --build-temp='$(OUTPUT)python/temp' | 179 | --build-temp='$(OUTPUT)python/temp' |
@@ -473,24 +481,74 @@ else | |||
473 | endif | 481 | endif |
474 | endif | 482 | endif |
475 | 483 | ||
476 | ifdef NO_LIBPYTHON | 484 | disable-python = $(eval $(disable-python_code)) |
477 | BASIC_CFLAGS += -DNO_LIBPYTHON | 485 | define disable-python_code |
486 | BASIC_CFLAGS += -DNO_LIBPYTHON | ||
487 | $(if $(1),$(warning No $(1) was found)) | ||
488 | $(warning Python support won't be built) | ||
489 | endef | ||
490 | |||
491 | override PYTHON := \ | ||
492 | $(call get-executable-or-default,PYTHON,python) | ||
493 | |||
494 | ifndef PYTHON | ||
495 | $(call disable-python,python interpreter) | ||
496 | python-clean := | ||
478 | else | 497 | else |
479 | PYTHON_EMBED_LDOPTS = $(shell python-config --ldflags 2>/dev/null) | 498 | |
480 | PYTHON_EMBED_LDFLAGS = $(call strip-libs,$(PYTHON_EMBED_LDOPTS)) | 499 | PYTHON_WORD := $(call shell-wordify,$(PYTHON)) |
481 | PYTHON_EMBED_LIBADD = $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) | 500 | |
482 | PYTHON_EMBED_CCOPTS = `python-config --cflags 2>/dev/null` | 501 | python-clean := $(PYTHON_WORD) util/setup.py clean \ |
483 | FLAGS_PYTHON_EMBED=$(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS) | 502 | --build-lib='$(OUTPUT)python' \ |
484 | ifneq ($(call try-cc,$(SOURCE_PYTHON_EMBED),$(FLAGS_PYTHON_EMBED)),y) | 503 | --build-temp='$(OUTPUT)python/temp' |
485 | msg := $(warning No Python.h found, install python-dev[el] to have python support in 'perf script' and to build the python bindings) | 504 | |
486 | BASIC_CFLAGS += -DNO_LIBPYTHON | 505 | ifdef NO_LIBPYTHON |
487 | else | 506 | $(call disable-python) |
488 | ALL_LDFLAGS += $(PYTHON_EMBED_LDFLAGS) | 507 | else |
489 | EXTLIBS += $(PYTHON_EMBED_LIBADD) | 508 | |
490 | LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-python.o | 509 | override PYTHON_CONFIG := \ |
491 | LIB_OBJS += $(OUTPUT)scripts/python/Perf-Trace-Util/Context.o | 510 | $(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON)-config) |
492 | LANG_BINDINGS += $(OUTPUT)python/perf.so | 511 | |
493 | endif | 512 | ifndef PYTHON_CONFIG |
513 | $(call disable-python,python-config tool) | ||
514 | else | ||
515 | |||
516 | PYTHON_CONFIG_SQ := $(call shell-sq,$(PYTHON_CONFIG)) | ||
517 | |||
518 | PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null) | ||
519 | PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS)) | ||
520 | PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) | ||
521 | PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null) | ||
522 | FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS) | ||
523 | |||
524 | ifneq ($(call try-cc,$(SOURCE_PYTHON_EMBED),$(FLAGS_PYTHON_EMBED)),y) | ||
525 | $(call disable-python,Python.h (for Python 2.x)) | ||
526 | else | ||
527 | |||
528 | ifneq ($(call try-cc,$(SOURCE_PYTHON_VERSION),$(FLAGS_PYTHON_EMBED)),y) | ||
529 | $(warning Python 3 is not yet supported; please set) | ||
530 | $(warning PYTHON and/or PYTHON_CONFIG appropriately.) | ||
531 | $(warning If you also have Python 2 installed, then) | ||
532 | $(warning try something like:) | ||
533 | $(warning $(and ,)) | ||
534 | $(warning $(and ,) make PYTHON=python2) | ||
535 | $(warning $(and ,)) | ||
536 | $(warning Otherwise, disable Python support entirely:) | ||
537 | $(warning $(and ,)) | ||
538 | $(warning $(and ,) make NO_LIBPYTHON=1) | ||
539 | $(warning $(and ,)) | ||
540 | $(error $(and ,)) | ||
541 | else | ||
542 | ALL_LDFLAGS += $(PYTHON_EMBED_LDFLAGS) | ||
543 | EXTLIBS += $(PYTHON_EMBED_LIBADD) | ||
544 | LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-python.o | ||
545 | LIB_OBJS += $(OUTPUT)scripts/python/Perf-Trace-Util/Context.o | ||
546 | LANG_BINDINGS += $(OUTPUT)python/perf.so | ||
547 | endif | ||
548 | |||
549 | endif | ||
550 | endif | ||
551 | endif | ||
494 | endif | 552 | endif |
495 | 553 | ||
496 | ifdef NO_DEMANGLE | 554 | ifdef NO_DEMANGLE |
@@ -831,8 +889,7 @@ clean: | |||
831 | $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* | 889 | $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* |
832 | $(MAKE) -C Documentation/ clean | 890 | $(MAKE) -C Documentation/ clean |
833 | $(RM) $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)PERF-CFLAGS | 891 | $(RM) $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)PERF-CFLAGS |
834 | @python util/setup.py clean --build-lib='$(OUTPUT)python' \ | 892 | $(python-clean) |
835 | --build-temp='$(OUTPUT)python/temp' | ||
836 | 893 | ||
837 | .PHONY: all install clean strip | 894 | .PHONY: all install clean strip |
838 | .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell | 895 | .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell |