受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

17.3. 使用 Autoconf 和 Make 进行构建和安装 #

17.3.1. 简短版本 #

./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

较长版本见本其余部分。

17.3.2. 安装过程 #

  1. 配置

    安装过程的第一步,是针对你的系统配置源码树,并选择你希望使用的选项。 这是通过运行 configure 脚本来完成的。 对于默认安装,只需输入:

    ./configure
    

    该脚本会运行一系列测试,以确定各种依赖系统的变量取值,并检测操作系统的特殊之处, 最后在构建树中创建若干文件,记录它发现的结果。

    如果你希望构建目录与原始源码文件分离,也可以在源码树外部的目录中运行 configure,然后在那里进行构建。 这种过程称为 VPATH 构建。做法如下:

    mkdir build_dir
    cd build_dir
    /path/to/source/tree/configure [options go here]
    make
    

    默认配置将构建服务器和实用程序,以及所有只需要 C 编译器的客户端应用程序和接口。 默认情况下,所有文件都会安装到 /usr/local/pgsql 之下。

    你可以通过向 configure 提供一个或多个命令行选项, 来定制构建和安装过程。通常你会定制安装位置,或者选择要构建的一组选配特性。 configure 提供了大量选项,见 Section 17.3.3

    此外,configure 还会响应某些环境变量, 如 Section 17.3.4 所述。这些变量提供了额外的定制方式。

  2. 构建

    要开始构建,请输入以下任一命令:

    make
    make all
    

    (记得使用 GNU make。) 构建会花费几分钟时间,具体取决于你的硬件。

    如果你希望构建所有可构建的内容,包括文档(HTML 和手册页)以及附加模块 (contrib),则改为输入:

    make world
    

    如果你希望构建所有可构建的内容,包括附加模块 (contrib),但不包括文档,则改为输入:

    make world-bin
    

    如果你希望从另一个 makefile 中调用构建,而不是手工执行, 那么必须取消设置 MAKELEVEL 或将其设为零,例如:

    build-postgresql:
            $(MAKE) -C postgresql MAKELEVEL=0 all
    

    否则可能会出现奇怪的错误信息,通常是关于缺少头文件。

  3. 回归测试

    如果你希望在安装之前测试新构建的服务器,可以在此时运行回归测试。 回归测试是一套测试,用来验证 PostgreSQL 是否按开发者预期的方式在你的机器上运行。输入:

    make check
    

    (这不能以 root 身份运行;请使用非特权用户。) 关于如何解释测试结果的详细信息,见 Chapter 31。 在以后的任何时候,你都可以再次执行同样的命令来重复此测试。

  4. 安装文件

    Note

    如果你是在升级已有系统,请务必阅读 Section 18.6,其中包含关于升级集簇的说明。

    要安装 PostgreSQL,请输入:

    make install
    

    这会把文件安装到 Step 1 中指定的目录。 请确保你有权限写入该区域。通常这一步需要以 root 身份执行。 另一种做法是预先创建目标目录,并安排授予适当权限。

    要安装文档(HTML 和手册页),请输入:

    make install-docs
    

    如果你上面执行的是 world 构建,则改为输入:

    make install-world
    

    这也会安装文档。

    如果你上面执行的是不含文档的 world 构建,则改为输入:

    make install-world-bin
    

    你可以用 make install-strip 代替 make install,在安装时剥离可执行文件和库中的符号。 这会节省一些空间。如果你在构建时启用了调试支持,那么剥离操作实际上会移除调试支持, 因此只有在不再需要调试时才应该这样做。install-strip 会尽量合理地节省空间,但它并不知道如何从每个可执行文件中去掉所有不需要的字节, 所以如果你希望尽可能节省所有磁盘空间,仍需要手工处理。

    标准安装会提供客户端应用开发以及服务器端程序开发所需的全部头文件, 例如用 C 编写的自定义函数或数据类型。

    仅客户端安装:.  如果你只想安装客户端应用程序和接口库,可以使用以下命令:

    make -C src/bin install
    make -C src/include install
    make -C src/interfaces install
    make -C doc install
    

    src/bin 中有少量仅供服务器使用的二进制文件, 不过它们都很小。

