2013-03-15 22:28:49 +07:00
uname_M := $( shell uname -m 2>/dev/null || echo not)
ARCH ?= $( shell echo $( uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[ 234] .*/sh/ -e s/aarch64.*/arm64/ )
NO_PERF_REGS := 1
# Additional ARCH settings for x86
i f e q ( $( ARCH ) , i 3 8 6 )
override ARCH := x86
NO_PERF_REGS := 0
LIBUNWIND_LIBS = -lunwind -lunwind-x86
e n d i f
i f e q ( $( ARCH ) , x 8 6 _ 6 4 )
override ARCH := x86
IS_X86_64 := 0
ifeq ( , $( findstring m32,$( EXTRA_CFLAGS) ) )
IS_X86_64 := $( shell echo __x86_64__ | ${ CC } -E -x c - | tail -n 1)
endif
ifeq ( ${ IS_X86_64 } , 1)
RAW_ARCH := x86_64
ARCH_CFLAGS := -DARCH_X86_64
ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
endif
NO_PERF_REGS := 0
LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
e n d i f
i f e q ( $( NO_PERF_REGS ) , 0 )
BASIC_CFLAGS += -DHAVE_PERF_REGS
e n d i f
2013-03-25 06:32:01 +07:00
- i n c l u d e c o n f i g / f e a t u r e - t e s t s . m a k
i f e q ( $( call get -executable ,$ ( FLEX ) ) , )
dummy := $( error Error: $( FLEX) is missing on this system, please install it)
e n d i f
i f e q ( $( call get -executable ,$ ( BISON ) ) , )
dummy := $( error Error: $( BISON) is missing on this system, please install it)
e n d i f
2013-03-25 06:40:48 +07:00
# Treat warnings as errors unless directed not to
i f n e q ( $( WERROR ) , 0 )
CFLAGS_WERROR := -Werror
e n d i f
i f e q ( "$(origin DEBUG)" , "command line" )
PERF_DEBUG = $( DEBUG)
e n d i f
i f n d e f P E R F _ D E B U G
CFLAGS_OPTIMIZE = -O6
e n d i f
i f d e f P A R S E R _ D E B U G
PARSER_DEBUG_BISON := -t
PARSER_DEBUG_FLEX := -d
PARSER_DEBUG_CFLAGS := -DPARSER_DEBUG
e n d i f
CFLAGS = -fno-omit-frame-pointer -ggdb3 -funwind-tables -Wall -Wextra -std= gnu99 $( CFLAGS_WERROR) $( CFLAGS_OPTIMIZE) $( EXTRA_WARNINGS) $( EXTRA_CFLAGS) $( PARSER_DEBUG_CFLAGS)
EXTLIBS = -lpthread -lrt -lelf -lm
ALL_CFLAGS = $( CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS= 64 -D_GNU_SOURCE
ALL_LDFLAGS = $( LDFLAGS)
i f e q ( $( call try -cc ,$ ( SOURCE_HELLO ) ,$ ( CFLAGS ) -Werror -fstack -protector -all ,-fstack -protector -all ) , y )
CFLAGS := $( CFLAGS) -fstack-protector-all
e n d i f
i f e q ( $( call try -cc ,$ ( SOURCE_HELLO ) ,$ ( CFLAGS ) -Werror -Wstack -protector ,-Wstack -protector ) , y )
CFLAGS := $( CFLAGS) -Wstack-protector
e n d i f
i f e q ( $( call try -cc ,$ ( SOURCE_HELLO ) ,$ ( CFLAGS ) -Werror -Wvolatile -register -var ,-Wvolatile -register -var ) , y )
CFLAGS := $( CFLAGS) -Wvolatile-register-var
e n d i f
i f n d e f P E R F _ D E B U G
ifeq ( $( call try-cc,$( SOURCE_HELLO) ,$( CFLAGS) -D_FORTIFY_SOURCE= 2,-D_FORTIFY_SOURCE= 2) ,y)
CFLAGS := $( CFLAGS) -D_FORTIFY_SOURCE= 2
endif
e n d i f
BASIC_CFLAGS += \
-Iutil/include \
-Iarch/$( ARCH) /include \
$( if $( objtree) ,-I$( objtree) /arch/$( ARCH) /include/generated/uapi) \
-I$( srctree) /arch/$( ARCH) /include/uapi \
-I$( srctree) /arch/$( ARCH) /include \
$( if $( objtree) ,-I$( objtree) /include/generated/uapi) \
-I$( srctree) /include/uapi \
-I$( srctree) /include \
-I$( OUTPUT) util \
-Iutil \
-I. \
-I$( TRACE_EVENT_DIR) \
-I../lib/ \
-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS= 64 -D_GNU_SOURCE
BASIC_LDFLAGS =
i f e q ( $( call try -cc ,$ ( SOURCE_BIONIC ) ,$ ( CFLAGS ) ,bionic ) , y )
BIONIC := 1
EXTLIBS := $( filter-out -lrt,$( EXTLIBS) )
EXTLIBS := $( filter-out -lpthread,$( EXTLIBS) )
BASIC_CFLAGS += -I.
e n d i f
2013-03-25 06:45:08 +07:00
i f d e f N O _ L I B E L F
NO_DWARF := 1
NO_DEMANGLE := 1
NO_LIBUNWIND := 1
e l s e
FLAGS_LIBELF = $( ALL_CFLAGS) $( ALL_LDFLAGS) $( EXTLIBS)
i f n e q ( $( call try -cc ,$ ( SOURCE_LIBELF ) ,$ ( FLAGS_LIBELF ) ,libelf ) , y )
FLAGS_GLIBC = $( ALL_CFLAGS) $( ALL_LDFLAGS)
ifeq ( $( call try-cc,$( SOURCE_GLIBC) ,$( FLAGS_GLIBC) ,glibc) ,y)
LIBC_SUPPORT := 1
endif
ifeq ( $( BIONIC) ,1)
LIBC_SUPPORT := 1
endif
ifeq ( $( LIBC_SUPPORT) ,1)
msg := $( warning No libelf found, disables 'probe' tool, please install elfutils-libelf-devel/libelf-dev) ;
NO_LIBELF := 1
NO_DWARF := 1
NO_DEMANGLE := 1
else
msg := $( error No gnu/libc-version.h found, please install glibc-dev[ el] /glibc-static) ;
endif
e l s e
# for linking with debug library, run like:
# make DEBUG=1 LIBDW_DIR=/opt/libdw/
ifdef LIBDW_DIR
LIBDW_CFLAGS := -I$( LIBDW_DIR) /include
LIBDW_LDFLAGS := -L$( LIBDW_DIR) /lib
endif
FLAGS_DWARF = $( ALL_CFLAGS) $( LIBDW_CFLAGS) -ldw -lelf $( LIBDW_LDFLAGS) $( ALL_LDFLAGS) $( EXTLIBS)
ifneq ( $( call try-cc,$( SOURCE_DWARF) ,$( FLAGS_DWARF) ,libdw) ,y)
msg := $( warning No libdw.h found or old libdw.h found or elfutils is older than 0.138, disables dwarf support. Please install new elfutils-devel/libdw-dev) ;
NO_DWARF := 1
endif # Dwarf support
e n d i f # SOURCE_LIBELF
e n d i f # NO_LIBELF
i f n d e f N O _ L I B E L F
BASIC_CFLAGS += -DLIBELF_SUPPORT
FLAGS_LIBELF = $( ALL_CFLAGS) $( ALL_LDFLAGS) $( EXTLIBS)
i f e q ( $( call try -cc ,$ ( SOURCE_ELF_MMAP ) ,$ ( FLAGS_LIBELF ) ,-DLIBELF_MMAP ) , y )
BASIC_CFLAGS += -DLIBELF_MMAP
e n d i f
2013-03-25 06:48:14 +07:00
# include ARCH specific config
- i n c l u d e a r c h / $( ARCH ) / M a k e f i l e
i f n d e f N O _ D W A R F
i f e q ( $( origin PERF_HAVE_DWARF_REGS ) , u n d e f i n e d )
msg := $( warning DWARF register mappings have not been defined for architecture $( ARCH) , DWARF support disabled) ;
NO_DWARF := 1
e l s e
BASIC_CFLAGS := -DDWARF_SUPPORT $( LIBDW_CFLAGS) $( BASIC_CFLAGS)
BASIC_LDFLAGS := $( LIBDW_LDFLAGS) $( BASIC_LDFLAGS)
EXTLIBS += -lelf -ldw
e n d i f # PERF_HAVE_DWARF_REGS
e n d i f # NO_DWARF
2013-03-25 06:45:08 +07:00
e n d i f # NO_LIBELF
2013-03-25 06:53:03 +07:00
# There's only x86 (both 32 and 64) support for CFI unwind so far
i f n e q ( $( ARCH ) , x 8 6 )
NO_LIBUNWIND := 1
e n d i f
i f n d e f N O _ L I B U N W I N D
# for linking with debug library, run like:
# make DEBUG=1 LIBUNWIND_DIR=/opt/libunwind/
i f d e f L I B U N W I N D _ D I R
LIBUNWIND_CFLAGS := -I$( LIBUNWIND_DIR) /include
LIBUNWIND_LDFLAGS := -L$( LIBUNWIND_DIR) /lib
e n d i f
FLAGS_UNWIND = $( LIBUNWIND_CFLAGS) $( ALL_CFLAGS) $( LIBUNWIND_LDFLAGS) $( ALL_LDFLAGS) $( EXTLIBS) $( LIBUNWIND_LIBS)
i f n e q ( $( call try -cc ,$ ( SOURCE_LIBUNWIND ) ,$ ( FLAGS_UNWIND ) ,libunwind ) , y )
msg := $( warning No libunwind found, disabling post unwind support. Please install libunwind-dev[ el] >= 0.99) ;
NO_LIBUNWIND := 1
e n d i f # Libunwind support
e n d i f # NO_LIBUNWIND
i f n d e f N O _ L I B U N W I N D
BASIC_CFLAGS += -DLIBUNWIND_SUPPORT
EXTLIBS += $( LIBUNWIND_LIBS)
BASIC_CFLAGS := $( LIBUNWIND_CFLAGS) $( BASIC_CFLAGS)
BASIC_LDFLAGS := $( LIBUNWIND_LDFLAGS) $( BASIC_LDFLAGS)
e n d i f # NO_LIBUNWIND
2013-03-25 06:54:36 +07:00
i f n d e f N O _ L I B A U D I T
FLAGS_LIBAUDIT = $( ALL_CFLAGS) $( ALL_LDFLAGS) -laudit
ifneq ( $( call try-cc,$( SOURCE_LIBAUDIT) ,$( FLAGS_LIBAUDIT) ,libaudit) ,y)
msg := $( warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev) ;
NO_LIBAUDIT := 1
else
BASIC_CFLAGS += -DLIBAUDIT_SUPPORT
EXTLIBS += -laudit
endif
e n d i f
2013-03-25 06:56:08 +07:00
i f d e f N O _ N E W T
NO_SLANG = 1
e n d i f
i f n d e f N O _ S L A N G
FLAGS_SLANG = $( ALL_CFLAGS) $( ALL_LDFLAGS) $( EXTLIBS) -I/usr/include/slang -lslang
ifneq ( $( call try-cc,$( SOURCE_SLANG) ,$( FLAGS_SLANG) ,libslang) ,y)
msg := $( warning slang not found, disables TUI support. Please install slang-devel or libslang-dev) ;
NO_SLANG := 1
else
# Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
BASIC_CFLAGS += -I/usr/include/slang
BASIC_CFLAGS += -DSLANG_SUPPORT
EXTLIBS += -lslang
endif
e n d i f
2013-03-18 06:09:24 +07:00
i f n d e f N O _ G T K 2
FLAGS_GTK2 = $( ALL_CFLAGS) $( ALL_LDFLAGS) $( EXTLIBS) $( shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null)
ifneq ( $( call try-cc,$( SOURCE_GTK2) ,$( FLAGS_GTK2) ,gtk2) ,y)
msg := $( warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev) ;
NO_GTK2 := 1
else
ifeq ( $( call try-cc,$( SOURCE_GTK2_INFOBAR) ,$( FLAGS_GTK2) ,-DHAVE_GTK_INFO_BAR) ,y)
BASIC_CFLAGS += -DHAVE_GTK_INFO_BAR
endif
BASIC_CFLAGS += -DGTK2_SUPPORT
BASIC_CFLAGS += $( shell pkg-config --cflags gtk+-2.0 2>/dev/null)
EXTLIBS += $( shell pkg-config --libs gtk+-2.0 2>/dev/null)
endif
e n d i f
2013-03-18 06:19:44 +07:00
grep-libs = $( filter -l%,$( 1) )
strip-libs = $( filter-out -l%,$( 1) )
i f d e f N O _ L I B P E R L
BASIC_CFLAGS += -DNO_LIBPERL
e l s e
PERL_EMBED_LDOPTS = $( shell perl -MExtUtils::Embed -e ldopts 2>/dev/null)
PERL_EMBED_LDFLAGS = $( call strip-libs,$( PERL_EMBED_LDOPTS) )
PERL_EMBED_LIBADD = $( call grep-libs,$( PERL_EMBED_LDOPTS) )
PERL_EMBED_CCOPTS = ` perl -MExtUtils::Embed -e ccopts 2>/dev/null`
FLAGS_PERL_EMBED = $( PERL_EMBED_CCOPTS) $( PERL_EMBED_LDOPTS)
ifneq ( $( call try-cc,$( SOURCE_PERL_EMBED) ,$( FLAGS_PERL_EMBED) ,perl) ,y)
BASIC_CFLAGS += -DNO_LIBPERL
NO_LIBPERL := 1
else
ALL_LDFLAGS += $( PERL_EMBED_LDFLAGS)
EXTLIBS += $( PERL_EMBED_LIBADD)
endif
e n d i f
2013-03-18 06:35:32 +07:00
disable-python = $( eval $( disable-python_code) )
d e f i n e d i s a b l e - p y t h o n _ c o d e
BASIC_CFLAGS += -DNO_LIBPYTHON
$( if $( 1) ,$( warning No $( 1) was found) )
$( warning Python support will not be built)
NO_LIBPYTHON := 1
e n d e f
override PYTHON : = \
$( call get-executable-or-default,PYTHON,python)
i f n d e f P Y T H O N
$( call disable-python,python interpreter)
e l s e
PYTHON_WORD := $( call shell-wordify,$( PYTHON) )
ifdef NO_LIBPYTHON
$( call disable-python)
else
override PYTHON_CONFIG := \
$( call get-executable-or-default,PYTHON_CONFIG,$( PYTHON) -config)
ifndef PYTHON_CONFIG
$( call disable-python,python-config tool)
else
PYTHON_CONFIG_SQ := $( call shell-sq,$( PYTHON_CONFIG) )
PYTHON_EMBED_LDOPTS := $( shell $( PYTHON_CONFIG_SQ) --ldflags 2>/dev/null)
PYTHON_EMBED_LDFLAGS := $( call strip-libs,$( PYTHON_EMBED_LDOPTS) )
PYTHON_EMBED_LIBADD := $( call grep-libs,$( PYTHON_EMBED_LDOPTS) )
PYTHON_EMBED_CCOPTS := $( shell $( PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
FLAGS_PYTHON_EMBED := $( PYTHON_EMBED_CCOPTS) $( PYTHON_EMBED_LDOPTS)
ifneq ( $( call try-cc,$( SOURCE_PYTHON_EMBED) ,$( FLAGS_PYTHON_EMBED) ,python) ,y)
$( call disable-python,Python.h ( for Python 2.x) )
else
ifneq ( $( call try-cc,$( SOURCE_PYTHON_VERSION) ,$( FLAGS_PYTHON_EMBED) ,python version) ,y)
$( warning Python 3 is not yet supported; please set )
$( warning PYTHON and/or PYTHON_CONFIG appropriately.)
$( warning If you also have Python 2 installed, then )
$( warning try something like:)
$( warning $( and ,) )
$( warning $( and ,) make PYTHON = python2)
$( warning $( and ,) )
$( warning Otherwise, disable Python support entirely:)
$( warning $( and ,) )
$( warning $( and ,) make NO_LIBPYTHON = 1)
$( warning $( and ,) )
$( error $( and ,) )
else
ALL_LDFLAGS += $( PYTHON_EMBED_LDFLAGS)
EXTLIBS += $( PYTHON_EMBED_LIBADD)
LANG_BINDINGS += $( OUTPUT) python/perf.so
endif
endif
endif
endif
e n d i f
2013-03-18 06:38:16 +07:00
i f d e f N O _ D E M A N G L E
BASIC_CFLAGS += -DNO_DEMANGLE
e l s e
ifdef HAVE_CPLUS_DEMANGLE
EXTLIBS += -liberty
BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE
else
FLAGS_BFD = $( ALL_CFLAGS) $( ALL_LDFLAGS) $( EXTLIBS) -DPACKAGE= 'perf' -lbfd
has_bfd := $( call try-cc,$( SOURCE_BFD) ,$( FLAGS_BFD) ,libbfd)
ifeq ( $( has_bfd) ,y)
EXTLIBS += -lbfd
else
FLAGS_BFD_IBERTY = $( FLAGS_BFD) -liberty
has_bfd_iberty := $( call try-cc,$( SOURCE_BFD) ,$( FLAGS_BFD_IBERTY) ,liberty)
ifeq ( $( has_bfd_iberty) ,y)
EXTLIBS += -lbfd -liberty
else
FLAGS_BFD_IBERTY_Z = $( FLAGS_BFD_IBERTY) -lz
has_bfd_iberty_z := $( call try-cc,$( SOURCE_BFD) ,$( FLAGS_BFD_IBERTY_Z) ,libz)
ifeq ( $( has_bfd_iberty_z) ,y)
EXTLIBS += -lbfd -liberty -lz
else
FLAGS_CPLUS_DEMANGLE = $( ALL_CFLAGS) $( ALL_LDFLAGS) $( EXTLIBS) -liberty
has_cplus_demangle := $( call try-cc,$( SOURCE_CPLUS_DEMANGLE) ,$( FLAGS_CPLUS_DEMANGLE) ,demangle)
ifeq ( $( has_cplus_demangle) ,y)
EXTLIBS += -liberty
BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE
else
msg := $( warning No bfd.h/libbfd found, install binutils-dev[ el] /zlib-static to gain symbol demangling)
BASIC_CFLAGS += -DNO_DEMANGLE
endif
endif
endif
endif
endif
e n d i f
2013-03-18 06:41:04 +07:00
i f n d e f N O _ S T R L C P Y
ifeq ( $( call try-cc,$( SOURCE_STRLCPY) ,,-DHAVE_STRLCPY) ,y)
BASIC_CFLAGS += -DHAVE_STRLCPY
endif
e n d i f
i f n d e f N O _ O N _ E X I T
ifeq ( $( call try-cc,$( SOURCE_ON_EXIT) ,,-DHAVE_ON_EXIT) ,y)
BASIC_CFLAGS += -DHAVE_ON_EXIT
endif
e n d i f
i f n d e f N O _ B A C K T R A C E
ifeq ( $( call try-cc,$( SOURCE_BACKTRACE) ,,-DBACKTRACE_SUPPORT) ,y)
BASIC_CFLAGS += -DBACKTRACE_SUPPORT
endif
e n d i f
2013-03-18 06:45:27 +07:00
i f n d e f N O _ L I B N U M A
FLAGS_LIBNUMA = $( ALL_CFLAGS) $( ALL_LDFLAGS) -lnuma
ifneq ( $( call try-cc,$( SOURCE_LIBNUMA) ,$( FLAGS_LIBNUMA) ,libnuma) ,y)
msg := $( warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numa-libs-devel or libnuma-dev) ;
NO_LIBNUMA := 1
else
BASIC_CFLAGS += -DLIBNUMA_SUPPORT
EXTLIBS += -lnuma
endif
e n d i f
2013-03-18 06:56:01 +07:00
# Among the variables below, these:
# perfexecdir
# template_dir
# mandir
# infodir
# htmldir
# ETC_PERFCONFIG (but not sysconfdir)
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "perf" at
# runtime figures out where they are based on the path to the executable.
# This can help installing the suite in a relocatable way.
# Make the path relative to DESTDIR, not to prefix
i f n d e f D E S T D I R
prefix = $( HOME)
e n d i f
bindir_relative = bin
bindir = $( prefix) /$( bindir_relative)
mandir = share/man
infodir = share/info
perfexecdir = libexec/perf-core
sharedir = $( prefix) /share
template_dir = share/perf-core/templates
htmldir = share/doc/perf-doc
i f e q ( $( prefix ) , / u s r )
sysconfdir = /etc
ETC_PERFCONFIG = $( sysconfdir) /perfconfig
e l s e
sysconfdir = $( prefix) /etc
ETC_PERFCONFIG = etc/perfconfig
e n d i f
lib = lib
# Shell quote (do not use $(call) to accommodate ancient setups);
ETC_PERFCONFIG_SQ = $( subst ',' \' ' ,$( ETC_PERFCONFIG) )
DESTDIR_SQ = $( subst ',' \' ' ,$( DESTDIR) )
bindir_SQ = $( subst ',' \' ' ,$( bindir) )
mandir_SQ = $( subst ',' \' ' ,$( mandir) )
infodir_SQ = $( subst ',' \' ' ,$( infodir) )
perfexecdir_SQ = $( subst ',' \' ' ,$( perfexecdir) )
template_dir_SQ = $( subst ',' \' ' ,$( template_dir) )
htmldir_SQ = $( subst ',' \' ' ,$( htmldir) )
prefix_SQ = $( subst ',' \' ' ,$( prefix) )
sysconfdir_SQ = $( subst ',' \' ' ,$( sysconfdir) )
i f n e q ( $( filter /%,$ ( firstword $ ( perfexecdir ) ) ) , )
perfexec_instdir = $( perfexecdir)
e l s e
perfexec_instdir = $( prefix) /$( perfexecdir)
e n d i f
perfexec_instdir_SQ = $( subst ',' \' ' ,$( perfexec_instdir) )