ryb 0.0.0.dev → 0.1.0

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.
@@ -0,0 +1,40 @@
1
+ module Ryb
2
+ module Windows
3
+ POSSIBLE_SDK_INSTALL_DIRECTORY_REGISTRY_KEYS =
4
+ ["SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows",
5
+ "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows"]
6
+
7
+ def self.sdk
8
+ if Ryb.platform == :windows
9
+ if ENV.key?('WindowsSdkDir')
10
+ ENV['WindowsSdkDir']
11
+ else
12
+ # TODO(mtwilliams): Escape, i.e. .gsub(/\\/,'/').gsub(/\ /,'\\ ')?
13
+ self.sdks.first
14
+ end
15
+ end
16
+ end
17
+
18
+ def self.sdk?
19
+ !self.sdk.nil?
20
+ end
21
+
22
+ def self.sdks
23
+ if Ryb.platform == :windows
24
+ require 'win32/registry'
25
+ @sdks ||= begin
26
+ (POSSIBLE_SDK_INSTALL_DIRECTORY_REGISTRY_KEYS.map do |key|
27
+ begin
28
+ ::Win32::Registry::HKEY_CURRENT_USER.open(key, ::Win32::Registry::KEY_READ)['CurrentInstallFolder']
29
+ rescue
30
+ begin
31
+ ::Win32::Registry::HKEY_LOCAL_MACHINE.open(key, ::Win32::Registry::KEY_READ)['CurrentInstallFolder']
32
+ rescue
33
+ end
34
+ end
35
+ end).compact
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,145 @@
1
+ require 'ryb/project'
2
+
3
+ module Ryb
4
+ module XCode
5
+ module Project
6
+ end
7
+
8
+ module Target
9
+ def self.setup_for_version(xc_project, xc_target, version)
10
+ xc_target.build_configuration_list.set_setting('SDKROOT', "macosx#{version}")
11
+ end
12
+
13
+ def self.add_file_references(xc_project, xc_target, files)
14
+ sources = xc_project.main_group['Source'] || xc_project.main_group.new_group('Source')
15
+ files.each do |file|
16
+ *dirs, file = Pathname(file).each_filename.to_a
17
+ group = dirs.reduce(sources) {|group, dir| group[dir] || group.new_group(dir, dir)}
18
+ ref = group.new_file(file)
19
+ xc_target.add_file_references([ref])
20
+ end
21
+ end
22
+ end
23
+
24
+ def self.generate_project_files_for(project, opts={})
25
+ # TODO(mtwilliams): Take into account opts[:root].
26
+ xc_proj = Xcodeproj::Project.new("#{project.name}.xcodeproj")
27
+ puts "Generating #{xc_proj.path}..."
28
+
29
+ xc_products_group = xc_proj.main_group['Products']
30
+ xc_products_group_for_libs = xc_products_group.new_group('lib', 'lib')
31
+ xc_products_group_for_bins = xc_products_group.new_group('bin', 'bin')
32
+
33
+ project.configurations.each do |name, config|
34
+ xc_build_configuration = xc_proj.build_configuration_list[config.name]
35
+ xc_build_configuration ||= xc_proj.build_configuration_list[config.name.capitalize]
36
+ xc_build_configuration ||= xc_proj.add_build_configuration(config.name, :release)
37
+ xc_build_configuration.name = (config.name.pretty || config.name.capitalize)
38
+ defines = project.defines.merge(config.defines)
39
+ xc_build_configuration.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = defines.map {|name, value| "#{name}=#{value}"}
40
+ end
41
+
42
+ xc_proj.build_configuration_list.set_setting('SYMROOT', opts[:built])
43
+ xc_proj.build_configuration_list.set_setting('CONFIGURATION_BUILD_DIR', opts[:built])
44
+ xc_proj.build_configuration_list.sort
45
+
46
+ (project.libraries + project.applications).each do |target|
47
+ puts " Adding '#{target.name.pretty || target.name}' as target..."
48
+ type = :application if target.is_a? Ryb::Application
49
+ type = {:static => :static_library, :dynamic => :dynamic_library}[target.linkage] if target.is_a? Ryb::Library
50
+ name = target.name
51
+ platform = :osx
52
+ deployment_target = (target.targets[:macosx].version.to_s if (target.targets[:macosx] and target.targets[:macosx].verison))
53
+ xc_target = xc_proj.new_target(type, name, platform, deployment_target)
54
+
55
+ # case type
56
+ # when :application
57
+ # xc_target.product_reference.move(xc_products_group_for_bins)
58
+ # when :static_library
59
+ # xc_target.product_reference.move(xc_products_group_for_libs)
60
+ # when :dynamic_library
61
+ # xc_target.product_reference.move(xc_products_group_for_bins)
62
+ # end
63
+ # xc_target.product_reference.set_source_tree(:group)
64
+
65
+ # if target.name.pretty
66
+ # xc_target.name = target.name.pretty
67
+ # xc_target.product_name = target.name
68
+ # end
69
+
70
+ if target.targets[:macosx] and target.targets[:macosx].verison
71
+ Target.setup_for_version(xc_proj, xc_target, target.targets[:macosx].version)
72
+ end
73
+
74
+ # TODO(mtwilliams): Refactor.
75
+ configs = ((project.configurations.keys | target.configurations.keys).map do |config|
76
+ project_config = project.configurations[config]
77
+ if project_config
78
+ project_config = project_config.dup
79
+ project_config.instance_variable_set(:@defines, project.defines.merge(project_config.defines))
80
+ end
81
+ target_config = target.configurations[config]
82
+ if target_config
83
+ target_config = target_config.dup
84
+ target_config.instance_variable_set(:@defines, target.defines.merge(target_config.defines))
85
+ end
86
+ config = if project_config and target_config
87
+ project_config.instance_variable_set(:@defines, project_config.defines.merge(target_config.defines))
88
+ project_config
89
+ else
90
+ project_config || target_config
91
+ end
92
+
93
+ [config.name, config]
94
+ end).to_h
95
+
96
+ configs.each do |name, config|
97
+ xc_build_configuration = xc_target.build_configuration_list[config.name]
98
+ xc_build_configuration ||= xc_target.build_configuration_list[config.name.capitalize]
99
+ xc_build_configuration ||= xc_target.add_build_configuration(config.name, :release)
100
+ xc_build_configuration.name = (config.name.pretty || config.name.capitalize)
101
+ xc_build_configuration.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = config.defines.map {|name, value| "#{name}=#{value}"}
102
+ end
103
+
104
+ expand_path_variables = lambda { |path|
105
+ path.gsub(/\:built/, opts[:built])
106
+ }
107
+
108
+ includes = target.paths[:includes].map(&expand_path_variables).map(&File.method(:expand_path))
109
+ xc_target.build_configuration_list.set_setting('USER_HEADER_SEARCH_PATHS', includes)
110
+ libraries = target.paths[:libraries].map(&expand_path_variables).map(&File.method(:expand_path))
111
+ libraries.each(&FileUtils.method(:mkdir_p))
112
+ xc_target.build_configuration_list.set_setting('LIBRARY_SEARCH_PATHS', libraries)
113
+ binaries = target.paths[:binaries].map(&expand_path_variables).map(&File.method(:expand_path))
114
+ binaries.each(&FileUtils.method(:mkdir_p))
115
+ # ???
116
+
117
+ xc_target.build_configuration_list.sort
118
+
119
+ xc_target.build_configuration_list.set_setting('BUILT_PRODUCTS_DIR', opts[:built])
120
+ case type
121
+ when :application
122
+ xc_target.build_configuration_list.set_setting('CONFIGURATION_BUILD_DIR', File.join(opts[:built], 'bin'))
123
+ when :static_library
124
+ xc_target.build_configuration_list.set_setting('CONFIGURATION_BUILD_DIR', File.join(opts[:built], 'lib'))
125
+ when :dynamic_library
126
+ xc_target.build_configuration_list.set_setting('CONFIGURATION_BUILD_DIR', File.join(opts[:built], 'bin'))
127
+ end
128
+
129
+ Target.add_file_references(xc_proj, xc_target, target.files[:source])
130
+
131
+ target.dependencies.each do |dependency|
132
+ xc_target_for_dep = [*(xc_proj.targets.objects.select {|target| target.product_name == dependency})].first
133
+ if xc_target_for_dep
134
+ xc_target.add_dependency(xc_target_for_dep)
135
+ xc_target
136
+ else
137
+ raise "Not implemented, yet!"
138
+ end
139
+ end
140
+ end
141
+
142
+ xc_proj.save
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,15 @@
1
+ require 'ryb'
2
+ require 'ostruct'
3
+
4
+ # TODO(mtwilliams): Improve the handling of Rybfiles.
5
+ module Rybfile
6
+ def self.load(path)
7
+ begin
8
+ return OpenStruct.new(:project => eval(File.read(path), binding(), path)).freeze
9
+ rescue SignalException, SystemExit
10
+ raise
11
+ rescue SyntaxError, Exception => e
12
+ raise "Invalid Rybfile!\n #{path}\n #{e}"
13
+ end
14
+ end
15
+ end
@@ -20,5 +20,12 @@ Gem::Specification.new do |s|
20
20
  # TODO(mtwilliams): Handle this gracefuly in `bin/ryb'.