卸载:.  要撤销安装,请使用命令 make uninstall。 不过,这不会删除任何已创建的目录。

清理:.  安装完成后,你可以使用命令 make clean 从源码树中删除构建产生的文件,以释放磁盘空间。 这会保留 configure 程序生成的文件, 以便你之后可以用 make 重新构建全部内容。 要把源码树重置到发布时的状态,请使用 make distclean。 如果你打算在同一个源码树中为多个平台构建,就必须为每个平台执行这一步并重新配置。 (另一种做法是为每个平台使用单独的构建树,这样源码树就不会被修改。)

如果你已经执行了一次构建,随后发现 configure 选项有误, 或者修改了任何会被 configure 检查的内容 (例如软件升级),那么在重新配置和重新构建之前先执行 make distclean 是一个好主意。否则,你对配置选项所做的更改 可能不会传播到所有需要它们的地方。

17.3.3. configure 选项 #

下面解释 configure 的命令行选项。 这个列表并不完整(可使用 ./configure --help 获取完整列表)。 此处未涉及的选项主要用于交叉编译等高级用例,并记录在标准的 Autoconf 文档中。

17.3.3.1. 安装位置 #

这些选项控制 make install 将文件安装到哪里。 对大多数情况来说,--prefix 选项就足够了。 如果你有特殊需求,可以使用本节中描述的其他选项定制安装子目录。 但请注意,更改不同子目录之间的相对位置可能会使安装变得不可重定位, 也就是安装后无法再移动。(mandoc 的位置不受这一限制影响。)对于可重定位安装,你可能希望使用后面介绍的 --disable-rpath 选项。

--prefix=PREFIX #

把所有文件安装到目录 PREFIX 下, 而不是 /usr/local/pgsql 下。实际文件会安装到 各个子目录中;不会有任何文件直接安装到 PREFIX 目录中。

--exec-prefix=EXEC-PREFIX #

你可以把与体系结构相关的文件安装到与 PREFIX 不同的前缀 EXEC-PREFIX 下。 这对于在多台主机之间共享与体系结构无关的文件很有用。 如果省略该选项,那么 EXEC-PREFIX 会被设为与 PREFIX 相同, 与体系结构相关和无关的文件都会安装到同一棵目录树下, 这通常正是你想要的。

--bindir=DIRECTORY #

指定可执行程序的目录。默认是 EXEC-PREFIX/bin, 通常也就是 /usr/local/pgsql/bin

--sysconfdir=DIRECTORY #

设置各种配置文件的目录,默认是 PREFIX/etc

--libdir=DIRECTORY #

设置安装库和动态可加载模块的位置。默认是 EXEC-PREFIX/lib

--includedir=DIRECTORY #

设置安装 C 和 C++ 头文件的目录。默认是 PREFIX/include

--datarootdir=DIRECTORY #

设置多种只读数据文件的根目录。这只会为后续某些选项设置默认值。 默认是 PREFIX/share

--datadir=DIRECTORY #

设置已安装程序使用的只读数据文件目录。默认是 DATAROOTDIR。 注意,这与数据库文件实际存放的位置无关。

--localedir=DIRECTORY #

设置安装区域设置数据的目录,尤其是消息翻译目录文件。 默认是 DATAROOTDIR/locale

--mandir=DIRECTORY #

PostgreSQL 附带的手册页将安装到这个目录下 各自对应的 manx 子目录中。默认是 DATAROOTDIR/man

--docdir=DIRECTORY #

设置安装文档文件(不包括 man 页)的根目录。 这只会为后续选项设置默认值。该选项的默认值是 DATAROOTDIR/doc/postgresql

--htmldir=DIRECTORY #

PostgreSQL 的 HTML 格式文档将安装到这个目录。 默认是 DATAROOTDIR

Note

