0. BUILD REQUIREMENTS

 - Sane POSIX shell.
 - gcc-like compiler that supports C99 and some GNU extensions (namely, empty
   structures, empty definitions, zero length arrays, ranged designated
   initialisers).
 - libc. GNU libc and musl are supported.
 - Linux UAPI headers.
 - GNU Make.
 - GNU coreutils.
 - For running test suite: gawk, grep, sed, runtime environment for all
   personalities.
 - Requirements for optional features are documented in their description.

1. CONFIGURATION AND OPTIONAL FEATURES

Configuration is done using GNU Autoconf-generated configure script.
Please refer to the README-configure file for generic information regarding
configure usage.

In addition to standard configure options, strace's configure file provides
the following options:

1.1. Additional build and testing hardening

  --enable-gcc-Werror     turn on gcc's -Werror option
  --enable-code-coverage  Whether to enable code coverage support
  --with-gcov=GCOV        use given GCOV for coverage (GCOV=gcov).
  --enable-valgrind       Whether to enable Valgrind on the unit tests
  --disable-valgrind-memcheck
                          Whether to skip memcheck during the Valgrind tests
  --disable-valgrind-helgrind
                          Whether to skip helgrind during the Valgrind tests
  --disable-valgrind-drd  Whether to skip drd during the Valgrind tests
  --enable-valgrind-sgcheck
                          Whether to use sgcheck during the Valgrind tests

1.2. Optional features

1.2.1. Multiple personalities support

  --enable-mpers=yes|no|check|m32|mx32
                          whether to enable multiple personalities support
                          required for proper decoding of structures used by
                          tracees with personalities that differ from the
                          personality of strace, default is yes.

Personality is a way system call is performed (in terms of ABI). For example,
Linux kernel on multiple 64-bit architectures that evolve from their 32-bit
counterparts have support for running 32-bit binaries with 32-bit system call
ABI, and that system call ABI constitutes a separate personality in strace's
terms. Another example is 32-on-64 bit ABI; while exploiting the same way for
performing system calls as native 64-bit system calls, this ABI has different
type sizes and, as a result, also constitutes a separate personality; the only
such ABI that is currently supported by strace is x32 on x86_64. This is
important as different ABIs use different alignments and type sizes, as a
result, fields in structures in unions have different offsets on different
ABIs. In order to be able to correctly parse all the structures used in various
system calls and ioctl commands, strace compiles these structure definitions
for these different ABI and then parses DWARF of these compiled definitions in
order to generate proper structure definitions that compiled with decoder code.
Taking the aforementioned into account, there are the following requirements:

 - gawk (at least version 3)
 - Ability to compile for m32 personality (on architectures where it is supported)
  - On x86_64, x32, powerpc64, sparc64, riscv64, tile64: gcc -m32
  - s390x: gcc -m31
  - AArch64: a separate compiler for armv7 EABI
   - See information about configuration in "1.3.2. AArch64: AArch32 support"
 - Ability to compile for mx32 personality (on architectures where it is supported)
  - On x86_64: gcc -mx32
 - For tests: runtime support (linker, libc, and loader)

1.2.2. Stack unwinding (-k option)

  --with-libunwind        use libunwind to implement stack tracing support
  --with-libiberty        use libiberty to demangle symbols in stack trace

1.3. Architecture-specific features

1.3.1. ARMv7: OABI support

  --enable-arm-oabi       enable OABI support on ARM EABI

1.3.2. AArch64: AArch32 support

  CC_FOR_M32
  CPP_FOR_M32
  CFLAGS_FOR_M32
  CPPFLAGS_FOR_M32

1.4. Miscellanea

1.4.1. Static build configuration

For static linking, provide LDFLAGS='-static -pthread'.

1.4.2. Cross-compilation configuration

2. BUILDING

make -j`nproc`

3. TESTING

make -j`nproc` check

TESTS='list of tests'
VALGRIND_FLAGS
TIMEOUT_DURATION

BTRFS_MOUNTPOINT

4. ADDITIONAL TARGETS

  make code-coverage-capture
  make code-coverage-capture CODE_COVERAGE_BRANCH_COVERAGE=

5. INSTALLATION

make install

6. PACKAGING

6.1. Distribution tarball

maint/make-dist

Requires git

6.2. dpkg package

6.3. RPM package
