crate 0.1.1
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.
- data/HISTORY +9 -0
- data/LICENSE +13 -0
- data/README +39 -0
- data/bin/crate +9 -0
- data/data/Makefile +5 -0
- data/data/Rakefile +77 -0
- data/data/application.rb +47 -0
- data/data/crate_boot.c +219 -0
- data/data/recipes/amalgalite/amalgalite.rake +7 -0
- data/data/recipes/arrayfields/arrayfields.rake +7 -0
- data/data/recipes/configuration/configuration.rake +7 -0
- data/data/recipes/openssl/openssl.rake +20 -0
- data/data/recipes/ruby/ext-extmk.rb.patch +33 -0
- data/data/recipes/ruby/ruby.rake +30 -0
- data/data/recipes/rubygems/rubygems.rake +19 -0
- data/data/recipes/zlib/zlib.rake +16 -0
- data/gemspec.rb +47 -0
- data/lib/crate.rb +85 -0
- data/lib/crate/dependency.rb +306 -0
- data/lib/crate/digest.rb +36 -0
- data/lib/crate/gem_integration.rb +91 -0
- data/lib/crate/main.rb +173 -0
- data/lib/crate/packing_list.rb +16 -0
- data/lib/crate/project.rb +255 -0
- data/lib/crate/ruby.rb +98 -0
- data/lib/crate/utils.rb +74 -0
- data/lib/crate/version.rb +26 -0
- data/spec/crate_spec.rb +16 -0
- data/spec/spec_helper.rb +5 -0
- data/tasks/announce.rake +38 -0
- data/tasks/config.rb +98 -0
- data/tasks/distribution.rake +46 -0
- data/tasks/documentation.rake +31 -0
- data/tasks/rspec.rake +29 -0
- data/tasks/rubyforge.rake +59 -0
- data/tasks/utils.rb +80 -0
- metadata +160 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
#
|
2
|
+
# Crate recipe for openssl
|
3
|
+
#
|
4
|
+
Crate::Dependency.new("openssl", "0.9.8i") do |t|
|
5
|
+
t.depends_on( "zlib" )
|
6
|
+
t.upstream_source = "http://www.openssl.org/source/openssl-0.9.8i.tar.gz"
|
7
|
+
t.upstream_sha1 = "b2e029cfb68bf32eae997d60317a40945db5a65f"
|
8
|
+
|
9
|
+
t.build_commands = [
|
10
|
+
"./config --prefix=#{File.join( '/', 'usr' )} zlib no-threads no-shared",
|
11
|
+
"make"
|
12
|
+
]
|
13
|
+
|
14
|
+
t.install_commands = [
|
15
|
+
"make install_sw INSTALL_PREFIX=#{t.install_dir}" ,
|
16
|
+
"make clean"
|
17
|
+
]
|
18
|
+
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
* Make sure selected .a files in the current build directory are appended to
|
2
|
+
the build path.
|
3
|
+
* run ranlib on all .a files so they actually link correctly
|
4
|
+
|
5
|
+
--- ext/extmk.rb
|
6
|
+
+++ ext/extmk.rb
|
7
|
+
@@ -500,6 +500,7 @@ void Init_ext _((void))\n{\n#$extinit}
|
8
|
+
end
|
9
|
+
|
10
|
+
$extobjs = "ext/#{extinit.o} #{$extobjs}"
|
11
|
+
+ $extobjs = "#{$extobjs} libz.a libcrypto.a libssl.a"
|
12
|
+
if RUBY_PLATFORM =~ /m68k-human|beos/
|
13
|
+
$extflags.delete("-L/usr/local/lib")
|
14
|
+
end
|
15
|
+
@@ -513,9 +514,17 @@ void Init_ext _((void))\n{\n#$extinit}
|
16
|
+
].map {|n, v|
|
17
|
+
"#{n}=#{v}" if v and !(v = v.strip).empty?
|
18
|
+
}.compact
|
19
|
+
- puts conf
|
20
|
+
$stdout.flush
|
21
|
+
$mflags.concat(conf)
|
22
|
+
+ unless enable_config("shared", $enable_shared )
|
23
|
+
+ $extobjs.split.each do |eo|
|
24
|
+
+ if eo =~/^ext/ and eo =~ /\.a$/ then
|
25
|
+
+ local_f = eo[4..-1]
|
26
|
+
+ puts "ranlib #{local_f}"
|
27
|
+
+ %x[ ranlib #{local_f} ]
|
28
|
+
+ end
|
29
|
+
+ end
|
30
|
+
+ end
|
31
|
+
else
|
32
|
+
FileUtils.rm_f(extinit.to_a)
|
33
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#
|
2
|
+
# Crate recipe for ruby version 1.2.3
|
3
|
+
#
|
4
|
+
Crate::Ruby.new( "ruby", "1.8.6-p287") do |t|
|
5
|
+
t.depends_on( "openssl" )
|
6
|
+
t.depends_on( "zlib" )
|
7
|
+
|
8
|
+
t.integrates( "amalgalite" )
|
9
|
+
t.integrates( "arrayfields" )
|
10
|
+
t.integrates( "configuration" )
|
11
|
+
|
12
|
+
t.upstream_source = "ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.tar.gz"
|
13
|
+
t.upstream_md5 = "f6cd51001534ced5375339707a757556"
|
14
|
+
|
15
|
+
ENV["CPPFLAGS"]= "-I#{File.join( t.install_dir, 'usr', 'include')}"
|
16
|
+
ENV["LDFLAGS"] = "-L#{File.join( t.install_dir, 'usr', 'lib' )}"
|
17
|
+
|
18
|
+
def t.build
|
19
|
+
# put the .a files from the fakeroot/usr/lib directory into the package
|
20
|
+
# directory so the compilation can use them
|
21
|
+
%w[ libz.a libcrypto.a libssl.a ].each do |f|
|
22
|
+
FileUtils.cp File.join( install_dir, "usr", "lib", f ), pkg_dir
|
23
|
+
end
|
24
|
+
sh "./configure --disable-shared --prefix=#{File.join( '/', 'usr' )}"
|
25
|
+
sh "make"
|
26
|
+
end
|
27
|
+
|
28
|
+
t.install_commands << "make install DESTDIR=#{t.install_dir}"
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Crate recipe for rubygems version 1.3.1
|
3
|
+
#
|
4
|
+
Crate::Dependency.new( "rubygems", "1.3.1") do |t|
|
5
|
+
t.upstream_source = "http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz"
|
6
|
+
t.upstream_sha1 = "a21ae466146bffb28ece05cddbdced0b908ca74f"
|
7
|
+
|
8
|
+
# TODO: figure out proper integration of rubygems, or just wait until 1.9
|
9
|
+
#namespace t.name do
|
10
|
+
# desc "Integrate with ruby"
|
11
|
+
# task :integration => [ "ruby:patch", "#{t.name}:patch" ] do
|
12
|
+
# t.logger.info "Integrating #{t.name} into ruby's tree"
|
13
|
+
# Dir.chdir( File.join( t.pkg_dir, "lib" ) ) do |d|
|
14
|
+
# FileUtils.cp_r ".", Crate.ruby.lib_dir
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#end
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#
|
2
|
+
# Crate recipe for zlib version 1.2.3
|
3
|
+
#
|
4
|
+
Crate::Dependency.new( "zlib", "1.2.3") do |t|
|
5
|
+
t.upstream_source = "http://www.zlib.net/zlib-1.2.3.tar.gz"
|
6
|
+
t.upstream_md5 = "debc62758716a169df9f62e6ab2bc634"
|
7
|
+
|
8
|
+
t.build_commands << "./configure --prefix=#{File.join( '/', 'usr' )}"
|
9
|
+
|
10
|
+
t.install_commands = [
|
11
|
+
"make install prefix=#{File.join( t.install_dir, 'usr' )}",
|
12
|
+
"make distclean"
|
13
|
+
]
|
14
|
+
|
15
|
+
end
|
16
|
+
|
data/gemspec.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'crate/version'
|
3
|
+
require 'tasks/config'
|
4
|
+
|
5
|
+
Crate::GEM_SPEC = Gem::Specification.new do |spec|
|
6
|
+
proj = Configuration.for('project')
|
7
|
+
spec.name = proj.name
|
8
|
+
spec.version = Crate::VERSION
|
9
|
+
|
10
|
+
spec.author = proj.author
|
11
|
+
spec.email = proj.email
|
12
|
+
spec.homepage = proj.homepage
|
13
|
+
spec.summary = proj.summary
|
14
|
+
spec.description = proj.description
|
15
|
+
spec.platform = Gem::Platform::RUBY
|
16
|
+
|
17
|
+
|
18
|
+
pkg = Configuration.for('packaging')
|
19
|
+
spec.files = pkg.files.all
|
20
|
+
spec.executables = pkg.files.bin.collect { |b| File.basename(b) }
|
21
|
+
|
22
|
+
# add dependencies here
|
23
|
+
spec.add_dependency("rake", ">= 0.8.1")
|
24
|
+
spec.add_dependency("configuration", "~> 0.0.5")
|
25
|
+
spec.add_dependency("progressbar")
|
26
|
+
spec.add_dependency("archive-tar-minitar")
|
27
|
+
spec.add_dependency("amalgalite", "~> 0.5.0")
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
if rdoc = Configuration.for_if_exist?('rdoc') then
|
32
|
+
spec.has_rdoc = true
|
33
|
+
spec.extra_rdoc_files = pkg.files.rdoc
|
34
|
+
spec.rdoc_options = rdoc.options + [ "--main" , rdoc.main_page ]
|
35
|
+
else
|
36
|
+
spec.has_rdoc = false
|
37
|
+
end
|
38
|
+
|
39
|
+
if test = Configuration.for_if_exist?('testing') then
|
40
|
+
spec.test_files = test.files
|
41
|
+
end
|
42
|
+
|
43
|
+
if rf = Configuration.for_if_exist?('rubyforge') then
|
44
|
+
spec.rubyforge_project = rf.project
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/lib/crate.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008 Jeremy Hinegardner
|
3
|
+
# All rights reserved. See LICENSE and/or COPYING for details.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
require 'logging'
|
8
|
+
require 'date'
|
9
|
+
|
10
|
+
# Configure Crate to log to STDOUT at the 'info' level
|
11
|
+
Logging::Logger['Crate'].level = :info
|
12
|
+
Logging::Logger['Crate'].add_appenders( Logging::Appender.stdout )
|
13
|
+
Logging::Appender.stdout.layout = Logging::Layouts::Pattern.new(
|
14
|
+
:pattern => "[%d] %5l: %m\n", # [date] LEVEL: message
|
15
|
+
:date_pattern => "%H:%M:%S" # date == HH::MM::SS
|
16
|
+
)
|
17
|
+
|
18
|
+
module Crate
|
19
|
+
|
20
|
+
# The root directory of the project is considered to be the parent directory
|
21
|
+
# of the 'lib' directory.
|
22
|
+
#
|
23
|
+
# returns:: [String] The full expanded path of the parent directory of 'lib'
|
24
|
+
# going up the path from the current file. Trailing
|
25
|
+
# File::SEPARATOR is guaranteed.
|
26
|
+
#
|
27
|
+
def self.root_dir
|
28
|
+
unless @root_dir
|
29
|
+
path_parts = ::File.expand_path(__FILE__).split(::File::SEPARATOR)
|
30
|
+
lib_index = path_parts.rindex("lib")
|
31
|
+
@root_dir = path_parts[0...lib_index].join(::File::SEPARATOR) + ::File::SEPARATOR
|
32
|
+
end
|
33
|
+
return @root_dir
|
34
|
+
end
|
35
|
+
|
36
|
+
# returns:: [String] The full expanded path of the +config+ directory
|
37
|
+
# below _root_dir_. All parameters passed in are joined onto the
|
38
|
+
# result. Trailing File::SEPARATOR is guaranteed if _args_ are
|
39
|
+
# *not* present.
|
40
|
+
#
|
41
|
+
def self.config_path(*args)
|
42
|
+
self.sub_path("config", *args)
|
43
|
+
end
|
44
|
+
|
45
|
+
# returns:: [String] The full expanded path of the +data+ directory below
|
46
|
+
# _root_dir_. All parameters passed in are joined onto the
|
47
|
+
# result. Trailing File::SEPARATOR is guaranteed if
|
48
|
+
# _*args_ are *not* present.
|
49
|
+
#
|
50
|
+
def self.data_path(*args)
|
51
|
+
self.sub_path("data", *args)
|
52
|
+
end
|
53
|
+
|
54
|
+
# returns:: [String] The full expanded path of the +lib+ directory below
|
55
|
+
# _root_dir_. All parameters passed in are joined onto the
|
56
|
+
# result. Trailing File::SEPARATOR is guaranteed if
|
57
|
+
# _*args_ are *not* present.
|
58
|
+
#
|
59
|
+
def self.lib_path(*args)
|
60
|
+
self.sub_path("lib", *args)
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.sub_path(sub,*args)
|
64
|
+
sp = ::File.join(root_dir, sub) + File::SEPARATOR
|
65
|
+
sp = ::File.join(sp, *args) if args
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.project
|
69
|
+
@project
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.project=( p )
|
73
|
+
@project = p
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.ruby
|
77
|
+
@ruby
|
78
|
+
end
|
79
|
+
def self.ruby=( r )
|
80
|
+
@ruby = r
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
%w[ version packing_list utils dependency gem_integration ruby project ].each { |r| require "crate/#{r}" }
|
85
|
+
|
@@ -0,0 +1,306 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
require 'rake/clean'
|
4
|
+
require 'crate/utils'
|
5
|
+
require 'crate/digest'
|
6
|
+
|
7
|
+
module Crate
|
8
|
+
# Create a build task that will download, checksum and build and install an
|
9
|
+
# upstream source
|
10
|
+
#
|
11
|
+
# This task will create the following targets:
|
12
|
+
#
|
13
|
+
class Dependency < ::Rake::TaskLib
|
14
|
+
include ::Crate::Utils
|
15
|
+
# Name of the task, this is also the Rake namespace underwhich all other
|
16
|
+
# tasks will follow
|
17
|
+
attr_accessor :name
|
18
|
+
|
19
|
+
# Version of the upstream version
|
20
|
+
attr_accessor :version
|
21
|
+
|
22
|
+
# Upstream location
|
23
|
+
attr_accessor :upstream_source
|
24
|
+
|
25
|
+
# array of shell commands for building
|
26
|
+
attr_accessor :build_commands
|
27
|
+
|
28
|
+
# array of shell commands for installing
|
29
|
+
attr_accessor :install_commands
|
30
|
+
|
31
|
+
#
|
32
|
+
# Create a Crate Dependency with the given name and version
|
33
|
+
#
|
34
|
+
def initialize( name = nil, version = nil )
|
35
|
+
@name = name
|
36
|
+
@version = version
|
37
|
+
@install_commands = []
|
38
|
+
@build_commands = []
|
39
|
+
yield self if block_given?
|
40
|
+
@upstream_source = URI.parse( @upstream_source )
|
41
|
+
define unless name.nil? or version.nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# The build directory for this particular task
|
46
|
+
#
|
47
|
+
def build_dir
|
48
|
+
@build_dir ||= File.join(Crate.project.build_dir, name )
|
49
|
+
end
|
50
|
+
|
51
|
+
#
|
52
|
+
# The recipe directory for this particular task
|
53
|
+
#
|
54
|
+
def recipe_dir
|
55
|
+
@recipe_dir ||= File.join( Crate.project.recipe_dir, name )
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# The fake root directory to install into
|
60
|
+
#
|
61
|
+
def install_dir
|
62
|
+
Crate.project.install_dir
|
63
|
+
end
|
64
|
+
|
65
|
+
#
|
66
|
+
# handle to the top level logger
|
67
|
+
#
|
68
|
+
def logger
|
69
|
+
Crate.project.logger
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# The directory this task unpacks into
|
74
|
+
#
|
75
|
+
def pkg_dir
|
76
|
+
@pkg_dir ||= File.join( self.build_dir, "#{name + ( version ? "-#{version}" : "" ) }" )
|
77
|
+
end
|
78
|
+
|
79
|
+
#
|
80
|
+
# override the directory that the local source unpacks into if it is not
|
81
|
+
# +name-version+
|
82
|
+
#
|
83
|
+
def pkg_dir=( pd )
|
84
|
+
@pkg_dir = File.join( self.build_dir, pd )
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# The local on disk copy of the upstream source
|
89
|
+
#
|
90
|
+
def local_source
|
91
|
+
@local_source ||= File.join( build_dir, File.basename( upstream_source.path ) )
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# record the upstream sha1 checksum
|
96
|
+
#
|
97
|
+
def upstream_sha1=( checksum )
|
98
|
+
@digest = Crate::Digest.sha1( checksum )
|
99
|
+
end
|
100
|
+
def upstream_sha1
|
101
|
+
if @digest then
|
102
|
+
return @digest.hex
|
103
|
+
else
|
104
|
+
return nil
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
#
|
109
|
+
# record the upstream md5 checksum
|
110
|
+
#
|
111
|
+
def upstream_md5=( checksum )
|
112
|
+
@digest = Crate::Digest.md5( checksum )
|
113
|
+
end
|
114
|
+
def usptream_md5
|
115
|
+
if @digest then
|
116
|
+
return @digest.hex
|
117
|
+
else
|
118
|
+
return nil
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
#
|
123
|
+
# Define all the tasks in the namespace of the +name+ of this task.
|
124
|
+
#
|
125
|
+
# The dependency chain is:
|
126
|
+
#
|
127
|
+
# :install => :build => :patch => :unpack => :verify => :download
|
128
|
+
#
|
129
|
+
#
|
130
|
+
def define
|
131
|
+
logger.debug "Defining tasks for #{name} #{version}"
|
132
|
+
|
133
|
+
namespace "#{name}" do
|
134
|
+
define_download
|
135
|
+
define_verify
|
136
|
+
define_unpack
|
137
|
+
define_patch
|
138
|
+
define_build
|
139
|
+
define_install
|
140
|
+
|
141
|
+
task :done => "#{name}:install"
|
142
|
+
task :default => "#{name}:done"
|
143
|
+
end
|
144
|
+
|
145
|
+
desc "Build and Install #{name} #{version}"
|
146
|
+
task name => "#{name}:default"
|
147
|
+
end
|
148
|
+
|
149
|
+
def define_download
|
150
|
+
file local_source do |t|
|
151
|
+
logger.info "Downloading #{upstream_source} to #{t.name}"
|
152
|
+
download( upstream_source, t.name )
|
153
|
+
end
|
154
|
+
|
155
|
+
desc "Download #{File.basename( local_source )}"
|
156
|
+
task :download => local_source
|
157
|
+
end
|
158
|
+
|
159
|
+
def define_verify
|
160
|
+
desc "Verify source against its checksum"
|
161
|
+
task :verify => "#{name}:download" do
|
162
|
+
if @digenst then
|
163
|
+
if @digest.valid?( local_source ) then
|
164
|
+
logger.info "#{local_source} validates against #{@digest.hex}"
|
165
|
+
else
|
166
|
+
raise "#{local_source} does not have checksum #{@digest.hex}"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def define_unpack
|
173
|
+
#-- unpack
|
174
|
+
desc "Unpack #{name} into #{build_dir}"
|
175
|
+
task :unpack => "#{name}:verify" do
|
176
|
+
logger.info "Unpacking"
|
177
|
+
unpack( local_source, build_dir )
|
178
|
+
FileUtils.rm_f dotfile( 'patch' )
|
179
|
+
end
|
180
|
+
::CLEAN << pkg_dir
|
181
|
+
end
|
182
|
+
|
183
|
+
def define_patch
|
184
|
+
desc "Apply patches to #{name}"
|
185
|
+
task :patch => dotfile( 'patch' ) do
|
186
|
+
logger.info "#{name} #{version} is patched"
|
187
|
+
end
|
188
|
+
file dotfile( 'patch' ) => "#{name}:unpack" do
|
189
|
+
logger.info "Patching #{name} #{version}"
|
190
|
+
patch_files.each do |pfile|
|
191
|
+
logger.info "applying patch #{File.basename( pfile ) }"
|
192
|
+
apply_patch( pfile, pkg_dir )
|
193
|
+
end
|
194
|
+
dotfile!( 'patch' )
|
195
|
+
end
|
196
|
+
|
197
|
+
::CLEAN << dotfile( 'patch' )
|
198
|
+
end
|
199
|
+
|
200
|
+
def define_build
|
201
|
+
desc "Build #{name} #{version}"
|
202
|
+
task :build => dotfile( 'build' ) do
|
203
|
+
logger.info "#{name} #{version} built"
|
204
|
+
end
|
205
|
+
|
206
|
+
file dotfile( 'build' ) => "#{name}:patch" do
|
207
|
+
logger.info "Bulding #{name} #{version}"
|
208
|
+
Dir.chdir( pkg_dir ) do
|
209
|
+
build
|
210
|
+
end
|
211
|
+
dotfile!( 'build' )
|
212
|
+
end
|
213
|
+
::CLEAN << dotfile( 'build' )
|
214
|
+
end
|
215
|
+
|
216
|
+
def define_install
|
217
|
+
desc "Install #{name} into #{Crate.project.install_dir}"
|
218
|
+
task :install => dotfile('install') do
|
219
|
+
logger.info "#{name} #{version} is installed"
|
220
|
+
end
|
221
|
+
|
222
|
+
file dotfile( 'install' ) => "#{name}:build" do
|
223
|
+
logger.info "Installing #{name} #{version}"
|
224
|
+
Dir.chdir( pkg_dir ) do
|
225
|
+
install
|
226
|
+
end
|
227
|
+
dotfile!( 'install' )
|
228
|
+
end
|
229
|
+
::CLEAN << dotfile( 'install' )
|
230
|
+
|
231
|
+
end
|
232
|
+
|
233
|
+
|
234
|
+
#
|
235
|
+
# Execute all the build commands
|
236
|
+
#
|
237
|
+
def build
|
238
|
+
cd_and_sh( pkg_dir, build_commands )
|
239
|
+
end
|
240
|
+
|
241
|
+
#
|
242
|
+
# Execute all the install commands
|
243
|
+
#
|
244
|
+
def install
|
245
|
+
cd_and_sh( pkg_dir, install_commands )
|
246
|
+
end
|
247
|
+
|
248
|
+
#
|
249
|
+
# Change to a directory and execute a sequence of commands
|
250
|
+
#
|
251
|
+
def cd_and_sh( dir, cmds )
|
252
|
+
Dir.chdir( dir ) do
|
253
|
+
cmds.each do |cmd|
|
254
|
+
sh cmd
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
#
|
260
|
+
# Execute a shell command, sending the command name to the logger at info
|
261
|
+
# level and all the output to the logger at the debug level
|
262
|
+
#
|
263
|
+
def sh( cmd )
|
264
|
+
logger.info( cmd )
|
265
|
+
|
266
|
+
io = IO.popen( "#{cmd} 2>&1" )
|
267
|
+
io.each_line do |l|
|
268
|
+
logger.debug( l.strip )
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
#
|
273
|
+
# return the full path to a named dotfile
|
274
|
+
#
|
275
|
+
def dotfile( name )
|
276
|
+
File.join( build_dir, ".#{name}" )
|
277
|
+
end
|
278
|
+
|
279
|
+
#
|
280
|
+
# make the given dotfile
|
281
|
+
#
|
282
|
+
def dotfile!( name )
|
283
|
+
File.open( dotfile( name ), "w" ) do |f|
|
284
|
+
h = { 'name' => self.name, 'version' => self.version, "#{name}_timestsamp" => Time.now }
|
285
|
+
f.puts h.to_yaml
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
#
|
290
|
+
# allow this task to say it depends on something else. This is a build
|
291
|
+
# dependency
|
292
|
+
#
|
293
|
+
def depends_on( other_dependency )
|
294
|
+
namespace name do
|
295
|
+
task :build => "#{other_dependency}:done"
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
#
|
300
|
+
# patch the upacked source with files that are in the recipe directory
|
301
|
+
#
|
302
|
+
def patch_files
|
303
|
+
Dir[File.join( recipe_dir, "*.patch" )].sort
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|