issue-503: recover original INSTALL file
That was accidently overwritten by autotools files update in r196 git-svn-id: http://gperftools.googlecode.com/svn/trunk@199 6b5cf1ce-ec42-a296-1ba9-69fdba395a50
This commit is contained in:
parent
5037f687d1
commit
dcf55b976f
381
INSTALL
381
INSTALL
|
@ -1,16 +1,324 @@
|
|||
Installation Instructions
|
||||
*************************
|
||||
Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
This file is free documentation; the Free Software Foundation gives
|
||||
This file is free documentation; the Free Software Foundation gives
|
||||
unlimited permission to copy, distribute and modify it.
|
||||
|
||||
|
||||
Perftools-Specific Install Notes
|
||||
================================
|
||||
|
||||
*** NOTE FOR 64-BIT LINUX SYSTEMS
|
||||
|
||||
The glibc built-in stack-unwinder on 64-bit systems has some problems
|
||||
with the perftools libraries. (In particular, the cpu/heap profiler
|
||||
may be in the middle of malloc, holding some malloc-related locks when
|
||||
they invoke the stack unwinder. The built-in stack unwinder may call
|
||||
malloc recursively, which may require the thread to acquire a lock it
|
||||
already holds: deadlock.)
|
||||
|
||||
For that reason, if you use a 64-bit system, we strongly recommend you
|
||||
install libunwind before trying to configure or install gperftools.
|
||||
libunwind can be found at
|
||||
|
||||
http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-beta.tar.gz
|
||||
|
||||
Even if you already have libunwind installed, you should check the
|
||||
version. Versions older than this will not work properly; too-new
|
||||
versions introduce new code that does not work well with perftools
|
||||
(because libunwind can call malloc, which will lead to deadlock).
|
||||
|
||||
There have been reports of crashes with libunwind 0.99 (see
|
||||
http://code.google.com/p/gperftools/issues/detail?id=374).
|
||||
Alternately, you can use a more recent libunwind (e.g. 1.0.1) at the
|
||||
cost of adding a bit of boilerplate to your code. For details, see
|
||||
http://groups.google.com/group/google-perftools/msg/2686d9f24ac4365f
|
||||
|
||||
CAUTION: if you install libunwind from the url above, be aware that
|
||||
you may have trouble if you try to statically link your binary with
|
||||
perftools: that is, if you link with 'gcc -static -lgcc_eh ...'.
|
||||
This is because both libunwind and libgcc implement the same C++
|
||||
exception handling APIs, but they implement them differently on
|
||||
some platforms. This is not likely to be a problem on ia64, but
|
||||
may be on x86-64.
|
||||
|
||||
Also, if you link binaries statically, make sure that you add
|
||||
-Wl,--eh-frame-hdr to your linker options. This is required so that
|
||||
libunwind can find the information generated by the compiler
|
||||
required for stack unwinding.
|
||||
|
||||
Using -static is rare, though, so unless you know this will affect
|
||||
you it probably won't.
|
||||
|
||||
If you cannot or do not wish to install libunwind, you can still try
|
||||
to use the built-in stack unwinder. The built-in stack unwinder
|
||||
requires that your application, the tcmalloc library, and system
|
||||
libraries like libc, all be compiled with a frame pointer. This is
|
||||
*not* the default for x86-64.
|
||||
|
||||
If you are on x86-64 system, know that you have a set of system
|
||||
libraries with frame-pointers enabled, and compile all your
|
||||
applications with -fno-omit-frame-pointer, then you can enable the
|
||||
built-in perftools stack unwinder by passing the
|
||||
--enable-frame-pointers flag to configure.
|
||||
|
||||
Even with the use of libunwind, there are still known problems with
|
||||
stack unwinding on 64-bit systems, particularly x86-64. See the
|
||||
"64-BIT ISSUES" section in README.
|
||||
|
||||
If you encounter problems, try compiling perftools with './configure
|
||||
--enable-frame-pointers'. Note you will need to compile your
|
||||
application with frame pointers (via 'gcc -fno-omit-frame-pointer
|
||||
...') in this case.
|
||||
|
||||
|
||||
*** TCMALLOC LARGE PAGES: TRADING TIME FOR SPACE
|
||||
|
||||
You can set a compiler directive that makes tcmalloc faster, at the
|
||||
cost of using more space (due to internal fragmentation).
|
||||
|
||||
Internally, tcmalloc divides its memory into "pages." The default
|
||||
page size is chosen to minimize memory use by reducing fragmentation.
|
||||
The cost is that keeping track of these pages can cost tcmalloc time.
|
||||
We've added a new, experimental flag to tcmalloc that enables a larger
|
||||
page size. In general, this will increase the memory needs of
|
||||
applications using tcmalloc. However, in many cases it will speed up
|
||||
the applications as well, particularly if they allocate and free a lot
|
||||
of memory. We've seen average speedups of 3-5% on Google
|
||||
applications.
|
||||
|
||||
This feature is still very experimental; it's not even a configure
|
||||
flag yet. To build libtcmalloc with large pages, run
|
||||
|
||||
./configure <normal flags> CXXFLAGS=-DTCMALLOC_LARGE_PAGES
|
||||
|
||||
(or add -DTCMALLOC_LARGE_PAGES to your existing CXXFLAGS argument).
|
||||
|
||||
|
||||
*** SMALL TCMALLOC CACHES: TRADING SPACE FOR TIME
|
||||
|
||||
You can set a compiler directive that makes tcmalloc use less memory
|
||||
for overhead, at the cost of some time.
|
||||
|
||||
Internally, tcmalloc keeps information about some of its internal data
|
||||
structures in a cache. This speeds memory operations that need to
|
||||
access this internal data. We've added a new, experimental flag to
|
||||
tcmalloc that reduces the size of this cache, decresaing the memory
|
||||
needs of applications using tcmalloc.
|
||||
|
||||
This feature is still very experimental; it's not even a configure
|
||||
flag yet. To build libtcmalloc with smaller internal caches, run
|
||||
|
||||
./configure <normal flags> CXXFLAGS=-DTCMALLOC_SMALL_BUT_SLOW
|
||||
|
||||
(or add -DTCMALLOC_SMALL_BUT_SLOW to your existing CXXFLAGS argument).
|
||||
|
||||
|
||||
*** NOTE FOR ___tls_get_addr ERROR
|
||||
|
||||
When compiling perftools on some old systems, like RedHat 8, you may
|
||||
get an error like this:
|
||||
___tls_get_addr: symbol not found
|
||||
|
||||
This means that you have a system where some parts are updated enough
|
||||
to support Thread Local Storage, but others are not. The perftools
|
||||
configure script can't always detect this kind of case, leading to
|
||||
that error. To fix it, just comment out the line
|
||||
#define HAVE_TLS 1
|
||||
in your config.h file before building.
|
||||
|
||||
|
||||
*** TCMALLOC AND DLOPEN
|
||||
|
||||
To improve performance, we use the "initial exec" model of Thread
|
||||
Local Storage in tcmalloc. The price for this is the library will not
|
||||
work correctly if it is loaded via dlopen(). This should not be a
|
||||
problem, since loading a malloc-replacement library via dlopen is
|
||||
asking for trouble in any case: some data will be allocated with one
|
||||
malloc, some with another. If, for some reason, you *do* need to use
|
||||
dlopen on tcmalloc, the easiest way is to use a version of tcmalloc
|
||||
with TLS turned off; see the ___tls_get_addr note above.
|
||||
|
||||
|
||||
*** COMPILING ON NON-LINUX SYSTEMS
|
||||
|
||||
Perftools has been tested on the following systems:
|
||||
FreeBSD 6.0 (x86)
|
||||
FreeBSD 8.1 (x86_64)
|
||||
Linux CentOS 5.5 (x86_64)
|
||||
Linux Debian 4.0 (PPC)
|
||||
Linux Debian 5.0 (x86)
|
||||
Linux Fedora Core 3 (x86)
|
||||
Linux Fedora Core 4 (x86)
|
||||
Linux Fedora Core 5 (x86)
|
||||
Linux Fedora Core 6 (x86)
|
||||
Linux Fedora Core 13 (x86_64)
|
||||
Linux Fedora Core 14 (x86_64)
|
||||
Linux RedHat 9 (x86)
|
||||
Linux Slackware 13 (x86_64)
|
||||
Linux Ubuntu 6.06.1 (x86)
|
||||
Linux Ubuntu 6.06.1 (x86_64)
|
||||
Linux Ubuntu 10.04 (x86)
|
||||
Linux Ubuntu 10.10 (x86_64)
|
||||
Mac OS X 10.3.9 (Panther) (PowerPC)
|
||||
Mac OS X 10.4.8 (Tiger) (PowerPC)
|
||||
Mac OS X 10.4.8 (Tiger) (x86)
|
||||
Mac OS X 10.5 (Leopard) (x86)
|
||||
Mac OS X 10.6 (Snow Leopard) (x86)
|
||||
Solaris 10 (x86_64)
|
||||
Windows XP, Visual Studio 2003 (VC++ 7.1) (x86)
|
||||
Windows XP, Visual Studio 2005 (VC++ 8) (x86)
|
||||
Windows XP, Visual Studio 2005 (VC++ 9) (x86)
|
||||
Windows XP, Visual Studio 2005 (VC++ 10) (x86)
|
||||
Windows XP, MinGW 5.1.3 (x86)
|
||||
Windows XP, Cygwin 5.1 (x86)
|
||||
|
||||
It works in its full generality on the Linux systems
|
||||
tested (though see 64-bit notes above). Portions of perftools work on
|
||||
the other systems. The basic memory-allocation library,
|
||||
tcmalloc_minimal, works on all systems. The cpu-profiler also works
|
||||
fairly widely. However, the heap-profiler and heap-checker are not
|
||||
yet as widely supported. In general, the 'configure' script will
|
||||
detect what OS you are building for, and only build the components
|
||||
that work on that OS.
|
||||
|
||||
Note that tcmalloc_minimal is perfectly usable as a malloc/new
|
||||
replacement, so it is possible to use tcmalloc on all the systems
|
||||
above, by linking in libtcmalloc_minimal.
|
||||
|
||||
** FreeBSD:
|
||||
|
||||
The following binaries build and run successfully (creating
|
||||
libtcmalloc_minimal.so and libprofile.so in the process):
|
||||
% ./configure
|
||||
% make tcmalloc_minimal_unittest tcmalloc_minimal_large_unittest \
|
||||
addressmap_unittest atomicops_unittest frag_unittest \
|
||||
low_level_alloc_unittest markidle_unittest memalign_unittest \
|
||||
packed_cache_test stacktrace_unittest system_alloc_unittest \
|
||||
thread_dealloc_unittest profiler_unittest.sh
|
||||
% ./tcmalloc_minimal_unittest # to run this test
|
||||
% [etc] # to run other tests
|
||||
|
||||
Three caveats: first, frag_unittest tries to allocate 400M of memory,
|
||||
and if you have less virtual memory on your system, the test may
|
||||
fail with a bad_alloc exception.
|
||||
|
||||
Second, profiler_unittest.sh sometimes fails in the "fork" test.
|
||||
This is because stray SIGPROF signals from the parent process are
|
||||
making their way into the child process. (This may be a kernel
|
||||
bug that only exists in older kernels.) The profiling code itself
|
||||
is working fine. This only affects programs that call fork(); for
|
||||
most programs, the cpu profiler is entirely safe to use.
|
||||
|
||||
Third, perftools depends on /proc to get shared library
|
||||
information. If you are running a FreeBSD system without proc,
|
||||
perftools will not be able to map addresses to functions. Some
|
||||
unittests will fail as a result.
|
||||
|
||||
Finally, the new test introduced in perftools-1.2,
|
||||
profile_handler_unittest, fails on FreeBSD. It has something to do
|
||||
with how the itimer works. The cpu profiler test passes, so I
|
||||
believe the functionality is correct and the issue is with the test
|
||||
somehow. If anybody is an expert on itimers and SIGPROF in
|
||||
FreeBSD, and would like to debug this, I'd be glad to hear the
|
||||
results!
|
||||
|
||||
libtcmalloc.so successfully builds, and the "advanced" tcmalloc
|
||||
functionality all works except for the leak-checker, which has
|
||||
Linux-specific code:
|
||||
% make heap-profiler_unittest.sh maybe_threads_unittest.sh \
|
||||
tcmalloc_unittest tcmalloc_both_unittest \
|
||||
tcmalloc_large_unittest # THESE WORK
|
||||
% make -k heap-checker_unittest.sh \
|
||||
heap-checker-death_unittest.sh # THESE DO NOT
|
||||
|
||||
Note that unless you specify --enable-heap-checker explicitly,
|
||||
'make' will not build the heap-checker unittests on a FreeBSD
|
||||
system.
|
||||
|
||||
I have not tested other *BSD systems, but they are probably similar.
|
||||
|
||||
** Mac OS X:
|
||||
|
||||
I've tested OS X 10.5 [Leopard], OS X 10.4 [Tiger] and OS X 10.3
|
||||
[Panther] on both intel (x86) and PowerPC systems. For Panther
|
||||
systems, perftools does not work at all: it depends on a header
|
||||
file, OSAtomic.h, which is new in 10.4. (It's possible to get the
|
||||
code working for Panther/i386 without too much work; if you're
|
||||
interested in exploring this, drop an e-mail.)
|
||||
|
||||
For the other seven systems, the binaries and libraries that
|
||||
successfully build are exactly the same as for FreeBSD. See that
|
||||
section for a list of binaries and instructions on building them.
|
||||
|
||||
In addition, it appears OS X regularly fails profiler_unittest.sh
|
||||
in the "thread" test (in addition to occassionally failing in the
|
||||
"fork" test). It looks like OS X often delivers the profiling
|
||||
signal to the main thread, even when it's sleeping, rather than
|
||||
spawned threads that are doing actual work. If anyone knows
|
||||
details of how OS X handles SIGPROF (via setitimer()) events with
|
||||
threads, and has insight into this problem, please send mail to
|
||||
google-perftools@googlegroups.com.
|
||||
|
||||
** Solaris 10 x86:
|
||||
|
||||
I've only tested using the GNU C++ compiler, not the Sun C++
|
||||
compiler. Using g++ requires setting the PATH appropriately when
|
||||
configuring.
|
||||
|
||||
% PATH=${PATH}:/usr/sfw/bin/:/usr/ccs/bin ./configure
|
||||
% PATH=${PATH}:/usr/sfw/bin/:/usr/ccs/bin make [...]
|
||||
|
||||
Again, the binaries and libraries that successfully build are
|
||||
exactly the same as for FreeBSD. (However, while libprofiler.so can
|
||||
be used to generate profiles, pprof is not very successful at
|
||||
reading them -- necessary helper programs like nm don't seem
|
||||
to be installed by default on Solaris, or perhaps are only
|
||||
installed as part of the Sun C++ compiler package.) See that
|
||||
section for a list of binaries, and instructions on building them.
|
||||
|
||||
** Windows (MSVC, Cygwin, and MinGW):
|
||||
|
||||
Work on Windows is rather preliminary: we haven't found a good way
|
||||
to get stack traces in release mode on windows (that is, when FPO
|
||||
is enabled), so the heap profiling may not be reliable in that
|
||||
case. Also, heap-checking and CPU profiling do not yet work at
|
||||
all. But as in other ports, the basic tcmalloc library
|
||||
functionality, overriding malloc and new and such (and even
|
||||
windows-specific functions like _aligned_malloc!), is working fine,
|
||||
at least with VC++ 7.1 (Visual Studio 2003) through VC++ 10.0,
|
||||
in both debug and release modes. See README.windows for
|
||||
instructions on how to install on Windows using Visual Studio.
|
||||
|
||||
Cygwin can compile some but not all of perftools. Furthermore,
|
||||
there is a problem with exception-unwinding in cygwin (it can call
|
||||
malloc, which can call the exception-unwinding-setup code, which
|
||||
can lead to an infinite loop). I've comitted a workaround to the
|
||||
exception unwinding problem, but it only works in debug mode and
|
||||
when statically linking in tcmalloc. I hope to have a more proper
|
||||
fix in a later release. To configure under cygwin, run
|
||||
|
||||
./configure --disable-shared CXXFLAGS=-g && make
|
||||
|
||||
Most of cygwin will compile (cygwin doesn't allow weak symbols, so
|
||||
the heap-checker and a few other pieces of functionality will not
|
||||
compile). 'make' will compile those libraries and tests that can
|
||||
be compiled. You can run 'make check' to make sure the basic
|
||||
functionality is working. I've heard reports that some versions of
|
||||
cygwin fail calls to pthread_join() with EINVAL, causing several
|
||||
tests to fail. If you have any insight into this, please mail
|
||||
google-perftools@googlegroups.com.
|
||||
|
||||
This Windows functionality is also available using MinGW and Msys,
|
||||
In this case, you can use the regular './configure && make'
|
||||
process. 'make install' should also work. The Makefile will limit
|
||||
itself to those libraries and binaries that work on windows.
|
||||
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
These are generic installation instructions.
|
||||
These are generic installation instructions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
|
@ -70,9 +378,9 @@ The simplest way to compile this package is:
|
|||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that the
|
||||
`configure' script does not know about. Run `./configure --help' for
|
||||
details on some of the pertinent environment variables.
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
|
@ -85,7 +393,7 @@ is an example:
|
|||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you must use a version of `make' that
|
||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
||||
|
@ -102,19 +410,19 @@ for another architecture.
|
|||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX'.
|
||||
By default, `make install' will install the package's files in
|
||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
||||
installation prefix other than `/usr/local' by giving `configure' the
|
||||
option `--prefix=PATH'.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
||||
PATH as the prefix for installing programs and libraries.
|
||||
Documentation and other data files will still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
options like `--bindir=PATH' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them.
|
||||
|
||||
|
@ -125,7 +433,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
|||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
|
@ -140,11 +448,11 @@ you can use the `configure' options `--x-includes=DIR' and
|
|||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out automatically,
|
||||
but needs to determine by the type of machine the package will run on.
|
||||
Usually, assuming the package is built to be run on the _same_
|
||||
architectures, `configure' can figure that out, but if it prints a
|
||||
message saying it cannot guess the machine type, give it the
|
||||
There may be some features `configure' cannot figure out
|
||||
automatically, but needs to determine by the type of machine the package
|
||||
will run on. Usually, assuming the package is built to be run on the
|
||||
_same_ architectures, `configure' can figure that out, but if it prints
|
||||
a message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
|
@ -159,7 +467,7 @@ where SYSTEM can have one of these forms:
|
|||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
use the `--target=TYPE' option to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
|
@ -170,9 +478,9 @@ eventually be run) with `--host=TYPE'.
|
|||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share, you
|
||||
can create a site shell script called `config.site' that gives default
|
||||
values for variables like `CC', `cache_file', and `prefix'.
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
|
@ -181,7 +489,7 @@ A warning: not all `configure' scripts look for a site script.
|
|||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
|
@ -189,18 +497,14 @@ them in the `configure' command line, using `VAR=value'. For example:
|
|||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script). Here is a another example:
|
||||
|
||||
/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
|
||||
configuration-related scripts to be executed by `/bin/bash'.
|
||||
will cause the specified gcc to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it operates.
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
|
@ -233,4 +537,3 @@ configuration-related scripts to be executed by `/bin/bash'.
|
|||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
||||
|
|
Loading…
Reference in New Issue