blob: 7bb8bb6c0adb9f798f7820200cf9e082f6aecfb3 (
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
|
// file : build/file.cxx -*- C++ -*-
// copyright : Copyright (c) 2014-2015 Code Synthesis Tools CC
// license : MIT; see accompanying LICENSE file
#include <build/file>
#include <fstream>
#include <build/scope>
#include <build/parser>
#include <build/filesystem>
#include <build/diagnostics>
using namespace std;
namespace build
{
void
source (const path& bf, scope& root, scope& base)
{
tracer trace ("source");
ifstream ifs (bf.string ());
if (!ifs.is_open ())
fail << "unable to open " << bf;
level4 ([&]{trace << "sourcing " << bf;});
ifs.exceptions (ifstream::failbit | ifstream::badbit);
parser p;
try
{
p.parse_buildfile (ifs, bf, root, base);
}
catch (const std::ios_base::failure&)
{
fail << "failed to read from " << bf;
}
}
void
source_once (const path& bf, scope& root, scope& base, scope& once)
{
tracer trace ("source_once");
if (!once.buildfiles.insert (bf).second)
{
level4 ([&]{trace << "skipping already sourced " << bf;});
return;
}
source (bf, root, base);
}
void
root_pre (scope& root)
{
tracer trace ("root_pre");
path bf (root.src_path () / path ("build/root.build"));
if (!file_exists (bf))
return;
source_once (bf, root, root);
}
}
|