bake 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +7 -0
  6. data/Gemfile.lock +40 -0
  7. data/README.md +99 -0
  8. data/Rakefile +6 -0
  9. data/bake.gemspec +25 -0
  10. data/bin/bake +25 -10
  11. data/lib/bake.rb +21 -140
  12. data/lib/bake/book.rb +79 -0
  13. data/lib/bake/command.rb +29 -0
  14. data/lib/bake/command/invoke.rb +67 -0
  15. data/lib/bake/command/list.rb +76 -0
  16. data/lib/bake/command/top.rb +111 -0
  17. data/lib/bake/context.rb +103 -110
  18. data/lib/bake/loader.rb +82 -0
  19. data/lib/bake/loaders.rb +110 -0
  20. data/lib/bake/recipe.rb +109 -0
  21. data/lib/bake/version.rb +23 -0
  22. metadata +73 -85
  23. data/CHANGELOG +0 -38
  24. data/CONCEPTS +0 -54
  25. data/MIT-LICENSE +0 -21
  26. data/README +0 -38
  27. data/REFERENCE +0 -2
  28. data/TUTORIAL +0 -128
  29. data/lib/bake/addon.rb +0 -20
  30. data/lib/bake/configuration.rb +0 -126
  31. data/lib/bake/extensions.rb +0 -3
  32. data/lib/bake/extensions/class.rb +0 -11
  33. data/lib/bake/extensions/object.rb +0 -22
  34. data/lib/bake/extensions/string.rb +0 -22
  35. data/lib/bake/file_target.rb +0 -19
  36. data/lib/bake/plugin.rb +0 -49
  37. data/lib/bake/plugins/cpp.rb +0 -188
  38. data/lib/bake/plugins/cpp/darwin.rb +0 -26
  39. data/lib/bake/plugins/cpp/gcc.rb +0 -14
  40. data/lib/bake/plugins/cpp/gcc_toolset_base.rb +0 -101
  41. data/lib/bake/plugins/cpp/msvc.rb +0 -118
  42. data/lib/bake/plugins/cpp/qt.rb +0 -53
  43. data/lib/bake/plugins/cpp/toolset_base.rb +0 -56
  44. data/lib/bake/plugins/macro.rb +0 -18
  45. data/lib/bake/plugins/runner.rb +0 -40
  46. data/lib/bake/plugins/system.rb +0 -30
  47. data/lib/bake/project.rb +0 -91
  48. data/lib/bake/project_loader.rb +0 -116
  49. data/lib/bake/system_utils.rb +0 -42
  50. data/lib/bake/target.rb +0 -155
  51. data/lib/bake/toolset.rb +0 -25
  52. data/lib/bake_version.rb +0 -5
  53. data/test/test_bake.rb +0 -2
  54. data/test/test_configuration.rb +0 -58
