summaryrefslogtreecommitdiff
path: root/libpq/libpq/buildfile
blob: d77ccf74c39137636c2d5f36461433d42901e3a6 (plain)
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
# file      : libpq/buildfile
# copyright : Copyright (c) 2016-2019 Code Synthesis Ltd
# license   : PostgreSQL Licenes; see accompanying COPYRIGHT file

import imp_libs  = libssl%lib{ssl}
import imp_libs += libcrypto%lib{crypto}

# Exclude source code of unused features (authentication methods, etc).
#
# @@ When it becomes possible (probably with ad hoc rules), generate
#    libpqdll.map and libpqdll.def on the fly from pq/exports.txt applying
#    regex replace to its lines and adding prologue/epilogue.
#
lib{pq}: {h   }{*                                     -version} \
         {h   }{                                       version} \
      pq/{h  c}{* -fe-gssapi-common -fe-secure-gssapi -*win32*} \
      mb/{   c}{*                                             } \
    port/{h  c}{*    -strlcpy -getaddrinfo -inet_aton -*win32*} \
  common/{   c}{*                                             } \
 include/{h   }{**                                            } \
         {def }{libpqdll                                      } \
         {file}{libpqdll.map                                  } \
      pq/{file}{pg_service.conf.sample                        } \
         $imp_libs

tclass = $c.target.class
tsys   = $c.target.system

bsd     = ($tclass == 'bsd')
macos   = ($tclass == 'macos')
windows = ($tclass == 'windows')

lib{pq}: port/c{strlcpy}: include = (!$bsd && !$macos)

lib{pq}: pq/{h c}{*win32*                        }                     \
       port/{h c}{*win32* +getaddrinfo +inet_aton}: include = $windows

# The version file is an internal one (it is only included from pg_config.h)
# so we don't distribute nor install it (see below).
#
h{version}: in{version} $src_root/manifest

# Build options.
#
# Note that the upstream package also defines a bunch of the VAL_* macros
# (VAL_CONFIGURE, VAL_CC, etc) that are used in get_configdata(), if defined.
# We will omit them for the sake of simplicity.
#
c.poptions += -DFRONTEND -DUNSAFE_STAT_OK -DSO_MAJOR_VERSION=$abi_major

if! $windows
  # Note that the upstream package uses -pthread compiler/linker option. It is
  # currently unsupported by build2, so we use -D_REENTRANT and -lpthread
  # preprocessor/linker options instead. We also omit -D_THREAD_SAFE (synonym
  # for -D_REENTRANT) and Solaris-specific -D_POSIX_PTHREAD_SEMANTICS.
  #
  c.poptions += -D_REENTRANT
else
  # Note that the upstream package defines the WIN32 macro for VC only,
  # relying on the fact that MinGW GCC defines it by default. However, the
  # macro disappears from the default ones if to compile with -std=c9x (as we
  # do). So we define it for both VC and MinGW GCC.
  #
  # It's tempting to move this definition to libpq/pg_config.h. However this
  # header is not included into all files that use the macro, for example,
  # libpq/port/open.c.
  #
  c.poptions += -DWIN32

# Note that we need to add "-I$src_root" for the headers auto-generating
# machinery to work properly.
#
c.poptions =+ "-I$out_root" "-I$src_root" "-I$src_base" "-I$src_base/port" \
              "-I$src_base/pq" "-I$src_base/include"

switch $tclass, $tsys
{
  case 'linux'
    c.poptions += -D_GNU_SOURCE

  case 'windows', 'mingw32'
  {
    c.poptions += -DBUILDING_DLL -DEXEC_BACKEND
    c.poptions =+ "-I$src_base/include/port/win32"
  }
  case 'windows'
  {
    # Probably some of the *WIN* macro definitions are not really required,
    # but let's keep all of them for good measure.
    #
    c.poptions += -DEXEC_BACKEND -D_WINDLL -D__WINDOWS__ -D__WIN32__ -D_MBCS \
                  -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE

    c.poptions =+ "-I$src_base/include/port/win32_msvc" \
                  "-I$src_base/include/port/win32"
  }
}

