teapot 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/teapot CHANGED
@@ -169,10 +169,6 @@ module Application
169
169
  end
170
170
  end
171
171
  end
172
-
173
- def self.debug
174
- puts ARGV.inspect
175
- end
176
172
  end
177
173
 
178
174
  time = Benchmark.measure do
@@ -37,7 +37,7 @@ module Teapot
37
37
  @root || @parent.root
38
38
  end
39
39
 
40
- attr :tasks
40
+ attr :targets
41
41
 
42
42
  def << (target)
43
43
  @targets << target
@@ -0,0 +1,91 @@
1
+ # Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'teapot/build/target'
22
+ require 'digest/md5'
23
+
24
+ module Teapot
25
+ module Build
26
+ module Targets
27
+ class External < Build::Target
28
+ # This file contains a checksum of the build environment. If it changes, even though the source code hasn't changed, it means that we need to recompile.
29
+ ENVIRONMENT_CHECKSUM_FILE = ".teapot-environment-checksum"
30
+
31
+ def initialize(parent, directory, &block)
32
+ super parent
33
+
34
+ @directory = directory
35
+
36
+ # Callback for preparing the target and compiling/installing the target.
37
+ @install = block
38
+ end
39
+
40
+ def root
41
+ @parent.root + @directory
42
+ end
43
+
44
+ def install(values)
45
+ return unless @install
46
+
47
+ source_path = @parent.root + @directory
48
+ build_source_path = values[:build_prefix] + @directory
49
+ build_source_checksum_path = build_source_path + ENVIRONMENT_CHECKSUM_FILE
50
+
51
+ fresh = false
52
+
53
+ # Check the environment checksum to catch any changes to the build environment:
54
+ if build_source_checksum_path.exist? and File.read(build_source_checksum_path.to_s) != checksum(values)
55
+ FileUtils.rm_rf(build_source_path.to_s) if build_source_path.exist?
56
+ end
57
+
58
+ if !build_source_path.exist?
59
+ build_source_path.mkpath
60
+
61
+ FileUtils.cp_r(source_path.children, build_source_path.to_s)
62
+
63
+ # Write the environment checksum out to a file:
64
+ File.write(build_source_checksum_path, checksum(values))
65
+
66
+ fresh = true
67
+ end
68
+
69
+ # Convert the hash to suit typical shell specific arguments:
70
+ shell_environment = Environment::System::convert_to_shell(values)
71
+
72
+ Dir.chdir(build_source_path) do
73
+ RExec.env(shell_environment) do
74
+ @install.call(Environment::Evaluator.new(values), fresh)
75
+ end
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def checksum(values)
82
+ # Calculate a canonical text representation of the environment:
83
+ text = values.sort.inspect
84
+
85
+ # Digest the text:
86
+ Digest::MD5.hexdigest(text)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
data/lib/teapot/build.rb CHANGED
@@ -23,6 +23,7 @@ require 'teapot/build/targets/files'
23
23
  require 'teapot/build/targets/library'
24
24
  require 'teapot/build/targets/executable'
25
25
  require 'teapot/build/targets/application'
26
+ require 'teapot/build/targets/external'
26
27
 
27
28
  module Teapot
28
29
  module Build
@@ -30,12 +31,22 @@ module Teapot
30
31
  Targets::Directory.target(nil, path)
31
32
  end
32
33
 
33
- def self.install_directory(root, directory, *args)
34
- target = top(root)
34
+ module Helpers
35
+ def install_directory(root, directory, *args)
36
+ target = Build.top(root)
35
37
 
36
- target.add_directory(directory)
38
+ target.add_directory(directory)
37
39
 
38
- target.execute(:install, *args)
40
+ target.execute(:install, *args)
41
+ end
42
+
43
+ def install_external(root, directory, *args, &block)
44
+ target = Build.top(root)
45
+
46
+ target << Targets::External.new(target, directory, &block)
47
+
48
+ target.execute(:install, *args)
49
+ end
39
50
  end
40
51
  end
41
52
  end
@@ -48,7 +48,7 @@ module Teapot
48
48
  if system(*args)
49
49
  true
50
50
  else
51
- raise CommandError.new("Non-zero exit status")
51
+ raise CommandError.new("Non-zero exit status!")
52
52
  end
53
53
  end
54
54
 
@@ -62,6 +62,14 @@ module Teapot
62
62
  # No parallel execution supported by default.
63
63
  end
64
64
 
65
+ def self.make(*args)
66
+ run("make", *args, "-j", processor_count)
67
+ end
68
+
69
+ def self.make_install
70
+ make("install")
71
+ end
72
+
65
73
  class Pool
66
74
  def initialize(options = {})
67
75
  @commands = []