为了能把 PostgreSQL 安装到共享安装位置 (例如 /usr/local/include),同时又不干扰系统其他部分的 名字空间,我们做了特别处理。首先,除非完整展开后的目录名已经包含字符串 postgrespgsql,否则会自动把字符串 /postgresql 追加到 datadirsysconfdirdocdir 上。例如,如果你选择 /usr/local 作为前缀,那么文档会安装到 /usr/local/doc/postgresql;但如果前缀是 /opt/postgres,那么它会安装到 /opt/postgres/doc。客户端接口的公共 C 头文件 会安装到 includedir 中,并且不会污染名字空间。 内部头文件和服务器头文件则会安装到 includedir 下的私有目录中。关于如何访问这些头文件,请参见各接口自己的文档。 最后,如果有需要,也会在 libdir 下创建私有子目录, 用于存放动态可加载模块。

17.3.3.2. PostgreSQL 特性 #

本节描述的选项可以启用构建各种默认情况下不会构建的 PostgreSQL 特性。它们中的大多数之所以默认关闭, 只是因为需要额外的软件,如 Section 17.1 所述。

--enable-nls[=LANGUAGES] #

启用本地语言支持(NLS),也就是以非英语语言显示程序消息的能力。 LANGUAGES 是可选的、以空格分隔的语言代码列表, 例如 --enable-nls='de fr'。 (你的列表与实际提供的翻译集合之间的交集会自动计算。) 如果你不指定列表,则会安装所有可用的翻译。

要使用这个选项,你需要一个 Gettext API 的实现。

--with-perl #

构建 PL/Perl 服务器端语言。

--with-python #

构建 PL/Python 服务器端语言。

--with-tcl #

构建 PL/Tcl 服务器端语言。

--with-tclconfig=DIRECTORY #

Tcl 会安装一个名为 tclConfig.sh 的文件, 其中包含构建与 Tcl 交互模块所需的配置信息。通常这个文件会在一个公认的位置 被自动找到,但如果你想使用不同版本的 Tcl,则可以指定查找 tclConfig.sh 的目录。

--with-llvm #

构建时支持基于 LLVMJIT 编译(见 Chapter 30)。 这要求已安装 LLVM 库。 当前 LLVM 的最低要求版本是 14。

llvm-config 将用于查找所需的编译选项。系统会在你的 PATH 中搜索 llvm-config。如果这样找不到你想要的程序,请使用 LLVM_CONFIG 指定正确的 llvm-config 路径。例如:

./configure ... --with-llvm LLVM_CONFIG='/path/to/llvm/bin/llvm-config'

LLVM 支持要求有兼容的 clang 编译器(必要时通过环境变量 CLANG 指定),以及可工作的 C++ 编译器 (必要时通过环境变量 CXX 指定)。

--with-lz4 #

构建时支持 LZ4 压缩。

--with-zstd #

构建时支持 Zstandard 压缩。

--with-ssl=LIBRARY #

构建时支持 SSL(加密)连接。 唯一支持的 LIBRARYopenssl, 它同时适用于 OpenSSLLibreSSL。这要求安装 OpenSSL 软件包。 configure 会检查所需的头文件和库, 以确认你的 OpenSSL 安装足够后才继续。

--with-openssl #

这是 --with-ssl=openssl 的过时等价写法。

--with-gssapi #

构建时支持 GSSAPI 认证。要使用 GSSAPI,必须安装 MIT Kerberos。 在很多系统上,GSSAPI 系统(MIT Kerberos 安装的一部分)并不位于默认搜索的路径 中(例如 /usr/include/usr/lib), 因此除了这个选项之外,你还必须使用 --with-includes--with-librariesconfigure 会检查所需的头文件和库,以确认你的 GSSAPI 安装足够后才继续。

--with-ldap #

构建时支持 LDAP 认证和连接参数查找(更多信息见 Section 32.18Section 20.10)。在 Unix 上,这要求安装 OpenLDAP 软件包。在 Windows 上,使用默认的 WinLDAP 库。configure 会检查所需的头文件和库,以确认你的 OpenLDAP 安装足够后才继续。

--with-pam #

构建时支持 PAM (可插拔认证模块)。

--with-bsd-auth #

构建时支持 BSD 认证。 (BSD 认证框架目前仅在 OpenBSD 上可用。)

--with-systemd #