@@ -1,22 +0,0 @@
1
- class Object
2
- # If +self+ is nil, returns a zero-length array, otherwise, if +self+
3
- # responds to the +to_ary+ method, returns +to_ary+. Otherwise, returns
4
- # an array of length one containing +self+.
5
- def make_array
6
- if nil?
7
- return []
8
- elsif respond_to?(:to_ary)
9
- return to_ary
10
- end
11
- return [ self ]
12
- end
13
-
14
- # Returns the singleton class for this object's class.
15
- def metaclass
16
- return class << self; self; end
17
- end
18
- end
19
-
20
- main = self
21
- Object.metaclass.send(:define_method, :main_object) { main }
22
- Object.metaclass.send(:public, :main_object)
@@ -1,22 +0,0 @@
1
- class String
2
- def basename(options = {})
3
- if options[:ext]
4
- return File.basename(self, extname) + options[:ext]
5
- elsif options[:noext]
6
- return File.basename(self, extname)
7
- end
8
- return File.basename(self)
9
- end
10
-
11
- def dirname
12
- return File.dirname(self)
13
- end
14
-
15
- def extname
16
- return File.extname(self)
17
- end
18
-
19
- def underscore
20
- return gsub(/([a-z0-9])([A-Z])/) { |val| $1 + '_' + $2 }.downcase
21
- end
22
- end
@@ -1,19 +0,0 @@
1
- require 'bake/target'
2
-
3
- module Bake
4
- class FileTarget < Target
5
- attr_reader :path
6
-
7
- def post_initialize(path)
8
- @path = path
9
- @built = true
10
- end
11
-
12
- def mtimes
13
- raise "file no longer exists '#{path}'" if !File.exists?(path)
14
- return [ File.mtime(path) ]
15
- end
16
-
17
- alias :id :path
18
- end
19
- end
@@ -1,49 +0,0 @@
1
- module Bake
2
- module PluginManager
3
- def load_plugin(full_name)
4
- plugin = Object.main_object.class
5
- full_name.to_s.split('::').each do |name|
6
- plugin = load_child_plugin(plugin, name)
7
- end
8
- return plugin
9
- end
10
-
11
- def load_child_plugin(parent, name)
12
- name = name.to_s
13
- full_name = parent.equal?(Object.main_object.class) ?
14
- name : parent.name + '::' + name
15
- plugin_file = full_name.underscore.gsub('::', '/')
16
-
17
- plugin = nil
18
- if parent.const_defined?(name)
19
- plugin = parent.const_get(name)
20
- return plugin if plugin.equal?(Bake)
21
- end
22
-
23
- search_dirs.each do |rootdir|
24
- if File.exists?(File.join(rootdir, plugin_file + '.rb'))
25
- require plugin_file
26
- if !plugin && parent.const_defined?(name)
27
- plugin = parent.const_get(name)
28
- end
29
- end
30
-
31
- if File.directory?(File.join(rootdir, plugin_file))
32
- if !plugin
33
- plugin = Module.new
34
- parent.const_set(name, plugin)
35
- end
36
- plugin_manager = self
37
- plugin.metaclass.send(
38
- :define_method, :const_missing) do |name|
39
- return plugin_manager.load_child_plugin(self, name)
40
- end
41
- end
42
- end
43
-
44
- raise "could not find plugin '#{name}'" if !plugin
45
- return plugin
46
- end
47
- end
48
- end
49
-
@@ -1,188 +0,0 @@
1
- require 'bake/target'
2
-
3
- module Bake
4
- module Plugins
5
- module Cpp
6
- class SystemLibrary < Target
7
- attr_reader :file
8
-
9
- def post_initialize(name, file)
10
- @built = true
11
- @name = name
12
- @file = file
13
- end
14
-
15
- def products
16
- return nil
17
- end
18
-
19
- def mtimes
20
- return [ Time.at(0) ]
21
- end
22
- end
23
-
24
- # +MainTarget+ is a mix-in for the +Library+ and +Executable+
25
- # classes containing code common to both types of targets.
26
- module MainTarget
27
- # A special override of +stale?+ that ignores changes to
28
- # dlls when determining if this target is stale. The only
29
- # case in which a lib or exe should have to update when a
30
- # dll dependency is updated is when the interface changes.
31
- # Since exes and libs depend on the headers implicitly,
32
- # they will be updated if the interface changes
33
- # automatically.
34
- def stale?
35
- return @stale if !@stale.nil?
36
- tmin = mtimes.min
37
- @stale = deps.any? do |dep|
38
- is_dll = dep.is_a?(Library) &&
39
- dep[:libtype] == 'dynamic'
40
- (dep.stale? || dep.mtimes.max > tmin) && !is_dll
41
- end
42
- return @stale
43
- end
44
-
45
- def add_dep(target)
46
- if target.is_a?(FileTarget)
47
- target = Source.new(self, toolset, target)
48
- end
49
- return super if !target.is_a?(Source)
50
- deps << Cpp::Object.new(self, toolset, target)
51
- end
52
-
53
- def build
54
- toolset.build(self)
55
- end
56
- end
57
-
58
- class Library < Target
59
- include MainTarget
60
-
61
- def post_initialize(name)
62
- @name = name
63
- default(:libtype => 'static')
64
- default(:debug_symbols? => false)
65
- end
66
- end
67
-
68
- class Executable < Target
69
- include MainTarget
70
-
71
- def post_initialize(name)
72
- @name = name
73
- default(:debug_symbols? => false)
74
- end
75
-
76
- # Enables +Executable+ to be run via a +Runner+ target.
77
- def run_command
78
- return toolset.exe_fn(self)
79
- end
80
- end
81
-
82
- class Source < Target
83
- def post_initialize(source)
84
- @source = source
85
- @includes = IncludeList.new(self, toolset, source)
86
- dep(source, @includes)
87
- end
88
-
89
- def path
90
- return @source.path
91
- end
92
-
93
- alias :id :path
94
-
95
- def mtimes
96
- return @includes.mtimes
97
- end
98
- end
99
-
100
- class IncludeList < Target
101
- attr_reader :includes
102
-
103
- def post_initialize(source)
104
- @src = source.path
105
- if File.exists?(products)
106
- @includes = load_includes
107
- @calculated = false
108
- else
109
- @includes = calc_includes(@src)
110
- @calculated = true
111
- end
112
- dep(source, *@includes)
113
- end
114
-
115
- def id
116
- return @src
117
- end
118
-
119
- def build
120
- @includes = calc_includes(@src) if !@calculated
121
- toolset.sys.fwrite(products, includes.to_a.join("\n"))
122
- end
123
-
124
- def products
125
- return "#{get(:outdir)}/#{@src.basename}.includes"
126
- end
127
-
128
- private
129
- def load_includes
130
- includes = Set.new
131
- file = File.open(products)
132
- while line = file.gets
133
- line.chomp!
134
- includes << line if !line.empty?
135
- end
136
- file.close
137
- return includes
138
- end
139
-
140
- def calc_includes(src, include_fns = Set.new)
141
- new_include_fns = Set.new
142
- File.open(src) do |file|
143
- incdirs = get(:incdirs)
144
- while line = file.gets
145
- if line =~ /\s*#\s*include\s+("|<)([^"]+)("|>)/
146
- inc = $2
147
- incdirs.each do |include_dir|
148
- fn = File.join(include_dir, inc)
149
- break if include_fns.include?(fn)
150
- if File.exists?(fn)
151
- new_include_fns << fn
152
- include_fns << fn
153
- break
154
- end
155
- end
156
- end
157
- end
158
- end
159
-
160
- new_include_fns.each do |inc|
161
- calc_includes(inc, include_fns)
162
- end
163
- return include_fns
164
- end
165
- end
166
-
167
- class Object < Target
168
- attr_reader :src
169
-
170
- alias :id :src
171
-
172
- def post_initialize(source)
173
- @src = source.path
174
- dep(source)
175
- default(:exceptions? => true)
176
- default(:rtti? => true)
177
- default(:optimizations? => false)
178
- default(:multithreaded? => true)
179
- end
180
-
181
- def build
182
- toolset.build(self)
183
- end
184
- end
185
- end
186
- end
187
- end
188
-
@@ -1,26 +0,0 @@
1
- module Bake
2
- module Plugins
3
- module Cpp
4
- class Darwin < GccToolsetBase
5
- def ar(lib)
6
- obj_str, lib_str, flags = process_inputs(lib)
7
-
8
- output = lib_fn(lib)
9
- if lib[:libtype] == 'dynamic'
10
- sys.sh("g++ #{flags} -dynamiclib -o #{output} #{obj_str} #{lib_str}")
11
- else
12
- sys.sh("ar rcs #{output} #{obj_str}")
13
- end
14
- end
15
-
16
- def lib_fn(lib)
17
- if lib[:libtype] == 'dynamic'
18
- return File.join(lib[:outdir], "lib#{lib.name}.dylib")
19
- end
20
- return File.join(lib[:outdir], "lib#{lib.name}.a")
21
- end
22
- end
23
- end
24
- end
25
- end
26
-
@@ -1,14 +0,0 @@
1
- module Bake
2
- module Plugins
3
- module Cpp
4
- class Gcc < GccToolsetBase
5
- module Library
6
- def post_initialize
7
- opt(:cflags => '-fPIC') if get(:libtype) == 'dynamic'
8
- end
9
- end
10
- end
11
- end
12
- end
13
- end
14
-
@@ -1,101 +0,0 @@
1
- require 'fileutils'
2
-
3
- module Bake
4
- module Plugins
5
- module Cpp
6
- class GccToolsetBase < ToolsetBase
7
- def output(target)
8
- if target.is_a?(Cpp::Object)
9
- return obj_fn(target)
10
- elsif target.is_a?(Cpp::Library)
11
- return lib_fn(target)
12
- elsif target.is_a?(Cpp::Executable)
13
- return exe_fn(target)
14
- end
15
- return nil
16
- end
17
-
18
- def compile(obj)
19
- src = obj.src
20
- output = obj_fn(obj)
21
- flags = build_flags('-I', obj[:incdirs] + obj[:sysincdirs]) +
22
- build_flags('-D', obj[:defines])
23
- flags += obj[:cflags].join(' ')
24
- flags += ' -fno-rtti' if !obj[:rtti?]
25
- flags += ' -O3' if obj[:optimizations?]
26
- flags += ' -g' if obj[:debug_symbols?]
27
- sys.sh("g++ -c -o #{output} #{flags} #{src}")
28
- end
29
-
30
- def ar(lib)
31
- obj_str, lib_str, flags = process_inputs(lib)
32
-
33
- output = lib_fn(lib)
34
- if lib[:libtype] == 'dynamic'
35
- sys.sh("g++ #{flags} -shared -Wl,-soname,#{output} -o #{output} #{obj_str} #{lib_str}")
36
- if lib.has_prop?(:gcc_lib_path)
37
- fn = File.join(lib[:gcc_lib_path], output.basename)
38
- File.symlink(output, fn) if !File.exists?(fn)
39
- end
40
- else
41
- sys.sh("ar rcs #{output} #{obj_str}")
42
- end
43
- end
44
-
45
- def link(exe)
46
- obj_str, lib_str, flags = process_inputs(exe)
47
-
48
- output = exe_fn(exe)
49
- sys.sh("g++ #{flags} -o #{output} #{obj_str} #{lib_str}")
50
- end
51
-
52
- def obj_fn(obj)
53
- src = obj.src
54
- basename = File.basename(src, File.extname(src)) + '.o'
55
- return File.join(obj[:outdir], basename)
56
- end
57
-
58
- def lib_fn(lib)
59
- if lib[:libtype] == 'dynamic'
60
- return File.join(lib[:outdir], "lib#{lib.name}.so")
61
- end
62
- return File.join(lib[:outdir], "lib#{lib.name}.a")
63
- end
64
-
65
- def exe_fn(exe)
66
- return File.join(exe[:outdir], exe.name)
67
- end
68
-
69
- private
70
- def build_flags(flag, args)
71
- return args.inject('') { |str, arg| str + "#{flag}#{arg} " }
72
- end
73
-
74
- def process_inputs(target)
75
- output = output(target)
76
- obj_str = ''
77
- lib_str = ''
78
- libdirs = []
79
- target.deps.each do |input|
80
- if input.is_a?(Cpp::Object)
81
- fn = obj_fn(input)
82
- obj_str += fn + ' '
83
- elsif input.is_a?(Cpp::SystemLibrary)
84
- lib_str += '-l' + input.file + ' '
85
- elsif input.is_a?(Cpp::Library)
86
- fn = lib_fn(input)
87
- lib_str += '-l' + input.name + ' '
88
- libdir = File.dirname(fn)
89
- libdirs << libdir if !libdirs.include?(libdir)
90
- end
91
- end
92
-
93
- libdirs.concat(target[:libdirs])
94
- flags = build_flags('-L', libdirs)
95
- return [ obj_str, lib_str, flags ]
96
- end
97
- end
98
- end
99
- end
100
- end
101
-