21
21
  s.require_paths = %w(lib)
22
22
 
23
+ s.add_dependency 'facets'
23
24
  s.add_dependency 'gli'
25
+ s.add_dependency 'xcodeproj'
26
+ s.add_dependency 'ninja-gen'
27
+
28
+ s.add_development_dependency 'rspec'
29
+ s.add_development_dependency 'cucumber'
30
+ s.add_development_dependency 'aruba'
24
31
  end
@@ -0,0 +1,19 @@
1
+ {
2
+ "folders":
3
+ [
4
+ {
5
+ "path": ".",
6
+
7
+ "file_exclude_patterns": [
8
+ "*.sublime-project",
9
+ "*.sublime-workspace",
10
+ "Gemfile.lock",
11
+ "*.gem"
12
+ ],
13
+
14
+ "folder_exclude_patterns": [
15
+ ".bundle"
16
+ ]
17
+ }
18
+ ]
19
+ }
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ryb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.dev
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-05 00:00:00.000000000 Z
11
+ date: 2015-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: facets
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: gli
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +38,76 @@ dependencies:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: xcodeproj
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ninja-gen
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: cucumber
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: aruba
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
27
111
  description: Ryb is a clean and extensible Ruby DSL for generating project files.
28
112
  email: m.t.williams@live.com