构建时支持 systemd 服务通知。如果服务器是在 systemd 下启动, 这会改进集成;否则没有影响。更多信息见 Section 18.3。 要使用此选项,需要安装 libsystemd 及其相关头文件。

--with-bonjour #

构建时支持 Bonjour 自动服务发现。 这要求你的操作系统支持 Bonjour。 在 macOS 上推荐启用。

--with-uuid=LIBRARY #

构建 uuid-ossp 模块 (它提供生成 UUID 的函数),并使用指定的 UUID 库。 LIBRARY 必须是以下之一:

  • bsd,使用 FreeBSD 以及其他某些 BSD 衍生系统中的 UUID 函数

  • e2fs,使用 e2fsprogs 项目创建的 UUID 库; 该库存在于大多数 Linux 系统和 macOS 中,也可用于其他平台

  • ossp,使用 OSSP UUID library

--with-ossp-uuid #

这是 --with-uuid=ossp 的过时等价写法。

--with-libcurl #

构建时支持 libcurl,用于 OAuth 2.0 客户端流程。 此特性要求 libcurl 7.61.0 或更高版本。 使用该选项构建时,会检查所需的头文件和库,以确认你的 curl 安装足够后才继续。

--with-libnuma #

构建时支持 libnuma,用于基础 NUMA 支持。 仅在实现了 libnuma 库的平台上受支持。

--with-liburing #

构建时支持 liburing,以启用异步 I/O 的 io_uring 支持。

为了检测所需的编译器和链接器选项,PostgreSQL 会查询 pkg-config

如果 liburing 安装在不常见的位置,你可以设置与 pkg-config 相关的环境变量(见其文档)。

--with-libxml #

构建时支持 libxml2,以启用 SQL/XML 支持。 这一特性要求 libxml2 2.6.23 或更高版本。

为了检测所需的编译器和链接器选项,如果系统已安装 pkg-config 且知道 libxml2,PostgreSQL 会查询 pkg-config。否则,如果找得到由 libxml2 安装的 xml2-config 程序,就会使用它。 优先使用 pkg-config,因为它能更好地处理多架构安装。

如果 libxml2 安装在不常见的位置,你可以设置与 pkg-config 相关的环境变量(见其文档), 或把环境变量 XML2_CONFIG 设为指向该 libxml2 安装对应的 xml2-config 程序,或者设置变量 XML2_CFLAGSXML2_LIBS。 (如果安装了 pkg-config,那么要覆盖它对 libxml2 位置的判断,你必须设置 XML2_CONFIG, 或同时把 XML2_CFLAGSXML2_LIBS 设为非空字符串。)

--with-libxslt #

构建时支持 libxslt,以启用 xml2 模块对 XML 执行 XSL 转换。 同时还必须指定 --with-libxml

--with-selinux #

构建时支持 SElinux,以启用 sepgsql 扩展。

17.3.3.3. 反功能 #

本节描述的选项允许禁用某些默认会构建的 PostgreSQL 特性,但如果缺少所需的软件或系统功能, 可能需要关闭它们。除非确有必要,否则不建议使用这些选项。

--without-icu #

构建时不支持 ICU 库,从而禁用 ICU 排序规则特性(见 Section 23.2)。

--without-readline #

禁止使用 Readline 库(以及 libedit)。此选项会禁用 psql 中的命令行编辑和历史记录。

--with-libedit-preferred #

优先使用 BSD 许可的 libedit 库,而不是 GPL 许可的 Readline。只有在两个库都已安装时, 该选项才有意义;在那种情况下,默认行为是使用 Readline

--without-zlib #

禁止使用 Zlib 库。 这会禁用 pg_dumppg_restore 对压缩归档的支持。

17.3.3.4. 构建过程细节 #

--with-includes=DIRECTORIES #

DIRECTORIES 是一个以冒号分隔的目录列表, 这些目录会被加入编译器搜索头文件的路径中。 如果你把可选软件包(如 GNU Readline) 安装在非标准位置,就必须使用此选项,并且通常还要使用对应的 --with-libraries 选项。

例如:--with-includes=/opt/gnu/include:/usr/sup/include

--with-libraries=DIRECTORIES #

