diff options
Diffstat (limited to 'xsd/buildfile')
| -rw-r--r-- | xsd/buildfile | 121 | 
1 files changed, 121 insertions, 0 deletions
| diff --git a/xsd/buildfile b/xsd/buildfile new file mode 100644 index 0000000..d4e7af5 --- /dev/null +++ b/xsd/buildfile @@ -0,0 +1,121 @@ +# file      : xsd/buildfile +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +import libs  = libxsd-frontend%lib{xsd-frontend} +import libs += libcutl%lib{cutl} +import libs += libxerces-c%lib{xerces-c} + +ops = options cxx/options cxx/parser/options cxx/tree/options + +./: exe{xsd}: {hxx ixx txx cxx}{** -version -{$ops} -pregenerated/**} \ +              {hxx}{version}                                          \ +              $libs + +# Target metadata, see also --build2-metadata in xsd.cxx. +# +# Note that xsd does not query any environment variables. +# +exe{xsd}: +{ +  export.metadata = 1 xsd +  xsd.name = [string] xsd +  xsd.version  = [string] $version +  xsd.checksum = [string] $version +} + +hxx{version}: in{version} $src_root/manifest + +## Consumption build ($develop == false). +# + +# Use pregenerated versions in the consumption build. +# +exe{xsd}: 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). +# + +exe{xsd}: {hxx ixx cxx}{$ops}: 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. +# +for f: $ops +{ +  d = $directory($f) # empty, cxx/, etc. + +  <{hxx ixx cxx}{$f}>: cli{$f} +  { +    dist = ($develop ? $relative([dir_path] "pregenerated/xsd/$d", $d) : false) + +    # Symlink the generated code in src for convenience of development. +    # +    backlink = true +  } +} + +<hxx{~'/(.*)/'} ixx{~'/\1/'} cxx{~'/\1/'}>: cli{~'/\1/'} $cli +% +if $develop +{{ +  t = $path($>[0]).t + +  depdb dyndep --byproduct --file $t + +  h = $path($>[0]) +  i = $path($>[1]) +  c = $path($>[2]) + +  d = $directory($h) +  p = $string($leaf($d, $out_root)) # xsd, xsd/cxx, etc + +  options = --std c++11 -I $src_root --include-prefix $p              \ +            --guard-prefix $regex.replace($ucase($p), '[/\\]', '_')   \ +            --generate-specifier --generate-file-scanner              \ +            --suppress-undocumented --ostream-type ::std::wostream    \ +            --exclude-base --include-with-brackets --option-length 28 \ +            --cxx-prologue '#include <xsd/options-parser.hxx>' + +  $cli $options --generate-dep --dep-file $t -o $d $path($<[0]) + +  # If the result differs from the pregenerated version, copy it over. +  # +  d = [dir_path] $src_base/pregenerated/$p + +  dh = $d/$leaf($h) +  di = $d/$leaf($i) +  dc = $d/$leaf($c) + +  if diff $dh $h >- && \ +     diff $di $i >- && \ +     diff $dc $c >- +    exit +  end + +  cp $h $dh +  cp $i $di +  cp $c $dc +}} + +# +## + +# Pass the copyright notice extracted from the LICENSE file. +# +obj{xsd cxx/parser/generator cxx/tree/generator}: \ +  cxx.poptions += -DXSD_COPYRIGHT=\"$copyright\" | 
