4步上手Meson:让PostgreSQL 16 构建更现代化!
导 读 从PostgreSQL 16开始,除了传统的./configure和Makefile,我们将可以选择使用现代构建系统Meson来构建PostgreSQL。 几周前,当我在为PostgreSQL开发社区补丁时,我开始练习meson,我被告知除了通常的Makefile之外,还需要更新meson.build文件。这也意味着,如果您正在做开发社区功能的工作时,你需要考虑meson。今天,我将分享如何在Ubuntu 18.04上使用meson构建PostgreSQL的方法,希望对您有所帮助。 01Meson vs Makefile Makefile 广泛使用、成熟和稳定。 Makefile语法是复杂的,编辑和维护起来很繁琐。对于非常大或复杂的项目,它可能变得难以管理。 Meson 语法简洁,易于理解和编写。 提供快速高效的编译过程,同时保持易用性和灵活性。 🔗Meson:https://mesonbuild.com/ 02安装 我们需要安装Meson和Ninja才能开始使用它。版本非常重要,使用过旧或过新的版本可能会导致在构建过程中出现错误。以下版本已经过确认可以正常工作(由我测试): lmeson v0.57.2 (minimum meson version recommended by PostgreSQL), github downloadlink-1 lninja v1.10.1, github downladlink-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,则需要通过以下方式来撤销之前的操作。 $makemaintainer-clean 如果您想从头开始,可以执行以下步骤: $gitclonehttps://github.com/postgres/postgres.git 现在,我们准备进行Meson构建。我们首先设置一个文件夹(在postgres文件夹内部),用于存储所有构建输出、日志、测试输出、配置等。 我们还可以在设置阶段传递特殊的构建参数。这些生成参数类似于传递给经典./configure脚本的参数。例如: $cdpostgres $mesonsetupbuild--prefix=$PWD/highgo-Dcassert=true'-DPG_TEST_EXTRA=kerberosldap'-Dbuildtype=debug --prefix命令配置安装前缀,就像./configure一样。其余的可选构建参数通过-D参数名(无空格)传递给meson。 我们可以使用以下命令查看可能的参数列表及其描述: $mesonconfigure WARNING:Thesourcedirectoryinsteadofthebuilddirectorywasspecified. WARNING:Onlythedefaultvaluesfortheprojectareprinted,andallcommandlineparametersareignored. Coreproperties: Sourcedir/home/caryh/postgres Mainprojectoptions: CoreoptionsDefaultValuePossibleValuesDescription --------------------------------------------------- ... buildtypedebugoptimized[plain,debug,debugoptimized,release,minsize,custom]Buildtypetouse ... cassertfalse[true,false]Enableassertionchecks(fordebugging) ... PG_TEST_EXTRAEnableselectedextratests ... ...andmanymore 由于我们在构建文件夹外运行meson configure,因此它会向您发出警告,指出它仅打印构建的默认值和可能值。要查看当前值,我们需要在创建的文件夹中重新运行相同的命令。 $cdbuild $mesonconfigure Coreproperties: Sourcedir/home/caryh/postgres Builddir/home/caryh/postgres/build Mainprojectoptions: CoreoptionsCurrentValuePossibleValuesDescription --------------------------------------------------- ... buildtypedebug[plain,debug,debugoptimized,release,minsize,custom]Buildtypetouse ... casserttrue[true,false]Enableassertionchecks(fordebugging) ... PG_TEST_EXTRAkerberosldapEnableselectedextratests ....andmanymore 如果您需要更改任何构建参数,你也可以在构建文件夹内部进行更改,而不是像以前那样再次运行。 $mesonconfigure-Dcassert=false 当我们确定了构建参数后,我们可以通过在构建文件夹中运行以下命令来构建和安装: $ninja $sudoninjainstall 就是这样!😁 04运行测试套件 我们知道PostgreSQL源代码仓库中包含了许多测试用例,以确保软件正常工作。通常,我们会分别运行make check或make check-world来执行核心进程、扩展和前端工具的测试套件。在Meson中,所有这些都可以一次性运行。只需在构建文件夹内运行以下命令: $mesontest 1/257postgresql:setup/tmp_installOK8.48s 2/257postgresql:setup/install_test_filesOK0.06s 3/257postgresql:pg_upgrade/pg_upgrade/001_basicOK0.18s8subtestspassed 4/257postgresql:recovery/recovery/002_archivingOK3.61s8subtestspassed 5/257postgresql:recovery/recovery/003_recovery_targetsOK6.73s9subtestspassed 6/257postgresql:recovery/recovery/004_timeline_switchOK6.99s3subtestspassed 7/257postgresql:recovery/recovery/005_replay_delayOK7.58s3subtestspassed 8/257postgresql:recovery/recovery/006_logical_decodingOK4.78s20subtestspassed 9/257postgresql:recovery/recovery/001_stream_repOK10.34s59subtestspassed 10/257postgresql:recovery/recovery/007_sync_repOK6.20s11subtestspassed 11/257postgresql:recovery/recovery/010_logical_decoding_timelinesOK4.59s13subtestspassed 12/257postgresql:recovery/recovery/013_crash_restartOK3.55s18subtestspassed 13/257postgresql:recovery/recovery/014_unlogged_reinitOK3.72s23subtestspassed 14/257postgresql:recovery/recovery/012_subtransactionsOK6.63s12subtestspassed 15/257postgresql:recovery/recovery/009_twophaseOK11.63s24subtestspassed 16/257postgresql:recovery/recovery/016_min_consistencyOK4.34s1subtestspassed 17/257postgresql:recovery/recovery/015_promotion_pagesOK4.74s1subtestspassed 18/257postgresql:recovery/recovery/008_fsm_truncationOK14.55s1subtestspassed 19/257postgresql:recovery/recovery/017_shmOK5.23s4subtestspassed ... 36/257postgresql:kerberos/kerberos/001_authERROR0.21s(exitstatus255orsignal127SIGinvalid) ... 236/257postgresql:ldap_password_func/ldap_password_func/001_mutated_bindpasswdERROR0.19s(exitstatus255orsignal127SIGinvalid) ... 249/257postgresql:ldap/ldap/001_authERROR0.17s(exitstatus255orsignal127SIGinvalid) 250/257postgresql:ldap/ldap/002_bindpasswdERROR0.18s(exitstatus255orsignal127SIGinvalid) ... Ok:251 ExpectedFail:0 Fail:4 UnexpectedPass:0 Skipped:2 Timeout:0 我有 4个与 ldap 和 kerberos 相关的测试用例,因为我没有设置这些服务,所以失败是在预料之内的。我想更多地强调这些额外的测试用例,除非我们在$PG_TEST_EXTRA环境变量中指定它们,否则这些用例通常不会在传统设置中运行。在传统方式中,要运行额外的测试,如 ldap 和 kerberos,我们需要执行以下操作: $cdsrc/test/ldap $makecheckPG_TEST_EXTRA=ldap or $cdsrc/test/kerberos $makecheckPG_TEST_EXTRA=kerberos 默认情况下不会运行这些测试,因为它们需要设置单独的服务或者运行不安全的服务。使用Meson,如果您需要运行这些额外的测试,除非你在构建选项中明确定义-DPG_TEST_EXTRA为构建选项之一,不然的话以下命令将不起作用。 $exportPG_TEST_EXTRA="ldapkerberos" $mesontest ===>willskipldapandkerberostestsifyoudidnotdo'-DPG_TEST_EXTRA=kerberosldap'duringmesonsetup 05结论 🏆总体而言,Meson提供了一种现代,直观和高效的方法来构建软件项目。虽然 Makefile 仍然是一个广泛使用且功能强大的构建系统,但Meson为现代的开发工作流程提供了更简洁和用户友好的体验。