29
113
  executables:
@@ -31,16 +115,44 @@ executables:
31
115
  extensions: []
32
116
  extra_rdoc_files: []
33
117
  files:
118
+ - ".gitignore"
34
119
  - Gemfile
35
120
  - Gemfile.lock
36
121
  - README.md
37
122
  - Rakefile
38
123
  - bin/ryb
39
124
  - lib/ryb.rb
40
- - lib/ryb/dsl.rb
41
- - lib/ryb/toolsets.rb
125
+ - lib/ryb/application.rb
126
+ - lib/ryb/architecture.rb
127
+ - lib/ryb/architectures/x86.rb
128
+ - lib/ryb/architectures/x86_64.rb
129
+ - lib/ryb/configuration.rb
130
+ - lib/ryb/library.rb
131
+ - lib/ryb/name.rb
132
+ - lib/ryb/ninja.rb
133
+ - lib/ryb/project.rb
134
+ - lib/ryb/properties.rb
135
+ - lib/ryb/properties/architectures.rb
136
+ - lib/ryb/properties/configurations.rb
137
+ - lib/ryb/properties/defines.rb
138
+ - lib/ryb/properties/dependencies.rb
139
+ - lib/ryb/properties/files.rb
140
+ - lib/ryb/properties/flags.rb
141
+ - lib/ryb/properties/named.rb
142
+ - lib/ryb/properties/paths.rb
143
+ - lib/ryb/properties/suffix.rb
144
+ - lib/ryb/properties/targets.rb
145
+ - lib/ryb/target.rb
146
+ - lib/ryb/targets/linux.rb
147
+ - lib/ryb/targets/macosx.rb
148
+ - lib/ryb/targets/windows.rb
42
149
  - lib/ryb/version.rb
150
+ - lib/ryb/visual_studio.rb
151
+ - lib/ryb/windows.rb
152
+ - lib/ryb/xcode.rb
153
+ - lib/rybfile.rb
43
154
  - ryb.gemspec
155
+ - ryb.sublime-project
44
156
  homepage: https://RubifyYourBuild.com/
45
157
  licenses:
46
158
  - Public Domain
@@ -56,14 +168,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
56
168
  version: 1.9.3
57
169
  required_rubygems_version: !ruby/object:Gem::Requirement
58
170
  requirements:
59
- - - ">"
171
+ - - ">="
60
172
  - !ruby/object:Gem::Version
61
- version: 1.3.1
173
+ version: '0'
62
174
  requirements: []
63
175
  rubyforge_project:
64
- rubygems_version: 2.4.8
176
+ rubygems_version: 2.4.5
65
177
  signing_key:
66
178
  specification_version: 4
67
179
  summary: Rubify Your Build!
68
180
  test_files: []
69
- has_rdoc:
@@ -1,19 +0,0 @@
1
- module Ryb
2
- module DSL
3
- # TODO(mtwilliams): Refactor into Ryb::Runner? Ryb::Builder?
4
- @_on_project_callbacks = []
5
- def on_project(&block); @_on_project_callbacks << block; end
6
-
7
- def project(name=nil, opts={}, &block)
8
- # TODO(mtwilliams): Freak out if a name is not specified.
9
- # TODO(mtwilliams): Freak out if `opts` is malformed, i.e. an unknown
10
- # option is specified or a specified option is invalid.
11
- project = Docile.dsl_eval(Ryb::Project::Builder.new, &block).build
12
-
13
- # TODO(mtwilliams): Handle exceptions.
14
- @_on_project_callbacks.each {|callback| callback(project)}
15
-
16
- return project
17
- end
18
- end
19
- end
@@ -1,17 +0,0 @@
1
- module Ryb
2
- module Toolsets
3
- AVAILABLE = %w{gmake vs2008 vs2010 vs2012 vs2013 vs2015}
4
- def self.available?(toolset)
5
- AVAILABLE.include?(toolset)
6
- end
7
- end
8
-
9
- def self.generate_project_files(toolset, projects)
10
- # ({:gmake => Ryb::GMake.generate_project_files,
11
- # :vs2008 => Ryb::VS2008.generate_project_files,
12
- # :vs2010 => Ryb::VS2010.generate_project_files,
13
- # :vs2012 => Ryb::VS2012.generate_project_files,
14
- # :vs2013 => Ryb::VS2013.generate_project_files,
15
- # :vs2015 => Ryb::VS2015.generate_project_files}[toolset](projects))
16
- end
17
- end