aboutsummaryrefslogtreecommitdiff
path: root/buildfile
blob: ebbc594a3fe3008210a80ecc519bd3d860f38e23 (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
# file      : buildfile
# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
# license   : MIT; see accompanying LICENSE file

# We only do the static library since this is what we would have gotten should
# we have used headers (i.e., whatever object code generated from those headers
# would have ended up in each executable/library).
#
./: tests/ doc{INSTALL LICENSE NEWS README version} file{manifest}

doc{version}: file{manifest} # Generated by the version module.
doc{version}: dist = true

# Don't install tests or the INSTALL file.
#
dir{tests/}:     install = false
doc{INSTALL}@./: install = false

if! $cxx.features.modules
{
  # List sources as files so that we can prepare a distribution with any
  # compiler.
  #
  ./: {mxx cxx}{*}
}
else
{
  # We only do the static library since this is what we would have gotten
  # should we have used headers (i.e., whatever object code generated from
  # those headers would have ended up in each executable/library).
  #
  ./: liba{std-modules}

  # Building of the modules gets rather compiler-specific.
  #
  if ($cxx.id.type == 'clang')
  {
    # Use the naming scheme expected by -fprebuilt-module-path=. Can also be
    # specified with -fmodule-file=.
    #
    core = std.core.pcm
    io   = std.io.pcm
  }
  elif ($cxx.id.type == 'msvc')
  {
    # Use the naming scheme expected by /module:stdIfcDir. Note that IFCPATH
    # would require an extra directory (x64 or x86; e.g., x64/Release/).
    #
    # @@ Currently VC looks in Release regardless of /MD or /MDd.
    #
    dir  = Release/
    core = $dir/std.core.ifc
    io   = $dir/std.io.ifc

    bmia{$core $io}: fsdir{$dir}

    # VC expects to find std.lib next to the .ifc's. Make it a dummy one.
    #
    liba{std-modules}: $dir/liba{std}
    $dir/liba{std}: cxx{dummy.cxx}
  }

  # @@ TMP: use utility library instead?
  #
  if ($cxx.target.class == 'linux' || $cxx.target.class == 'bsd')
    cxx.coptions += -fPIC

  # Clang 5.0 with libc++ (sometimes) needs it -- go figure.
  #
  if ($cxx.target.class != "windows")
    cxx.libs += -lpthread

  liba{std-modules}: bmia{$core $io}

  bmia{$core}: mxx{std-core}
  bmia{$io}:   mxx{std-io} bmia{$core}

  mxx{std-core}@./: cc.module_name = std.core
  mxx{std-io}@./:   cc.module_name = std.io
}