-
Notifications
You must be signed in to change notification settings - Fork 17
/
buildfile_dsl.rb
169 lines (151 loc) · 4.63 KB
/
buildfile_dsl.rb
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# ===========================================================================
# Project: Abbot - SproutCore Build Tools
# Copyright: ©2009 Apple Inc.
# portions copyright @2006-2009 Sprout Systems, Inc.
# and contributors
# ===========================================================================
module SC
class Buildfile
# This class allows us to memoize common computations
class Config < HashStruct
def target_names
@target_names ||= self[:target_types].keys
end
end
# Describe the domain-specific-language helpers supported by buildfiles.
# This is included as a mixin for the buildfile.
module Commands
# Declare a basic task.
#
# Example:
# task :clobber => [:clean] do
# rm_rf "html"
# end
#
def task(*args, &block)
define_task(::SC::Buildfile::Task, *args, &block)
end
# Replace an existing task instead of enhancing it.
#
# Example:
# replace_task :clobber => :clean do
# rm_rf 'javascript'
# end
#
def replace_task(*args, &block)
@is_redefining = true
begin
define_task(::SC::Buildfile::Task, *args, &block)
rescue Exception => e
@is_redefining = false
raise e
end
end
# Define a build task. A build task will not run if the destination
# file is newer than the source files.
#
def build_task(*args, &block)
define_task(::SC::Buildfile::BuildTask, *args, &block)
end
# Import the partial Rakefiles +fn+. Imported files are loaded _after_
# the current file is completely loaded. This allows the import statement
# to appear anywhere in the importing file, and yet allowing the imported
# files to depend on objects defined in the importing file.
#
# A common use of the import statement is to include files containing
# dependency declarations.
#
# Example:
# import ".depend", "my_rules"
#
def import(*args)
base_path = current_path.nil? ? nil : File.dirname(current_path)
args.each do |fn|
fn = File.expand_path(fn, base_path)
add_import(fn)
end
end
# Create a new rake namespace and use it for evaluating the given block.
# Returns a NameSpace object that can be used to lookup tasks defined in
# the namespace.
#
# E.g.
#
# ns = namespace "nested" do
# task :run
# end
# task_run = ns[:run] # find :run in the given namespace.
#
def namespace(name=nil, &block)
in_namespace(name, &block)
end
# Describe the next rake task.
#
# Example:
# desc "Run the Unit Tests"
# task :test => [:build]
# runtests
# end
#
def desc(description)
last_description = description
end
# Describe options on the next rake task.
#
# Example:
# options :log => :env|:name|:none
# task :test => [:build]
# runtests
# end
#
def task_options(opts)
last_task_options = opts
end
# Scope any config statements inside the passed block to the named mode.
# Normally if you call a config statement outside of a mode block, it will
# scope to all modes.
#
# Example:
# mode :debug do
# config :all, :combine_javascript => NO
#
def mode(build_mode, &block)
old_mode = current_mode
self.current_mode = build_mode.to_sym
yield if block_given?
self.current_mode = old_mode
return self
end
# Register the passed configuration settings scoped to a target. Optional
# pass a block to edit the config.
#
# Example:
# config :all, :url_root => "static"
# config :sproutcore do |c|
# c.url_root = "static"
# end
#
def config(config_name, opts = {}, &block)
opts = ::SC::Buildfile::Config.new(opts)
yield(opts) if block_given?
add_config config_name, opts
return self
end
# Register a proxy setting
#
# Example:
# proxy '/url', :to => 'localhost:3000'
#
def proxy(proxy_path, opts={})
add_proxy proxy_path, opts
end
# Register info about this buildfile as a project
def project(name=nil, type=nil)
self.project_name = name.nil? ? :default : name.to_sym
self.project_type = type.nil? ? :default : type.to_sym
self.project!
end
end
include Commands
end
end