DIRECTORIES 是一个以冒号分隔的目录列表, 用于搜索库文件。如果你把软件包安装在非标准位置, 很可能需要使用这个选项(以及对应的 --with-includes)。

例如:--with-libraries=/opt/gnu/lib:/usr/sup/lib

--with-system-tzdata=DIRECTORY #

PostgreSQL 自带了日期和时间操作所需的时区数据库。 这个时区数据库实际上与很多操作系统(如 FreeBSD、Linux 和 Solaris) 提供的 IANA 时区数据库兼容,因此再次安装它是多余的。 使用此选项时,将使用位于 DIRECTORY 的 系统提供时区数据库,而不是 PostgreSQL 源码发布中自带的那一份。 DIRECTORY 必须是绝对路径。 在某些操作系统上,/usr/share/zoneinfo 是一个可能的目录。请注意,安装过程不会检测时区数据是否不匹配或有误。 如果你使用该选项,建议运行回归测试,以验证你指定的时区数据能够与 PostgreSQL 正常配合工作。

这个选项主要面向那些非常了解其目标操作系统的二进制包发布者。 使用该选项的主要优点是,当本地众多夏令时规则中的任何一条发生变化时, PostgreSQL 软件包都无需升级。另一个优点是,如果安装时不需要构建 时区数据库文件,那么 PostgreSQL 的交叉编译也会更直接。

--with-extra-version=STRING #

STRING 追加到 PostgreSQL 版本号后面。 例如,你可以用它给从未发布的 Git 快照构建出来的二进制文件、 或包含自定义补丁的二进制文件,添加额外版本字符串作为标记, 例如 git describe 标识符或发行包版本号。

--disable-rpath #

不在 PostgreSQL 的可执行文件中标记, 使其在运行时到安装的库目录中搜索共享库(见 --libdir)。 在大多数平台上,这种标记使用库目录的绝对路径,因此如果你之后移动安装位置, 它就没有帮助了。不过这样一来,你就需要通过其他方式让可执行文件找到共享库。 通常这要求配置操作系统的动态链接器搜索该库目录;更多细节见 Section 17.5.1

17.3.3.5. 杂项 #

调整默认端口号 --with-pgport 相当常见, 尤其是在测试性构建中。本节中的其他选项只推荐给高级用户。

--with-pgport=NUMBER #

NUMBER 设为服务器和客户端的默认端口号。 默认值是 5432。端口号以后始终都可以修改,但如果在这里指定, 那么服务器和客户端都会编译进同一个默认值,这可能很方便。 通常选择非默认值的唯一合理原因,是你打算在同一台机器上运行多个 PostgreSQL 服务器。

--with-krb-srvnam=NAME #

GSSAPI 所使用的 Kerberos 服务主体的默认名称。 默认是 postgres。通常没有理由修改它, 除非你是在为 Windows 环境构建,在那种情况下它必须被设为大写的 POSTGRES

--with-segsize=SEGSIZE #

设置 segment size,单位为 GB。 大表会被分成多个操作系统文件,每个文件的大小等于段大小。 这可以避免很多平台上的文件大小限制问题。默认段大小 1GB 在所有支持的平台上 都是安全的。如果你的操作系统支持 largefile (如今大多数都支持),你可以使用更大的段大小。 这有助于减少处理超大表时消耗的文件描述符数量。 但请注意不要选择超出你的平台和打算使用的文件系统所支持的值。 你可能想用到的其他工具,例如 tar, 也可能对可用文件大小施加限制。推荐(但不是绝对要求)把这个值设为 2 的幂。 请注意,修改此值会破坏磁盘上的数据库兼容性,也就是说, 你不能使用 pg_upgrade 升级到使用不同段大小构建的版本。

--with-blocksize=BLOCKSIZE #

设置 block size,单位为 KB。 这是表内部存储和 I/O 的单位。默认值 8KB 适合大多数场景, 但在特殊情况下,其他取值也可能有用。 该值必须是 1 到 32(KB)之间的 2 的幂。 请注意,修改此值会破坏磁盘上的数据库兼容性,也就是说, 你不能使用 pg_upgrade 升级到使用不同块大小构建的版本。

