导 读
从PostgreSQL 16开始,除了传统的./configure和Makefile,我们将可以选择使用现代构建系统Meson来构建PostgreSQL。
几周前,当我在为PostgreSQL开发社区补丁时,我开始练习meson,我被告知除了通常的Makefile之外,还需要更新meson.build文件。这也意味着,如果您正在做开发社区功能的工作时,你需要考虑meson。今天,我将分享如何在Ubuntu 18.04上使用meson构建PostgreSQL的方法,希望对您有所帮助。
01 Meson vs Makefile
Makefile
-
广泛使用、成熟和稳定。
-
Makefile语法是复杂的,编辑和维护起来很繁琐。对于非常大或复杂的项目,它可能变得难以管理。
Meson
-
语法简洁,易于理解和编写。
-
提供快速高效的编译过程,同时保持易用性和灵活性。
🔗Meson:https://mesonbuild.com/
02 安装
我们需要安装Meson和Ninja才能开始使用它。版本非常重要,使用过旧或过新的版本可能会导致在构建过程中出现错误。以下版本已经过确认可以正常工作(由我测试):
-
lmeson v0.57.2 (minimum meson version recommended by PostgreSQL), github download link-1
-
lninja v1.10.1, github downlad link-2
link-1:
https://github.com/mesonbuild/meson/releases/download/0.57.2/meson-0.57.2.tar.gz
link-2:
https://www.highgo.ca/2023/07/14/building-postgresql-in-a-modern-way-with-meson/
下载好它们后,您需要将它们添加到PATH环境变量中,并将ninja放在/usr/bin/ninja中,以便构建脚本可以找到它们。
我也尝试过将Meson v0.57.2与更新版本的Ninja一起使用,但在构建过程中遇到了错误,因此我不能保证不同版本组合的构建是否会正常工作。::>_<::
03 构建
Meson构建在PostgreSQL 16中可用,这个版本尚未正式发布,因此我们需要在主PG16开发分支上使用此功能。您可以在这里克隆官方的PostgreSQL源代码。
如果您之前已经运行过./configure和构建了PostgreSQL,则需要通过以下方式来撤销之前的操作。
$ make maintainer-clean
如果您想从头开始,可以执行以下步骤:
$ git clone https://github.com/postgres/postgres.git
现在,我们准备进行Meson构建。我们首先设置一个文件夹(在postgres文件夹内部),用于存储所有构建输出、日志、测试输出、配置等。
我们还可以在设置阶段传递特殊的构建参数。这些生成参数类似于传递给经典./configure脚本的参数。例如:
$ cd postgres
$ meson setup build --prefix=$PWD/highgo -Dcassert=true '-DPG_TEST_EXTRA=kerberos ldap' -Dbuildtype=debug
--prefix命令配置安装前缀,就像./configure一样。其余的可选构建参数通过-D参数名(无空格)传递给meson。
我们可以使用以下命令查看可能的参数列表及其描述:
$ meson configure
WARNING: The source directory instead of the build directory was specified.
WARNING: Only the default values for the project are printed, and all command line parameters are ignored.
Core properties:
Source dir /home/caryh/postgres
Main project options:
Core options Default Value Possible Values Description
------------ ------------- --------------- -----------
...
buildtype debugoptimized [plain, debug, debugoptimized, release, minsize, custom] Build type to use
...
cassert false [true, false] Enable assertion checks (for debugging)
...
PG_TEST_EXTRA Enable selected extra tests
...
... and many more
由于我们在构建文件夹外运行meson configure,因此它会向您发出警告,指出它仅打印构建的默认值和可能值。要查看当前值,我们需要在创建的文件夹中重新运行相同的命令。
$ cd build
$ meson configure
Core properties:
Source dir /home/caryh/postgres
Build dir /home/caryh/postgres/build
Main project options:
Core options Current Value Possible Values Description
------------ ------------- --------------- -----------
...
buildtype debug [plain, debug, debugoptimized, release, minsize, custom] Build type to use
...
cassert true [true, false] Enable assertion checks (for debugging)
...
PG_TEST_EXTRA kerberos ldap Enable selected extra tests
.... and many more
如果您需要更改任何构建参数,你也可以在构建文件夹内部进行更改,而不是像以前那样再次运行。
$ meson configure -Dcassert=false
当我们确定了构建参数后,我们可以通过在构建文件夹中运行以下命令来构建和安装:
$ ninja
$ sudo ninja install
就是这样!😁
04 运行测试套件
我们知道PostgreSQL源代码仓库中包含了许多测试用例,以确保软件正常工作。通常,我们会分别运行make check或make check-world来执行核心进程、扩展和前端工具的测试套件。在Meson中,所有这些都可以一次性运行。只需在构建文件夹内运行以下命令:
$ meson test
1/257 postgresql:setup / tmp_install OK 8.48s
2/257 postgresql:setup / install_test_files OK 0.06s
3/257 postgresql:pg_upgrade / pg_upgrade/001_basic OK 0.18s 8 subtests passed
4/257 postgresql:recovery / recovery/002_archiving OK 3.61s 8 subtests passed
5/257 postgresql:recovery / recovery/003_recovery_targets OK 6.73s 9 subtests passed
6/257 postgresql:recovery / recovery/004_timeline_switch OK 6.99s 3 subtests passed
7/257 postgresql:recovery / recovery/005_replay_delay OK 7.58s 3 subtests passed
8/257 postgresql:recovery / recovery/006_logical_decoding OK 4.78s 20 subtests passed
9/257 postgresql:recovery / recovery/001_stream_rep OK 10.34s 59 subtests passed
10/257 postgresql:recovery / recovery/007_sync_rep OK 6.20s 11 subtests passed
11/257 postgresql:recovery / recovery/010_logical_decoding_timelines OK 4.59s 13 subtests passed
12/257 postgresql:recovery / recovery/013_crash_restart OK 3.55s 18 subtests passed
13/257 postgresql:recovery / recovery/014_unlogged_reinit OK 3.72s 23 subtests passed
14/257 postgresql:recovery / recovery/012_subtransactions OK 6.63s 12 subtests passed
15/257 postgresql:recovery / recovery/009_twophase OK 11.63s 24 subtests passed
16/257 postgresql:recovery / recovery/016_min_consistency OK 4.34s 1 subtests passed
17/257 postgresql:recovery / recovery/015_promotion_pages OK 4.74s 1 subtests passed
18/257 postgresql:recovery / recovery/008_fsm_truncation OK 14.55s 1 subtests passed
19/257 postgresql:recovery / recovery/017_shm OK 5.23s 4 subtests passed
...
36/257 postgresql:kerberos / kerberos/001_auth ERROR 0.21s (exit status 255 or signal 127 SIGinvalid)
...
236/257 postgresql:ldap_password_func / ldap_password_func/001_mutated_bindpasswd ERROR 0.19s (exit status 255 or signal 127 SIGinvalid)
...
249/257 postgresql:ldap / ldap/001_auth ERROR 0.17s (exit status 255 or signal 127 SIGinvalid)
250/257 postgresql:ldap / ldap/002_bindpasswd ERROR 0.18s (exit status 255 or signal 127 SIGinvalid)
...
Ok: 251
Expected Fail: 0
Fail: 4
Unexpected Pass: 0
Skipped: 2
Timeout: 0
我有 4 个与 ldap 和 kerberos 相关的测试用例,因为我没有设置这些服务,所以失败是在预料之内的。我想更多地强调这些额外的测试用例,除非我们在 $PG_TEST_EXTRA 环境变量中指定它们,否则这些用例通常不会在传统设置中运行。在传统方式中,要运行额外的测试,如 ldap 和 kerberos,我们需要执行以下操作:
$ cd src/test/ldap
$ make check PG_TEST_EXTRA=ldap
or
$ cd src/test/kerberos
$ make check PG_TEST_EXTRA=kerberos
默认情况下不会运行这些测试,因为它们需要设置单独的服务或者运行不安全的服务。使用Meson,如果您需要运行这些额外的测试,除非你在构建选项中明确定义 -DPG_TEST_EXTRA 为构建选项之一,不然的话以下命令将不起作用。
$ export PG_TEST_EXTRA="ldap kerberos"
$ meson test
===> will skip ldap and kerberos tests if you did not do '-DPG_TEST_EXTRA=kerberos ldap' during meson setup
05 结论
🏆总体而言,Meson提供了一种现代,直观和高效的方法来构建软件项目。虽然 Makefile 仍然是一个广泛使用且功能强大的构建系统,但Meson为现代的开发工作流程提供了更简洁和用户友好的体验。