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
|
/*
* Copyright (C) 2011-2012 Robert Ancell <robert.ancell@gmail.com>
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version. See http://www.gnu.org/copyleft/gpl.html the full text of the
* license.
*/
using Bake;
private class ReleaseRule : Rule
{
public HashTable<string, bool> file_table;
public HashTable<string, bool> directory_table;
public ReleaseRule (Recipe recipe, bool pretty_print)
{
base (recipe, pretty_print);
file_table = new HashTable<string, bool> (str_hash, str_equal);
directory_table = new HashTable<string, bool> (str_hash, str_equal);
}
public void add_release_file (string input_filename, string output_filename)
{
var dirname = Path.get_dirname (output_filename);
/* Generate directory if a new one */
if (!directory_table.contains (dirname))
{
add_command ("@mkdir -p %s".printf (dirname));
directory_table.insert (dirname, true);
}
if (!file_table.contains (input_filename))
{
add_input (input_filename);
add_command ("@cp %s %s".printf (input_filename, output_filename));
file_table.insert (input_filename, true);
}
}
}
class ReleaseModule : BuildModule
{
public override void generate_toplevel_rules (Recipe recipe)
{
var rule = new ReleaseRule (recipe, recipe.pretty_print);
recipe.rules.append (rule);
rule.add_output (recipe.release_directory);
}
private static void add_release_file (ReleaseRule release_rule, string temp_dir, string directory, string filename)
{
var input_filename = Path.build_filename (directory, filename);
var output_filename = Path.build_filename (temp_dir, directory, filename);
if (directory == ".")
{
input_filename = filename;
output_filename = Path.build_filename (temp_dir, filename);
}
release_rule.add_release_file (input_filename, output_filename);
}
public override void recipe_complete (Recipe recipe)
{
var relative_dirname = recipe.relative_dirname;
var release_dir = recipe.release_directory;
var release_rule = (ReleaseRule) recipe.toplevel.find_rule (release_dir);
var dirname = Path.build_filename (release_dir, relative_dirname);
if (relative_dirname == ".")
dirname = release_dir;
/* Add files that are used */
add_release_file (release_rule, release_dir, relative_dirname, "Recipe");
foreach (var rule in recipe.rules)
{
foreach (var input in rule.inputs)
{
/* Can't depend on ourselves */
if (input == release_dir)
continue;
/* Ignore virtual rules */
if (input.has_prefix ("%"))
continue;
/* Ignore built files */
if (recipe.get_rule_with_target (join_relative_dir (recipe.dirname, input)) != null)
continue;
add_release_file (release_rule, release_dir, relative_dirname, input);
}
}
}
}
|