@@ -22,14 +22,19 @@ require 'pathname'
22
22
  require 'rainbow'
23
23
 
24
24
  require 'teapot/target'
25
+ require 'teapot/build'
25
26
 
26
27
  module Teapot
27
- LOADER_VERSION = "0.5"
28
+ LOADER_VERSION = "0.6"
29
+ MINIMUM_LOADER_VERSION = "0.6"
28
30
 
29
31
  class IncompatibleTeapot < StandardError
30
32
  end
31
33
 
32
34
  class Loader
35
+ # Provides install_directory and install_external methods
36
+ include Build::Helpers
37
+
33
38
  def initialize(context, package)
34
39
  @context = context
35
40
  @package = package
@@ -43,17 +48,18 @@ module Teapot
43
48
  attr :version
44
49
 
45
50
  def required_version(version)
46
- if version <= LOADER_VERSION
51
+ if version >= MINIMUM_LOADER_VERSION && version <= LOADER_VERSION
47
52
  @version = version
48
53
  else
49
- raise IncompatibleTeapot.new("Version #{version} more recent than #{LOADER_VERSION}!")
54
+ raise IncompatibleTeapot.new("Version #{version} isn't compatible with current loader!\n" \
55
+ "Minimum supported version: #{MINIMUM_LOADER_VERSION}; Current version: #{LOADER_VERSION}.")
50
56
  end
51
57
  end
52
58
 
53
59
  def define_target(*args, &block)
54
60
  target = Target.new(@context, @package, *args)
55
61
 
56
- yield(target)
62
+ yield target
57
63
 
58
64
  @context.targets[target.name] = target
59
65
 
@@ -83,7 +83,7 @@ module Teapot
83
83
  @conflicts = {}
84
84
 
85
85
  @dependencies.each do |dependency|
86
- expand(dependency, nil)
86
+ expand(dependency, "<top>")
87
87
  end
88
88
  end
89
89
 
@@ -52,23 +52,5 @@ module Teapot
52
52
  def self.system_environment(env = ENV)
53
53
  self.new(Hash[env.map{|key, value| [key.downcase.to_sym, value]}])
54
54
  end
55
-
56
- # Apply the environment to the current process temporarily:
57
- def use(options = {}, &block)
58
- # Flatten the environment to a hash:
59
- values = flatten
60
-
61
- # Convert the hash to suit typical shell specific arguments:
62
- build_environment = System::convert_to_shell(values)
63
-
64
- # Show the environment to the user:
65
- System::dump(build_environment)
66
-
67
- Dir.chdir(options[:in] || ".") do
68
- RExec.env(build_environment) do
69
- block.call(Environment::Evaluator.new(values))
70
- end
71
- end
72
- end
73
55
  end
74
56
  end
@@ -22,4 +22,4 @@ require 'teapot/environment/base'
22
22
  require 'teapot/environment/constructor'
23
23
  require 'teapot/environment/evaluator'
24
24
  require 'teapot/environment/flatten'
25
- require 'teapot/environment/system'
25
+ require 'teapot/environment/system'
data/lib/teapot/target.rb CHANGED
@@ -64,7 +64,7 @@ module Teapot
64
64
  # The base configuration environment:
65
65
  environments << context.config.environment
66
66
 
67
- # The dependencies environments':
67
+ # Calculate the dependency chain's ordered environments:
68
68
  environments += chain.provisions.collect do |provision|
69
69
  Environment.new(&provision.value)
70
70
  end
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Teapot
22
- VERSION = "0.5.1"
22
+ VERSION = "0.6.0"
23
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teapot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-09 00:00:00.000000000 Z
12
+ date: 2013-02-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rainbow
@@ -101,6 +101,7 @@ files:
101
101
  - lib/teapot/build/targets/compiler.rb
102
102
  - lib/teapot/build/targets/directory.rb
103
103
  - lib/teapot/build/targets/executable.rb
104
+ - lib/teapot/build/targets/external.rb
104
105
  - lib/teapot/build/targets/files.rb
105
106
  - lib/teapot/build/targets/library.rb
106
107
  - lib/teapot/commands.rb
@@ -133,7 +134,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
133
134
  version: '0'
134
135
  segments:
135
136
  - 0
136
- hash: -2634400056080350506
137
+ hash: -3435379409085677514
137
138
  required_rubygems_version: !ruby/object:Gem::Requirement
138
139
  none: false
139
140
  requirements:
@@ -142,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
143
  version: '0'
143
144
  segments:
144
145
  - 0
145
- hash: -2634400056080350506
146
+ hash: -3435379409085677514
146
147
  requirements: []
147
148
  rubyforge_project:
148
149
  rubygems_version: 1.8.24