summaryrefslogtreecommitdiff
path: root/libpkgconf/libpkgconf/buildfile
blob: c29bc53e637d8ff9e0e3dc363441ad409ddd5d90 (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
# file      : libpkgconf/buildfile
# copyright : Copyright (c) 2016-2019 Code Synthesis Ltd
# license   : ISC; see accompanying COPYING file

lib{pkgconf}: {h c}{* -config} {h}{config}

tclass = $c.target.class

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

msvc_runtime = ($c.target.system == 'win32-msvc')

msvc       = ($c.class == 'msvc')
clang_msvc = ($c.id == 'clang' && $msvc_runtime)

# Assign variables for the PKG_DEFAULT_PATH, SYSTEM_INCLUDEDIR, and
# SYSTEM_LIBDIR macro definitions. The whole idea feels utterly broken (hello
# cross-compilation) so we will just do bare minimum and wait and see.
#
# There is also PERSONALITY_PATH macro added in 1.5.1. It looks like the
# personality files are invented to fix cross-compilation but are unlikely to
# have any noticeable distribution yet. Normally these files are located in
# the personality.d/ subdirectory of the .pc files directory.
#
# @@ We should probably allow to configure these macros via configuration
#    variables config.pkgconfig.pkg_default_path and alike.
#
if! $windows
{
  inc_dirs = "/usr/include"
  lib_dirs = "/usr/lib"

  if ($install.root != [null])
  {
    def_dirs = "$install.resolve($install.pkgconfig)"
    personality_dirs = "$def_dirs/personality.d"
  }
  else
  {
    def_dirs = ""
    personality_dirs = ""
  }
}
else
{
  inc_dirs = ""
  lib_dirs = ""

  # Note that on Windows PKG_DEFAULT_PATH macros is internally redefined as
  # "../lib/pkgconfig;../share/pkgconfig" and is used as a fallback. Normally
  # the default path is relative to the program's (that link the library)
  # directory and has the following format:
  #
  # <dir>/../lib/pkgconfig;<dir>/../share/pkgconfig
  #
  # So we keep the macros empty.
  #
  def_dirs = ""
  personality_dirs = ""
}

# The config header is internal (is only included from C files), so we don't
# distribute nor install it (see below).
#
h{config}: in{config}
{
  PACKAGE_VERSION = "$version.project_id"

  # Escape backslashes and quotes in the directory paths prior to representing
  # them as C string literals.
  #
  SYSTEM_INCLUDEDIR = $regex.replace($inc_dirs, '(\\|")', '\\\1')
  SYSTEM_LIBDIR     = $regex.replace($lib_dirs, '(\\|")', '\\\1')
  PKG_DEFAULT_PATH  = $regex.replace($def_dirs, '(\\|")', '\\\1')
  PERSONALITY_PATH  = $regex.replace($personality_dirs, '(\\|")', '\\\1')
}

# Build options.
#
# Note that we have to add "-I$src_root" for the headers auto-generating
# machinery to work properly.
#
c.poptions =+ "-I$out_root" "-I$src_root"

# Disable warnings.
#
if $msvc
  c.coptions += /wd4996 /wd4267
elif $clang_msvc
  c.coptions += -Wno-deprecated-declarations -Wno-unused-function

# Note: this should go last as it adds obj target-specific poptions.
#
if! $windows
{
  # Upstream package compiles the source files with -std=gnu99 option to allow
  # some GNU deviations from the ISO C99 standard. We will compile with
  # -std=c9x option (is implied by c.std=99 in root.build) and define
  # _GNU_SOURCE for the source files that require such deviations. This macro
  # also re-enables definitions of POSIX macros (specifically PATH_MAX) that
  # are disabled by -std=c9x.
  #
  # Note that on FreeBSD and MacOS -D_POSIX_C_SOURCE disables declarations of
  # strndup(), strlcpy() and alike, that are not POSIX. Not very consistent
  # given that they are also not C99. Luckily, -std=c9x doesn't disable
  # PATH_MAX on these OSes, so we just don't define the macro for them.
  #
  # @@ It all becomes a bit hairy. Should we just undefine the corresponding
  #    HAVE_* macros in config.h, so the custom function implementations are
  #    picked up? Alternatively, can we stop specifying the C standard and
  #    defining _POSIX_C_SOURCE macro altogether?
  #
  if! ($bsd || $macos)
    c.poptions += -D_POSIX_C_SOURCE=200112L

  obj{client fragment path personality pkg queue tuple}: \
    c.poptions += -D_GNU_SOURCE
}
else
{
  # See libpkgconf-api.h for details.
  #
  objs{*}: c.poptions += -DLIBPKGCONF_EXPORT
  obja{*}: c.poptions += -DPKGCONFIG_IS_STATIC

  c.libs += ($msvc_runtime ? advapi32.lib : -ladvapi32)
}

# Export options.
#
lib{pkgconf}:  cc.export.poptions = "-I$src_root"
liba{pkgconf}: cc.export.poptions += -DPKGCONFIG_IS_STATIC

# See bootstrap.build for details.
#
if $version.pre_release
  lib{pkgconf}: bin.lib.version = @"-$version.project_id"
else
  lib{pkgconf}: bin.lib.version = @"-$release_num"

# Install into the pkgconf/libpkgconf/ subdirectory of, say, /usr/include/.
# Also make sure Cflags is properly set in .pc files to pkgconfig/.
#
h{*}: install = include/libpkgconf/
install.include = $install.include/pkgconf/

# Implementation details.
#
h{config}: install = false

for h: stdinc win-dirent
  h{$h}@./: install = false