aboutsummaryrefslogtreecommitdiff
path: root/odb/buildfile
blob: 20f87187ef2b6a2b2bfc472b71e2a292bbf837bf (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
# file      : odb/buildfile
# license   : GNU GPL v3; see accompanying LICENSE file

define plugin: libs

plugin{*}:
{
  bin.lib.prefix = # No lib prefix.
  backlink = true  # Backlink in forwarded configs (next to exe).
}

# For now we use the .so extension everywhere except Windows (see
# plugin_path() in odb.cxx for details).
#
if ($cxx.target.class != 'windows')
  plugin{*}: extension = so

# By default install the plugin next to the driver.
#
# On Windows this is the only sane option where we want the plugin (odb.dll)
# to go into bin/ since failed that we won't be able to find libraries we
# depend on.
#
# On other platforms another option is to install into the GCC's plugin
# directory. This way the same driver can be used with multiple GCC versions
# and is something that distributions packagers sometimes want to do.
#
# So at some point we should also make it configurable, including support for
# installing into GCC's plugin directory.
#
# NOTE: see ODB_GCC_PLUGIN_DIR when adding this support.
#
plugin{*}: install = bin/

# Unless cross-compiling, pass the C++ compiler's recall path as the g++
# name. At some point we should also make it configurable.
#
# Note that we used to compare complete target triplets but that prooved too
# strict. For example, we may be running on x86_64-apple-darwin17.7.0 while
# the compiler is targeting x86_64-apple-darwin17.3.0.
#
if ($cxx.target.cpu    == $build.host.cpu && \
    $cxx.target.system == $build.host.system)
{
  gxx_name = $recall($cxx.path)
  gxx_name = $regex.replace($gxx_name, '\\', '\\\\') # Escape back slashes.
}
else
  gxx_name = g++

import libs  = libcutl%lib{cutl}
import libs += libstudxml%lib{studxml}

./: exe{odb} plugin{odb}

# We need to make driver depend on plugin but not link it so that when, for
# example, driver is imported, plugin is updated as well.
#
# We, however, don't want to install via the driver since the same driver
# build could be used with multiple plugin builds (e.g., for different GCC
# versions, which is something distribution packagers sometimes want to do).
# @@ For this we will have to wait for operation-specific values support.
#
exe{odb}: cxx{odb}
exe{odb}: libus{odb}: bin.whole = false
exe{odb}: plugin{odb}: include = adhoc

# Target metadata, see also --build2-metadata in odb.cxx.
#
# While ODB itself doesn't use any environment variables, it uses GCC
# underneath which does (see "Environment Variables Affecting GCC").
#
exe{odb}:
{
  export.metadata = 1 odb
  odb.name = [string] odb
  odb.version = [string] $version
  odb.checksum = [string] $version
  odb.environment = [strings] CPATH CPLUS_INCLUDE_PATH GCC_EXEC_PREFIX COMPILER_PATH
}

plugin{odb}: libus{odb}

switch $cxx.target.system
{
  # On Windows we have to link the import stub.
  #
  case 'mingw32'
    plugin{odb}: cxx.libs += $plugin_dir/cc1plus.exe.a

  # On Mac OS we have to allow undefined symbols.
  #
  case 'darwin'
    plugin{odb}: cxx.loptions += -undefined dynamic_lookup
}

libus{odb}: {hxx ixx txx cxx}{** -odb -options -pregenerated/**} $libs

# Build options.
#
cxx.poptions += "-I$plugin_dir/include" "-DODB_GXX_NAME=\"$gxx_name\""
cxx.poptions += -DODB_BUILD2 # @@ TMP while supporting other build systems.

## Consumption build ($develop == false).
#

# Use pregenerated versions in the consumption build.
#
libus{odb}: pregenerated/{hxx ixx cxx}{**}: include = (!$develop)

if! $develop
  cxx.poptions =+ "-I($src_base/pregenerated)" # Note: must come first.

# Distribute pregenerated versions only in the consumption build.
#
pregenerated/{hxx ixx cxx}{*}: dist = (!$develop)

#
##

## Development build ($develop == true).
#

libus{odb}: {hxx ixx cxx}{options}: include = $develop

if $develop
  import! [metadata] cli = cli%exe{cli}

# In the development build distribute regenerated {hxx ixx cxx}{options},
# remapping their locations to the paths of the pregenerated versions (which
# are only distributed in the consumption build; see above). This way we make
# sure that the distributed files are always up-to-date.
#
<{hxx ixx cxx}{options}>: cli{options} $cli
{
  dist = ($develop ? pregenerated/odb/ : false)

  # Symlink the generated code in src for convenience of development.
  #
  backlink = true
}
%
if $develop
{{
  options = --include-with-brackets --include-prefix odb --guard-prefix ODB  \
            --generate-file-scanner --generate-specifier --generate-modifier \
            --generate-description --suppress-undocumented                   \
            --cxx-prologue '#include <odb/option-parsers.hxx>'

  $cli $options -o $out_base $path($<[0])

  # If the result differs from the pregenerated version, copy it over.
  #
  if diff $src_base/pregenerated/odb/options.hxx $path($>[0]) >- && \
     diff $src_base/pregenerated/odb/options.ixx $path($>[1]) >- && \
     diff $src_base/pregenerated/odb/options.cxx $path($>[2]) >-
    exit
  end

  cp $path($>[0]) $src_base/pregenerated/odb/options.hxx
  cp $path($>[1]) $src_base/pregenerated/odb/options.ixx
  cp $path($>[2]) $src_base/pregenerated/odb/options.cxx
}}

#
##

# Pass the copyright notice extracted from the LICENSE file.
#
obj{odb}: cxx.poptions += -DODB_COPYRIGHT=\"$copyright\"

# Don't install any of the plugin's headers.
#
{hxx ixx txx}{*}: install = false