build-tool 0.0.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.tar.gz.sig +3 -0
- data/History.txt +7 -0
- data/Manifest.txt +51 -0
- data/PostInstall.txt +3 -0
- data/README.rdoc +55 -0
- data/Rakefile +30 -0
- data/TODO +2 -0
- data/bin/kde-build.rb +21 -0
- data/config/website.yml +2 -0
- data/config/website.yml.sample +2 -0
- data/lib/kde-build.rb +18 -0
- data/lib/kde-build/application.rb +258 -0
- data/lib/kde-build/build_system.rb +26 -0
- data/lib/kde-build/build_system/autoconf.rb +109 -0
- data/lib/kde-build/build_system/base.rb +132 -0
- data/lib/kde-build/build_system/cmake.rb +82 -0
- data/lib/kde-build/build_system/qtcopy.rb +125 -0
- data/lib/kde-build/command.rb +30 -0
- data/lib/kde-build/command/build.rb +119 -0
- data/lib/kde-build/command/fetch.rb +28 -0
- data/lib/kde-build/command/help.rb +71 -0
- data/lib/kde-build/command/info.rb +42 -0
- data/lib/kde-build/command/version.rb +43 -0
- data/lib/kde-build/configuration.rb +186 -0
- data/lib/kde-build/exception.rb +6 -0
- data/lib/kde-build/metaaid.rb +18 -0
- data/lib/kde-build/module.rb +203 -0
- data/lib/kde-build/module_configuration.rb +107 -0
- data/lib/kde-build/moduleregistry.rb +85 -0
- data/lib/kde-build/subprocess.rb +82 -0
- data/lib/kde-build/tools/ctags.rb +34 -0
- data/lib/kde-build/tools/logging.rb +49 -0
- data/lib/kde-build/tools/make.rb +58 -0
- data/lib/kde-build/tools/ssh.rb +47 -0
- data/lib/kde-build/vcs.rb +26 -0
- data/lib/kde-build/vcs/base.rb +81 -0
- data/lib/kde-build/vcs/git-svn.rb +133 -0
- data/lib/kde-build/vcs/git.rb +96 -0
- data/lib/kde-build/vcs/svn.rb +105 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +71 -0
- data/test.yaml.tmpl +552 -0
- data/test/test_helper.rb +12 -0
- data/test/test_kde-build.rb +11 -0
- data/test/test_vcs_svn.rb +44 -0
- data/website/index.html +84 -0
- data/website/index.txt +59 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +159 -0
- data/website/template.html.erb +50 -0
- metadata +171 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class Object
|
4
|
+
|
5
|
+
# The hidden singleton lurks behind everyone
|
6
|
+
def metaclass; class << self; self; end; end
|
7
|
+
def meta_eval &blk; metaclass.instance_eval( &blk ); end
|
8
|
+
|
9
|
+
# Adds methods to a metaclass
|
10
|
+
def meta_def name, &blk
|
11
|
+
meta_eval { define_method name, &blk }
|
12
|
+
end
|
13
|
+
|
14
|
+
# Defines an instance method within a class
|
15
|
+
def class_def name, &blk
|
16
|
+
class_eval { define_method name, &blk }
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,203 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'kde-build/tools/ssh.rb'
|
4
|
+
require 'kde-build/tools/logging.rb'
|
5
|
+
|
6
|
+
module BuildTool
|
7
|
+
|
8
|
+
class ConfigureError < Exception
|
9
|
+
end
|
10
|
+
|
11
|
+
class BuildError < Exception
|
12
|
+
end
|
13
|
+
|
14
|
+
class Module
|
15
|
+
|
16
|
+
def initialize(config)
|
17
|
+
@config = config
|
18
|
+
@build_system = nil
|
19
|
+
@vcs = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def activate_ssh_key
|
23
|
+
# No key, no cookies
|
24
|
+
return if !@config.ssh_key
|
25
|
+
|
26
|
+
ssh = MJ::Tools::SSH.new
|
27
|
+
if !ssh.has_key? ssh_key
|
28
|
+
ssh.add_key(ssh_file)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def name
|
33
|
+
@config.name
|
34
|
+
end
|
35
|
+
|
36
|
+
# The build directory
|
37
|
+
def build_directory
|
38
|
+
"#{workdir}/bld/#{local_path}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def local_path
|
42
|
+
@local_path = @config.local_path || @config.remote_path
|
43
|
+
end
|
44
|
+
|
45
|
+
def build( install )
|
46
|
+
$log.info("Compiling")
|
47
|
+
rc = nil
|
48
|
+
while_logging_to( name, "50_build" ) do
|
49
|
+
rc =
|
50
|
+
if install
|
51
|
+
build_system.make( "install" )
|
52
|
+
else
|
53
|
+
build_system.make
|
54
|
+
end
|
55
|
+
|
56
|
+
if rc != 0
|
57
|
+
raise BuildError, "make returned error code #{rc}"
|
58
|
+
end
|
59
|
+
$log.info( "successfully built" )
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# The build system
|
64
|
+
def build_system
|
65
|
+
if not @build_system
|
66
|
+
if not @config.build_system
|
67
|
+
klass = BuildTool::BuildSystem::Registry.guess( source_directory )
|
68
|
+
if !klass
|
69
|
+
raise ModuleError, "Failed to guess the build system for #{name}"
|
70
|
+
end
|
71
|
+
else
|
72
|
+
klass = BuildTool::BuildSystem::get(@config.build_system.name)
|
73
|
+
end
|
74
|
+
@build_system = klass.new( self )
|
75
|
+
@build_system.configuration = @config.build_system
|
76
|
+
end
|
77
|
+
@build_system
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
def remove_build_directory
|
82
|
+
$log.info("removing #{build_directory}")
|
83
|
+
build_system.remove_build_directory
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
# Configure the module
|
88
|
+
def reconfigure( clean = false )
|
89
|
+
$log.info("Reconfiguring")
|
90
|
+
while_logging_to( name, "30_configure" ) do
|
91
|
+
if !$noop and !vcs.checkedout?
|
92
|
+
raise ConfigureError, "Module is not checked out."
|
93
|
+
end
|
94
|
+
rc = build_system.reconfigure( clean )
|
95
|
+
if rc != 0
|
96
|
+
raise ConfigureError, "configure returned error code #{rc}"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Configure the module
|
102
|
+
def configure
|
103
|
+
$log.info("configuring")
|
104
|
+
while_logging_to( name, "30_configure" ) do
|
105
|
+
if !$noop and !vcs.checkedout?
|
106
|
+
raise ConfigureError, "Module is not checked out."
|
107
|
+
end
|
108
|
+
rc = build_system.configure
|
109
|
+
if rc != 0
|
110
|
+
raise ConfigureError, "configure returned error code #{rc}"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# Is the module already configured?
|
116
|
+
def configured?
|
117
|
+
if !vcs.checkedout?
|
118
|
+
return false
|
119
|
+
end
|
120
|
+
build_system.configured?
|
121
|
+
end
|
122
|
+
|
123
|
+
def checkedout?
|
124
|
+
vcs.checkedout?
|
125
|
+
end
|
126
|
+
|
127
|
+
def env
|
128
|
+
@config.env
|
129
|
+
end
|
130
|
+
|
131
|
+
def fetch
|
132
|
+
$log.info("Fetching from #{remote_path}")
|
133
|
+
while_logging_to( name, "20_fetch" ) do
|
134
|
+
vcs.fetch
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def init
|
139
|
+
$log.info("Initializing #{local_path} from #{remote_path}")
|
140
|
+
while_logging_to( name, "10_initialize" ) do
|
141
|
+
vcs.init
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def ssh_key
|
146
|
+
return @config.ssh_key
|
147
|
+
end
|
148
|
+
|
149
|
+
def ssh_file
|
150
|
+
return @config.ssh_file
|
151
|
+
end
|
152
|
+
|
153
|
+
# The root directory for the +/bld+, +/src+ and +/log+ directories
|
154
|
+
def workdir
|
155
|
+
Application::instance.workdir
|
156
|
+
end
|
157
|
+
|
158
|
+
def rebase
|
159
|
+
$log.info("rebasing")
|
160
|
+
while_logging_to( name, "40_rebase" ) do
|
161
|
+
vcs.rebase
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# The absolute remote path
|
166
|
+
def remote_path
|
167
|
+
"#{repository}/#{@config.remote_path}"
|
168
|
+
end
|
169
|
+
|
170
|
+
# The repository url
|
171
|
+
def repository
|
172
|
+
@config.repository
|
173
|
+
end
|
174
|
+
|
175
|
+
def prefix
|
176
|
+
@config.prefix
|
177
|
+
end
|
178
|
+
|
179
|
+
# The absolute source directory.
|
180
|
+
def source_directory
|
181
|
+
"#{workdir}/src/#{local_path}"
|
182
|
+
end
|
183
|
+
|
184
|
+
# reimplement
|
185
|
+
def to_yaml_type
|
186
|
+
"!michael-jansen.biz,2009-01-01/Module"
|
187
|
+
end
|
188
|
+
|
189
|
+
# #########
|
190
|
+
# protected
|
191
|
+
# #########
|
192
|
+
|
193
|
+
def vcs
|
194
|
+
if ! @vcs
|
195
|
+
@vcs = VCS::get(@config.vcs.name).new( remote_path, source_directory )
|
196
|
+
@vcs.configuration = @config.vcs
|
197
|
+
end
|
198
|
+
@vcs
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'kde-build/configuration'
|
2
|
+
require 'kde-build/build_system'
|
3
|
+
require 'kde-build/module'
|
4
|
+
require 'kde-build/moduleregistry.rb'
|
5
|
+
require 'kde-build/vcs'
|
6
|
+
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
module BuildTool
|
10
|
+
|
11
|
+
class ModuleConfiguration
|
12
|
+
|
13
|
+
include MJ::Configuration::Configurable
|
14
|
+
|
15
|
+
option( "repository", "Remote repository url" ).
|
16
|
+
required
|
17
|
+
|
18
|
+
option( "ssh-key", "ssh-key for the repository" )
|
19
|
+
option( "ssh-file", "ssh-file for the repository" )
|
20
|
+
|
21
|
+
option( "name", "Name of the module" ).
|
22
|
+
required
|
23
|
+
|
24
|
+
option( "vcs", "VCS used for the module. # TODO" ).
|
25
|
+
on_write {
|
26
|
+
|val|
|
27
|
+
if val.instance_of?( String )
|
28
|
+
val = VCS::get( val ).config.new
|
29
|
+
elsif val.instance_of?( Array )
|
30
|
+
a = val.inject([]) {
|
31
|
+
|arr, v|
|
32
|
+
v.each_pair {
|
33
|
+
|val, key|
|
34
|
+
arr << val << key
|
35
|
+
}
|
36
|
+
arr
|
37
|
+
}
|
38
|
+
a = Hash[*a]
|
39
|
+
val = VCS::get(a['name']).config.new
|
40
|
+
val.parse(a)
|
41
|
+
else
|
42
|
+
throw :todo
|
43
|
+
end
|
44
|
+
val
|
45
|
+
}
|
46
|
+
|
47
|
+
option( "build-system", "Build System" ).
|
48
|
+
on_write {
|
49
|
+
|val|
|
50
|
+
if val.instance_of?( String )
|
51
|
+
val = BuildSystem::get( val ).config.new
|
52
|
+
elsif val.instance_of?( Array )
|
53
|
+
a = val.inject([]) {
|
54
|
+
|arr, v|
|
55
|
+
v.each_pair {
|
56
|
+
|val, key|
|
57
|
+
arr << val << key
|
58
|
+
}
|
59
|
+
arr
|
60
|
+
}
|
61
|
+
a = Hash[*a]
|
62
|
+
val = BuildSystem::get(a['name']).config.new
|
63
|
+
val.parse(a)
|
64
|
+
else
|
65
|
+
throw :todo
|
66
|
+
end
|
67
|
+
val
|
68
|
+
}
|
69
|
+
|
70
|
+
option( "env", "Environment Settings" ).
|
71
|
+
on_write { |val|
|
72
|
+
h = Hash.new
|
73
|
+
MJ::Configuration::flatten_values val do
|
74
|
+
|k, v|
|
75
|
+
h[k] = v
|
76
|
+
end
|
77
|
+
h
|
78
|
+
}
|
79
|
+
|
80
|
+
option( "local-path", "Local path to build. Relative to <stage>/src" )
|
81
|
+
|
82
|
+
option( "remote-path", "Path to fetch from. Relative to <repository>" ).
|
83
|
+
required
|
84
|
+
|
85
|
+
option( "prefix", "Installation Directory" ).
|
86
|
+
required
|
87
|
+
|
88
|
+
def to_s
|
89
|
+
self.name
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
YAML.add_domain_type(
|
95
|
+
"michael-jansen.biz,2009", "ModuleConfiguration" ) {
|
96
|
+
|type, val|
|
97
|
+
mc = ModuleConfiguration.new
|
98
|
+
MJ::Configuration::flatten_values val do
|
99
|
+
|k, v|
|
100
|
+
mc.set( k, v )
|
101
|
+
end
|
102
|
+
mc.validate
|
103
|
+
ModuleRegistry.instance.register_module( Module.new( mc ) )
|
104
|
+
mc
|
105
|
+
}
|
106
|
+
|
107
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'singleton'
|
4
|
+
|
5
|
+
module BuildTool
|
6
|
+
|
7
|
+
class ConfigurationError < Exception
|
8
|
+
end
|
9
|
+
|
10
|
+
class ModuleRegistry
|
11
|
+
|
12
|
+
include Singleton
|
13
|
+
|
14
|
+
include MJ::Configuration::Configurable
|
15
|
+
|
16
|
+
include Singleton
|
17
|
+
|
18
|
+
@@packages = {}
|
19
|
+
def set( name, string )
|
20
|
+
@@packages[name] = string.to_s.split( / */ )
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.resolve_package( string, &block )
|
24
|
+
name = string[1..-1]
|
25
|
+
if @@packages.has_key? name
|
26
|
+
return self.get_modules( @@packages[name], &block )
|
27
|
+
else
|
28
|
+
$log.error( "Unknown package #{string}" )
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
@@modules = []
|
33
|
+
|
34
|
+
def register_module( mod )
|
35
|
+
if self.class.module_by_name mod.name
|
36
|
+
raise ConfigurationError, "Two configurations for #{mod.name} found"
|
37
|
+
end
|
38
|
+
@@modules.push( [mod.name ,mod] )
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.module_by_name( name )
|
42
|
+
@@modules.each do |v|
|
43
|
+
if v[0] == name
|
44
|
+
return v[1]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def self.get_modules( args, &block )
|
52
|
+
if args.instance_of?( String )
|
53
|
+
if args[0,1] == ':'
|
54
|
+
self.resolve_package( args, &block )
|
55
|
+
# Check if we have a exact match
|
56
|
+
elsif mod = module_by_name(args)
|
57
|
+
yield mod
|
58
|
+
elsif args[-1,1] == '/'
|
59
|
+
found = false
|
60
|
+
@@modules.select{ |a| a[0].index(args) == 0}.each do |a|
|
61
|
+
found = true
|
62
|
+
yield a[1]
|
63
|
+
end
|
64
|
+
$log.error( "Unknown module #{args}" ) if !found
|
65
|
+
else
|
66
|
+
$log.error( "Unknown module #{args}" )
|
67
|
+
end
|
68
|
+
elsif args.instance_of?( Array )
|
69
|
+
args.map { |arg| get_modules( arg, &block ) }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
YAML.add_domain_type(
|
76
|
+
"michael-jansen.biz,2009", "Packages" ) {
|
77
|
+
|type, val|
|
78
|
+
mr = ModuleRegistry.instance
|
79
|
+
MJ::Configuration::flatten_values val do
|
80
|
+
|k, v|
|
81
|
+
mr.set( k, v )
|
82
|
+
end
|
83
|
+
}
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module MJ; module Tools
|
2
|
+
|
3
|
+
module SubProcess
|
4
|
+
|
5
|
+
module ClassMethods
|
6
|
+
|
7
|
+
# Executes command
|
8
|
+
#
|
9
|
+
# Executes the given command and yields each line of output.
|
10
|
+
# Returns +$?+ .
|
11
|
+
def execute( command, wd = nil, env = nil )
|
12
|
+
cwd ||= Dir.getwd
|
13
|
+
$log.cmd( "(#{wd}) > #{command} 2>&1" )
|
14
|
+
if !$noop
|
15
|
+
adjust_environment( wd, env ) {
|
16
|
+
IO.popen( "#{command} 2>&1" ) {
|
17
|
+
|f|
|
18
|
+
begin
|
19
|
+
while
|
20
|
+
line = f.readline
|
21
|
+
$log.cmdout( line.chomp )
|
22
|
+
yield line if block_given?
|
23
|
+
end
|
24
|
+
rescue EOFError:
|
25
|
+
# Expected. Do nothing
|
26
|
+
end
|
27
|
+
}
|
28
|
+
$log.cmdout( "= #{$?}" )
|
29
|
+
return $?
|
30
|
+
}
|
31
|
+
else
|
32
|
+
$log.cmdout( "= 0 # noop" )
|
33
|
+
return 0
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
#########
|
39
|
+
protected
|
40
|
+
#########
|
41
|
+
|
42
|
+
# Helper method to adjust LANG to "C"
|
43
|
+
def adjust_environment( wd=nil, env=nil, lang="C" )
|
44
|
+
if wd
|
45
|
+
cwd = Dir.getwd
|
46
|
+
Dir.chdir(wd)
|
47
|
+
end
|
48
|
+
# Set the environment the user wants
|
49
|
+
oldenv = Hash.new
|
50
|
+
if env
|
51
|
+
env.each do |var, value|
|
52
|
+
oldenv[var] = ENV[var]
|
53
|
+
ENV[var] = value
|
54
|
+
end
|
55
|
+
end
|
56
|
+
# Save old LANG setting and switch to 'C'
|
57
|
+
oldlang = ENV['LANG']
|
58
|
+
ENV['LANG'] = lang
|
59
|
+
yield
|
60
|
+
# Reset the old LANG setting
|
61
|
+
ENV['LANG'] = oldlang
|
62
|
+
# Reset our changes to ENV
|
63
|
+
oldenv.each do |var, value|
|
64
|
+
ENV[var] = value
|
65
|
+
end
|
66
|
+
# Reset the current working directory
|
67
|
+
if wd
|
68
|
+
Dir.chdir(cwd)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.included( klass )
|
74
|
+
klass.extend( ClassMethods )
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
end; end
|
82
|
+
|