ryb 0.0.0.dev → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/Gemfile.lock +69 -2
- data/README.md +6 -1
- data/bin/ryb +15 -5
- data/lib/ryb.rb +25 -6
- data/lib/ryb/application.rb +24 -0
- data/lib/ryb/architecture.rb +16 -0
- data/lib/ryb/architectures/x86.rb +11 -0
- data/lib/ryb/architectures/x86_64.rb +11 -0
- data/lib/ryb/configuration.rb +16 -0
- data/lib/ryb/library.rb +29 -0
- data/lib/ryb/name.rb +9 -0
- data/lib/ryb/ninja.rb +181 -0
- data/lib/ryb/project.rb +34 -0
- data/lib/ryb/properties.rb +10 -0
- data/lib/ryb/properties/architectures.rb +32 -0
- data/lib/ryb/properties/configurations.rb +29 -0
- data/lib/ryb/properties/defines.rb +31 -0
- data/lib/ryb/properties/dependencies.rb +23 -0
- data/lib/ryb/properties/files.rb +25 -0
- data/lib/ryb/properties/flags.rb +33 -0
- data/lib/ryb/properties/named.rb +17 -0
- data/lib/ryb/properties/paths.rb +37 -0
- data/lib/ryb/properties/suffix.rb +17 -0
- data/lib/ryb/properties/targets.rb +36 -0
- data/lib/ryb/target.rb +16 -0
- data/lib/ryb/targets/linux.rb +11 -0
- data/lib/ryb/targets/macosx.rb +33 -0
- data/lib/ryb/targets/windows.rb +13 -0
- data/lib/ryb/version.rb +2 -1
- data/lib/ryb/visual_studio.rb +66 -0
- data/lib/ryb/windows.rb +40 -0
- data/lib/ryb/xcode.rb +145 -0
- data/lib/rybfile.rb +15 -0
- data/ryb.gemspec +7 -0
- data/ryb.sublime-project +19 -0
- metadata +119 -8
- data/lib/ryb/dsl.rb +0 -19
- data/lib/ryb/toolsets.rb +0 -17
data/lib/ryb/project.rb
ADDED
@@ -0,0 +1,34 @@
|
|
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
|
+
module Ryb
|
10
|
+
class Project
|
11
|
+
include Properties::Named
|
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
|
23
|
+
|
24
|
+
def libraries; @libraries ||= [] end
|
25
|
+
def library(*args, &block)
|
26
|
+
self.libraries << Library.new(*args, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def applications; @applications ||= [] end
|
30
|
+
def application(*args, &block)
|
31
|
+
self.applications << Application.new(*args, &block)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'ryb/properties/named'
|
2
|
+
require 'ryb/properties/suffix'
|
3
|
+
require 'ryb/properties/defines'
|
4
|
+
require 'ryb/properties/flags'
|
5
|
+
require 'ryb/properties/paths'
|
6
|
+
require 'ryb/properties/files'
|
7
|
+
require 'ryb/properties/dependencies'
|
8
|
+
require 'ryb/properties/architectures'
|
9
|
+
require 'ryb/properties/targets'
|
10
|
+
require 'ryb/properties/configurations'
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'ryb/architectures/x86'
|
2
|
+
require 'ryb/architectures/x86_64'
|
3
|
+
|
4
|
+
module Ryb
|
5
|
+
module Properties
|
6
|
+
module Architectures
|
7
|
+
module ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
module InstanceMethods
|
11
|
+
def architectures
|
12
|
+
@architectures ||= {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def architecture(name, &block)
|
16
|
+
arch = {:x86 => Ryb::Architectures::X86,
|
17
|
+
:x86_64 => Ryb::Architectures::X86_64}[name].new(&block)
|
18
|
+
architectures.merge!(name => arch) do |_, *archs|
|
19
|
+
archs[0].suffix ||= archs[1].suffix
|
20
|
+
archs[0].defines.merge!(archs[1].defines)
|
21
|
+
archs[0]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.included(klass)
|
27
|
+
klass.extend(ClassMethods)
|
28
|
+
klass.include(InstanceMethods)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Properties
|
3
|
+
module Configurations
|
4
|
+
module ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
def configurations
|
9
|
+
@configurations ||= {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def configuration(name, opts={}, &block)
|
13
|
+
config = Configuration.new(name, opts, &block)
|
14
|
+
configurations.merge!(name => config) do |_, *configs|
|
15
|
+
configs[0].suffix ||= configs[1].suffix
|
16
|
+
configs[0].defines.merge!(configs[1].defines)
|
17
|
+
configs[0].instance_variable_set(:@flags, configs[1].instance_variable_get(:@flags))
|
18
|
+
configs[0]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.included(klass)
|
24
|
+
klass.extend(ClassMethods)
|
25
|
+
klass.include(InstanceMethods)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Properties
|
3
|
+
module Defines
|
4
|
+
module ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
def defines
|
9
|
+
@defines ||= {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def define(new_defines)
|
13
|
+
defines.merge!((new_defines.map do |identifier, value|
|
14
|
+
if value.is_a? FalseClass
|
15
|
+
[identifier, '0']
|
16
|
+
elsif value.is_a? TrueClass
|
17
|
+
[identifier, '1']
|
18
|
+
else
|
19
|
+
[identifier, value.to_s]
|
20
|
+
end
|
21
|
+
end).to_h)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.included(klass)
|
26
|
+
klass.extend(ClassMethods)
|
27
|
+
klass.include(InstanceMethods)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Properties
|
3
|
+
module Dependencies
|
4
|
+
module ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
def dependencies
|
9
|
+
@dependencies ||= []
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_dependency(dependency)
|
13
|
+
dependencies.push(*dependency)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.included(klass)
|
18
|
+
klass.extend(ClassMethods)
|
19
|
+
klass.include(InstanceMethods)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Properties
|
3
|
+
module Files
|
4
|
+
module ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
def files
|
9
|
+
@files ||= {
|
10
|
+
:source => []
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_source_files(*files)
|
15
|
+
self.files[:source].push(*((([*files]).flatten).map(&Dir.method(:glob)).flatten))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.included(klass)
|
20
|
+
klass.extend(ClassMethods)
|
21
|
+
klass.include(InstanceMethods)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Properties
|
3
|
+
module Flags
|
4
|
+
module ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
def flags
|
9
|
+
@flags ||= {
|
10
|
+
:generate_debug_symbols => false,
|
11
|
+
:optimize => :none
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate_debug_symbols; flags[:generate_debug_symbols]; end
|
16
|
+
def generate_debug_symbols=(do_generate_debug_symbols)
|
17
|
+
flags[:generate_debug_symbols] = do_generate_debug_symbols
|
18
|
+
end
|
19
|
+
|
20
|
+
def optimize; flags[:optimize]; end
|
21
|
+
def optimize=(optimization)
|
22
|
+
raise "..." unless [:none, :size, :speed].include?(optimization)
|
23
|
+
flags[:optimization] = optimization
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.included(klass)
|
28
|
+
klass.extend(ClassMethods)
|
29
|
+
klass.include(InstanceMethods)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Properties
|
3
|
+
module Named
|
4
|
+
module ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
attr_reader :name
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.included(klass)
|
12
|
+
klass.extend(ClassMethods)
|
13
|
+
klass.include(InstanceMethods)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Properties
|
3
|
+
module Paths
|
4
|
+
module ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
def paths
|
9
|
+
@paths ||= {
|
10
|
+
:includes => [],
|
11
|
+
:libraries => [],
|
12
|
+
:binaries => []
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
# TODO(mtwilliams): Refactor.
|
17
|
+
# TODO(mtwilliams): Verify existence of paths.
|
18
|
+
def add_includes_paths(*paths)
|
19
|
+
self.paths[:includes].push(*(([*paths]).flatten))
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_libraries_paths(*paths)
|
23
|
+
self.paths[:libraries].push(*(([*paths]).flatten))
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_binaries_paths(*paths)
|
27
|
+
self.paths[:binaries].push(*(([*paths]).flatten))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.included(klass)
|
32
|
+
klass.extend(ClassMethods)
|
33
|
+
klass.include(InstanceMethods)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Ryb
|
2
|
+
module Properties
|
3
|
+
module Suffix
|
4
|
+
module ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
attr_accessor :suffix
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.included(klass)
|
12
|
+
klass.extend(ClassMethods)
|
13
|
+
klass.include(InstanceMethods)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'ryb/targets/windows'
|
2
|
+
require 'ryb/targets/macosx'
|
3
|
+
require 'ryb/targets/linux'
|
4
|
+
|
5
|
+
module Ryb
|
6
|
+
module Properties
|
7
|
+
module Targets
|
8
|
+
module ClassMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
module InstanceMethods
|
12
|
+
def targets
|
13
|
+
@targets ||= {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def target(name, &block)
|
17
|
+
target = {:windows => Ryb::Targets::Windows,
|
18
|
+
:macosx => Ryb::Targets::MacOSX,
|
19
|
+
:linux => Ryb::Targets::Linux}[name].new(&block)
|
20
|
+
targets.merge!(name => target) do |_, *targets|
|
21
|
+
targets[0].instance_variable_set(:@version, targets[1].instance_variable_get(:@version))
|
22
|
+
targets[0].suffix ||= targets[1].suffix
|
23
|
+
targets[0].defines.merge!(targets[1].defines)
|
24
|
+
targets[0].flags.merge!(targets[1].flags)
|
25
|
+
targets[0]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.included(klass)
|
31
|
+
klass.extend(ClassMethods)
|
32
|
+
klass.include(InstanceMethods)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/ryb/target.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'ryb/name'
|
2
|
+
require 'ryb/properties'
|
3
|
+
|
4
|
+
module Ryb
|
5
|
+
class Target
|
6
|
+
include Properties::Named
|
7
|
+
include Properties::Suffix
|
8
|
+
include Properties::Defines
|
9
|
+
include Properties::Flags
|
10
|
+
|
11
|
+
def initialize(name, opts={})
|
12
|
+
@name = Name.new(name, opts[:pretty])
|
13
|
+
yield self if block_given?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'ryb/target'
|
2
|
+
|
3
|
+
module Ryb
|
4
|
+
module Targets
|
5
|
+
class MacOSX < Target
|
6
|
+
class Version
|
7
|
+
attr_accessor :major
|
8
|
+
attr_accessor :minor
|
9
|
+
|
10
|
+
def initialize(major, minor)
|
11
|
+
@major = major; @minor = minor;
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
"#{major}.#{minor}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :version
|
20
|
+
def version=(version)
|
21
|
+
raise "..." unless version =~ /^(\d+)\.(\d+)$/
|
22
|
+
major, minor = *((/^(\d+)\.(\d+)$/.match(version))[1..2].map(&:to_i))
|
23
|
+
raise "..." if major != 10
|
24
|
+
raise "..." if minor <= 5
|
25
|
+
@version = Version.new(major, minor)
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(&block)
|
29
|
+
super('macosx', pretty: 'Mac OS X', &block)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/ryb/version.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
module Ryb
|
2
2
|
module VERSION #:nodoc:
|
3
|
-
MAJOR, MINOR, PATCH, PRE = [0,
|
3
|
+
MAJOR, MINOR, PATCH, PRE = [0, 1, 0]
|
4
4
|
STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
|
5
5
|
end
|
6
6
|
|
7
|
+
# Returns the semantic version of Ryb.
|
7
8
|
def self.version
|
8
9
|
Ryb::VERSION::STRING
|
9
10
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Ryb
|
2
|
+
module VisualStudio
|
3
|
+
POSSIBLE_INSTALL_DIRECTORY_REGISTRY_KEYS =
|
4
|
+
["SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\12.0\\Setup\\VC",
|
5
|
+
"SOFTWARE\\Microsoft\\VisualStudio\\12.0\\Setup\\VC",
|
6
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\12.0\\Setup\\VC",
|
7
|
+
"SOFTWARE\\Microsoft\\VCExpress\\12.0\\Setup\\VC",
|
8
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\11.0\\Setup\\VC",
|
9
|
+
"SOFTWARE\\Microsoft\\VisualStudio\\11.0\\Setup\\VC",
|
10
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\11.0\\Setup\\VC",
|
11
|
+
"SOFTWARE\\Microsoft\\VCExpress\\11.0\\Setup\\VC",
|
12
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\10.0\\Setup\\VC",
|
13
|
+
"SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC",
|
14
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\10.0\\Setup\\VC",
|
15
|
+
"SOFTWARE\\Microsoft\\VCExpress\\10.0\\Setup\\VC",
|
16
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\9.0\\Setup\\VC",
|
17
|
+
"SOFTWARE\\Microsoft\\VisualStudio\\9.0\\Setup\\VC",
|
18
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\9.0\\Setup\\VC",
|
19
|
+
"SOFTWARE\\Microsoft\\VCExpress\\9.0\\Setup\\VC",
|
20
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\8.0\\Setup\\VC",
|
21
|
+
"SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC",
|
22
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\8.0\\Setup\\VC",
|
23
|
+
"SOFTWARE\\Microsoft\\VCExpress\\8.0\\Setup\\VC",
|
24
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\7.1\\Setup\\VC",
|
25
|
+
"SOFTWARE\\Microsoft\\VisualStudio\\7.1\\Setup\\VC",
|
26
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\7.1\\Setup\\VC",
|
27
|
+
"SOFTWARE\\Microsoft\\VCExpress\\7.1\\Setup\\VC",
|
28
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\7.0\\Setup\\VC",
|
29
|
+
"SOFTWARE\\Microsoft\\VisualStudio\\7.0\\Setup\\VC",
|
30
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\7.0\\Setup\\VC",
|
31
|
+
"SOFTWARE\\Microsoft\\VCExpress\\7.0\\Setup\\VC",
|
32
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\6.0\\Setup\\VC",
|
33
|
+
"SOFTWARE\\Microsoft\\VisualStudio\\6.0\\Setup\\VC",
|
34
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\6.0\\Setup\\VC",
|
35
|
+
"SOFTWARE\\Microsoft\\VCExpress\\6.0\\Setup\\VC"]
|
36
|
+
|
37
|
+
def self.install
|
38
|
+
if Ryb.platform == :windows
|
39
|
+
if ENV.key?('VCInstallDir')
|
40
|
+
ENV['VCInstallDir']
|
41
|
+
else
|
42
|
+
# TODO(mtwilliams): Escape, i.e. .gsub(/\\/,'/').gsub(/\ /,'\\ ')?
|
43
|
+
self.installs.first
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.installed?
|
49
|
+
!self.install.nil?
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.installs
|
53
|
+
if Ryb.platform == :windows
|
54
|
+
require 'win32/registry'
|
55
|
+
@installs ||= begin
|
56
|
+
(POSSIBLE_INSTALL_DIRECTORY_REGISTRY_KEYS.map do |key|
|
57
|
+
begin
|
58
|
+
::Win32::Registry::HKEY_LOCAL_MACHINE.open(key, ::Win32::Registry::KEY_READ)['ProductDir']
|
59
|
+
rescue
|
60
|
+
end
|
61
|
+
end).compact
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|