summaryrefslogtreecommitdiff
path: root/libpkgconf/libpkgconf/buildfile
blob: a9b6e9c3e9dc2a3d2cea2f52af58431bb71d9a89 (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
# 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
{
  # The upstream package compiles the source files with -std=gnu99 option to
  # allow some GNU deviations from the ISO C99 standard. We will compile with
  # the -std=c99 option (via c.std=99 in root.build) and define
  # _POSIX_C_SOURCE=200809L for all as well as _GNU_SOURCE for some source
  # files (those that require GNU extension). These macros also re-enable
  # definitions of POSIX macros (specifically PATH_MAX) that are disabled by
  # -std=c99.
  #
  # Note that on FreeBSD and MacOS -D_POSIX_C_SOURCE disables declarations of
  # strlcpy() and alike which are not POSIX. Not very consistent given that
  # they are also not C99. Luckily, -std=c99 doesn't disable PATH_MAX on these
  # platforms, so we just don't define this macro for them.
  #
  if! ($bsd || $macos)
    c.poptions += -D_POSIX_C_SOURCE=200809L

  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