summaryrefslogtreecommitdiffstats
path: root/man/dpkg-buildflags.man
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--man/dpkg-buildflags.man650
1 files changed, 650 insertions, 0 deletions
diff --git a/man/dpkg-buildflags.man b/man/dpkg-buildflags.man
new file mode 100644
index 0000000..f352c18
--- /dev/null
+++ b/man/dpkg-buildflags.man
@@ -0,0 +1,650 @@
+.\" dpkg manual page - dpkg-buildflags(1)
+.\"
+.\" Copyright © 2010-2011 Raphaël Hertzog <hertzog@debian.org>
+.\" Copyright © 2011 Kees Cook <kees@debian.org>
+.\" Copyright © 2011-2015 Guillem Jover <guillem@debian.org>
+.\"
+.\" This is free software; you can redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 2 of the License, or
+.\" (at your option) any later version.
+.\"
+.\" This is distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+.\" GNU General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public License
+.\" along with this program. If not, see <https://www.gnu.org/licenses/>.
+.
+.TH dpkg\-buildflags 1 "%RELEASE_DATE%" "%VERSION%" "dpkg suite"
+.nh
+.SH NAME
+dpkg\-buildflags \- returns build flags to use during package build
+.
+.SH SYNOPSIS
+.B dpkg\-buildflags
+.RI [ option "...] [" command ]
+.
+.SH DESCRIPTION
+\fBdpkg\-buildflags\fP is a tool to retrieve compilation flags to use during
+build of Debian packages.
+.
+The default flags are defined by the vendor but they can be
+extended/overridden in several ways:
+.IP 1.
+system-wide with \fB%PKGCONFDIR%/buildflags.conf\fP;
+.IP 2.
+for the current user with \fB$XDG_CONFIG_HOME/dpkg/buildflags.conf\fP
+where \fB$XDG_CONFIG_HOME\fP defaults to \fB$HOME/.config\fP;
+.IP 3.
+temporarily by the user with environment variables (see section
+\fBENVIRONMENT\fP);
+.IP 4.
+dynamically by the package maintainer with environment variables set via
+\fBdebian/rules\fP (see section \fBENVIRONMENT\fP).
+.P
+The configuration files can contain four types of directives:
+.TP
+.BI SET " flag value"
+Override the flag named \fIflag\fP to have the value \fIvalue\fP.
+.TP
+.BI STRIP " flag value"
+Strip from the flag named \fIflag\fP all the build flags listed in \fIvalue\fP.
+.TP
+.BI APPEND " flag value"
+Extend the flag named \fIflag\fP by appending the options given in \fIvalue\fP.
+A space is prepended to the appended value if the flag's current value is non-empty.
+.TP
+.BI PREPEND " flag value"
+Extend the flag named \fIflag\fP by prepending the options given in \fIvalue\fP.
+A space is appended to the prepended value if the flag's current value is non-empty.
+.P
+The configuration files can contain comments on lines starting with a hash
+(#). Empty lines are also ignored.
+.SH COMMANDS
+.TP
+.BI \-\-dump
+Print to standard output all compilation flags and their values. It prints
+one flag per line separated from its value by an equal sign
+(“\fIflag\fP=\fIvalue\fP”). This is the default action.
+.TP
+.BI \-\-list
+Print the list of flags supported by the current vendor
+(one per line). See the \fBSUPPORTED FLAGS\fP section for more
+information about them.
+.TP
+.BI \-\-status
+Display any information that can be useful to explain the behaviour of
+\fBdpkg\-buildflags\fP (since dpkg 1.16.5): relevant environment variables,
+current vendor, state of all feature flags.
+Also print the resulting compiler flags with their origin.
+
+This is intended to be run from \fBdebian/rules\fP, so that the build log
+keeps a clear trace of the build flags used. This can be useful to diagnose
+problems related to them.
+.TP
+.BI \-\-export= format
+Print to standard output commands that can be used to export all the
+compilation flags for some particular tool. If the \fIformat\fP value is not
+given, \fBsh\fP is assumed. Only compilation flags starting with an
+upper case character are included, others are assumed to not be suitable
+for the environment. Supported formats:
+.RS
+.TP
+.B sh
+Shell commands to set and export all the compilation flags in the
+environment. The flag values are quoted so the output is ready for
+evaluation by a shell.
+.TP
+.B cmdline
+Arguments to pass to a build program's command line to use all the
+compilation flags (since dpkg 1.17.0). The flag values are quoted in
+shell syntax.
+.TP
+.B configure
+This is a legacy alias for \fBcmdline\fP.
+.TP
+.B make
+Make directives to set and export all the compilation flags in the
+environment. Output can be written to a Makefile fragment and
+evaluated using an \fBinclude\fP directive.
+.RE
+.TP
+.BI \-\-get " flag"
+Print the value of the flag on standard output. Exits with 0
+if the flag is known otherwise exits with 1.
+.TP
+.BI \-\-origin " flag"
+Print the origin of the value that is returned by \fB\-\-get\fP. Exits
+with 0 if the flag is known otherwise exits with 1. The origin can be one
+of the following values:
+.RS
+.TP
+.B vendor
+the original flag set by the vendor is returned;
+.TP
+.B system
+the flag is set/modified by a system-wide configuration;
+.TP
+.B user
+the flag is set/modified by a user-specific configuration;
+.TP
+.B env
+the flag is set/modified by an environment-specific configuration.
+.RE
+.TP
+.BI \-\-query
+Print any information that can be useful to explain the behaviour of the
+program: current vendor, relevant environment variables, feature areas,
+state of all feature flags, and the compiler flags with their origin
+(since dpkg 1.19.0).
+.IP
+For example:
+.nf
+ Vendor: Debian
+ Environment:
+ DEB_CFLAGS_SET=-O0 -Wall
+
+ Area: qa
+ Features:
+ bug=no
+ canary=no
+
+ Area: reproducible
+ Features:
+ timeless=no
+
+ Flag: CFLAGS
+ Value: -O0 -Wall
+ Origin: env
+
+ Flag: CPPFLAGS
+ Value: -D_FORTIFY_SOURCE=2
+ Origin: vendor
+.fi
+.TP
+.BI \-\-query\-features " area"
+Print the features enabled for a given area (since dpkg 1.16.2).
+The only currently recognized
+areas on Debian and derivatives are \fBfuture\fP, \fBqa\fP, \fBreproducible\fP,
+\fBsanitize\fP and \fBhardening\fP, see the \fBFEATURE AREAS\fP
+section for more details.
+Exits with 0 if the area is known otherwise exits with 1.
+.IP
+The output is in RFC822 format, with one section per feature.
+For example:
+.IP
+.nf
+ Feature: pie
+ Enabled: yes
+
+ Feature: stackprotector
+ Enabled: yes
+.fi
+.TP
+.B \-\-help
+Show the usage message and exit.
+.TP
+.B \-\-version
+Show the version and exit.
+.
+.SH SUPPORTED FLAGS
+.TP
+.B CFLAGS
+Options for the C compiler. The default value set by the vendor
+includes \fB\-g\fP and the default optimization level (\fB\-O2\fP usually,
+or \fB\-O0\fP if the \fBDEB_BUILD_OPTIONS\fP environment variable defines
+\fInoopt\fP).
+.TP
+.B CPPFLAGS
+Options for the C preprocessor. Default value: empty.
+.TP
+.B CXXFLAGS
+Options for the C++ compiler. Same as \fBCFLAGS\fP.
+.TP
+.B OBJCFLAGS
+Options for the Objective C compiler. Same as \fBCFLAGS\fP.
+.TP
+.B OBJCXXFLAGS
+Options for the Objective C++ compiler. Same as \fBCXXFLAGS\fP.
+.TP
+.B GCJFLAGS
+Options for the GNU Java compiler (gcj). A subset of \fBCFLAGS\fP.
+.TP
+.B FFLAGS
+Options for the Fortran 77 compiler. A subset of \fBCFLAGS\fP.
+.TP
+.B FCFLAGS
+Options for the Fortran 9x compiler. Same as \fBFFLAGS\fP.
+.TP
+.B LDFLAGS
+Options passed to the compiler when linking executables or shared
+objects (if the linker is called directly, then
+.B \-Wl
+and
+.B ,
+have to be stripped from these options). Default value: empty.
+.PP
+New flags might be added in the future if the need arises (for example
+to support other languages).
+.
+.SH FEATURE AREAS
+.P
+Each area feature can be enabled and disabled in the \fBDEB_BUILD_OPTIONS\fP
+and \fBDEB_BUILD_MAINT_OPTIONS\fP environment variable's area value with the
+‘\fB+\fP’ and ‘\fB\-\fP’ modifier.
+For example, to enable the \fBhardening\fP “pie” feature and disable the
+“fortify” feature you can do this in \fBdebian/rules\fP:
+.P
+ export DEB_BUILD_MAINT_OPTIONS=hardening=+pie,\-fortify
+.P
+The special feature \fBall\fP (valid in any area) can be used to enable or
+disable all area features at the same time.
+Thus disabling everything in the \fBhardening\fP area and enabling only
+“format” and “fortify” can be achieved with:
+.P
+ export DEB_BUILD_MAINT_OPTIONS=hardening=\-all,+format,+fortify
+.
+.SS future
+Several compile-time options (detailed below) can be used to enable features
+that should be enabled by default, but cannot due to backwards compatibility
+reasons.
+.TP
+.B lfs
+This setting (disabled by default) enables Large File Support on 32-bit
+architectures where their ABI does not include LFS by default, by adding
+\fB-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64\fP to \fBCPPFLAGS\fP.
+.
+.SS qa
+Several compile-time options (detailed below) can be used to help detect
+problems in the source code or build system.
+.TP
+.B bug
+This setting (disabled by default) adds any warning option that reliably
+detects problematic source code. The warnings are fatal.
+The only currently supported flags are \fBCFLAGS\fP and \fBCXXFLAGS\fP
+with flags set to \fB\-Werror=array\-bounds\fP, \fB\-Werror=clobbered\fP,
+\fB\-Werror=implicit\-function\-declaration\fP and
+\fB\-Werror=volatile\-register\-var\fP.
+.
+.TP
+.B canary
+This setting (disabled by default) adds dummy canary options to the build
+flags, so that the build logs can be checked for how the build flags
+propagate and to allow finding any omission of normal build flag settings.
+The only currently supported flags are \fBCPPFLAGS\fP, \fBCFLAGS\fP,
+\fBOBJCFLAGS\fP, \fBCXXFLAGS\fP and \fBOBJCXXFLAGS\fP with flags set
+to \fB\-D__DEB_CANARY_\fP\fIflag\fP_\fIrandom-id\fP\fB__\fP, and
+\fBLDFLAGS\fP set to \fB\-Wl,\-z,deb-canary\-\fP\fIrandom-id\fP.
+.
+.SS sanitize
+Several compile-time options (detailed below) can be used to help sanitize
+a resulting binary against memory corruptions, memory leaks, use after free,
+threading data races and undefined behavior bugs.
+\fBNote\fP: these options should \fBnot\fP be used for production builds
+as they can reduce reliability for conformant code, reduce security or
+even functionality.
+.TP
+.B address
+This setting (disabled by default) adds \fB\-fsanitize=address\fP to
+\fBLDFLAGS\fP and \fB\-fsanitize=address \-fno\-omit\-frame\-pointer\fP to
+\fBCFLAGS\fP and \fBCXXFLAGS\fP.
+.TP
+.B thread
+This setting (disabled by default) adds \fB\-fsanitize=thread\fP to
+\fBCFLAGS\fP, \fBCXXFLAGS\fP and \fBLDFLAGS\fP.
+.TP
+.B leak
+This setting (disabled by default) adds \fB\-fsanitize=leak\fP to
+\fBLDFLAGS\fP. It gets automatically disabled if either the \fBaddress\fP
+or the \fBthread\fP features are enabled, as they imply it.
+.TP
+.B undefined
+This setting (disabled by default) adds \fB\-fsanitize=undefined\fP to
+\fBCFLAGS\fP, \fBCXXFLAGS\fP and \fBLDFLAGS\fP.
+.SS hardening
+Several compile-time options (detailed below) can be used to help harden
+a resulting binary against memory corruption attacks, or provide
+additional warning messages during compilation.
+Except as noted below, these are enabled by default for architectures
+that support them.
+.TP
+.B format
+This setting (enabled by default) adds
+.B \-Wformat \-Werror=format\-security
+to \fBCFLAGS\fP, \fBCXXFLAGS\fP, \fBOBJCFLAGS\fP and \fBOBJCXXFLAGS\fP.
+This will warn about improper format
+string uses, and will fail when format functions are used in a way
+that represent possible security problems. At present, this warns about
+calls to \fBprintf\fP and \fBscanf\fP functions where the format string is
+not a string literal and there are no format arguments, as in
+\fBprintf(foo);\fP instead of \fPprintf("%s", foo);\fP
+This may be a security hole if the format string came from untrusted
+input and contains ‘%n’.
+.
+.TP
+.B fortify
+This setting (enabled by default) adds
+.B \-D_FORTIFY_SOURCE=2
+to \fBCPPFLAGS\fP. During code generation the compiler
+knows a great deal of information about buffer sizes (where possible), and
+attempts to replace insecure unlimited length buffer function calls with
+length-limited ones. This is especially useful for old, crufty code.
+Additionally, format strings in writable memory that contain ‘%n’ are
+blocked. If an application depends on such a format string, it will need
+to be worked around.
+
+Note that for this option to have any effect, the source must also
+be compiled with \fB\-O1\fP or higher. If the environment variable
+\fBDEB_BUILD_OPTIONS\fP contains \fInoopt\fP, then \fBfortify\fP
+support will be disabled, due to new warnings being issued by
+glibc 2.16 and later.
+.TP
+.B stackprotector
+This setting (enabled by default if stackprotectorstrong is not in use) adds
+.B \-fstack\-protector \-\-param=ssp\-buffer\-size=4
+to \fBCFLAGS\fP, \fBCXXFLAGS\fP, \fBOBJCFLAGS\fP, \fBOBJCXXFLAGS\fP,
+\fBGCJFLAGS\fP, \fBFFLAGS\fP and \fBFCFLAGS\fP.
+This adds safety checks against stack
+overwrites. This renders many potential code injection attacks into
+aborting situations. In the best case this turns code injection
+vulnerabilities into denial of service or into non-issues (depending on
+the application).
+
+This feature requires linking against glibc (or another provider of
+\fB__stack_chk_fail\fP), so needs to be disabled when building with
+\fB\-nostdlib\fP or \fB\-ffreestanding\fP or similar.
+.
+.TP
+.B stackprotectorstrong
+This setting (enabled by default) adds
+.B \-fstack\-protector\-strong
+to \fBCFLAGS\fP, \fBCXXFLAGS\fP, \fBOBJCFLAGS\fP, \fBOBJCXXFLAGS\fP,
+\fBGCJFLAGS\fP, \fBFFLAGS\fP and \fBFCFLAGS\fP.
+This is a stronger variant of \fBstackprotector\fP, but without significant
+performance penalties.
+
+Disabling \fBstackprotector\fP will also disable this setting.
+
+This feature has the same requirements as \fBstackprotector\fP, and in
+addition also requires gcc 4.9 and later.
+.
+.TP
+.B relro
+This setting (enabled by default) adds
+.B \-Wl,\-z,relro
+to \fBLDFLAGS\fP. During program load, several ELF memory sections need
+to be written to by the linker. This flags the loader to turn these
+sections read-only before turning over control to the program. Most
+notably this prevents GOT overwrite attacks. If this option is disabled,
+\fBbindnow\fP will become disabled as well.
+.
+.TP
+.B bindnow
+This setting (disabled by default) adds
+.B \-Wl,\-z,now
+to \fBLDFLAGS\fP. During program load, all dynamic symbols are resolved,
+allowing for the entire PLT to be marked read-only (due to \fBrelro\fP
+above). The option cannot become enabled if \fBrelro\fP is not enabled.
+.
+.TP
+.B pie
+This setting (with no global default since dpkg 1.18.23, as it is enabled
+by default now by gcc on the amd64, arm64, armel, armhf, hurd-i386, i386,
+kfreebsd-amd64, kfreebsd-i386, mips, mipsel, mips64el, powerpc, ppc64,
+ppc64el, riscv64, s390x, sparc and sparc64 Debian architectures) adds
+the required options to enable or disable PIE via gcc specs files, if
+needed, depending on whether gcc injects on that architecture the flags
+by itself or not.
+When the setting is enabled and gcc injects the flags, it adds nothing.
+When the setting is enabled and gcc does not inject the flags, it adds
+\fB\-fPIE\fP (via \fI%PKGDATADIR%/pie-compiler.specs\fP) to \fBCFLAGS\fP,
+\fBCXXFLAGS\fP, \fBOBJCFLAGS\fP, \fBOBJCXXFLAGS\fP, \fBGCJFLAGS\fP,
+\fBFFLAGS\fP and \fBFCFLAGS\fP, and
+\fB\-fPIE \-pie\fP (via \fI%PKGDATADIR%/pie-link.specs\fP) to \fBLDFLAGS\fP.
+When the setting is disabled and gcc injects the flags, it adds
+\fB\-fno\-PIE\fP (via \fI%PKGDATADIR%/no-pie-compile.specs\fP) to \fBCFLAGS\fP,
+\fBCXXFLAGS\fP, \fBOBJCFLAGS\fP, \fBOBJCXXFLAGS\fP, \fBGCJFLAGS\fP,
+\fBFFLAGS\fP and \fBFCFLAGS\fP, and
+\fB\-fno\-PIE \-no\-pie\fP (via \fI%PKGDATADIR%/no-pie-link.specs\fP) to
+\fBLDFLAGS\fP.
+
+Position Independent
+Executable are needed to take advantage of Address Space Layout
+Randomization, supported by some kernel versions. While ASLR can already
+be enforced for data areas in the stack and heap (brk and mmap), the code
+areas must be compiled as position-independent. Shared libraries already
+do this (\fB\-fPIC\fP), so they gain ASLR automatically, but binary .text
+regions need to be build PIE to gain ASLR. When this happens, ROP (Return
+Oriented Programming) attacks are much harder since there are no static
+locations to bounce off of during a memory corruption attack.
+
+PIE is not compatible with \fB\-fPIC\fP, so in general care must be taken
+when building shared objects. But because the PIE flags emitted get injected
+via gcc specs files, it should always be safe to unconditionally set them
+regardless of the object type being compiled or linked.
+
+Static libraries can be used by programs or other shared libraries.
+Depending on the flags used to compile all the objects within a static
+library, these libraries will be usable by different sets of objects:
+
+.RS
+.TP
+none
+Cannot be linked into a PIE program, nor a shared library.
+.TP
+.B \-fPIE
+Can be linked into any program, but not a shared library (recommended).
+.TP
+.B \-fPIC
+Can be linked into any program and shared library.
+.RE
+
+.IP
+If there is a need to set these flags manually, bypassing the gcc specs
+injection, there are several things to take into account. Unconditionally
+and explicitly passing \fB\-fPIE\fP, \fB\-fpie\fP or \fB\-pie\fP to a
+build-system using libtool is safe as these flags will get stripped
+when building shared libraries.
+Otherwise on projects that build both programs and shared libraries you
+might need to make sure that when building the shared libraries \fB\-fPIC\fP
+is always passed last (so that it overrides any previous \fB\-PIE\fP) to
+compilation flags such as \fBCFLAGS\fP, and \fB\-shared\fP is passed last
+(so that it overrides any previous \fB\-pie\fP) to linking flags such as
+\fBLDFLAGS\fP. \fBNote:\fP This should not be needed with the default
+gcc specs machinery.
+
+.IP
+Additionally, since PIE is implemented via a general register, some
+register starved architectures (but not including i386 anymore since
+optimizations implemented in gcc >= 5) can see performance losses of up to
+15% in very text-segment-heavy application workloads; most workloads
+see less than 1%. Architectures with more general registers (e.g. amd64)
+do not see as high a worst-case penalty.
+.SS reproducible
+The compile-time options detailed below can be used to help improve
+build reproducibility or provide additional warning messages during
+compilation. Except as noted below, these are enabled by default for
+architectures that support them.
+.TP
+.B timeless
+This setting (enabled by default) adds
+.B \-Wdate\-time
+to \fBCPPFLAGS\fP.
+This will cause warnings when the \fB__TIME__\fP, \fB__DATE__\fP and
+\fB__TIMESTAMP__\fP macros are used.
+.
+.TP
+.B fixfilepath
+This setting (disabled by default) adds
+.BI \-ffile\-prefix\-map= BUILDPATH =.
+to \fBCFLAGS\fP, \fBCXXFLAGS\fP, \fBOBJCFLAGS\fP, \fBOBJCXXFLAGS\fP,
+\fBGCJFLAGS\fP, \fBFFLAGS\fP and \fBFCFLAGS\fP where \fBBUILDPATH\fP is
+set to the top-level directory of the package being built.
+This has the effect of removing the build path from any generated file.
+
+If both \fBfixdebugpath\fP and \fBfixfilepath\fP are set, this option
+takes precedence, because it is a superset of the former.
+.TP
+.B fixdebugpath
+This setting (enabled by default) adds
+.BI \-fdebug\-prefix\-map= BUILDPATH =.
+to \fBCFLAGS\fP, \fBCXXFLAGS\fP, \fBOBJCFLAGS\fP, \fBOBJCXXFLAGS\fP,
+\fBGCJFLAGS\fP, \fBFFLAGS\fP and \fBFCFLAGS\fP where \fBBUILDPATH\fP is
+set to the top-level directory of the package being built.
+This has the effect of removing the build path from any generated debug
+symbols.
+.
+.SH ENVIRONMENT
+There are 2 sets of environment variables doing the same operations, the
+first one (DEB_\fIflag\fP_\fIop\fP) should never be used within
+\fBdebian/rules\fP. It's meant for any user that wants to rebuild the
+source package with different build flags. The second set
+(DEB_\fIflag\fP_MAINT_\fIop\fP) should only be used in \fBdebian/rules\fP
+by package maintainers to change the resulting build flags.
+.TP
+.BI DEB_ flag _SET
+.TQ
+.BI DEB_ flag _MAINT_SET
+This variable can be used to force the value returned for the given
+\fIflag\fP.
+.TP
+.BI DEB_ flag _STRIP
+.TQ
+.BI DEB_ flag _MAINT_STRIP
+This variable can be used to provide a space separated list of options
+that will be stripped from the set of flags returned for the given
+\fIflag\fP.
+.TP
+.BI DEB_ flag _APPEND
+.TQ
+.BI DEB_ flag _MAINT_APPEND
+This variable can be used to append supplementary options to the value
+returned for the given \fIflag\fP.
+.TP
+.BI DEB_ flag _PREPEND
+.TQ
+.BI DEB_ flag _MAINT_PREPEND
+This variable can be used to prepend supplementary options to the value
+returned for the given \fIflag\fP.
+.TP
+.B DEB_BUILD_OPTIONS
+.TQ
+.B DEB_BUILD_MAINT_OPTIONS
+These variables can be used by a user or maintainer to disable/enable
+various area features that affect build flags.
+The \fBDEB_BUILD_MAINT_OPTIONS\fP variable overrides any setting in the
+\fBDEB_BUILD_OPTIONS\fP feature areas.
+See the \fBFEATURE AREAS\fP section for details.
+.TP
+.B DEB_VENDOR
+This setting defines the current vendor.
+If not set, it will discover the current vendor by reading
+\fB%PKGCONFDIR%/origins/default\fP.
+.TP
+.B DEB_BUILD_PATH
+This variable sets the build path (since dpkg 1.18.8) to use in features
+such as \fBfixdebugpath\fP so that they can be controlled by the caller.
+This variable is currently Debian and derivatives-specific.
+.TP
+.B DPKG_COLORS
+Sets the color mode (since dpkg 1.18.5).
+The currently accepted values are: \fBauto\fP (default), \fBalways\fP and
+\fBnever\fP.
+.TP
+.B DPKG_NLS
+If set, it will be used to decide whether to activate Native Language Support,
+also known as internationalization (or i18n) support (since dpkg 1.19.0).
+The accepted values are: \fB0\fP and \fB1\fP (default).
+.
+.SH FILES
+.SS Configuration files
+.TP
+.B %PKGCONFDIR%/buildflags.conf
+System wide configuration file.
+.TP
+.BR $XDG_CONFIG_HOME/dpkg/buildflags.conf " or "
+.TQ
+.BR $HOME/.config/dpkg/buildflags.conf
+User configuration file.
+.SS Packaging support
+.TP
+.B %PKGDATADIR%/buildflags.mk
+Makefile snippet that will load (and optionally export) all flags
+supported by \fBdpkg-buildflags\fP into variables (since dpkg 1.16.1).
+.
+.SH EXAMPLES
+To pass build flags to a build command in a Makefile:
+.PP
+.RS 4
+.nf
+$(MAKE) $(shell dpkg\-buildflags \-\-export=cmdline)
+
+\&./configure $(shell dpkg\-buildflags \-\-export=cmdline)
+.fi
+.RE
+.PP
+To set build flags in a shell script or shell fragment, \fBeval\fP can be
+used to interpret the output and to export the flags in the environment:
+.PP
+.RS 4
+.nf
+eval "$(dpkg\-buildflags \-\-export=sh)" && make
+.fi
+.RE
+.PP
+or to set the positional parameters to pass to a command:
+.PP
+.RS 4
+.nf
+eval "set \-\- $(dpkg\-buildflags \-\-export=cmdline)"
+for dir in a b c; do (cd $dir && ./configure "$@" && make); done
+.fi
+.RE
+.
+.SS Usage in debian/rules
+You should call \fBdpkg\-buildflags\fP or include \fBbuildflags.mk\fP
+from the \fBdebian/rules\fP file to obtain the needed build flags to
+pass to the build system.
+Note that older versions of \fBdpkg\-buildpackage\fP (before dpkg 1.16.1)
+exported these flags automatically. However, you should not rely on this,
+since this breaks manual invocation of \fBdebian/rules\fP.
+.PP
+For packages with autoconf-like build systems, you can pass the relevant
+options to configure or \fBmake\fP(1) directly, as shown above.
+.PP
+For other build systems, or when you need more fine-grained control
+about which flags are passed where, you can use \fB\-\-get\fP. Or you
+can include \fBbuildflags.mk\fP instead, which takes care of calling
+\fBdpkg\-buildflags\fP and storing the build flags in make variables.
+.PP
+If you want to export all buildflags into the environment (where they
+can be picked up by your build system):
+.PP
+.RS 4
+.nf
+DPKG_EXPORT_BUILDFLAGS = 1
+include %PKGDATADIR%/buildflags.mk
+.fi
+.RE
+.PP
+For some extra control over what is exported, you can manually export
+the variables (as none are exported by default):
+.PP
+.RS 4
+.nf
+include %PKGDATADIR%/buildflags.mk
+export CPPFLAGS CFLAGS LDFLAGS
+.fi
+.RE
+.PP
+And you can of course pass the flags to commands manually:
+.PP
+.RS 4
+.nf
+include %PKGDATADIR%/buildflags.mk
+build\-arch:
+\& $(CC) \-o hello hello.c $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
+.fi
+.RE