4步上手Meson:让PostgreSQL 16 构建更现代化!

导 读

从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为现代的开发工作流程提供了更简洁和用户友好的体验

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值