mini_portile 0.1.0 → 0.2.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.
- data/History.txt +12 -0
- data/README.rdoc +24 -8
- data/Rakefile +3 -3
- data/examples/Rakefile +47 -0
- data/lib/mini_portile.rb +46 -13
- metadata +7 -8
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
=== 0.2.0 / 2011-04-05
|
2
|
+
|
3
|
+
* Enhancements:
|
4
|
+
* Improve tar detection
|
5
|
+
* Improve and refactor configure_options
|
6
|
+
* Detect configure_options changes. Closes GH-1
|
7
|
+
* Add recipe examples
|
8
|
+
|
9
|
+
* Bugfixes:
|
10
|
+
* MiniPortile#target can be changed now. Closes GH-2
|
11
|
+
* Always redirect tar output properly
|
12
|
+
|
1
13
|
=== 0.1.0 / 2011-03-08
|
2
14
|
|
3
15
|
* Initial release. Welcome to this world!
|
data/README.rdoc
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
* {Source Code}[https://github.com/luislavena/mini_portile]
|
4
4
|
* {Bug Reports}[https://github.com/luislavena/mini_portile/issues]
|
5
5
|
|
6
|
-
This project is a minimalistic, simplistic and stupid implementation of a port
|
7
|
-
|
6
|
+
This project is a minimalistic, simplistic and stupid implementation of a port/recipe
|
7
|
+
system <b>for developers</b>.
|
8
8
|
|
9
9
|
== Another port system, srsly?
|
10
10
|
|
@@ -103,15 +103,16 @@ task depends on MiniPortile compilation and most important, activation.
|
|
103
103
|
Take the following as a simplification of how you can use MiniPortile with
|
104
104
|
Rake:
|
105
105
|
|
106
|
-
|
106
|
+
task :libiconv do
|
107
107
|
recipe = MiniPortile.new("libiconv", "1.13.1")
|
108
108
|
recipe.files = ["http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz"]
|
109
|
-
recipe.
|
110
|
-
|
111
|
-
|
109
|
+
checkpoint = ".#{recipe.name}-#{recipe.version}.installed"
|
110
|
+
|
111
|
+
unless File.exist?(checkpoint)
|
112
|
+
recipe.cook
|
113
|
+
touch checkpoint
|
114
|
+
end
|
112
115
|
|
113
|
-
task :libiconv => [".libiconv.1.13.1.installed"] do
|
114
|
-
recipe = MiniPortile.new("libiconv", "1.13.1")
|
115
116
|
recipe.activate
|
116
117
|
end
|
117
118
|
|
@@ -128,6 +129,21 @@ This example will:
|
|
128
129
|
For your homework, you can make libiconv version be taken from <tt>ENV</tt>
|
129
130
|
variables.
|
130
131
|
|
132
|
+
=== Native or cross-compilation
|
133
|
+
|
134
|
+
Above examples cover the normal use case: compile support libraries natively.
|
135
|
+
|
136
|
+
MiniPortile also covers another use case, which is the cross-compilation of the
|
137
|
+
support libraries to be used as part of a binary gem compilation.
|
138
|
+
|
139
|
+
It is the perfect complementary tool for rake-compiler and it's <tt>cross</tt>
|
140
|
+
Rake task.
|
141
|
+
|
142
|
+
Depending on your usage of rake-compiler, you will need to use <tt>host</tt> to
|
143
|
+
match the installed cross-compiler toolchain.
|
144
|
+
|
145
|
+
Please refer to the examples directory for simplified and practical usage.
|
146
|
+
|
131
147
|
=== Supported scenarios
|
132
148
|
|
133
149
|
As mentioned before, MiniPortile requires a GCC compiler toolchain. This has
|
data/Rakefile
CHANGED
@@ -4,12 +4,12 @@ require "rubygems/package_task"
|
|
4
4
|
GEM_SPEC = Gem::Specification.new do |s|
|
5
5
|
# basic information
|
6
6
|
s.name = "mini_portile"
|
7
|
-
s.version = "0.
|
7
|
+
s.version = "0.2.0"
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
|
10
10
|
# description and details
|
11
11
|
s.summary = "Simplistic port-like solution for developers"
|
12
|
-
s.description = "
|
12
|
+
s.description = "Simplistic port-like solution for developers. It provides a standard and simplified way to compile against dependency libraries without messing up your system."
|
13
13
|
|
14
14
|
# requirements
|
15
15
|
s.required_ruby_version = ">= 1.8.6"
|
@@ -19,7 +19,7 @@ GEM_SPEC = Gem::Specification.new do |s|
|
|
19
19
|
# development dependencies (add_development_dependency)
|
20
20
|
|
21
21
|
# components, files and paths
|
22
|
-
s.files = FileList["lib/**/*.rb", "Rakefile", "*.{rdoc,txt}"]
|
22
|
+
s.files = FileList["examples/Rakefile", "lib/**/*.rb", "Rakefile", "*.{rdoc,txt}"]
|
23
23
|
|
24
24
|
s.require_path = 'lib'
|
25
25
|
|
data/examples/Rakefile
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.expand_path("mini_portile", File.join(File.dirname(__FILE__), "../lib"))
|
2
|
+
|
3
|
+
$recipes = {}
|
4
|
+
|
5
|
+
ICONV_VERSION = "1.13.1"
|
6
|
+
$recipes[:libiconv] = MiniPortile.new "libiconv", ICONV_VERSION
|
7
|
+
$recipes[:libiconv].files << "http://ftp.gnu.org/pub/gnu/libiconv/libiconv-#{ICONV_VERSION}.tar.gz"
|
8
|
+
|
9
|
+
$recipes[:sqlite3] = MiniPortile.new "sqlite3", "3.7.5"
|
10
|
+
$recipes[:sqlite3].files << "http://sqlite.org/sqlite-autoconf-3070500.tar.gz"
|
11
|
+
|
12
|
+
namespace :ports do
|
13
|
+
directory "ports"
|
14
|
+
|
15
|
+
desc "Install port libiconv #{ICONV_VERSION}"
|
16
|
+
task :libiconv => ["ports"] do |t|
|
17
|
+
recipe = $recipes[:libiconv]
|
18
|
+
checkpoint = "ports/.#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
|
19
|
+
|
20
|
+
unless File.exist?(checkpoint)
|
21
|
+
recipe.cook
|
22
|
+
touch checkpoint
|
23
|
+
end
|
24
|
+
|
25
|
+
recipe.activate
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Install port sqlite3 #{$recipes[:sqlite3].version}"
|
29
|
+
task :sqlite3 => ["ports"] do |t|
|
30
|
+
recipe = $recipes[:sqlite3]
|
31
|
+
checkpoint = "ports/.#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
|
32
|
+
|
33
|
+
unless File.exist?(checkpoint)
|
34
|
+
recipe.cook
|
35
|
+
touch checkpoint
|
36
|
+
end
|
37
|
+
|
38
|
+
recipe.activate
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "Adjust all recipes host for cross-compilation"
|
43
|
+
task :cross do
|
44
|
+
$recipes.each do |_, recipe|
|
45
|
+
recipe.host = "i686-w64-mingw32"
|
46
|
+
end
|
47
|
+
end
|
data/lib/mini_portile.rb
CHANGED
@@ -2,10 +2,12 @@ require 'rbconfig'
|
|
2
2
|
require 'net/http'
|
3
3
|
require 'fileutils'
|
4
4
|
require 'tempfile'
|
5
|
+
require 'digest/md5'
|
5
6
|
|
6
7
|
class MiniPortile
|
7
|
-
attr_reader :name, :version
|
8
|
-
|
8
|
+
attr_reader :name, :version
|
9
|
+
attr_writer :configure_options
|
10
|
+
attr_accessor :host, :files, :target, :logger
|
9
11
|
|
10
12
|
def initialize(name, version)
|
11
13
|
@name = name
|
@@ -13,7 +15,6 @@ class MiniPortile
|
|
13
15
|
@target = 'ports'
|
14
16
|
@files = []
|
15
17
|
@logger = STDOUT
|
16
|
-
@config_options = []
|
17
18
|
|
18
19
|
@host = RbConfig::CONFIG['arch']
|
19
20
|
end
|
@@ -32,18 +33,18 @@ class MiniPortile
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
36
|
+
def configure_options
|
37
|
+
@configure_options ||= configure_defaults
|
38
|
+
end
|
39
|
+
|
35
40
|
def configure
|
36
41
|
return if configured?
|
37
42
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
"--enable-static", # build static library
|
42
|
-
"--host=#{@host}", # build for specific target (host)
|
43
|
-
"--prefix=#{prefix}" # installation target
|
44
|
-
].concat(@config_options).join(' ')
|
43
|
+
md5_file = File.join(tmp_path, 'configure.md5')
|
44
|
+
digest = Digest::MD5.hexdigest(computed_options)
|
45
|
+
File.open(md5_file, "w") { |f| f.write digest }
|
45
46
|
|
46
|
-
execute('configure', %Q(sh configure #{
|
47
|
+
execute('configure', %Q(sh configure #{computed_options}))
|
47
48
|
end
|
48
49
|
|
49
50
|
def compile
|
@@ -67,8 +68,12 @@ class MiniPortile
|
|
67
68
|
def configured?
|
68
69
|
configure = File.join(work_path, 'configure')
|
69
70
|
makefile = File.join(work_path, 'Makefile')
|
71
|
+
md5_file = File.join(tmp_path, 'configure.md5')
|
70
72
|
|
71
|
-
|
73
|
+
stored_md5 = File.exist?(md5_file) ? File.read(md5_file) : ""
|
74
|
+
current_md5 = Digest::MD5.hexdigest(computed_options)
|
75
|
+
|
76
|
+
(current_md5 == stored_md5) && newer?(makefile, configure)
|
72
77
|
end
|
73
78
|
|
74
79
|
def installed?
|
@@ -131,16 +136,44 @@ private
|
|
131
136
|
end
|
132
137
|
end
|
133
138
|
|
139
|
+
def configure_defaults
|
140
|
+
[
|
141
|
+
"--host=#{@host}", # build for specific target (host)
|
142
|
+
"--enable-static", # build static library
|
143
|
+
"--disable-shared" # disable generation of shared object
|
144
|
+
]
|
145
|
+
end
|
146
|
+
|
147
|
+
def configure_prefix
|
148
|
+
"--prefix=#{File.expand_path(port_path)}"
|
149
|
+
end
|
150
|
+
|
151
|
+
def computed_options
|
152
|
+
[
|
153
|
+
configure_options, # customized or default options
|
154
|
+
configure_prefix, # installation target
|
155
|
+
].flatten.join(' ')
|
156
|
+
end
|
157
|
+
|
134
158
|
def log_file(action)
|
135
159
|
File.join(tmp_path, "#{action}.log")
|
136
160
|
end
|
137
161
|
|
162
|
+
def tar_exe
|
163
|
+
@@tar_exe ||= begin
|
164
|
+
dev_null = RbConfig::CONFIG['host_os'] =~ /mingw|mswin/ ? 'NUL' : '/dev/null'
|
165
|
+
%w[tar bsdtar basic-bsdtar].find { |c|
|
166
|
+
system("#{c} --version >> #{dev_null} 2>&1")
|
167
|
+
}
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
138
171
|
def extract_file(file, target)
|
139
172
|
filename = File.basename(file)
|
140
173
|
FileUtils.mkdir_p target
|
141
174
|
|
142
175
|
message "Extracting #{filename} into #{target}... "
|
143
|
-
result =
|
176
|
+
result = `#{tar_exe} xf #{file} -C #{target} 2>&1`
|
144
177
|
if $?.success?
|
145
178
|
output "OK"
|
146
179
|
else
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_portile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Luis Lavena
|
@@ -15,13 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-05 00:00:00 -03:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
22
|
-
description:
|
23
|
-
Provide a standard and simplified way to build and package
|
24
|
-
Ruby extensions (C, Java) using Rake as glue.
|
22
|
+
description: Simplistic port-like solution for developers. It provides a standard and simplified way to compile against dependency libraries without messing up your system.
|
25
23
|
email: luislavena@gmail.com
|
26
24
|
executables: []
|
27
25
|
|
@@ -32,6 +30,7 @@ extra_rdoc_files:
|
|
32
30
|
- History.txt
|
33
31
|
- LICENSE.txt
|
34
32
|
files:
|
33
|
+
- examples/Rakefile
|
35
34
|
- lib/mini_portile.rb
|
36
35
|
- Rakefile
|
37
36
|
- README.rdoc
|
@@ -74,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
73
|
requirements: []
|
75
74
|
|
76
75
|
rubyforge_project:
|
77
|
-
rubygems_version: 1.
|
76
|
+
rubygems_version: 1.6.2
|
78
77
|
signing_key:
|
79
78
|
specification_version: 3
|
80
79
|
summary: Simplistic port-like solution for developers
|