1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
# Copyright (c) 2022-2025, PostgreSQL Global Development Group
libpq_sources = files(
'fe-auth-oauth.c',
'fe-auth-scram.c',
'fe-auth.c',
'fe-cancel.c',
'fe-connect.c',
'fe-exec.c',
'fe-lobj.c',
'fe-misc.c',
'fe-print.c',
'fe-protocol3.c',
'fe-secure.c',
'fe-trace.c',
'legacy-pqsignal.c',
'libpq-events.c',
'pqexpbuffer.c',
)
libpq_so_sources = [] # for shared lib, in addition to the above
if host_system == 'windows'
libpq_sources += files('pthread-win32.c', 'win32.c')
libpq_so_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
'--NAME', 'libpq',
'--FILEDESC', 'PostgreSQL Access Library',])
endif
if ssl.found()
libpq_sources += files('fe-secure-common.c')
libpq_sources += files('fe-secure-openssl.c')
endif
if gssapi.found()
libpq_sources += files(
'fe-gssapi-common.c',
'fe-secure-gssapi.c',
)
endif
export_file = custom_target('libpq.exports',
kwargs: gen_export_kwargs,
)
# port needs to be in include path due to pthread-win32.h
libpq_inc = include_directories('.', '../../port')
libpq_c_args = ['-DSO_MAJOR_VERSION=5']
# The OAuth implementation differs depending on the type of library being built.
libpq_so_c_args = ['-DUSE_DYNAMIC_OAUTH']
# Not using both_libraries() here as
# 1) resource files should only be in the shared library
# 2) we want the .pc file to include a dependency to {pgport,common}_static for
# libpq_st, and {pgport,common}_shlib for libpq_sh
#
# We could try to avoid building the source files twice, but it probably adds
# more complexity than its worth (reusing object files requires also linking
# to the library on windows or breaks precompiled headers).
libpq_st = static_library('libpq',
libpq_sources,
include_directories: [libpq_inc],
c_args: libpq_c_args,
c_pch: pch_postgres_fe_h,
dependencies: [frontend_stlib_code, libpq_deps],
kwargs: default_lib_args,
)
libpq_so = shared_library('libpq',
libpq_sources + libpq_so_sources,
include_directories: [libpq_inc, postgres_inc],
c_args: libpq_c_args + libpq_so_c_args,
c_pch: pch_postgres_fe_h,
version: '5.' + pg_version_major.to_string(),
soversion: host_system != 'windows' ? '5' : '',
darwin_versions: ['5', '5.' + pg_version_major.to_string()],
dependencies: [frontend_shlib_code, libpq_deps],
link_depends: export_file,
link_args: export_fmt.format(export_file.full_path()),
kwargs: default_lib_args,
)
libpq = declare_dependency(
link_with: [libpq_so],
include_directories: [include_directories('.')]
)
private_deps = [
frontend_stlib_code,
libpq_deps,
]
if oauth_flow_supported
# libpq.so doesn't link against libcurl, but libpq.a needs libpq-oauth, and
# libpq-oauth needs libcurl. Put both into *.private.
private_deps += [
libpq_oauth_deps,
'-lpq-oauth',
]
endif
pkgconfig.generate(
name: 'libpq',
description: 'PostgreSQL libpq library',
url: pg_url,
libraries: libpq,
libraries_private: private_deps,
)
install_headers(
'libpq-fe.h',
'libpq-events.h',
)
install_headers(
'libpq-int.h',
'pqexpbuffer.h',
'fe-auth-sasl.h',
install_dir: dir_include_internal,
)
install_data('pg_service.conf.sample',
install_dir: dir_data,
)
subdir('test')
tests += {
'name': 'libpq',
'sd': meson.current_source_dir(),
'bd': meson.current_build_dir(),
'tap': {
'tests': [
't/001_uri.pl',
't/002_api.pl',
't/003_load_balance_host_list.pl',
't/004_load_balance_dns.pl',
't/005_negotiate_encryption.pl',
't/006_service.pl',
],
'env': {
'with_ssl': ssl_library,
'with_gssapi': gssapi.found() ? 'yes' : 'no',
'with_krb_srvnam': 'postgres',
},
'deps': libpq_test_deps,
},
}
subdir('po', if_found: libintl)
|