--with-wal-blocksize=BLOCKSIZE #

设置 WAL block size,单位为 KB。 这是 WAL 日志内部存储和 I/O 的单位。默认值 8KB 适合大多数场景, 但在特殊情况下,其他取值也可能有用。 该值必须是 1 到 64(KB)之间的 2 的幂。 请注意,修改此值会破坏磁盘上的数据库兼容性,也就是说, 你不能使用 pg_upgrade 升级到使用不同 WAL 块大小构建的版本。

17.3.3.6. 开发人员选项 #

本节中的大多数选项只对开发或调试 PostgreSQL 有意义。 除 --enable-debug 外,不建议在生产构建中使用它们; 不过,如果你不幸遇到 bug,该选项有助于获得更详细的 bug 报告。 在支持 DTrace 的平台上,--enable-dtrace 也可能适合在生产环境中使用。

如果构建的安装将用于开发服务器内部代码,建议至少启用 --enable-debug--enable-cassert

--enable-debug #

将所有程序和库编译为带调试符号的版本。这意味着你可以在调试器中运行程序, 以分析问题。这会显著增大安装后的可执行文件大小,而且在非 GCC 编译器上, 通常还会禁用编译器优化,从而导致变慢。不过,保留这些符号对于处理可能出现的 各种问题极其有帮助。目前,只有在你使用 GCC 的情况下,才建议在生产安装中使用 该选项。但如果你在做开发工作或运行测试版,就应始终启用它。

--enable-cassert #

在服务器中启用 assertion 检查,用于测试许多 不应该发生的条件。这对代码开发非常有价值,但这些测试会显著拖慢 服务器速度。此外,启用这些测试并不一定会增强服务器稳定性! 断言检查并未按严重程度分类,因此即使某个 bug 相对无害,只要触发了断言失败, 仍可能导致服务器重启。该选项不建议用于生产环境,但如果你在做开发工作 或运行测试版,就应当启用它。

--enable-tap-tests #

启用使用 Perl TAP 工具的测试。这要求安装 Perl 以及 Perl 模块 IPC::Run。更多信息见 Section 31.4

--enable-depend #

启用自动依赖跟踪。启用后,makefile 会在任何头文件被修改时, 重新构建所有受影响的目标文件。如果你在做开发工作,这很有用; 但如果你只是打算编译一次并安装,这只是额外的开销。 目前该选项只在 GCC 下有效。

--enable-coverage #

如果使用 GCC,所有程序和库都会带代码覆盖率测试插桩进行编译。 运行时,它们会在构建目录中生成包含代码覆盖率指标的文件。 更多信息见 Section 31.5。 该选项只适用于 GCC,并且仅在开发工作中使用。

--enable-profiling #

如果使用 GCC,所有程序和库都会被编译成可进行性能分析的形式。 后端退出时,会创建一个子目录,其中包含带有 profile 数据的 gmon.out 文件。 该选项只适用于 GCC,并且仅在开发工作中使用。

--enable-dtrace #

PostgreSQL 编译为支持动态跟踪工具 DTrace。 更多信息见 Section 27.5

如果要指向 dtrace 程序,可以设置环境变量 DTRACE。这通常是必要的,因为 dtrace 往往安装在 /usr/sbin 下,而该目录可能不在你的 PATH 中。

传给 dtrace 程序的额外命令行选项,可以通过环境变量 DTRACEFLAGS 指定。在 Solaris 上,要在 64 位二进制中包含 DTrace 支持,必须指定 DTRACEFLAGS="-64"。例如, 使用 GCC 编译器时:

./configure CC='gcc -m64' --enable-dtrace DTRACEFLAGS='-64' ...

使用 Sun 编译器时:

./configure CC='/opt/SUNWspro/bin/cc -xtarget=native64' --enable-dtrace DTRACEFLAGS='-64' ...
--enable-injection-points #

PostgreSQL 编译为支持服务器中的注入点。 注入点允许在预定义的代码路径中,从服务器内部运行用户定义的代码。 这有助于以受控方式测试并研究并发场景。该选项默认关闭。 更多细节见 Section 36.10.14。 该选项仅供开发人员测试使用。