# Define SYSCONFDIR macro. This path is used as a last resort for the
# pg_service.conf file search (see pq/fe-connect.c for details).
#
# The whole idea feels utterly broken (hello cross-compilation) so we will
# just do bare minimum and wait and see.
#
# @@ We should probably allow to configure this macros via configuration
#    variable config.libpq.sysconfdir.
#
# For the upstream package if the resulted sysconfdir path doesn't contain the
# 'postgres' or 'pgsql' substring then the '/postgresql' suffix is
# automatically appended (see the upstream INSTALL file for details). Note
# that the same rule is applied for the datadir and docdir paths. Also if the
# root directory is /usr, then the resulting sysconfdir path is
# /etc/postgresql (rather than /usr/etc/postgresql).
#
# Let's do the same for the sysconfdir to increase the chance that libpq will
# find the configuration file. Note that we don't install anything at this
# path and don't amend the install.data and install.doc path variables. We
# also use the same default path as the upstream package. Also note that on
# Windows the default path doesn't make any sense so let's make it empty
# instead.
#
if ($install.root != [null])
{
  root = $install.resolve($install.root)
  sysconfdir = ($windows || $root != /usr ? $root/etc : /etc)

  if! $regex.match("$sysconfdir", '.*(pgsql|postgresql).*')
    sysconfdir = $sysconfdir/postgresql
}
else
  sysconfdir = ($windows ? '' : /usr/local/pgsql/etc)

# Escape backslashes and quotes in the directory path prior to representing it
# as C string literals.
#
sd = $regex.replace($sysconfdir, '(\\|")', '\\\1')

# If we ever enable National Language Support then we will need to define the
# LOCALEDIR macro as well. It refers to the locale data directory and should
# be $install.data/locale by default. We will also need to install this
# directory (see configure script --enable-nls options and the libpq/po
# directory in the upstream package for details).
#
pq/obj{fe-connect}: c.poptions += -DSYSCONFDIR="\"$sd\""

switch $c.class
{
  case 'gcc'
  {
    # Omit -fexcess-precision=standard since -std=9x implies it.
    #
    c.coptions += -fno-strict-aliasing -fwrapv

    # Disable warnings that pop up with -Wall -Wextra. Upstream doesn't seem
    # to care about these and it is not easy to disable specific warnings in a
    # way that works across compilers/version (some -Wno-* options are only
    # recognized in newer versions).
    #
    c.coptions += -Wno-all -Wno-extra
  }
  case 'msvc'
  {
    c.coptions += /GF

    # Disable warnings that pop up with /W3.
    #
    c.coptions += /wd4018 /wd4244 /wd4267
  }
}

# On Windows the upstream package also adds the resource file to the library.
# The file contains only the version information. First, libpq.rc is produced
# from libpq.rc.in with the following command:
#
# sed -e 's/\(VERSION.*\),0 *$/\1,'`date '+%y%j' | \
# sed 's/^0*//'`'/' libpq.rc.in >libpq.rc
#
# Then libpq.rc is compiled with:
#
# windres -i libpq.rc -o libpqrc.o
#
# Afterwards libpqrc.o is linked to the library.
#
# @@ Currently we don't have support for the first two steps.
#
switch $tclass, $tsys
{
  case 'windows', 'mingw32'
    c.libs += -lsecur32 -lws2_32

  case 'windows'
    c.libs += secur32.lib ws2_32.lib advapi32.lib

  case 'linux' | 'bsd'
  {
    # Make sure all symbols are resolvable.
    #
    c.loptions += -Wl,--no-undefined

    c.loptions += "-Wl,--version-script=$src_base/libpqdll.map"

    c.libs += -lpthread
  }

  default
    c.libs += -lpthread
}

# Export options.
#
lib{pq}: cc.export.poptions = "-I$src_base" "-I$src_base/pq" \
                              "-I$src_base/include"

# See bootstrap.build for details.
#
if $version.pre_release
  lib{pq}: bin.lib.version = @"-$version.project_id"
else
  lib{pq}: bin.lib.version = @"-$abi_major" linux@"$abi_major.$abi_minor"

# Install the bare minimum of headers not recreating subdirectories.
#
# Note that upstream also installs several 'unofficial API' headers, that we
# won't install.
#
h{*}: install = false

for h: pq/{libpq-fe libpq-events} include/postgres_ext pg_config_ext
  h{$h}@./$path.directory($h): install = include/

# Install the config file example as the upstream does.
#
pq/file{pg_service.conf.sample}@pq/: install = data/