diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 13:44:03 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 13:44:03 +0000 |
commit | 293913568e6a7a86fd1479e1cff8e2ecb58d6568 (patch) | |
tree | fc3b469a3ec5ab71b36ea97cc7aaddb838423a0c /doc/src/sgml/installation.sgml | |
parent | Initial commit. (diff) | |
download | postgresql-16-293913568e6a7a86fd1479e1cff8e2ecb58d6568.tar.xz postgresql-16-293913568e6a7a86fd1479e1cff8e2ecb58d6568.zip |
Adding upstream version 16.2.upstream/16.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'doc/src/sgml/installation.sgml')
-rw-r--r-- | doc/src/sgml/installation.sgml | 3890 |
1 files changed, 3890 insertions, 0 deletions
diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml new file mode 100644 index 0000000..c8cc116 --- /dev/null +++ b/doc/src/sgml/installation.sgml @@ -0,0 +1,3890 @@ +<!-- doc/src/sgml/installation.sgml --> +<!-- + +The standalone version has some portions that are different from the version +that is integrated into the full documentation set, in particular as regards +links, so that INSTALL.html can be created without links to the main +documentation. See standalone-profile.xsl for details. + +--> + +<chapter id="installation"> + <title>Installation from Source Code</title> + + <indexterm zone="installation"> + <primary>installation</primary> + </indexterm> + + <!-- See also the version of this text in standalone-install.xml --> + <para> + This chapter describes the installation of + <productname>PostgreSQL</productname> using the source code + distribution. If you are installing a pre-packaged distribution, + such as an RPM or Debian package, ignore this chapter + and see <xref linkend="install-binaries" /> instead. + </para> + + <para> + If you are building <productname>PostgreSQL</productname> for Microsoft + Windows, read this chapter if you intend to build with MinGW or Cygwin; + but if you intend to build with Microsoft's <productname>Visual + C++</productname>, see <xref linkend="install-windows"/> instead. + </para> + + <sect1 id="install-requirements"> + <title>Requirements</title> + + <para> + In general, a modern Unix-compatible platform should be able to run + <productname>PostgreSQL</productname>. + The platforms that had received specific testing at the + time of release are described in <xref linkend="supported-platforms"/> + below. + </para> + + <para> + The following software packages are required for building + <productname>PostgreSQL</productname>: + + <itemizedlist> + <listitem> + <para> + <indexterm> + <primary>make</primary> + </indexterm> + + <acronym>GNU</acronym> <application>make</application> version 3.81 or newer is required; other + <application>make</application> programs or older <acronym>GNU</acronym> <application>make</application> versions will <emphasis>not</emphasis> work. + (<acronym>GNU</acronym> <application>make</application> is sometimes installed under + the name <filename>gmake</filename>.) To test for <acronym>GNU</acronym> + <application>make</application> enter: +<screen> +<userinput>make --version</userinput> +</screen> + </para> + </listitem> + + <listitem> + <para> + <indexterm> + <primary>Meson</primary> + </indexterm> + + Alternatively, <productname>PostgreSQL</productname> can be built using + <ulink url="https://mesonbuild.com/">Meson</ulink>. This is currently + experimental and only works when building from a Git checkout (not from + a distribution tarball). If you choose to use + <application>Meson</application>, then you don't need + <acronym>GNU</acronym> <application>make</application>, but the other + requirements below still apply. + </para> + + <para> + The minimum required version of <application>Meson</application> is 0.54. + </para> + </listitem> + + <listitem> + <para> + You need an <acronym>ISO</acronym>/<acronym>ANSI</acronym> C compiler (at least + C99-compliant). Recent + versions of <productname>GCC</productname> are recommended, but + <productname>PostgreSQL</productname> is known to build using a wide variety + of compilers from different vendors. + </para> + </listitem> + + <listitem> + <para> + <application>tar</application> is required to unpack the source + distribution, in addition to either + <application>gzip</application> or <application>bzip2</application>. + </para> + </listitem> + + <listitem> + <para> + <indexterm> + <primary>readline</primary> + </indexterm> + <indexterm> + <primary>libedit</primary> + </indexterm> + + The <acronym>GNU</acronym> <productname>Readline</productname> library is used by + default. It allows <application>psql</application> (the + PostgreSQL command line SQL interpreter) to remember each + command you type, and allows you to use arrow keys to recall and + edit previous commands. This is very helpful and is strongly + recommended. If you don't want to use it then you must specify + the <option>--without-readline</option> option to + <filename>configure</filename>. As an alternative, you can often use the + BSD-licensed <filename>libedit</filename> library, originally + developed on <productname>NetBSD</productname>. The + <filename>libedit</filename> library is + GNU <productname>Readline</productname>-compatible and is used if + <filename>libreadline</filename> is not found, or if + <option>--with-libedit-preferred</option> is used as an + option to <filename>configure</filename>. If you are using a package-based + Linux distribution, be aware that you need both the + <literal>readline</literal> and <literal>readline-devel</literal> packages, if + those are separate in your distribution. + </para> + </listitem> + + <listitem> + <para> + <indexterm> + <primary>zlib</primary> + </indexterm> + + The <productname>zlib</productname> compression library is + used by default. If you don't want to use it then you must + specify the <option>--without-zlib</option> option to + <filename>configure</filename>. Using this option disables + support for compressed archives in <application>pg_dump</application> and + <application>pg_restore</application>. + </para> + </listitem> + + <listitem> + <para> + The ICU locale provider (see <xref linkend="locale-providers"/>) is used by default. If you don't want to use it then you must specify the <option>--without-icu</option> option to <filename>configure</filename>. Using this option disables support for ICU collation features (see <xref linkend="collation"/>). + </para> + <para> + ICU support requires the <productname>ICU4C</productname> package to be + installed. The minimum required version of + <productname>ICU4C</productname> is currently 4.2. + </para> + + <para> + By default, + <productname>pkg-config</productname><indexterm><primary>pkg-config</primary></indexterm> + will be used to find the required compilation options. This is + supported for <productname>ICU4C</productname> version 4.6 and later. + For older versions, or if <productname>pkg-config</productname> is not + available, the variables <envar>ICU_CFLAGS</envar> and + <envar>ICU_LIBS</envar> can be specified to + <filename>configure</filename>, like in this example: +<programlisting> +./configure ... ICU_CFLAGS='-I/some/where/include' ICU_LIBS='-L/some/where/lib -licui18n -licuuc -licudata' +</programlisting> + (If <productname>ICU4C</productname> is in the default search path + for the compiler, then you still need to specify nonempty strings in + order to avoid use of <productname>pkg-config</productname>, for + example, <literal>ICU_CFLAGS=' '</literal>.) + </para> + </listitem> + </itemizedlist> + </para> + + <para> + The following packages are optional. They are not required in the + default configuration, but they are needed when certain build + options are enabled, as explained below: + + <itemizedlist> + <listitem> + <para> + To build the server programming language + <application>PL/Perl</application> you need a full + <productname>Perl</productname> installation, including the + <filename>libperl</filename> library and the header files. + The minimum required version is <productname>Perl</productname> 5.14. + Since <application>PL/Perl</application> will be a shared + library, the <indexterm><primary>libperl</primary></indexterm> + <filename>libperl</filename> library must be a shared library + also on most platforms. This appears to be the default in + recent <productname>Perl</productname> versions, but it was not + in earlier versions, and in any case it is the choice of whomever + installed Perl at your site. <filename>configure</filename> will fail + if building <application>PL/Perl</application> is selected but it cannot + find a shared <filename>libperl</filename>. In that case, you will have + to rebuild and install <productname>Perl</productname> manually to be + able to build <application>PL/Perl</application>. During the + configuration process for <productname>Perl</productname>, request a + shared library. + </para> + + <para> + If you intend to make more than incidental use of + <application>PL/Perl</application>, you should ensure that the + <productname>Perl</productname> installation was built with the + <literal>usemultiplicity</literal> option enabled (<literal>perl -V</literal> + will show whether this is the case). + </para> + </listitem> + + <listitem> + <para> + To build the <application>PL/Python</application> server programming + language, you need a <productname>Python</productname> + installation with the header files and + the <application>sysconfig</application> module. The minimum + required version is <productname>Python</productname> 3.2. + </para> + + <para> + Since <application>PL/Python</application> will be a shared + library, the <indexterm><primary>libpython</primary></indexterm> + <filename>libpython</filename> library must be a shared library + also on most platforms. This is not the case in a default + <productname>Python</productname> installation built from source, but a + shared library is available in many operating system + distributions. <filename>configure</filename> will fail if + building <application>PL/Python</application> is selected but it cannot + find a shared <filename>libpython</filename>. That might mean that you + either have to install additional packages or rebuild (part of) your + <productname>Python</productname> installation to provide this shared + library. When building from source, run <productname>Python</productname>'s + configure with the <literal>--enable-shared</literal> flag. + </para> + </listitem> + + <listitem> + <para> + To build the <application>PL/Tcl</application> + procedural language, you of course need a <productname>Tcl</productname> + installation. The minimum required version is + <productname>Tcl</productname> 8.4. + </para> + </listitem> + + <listitem> + <para> + To enable Native Language Support (<acronym>NLS</acronym>), that + is, the ability to display a program's messages in a language + other than English, you need an implementation of the + <application>Gettext</application> <acronym>API</acronym>. Some operating + systems have this built-in (e.g., <systemitem + class="osname">Linux</systemitem>, <systemitem class="osname">NetBSD</systemitem>, + <systemitem class="osname">Solaris</systemitem>), for other systems you + can download an add-on package from <ulink + url="https://www.gnu.org/software/gettext/"></ulink>. + If you are using the <application>Gettext</application> implementation in + the <acronym>GNU</acronym> C library, then you will additionally + need the <productname>GNU Gettext</productname> package for some + utility programs. For any of the other implementations you will + not need it. + </para> + </listitem> + + <listitem> + <para> + You need <productname>OpenSSL</productname>, if you want to support + encrypted client connections. <productname>OpenSSL</productname> is + also required for random number generation on platforms that do not + have <filename>/dev/urandom</filename> (except Windows). The minimum + required version is 1.0.1. + </para> + </listitem> + + <listitem> + <para> + You need <application>MIT Kerberos</application> (for GSSAPI), + <productname>OpenLDAP</productname>, and/or <application>PAM</application>, + if you want to support authentication using those services. + </para> + </listitem> + + <listitem> + <para> + You need <productname>LZ4</productname>, if you want to support + compression of data with that method; see + <xref linkend="guc-default-toast-compression"/> and + <xref linkend="guc-wal-compression"/>. + </para> + </listitem> + + <listitem> + <para> + You need <productname>Zstandard</productname>, if you want to support + compression of data with that method; see + <xref linkend="guc-wal-compression"/>. + The minimum required version is 1.4.0. + </para> + </listitem> + + <listitem> + <para> + To build the <productname>PostgreSQL</productname> documentation, + there is a separate set of requirements; see + <xref linkend="docguide-toolsets"/>. + </para> + </listitem> + </itemizedlist> + </para> + + <para> + If you are building from a <productname>Git</productname> tree instead of + using a released source package, or if you want to do server development, + you also need the following packages: + + <itemizedlist> + <listitem> + <para> + <indexterm> + <primary>flex</primary> + </indexterm> + <indexterm> + <primary>lex</primary> + </indexterm> + <indexterm> + <primary>bison</primary> + </indexterm> + <indexterm> + <primary>yacc</primary> + </indexterm> + + <application>Flex</application> and <application>Bison</application> + are needed to build from a Git checkout, or if you changed the actual + scanner and parser definition files. If you need them, be sure + to get <application>Flex</application> 2.5.35 or later and + <application>Bison</application> 2.3 or later. Other <application>lex</application> + and <application>yacc</application> programs cannot be used. + </para> + </listitem> + <listitem> + <para> + <indexterm> + <primary>perl</primary> + </indexterm> + + <application>Perl</application> 5.14 or later is needed to build from a Git checkout, + or if you changed the input files for any of the build steps that + use Perl scripts. If building on Windows you will need + <application>Perl</application> in any case. <application>Perl</application> is + also required to run some test suites. + </para> + </listitem> + </itemizedlist> + </para> + + <para> + If you need to get a <acronym>GNU</acronym> package, you can find + it at your local <acronym>GNU</acronym> mirror site (see <ulink + url="https://www.gnu.org/prep/ftp"></ulink> + for a list) or at <ulink + url="ftp://ftp.gnu.org/gnu/"></ulink>. + </para> + </sect1> + + <sect1 id="install-getsource"> + <title>Getting the Source</title> + + <para> + The <productname>PostgreSQL</productname> source code for released versions + can be obtained from the download section of our website: + <ulink url="https://www.postgresql.org/ftp/source/"></ulink>. + Download the + <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename> + or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename> + file you're interested in, then unpack it: +<screen> +<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput> +</screen> + This will create a directory + <filename>postgresql-<replaceable>version</replaceable></filename> under + the current directory with the <productname>PostgreSQL</productname> sources. + Change into that directory for the rest of the installation procedure. + </para> + + <para> + Alternatively, you can use the Git version control system; see + <xref linkend="git"/> for more information. + </para> + </sect1> + + <sect1 id="install-make"> + <title>Building and Installation with Autoconf and Make</title> + + <sect2 id="install-short-make"> + <title>Short Version</title> + + <para> +<synopsis> +./configure +make +su +make install +adduser postgres +mkdir -p /usr/local/pgsql/data +chown postgres /usr/local/pgsql/data +su - postgres +/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data +/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start +/usr/local/pgsql/bin/createdb test +/usr/local/pgsql/bin/psql test +</synopsis> + The long version is the rest of this + <phrase>section</phrase>. + </para> + </sect2> + + + <sect2 id="install-procedure-make"> + <title>Installation Procedure</title> + + <procedure> + + <step id="configure"> + <title>Configuration</title> + + <indexterm zone="configure"> + <primary>configure</primary> + </indexterm> + + <para> + The first step of the installation procedure is to configure the + source tree for your system and choose the options you would like. + This is done by running the <filename>configure</filename> script. For a + default installation simply enter: +<screen> +<userinput>./configure</userinput> +</screen> + This script will run a number of tests to determine values for various + system dependent variables and detect any quirks of your + operating system, and finally will create several files in the + build tree to record what it found. + </para> + + <para> + You can also run <filename>configure</filename> in a directory outside + the source tree, and then build there, if you want to keep the build + directory separate from the original source files. This procedure is + called a + <indexterm><primary>VPATH</primary></indexterm><firstterm>VPATH</firstterm> + build. Here's how: +<screen> +<userinput>mkdir build_dir</userinput> +<userinput>cd build_dir</userinput> +<userinput>/path/to/source/tree/configure [options go here]</userinput> +<userinput>make</userinput> +</screen> + </para> + + <para> + The default configuration will build the server and utilities, as + well as all client applications and interfaces that require only a + C compiler. All files will be installed under + <filename>/usr/local/pgsql</filename> by default. + </para> + + <para> + You can customize the build and installation process by supplying one + or more command line options to <filename>configure</filename>. + Typically you would customize the install location, or the set of + optional features that are built. <filename>configure</filename> + has a large number of options, which are described in + <xref linkend="configure-options"/>. + </para> + + <para> + Also, <filename>configure</filename> responds to certain environment + variables, as described in <xref linkend="configure-envvars"/>. + These provide additional ways to customize the configuration. + </para> + </step> + + <step id="build"> + <title>Build</title> + + <para> + To start the build, type either of: +<screen> +<userinput>make</userinput> +<userinput>make all</userinput> +</screen> + (Remember to use <acronym>GNU</acronym> <application>make</application>.) + The build will take a few minutes depending on your + hardware. + </para> + + <para> + If you want to build everything that can be built, including the + documentation (HTML and man pages), and the additional modules + (<filename>contrib</filename>), type instead: +<screen> +<userinput>make world</userinput> +</screen> + </para> + + <para> + If you want to build everything that can be built, including the + additional modules (<filename>contrib</filename>), but without + the documentation, type instead: +<screen> +<userinput>make world-bin</userinput> +</screen> + </para> + + <para> + If you want to invoke the build from another makefile rather than + manually, you must unset <varname>MAKELEVEL</varname> or set it to zero, + for instance like this: +<programlisting> +build-postgresql: + $(MAKE) -C postgresql MAKELEVEL=0 all +</programlisting> + Failure to do that can lead to strange error messages, typically about + missing header files. + </para> + </step> + + <step> + <title>Regression Tests</title> + + <indexterm> + <primary>regression test</primary> + </indexterm> + + <para> + If you want to test the newly built server before you install it, + you can run the regression tests at this point. The regression + tests are a test suite to verify that <productname>PostgreSQL</productname> + runs on your machine in the way the developers expected it + to. Type: +<screen> +<userinput>make check</userinput> +</screen> + (This won't work as root; do it as an unprivileged user.) + See <xref linkend="regress"/> for + detailed information about interpreting the test results. You can + repeat this test at any later time by issuing the same command. + </para> + </step> + + <step id="install"> + <title>Installing the Files</title> + + <note> + <para> + If you are upgrading an existing system be sure to read + <xref linkend="upgrading"/>, + which has instructions about upgrading a + cluster. + </para> + </note> + + <para> + To install <productname>PostgreSQL</productname> enter: +<screen> +<userinput>make install</userinput> +</screen> + This will install files into the directories that were specified + in <xref linkend="configure"/>. Make sure that you have appropriate + permissions to write into that area. Normally you need to do this + step as root. Alternatively, you can create the target + directories in advance and arrange for appropriate permissions to + be granted. + </para> + + <para> + To install the documentation (HTML and man pages), enter: +<screen> +<userinput>make install-docs</userinput> +</screen> + </para> + + <para> + If you built the world above, type instead: +<screen> +<userinput>make install-world</userinput> +</screen> + This also installs the documentation. + </para> + + <para> + If you built the world without the documentation above, type instead: +<screen> +<userinput>make install-world-bin</userinput> +</screen> + </para> + + <para> + You can use <literal>make install-strip</literal> instead of + <literal>make install</literal> to strip the executable files and + libraries as they are installed. This will save some space. If + you built with debugging support, stripping will effectively + remove the debugging support, so it should only be done if + debugging is no longer needed. <literal>install-strip</literal> + tries to do a reasonable job saving space, but it does not have + perfect knowledge of how to strip every unneeded byte from an + executable file, so if you want to save all the disk space you + possibly can, you will have to do manual work. + </para> + + <para> + The standard installation provides all the header files needed for client + application development as well as for server-side program + development, such as custom functions or data types written in C. + </para> + + <formalpara> + <title>Client-only installation:</title> + <para> + If you want to install only the client applications and + interface libraries, then you can use these commands: +<screen> +<userinput>make -C src/bin install</userinput> +<userinput>make -C src/include install</userinput> +<userinput>make -C src/interfaces install</userinput> +<userinput>make -C doc install</userinput> +</screen> + <filename>src/bin</filename> has a few binaries for server-only use, + but they are small. + </para> + </formalpara> + </step> + </procedure> + + <formalpara> + <title>Uninstallation:</title> + <para> + To undo the installation use the command <command>make + uninstall</command>. However, this will not remove any created directories. + </para> + </formalpara> + + <formalpara> + <title>Cleaning:</title> + + <para> + After the installation you can free disk space by removing the built + files from the source tree with the command <command>make + clean</command>. This will preserve the files made by the <command>configure</command> + program, so that you can rebuild everything with <command>make</command> + later on. To reset the source tree to the state in which it was + distributed, use <command>make distclean</command>. If you are going to + build for several platforms within the same source tree you must do + this and re-configure for each platform. (Alternatively, use + a separate build tree for each platform, so that the source tree + remains unmodified.) + </para> + </formalpara> + + <para> + If you perform a build and then discover that your <command>configure</command> + options were wrong, or if you change anything that <command>configure</command> + investigates (for example, software upgrades), then it's a good + idea to do <command>make distclean</command> before reconfiguring and + rebuilding. Without this, your changes in configuration choices + might not propagate everywhere they need to. + </para> + </sect2> + + <sect2 id="configure-options"> + <title><filename>configure</filename> Options</title> + + <indexterm zone="configure-options"> + <primary>configure options</primary> + </indexterm> + + <para> + <command>configure</command>'s command line options are explained below. + This list is not exhaustive (use <literal>./configure --help</literal> + to get one that is). The options not covered here are meant for + advanced use-cases such as cross-compilation, and are documented in + the standard Autoconf documentation. + </para> + + <sect3 id="configure-options-locations"> + <title>Installation Locations</title> + + <para> + These options control where <literal>make install</literal> will put + the files. The <option>--prefix</option> option is sufficient for + most cases. If you have special needs, you can customize the + installation subdirectories with the other options described in this + section. Beware however that changing the relative locations of the + different subdirectories may render the installation non-relocatable, + meaning you won't be able to move it after installation. + (The <literal>man</literal> and <literal>doc</literal> locations are + not affected by this restriction.) For relocatable installs, you + might want to use the <literal>--disable-rpath</literal> option + described later. + </para> + + <variablelist> + <varlistentry id="configure-option-prefix"> + <term><option>--prefix=<replaceable>PREFIX</replaceable></option></term> + <listitem> + <para> + Install all files under the directory <replaceable>PREFIX</replaceable> + instead of <filename>/usr/local/pgsql</filename>. The actual + files will be installed into various subdirectories; no files + will ever be installed directly into the + <replaceable>PREFIX</replaceable> directory. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-exec-prefix"> + <term><option>--exec-prefix=<replaceable>EXEC-PREFIX</replaceable></option></term> + <listitem> + <para> + You can install architecture-dependent files under a + different prefix, <replaceable>EXEC-PREFIX</replaceable>, than what + <replaceable>PREFIX</replaceable> was set to. This can be useful to + share architecture-independent files between hosts. If you + omit this, then <replaceable>EXEC-PREFIX</replaceable> is set equal to + <replaceable>PREFIX</replaceable> and both architecture-dependent and + independent files will be installed under the same tree, + which is probably what you want. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-bindir"> + <term><option>--bindir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Specifies the directory for executable programs. The default + is <filename><replaceable>EXEC-PREFIX</replaceable>/bin</filename>, which + normally means <filename>/usr/local/pgsql/bin</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-sysconfdir"> + <term><option>--sysconfdir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the directory for various configuration files, + <filename><replaceable>PREFIX</replaceable>/etc</filename> by default. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-libdir"> + <term><option>--libdir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the location to install libraries and dynamically loadable + modules. The default is + <filename><replaceable>EXEC-PREFIX</replaceable>/lib</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-includedir"> + <term><option>--includedir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the directory for installing C and C++ header files. The + default is <filename><replaceable>PREFIX</replaceable>/include</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-datarootdir"> + <term><option>--datarootdir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the root directory for various types of read-only data + files. This only sets the default for some of the following + options. The default is + <filename><replaceable>PREFIX</replaceable>/share</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-datadir"> + <term><option>--datadir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the directory for read-only data files used by the + installed programs. The default is + <filename><replaceable>DATAROOTDIR</replaceable></filename>. Note that this has + nothing to do with where your database files will be placed. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-localedir"> + <term><option>--localedir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the directory for installing locale data, in particular + message translation catalog files. The default is + <filename><replaceable>DATAROOTDIR</replaceable>/locale</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-mandir"> + <term><option>--mandir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + The man pages that come with <productname>PostgreSQL</productname> will be installed under + this directory, in their respective + <filename>man<replaceable>x</replaceable></filename> subdirectories. + The default is <filename><replaceable>DATAROOTDIR</replaceable>/man</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-docdir"> + <term><option>--docdir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the root directory for installing documentation files, + except <quote>man</quote> pages. This only sets the default for + the following options. The default value for this option is + <filename><replaceable>DATAROOTDIR</replaceable>/doc/postgresql</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-htmldir"> + <term><option>--htmldir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + The HTML-formatted documentation for + <productname>PostgreSQL</productname> will be installed under + this directory. The default is + <filename><replaceable>DATAROOTDIR</replaceable></filename>. + </para> + </listitem> + </varlistentry> + </variablelist> + + <note> + <para> + Care has been taken to make it possible to install + <productname>PostgreSQL</productname> into shared installation locations + (such as <filename>/usr/local/include</filename>) without + interfering with the namespace of the rest of the system. First, + the string <quote><literal>/postgresql</literal></quote> is + automatically appended to <varname>datadir</varname>, + <varname>sysconfdir</varname>, and <varname>docdir</varname>, + unless the fully expanded directory name already contains the + string <quote><literal>postgres</literal></quote> or + <quote><literal>pgsql</literal></quote>. For example, if you choose + <filename>/usr/local</filename> as prefix, the documentation will + be installed in <filename>/usr/local/doc/postgresql</filename>, + but if the prefix is <filename>/opt/postgres</filename>, then it + will be in <filename>/opt/postgres/doc</filename>. The public C + header files of the client interfaces are installed into + <varname>includedir</varname> and are namespace-clean. The + internal header files and the server header files are installed + into private directories under <varname>includedir</varname>. See + the documentation of each interface for information about how to + access its header files. Finally, a private subdirectory will + also be created, if appropriate, under <varname>libdir</varname> + for dynamically loadable modules. + </para> + </note> + + </sect3> + + <sect3 id="configure-options-features"> + <title><productname>PostgreSQL</productname> Features</title> + + <para> + The options described in this section enable building of + various <productname>PostgreSQL</productname> features that are not + built by default. Most of these are non-default only because they + require additional software, as described in + <xref linkend="install-requirements"/>. + </para> + + <variablelist> + + <varlistentry id="configure-option-enable-nls"> + <term><option>--enable-nls<optional>=<replaceable>LANGUAGES</replaceable></optional></option></term> + <listitem> + <para> + Enables Native Language Support (<acronym>NLS</acronym>), + that is, the ability to display a program's messages in a + language other than English. + <replaceable>LANGUAGES</replaceable> is an optional space-separated + list of codes of the languages that you want supported, for + example <literal>--enable-nls='de fr'</literal>. (The intersection + between your list and the set of actually provided + translations will be computed automatically.) If you do not + specify a list, then all available translations are + installed. + </para> + + <para> + To use this option, you will need an implementation of the + <application>Gettext</application> API. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-perl"> + <term><option>--with-perl</option></term> + <listitem> + <para> + Build the <application>PL/Perl</application> server-side language. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-python"> + <term><option>--with-python</option></term> + <listitem> + <para> + Build the <application>PL/Python</application> server-side language. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-tcl"> + <term><option>--with-tcl</option></term> + <listitem> + <para> + Build the <application>PL/Tcl</application> server-side language. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-tclconfig"> + <term><option>--with-tclconfig=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Tcl installs the file <filename>tclConfig.sh</filename>, which + contains configuration information needed to build modules + interfacing to Tcl. This file is normally found automatically + at a well-known location, but if you want to use a different + version of Tcl you can specify the directory in which to look + for <filename>tclConfig.sh</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-llvm"> + <term><option>--with-llvm</option></term> + <listitem> + <para> + Build with support for <productname>LLVM</productname> based + <acronym>JIT</acronym> compilation<phrase + condition="standalone-ignore"> (see <xref + linkend="jit"/>)</phrase>. This + requires the <productname>LLVM</productname> library to be installed. + The minimum required version of <productname>LLVM</productname> is + currently 3.9. + </para> + <para> + <command>llvm-config</command><indexterm><primary>llvm-config</primary></indexterm> + will be used to find the required compilation options. + <command>llvm-config</command>, and then + <command>llvm-config-$major-$minor</command> for all supported + versions, will be searched for in your <envar>PATH</envar>. If + that would not yield the desired program, + use <envar>LLVM_CONFIG</envar> to specify a path to the + correct <command>llvm-config</command>. For example +<programlisting> +./configure ... --with-llvm LLVM_CONFIG='/path/to/llvm/bin/llvm-config' +</programlisting> + </para> + + <para> + <productname>LLVM</productname> support requires a compatible + <command>clang</command> compiler (specified, if necessary, using the + <envar>CLANG</envar> environment variable), and a working C++ + compiler (specified, if necessary, using the <envar>CXX</envar> + environment variable). + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-lz4"> + <term><option>--with-lz4</option></term> + <listitem> + <para> + Build with <productname>LZ4</productname> compression support. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-zstd"> + <term><option>--with-zstd</option></term> + <listitem> + <para> + Build with <productname>Zstandard</productname> compression support. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-ssl"> + <term><option>--with-ssl=<replaceable>LIBRARY</replaceable></option> + <indexterm> + <primary>OpenSSL</primary> + <seealso>SSL</seealso> + </indexterm> + </term> + <listitem> + <para> + Build with support for <acronym>SSL</acronym> (encrypted) + connections. The only <replaceable>LIBRARY</replaceable> + supported is <option>openssl</option>. This requires the + <productname>OpenSSL</productname> package to be installed. + <filename>configure</filename> will check for the required + header files and libraries to make sure that your + <productname>OpenSSL</productname> installation is sufficient + before proceeding. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-openssl"> + <term><option>--with-openssl</option></term> + <listitem> + <para> + Obsolete equivalent of <literal>--with-ssl=openssl</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-gssapi"> + <term><option>--with-gssapi</option></term> + <listitem> + <para> + Build with support for GSSAPI authentication. MIT Kerberos is required + to be installed for GSSAPI. On many systems, the GSSAPI system (a part + of the MIT Kerberos installation) is not installed in a location + that is searched by default (e.g., <filename>/usr/include</filename>, + <filename>/usr/lib</filename>), so you must use the options + <option>--with-includes</option> and <option>--with-libraries</option> in + addition to this option. <filename>configure</filename> will check + for the required header files and libraries to make sure that + your GSSAPI installation is sufficient before proceeding. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-ldap"> + <term><option>--with-ldap</option></term> + <listitem> + <para> + Build with <acronym>LDAP</acronym><indexterm><primary>LDAP</primary></indexterm> + support for authentication and connection parameter lookup (see + <phrase id="install-ldap-links"><xref linkend="libpq-ldap"/> and + <xref linkend="auth-ldap"/></phrase> for more information). On Unix, + this requires the <productname>OpenLDAP</productname> package to be + installed. On Windows, the default <productname>WinLDAP</productname> + library is used. <filename>configure</filename> will check for the required + header files and libraries to make sure that your + <productname>OpenLDAP</productname> installation is sufficient before + proceeding. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-pam"> + <term><option>--with-pam</option></term> + <listitem> + <para> + Build with <acronym>PAM</acronym><indexterm><primary>PAM</primary></indexterm> + (Pluggable Authentication Modules) support. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-bsd-auth"> + <term><option>--with-bsd-auth</option></term> + <listitem> + <para> + Build with BSD Authentication support. + (The BSD Authentication framework is + currently only available on OpenBSD.) + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-systemd"> + <term><option>--with-systemd</option></term> + <listitem> + <para> + Build with support + for <application>systemd</application><indexterm><primary>systemd</primary></indexterm> + service notifications. This improves integration if the server + is started under <application>systemd</application> but has no impact + otherwise<phrase condition="standalone-ignore">; see <xref linkend="server-start"/> for more + information</phrase>. <application>libsystemd</application> and the + associated header files need to be installed to use this option. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-bonjour"> + <term><option>--with-bonjour</option></term> + <listitem> + <para> + Build with support for Bonjour automatic service discovery. + This requires Bonjour support in your operating system. + Recommended on macOS. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-uuid"> + <term><option>--with-uuid=<replaceable>LIBRARY</replaceable></option></term> + <listitem> + <para> + Build the <xref linkend="uuid-ossp"/> module + (which provides functions to generate UUIDs), using the specified + UUID library.<indexterm><primary>UUID</primary></indexterm> + <replaceable>LIBRARY</replaceable> must be one of: + </para> + <itemizedlist> + <listitem> + <para> + <option>bsd</option> to use the UUID functions found in FreeBSD + and some other BSD-derived systems + </para> + </listitem> + <listitem> + <para> + <option>e2fs</option> to use the UUID library created by + the <literal>e2fsprogs</literal> project; this library is present in most + Linux systems and in macOS, and can be obtained for other + platforms as well + </para> + </listitem> + <listitem> + <para> + <option>ossp</option> to use the <ulink + url="http://www.ossp.org/pkg/lib/uuid/">OSSP UUID library</ulink> + </para> + </listitem> + </itemizedlist> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-ossp-uuid"> + <term><option>--with-ossp-uuid</option></term> + <listitem> + <para> + Obsolete equivalent of <literal>--with-uuid=ossp</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-libxml"> + <term><option>--with-libxml</option></term> + <listitem> + <para> + Build with libxml2, enabling SQL/XML support. Libxml2 version 2.6.23 or + later is required for this feature. + </para> + + <para> + To detect the required compiler and linker options, PostgreSQL will + query <command>pkg-config</command>, if that is installed and knows + about libxml2. Otherwise the program <command>xml2-config</command>, + which is installed by libxml2, will be used if it is found. Use + of <command>pkg-config</command> is preferred, because it can deal + with multi-architecture installations better. + </para> + + <para> + To use a libxml2 installation that is in an unusual location, you + can set <command>pkg-config</command>-related environment + variables (see its documentation), or set the environment variable + <envar>XML2_CONFIG</envar> to point to + the <command>xml2-config</command> program belonging to the libxml2 + installation, or set the variables <envar>XML2_CFLAGS</envar> + and <envar>XML2_LIBS</envar>. (If <command>pkg-config</command> is + installed, then to override its idea of where libxml2 is you must + either set <envar>XML2_CONFIG</envar> or set + both <envar>XML2_CFLAGS</envar> and <envar>XML2_LIBS</envar> to + nonempty strings.) + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-libxslt"> + <term><option>--with-libxslt</option></term> + <listitem> + <para> + Build with libxslt, enabling the + <xref linkend="xml2"/> + module to perform XSL transformations of XML. + <option>--with-libxml</option> must be specified as well. + </para> + </listitem> + </varlistentry> + + </variablelist> + + </sect3> + + <sect3 id="configure-options-anti-features"> + <title>Anti-Features</title> + + <para> + The options described in this section allow disabling + certain <productname>PostgreSQL</productname> features that are built + by default, but which might need to be turned off if the required + software or system features are not available. Using these options is + not recommended unless really necessary. + </para> + + <variablelist> + + <varlistentry id="configure-option-without-icu"> + <term><option>--without-icu</option></term> + <listitem> + <para> + Build without support for the + <productname>ICU</productname><indexterm><primary>ICU</primary></indexterm> + library, disabling the use of ICU collation features<phrase + condition="standalone-ignore"> (see <xref + linkend="collation"/>)</phrase>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-without-readline"> + <term><option>--without-readline</option></term> + <listitem> + <para> + Prevents use of the <application>Readline</application> library + (and <application>libedit</application> as well). This option disables + command-line editing and history in + <application>psql</application>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-libedit-preferred"> + <term><option>--with-libedit-preferred</option></term> + <listitem> + <para> + Favors the use of the BSD-licensed <application>libedit</application> library + rather than GPL-licensed <application>Readline</application>. This option + is significant only if you have both libraries installed; the + default in that case is to use <application>Readline</application>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-without-zlib"> + <term><option>--without-zlib</option></term> + <listitem> + <para> + <indexterm> + <primary>zlib</primary> + </indexterm> + Prevents use of the <application>Zlib</application> library. + This disables + support for compressed archives in <application>pg_dump</application> + and <application>pg_restore</application>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-disable-spinlocks"> + <term><option>--disable-spinlocks</option></term> + <listitem> + <para> + Allow the build to succeed even if <productname>PostgreSQL</productname> + has no CPU spinlock support for the platform. The lack of + spinlock support will result in very poor performance; therefore, + this option should only be used if the build aborts and + informs you that the platform lacks spinlock support. If this + option is required to build <productname>PostgreSQL</productname> on + your platform, please report the problem to the + <productname>PostgreSQL</productname> developers. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-disable-atomics"> + <term><option>--disable-atomics</option></term> + <listitem> + <para> + Disable use of CPU atomic operations. This option does nothing on + platforms that lack such operations. On platforms that do have + them, this will result in poor performance. This option is only + useful for debugging or making performance comparisons. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-disable-thread-safety"> + <term><option>--disable-thread-safety</option></term> + <listitem> + <para> + Disable the thread-safety of client libraries. This prevents + concurrent threads in <application>libpq</application> and + <application>ECPG</application> programs from safely controlling + their private connection handles. Use this only on platforms + with deficient threading support. + </para> + </listitem> + </varlistentry> + + </variablelist> + + </sect3> + + <sect3 id="configure-options-build-process"> + <title>Build Process Details</title> + + <variablelist> + + <varlistentry id="configure-option-with-includes"> + <term><option>--with-includes=<replaceable>DIRECTORIES</replaceable></option></term> + <listitem> + <para> + <replaceable>DIRECTORIES</replaceable> is a colon-separated list of + directories that will be added to the list the compiler + searches for header files. If you have optional packages + (such as GNU <application>Readline</application>) installed in a non-standard + location, + you have to use this option and probably also the corresponding + <option>--with-libraries</option> option. + </para> + <para> + Example: <literal>--with-includes=/opt/gnu/include:/usr/sup/include</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-libraries"> + <term><option>--with-libraries=<replaceable>DIRECTORIES</replaceable></option></term> + <listitem> + <para> + <replaceable>DIRECTORIES</replaceable> is a colon-separated list of + directories to search for libraries. You will probably have + to use this option (and the corresponding + <option>--with-includes</option> option) if you have packages + installed in non-standard locations. + </para> + <para> + Example: <literal>--with-libraries=/opt/gnu/lib:/usr/sup/lib</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-system-tzdata"> + <term><option>--with-system-tzdata=<replaceable>DIRECTORY</replaceable></option> + <indexterm> + <primary>time zone data</primary> + </indexterm> + </term> + <listitem> + <para> + <productname>PostgreSQL</productname> includes its own time zone database, + which it requires for date and time operations. This time zone + database is in fact compatible with the IANA time zone + database provided by many operating systems such as FreeBSD, + Linux, and Solaris, so it would be redundant to install it again. + When this option is used, the system-supplied time zone database + in <replaceable>DIRECTORY</replaceable> is used instead of the one + included in the PostgreSQL source distribution. + <replaceable>DIRECTORY</replaceable> must be specified as an + absolute path. <filename>/usr/share/zoneinfo</filename> is a + likely directory on some operating systems. Note that the + installation routine will not detect mismatching or erroneous time + zone data. If you use this option, you are advised to run the + regression tests to verify that the time zone data you have + pointed to works correctly with <productname>PostgreSQL</productname>. + </para> + + <indexterm><primary>cross compilation</primary></indexterm> + + <para> + This option is mainly aimed at binary package distributors + who know their target operating system well. The main + advantage of using this option is that the PostgreSQL package + won't need to be upgraded whenever any of the many local + daylight-saving time rules change. Another advantage is that + PostgreSQL can be cross-compiled more straightforwardly if the + time zone database files do not need to be built during the + installation. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-extra-version"> + <term><option>--with-extra-version=<replaceable>STRING</replaceable></option></term> + <listitem> + <para> + Append <replaceable>STRING</replaceable> to the PostgreSQL version number. You + can use this, for example, to mark binaries built from unreleased Git + snapshots or containing custom patches with an extra version string, + such as a <command>git describe</command> identifier or a + distribution package release number. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-disable-rpath"> + <term><option>--disable-rpath</option></term> + <listitem> + <para> + Do not mark <productname>PostgreSQL</productname>'s executables + to indicate that they should search for shared libraries in the + installation's library directory (see <option>--libdir</option>). + On most platforms, this marking uses an absolute path to the + library directory, so that it will be unhelpful if you relocate + the installation later. However, you will then need to provide + some other way for the executables to find the shared libraries. + Typically this requires configuring the operating system's + dynamic linker to search the library directory; see + <xref linkend="install-post-shlibs"/> for more detail. + </para> + </listitem> + </varlistentry> + + </variablelist> + + </sect3> + + <sect3 id="configure-options-misc"> + <title>Miscellaneous</title> + + <para> + It's fairly common, particularly for test builds, to adjust the + default port number with <option>--with-pgport</option>. + The other options in this section are recommended only for advanced + users. + </para> + + <variablelist> + + <varlistentry id="configure-option-with-pgport"> + <term><option>--with-pgport=<replaceable>NUMBER</replaceable></option></term> + <listitem> + <para> + Set <replaceable>NUMBER</replaceable> as the default port number for + server and clients. The default is 5432. The port can always + be changed later on, but if you specify it here then both + server and clients will have the same default compiled in, + which can be very convenient. Usually the only good reason + to select a non-default value is if you intend to run multiple + <productname>PostgreSQL</productname> servers on the same machine. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-krb-srvnam"> + <term><option>--with-krb-srvnam=<replaceable>NAME</replaceable></option></term> + <listitem> + <para> + The default name of the Kerberos service principal used + by GSSAPI. + <literal>postgres</literal> is the default. There's usually no + reason to change this unless you are building for a Windows + environment, in which case it must be set to upper case + <literal>POSTGRES</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-segsize"> + <term><option>--with-segsize=<replaceable>SEGSIZE</replaceable></option></term> + <listitem> + <para> + Set the <firstterm>segment size</firstterm>, in gigabytes. Large tables are + divided into multiple operating-system files, each of size equal + to the segment size. This avoids problems with file size limits + that exist on many platforms. The default segment size, 1 gigabyte, + is safe on all supported platforms. If your operating system has + <quote>largefile</quote> support (which most do, nowadays), you can use + a larger segment size. This can be helpful to reduce the number of + file descriptors consumed when working with very large tables. + But be careful not to select a value larger than is supported + by your platform and the file systems you intend to use. Other + tools you might wish to use, such as <application>tar</application>, could + also set limits on the usable file size. + It is recommended, though not absolutely required, that this value + be a power of 2. + Note that changing this value breaks on-disk database compatibility, + meaning you cannot use <command>pg_upgrade</command> to upgrade to + a build with a different segment size. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-blocksize"> + <term><option>--with-blocksize=<replaceable>BLOCKSIZE</replaceable></option></term> + <listitem> + <para> + Set the <firstterm>block size</firstterm>, in kilobytes. This is the unit + of storage and I/O within tables. The default, 8 kilobytes, + is suitable for most situations; but other values may be useful + in special cases. + The value must be a power of 2 between 1 and 32 (kilobytes). + Note that changing this value breaks on-disk database compatibility, + meaning you cannot use <command>pg_upgrade</command> to upgrade to + a build with a different block size. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-wal-blocksize"> + <term><option>--with-wal-blocksize=<replaceable>BLOCKSIZE</replaceable></option></term> + <listitem> + <para> + Set the <firstterm>WAL block size</firstterm>, in kilobytes. This is the unit + of storage and I/O within the WAL log. The default, 8 kilobytes, + is suitable for most situations; but other values may be useful + in special cases. + The value must be a power of 2 between 1 and 64 (kilobytes). + Note that changing this value breaks on-disk database compatibility, + meaning you cannot use <command>pg_upgrade</command> to upgrade to + a build with a different WAL block size. + </para> + </listitem> + </varlistentry> + + </variablelist> + + </sect3> + + <sect3 id="configure-options-devel"> + <title>Developer Options</title> + + <para> + Most of the options in this section are only of interest for + developing or debugging <productname>PostgreSQL</productname>. + They are not recommended for production builds, except + for <option>--enable-debug</option>, which can be useful to enable + detailed bug reports in the unlucky event that you encounter a bug. + On platforms supporting DTrace, <option>--enable-dtrace</option> + may also be reasonable to use in production. + </para> + + <para> + When building an installation that will be used to develop code inside + the server, it is recommended to use at least the + options <option>--enable-debug</option> + and <option>--enable-cassert</option>. + </para> + + <variablelist> + + <varlistentry id="configure-option-enable-debug"> + <term><option>--enable-debug</option></term> + <listitem> + <para> + Compiles all programs and libraries with debugging symbols. + This means that you can run the programs in a debugger + to analyze problems. This enlarges the size of the installed + executables considerably, and on non-GCC compilers it usually + also disables compiler optimization, causing slowdowns. However, + having the symbols available is extremely helpful for dealing + with any problems that might arise. Currently, this option is + recommended for production installations only if you use GCC. + But you should always have it on if you are doing development work + or running a beta version. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-enable-cassert"> + <term><option>--enable-cassert</option></term> + <listitem> + <para> + Enables <firstterm>assertion</firstterm> checks in the server, which test for + many <quote>cannot happen</quote> conditions. This is invaluable for + code development purposes, but the tests can slow down the + server significantly. + Also, having the tests turned on won't necessarily enhance the + stability of your server! The assertion checks are not categorized + for severity, and so what might be a relatively harmless bug will + still lead to server restarts if it triggers an assertion + failure. This option is not recommended for production use, but + you should have it on for development work or when running a beta + version. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-enable-tap-tests"> + <term><option>--enable-tap-tests</option></term> + <listitem> + <para> + Enable tests using the Perl TAP tools. This requires a Perl + installation and the Perl module <literal>IPC::Run</literal>. + <phrase condition="standalone-ignore">See <xref linkend="regress-tap"/> for more information.</phrase> + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-enable-depend"> + <term><option>--enable-depend</option></term> + <listitem> + <para> + Enables automatic dependency tracking. With this option, the + makefiles are set up so that all affected object files will + be rebuilt when any header file is changed. This is useful + if you are doing development work, but is just wasted overhead + if you intend only to compile once and install. At present, + this option only works with GCC. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-enable-coverage"> + <term><option>--enable-coverage</option></term> + <listitem> + <para> + If using GCC, all programs and libraries are compiled with + code coverage testing instrumentation. When run, they + generate files in the build directory with code coverage + metrics. + <phrase condition="standalone-ignore">See <xref linkend="regress-coverage"/> + for more information.</phrase> This option is for use only with GCC + and when doing development work. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-enable-profiling"> + <term><option>--enable-profiling</option></term> + <listitem> + <para> + If using GCC, all programs and libraries are compiled so they + can be profiled. On backend exit, a subdirectory will be created + that contains the <filename>gmon.out</filename> file containing + profile data. + This option is for use only with GCC and when doing development work. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-enable-dtrace"> + <term><option>--enable-dtrace</option></term> + <listitem> + <para> + <indexterm> + <primary>DTrace</primary> + </indexterm> + Compiles <productname>PostgreSQL</productname> with support for the + dynamic tracing tool DTrace. + <phrase condition="standalone-ignore">See <xref linkend="dynamic-trace"/> + for more information.</phrase> + </para> + + <para> + To point to the <command>dtrace</command> program, the + environment variable <envar>DTRACE</envar> can be set. This + will often be necessary because <command>dtrace</command> is + typically installed under <filename>/usr/sbin</filename>, + which might not be in your <envar>PATH</envar>. + </para> + + <para> + Extra command-line options for the <command>dtrace</command> program + can be specified in the environment variable + <envar>DTRACEFLAGS</envar>. On Solaris, + to include DTrace support in a 64-bit binary, you must specify + <literal>DTRACEFLAGS="-64"</literal>. For example, + using the GCC compiler: +<screen> +./configure CC='gcc -m64' --enable-dtrace DTRACEFLAGS='-64' ... +</screen> + Using Sun's compiler: +<screen> +./configure CC='/opt/SUNWspro/bin/cc -xtarget=native64' --enable-dtrace DTRACEFLAGS='-64' ... +</screen> + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-option-with-segsize-blocks"> + <term><option>--with-segsize-blocks=SEGSIZE_BLOCKS</option></term> + <listitem> + <para> + Specify the relation segment size in blocks. If both + <option>--with-segsize</option> and this option are specified, this + option wins. + + This option is only for developers, to test segment related code. + </para> + </listitem> + </varlistentry> + + </variablelist> + + </sect3> + + </sect2> + + <sect2 id="configure-envvars"> + <title><filename>configure</filename> Environment Variables</title> + + <indexterm zone="configure-envvars"> + <primary>configure environment variables</primary> + </indexterm> + + <para> + In addition to the ordinary command-line options described above, + <filename>configure</filename> responds to a number of environment + variables. + You can specify environment variables on the + <filename>configure</filename> command line, for example: +<screen> +<userinput>./configure CC=/opt/bin/gcc CFLAGS='-O2 -pipe'</userinput> +</screen> + In this usage an environment variable is little different from a + command-line option. + You can also set such variables beforehand: +<screen> +<userinput>export CC=/opt/bin/gcc</userinput> +<userinput>export CFLAGS='-O2 -pipe'</userinput> +<userinput>./configure</userinput> +</screen> + This usage can be convenient because many programs' configuration + scripts respond to these variables in similar ways. + </para> + + <para> + The most commonly used of these environment variables are + <envar>CC</envar> and <envar>CFLAGS</envar>. + If you prefer a C compiler different from the one + <filename>configure</filename> picks, you can set the + variable <envar>CC</envar> to the program of your choice. + By default, <filename>configure</filename> will pick + <filename>gcc</filename> if available, else the platform's + default (usually <filename>cc</filename>). Similarly, you can override the + default compiler flags if needed with the <envar>CFLAGS</envar> variable. + </para> + + <para> + Here is a list of the significant variables that can be set in + this manner: + + <variablelist> + <varlistentry id="configure-envvars-bison"> + <term><envar>BISON</envar></term> + <listitem> + <para> + Bison program + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-cc"> + <term><envar>CC</envar></term> + <listitem> + <para> + C compiler + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-cflags"> + <term><envar>CFLAGS</envar></term> + <listitem> + <para> + options to pass to the C compiler + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-clang"> + <term><envar>CLANG</envar></term> + <listitem> + <para> + path to <command>clang</command> program used to process source code + for inlining when compiling with <literal>--with-llvm</literal> + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-cpp"> + <term><envar>CPP</envar></term> + <listitem> + <para> + C preprocessor + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-cppflags"> + <term><envar>CPPFLAGS</envar></term> + <listitem> + <para> + options to pass to the C preprocessor + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-cxx"> + <term><envar>CXX</envar></term> + <listitem> + <para> + C++ compiler + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-cxxflags"> + <term><envar>CXXFLAGS</envar></term> + <listitem> + <para> + options to pass to the C++ compiler + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-dtrace"> + <term><envar>DTRACE</envar></term> + <listitem> + <para> + location of the <command>dtrace</command> program + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-dtraceflags"> + <term><envar>DTRACEFLAGS</envar></term> + <listitem> + <para> + options to pass to the <command>dtrace</command> program + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-flex"> + <term><envar>FLEX</envar></term> + <listitem> + <para> + Flex program + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-ldflags"> + <term><envar>LDFLAGS</envar></term> + <listitem> + <para> + options to use when linking either executables or shared libraries + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-ldflags-ex"> + <term><envar>LDFLAGS_EX</envar></term> + <listitem> + <para> + additional options for linking executables only + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-ldflags-sl"> + <term><envar>LDFLAGS_SL</envar></term> + <listitem> + <para> + additional options for linking shared libraries only + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-llvm-config"> + <term><envar>LLVM_CONFIG</envar></term> + <listitem> + <para> + <command>llvm-config</command> program used to locate the + <productname>LLVM</productname> installation + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-msgfmt"> + <term><envar>MSGFMT</envar></term> + <listitem> + <para> + <command>msgfmt</command> program for native language support + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-perl"> + <term><envar>PERL</envar></term> + <listitem> + <para> + Perl interpreter program. This will be used to determine the + dependencies for building PL/Perl. The default is + <command>perl</command>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-python"> + <term><envar>PYTHON</envar></term> + <listitem> + <para> + Python interpreter program. This will be used to determine the + dependencies for building PL/Python. If this is not set, the + following are probed in this order: + <literal>python3 python</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-tclsh"> + <term><envar>TCLSH</envar></term> + <listitem> + <para> + Tcl interpreter program. This will be used to + determine the dependencies for building PL/Tcl. + If this is not set, the following are probed in this + order: <literal>tclsh tcl tclsh8.6 tclsh86 tclsh8.5 tclsh85 + tclsh8.4 tclsh84</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-envvars-xml2-config"> + <term><envar>XML2_CONFIG</envar></term> + <listitem> + <para> + <command>xml2-config</command> program used to locate the + libxml2 installation + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + + <para> + Sometimes it is useful to add compiler flags after-the-fact to the set + that were chosen by <filename>configure</filename>. An important example is + that <application>gcc</application>'s <option>-Werror</option> option cannot be included + in the <envar>CFLAGS</envar> passed to <filename>configure</filename>, because + it will break many of <filename>configure</filename>'s built-in tests. To add + such flags, include them in the <envar>COPT</envar> environment variable + while running <filename>make</filename>. The contents of <envar>COPT</envar> + are added to both the <envar>CFLAGS</envar> and <envar>LDFLAGS</envar> + options set up by <filename>configure</filename>. For example, you could do +<screen> +<userinput>make COPT='-Werror'</userinput> +</screen> + or +<screen> +<userinput>export COPT='-Werror'</userinput> +<userinput>make</userinput> +</screen> + </para> + + <note> + <para> + If using GCC, it is best to build with an optimization level of + at least <option>-O1</option>, because using no optimization + (<option>-O0</option>) disables some important compiler warnings (such + as the use of uninitialized variables). However, non-zero + optimization levels can complicate debugging because stepping + through compiled code will usually not match up one-to-one with + source code lines. If you get confused while trying to debug + optimized code, recompile the specific files of interest with + <option>-O0</option>. An easy way to do this is by passing an option + to <application>make</application>: <command>make PROFILE=-O0 file.o</command>. + </para> + + <para> + The <envar>COPT</envar> and <envar>PROFILE</envar> environment variables are + actually handled identically by the <productname>PostgreSQL</productname> + makefiles. Which to use is a matter of preference, but a common habit + among developers is to use <envar>PROFILE</envar> for one-time flag + adjustments, while <envar>COPT</envar> might be kept set all the time. + </para> + </note> + </sect2> + </sect1> + + <sect1 id="install-meson"> + <title>Building and Installation with Meson</title> + + <sect2 id="install-short-meson"> + <title>Short Version</title> + + <para> +<synopsis> +meson setup build --prefix=/usr/local/pgsql +cd build +ninja +su +ninja install +adduser postgres +mkdir -p /usr/local/pgsql/data +chown postgres /usr/local/pgsql/data +su - postgres +/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data +/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start +/usr/local/pgsql/bin/createdb test +/usr/local/pgsql/bin/psql test +</synopsis> + The long version is the rest of this + <phrase>section</phrase>. + </para> + </sect2> + + <sect2 id="install-procedure-meson"> + <title>Installation Procedure</title> + + <procedure> + + <step id="meson-configure"> + <title>Configuration</title> + + <para> + The first step of the installation procedure is to configure the + build tree for your system and choose the options you would like. To + create and configure the build directory, you can start with the + <literal>meson setup</literal> command. +<screen> +<userinput>meson setup build</userinput> +</screen> + The setup command takes a <literal>builddir</literal> and a <literal>srcdir</literal> + argument. If no <literal>srcdir</literal> is given, Meson will deduce the + <literal>srcdir</literal> based on the current directory and the location + of <literal>meson.build</literal>. The <literal>builddir</literal> is mandatory. + </para> + + <para> + Running <literal>meson setup</literal> loads the build configuration file and sets up the build directory. + Additionally, you can also pass several build options to Meson. Some commonly + used options are mentioned in the subsequent sections. For example: + +<screen> +# configure with a different installation prefix +meson setup build --prefix=/home/user/pg-install + +# configure to generate a debug build +meson setup build --buildtype=debug + +# configure to build with OpenSSL support +meson setup build -Dssl=openssl +</screen> + </para> + + <para> + Setting up the build directory is a one-time step. To reconfigure before a + new build, you can simply use the <literal>meson configure</literal> command +<screen> +meson configure -Dcassert=true +</screen> + <command>meson configure</command>'s commonly used command-line options + are explained in <xref linkend="meson-options"/>. + </para> + </step> + + <step id="meson-build"> + <title>Build</title> + + <para> + By default, <productname>Meson</productname> uses the <ulink + url="https://ninja-build.org/">Ninja</ulink> build tool. To build + <productname>PostgreSQL</productname> from source using Meson, you can + simply use the <literal>ninja</literal> command in the build directory. +<screen> +ninja +</screen> + Ninja will automatically detect the number of CPUs in your computer and + parallelize itself accordingly. You can override the number of parallel + processes used with the command line argument <literal>-j</literal>. + </para> + + <para> + It should be noted that after the initial configure step, + <command>ninja</command> is the only command you ever need to type to + compile. No matter how you alter your source tree (short of moving it to a + completely new location), Meson will detect the changes and regenerate + itself accordingly. This is especially handy if you have multiple build + directories. Often one of them is used for development (the "debug" build) + and others only every now and then (such as a "static analysis" build). + Any configuration can be built just by cd'ing to the corresponding + directory and running Ninja. + </para> + + <para> + If you'd like to build with a backend other than ninja, you can use + configure with the <option>--backend</option> option to select the one you + want to use and then build using <literal>meson compile</literal>. To + learn more about these backends and other arguments you can provide to + ninja, you can refer to the <ulink + url="https://mesonbuild.com/Running-Meson.html#building-from-the-source"> + Meson documentation</ulink>. + </para> + </step> + + <step> + <title>Regression Tests</title> + + <indexterm> + <primary>regression test</primary> + </indexterm> + + <para> + If you want to test the newly built server before you install it, + you can run the regression tests at this point. The regression + tests are a test suite to verify that <productname>PostgreSQL</productname> + runs on your machine in the way the developers expected it + to. Type: +<screen> +<userinput>meson test</userinput> +</screen> + (This won't work as root; do it as an unprivileged user.) + See <xref linkend="regress"/> for + detailed information about interpreting the test results. You can + repeat this test at any later time by issuing the same command. + </para> + + <para> + To run pg_regress and pg_isolation_regress tests against a running + postgres instance, specify <userinput>--setup running</userinput> as an + argument to <userinput>meson test</userinput>. + </para> + </step> + + <step id="meson-install"> + <title>Installing the Files</title> + + <note> + <para> + If you are upgrading an existing system be sure to read + <xref linkend="upgrading"/>, + which has instructions about upgrading a + cluster. + </para> + </note> + + <para> + Once PostgreSQL is built, you can install it by simply running the + <literal>ninja install</literal> command. +<screen> +ninja install +</screen> + </para> + + <para> + This will install files into the directories that were specified + in <xref linkend="meson-configure"/>. Make sure that you have appropriate + permissions to write into that area. You might need to do this + step as root. Alternatively, you can create the target directories + in advance and arrange for appropriate permissions to be granted. + The standard installation provides all the header files needed for client + application development as well as for server-side program + development, such as custom functions or data types written in C. + </para> + + <para> + <literal>ninja install</literal> should work for most cases, but if you'd + like to use more options (such as <option>--quiet</option> to suppress + extra output), you could also use <literal>meson install</literal> + instead. You can learn more about <ulink + url="https://mesonbuild.com/Commands.html#install">meson install</ulink> + and its options in the Meson documentation. + </para> + </step> + </procedure> + + <formalpara> + <title>Uninstallation:</title> + <para> + To undo the installation, you can use the <command>ninja + uninstall</command> command. + </para> + </formalpara> + + <formalpara> + <title>Cleaning:</title> + <para> + After the installation, you can free disk space by removing the built + files from the source tree with the <command>ninja clean</command> + command. + </para> + </formalpara> + </sect2> + + <sect2 id="meson-options"> + <title><literal>meson setup</literal> Options</title> + + <para> + <command>meson setup</command>'s command-line options are explained below. + This list is not exhaustive (use <literal>meson configure --help</literal> + to get one that is). The options not covered here are meant for advanced + use-cases, and are documented in the standard <ulink + url="https://mesonbuild.com/Commands.html#configure">Meson + documentation</ulink>. These arguments can be used with <command>meson + setup</command> as well. + </para> + + <sect3 id="meson-options-locations"> + <title>Installation Locations</title> + + <para> + These options control where <literal>ninja install</literal> (or <literal>meson install</literal>) will put + the files. The <option>--prefix</option> option (example + <xref linkend="install-short-meson"/>) is sufficient for + most cases. If you have special needs, you can customize the + installation subdirectories with the other options described in this + section. Beware however that changing the relative locations of the + different subdirectories may render the installation non-relocatable, + meaning you won't be able to move it after installation. + (The <literal>man</literal> and <literal>doc</literal> locations are + not affected by this restriction.) For relocatable installs, you + might want to use the <literal>-Drpath=false</literal> option + described later. + </para> + + <variablelist> + <varlistentry id="configure-prefix-meson"> + <term><option>--prefix=<replaceable>PREFIX</replaceable></option></term> + <listitem> + <para> + Install all files under the directory <replaceable>PREFIX</replaceable> + instead of <filename>/usr/local/pgsql</filename> (on Unix based systems) or + <filename><replaceable>current drive letter</replaceable>:/usr/local/pgsql</filename> (on Windows). + The actual files will be installed into various subdirectories; no files + will ever be installed directly into the + <replaceable>PREFIX</replaceable> directory. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-bindir-meson"> + <term><option>--bindir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Specifies the directory for executable programs. The default + is <filename><replaceable>PREFIX</replaceable>/bin</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-sysconfdir-meson"> + <term><option>--sysconfdir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the directory for various configuration files, + <filename><replaceable>PREFIX</replaceable>/etc</filename> by default. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-libdir-meson"> + <term><option>--libdir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the location to install libraries and dynamically loadable + modules. The default is + <filename><replaceable>PREFIX</replaceable>/lib</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-includedir-meson"> + <term><option>--includedir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the directory for installing C and C++ header files. The + default is <filename><replaceable>PREFIX</replaceable>/include</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-datadir-meson"> + <term><option>--datadir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the directory for read-only data files used by the + installed programs. The default is + <filename><replaceable>PREFIX</replaceable>/share</filename>. Note that this has + nothing to do with where your database files will be placed. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-localedir-meson"> + <term><option>--localedir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + Sets the directory for installing locale data, in particular + message translation catalog files. The default is + <filename><replaceable>DATADIR</replaceable>/locale</filename>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-mandir-meson"> + <term><option>--mandir=<replaceable>DIRECTORY</replaceable></option></term> + <listitem> + <para> + The man pages that come with <productname>PostgreSQL</productname> will be installed under + this directory, in their respective + <filename>man<replaceable>x</replaceable></filename> subdirectories. + The default is <filename><replaceable>DATADIR</replaceable>/man</filename>. + </para> + </listitem> + </varlistentry> + + </variablelist> + + <note> + <para> + Care has been taken to make it possible to install + <productname>PostgreSQL</productname> into shared installation locations + (such as <filename>/usr/local/include</filename>) without + interfering with the namespace of the rest of the system. First, + the string <quote><literal>/postgresql</literal></quote> is + automatically appended to <varname>datadir</varname>, + <varname>sysconfdir</varname>, and <varname>docdir</varname>, + unless the fully expanded directory name already contains the + string <quote><literal>postgres</literal></quote> or + <quote><literal>pgsql</literal></quote>. For example, if you choose + <filename>/usr/local</filename> as prefix, the documentation will + be installed in <filename>/usr/local/doc/postgresql</filename>, + but if the prefix is <filename>/opt/postgres</filename>, then it + will be in <filename>/opt/postgres/doc</filename>. The public C + header files of the client interfaces are installed into + <varname>includedir</varname> and are namespace-clean. The + internal header files and the server header files are installed + into private directories under <varname>includedir</varname>. See + the documentation of each interface for information about how to + access its header files. Finally, a private subdirectory will + also be created, if appropriate, under <varname>libdir</varname> + for dynamically loadable modules. + </para> + </note> + </sect3> + + <sect3 id="meson-options-features"> + <title><productname>PostgreSQL</productname> Features</title> + + <para> + The options described in this section enable building of + various optional <productname>PostgreSQL</productname> features. + Most of these require additional software, as described in + <xref linkend="install-requirements"/>, and will be automatically enabled if the + required software is found. You can change this behavior by manually + setting these features to <literal>enabled</literal> to require them + or <literal>disabled</literal> to not build with them. + </para> + + <para> + To specify PostgreSQL-specific options, the name of the option + must be prefixed by <literal>-D</literal>. + </para> + + <variablelist> + <varlistentry id="configure-with-nls-meson"> + <term><option>-Dnls={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Enables or disables Native Language Support (<acronym>NLS</acronym>), + that is, the ability to display a program's messages in a language + other than English. Defaults to auto and will be enabled + automatically if an implementation of the <application>Gettext + API</application> is found. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-plperl-meson"> + <term><option>-Dplperl={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build the <application>PL/Perl</application> server-side language. + Defaults to auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-plpython-meson"> + <term><option>-Dplpython={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build the <application>PL/Python</application> server-side language. + Defaults to auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-pltcl-meson"> + <term><option>-Dpltcl={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build the <application>PL/Tcl</application> server-side language. + Defaults to auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-tcl-version-meson"> + <term><option>-Dtcl_version=<replaceable>TCL_VERSION</replaceable></option></term> + <listitem> + <para> + Specifies the Tcl version to use when building PL/Tcl. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-icu-meson"> + <term><option>-Dicu={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with support for the + <productname>ICU</productname><indexterm><primary>ICU</primary></indexterm> + library, enabling use of ICU collation features<phrase + condition="standalone-ignore"> (see <xref + linkend="collation"/>)</phrase>. Defaults to auto and requires the + <productname>ICU4C</productname> package to be installed. The minimum + required version of <productname>ICU4C</productname> is currently 4.2. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-llvm-meson"> + <term><option>-Dllvm={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with support for <productname>LLVM</productname> based + <acronym>JIT</acronym> compilation<phrase + condition="standalone-ignore"> (see <xref linkend="jit"/>)</phrase>. + This requires the <productname>LLVM</productname> library to be + installed. The minimum required version of + <productname>LLVM</productname> is currently 3.9. Disabled by + default. + </para> + + <para> + <command>llvm-config</command><indexterm><primary>llvm-config</primary></indexterm> + will be used to find the required compilation options. + <command>llvm-config</command>, and then + <command>llvm-config-$version</command> for all supported versions, + will be searched for in your <envar>PATH</envar>. If that would not + yield the desired program, use <envar>LLVM_CONFIG</envar> to specify a + path to the correct <command>llvm-config</command>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-lz4-meson"> + <term><option>-Dlz4={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with <productname>LZ4</productname> compression support. + Defaults to auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-zstd-meson"> + <term><option>-Dzstd={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with <productname>Zstandard</productname> compression support. + Defaults to auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-ssl-meson"> + <term><option>-Dssl={ auto | <replaceable>LIBRARY</replaceable> }</option> + <indexterm> + <primary>OpenSSL</primary> + <seealso>SSL</seealso> + </indexterm> + </term> + <listitem> + <para> + Build with support for <acronym>SSL</acronym> (encrypted) connections. + The only <replaceable>LIBRARY</replaceable> supported is + <option>openssl</option>. This requires the + <productname>OpenSSL</productname> package to be installed. Building + with this will check for the required header files and libraries to + make sure that your <productname>OpenSSL</productname> installation is + sufficient before proceeding. The default for this option is auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-gssapi-meson"> + <term><option>-Dgssapi={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with support for GSSAPI authentication. MIT Kerberos is required + to be installed for GSSAPI. On many systems, the GSSAPI system (a part + of the MIT Kerberos installation) is not installed in a location + that is searched by default (e.g., <filename>/usr/include</filename>, + <filename>/usr/lib</filename>). In + those cases, PostgreSQL will query <command>pkg-config</command> to + detect the required compiler and linker options. Defaults to auto. + <filename>meson configure</filename> will check for the required + header files and libraries to make sure that your GSSAPI installation + is sufficient before proceeding. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-ldap-meson"> + <term><option>-Dldap={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with + <acronym>LDAP</acronym><indexterm><primary>LDAP</primary></indexterm> + support for authentication and connection parameter lookup (see + <phrase id="install-ldap-links-meson"><xref linkend="libpq-ldap"/> and + <xref linkend="auth-ldap"/></phrase> for more information). On Unix, + this requires the <productname>OpenLDAP</productname> package to be + installed. On Windows, the default <productname>WinLDAP</productname> + library is used. Defaults to auto. <filename>meson + configure</filename> will check for the required header files and + libraries to make sure that your <productname>OpenLDAP</productname> + installation is sufficient before proceeding. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-pam-meson"> + <term><option>-Dpam={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with + <acronym>PAM</acronym><indexterm><primary>PAM</primary></indexterm> + (Pluggable Authentication Modules) support. Defaults to auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-bsd-auth-meson"> + <term><option>-Dbsd_auth={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with BSD Authentication support. (The BSD Authentication + framework is currently only available on OpenBSD.) Defaults to auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-systemd-meson"> + <term><option>-Dsystemd={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with support for + <application>systemd</application><indexterm><primary>systemd</primary></indexterm> + service notifications. This improves integration if the server is + started under <application>systemd</application> but has no impact + otherwise<phrase condition="standalone-ignore">; see <xref + linkend="server-start"/> for more information</phrase>. Defaults to + auto. <application>libsystemd</application> and the associated header + files need to be installed to use this option. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-bonjour-meson"> + <term><option>-Dbonjour={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with support for Bonjour automatic service discovery. Defaults + to auto and requires Bonjour support in your operating system. + Recommended on macOS. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-uuid-meson"> + <term><option>-Duuid=<replaceable>LIBRARY</replaceable></option></term> + <listitem> + <para> + Build the <xref linkend="uuid-ossp"/> module + (which provides functions to generate UUIDs), using the specified + UUID library.<indexterm><primary>UUID</primary></indexterm> + <replaceable>LIBRARY</replaceable> must be one of: + </para> + <itemizedlist> + <listitem> + <para> + <option>none</option> to not build the uuid module. This is the default. + </para> + </listitem> + <listitem> + <para> + <option>bsd</option> to use the UUID functions found in FreeBSD, + and some other BSD-derived systems + </para> + </listitem> + <listitem> + <para> + <option>e2fs</option> to use the UUID library created by + the <literal>e2fsprogs</literal> project; this library is present in most + Linux systems and in macOS, and can be obtained for other + platforms as well + </para> + </listitem> + <listitem> + <para> + <option>ossp</option> to use the <ulink + url="http://www.ossp.org/pkg/lib/uuid/">OSSP UUID library</ulink> + </para> + </listitem> + </itemizedlist> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-libxml-meson"> + <term><option>-Dlibxml={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with libxml2, enabling SQL/XML support. Defaults to + auto. Libxml2 version 2.6.23 or later is required for this feature. + </para> + + <para> + To use a libxml2 installation that is in an unusual location, you + can set <command>pkg-config</command>-related environment + variables (see its documentation). + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-with-libxslt-meson"> + <term><option>-Dlibxslt={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Build with libxslt, enabling the + <xref linkend="xml2"/> + module to perform XSL transformations of XML. + <option>-Dlibxml</option> must be specified as well. Defaults to + auto. + </para> + </listitem> + </varlistentry> + </variablelist> + </sect3> + + <sect3 id="meson-options-anti-features"> + <title>Anti-Features</title> + + <variablelist> + <varlistentry id="configure-readline-meson"> + <term><option>-Dreadline={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Allows use of the <application>Readline</application> library (and + <application>libedit</application> as well). This option defaults to + auto and enables command-line editing and history in + <application>psql</application> and is strongly recommended. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-libedit-preferred-meson"> + <term><option>-Dlibedit_preferred={ true | false }</option></term> + <listitem> + <para> + Setting this to true favors the use of the BSD-licensed + <application>libedit</application> library rather than GPL-licensed + <application>Readline</application>. This option is significant only + if you have both libraries installed; the default is false, that is to + use <application>Readline</application>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-zlib-meson"> + <term><option>-Dzlib={ auto | enabled | disabled }</option></term> + <listitem> + <para> + <indexterm> + <primary>zlib</primary> + </indexterm> + Enables use of the <application>Zlib</application> library. + It defaults to auto and enables + support for compressed archives in <application>pg_dump</application>, + <application>pg_restore</application> and <application>pg_basebackup</application> and is recommended. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-spinlocks-meson"> + <term><option>-Dspinlocks={ true | false }</option></term> + <listitem> + <para> + This option is set to true by default; setting it to false will + allow the build to succeed even if <productname>PostgreSQL</productname> + has no CPU spinlock support for the platform. The lack of + spinlock support will result in very poor performance; therefore, + this option should only be changed if the build aborts and + informs you that the platform lacks spinlock support. If setting this + option to false is required to build <productname>PostgreSQL</productname> on + your platform, please report the problem to the + <productname>PostgreSQL</productname> developers. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-atomics-meson"> + <term><option>-Datomics={ true | false }</option></term> + <listitem> + <para> + This option is set to true by default; setting it to false will + disable use of CPU atomic operations. The option does nothing on + platforms that lack such operations. On platforms that do have + them, disabling atomics will result in poor performance. Changing + this option is only useful for debugging or making performance comparisons. + </para> + </listitem> + </varlistentry> + </variablelist> + </sect3> + + <sect3 id="meson-options-build-process"> + <title>Build Process Details</title> + + <variablelist> + <varlistentry id="configure-auto-features-meson"> + <term><option>--auto_features={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Setting this option allows you to override the value of all + <quote>auto</quote> features (features that are enabled automatically + if the required software is found). This can be useful when you want + to disable or enable all the <quote>optional</quote> features at once + without having to set each of them manually. The default value for + this parameter is auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-backend-meson"> + <term><option>--backend=<replaceable>BACKEND</replaceable></option></term> + <listitem> + <para> + The default backend Meson uses is ninja and that should suffice for + most use cases. However, if you'd like to fully integrate with Visual + Studio, you can set the <option>BACKEND</option> to + <command>vs</command>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-c-args-meson"> + <term><option>-Dc_args=<replaceable>OPTIONS</replaceable></option></term> + <listitem> + <para> + This option can be used to pass extra options to the C compiler. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-c-link-args-meson"> + <term><option>-Dc_link_args=<replaceable>OPTIONS</replaceable></option></term> + <listitem> + <para> + This option can be used to pass extra options to the C linker. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-extra-include-dirs-meson"> + <term><option>-Dextra_include_dirs=<replaceable>DIRECTORIES</replaceable></option></term> + <listitem> + <para> + <replaceable>DIRECTORIES</replaceable> is a comma-separated list of + directories that will be added to the list the compiler searches for + header files. If you have optional packages (such as GNU + <application>Readline</application>) installed in a non-standard + location, you have to use this option and probably also the + corresponding <option>-Dextra_lib_dirs</option> option. + </para> + + <para> + Example: <literal>-Dextra_include_dirs=/opt/gnu/include,/usr/sup/include</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-extra-lib-dirs-meson"> + <term><option>-Dextra_lib_dirs=<replaceable>DIRECTORIES</replaceable></option></term> + <listitem> + <para> + <replaceable>DIRECTORIES</replaceable> is a comma-separated list of + directories to search for libraries. You will probably have to use + this option (and the corresponding + <option>-Dextra_include_dirs</option> option) if you have packages + installed in non-standard locations. + </para> + <para> + Example: <literal>-Dextra_lib_dirs=/opt/gnu/lib,/usr/sup/lib</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-system-tzdata-meson"> + <term><option>-Dsystem_tzdata=<replaceable>DIRECTORY</replaceable></option> + <indexterm> + <primary>time zone data</primary> + </indexterm> + </term> + <listitem> + <para> + <productname>PostgreSQL</productname> includes its own time zone + database, which it requires for date and time operations. This time + zone database is in fact compatible with the IANA time zone database + provided by many operating systems such as FreeBSD, Linux, and + Solaris, so it would be redundant to install it again. When this + option is used, the system-supplied time zone database in + <replaceable>DIRECTORY</replaceable> is used instead of the one + included in the PostgreSQL source distribution. + <replaceable>DIRECTORY</replaceable> must be specified as an absolute + path. <filename>/usr/share/zoneinfo</filename> is a likely directory + on some operating systems. Note that the installation routine will + not detect mismatching or erroneous time zone data. If you use this + option, you are advised to run the regression tests to verify that the + time zone data you have pointed to works correctly with + <productname>PostgreSQL</productname>. + </para> + + <indexterm><primary>cross compilation</primary></indexterm> + + <para> + This option is mainly aimed at binary package distributors who know + their target operating system well. The main advantage of using this + option is that the PostgreSQL package won't need to be upgraded + whenever any of the many local daylight-saving time rules change. + Another advantage is that PostgreSQL can be cross-compiled more + straightforwardly if the time zone database files do not need to be + built during the installation. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-extra-version-meson"> + <term><option>-Dextra_version=<replaceable>STRING</replaceable></option></term> + <listitem> + <para> + Append <replaceable>STRING</replaceable> to the PostgreSQL version + number. You can use this, for example, to mark binaries built from + unreleased <productname>Git</productname> snapshots or containing + custom patches with an extra version string, such as a <command>git + describe</command> identifier or a distribution package release + number. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-rpath-meson"> + <term><option>-Drpath={ true | false }</option></term> + <listitem> + <para> + This option is set to true by default. If set to false, + do not mark <productname>PostgreSQL</productname>'s executables + to indicate that they should search for shared libraries in the + installation's library directory (see <option>--libdir</option>). + On most platforms, this marking uses an absolute path to the + library directory, so that it will be unhelpful if you relocate + the installation later. However, you will then need to provide + some other way for the executables to find the shared libraries. + Typically this requires configuring the operating system's + dynamic linker to search the library directory; see + <xref linkend="install-post-shlibs"/> for more detail. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-binary-name-meson"> + <term><option>-D<replaceable>BINARY_NAME</replaceable>=<replaceable>PATH</replaceable></option></term> + <listitem> + <para> + If a program required to build PostgreSQL (with or without optional + flags) is stored at a non-standard path, you can specify it manually + to <literal>meson configure</literal>. The complete list of programs + for which this is supported can be found by running <literal>meson + configure</literal>. Example: +<programlisting>meson configure -DBISON=PATH_TO_BISON</programlisting> + </para> + </listitem> + </varlistentry> + </variablelist> + </sect3> + + <sect3 id="meson-options-docs"> + <title>Documentation</title> + + <para> + See <xref linkend="docguide-toolsets"/> for the tools needed for building + the documentation. + </para> + + <variablelist> + + <varlistentry id="configure-docs-meson"> + <term><option>-Ddocs={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Enables building the documentation in <acronym>HTML</acronym> and + <acronym>man</acronym> format. It defaults to auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-docs-pdf-meson"> + <term><option>-Ddocs_pdf={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Enables building the documentation in <acronym>PDF</acronym> + format. It defaults to auto. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-docs-html-style"> + <term><option>-Ddocs_html_style={ simple | website }</option></term> + <listitem> + <para> + Controls which <acronym>CSS</acronym> stylesheet is used. The default + is <literal>simple</literal>. If set to <literal>website</literal>, + the HTML documentation will reference the stylesheet for <ulink + url="https://www.postgresql.org/docs/current/">postgresql.org</ulink>. + </para> + </listitem> + </varlistentry> + + </variablelist> + </sect3> + + <sect3 id="meson-options-misc"> + <title>Miscellaneous</title> + + <variablelist> + <varlistentry id="configure-pgport-meson"> + <term><option>-Dpgport=<replaceable>NUMBER</replaceable></option></term> + <listitem> + <para> + Set <replaceable>NUMBER</replaceable> as the default port number for + server and clients. The default is 5432. The port can always + be changed later on, but if you specify it here then both + server and clients will have the same default compiled in, + which can be very convenient. Usually the only good reason + to select a non-default value is if you intend to run multiple + <productname>PostgreSQL</productname> servers on the same machine. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-krb-srvnam-meson"> + <term><option>-Dkrb_srvnam=<replaceable>NAME</replaceable></option></term> + <listitem> + <para> + The default name of the Kerberos service principal used + by GSSAPI. + <literal>postgres</literal> is the default. There's usually no + reason to change this unless you are building for a Windows + environment, in which case it must be set to upper case + <literal>POSTGRES</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-segsize-meson"> + <term><option>-Dsegsize=<replaceable>SEGSIZE</replaceable></option></term> + <listitem> + <para> + Set the <firstterm>segment size</firstterm>, in gigabytes. Large tables are + divided into multiple operating-system files, each of size equal + to the segment size. This avoids problems with file size limits + that exist on many platforms. The default segment size, 1 gigabyte, + is safe on all supported platforms. If your operating system has + <quote>largefile</quote> support (which most do, nowadays), you can use + a larger segment size. This can be helpful to reduce the number of + file descriptors consumed when working with very large tables. + But be careful not to select a value larger than is supported + by your platform and the file systems you intend to use. Other + tools you might wish to use, such as <application>tar</application>, could + also set limits on the usable file size. + It is recommended, though not absolutely required, that this value + be a power of 2. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-blocksize-meson"> + <term><option>-Dblocksize=<replaceable>BLOCKSIZE</replaceable></option></term> + <listitem> + <para> + Set the <firstterm>block size</firstterm>, in kilobytes. This is the unit + of storage and I/O within tables. The default, 8 kilobytes, + is suitable for most situations; but other values may be useful + in special cases. + The value must be a power of 2 between 1 and 32 (kilobytes). + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-wal-blocksize-meson"> + <term><option>-Dwal_blocksize=<replaceable>BLOCKSIZE</replaceable></option></term> + <listitem> + <para> + Set the <firstterm>WAL block size</firstterm>, in kilobytes. This is the unit + of storage and I/O within the WAL log. The default, 8 kilobytes, + is suitable for most situations; but other values may be useful + in special cases. + The value must be a power of 2 between 1 and 64 (kilobytes). + </para> + </listitem> + </varlistentry> + </variablelist> + </sect3> + + <sect3 id="meson-options-devel"> + <title>Developer Options</title> + + <para> + Most of the options in this section are only of interest for + developing or debugging <productname>PostgreSQL</productname>. + They are not recommended for production builds, except + for <option>--debug</option>, which can be useful to enable + detailed bug reports in the unlucky event that you encounter a bug. + On platforms supporting DTrace, <option>-Ddtrace</option> + may also be reasonable to use in production. + </para> + + <para> + When building an installation that will be used to develop code inside + the server, it is recommended to use at least the <option>--buildtype=debug</option> + and <option>-Dcassert</option> options. + </para> + + <variablelist> + <varlistentry id="configure-buildtype-meson"> + <term><option>--buildtype=<replaceable>BUILDTYPE</replaceable></option></term> + <listitem> + <para> + This option can be used to specify the buildtype to use; defaults to + <option>debugoptimized</option>. If you'd like finer control on the debug + symbols and optimization levels than what this option provides, you + can refer to the <option>--debug</option> and + <option>--optimization</option> flags. + </para> + + <para> + The following build types are generally used: <option>plain</option>, + <option>debug</option>, <option>debugoptimized</option> and + <option>release</option>. More information about them can be found in + the <ulink + url="https://mesonbuild.com/Running-Meson.html#configuring-the-build-directory">Meson + documentation</ulink>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-debug-meson"> + <term><option>--debug</option></term> + <listitem> + <para> + Compiles all programs and libraries with debugging symbols. This + means that you can run the programs in a debugger to analyze + problems. This enlarges the size of the installed executables + considerably, and on non-GCC compilers it usually also disables + compiler optimization, causing slowdowns. However, having the symbols + available is extremely helpful for dealing with any problems that + might arise. Currently, this option is recommended for production + installations only if you use GCC. But you should always have it on + if you are doing development work or running a beta version. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-optimization-meson"> + <term><option>--optimization</option>=<replaceable>LEVEL</replaceable></term> + <listitem> + <para> + Specify the optimization level. <option>LEVEL</option> can be set to any of {0,g,1,2,3,s}. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-werror-meson"> + <term><option>--werror</option></term> + <listitem> + <para> + Setting this option asks the compiler to treat warnings as + errors. This can be useful for code development. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-cassert-meson"> + <term><option>-Dcassert={ true | false }</option></term> + <listitem> + <para> + Enables <firstterm>assertion</firstterm> checks in the server, which + test for many <quote>cannot happen</quote> conditions. This is + invaluable for code development purposes, but the tests slow down the + server significantly. Also, having the tests turned on won't + necessarily enhance the stability of your server! The assertion + checks are not categorized for severity, and so what might be a + relatively harmless bug will still lead to server restarts if it + triggers an assertion failure. This option is not recommended for + production use, but you should have it on for development work or when + running a beta version. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-tap-tests-meson"> + <term><option>-Dtap_tests={ auto | enabled | disabled }</option></term> + <listitem> + <para> + Enable tests using the Perl TAP tools. Defaults to auto and requires + a Perl installation and the Perl module <literal>IPC::Run</literal>. + <phrase condition="standalone-ignore">See <xref + linkend="regress-tap"/> for more information.</phrase> + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-pg-test-extra-meson"> + <term><option>-DPG_TEST_EXTRA=<replaceable>TEST_SUITES</replaceable></option></term> + <listitem> + <para> + Enable test suites which require special software to run. This option + accepts arguments via a whitespace-separated list. See <xref + linkend="regress-additional"/> for details. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-b-coverage-meson"> + <term><option>-Db_coverage={ true | false }</option></term> + <listitem> + <para> + If using GCC, all programs and libraries are compiled with + code coverage testing instrumentation. When run, they + generate files in the build directory with code coverage + metrics. + <phrase condition="standalone-ignore">See <xref linkend="regress-coverage"/> + for more information.</phrase> This option is for use only with GCC + and when doing development work. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-dtrace-meson"> + <term><option>-Ddtrace={ auto | enabled | disabled }</option></term> + <listitem> + <para> + <indexterm> + <primary>DTrace</primary> + </indexterm> + Enabling this compiles <productname>PostgreSQL</productname> with support for the + dynamic tracing tool DTrace. + <phrase condition="standalone-ignore">See <xref linkend="dynamic-trace"/> + for more information.</phrase> + </para> + + <para> + To point to the <command>dtrace</command> program, the + <option>DTRACE</option> option can be set. This + will often be necessary because <command>dtrace</command> is + typically installed under <filename>/usr/sbin</filename>, + which might not be in your <envar>PATH</envar>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="configure-segsize-blocks-meson"> + <term><option>-Dsegsize_blocks=SEGSIZE_BLOCKS</option></term> + <listitem> + <para> + Specify the relation segment size in blocks. If both + <option>-Dsegsize</option> and this option are specified, this option + wins. + + This option is only for developers, to test segment related code. + </para> + </listitem> + </varlistentry> + + </variablelist> + </sect3> + </sect2> + </sect1> + + <sect1 id="install-post"> + <title>Post-Installation Setup</title> + + <sect2 id="install-post-shlibs"> + <title>Shared Libraries</title> + + <indexterm> + <primary>shared library</primary> + </indexterm> + + <para> + On some systems with shared libraries + you need to tell the system how to find the newly installed + shared libraries. The systems on which this is + <emphasis>not</emphasis> necessary include + <systemitem class="osname">FreeBSD</systemitem>, + <systemitem class="osname">Linux</systemitem>, + <systemitem class="osname">NetBSD</systemitem>, <systemitem + class="osname">OpenBSD</systemitem>, and + <systemitem class="osname">Solaris</systemitem>. + </para> + + <para> + The method to set the shared library search path varies between + platforms, but the most widely-used method is to set the + environment variable <envar>LD_LIBRARY_PATH</envar> like so: In Bourne + shells (<command>sh</command>, <command>ksh</command>, <command>bash</command>, <command>zsh</command>): +<programlisting> +LD_LIBRARY_PATH=/usr/local/pgsql/lib +export LD_LIBRARY_PATH +</programlisting> + or in <command>csh</command> or <command>tcsh</command>: +<programlisting> +setenv LD_LIBRARY_PATH /usr/local/pgsql/lib +</programlisting> + Replace <literal>/usr/local/pgsql/lib</literal> with whatever you set + <option><literal>--libdir</literal></option> to in <xref linkend="configure"/>. + You should put these commands into a shell start-up file such as + <filename>/etc/profile</filename> or <filename>~/.bash_profile</filename>. Some + good information about the caveats associated with this method can + be found at <ulink + url="http://xahlee.info/UnixResource_dir/_/ldpath.html"></ulink>. + </para> + + <para> + On some systems it might be preferable to set the environment + variable <envar>LD_RUN_PATH</envar> <emphasis>before</emphasis> + building. + </para> + + <para> + On <systemitem class="osname">Cygwin</systemitem>, put the library + directory in the <envar>PATH</envar> or move the + <filename>.dll</filename> files into the <filename>bin</filename> + directory. + </para> + + <para> + If in doubt, refer to the manual pages of your system (perhaps + <command>ld.so</command> or <command>rld</command>). If you later + get a message like: +<screen> +psql: error in loading shared libraries +libpq.so.2.1: cannot open shared object file: No such file or directory +</screen> + then this step was necessary. Simply take care of it then. + </para> + + <para> + <indexterm> + <primary>ldconfig</primary> + </indexterm> + If you are on <systemitem class="osname">Linux</systemitem> and you have root + access, you can run: +<programlisting> +/sbin/ldconfig /usr/local/pgsql/lib +</programlisting> + (or equivalent directory) after installation to enable the + run-time linker to find the shared libraries faster. Refer to the + manual page of <command>ldconfig</command> for more information. On + <systemitem class="osname">FreeBSD</systemitem>, <systemitem + class="osname">NetBSD</systemitem>, and <systemitem + class="osname">OpenBSD</systemitem> the command is: +<programlisting> +/sbin/ldconfig -m /usr/local/pgsql/lib +</programlisting> + instead. Other systems are not known to have an equivalent + command. + </para> + </sect2> + + <sect2 id="install-post-env-vars"> + <title>Environment Variables</title> + + <indexterm> + <primary><envar>PATH</envar></primary> + </indexterm> + + <para> + If you installed into <filename>/usr/local/pgsql</filename> or some other + location that is not searched for programs by default, you should + add <filename>/usr/local/pgsql/bin</filename> (or whatever you set + <option><literal>--bindir</literal></option> to in <xref linkend="configure"/>) + into your <envar>PATH</envar>. Strictly speaking, this is not + necessary, but it will make the use of <productname>PostgreSQL</productname> + much more convenient. + </para> + + <para> + To do this, add the following to your shell start-up file, such as + <filename>~/.bash_profile</filename> (or <filename>/etc/profile</filename>, if you + want it to affect all users): +<programlisting> +PATH=/usr/local/pgsql/bin:$PATH +export PATH +</programlisting> + If you are using <command>csh</command> or <command>tcsh</command>, then use this command: +<programlisting> +set path = ( /usr/local/pgsql/bin $path ) +</programlisting> + </para> + + <para> + <indexterm> + <primary><envar>MANPATH</envar></primary> + </indexterm> + To enable your system to find the <application>man</application> + documentation, you need to add lines like the following to a + shell start-up file unless you installed into a location that is + searched by default: +<programlisting> +MANPATH=/usr/local/pgsql/share/man:$MANPATH +export MANPATH +</programlisting> + </para> + + <para> + The environment variables <envar>PGHOST</envar> and <envar>PGPORT</envar> + specify to client applications the host and port of the database + server, overriding the compiled-in defaults. If you are going to + run client applications remotely then it is convenient if every + user that plans to use the database sets <envar>PGHOST</envar>. This + is not required, however; the settings can be communicated via command + line options to most client programs. + </para> + </sect2> + </sect1> + + <sect1 id="supported-platforms"> + <title>Supported Platforms</title> + + <para> + A platform (that is, a CPU architecture and operating system combination) + is considered supported by the <productname>PostgreSQL</productname> development + community if the code contains provisions to work on that platform and + it has recently been verified to build and pass its regression tests + on that platform. Currently, most testing of platform compatibility + is done automatically by test machines in the + <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>. + If you are interested in using <productname>PostgreSQL</productname> on a platform + that is not represented in the build farm, but on which the code works + or can be made to work, you are strongly encouraged to set up a build + farm member machine so that continued compatibility can be assured. + </para> + + <para> + In general, <productname>PostgreSQL</productname> can be expected to work on + these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V, + and PA-RISC, including + big-endian, little-endian, 32-bit, and 64-bit variants where applicable. + It is often + possible to build on an unsupported CPU type by configuring with + <option>--disable-spinlocks</option>, but performance will be poor. + </para> + + <para> + <productname>PostgreSQL</productname> can be expected to work on current + versions of these operating systems: Linux, Windows, + FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos. + Other Unix-like systems may also work but are not currently + being tested. In most cases, all CPU architectures supported by + a given operating system will work. Look in + <xref linkend="installation-platform-notes"/> below to see if + there is information + specific to your operating system, particularly if using an older system. + </para> + + <para> + If you have installation problems on a platform that is known + to be supported according to recent build farm results, please report + it to <email>pgsql-bugs@lists.postgresql.org</email>. If you are interested + in porting <productname>PostgreSQL</productname> to a new platform, + <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place + to discuss that. + </para> + + <para> + Historical versions of <productname>PostgreSQL</productname> or POSTGRES + also ran on CPU architectures including Alpha, Itanium, M32R, M68K, + M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS, + BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS, + Tru64 UNIX, and ULTRIX. + </para> + </sect1> + + <sect1 id="installation-platform-notes"> + <title>Platform-Specific Notes</title> + + <para> + This section documents additional platform-specific issues + regarding the installation and setup of PostgreSQL. Be sure to + read the installation instructions, and in + particular <xref linkend="install-requirements"/> as well. Also, + check <xref linkend="regress"/> regarding the + interpretation of regression test results. + </para> + + <para> + Platforms that are not covered here have no known platform-specific + installation issues. + </para> + + <sect2 id="installation-notes-aix"> + <title>AIX</title> + + <indexterm zone="installation-notes-aix"> + <primary>AIX</primary> + <secondary>installation on</secondary> + </indexterm> + + <para> + You can use GCC or the native IBM compiler <command>xlc</command> + to build <productname>PostgreSQL</productname> + on <productname>AIX</productname>. + </para> + + <para> + <productname>AIX</productname> versions before 7.1 are no longer + tested nor supported by the <productname>PostgreSQL</productname> + community. + </para> + + <sect3 id="installation-notes-aix-mem-management"> + <title>Memory Management</title> + <!-- https://archives.postgresql.org/message-id/603bgqmpl9.fsf@dba2.int.libertyrms.com --> + + <para> + AIX can be somewhat peculiar with regards to the way it does + memory management. You can have a server with many multiples of + gigabytes of RAM free, but still get out of memory or address + space errors when running applications. One example + is loading of extensions failing with unusual errors. + For example, running as the owner of the PostgreSQL installation: +<screen> +=# CREATE EXTENSION plperl; +ERROR: could not load library "/opt/dbs/pgsql/lib/plperl.so": A memory address is not in the address space for the process. +</screen> + Running as a non-owner in the group possessing the PostgreSQL + installation: +<screen> +=# CREATE EXTENSION plperl; +ERROR: could not load library "/opt/dbs/pgsql/lib/plperl.so": Bad address +</screen> + Another example is out of memory errors in the PostgreSQL server + logs, with every memory allocation near or greater than 256 MB + failing. + </para> + + <para> + The overall cause of all these problems is the default bittedness + and memory model used by the server process. By default, all + binaries built on AIX are 32-bit. This does not depend upon + hardware type or kernel in use. These 32-bit processes are + limited to 4 GB of memory laid out in 256 MB segments using one + of a few models. The default allows for less than 256 MB in the + heap as it shares a single segment with the stack. + </para> + + <para> + In the case of the <literal>plperl</literal> example, above, + check your umask and the permissions of the binaries in your + PostgreSQL installation. The binaries involved in that example + were 32-bit and installed as mode 750 instead of 755. Due to the + permissions being set in this fashion, only the owner or a member + of the possessing group can load the library. Since it isn't + world-readable, the loader places the object into the process' + heap instead of the shared library segments where it would + otherwise be placed. + </para> + + <para> + The <quote>ideal</quote> solution for this is to use a 64-bit + build of PostgreSQL, but that is not always practical, because + systems with 32-bit processors can build, but not run, 64-bit + binaries. + </para> + + <para> + If a 32-bit binary is desired, set <symbol>LDR_CNTRL</symbol> to + <literal>MAXDATA=0x<replaceable>n</replaceable>0000000</literal>, + where 1 <= n <= 8, before starting the PostgreSQL server, + and try different values and <filename>postgresql.conf</filename> + settings to find a configuration that works satisfactorily. This + use of <symbol>LDR_CNTRL</symbol> tells AIX that you want the + server to have <symbol>MAXDATA</symbol> bytes set aside for the + heap, allocated in 256 MB segments. When you find a workable + configuration, + <command>ldedit</command> can be used to modify the binaries so + that they default to using the desired heap size. PostgreSQL can + also be rebuilt, passing <literal>configure + LDFLAGS="-Wl,-bmaxdata:0x<replaceable>n</replaceable>0000000"</literal> + to achieve the same effect. + </para> + + <para> + For a 64-bit build, set <envar>OBJECT_MODE</envar> to 64 and + pass <literal>CC="gcc -maix64"</literal> + and <literal>LDFLAGS="-Wl,-bbigtoc"</literal> + to <command>configure</command>. (Options for + <command>xlc</command> might differ.) If you omit the export of + <envar>OBJECT_MODE</envar>, your build may fail with linker errors. When + <envar>OBJECT_MODE</envar> is set, it tells AIX's build utilities + such as <command>ar</command>, <command>as</command>, and <command>ld</command> what + type of objects to default to handling. + </para> + + <para> + By default, overcommit of paging space can happen. While we have + not seen this occur, AIX will kill processes when it runs out of + memory and the overcommit is accessed. The closest to this that + we have seen is fork failing because the system decided that + there was not enough memory for another process. Like many other + parts of AIX, the paging space allocation method and + out-of-memory kill is configurable on a system- or process-wide + basis if this becomes a problem. + </para> + </sect3> + </sect2> + + <sect2 id="installation-notes-cygwin"> + <title>Cygwin</title> + + <indexterm zone="installation-notes-cygwin"> + <primary>Cygwin</primary> + <secondary>installation on</secondary> + </indexterm> + + <para> + PostgreSQL can be built using Cygwin, a Linux-like environment for + Windows, but that method is inferior to the native Windows build + <phrase condition="standalone-ignore">(see <xref linkend="install-windows"/>)</phrase> and + running a server under Cygwin is no longer recommended. + </para> + + <para> + When building from source, proceed according to the Unix-style + installation procedure (i.e., <literal>./configure; + make</literal>; etc.), noting the following Cygwin-specific + differences: + + <itemizedlist> + <listitem> + <para> + Set your path to use the Cygwin bin directory before the + Windows utilities. This will help prevent problems with + compilation. + </para> + </listitem> + + <listitem> + <para> + The <command>adduser</command> command is not supported; use + the appropriate user management application on Windows. + Otherwise, skip this step. + </para> + </listitem> + + <listitem> + <para> + The <command>su</command> command is not supported; use ssh to + simulate su on Windows. Otherwise, skip this step. + </para> + </listitem> + + <listitem> + <para> + <productname>OpenSSL</productname> is not supported. + </para> + </listitem> + + <listitem> + <para> + Start <command>cygserver</command> for shared memory support. + To do this, enter the command <literal>/usr/sbin/cygserver + &</literal>. This program needs to be running anytime you + start the PostgreSQL server or initialize a database cluster + (<command>initdb</command>). The + default <command>cygserver</command> configuration may need to + be changed (e.g., increase <symbol>SEMMNS</symbol>) to prevent + PostgreSQL from failing due to a lack of system resources. + </para> + </listitem> + + <listitem> + <para> + Building might fail on some systems where a locale other than + C is in use. To fix this, set the locale to C by doing + <command>export LANG=C.utf8</command> before building, and then + setting it back to the previous setting after you have installed + PostgreSQL. + </para> + </listitem> + + <listitem> + <para> + The parallel regression tests (<literal>make check</literal>) + can generate spurious regression test failures due to + overflowing the <function>listen()</function> backlog queue + which causes connection refused errors or hangs. You can limit + the number of connections using the make + variable <varname>MAX_CONNECTIONS</varname> thus: +<programlisting> +make MAX_CONNECTIONS=5 check +</programlisting> + (On some systems you can have up to about 10 simultaneous + connections.) + </para> + </listitem> + </itemizedlist> + </para> + + <para> + It is possible to install <command>cygserver</command> and the + PostgreSQL server as Windows NT services. For information on how + to do this, please refer to the <filename>README</filename> + document included with the PostgreSQL binary package on Cygwin. + It is installed in the + directory <filename>/usr/share/doc/Cygwin</filename>. + </para> + </sect2> + + <sect2 id="installation-notes-macos"> + <title>macOS</title> + + <indexterm zone="installation-notes-macos"> + <primary>macOS</primary> + <secondary>installation on</secondary> + </indexterm> + + <para> + To build <productname>PostgreSQL</productname> from source + on <productname>macOS</productname>, you will need to install Apple's + command line developer tools, which can be done by issuing +<programlisting> +xcode-select --install +</programlisting> + (note that this will pop up a GUI dialog window for confirmation). + You may or may not wish to also install Xcode. + </para> + + <para> + On recent <productname>macOS</productname> releases, it's necessary to + embed the <quote>sysroot</quote> path in the include switches used to + find some system header files. This results in the outputs of + the <application>configure</application> script varying depending on + which SDK version was used during <application>configure</application>. + That shouldn't pose any problem in simple scenarios, but if you are + trying to do something like building an extension on a different machine + than the server code was built on, you may need to force use of a + different sysroot path. To do that, set <varname>PG_SYSROOT</varname>, + for example +<programlisting> +make PG_SYSROOT=<replaceable>/desired/path</replaceable> all +</programlisting> + To find out the appropriate path on your machine, run +<programlisting> +xcrun --show-sdk-path +</programlisting> + Note that building an extension using a different sysroot version than + was used to build the core server is not really recommended; in the + worst case it could result in hard-to-debug ABI inconsistencies. + </para> + + <para> + You can also select a non-default sysroot path when configuring, by + specifying <varname>PG_SYSROOT</varname> + to <application>configure</application>: +<programlisting> +./configure ... PG_SYSROOT=<replaceable>/desired/path</replaceable> +</programlisting> + This would primarily be useful to cross-compile for some other + macOS version. There is no guarantee that the resulting executables + will run on the current host. + </para> + + <para> + To suppress the <option>-isysroot</option> options altogether, use +<programlisting> +./configure ... PG_SYSROOT=none +</programlisting> + (any nonexistent pathname will work). This might be useful if you wish + to build with a non-Apple compiler, but beware that that case is not + tested or supported by the PostgreSQL developers. + </para> + + <para> + <productname>macOS</productname>'s <quote>System Integrity + Protection</quote> (SIP) feature breaks <literal>make check</literal>, + because it prevents passing the needed setting + of <literal>DYLD_LIBRARY_PATH</literal> down to the executables being + tested. You can work around that by doing <literal>make + install</literal> before <literal>make check</literal>. + Most PostgreSQL developers just turn off SIP, though. + </para> + </sect2> + + <sect2 id="installation-notes-mingw"> + <title>MinGW/Native Windows</title> + + <indexterm zone="installation-notes-mingw"> + <primary>MinGW</primary> + <secondary>installation on</secondary> + </indexterm> + + <para> + PostgreSQL for Windows can be built using MinGW, a Unix-like build + environment for Microsoft operating systems, or using + Microsoft's <productname>Visual C++</productname> compiler suite. + The MinGW build procedure uses the normal build system described in + this chapter; the Visual C++ build works completely differently + and is described in <xref linkend="install-windows"/>. + </para> + + <para> + The native Windows port requires a 32 or 64-bit version of Windows + 2000 or later. Earlier operating systems do + not have sufficient infrastructure (but Cygwin may be used on + those). MinGW, the Unix-like build tools, and MSYS, a collection + of Unix tools required to run shell scripts + like <command>configure</command>, can be downloaded + from <ulink url="http://www.mingw.org/"></ulink>. Neither is + required to run the resulting binaries; they are needed only for + creating the binaries. + </para> + + <para> + To build 64 bit binaries using MinGW, install the 64 bit tool set + from <ulink url="https://mingw-w64.org/"></ulink>, put its bin + directory in the <envar>PATH</envar>, and run + <command>configure</command> with the + <command>--host=x86_64-w64-mingw32</command> option. + </para> + + <para> + After you have everything installed, it is suggested that you + run <application>psql</application> + under <command>CMD.EXE</command>, as the MSYS console has + buffering issues. + </para> + + <sect3 id="windows-crash-dumps"> + <title>Collecting Crash Dumps on Windows</title> + + <para> + If PostgreSQL on Windows crashes, it has the ability to generate + <productname>minidumps</productname> that can be used to track down the cause + for the crash, similar to core dumps on Unix. These dumps can be + read using the <productname>Windows Debugger Tools</productname> or using + <productname>Visual Studio</productname>. To enable the generation of dumps + on Windows, create a subdirectory named <filename>crashdumps</filename> + inside the cluster data directory. The dumps will then be written + into this directory with a unique name based on the identifier of + the crashing process and the current time of the crash. + </para> + </sect3> + </sect2> + + <sect2 id="installation-notes-solaris"> + <title>Solaris</title> + + <indexterm zone="installation-notes-solaris"> + <primary>Solaris</primary> + <secondary>installation on</secondary> + </indexterm> + + <para> + PostgreSQL is well-supported on Solaris. The more up to date your + operating system, the fewer issues you will experience. + </para> + + <sect3 id="installation-notes-solaris-req-tools"> + <title>Required Tools</title> + + <para> + You can build with either GCC or Sun's compiler suite. For + better code optimization, Sun's compiler is strongly recommended + on the SPARC architecture. If + you are using Sun's compiler, be careful not to select + <filename>/usr/ucb/cc</filename>; + use <filename>/opt/SUNWspro/bin/cc</filename>. + </para> + + <para> + You can download Sun Studio + from <ulink url="https://www.oracle.com/technetwork/server-storage/solarisstudio/downloads/"></ulink>. + Many GNU tools are integrated into Solaris 10, or they are + present on the Solaris companion CD. If you need packages for + older versions of Solaris, you can find these tools + at <ulink url="http://www.sunfreeware.com"></ulink>. + If you prefer + sources, look + at <ulink url="https://www.gnu.org/prep/ftp"></ulink>. + </para> + </sect3> + + <sect3 id="installation-notes-solaris-configure-complains"> + <title>configure Complains About a Failed Test Program</title> + + <para> + If <command>configure</command> complains about a failed test + program, this is probably a case of the run-time linker being + unable to find some library, probably libz, libreadline or some + other non-standard library such as libssl. To point it to the + right location, set the <envar>LDFLAGS</envar> environment + variable on the <command>configure</command> command line, e.g., +<programlisting> +configure ... LDFLAGS="-R /usr/sfw/lib:/opt/sfw/lib:/usr/local/lib" +</programlisting> + See + the <citerefentry><refentrytitle>ld</refentrytitle><manvolnum>1</manvolnum></citerefentry> + man page for more information. + </para> + </sect3> + + <sect3 id="installation-notes-solaris-comp-opt-perf"> + <title>Compiling for Optimal Performance</title> + + <para> + On the SPARC architecture, Sun Studio is strongly recommended for + compilation. Try using the <option>-xO5</option> optimization + flag to generate significantly faster binaries. Do not use any + flags that modify behavior of floating-point operations + and <varname>errno</varname> processing (e.g., + <option>-fast</option>). + </para> + + <para> + If you do not have a reason to use 64-bit binaries on SPARC, + prefer the 32-bit version. The 64-bit operations are slower and + 64-bit binaries are slower than the 32-bit variants. On the + other hand, 32-bit code on the AMD64 CPU family is not native, + so 32-bit code is significantly slower on that CPU family. + </para> + </sect3> + + <sect3 id="installation-notes-solaris-using-dtrace"> + <title>Using DTrace for Tracing PostgreSQL</title> + + <para> + Yes, using DTrace is possible. See <xref linkend="dynamic-trace"/> for + further information. + </para> + + <para> + If you see the linking of the <command>postgres</command> executable abort with an + error message like: +<screen> +Undefined first referenced + symbol in file +AbortTransaction utils/probes.o +CommitTransaction utils/probes.o +ld: fatal: Symbol referencing errors. No output written to postgres +collect2: ld returned 1 exit status +make: *** [postgres] Error 1 +</screen> + your DTrace installation is too old to handle probes in static + functions. You need Solaris 10u4 or newer to use DTrace. + </para> + </sect3> + </sect2> + </sect1> + +</chapter> |