--with-segsize-blocks=SEGSIZE_BLOCKS #

以块数指定关系段大小。如果同时指定了 --with-segsize 和这个选项,则以后者为准。 该选项仅供开发人员测试与段相关的代码。

17.3.4. configure 环境变量 #

除了上面介绍的常规命令行选项之外, configure 还会响应若干环境变量。 你可以直接在 configure 命令行上指定环境变量, 例如:

./configure CC=/opt/bin/gcc CFLAGS='-O2 -pipe'

在这种用法中,环境变量与命令行选项并没有太大区别。 你也可以预先设置这些变量:

export CC=/opt/bin/gcc
export CFLAGS='-O2 -pipe'
./configure

这种方式很方便,因为许多程序的配置脚本都会以类似方式响应这些变量。

这些环境变量中最常用的是 CCCFLAGS。 如果你希望使用与 configure 所选择的不同的 C 编译器, 可以把 CC 设置为你想用的程序。 默认情况下,如果可用,configure 会选择 gcc;否则选择平台默认编译器 (通常是 cc)。类似地,如果有需要, 你也可以用 CFLAGS 覆盖默认编译器标志。

下面列出可以按这种方式设置的重要变量:

BISON #

Bison 程序

CC #

C 编译器

CFLAGS #

传给 C 编译器的选项

CLANG #

在使用 --with-llvm 编译时, 用于处理源代码以内联的 clang 程序路径

CPP #

C 预处理器

CPPFLAGS #

传给 C 预处理器的选项

CXX #

C++ 编译器

CXXFLAGS #

传给 C++ 编译器的选项

DTRACE #

dtrace 程序的位置

DTRACEFLAGS #

传给 dtrace 程序的选项

FLEX #

Flex 程序

LDFLAGS #

用于链接可执行文件或共享库的选项

LDFLAGS_EX #

仅用于链接可执行文件的附加选项

LDFLAGS_SL #

仅用于链接共享库的附加选项

LLVM_CONFIG #

用于定位 LLVM 安装的 llvm-config 程序

MSGFMT #

用于本地语言支持的 msgfmt 程序

PERL #

Perl 解释器程序。它将用于确定构建 PL/Perl 所需的依赖。 默认值是 perl

PYTHON #

Python 解释器程序。它将用于确定构建 PL/Python 所需的依赖。 如果未设置,则会按以下顺序探测: python3 python

TCLSH #

Tcl 解释器程序。它将用于确定构建 PL/Tcl 所需的依赖。 如果未设置,则按以下顺序探测: tclsh tcl tclsh8.6 tclsh86 tclsh8.5 tclsh85 tclsh8.4 tclsh84

XML2_CONFIG #

用于定位 libxml2 安装的 xml2-config 程序

有时,在事后把额外的编译器标志加入到 configure 选定的那组选项中会很有用。 一个重要例子是,gcc-Werror 不能包含在传给 configureCFLAGS 中, 因为这会破坏 configure 的很多内置测试。 要添加这类标志,请在运行 make 时把它们放入环境变量 COPTCOPT 的内容会被附加到 configure 设置好的 CFLAGSCXXFLAGSLDFLAGS 上。例如,你可以这样做:

make COPT='-Werror'

或者:

export COPT='-Werror'
make

Note

如果使用 GCC,最好使用至少 -O1 的优化级别进行构建, 因为不使用优化(-O0)会关闭一些重要的编译器警告 (例如未初始化变量的使用)。不过,非零优化级别会让调试变得更复杂, 因为单步执行编译后的代码时,通常无法与源代码行一一对应。 如果你在调试优化后的代码时感到困惑,可以把感兴趣的特定文件用 -O0 重新编译。一个简单方法是向 make 传递选项: make PROFILE=-O0 file.o

COPTPROFILE 环境变量实际上会被 PostgreSQL 的 makefile 以完全相同的方式处理。 用哪个只是个人偏好问题,但开发者常见的习惯是把 PROFILE 用于一次性的标志调整,而 COPT 则可能长期保持设置。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。