aboutsummaryrefslogtreecommitdiff
path: root/odb/buildfile
blob: 8e931ad9b0aa7f3c7c0af1570062d3bd98bfbb2e (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
# 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.
#
exe{odb}:
{
  export.metadata = 1 odb
  odb.name = [string] odb
  odb.version  = $version
  odb.checksum = $version
}

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} {hxx ixx cxx}{options} $libs

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

# Pass the copyright notice extracted from the LICENSE file.
#
copyright = $process.run_regex(cat $src_root/LICENSE,    \
                               'Copyright \(c\) (.+)\.', \
                               '\1')

obj{odb}: cxx.poptions += -DODB_COPYRIGHT=\"$copyright\"

# Generated options parser.
#
# @@ TMP: currently generated code is committed to allow building from git.
#
if $cli.configured
{
  cli.cxx{options}: cli{options}

  cli.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.cxx{*}:
  {
    # Include the generated cli files into the distribution and don't remove
    # them when cleaning in src (so that clean results in a state identical to
    # distributed).
    #
    dist  = true
    clean = ($src_root != $out_root)

    # We keep the generated code in the repository so copy it back to src in
    # case of a forwarded configuration.
    #
    backlink = overwrite
  }
}

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