ryb 0.1.3.1 → 0.2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/paths.rb
ADDED
data/lib/ryb/product.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Ryb
|
2
|
+
class Product < Pour::Mould
|
3
|
+
property :name, Typespec.t[Ryb::Name]
|
4
|
+
|
5
|
+
property :author, Typespec.string
|
6
|
+
property :description, Typespec.string
|
7
|
+
property :license, Typespec.string
|
8
|
+
property :version, Typespec.string
|
9
|
+
|
10
|
+
# TODO(mtwilliams): Code signing.
|
11
|
+
# property :certificate, Typespec.struct[:public => Typespec.string,
|
12
|
+
# :private => Typespec.string]
|
13
|
+
|
14
|
+
pour Configurations
|
15
|
+
pour Environment
|
16
|
+
pour Preprocessor
|
17
|
+
pour Flags
|
18
|
+
|
19
|
+
pour Code
|
20
|
+
|
21
|
+
pour Dependencies
|
22
|
+
end
|
23
|
+
|
24
|
+
class Application < Product
|
25
|
+
end
|
26
|
+
|
27
|
+
class Library < Product
|
28
|
+
# Link at compile-time or load-time.
|
29
|
+
property :linkage, Typespec.enum[:static, :dynamic]
|
30
|
+
end
|
31
|
+
end
|
data/lib/ryb/project.rb
CHANGED
@@ -1,34 +1,11 @@
|
|
1
|
-
require 'ryb/name'
|
2
|
-
require 'ryb/properties'
|
3
|
-
|
4
|
-
require 'ryb/architecture'
|
5
|
-
require 'ryb/configuration'
|
6
|
-
require 'ryb/library'
|
7
|
-
require 'ryb/application'
|
8
|
-
|
9
1
|
module Ryb
|
10
|
-
class Project
|
11
|
-
|
12
|
-
include Properties::Defines
|
13
|
-
include Properties::Flags
|
14
|
-
include Properties::Paths
|
15
|
-
include Properties::Architectures
|
16
|
-
include Properties::Targets
|
17
|
-
include Properties::Configurations
|
18
|
-
|
19
|
-
def initialize(name, opts={})
|
20
|
-
@name = Name.new(name, opts[:pretty])
|
21
|
-
yield self if block_given?
|
22
|
-
end
|
2
|
+
class Project < Pour::Mould
|
3
|
+
property :name, Typespec.t[Ryb::Name]
|
23
4
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
5
|
+
pour Configurations
|
6
|
+
pour Environment
|
7
|
+
pour Preprocessor
|
28
8
|
|
29
|
-
|
30
|
-
def application(*args, &block)
|
31
|
-
self.applications << Application.new(*args, &block)
|
32
|
-
end
|
9
|
+
property :products, Typespec.array[Typespec.t[Ryb::Product]]
|
33
10
|
end
|
34
11
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Ryb
|
2
|
+
class SourceFile
|
3
|
+
attr_reader :path
|
4
|
+
attr_reader :language
|
5
|
+
attr_reader :inconsequential
|
6
|
+
|
7
|
+
def initialize(path, opts={})
|
8
|
+
@path = path
|
9
|
+
@language = opts[:language] || SourceFile.language_from_path(path)
|
10
|
+
@inconsequential = SourceFile.inconsequential?(@path)
|
11
|
+
|
12
|
+
# TODO(mtwilliams): Use Ryb::UnsupportedLanguage.
|
13
|
+
unless Ryb::Languages.supported?(@language)
|
14
|
+
raise "..." unless @inconsequential
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
alias :eql? :==
|
19
|
+
def ==(other)
|
20
|
+
self.path == other.path
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.c(path)
|
24
|
+
SourceFile.new(path, :language => :c)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.cpp(path)
|
28
|
+
SourceFile.new(path, :language => :cpp)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.csharp(path)
|
32
|
+
SourceFile.new(path, :language => :csharp)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.language_from_path(path)
|
36
|
+
if ext = File.extname(path)[1..-1]
|
37
|
+
self.language_from_extension(ext)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
EXTENSIONS_TO_LANGUAGE = {%w{h} => :c,
|
42
|
+
%w{c} => :c,
|
43
|
+
%w{hh hpp hxx h++} => :cpp,
|
44
|
+
%w{cc cpp cxx c++} => :cpp,
|
45
|
+
%w{cs} => :csharp}
|
46
|
+
|
47
|
+
def self.language_from_extension(ext)
|
48
|
+
EXTENSIONS_TO_LANGUAGE.each do |extensions, language|
|
49
|
+
return language if extensions.include?(ext)
|
50
|
+
end
|
51
|
+
:unknown
|
52
|
+
end
|
53
|
+
|
54
|
+
INCONSEQUENTIAL = %w{h hpp hxx h++ inl}
|
55
|
+
|
56
|
+
def self.inconsequential?(path)
|
57
|
+
if ext = File.extname(path)[1..-1]
|
58
|
+
INCONSEQUENTIAL.include? ext
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/ryb/visual_studio.rb
CHANGED
@@ -1,68 +1,104 @@
|
|
1
1
|
module Ryb
|
2
2
|
module VisualStudio
|
3
|
-
|
4
|
-
[
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\10.0\\Setup\\VC",
|
17
|
-
"SOFTWARE\\Microsoft\\VCExpress\\10.0\\Setup\\VC",
|
18
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\9.0\\Setup\\VC",
|
19
|
-
"SOFTWARE\\Microsoft\\VisualStudio\\9.0\\Setup\\VC",
|
20
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\9.0\\Setup\\VC",
|
21
|
-
"SOFTWARE\\Microsoft\\VCExpress\\9.0\\Setup\\VC",
|
22
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\8.0\\Setup\\VC",
|
23
|
-
"SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC",
|
24
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\8.0\\Setup\\VC",
|
25
|
-
"SOFTWARE\\Microsoft\\VCExpress\\8.0\\Setup\\VC",
|
26
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\7.1\\Setup\\VC",
|
27
|
-
"SOFTWARE\\Microsoft\\VisualStudio\\7.1\\Setup\\VC",
|
28
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\7.1\\Setup\\VC",
|
29
|
-
"SOFTWARE\\Microsoft\\VCExpress\\7.1\\Setup\\VC",
|
30
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\7.0\\Setup\\VC",
|
31
|
-
"SOFTWARE\\Microsoft\\VisualStudio\\7.0\\Setup\\VC",
|
32
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\7.0\\Setup\\VC",
|
33
|
-
"SOFTWARE\\Microsoft\\VCExpress\\7.0\\Setup\\VC",
|
34
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\6.0\\Setup\\VC",
|
35
|
-
"SOFTWARE\\Microsoft\\VisualStudio\\6.0\\Setup\\VC",
|
36
|
-
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\6.0\\Setup\\VC",
|
37
|
-
"SOFTWARE\\Microsoft\\VCExpress\\6.0\\Setup\\VC"]
|
3
|
+
module Compiler
|
4
|
+
STANDARD_FLAGS = [
|
5
|
+
# Suppress the annoying startup banner.
|
6
|
+
"/nologo",
|
7
|
+
# Don't link after compilation.
|
8
|
+
"/c",
|
9
|
+
# Be vocal about shit code.
|
10
|
+
"/W4",
|
11
|
+
# Fuck off, RTTI.
|
12
|
+
"/GR-",
|
13
|
+
# Don't optimize for one architecture at the loss of another.
|
14
|
+
"/favor:blend"
|
15
|
+
]
|
38
16
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
17
|
+
def self.include_paths_to_flags(paths)
|
18
|
+
[*paths].map{|path| "/I\"#{path}\""}
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.defines_to_flags(defines)
|
22
|
+
return [] unless defines
|
23
|
+
(defines.map do |name, value|
|
24
|
+
case value
|
25
|
+
when TrueClass
|
26
|
+
"/D#{name}=1"
|
27
|
+
when FalseClass
|
28
|
+
"/D#{name}=0"
|
29
|
+
when Integer
|
30
|
+
"/D#{name}=#{value}"
|
31
|
+
when String
|
32
|
+
"/D#{name}=#{value.to_s}"
|
33
|
+
else
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
end).compact
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.treat_warnings_as_errors_to_flag(enabled)
|
40
|
+
enabled ? %w{/WX} : []
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.generate_debug_symbols_to_flag(enabled)
|
44
|
+
# HACK(mtwilliams): Force writes to PDBs to be serialized.
|
45
|
+
# Refer to https://msdn.microsoft.com/en-us/library/dn502518.aspx.
|
46
|
+
enabled ? %w{/MDd /Zi /FS} : %w{/MD}
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.link_time_code_generation_to_flag(enabled)
|
50
|
+
enabled ? %w{/WX} : []
|
47
51
|
end
|
48
|
-
end
|
49
52
|
|
50
|
-
|
51
|
-
|
53
|
+
def self.optimization_to_flags(optimization)
|
54
|
+
case
|
55
|
+
when :nothing
|
56
|
+
%w{/Od /RTCsu /fp:precise /fp:except}
|
57
|
+
when :size
|
58
|
+
%w{/Os /fp:fast /fp:except-}
|
59
|
+
when :speed
|
60
|
+
%w{/Ox /fp:fast /fp:except-}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.architecture_to_flags(architecture)
|
65
|
+
case architecture
|
66
|
+
when :x86
|
67
|
+
%w{/arch:IA32}
|
68
|
+
when :x86_64
|
69
|
+
# TODO(mtwilliams): Determine if we can specify a minimum of SSE2?
|
70
|
+
[]
|
71
|
+
else
|
72
|
+
[]
|
73
|
+
end
|
74
|
+
end
|
52
75
|
end
|
53
76
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
77
|
+
module Linker
|
78
|
+
STANDARD_FLAGS = [
|
79
|
+
# Suppress the annoying startup banner.
|
80
|
+
"/nologo",
|
81
|
+
# Don't create or embed a manifest file.
|
82
|
+
"/manifest:no"
|
83
|
+
]
|
84
|
+
|
85
|
+
def self.library_paths_to_flags(paths)
|
86
|
+
[*paths].map{|path| "/LIBPATH:\"#{path}\""}
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.generate_debug_symbols_to_flag(enabled)
|
90
|
+
enabled ? %w{/DEBUG} : %w{}
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.architecture_to_flags(architecture)
|
94
|
+
case architecture
|
95
|
+
when :x86
|
96
|
+
%w{/machine:X86}
|
97
|
+
when :x86_64
|
98
|
+
%w{/machine:X64}
|
99
|
+
end
|
65
100
|
end
|
66
101
|
end
|
67
102
|
end
|
68
103
|
end
|
104
|
+
|
data/lib/rybfile.rb
CHANGED
@@ -1,15 +1,35 @@
|
|
1
1
|
require 'ryb'
|
2
|
-
require 'ostruct'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
class Rybfile < Pour::Mould
|
4
|
+
property :project, Typespec.t[Ryb::Project]
|
5
|
+
|
6
|
+
class DomainSpecificLanguage
|
7
|
+
def initialize(rybfile)
|
8
|
+
@rybfile = rybfile
|
9
|
+
end
|
10
|
+
|
11
|
+
def project(name, opts={}, &block)
|
12
|
+
# TODO(mtwilliams): Allow multiple projects?
|
13
|
+
# TODO(mtwilliams): Allow other Rybfiles to be 'included'.
|
14
|
+
@rybfile.project = Ryb::Project.new
|
15
|
+
@rybfile.project.name = Ryb::Name.new(name, :pretty => opts[:pretty])
|
16
|
+
|
17
|
+
Ryb::DomainSpecificLanguage.for(@rybfile.project).instance_eval(&block)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.for(rybfile)
|
21
|
+
# Hide behind a SimpleDelegator so users don't play with our internals.
|
22
|
+
SimpleDelegator.new(self.new(rybfile))
|
13
23
|
end
|
14
24
|
end
|
25
|
+
|
26
|
+
def self.load(path)
|
27
|
+
rybfile = Rybfile.new
|
28
|
+
|
29
|
+
# TODO(mtwilliams): Rewrite exceptions from Typespec/Pour into Ryb and attach
|
30
|
+
# source information (the file and line number from the responsible Rybfile.)
|
31
|
+
DomainSpecificLanguage.for(rybfile).instance_eval(File.read(path), path)
|
32
|
+
|
33
|
+
rybfile
|
34
|
+
end
|
15
35
|
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
require 'ryb'
|
2
|
+
require 'rybfile'
|
3
|
+
|
4
|
+
class Rybfile
|
5
|
+
class Walker
|
6
|
+
def initialize(vistor, rybfile, opts)
|
7
|
+
@vistor = vistor
|
8
|
+
@rybfile = rybfile
|
9
|
+
@root = opts.fetch(:root, '.')
|
10
|
+
@build = opts.fetch(:build, '_build')
|
11
|
+
# HACK(mtwilliams): Assume debug, development, and release builds are standard.
|
12
|
+
@configurations = opts.fetch(:configurations, %w{debug development release})
|
13
|
+
@platforms = opts.fetch(:platforms, Ryb::Helpers::Defaults.targets)
|
14
|
+
# HACK(mtwilliams): Assume x86 and x86_64 architectures are standard.
|
15
|
+
@architectures = opts.fetch(:architectures, %w{x86 x86_64})
|
16
|
+
end
|
17
|
+
|
18
|
+
def walk
|
19
|
+
# TODO(mtwilliams): Walk in two steps. The first builds an internal hash
|
20
|
+
# of projects and their products that is a deferred copy of this code and
|
21
|
+
# caches the results. Then iterate over this tree, passing the the lazy
|
22
|
+
# evaluation Proc and let users evalute them. This will cascade when
|
23
|
+
# doing dependency resolution (hitting cached versions along the way),
|
24
|
+
# thus allowing generators for build systems like Visual Studio, that
|
25
|
+
# don't allow us to defer dependency resolution inside, them to be written
|
26
|
+
# without much fuss (i.e. write linearly but execute depth-first.)
|
27
|
+
|
28
|
+
on_project(@rybfile.project)
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_project(project)
|
32
|
+
@vistor.on_project(project)
|
33
|
+
|
34
|
+
project.products.each {|product| on_product(project, product)}
|
35
|
+
|
36
|
+
builds = to_applicable_build_matrix(
|
37
|
+
to_canonical_names(project.configurations),
|
38
|
+
to_canonical_names(project.platforms),
|
39
|
+
to_canonical_names(project.architectures))
|
40
|
+
|
41
|
+
builds.each do |config, platform, arch|
|
42
|
+
on_project_triplet(project, [config, platform, arch])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def on_product(project, product)
|
47
|
+
@vistor.on_product(project, product)
|
48
|
+
|
49
|
+
builds = to_applicable_build_matrix(
|
50
|
+
to_canonical_names(project.configurations) | to_canonical_names(product.configurations),
|
51
|
+
to_canonical_names(project.platforms) | to_canonical_names(product.platforms),
|
52
|
+
to_canonical_names(project.architectures) | to_canonical_names(product.architectures))
|
53
|
+
|
54
|
+
builds.each do |config, platform, arch|
|
55
|
+
on_product_triplet(project, product, [config, platform, arch])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def on_project_triplet(project, triplet)
|
60
|
+
# TODO(mtwilliams): Extract into a helper function.
|
61
|
+
config, platform, arch = *triplet
|
62
|
+
config = find_by_canonical_name(project.configurations, config)
|
63
|
+
platform = find_by_canonical_name(project.platforms, platform)
|
64
|
+
arch = find_by_canonical_name(project.architectures, arch)
|
65
|
+
|
66
|
+
tripletised = lambda {
|
67
|
+
Hashie::Mash.new({
|
68
|
+
:configuration => config,
|
69
|
+
:platform => platform,
|
70
|
+
:architecture => arch,
|
71
|
+
:triplet => triplet
|
72
|
+
})
|
73
|
+
}
|
74
|
+
|
75
|
+
@vistor.on_project_triplet(project, tripletised)
|
76
|
+
end
|
77
|
+
|
78
|
+
def on_product_triplet(project, product, triplet)
|
79
|
+
# TODO(mtwilliams): Extract into a helper function.
|
80
|
+
config, platform, arch = *triplet
|
81
|
+
project_config = find_by_canonical_name(project.configurations, config)
|
82
|
+
project_platform = find_by_canonical_name(project.platforms, platform)
|
83
|
+
project_arch = find_by_canonical_name(project.architectures, arch)
|
84
|
+
product_config = find_by_canonical_name(product.configurations, config)
|
85
|
+
product_platform = find_by_canonical_name(product.platforms, platform)
|
86
|
+
product_arch = find_by_canonical_name(product.architectures, arch)
|
87
|
+
|
88
|
+
# TODO(mtwilliams): Refactor into #merge and #merge!
|
89
|
+
config = merge_configuration_settings(project_config, product_config)
|
90
|
+
platform = merge_platform_settings(project_platform, product_platform)
|
91
|
+
arch = merge_architecture_settings(project_arch, product_arch)
|
92
|
+
|
93
|
+
# TODO(mtwilliams): Build a completly flattened description of the product
|
94
|
+
# for this |triplet|.
|
95
|
+
|
96
|
+
tripletised = lambda {
|
97
|
+
Hashie::Mash.new({
|
98
|
+
:configuration => config,
|
99
|
+
:platform => platform,
|
100
|
+
:architecture => arch,
|
101
|
+
:triplet => triplet
|
102
|
+
})
|
103
|
+
}
|
104
|
+
|
105
|
+
@vistor.on_product_triplet(project, product, tripletised)
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
def to_canonical_names(collection)
|
110
|
+
[*collection].map(&:name).map(&:canonicalize)
|
111
|
+
end
|
112
|
+
|
113
|
+
def match_on_canonical_name(name)
|
114
|
+
proc {|obj| obj.name.canonicalize == name.to_s}
|
115
|
+
end
|
116
|
+
|
117
|
+
def filter_by_canonical_name(collection, name)
|
118
|
+
matcher = match_on_canonical_name(name)
|
119
|
+
[*collection].select(&matcher).compact
|
120
|
+
end
|
121
|
+
|
122
|
+
def find_by_canonical_name(collection, name)
|
123
|
+
filter_by_canonical_name(collection, name).first
|
124
|
+
end
|
125
|
+
|
126
|
+
private
|
127
|
+
def to_applicable_build_matrix(configurations, platforms, architectures)
|
128
|
+
applicable_configurations = configurations & @configurations
|
129
|
+
applicable_platforms = platforms & @platforms
|
130
|
+
applicable_architectures = architectures & @architectures
|
131
|
+
to_build_matrix(applicable_configurations, applicable_platforms, applicable_architectures)
|
132
|
+
end
|
133
|
+
|
134
|
+
def to_build_matrix(configurations, platforms, architectures)
|
135
|
+
configurations.product(platforms.product(architectures)).map(&:flatten)
|
136
|
+
end
|
137
|
+
|
138
|
+
private
|
139
|
+
def merge_configuration_settings(base, overlay)
|
140
|
+
merged = Ryb::Configuration.new
|
141
|
+
|
142
|
+
merged.name = base.name
|
143
|
+
merged.prefix = base.prefix if (base and base.prefix)
|
144
|
+
merged.prefix = overlay.prefix if (overlay and overlay.prefix)
|
145
|
+
merged.suffix = base.suffix if (base and base.suffix)
|
146
|
+
merged.suffix = overlay.suffix if (overlay and overlay.suffix)
|
147
|
+
|
148
|
+
merged.paths = Ryb::Paths.new
|
149
|
+
merged.defines = Hash.new
|
150
|
+
|
151
|
+
if base and base.paths
|
152
|
+
merged.paths.includes += base.paths.includes
|
153
|
+
merged.paths.libraries += base.paths.libraries
|
154
|
+
merged.paths.binaries += base.paths.binaries
|
155
|
+
end
|
156
|
+
|
157
|
+
if overlay and overlay.paths
|
158
|
+
merged.paths.includes += overlay.paths.includes
|
159
|
+
merged.paths.libraries += overlay.paths.libraries
|
160
|
+
merged.paths.binaries += overlay.paths.binaries
|
161
|
+
end
|
162
|
+
|
163
|
+
merged.defines.merge!(base.defines) if base and base.defines
|
164
|
+
merged.defines.merge!(overlay.defines) if overlay and overlay.defines
|
165
|
+
|
166
|
+
merged.treat_warnings_as_errors = false
|
167
|
+
merged.generate_debug_symbols = false
|
168
|
+
merged.link_time_code_generation = false
|
169
|
+
merged.optimize = :nothing
|
170
|
+
|
171
|
+
if base
|
172
|
+
merged.treat_warnings_as_errors = base.treat_warnings_as_errors unless base.treat_warnings_as_errors().nil?
|
173
|
+
merged.generate_debug_symbols = base.generate_debug_symbols unless base.generate_debug_symbols().nil?
|
174
|
+
merged.link_time_code_generation = base.link_time_code_generation unless base.link_time_code_generation().nil?
|
175
|
+
merged.optimize = base.optimize unless base.optimize().nil?
|
176
|
+
end
|
177
|
+
|
178
|
+
if overlay
|
179
|
+
merged.treat_warnings_as_errors = overlay.treat_warnings_as_errors unless overlay.treat_warnings_as_errors().nil?
|
180
|
+
merged.generate_debug_symbols = overlay.generate_debug_symbols unless overlay.generate_debug_symbols().nil?
|
181
|
+
merged.link_time_code_generation = overlay.link_time_code_generation unless overlay.link_time_code_generation().nil?
|
182
|
+
merged.optimize = overlay.optimize unless overlay.optimize().nil?
|
183
|
+
end
|
184
|
+
|
185
|
+
base_dependencies = base ? (base.dependencies || []) : []
|
186
|
+
overlay_dependencies = overlay ? (overlay.dependencies || []) : []
|
187
|
+
dependencies = base_dependencies | overlay_dependencies
|
188
|
+
|
189
|
+
merged.dependencies = dependencies
|
190
|
+
|
191
|
+
merged
|
192
|
+
end
|
193
|
+
|
194
|
+
def merge_platform_settings(base, overlay)
|
195
|
+
merge_configuration_settings(base, overlay)
|
196
|
+
end
|
197
|
+
|
198
|
+
def merge_architecture_settings(base, overlay)
|
199
|
+
merge_configuration_settings(base, overlay)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|