Add num_done counter to the pg_stat_checkpointer view.
[pgsql.git] / src / port / meson.build
blob1150966ab711ccd76695c66c72f3be39e9dbd617
1 # Copyright (c) 2022-2024, PostgreSQL Global Development Group
3 pgport_sources = [
4   'bsearch_arg.c',
5   'chklocale.c',
6   'inet_net_ntop.c',
7   'noblock.c',
8   'path.c',
9   'pg_bitutils.c',
10   'pg_strong_random.c',
11   'pgcheckdir.c',
12   'pgmkdirp.c',
13   'pgsleep.c',
14   'pgstrcasecmp.c',
15   'pgstrsignal.c',
16   'pqsignal.c',
17   'qsort.c',
18   'qsort_arg.c',
19   'quotes.c',
20   'snprintf.c',
21   'strerror.c',
22   'tar.c',
25 if host_system == 'windows'
26   pgport_sources += files(
27     'dirmod.c',
28     'kill.c',
29     'open.c',
30     'system.c',
31     'win32common.c',
32     'win32dlopen.c',
33     'win32env.c',
34     'win32error.c',
35     'win32fdatasync.c',
36     'win32fseek.c',
37     'win32gai_strerror.c',
38     'win32getrusage.c',
39     'win32link.c',
40     'win32ntdll.c',
41     'win32pread.c',
42     'win32pwrite.c',
43     'win32security.c',
44     'win32setlocale.c',
45     'win32stat.c',
46   )
47 elif host_system == 'cygwin'
48   pgport_sources += files(
49     'dirmod.c',
50   )
51 endif
53 if cc.get_id() == 'msvc'
54   pgport_sources += files(
55     'dirent.c',
56     'win32gettimeofday.c',
57   )
58 endif
60 # Replacement functionality to be built if corresponding configure symbol
61 # is false
62 replace_funcs_neg = [
63   ['explicit_bzero'],
64   ['getopt'],
65   ['getopt_long'],
66   ['getpeereid'],
67   ['inet_aton'],
68   ['mkdtemp'],
69   ['strlcat'],
70   ['strlcpy'],
71   ['strnlen'],
72   ['strsep'],
75 if host_system != 'windows'
76   replace_funcs_neg += [['pthread_barrier_wait']]
77 endif
79 # Replacement functionality to be built if corresponding configure symbol
80 # is true
81 replace_funcs_pos = [
82   # x86/x64
83   ['pg_crc32c_sse42', 'USE_SSE42_CRC32C'],
84   ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
85   ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
86   ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
87   ['pg_popcount_avx512', 'USE_AVX512_POPCNT_WITH_RUNTIME_CHECK', 'popcnt'],
88   ['pg_popcount_avx512_choose', 'USE_AVX512_POPCNT_WITH_RUNTIME_CHECK', 'xsave'],
90   # arm / aarch64
91   ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'],
92   ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
93   ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
94   ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
96   # loongarch
97   ['pg_crc32c_loongarch', 'USE_LOONGARCH_CRC32C'],
99   # generic fallback
100   ['pg_crc32c_sb8', 'USE_SLICING_BY_8_CRC32C'],
103 pgport_cflags = {'crc': cflags_crc, 'popcnt': cflags_popcnt, 'xsave': cflags_xsave}
104 pgport_sources_cflags = {'crc': [], 'popcnt': [], 'xsave': []}
106 foreach f : replace_funcs_neg
107   func = f.get(0)
108   varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
109   filename = '@0@.c'.format(func)
111   val = '@0@'.format(cdata.get(varname, 'false'))
112   if val == 'false' or val == '0'
113     pgport_sources += files(filename)
114   endif
115 endforeach
117 foreach f : replace_funcs_pos
118   func = f.get(0)
119   varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
120   filename = '@0@.c'.format(func)
122   val = '@0@'.format(cdata.get(varname, 'false'))
123   if val == 'true' or val == '1'
124     src = files(filename)
125     if f.length() > 2
126       pgport_sources_cflags += {f[2]: pgport_sources_cflags[f[2]] + src}
127     else
128       pgport_sources += src
129     endif
130   endif
131 endforeach
134 if (host_system == 'windows' or host_system == 'cygwin') and \
135   (cc.get_id() != 'msvc' or cc.version().version_compare('<14.0'))
137   # Cygwin and (apparently, based on test results) Mingw both
138   # have a broken strtof(), so substitute its implementation.
139   # That's not a perfect fix, since it doesn't avoid double-rounding,
140   # but we have no better options.
141   pgport_sources += files('strtof.c')
142   message('On @0@ with compiler @1@ @2@ we will use our strtof wrapper.'.format(
143     host_system, cc.get_id(), cc.version()))
144 endif
148 # Build pgport once for backend, once for use in frontend binaries, and once
149 # for use in shared libraries
150 pgport = {}
151 pgport_variants = {
152   '_srv': internal_lib_args + {
153     'dependencies': [backend_port_code],
154   },
155   '': default_lib_args + {
156     'dependencies': [frontend_port_code],
157   },
158   '_shlib': default_lib_args + {
159     'pic': true,
160     'dependencies': [frontend_port_code],
161   },
164 foreach name, opts : pgport_variants
166   # Build internal static libraries for sets of files that need to be built
167   # with different cflags
168   cflag_libs = []
169   foreach cflagname, sources : pgport_sources_cflags
170     if sources.length() == 0
171       continue
172     endif
173     c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
174     cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
175       sources,
176       c_pch: pch_c_h,
177       kwargs: opts + {
178         'c_args': c_args,
179         'build_by_default': false,
180         'install': false,
181       },
182     )
183   endforeach
185   lib = static_library('libpgport@0@'.format(name),
186       pgport_sources,
187       link_with: cflag_libs,
188       c_pch: pch_c_h,
189       kwargs: opts + {
190         'dependencies': opts['dependencies'] + [ssl],
191       }
192     )
193   pgport += {name: lib}
194 endforeach
196 pgport_srv = pgport['_srv']
197 pgport_static = pgport['']
198 pgport_shlib = pgport['_shlib']
200 # autoconf generates the file there, ensure we get a conflict
201 generated_sources_ac += {'src/port': ['pg_config_paths.h']}