ryb 0.1.3.1 → 0.2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +36 -47
- data/NOTES +0 -0
- data/README.md +3 -1
- data/TODO +4 -0
- data/bin/ryb +2 -42
- data/lib/ryb.rb +31 -20
- data/lib/ryb/cli.rb +103 -0
- data/lib/ryb/code.rb +7 -0
- data/lib/ryb/configuration.rb +18 -12
- data/lib/ryb/configurations.rb +9 -0
- data/lib/ryb/dependencies.rb +7 -0
- data/lib/ryb/dependency.rb +30 -0
- data/lib/ryb/dsl.rb +280 -0
- data/lib/ryb/environment.rb +9 -0
- data/lib/ryb/flags.rb +17 -0
- data/lib/ryb/gem.rb +58 -0
- data/lib/ryb/helpers/defaults.rb +26 -0
- data/lib/ryb/helpers/pretty_string.rb +47 -0
- data/lib/ryb/languages.rb +13 -0
- data/lib/ryb/name.rb +3 -5
- data/lib/ryb/ninja.rb +257 -200
- data/lib/ryb/paths.rb +7 -0
- data/lib/ryb/preprocessor.rb +10 -0
- data/lib/ryb/product.rb +31 -0
- data/lib/ryb/project.rb +6 -29
- data/lib/ryb/source_file.rb +62 -0
- data/lib/ryb/visual_studio.rb +93 -57
- data/lib/rybfile.rb +30 -10
- data/lib/rybfile/walker.rb +202 -0
- data/lib/yb.rb +4 -0
- data/lib/ybfile.rb +3 -0
- data/ryb.gemspec +18 -13
- data/ryb.sublime-project +18 -17
- metadata +45 -31
- data/lib/ryb/application.rb +0 -24
- data/lib/ryb/architecture.rb +0 -16
- data/lib/ryb/architectures/x86.rb +0 -11
- data/lib/ryb/architectures/x86_64.rb +0 -11
- data/lib/ryb/library.rb +0 -29
- data/lib/ryb/properties.rb +0 -10
- data/lib/ryb/properties/architectures.rb +0 -32
- data/lib/ryb/properties/configurations.rb +0 -29
- data/lib/ryb/properties/defines.rb +0 -31
- data/lib/ryb/properties/dependencies.rb +0 -23
- data/lib/ryb/properties/files.rb +0 -25
- data/lib/ryb/properties/flags.rb +0 -33
- data/lib/ryb/properties/named.rb +0 -17
- data/lib/ryb/properties/paths.rb +0 -37
- data/lib/ryb/properties/suffix.rb +0 -17
- data/lib/ryb/properties/targets.rb +0 -36
- data/lib/ryb/target.rb +0 -16
- data/lib/ryb/targets/linux.rb +0 -11
- data/lib/ryb/targets/macosx.rb +0 -33
- data/lib/ryb/targets/windows.rb +0 -13
- data/lib/ryb/version.rb +0 -11
- data/lib/ryb/windows.rb +0 -40
- data/lib/ryb/xcode.rb +0 -145
data/lib/ryb/dsl.rb
ADDED
@@ -0,0 +1,280 @@
|
|
1
|
+
module Ryb
|
2
|
+
module DomainSpecificLanguage
|
3
|
+
module Configurations
|
4
|
+
def configuration(name, opts={}, &block)
|
5
|
+
@spec.configurations ||= []
|
6
|
+
|
7
|
+
existing_config = find_by_canonical_name(@spec.configurations, name)
|
8
|
+
config = existing_config || Ryb::Configuration.new
|
9
|
+
existing_pretty_name = config.name.pretty if existing_config
|
10
|
+
config.name = Ryb::Name.new(name, :pretty => existing_pretty_name || opts[:pretty])
|
11
|
+
|
12
|
+
@spec.configurations << config unless existing_config
|
13
|
+
|
14
|
+
DomainSpecificLanguage.for(config).instance_eval(&block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def platform(name, opts={}, &block)
|
18
|
+
# TODO(mtwilliams): Refactor this.
|
19
|
+
@spec.platforms ||= []
|
20
|
+
|
21
|
+
existing_platform = find_by_canonical_name(@spec.platforms, name)
|
22
|
+
platform = existing_platform || Ryb::Platform.new
|
23
|
+
existing_pretty_name = platform.name.pretty if existing_platform
|
24
|
+
platform.name ||= Ryb::Name.new(name, :pretty => existing_pretty_name || opts[:pretty])
|
25
|
+
|
26
|
+
@spec.platforms << platform unless existing_platform
|
27
|
+
|
28
|
+
DomainSpecificLanguage.for(platform).instance_eval(&block)
|
29
|
+
end
|
30
|
+
|
31
|
+
def architecture(name, opts={}, &block)
|
32
|
+
# TODO(mtwilliams): Refactor this.
|
33
|
+
@spec.architectures ||= []
|
34
|
+
|
35
|
+
existing_arch = find_by_canonical_name(@spec.architectures, name)
|
36
|
+
arch = existing_arch || Ryb::Architecture.new
|
37
|
+
existing_pretty_name = arch.name.pretty if existing_arch
|
38
|
+
arch.name ||= Ryb::Name.new(name, :pretty => existing_pretty_name || opts[:pretty])
|
39
|
+
|
40
|
+
@spec.architectures << arch unless existing_arch
|
41
|
+
|
42
|
+
DomainSpecificLanguage.for(arch).instance_eval(&block)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
def find_by_canonical_name(ary_of_named_things, name)
|
47
|
+
(ary_of_named_things.select do |existing_thing|
|
48
|
+
existing_thing.name.canonicalize == name.to_s
|
49
|
+
end).first
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
module Environment
|
54
|
+
def add_include_path(path)
|
55
|
+
@spec.paths ||= Paths.new
|
56
|
+
@spec.paths.includes = @spec.paths.includes + [path]
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_include_paths(*paths_and_patterns)
|
60
|
+
[*paths_and_patterns].each do |path_or_pattern|
|
61
|
+
[*(Dir.glob(path_or_pattern))].each do |path|
|
62
|
+
add_include_path(path)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_library_path(path)
|
68
|
+
@spec.paths ||= Paths.new
|
69
|
+
@spec.paths.libraries = @spec.paths.libraries + [path]
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_library_paths(*paths_and_patterns)
|
73
|
+
[*paths_and_patterns].each do |path_or_pattern|
|
74
|
+
[*(Dir.glob(path_or_pattern))].each do |path|
|
75
|
+
add_library_path(path)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def add_binary_path(path)
|
81
|
+
@spec.paths ||= Paths.new
|
82
|
+
@spec.paths.binaries = @spec.paths.binaries + [path]
|
83
|
+
end
|
84
|
+
|
85
|
+
def add_binary_paths(*paths_and_patterns)
|
86
|
+
[*paths_and_patterns].each do |path_or_pattern|
|
87
|
+
[*(Dir.glob(path_or_pattern))].each do |path|
|
88
|
+
add_binary_path(path)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
module Preprocessor
|
95
|
+
def define(defines)
|
96
|
+
@spec.defines ||= Hash.new
|
97
|
+
@spec.defines = @spec.defines.merge(defines)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
module Flags
|
102
|
+
def treat_warnings_as_errors=(flag)
|
103
|
+
@spec.treat_warnings_as_errors = flag
|
104
|
+
end
|
105
|
+
|
106
|
+
def generate_debug_symbols=(flag)
|
107
|
+
@spec.generate_debug_symbols = flag
|
108
|
+
end
|
109
|
+
|
110
|
+
def link_time_code_generation=(flag)
|
111
|
+
@spec.link_time_code_generation = flag
|
112
|
+
end
|
113
|
+
|
114
|
+
def optimize=(goal)
|
115
|
+
@spec.optimize = goal
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
module Code
|
120
|
+
def add_source_file(file)
|
121
|
+
case file
|
122
|
+
when SourceFile
|
123
|
+
@spec.sources ||= []
|
124
|
+
@spec.sources = @spec.sources + [file]
|
125
|
+
when String
|
126
|
+
add_source_file(SourceFile.new(file))
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def add_source_files(*files_and_patterns)
|
131
|
+
[*files_and_patterns].each do |file_or_pattern|
|
132
|
+
case file_or_pattern
|
133
|
+
when SourceFile
|
134
|
+
add_source_file(file_or_pattern)
|
135
|
+
when String
|
136
|
+
[*(Dir.glob(file_or_pattern))].each do |file|
|
137
|
+
add_source_file(file)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
module Dependencies
|
145
|
+
def add_dependency(product)
|
146
|
+
@spec.dependencies ||= []
|
147
|
+
@spec.dependencies = @spec.dependencies + [Ryb::InternalDependency.new(product)]
|
148
|
+
end
|
149
|
+
|
150
|
+
def add_external_dependency(lib_or_framework)
|
151
|
+
@spec.dependencies ||= []
|
152
|
+
@spec.dependencies = @spec.dependencies + [Ryb::ExternalDependency.new(lib_or_framework)]
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
class Configuration
|
157
|
+
def initialize(config)
|
158
|
+
@spec = @config = config
|
159
|
+
end
|
160
|
+
|
161
|
+
def prefix=(prefix)
|
162
|
+
@config.prefix = prefix
|
163
|
+
end
|
164
|
+
|
165
|
+
def suffix=(suffix)
|
166
|
+
@config.suffix = suffix
|
167
|
+
end
|
168
|
+
|
169
|
+
include Environment
|
170
|
+
include Preprocessor
|
171
|
+
include Flags
|
172
|
+
include Code
|
173
|
+
include Dependencies
|
174
|
+
end
|
175
|
+
|
176
|
+
class Platform < Configuration
|
177
|
+
def initialize(platform)
|
178
|
+
super(platform)
|
179
|
+
@platform = platform
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
class Architecture < Configuration
|
184
|
+
def initialize(arch)
|
185
|
+
super(arch)
|
186
|
+
@arch = arch
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
class Product
|
191
|
+
def initialize(product)
|
192
|
+
@spec = @product = product
|
193
|
+
end
|
194
|
+
|
195
|
+
def author=(author)
|
196
|
+
@product.author = author
|
197
|
+
end
|
198
|
+
|
199
|
+
def description=(description)
|
200
|
+
@product.description = description
|
201
|
+
end
|
202
|
+
|
203
|
+
def license=(license)
|
204
|
+
@product.license = license
|
205
|
+
end
|
206
|
+
|
207
|
+
def version=(version)
|
208
|
+
@product.version = version
|
209
|
+
end
|
210
|
+
|
211
|
+
include Configurations
|
212
|
+
include Environment
|
213
|
+
include Preprocessor
|
214
|
+
include Flags
|
215
|
+
include Code
|
216
|
+
include Dependencies
|
217
|
+
end
|
218
|
+
|
219
|
+
class Application < Product
|
220
|
+
def initialize(app)
|
221
|
+
super(app)
|
222
|
+
@app = app
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
class Library < Product
|
227
|
+
def initialize(lib)
|
228
|
+
super(lib)
|
229
|
+
@lib = lib
|
230
|
+
end
|
231
|
+
|
232
|
+
def linkage=(linkage)
|
233
|
+
@lib.linkage = linkage
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
class Project
|
238
|
+
def initialize(project)
|
239
|
+
@spec = @project = project
|
240
|
+
end
|
241
|
+
|
242
|
+
include Configurations
|
243
|
+
include Environment
|
244
|
+
include Preprocessor
|
245
|
+
|
246
|
+
def application(name, opts={}, &block)
|
247
|
+
# TODO(mtwilliams): Verify uniqueness.
|
248
|
+
app = Ryb::Application.new
|
249
|
+
app.name = Ryb::Name.new(name, :pretty => opts[:pretty])
|
250
|
+
DomainSpecificLanguage.for(app).instance_eval(&block)
|
251
|
+
@project.products ||= []
|
252
|
+
@project.products = @project.products + [app]
|
253
|
+
end
|
254
|
+
|
255
|
+
def library(name, opts={}, &block)
|
256
|
+
# TODO(mtwilliams): Verify uniqueness.
|
257
|
+
lib = Ryb::Library.new
|
258
|
+
lib.name = Ryb::Name.new(name, :pretty => opts[:pretty])
|
259
|
+
DomainSpecificLanguage.for(lib).instance_eval(&block)
|
260
|
+
@project.products ||= []
|
261
|
+
@project.products = @project.products + [lib]
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
FOR = {Ryb::Configuration => Configuration,
|
266
|
+
Ryb::Platform => Platform,
|
267
|
+
Ryb::Architecture => Architecture,
|
268
|
+
Ryb::Application => Application,
|
269
|
+
Ryb::Library => Library,
|
270
|
+
Ryb::Project => Project}
|
271
|
+
|
272
|
+
def self.for(obj)
|
273
|
+
# TODO(mtwilliams): Use `__poured__` rather than manually building?
|
274
|
+
# poured = spec.class_variable_get(:@@__poured__)
|
275
|
+
|
276
|
+
# Hide behind a SimpleDelegator so users don't play with our internals.
|
277
|
+
SimpleDelegator.new(FOR[obj.class].new(obj))
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
data/lib/ryb/flags.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Flags
|
3
|
+
include Pour::Pourable
|
4
|
+
|
5
|
+
# Prevent code that raises warnings from succesfully compiling.
|
6
|
+
property :treat_warnings_as_errors, Typespec.boolean
|
7
|
+
|
8
|
+
# Have the compiler generate debugging information.
|
9
|
+
property :generate_debug_symbols, Typespec.boolean
|
10
|
+
|
11
|
+
# Link (and optimize) code as late as possible.
|
12
|
+
property :link_time_code_generation, Typespec.boolean
|
13
|
+
|
14
|
+
# Optimize for size, or speed, or neither.
|
15
|
+
property :optimize, Typespec.enum[:nothing, :size, :speed]
|
16
|
+
end
|
17
|
+
end
|
data/lib/ryb/gem.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
module Ryb
|
4
|
+
module Gem
|
5
|
+
# The name of this Gem.
|
6
|
+
def self.name
|
7
|
+
"ryb"
|
8
|
+
end
|
9
|
+
|
10
|
+
# The name and email address of the primary author.
|
11
|
+
def self.author
|
12
|
+
self.authors.first
|
13
|
+
end
|
14
|
+
|
15
|
+
# The name and email addresses of all authors.
|
16
|
+
def self.authors
|
17
|
+
[["Michael Williams", "m.t.williams@live.com"]].map do |author|
|
18
|
+
name, email = author
|
19
|
+
OpenStruct.new(name: name, email: email)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# This Gem's homepage URL.
|
24
|
+
def self.homepage
|
25
|
+
"https://RubifiyYourBuild.com/"
|
26
|
+
end
|
27
|
+
|
28
|
+
# This Gem's URL.
|
29
|
+
def self.url
|
30
|
+
"https://rubygems.org/gems/#{self.name}"
|
31
|
+
end
|
32
|
+
|
33
|
+
# A short summary of this Gem.
|
34
|
+
def self.summary
|
35
|
+
"Rubifiy your builds!"
|
36
|
+
end
|
37
|
+
|
38
|
+
# A full description of this Gem.
|
39
|
+
def self.description
|
40
|
+
"Ryb is a clean and extensible Ruby library and tool that generates build files for Visual Studio, XCode, Make, and Ninja."
|
41
|
+
end
|
42
|
+
|
43
|
+
module VERSION #:nodoc:
|
44
|
+
MAJOR, MINOR, PATCH, PRE = [0, 2, 0, 2]
|
45
|
+
STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
|
46
|
+
end
|
47
|
+
|
48
|
+
# The semantic version of the this Gem.
|
49
|
+
def self.version
|
50
|
+
Gem::VERSION::STRING
|
51
|
+
end
|
52
|
+
|
53
|
+
# The license covering this Gem.
|
54
|
+
def self.license
|
55
|
+
"Public Domain"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Helpers
|
3
|
+
module Defaults
|
4
|
+
def self.targets
|
5
|
+
@@targets = begin
|
6
|
+
case RbConfig::CONFIG["host_os"]
|
7
|
+
when /mswin|windows|mingw|cygwin/i
|
8
|
+
['windows']
|
9
|
+
when /darwin/i
|
10
|
+
['macosx']
|
11
|
+
when /linux/i
|
12
|
+
['linux']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.toolchains
|
18
|
+
@@toolchains ||= {
|
19
|
+
'windows' => 'msvc',
|
20
|
+
'macosx' => 'clang+llvm',
|
21
|
+
'linux' => 'gcc'
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Helpers
|
3
|
+
class PrettyString < String
|
4
|
+
# @!attribute [r] pretty
|
5
|
+
# @return [String] A more readable description of the string.
|
6
|
+
attr_reader :pretty
|
7
|
+
|
8
|
+
# @param [Hash] opts Optional arguments.
|
9
|
+
# @param [String] str The string.
|
10
|
+
# @param opts [String] :pretty A more readable description of the string.
|
11
|
+
def initialize(str, opts={})
|
12
|
+
super(str.to_s)
|
13
|
+
@pretty = opts[:pretty] if opts.include? :pretty
|
14
|
+
end
|
15
|
+
|
16
|
+
# Perform the comparision on the non-pretty values of all derivatives
|
17
|
+
# of strings, i.e. coerce any stringy values into ::String before
|
18
|
+
# comparing.
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# greeting_1 = PrettyString.new('greeting', pretty: 'Eh!')
|
22
|
+
# greeting_2 = PrettyString.new('greeting', pretty: 'Aloha!')
|
23
|
+
# greeting_1 == greeting_2 #=> true
|
24
|
+
alias :eql? :==
|
25
|
+
def ==(other)
|
26
|
+
if other.is_a? String
|
27
|
+
self.to_s == other.to_s
|
28
|
+
else
|
29
|
+
super(other)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [String] A more readable description of the string.
|
34
|
+
#
|
35
|
+
# @example
|
36
|
+
# greeting = PrettyString.new("greeting", pretty: "How you doin'?") #=> "greeting"
|
37
|
+
# greeting.inspect #=> <Ryb::Helpers::PrettyString "greeting" @pretty: "How you doin'?">
|
38
|
+
def inspect
|
39
|
+
if self.pretty
|
40
|
+
"<#{self.class.to_s} \"#{self.to_s}\" @pretty: \"#{self.pretty}\">"
|
41
|
+
else
|
42
|
+
"<#{self.class.to_s} \"#{self.to_s}\">"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|