build-tool 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -78,8 +78,6 @@ rule
78
78
  : LOG_DIRECTORY STRING { result = LogDirectoryNode.new( val[1] ); }
79
79
  | DISABLE FEATURE identifier { result = DisableFeatureNode.new( val[2] ); }
80
80
  | ENABLE FEATURE identifier { result = EnableFeatureNode.new( val[2] ); }
81
- | DISABLE MODULE identifier { result = DisableModuleNode.new( val[2] ); }
82
- | ENABLE MODULE identifier { result = EnableModuleNode.new( val[2] ); }
83
81
  | statement { result = val[0]; }
84
82
  ;
85
83
 
@@ -96,6 +94,8 @@ rule
96
94
  | ssh_key_declaration { result = val[0]; }
97
95
  | include_directive { result = val[0]; }
98
96
  | feature_declaration { result = val[0]; }
97
+ | DISABLE MODULE identifier { result = DisableModuleNode.new( val[2] ); }
98
+ | ENABLE MODULE identifier { result = EnableModuleNode.new( val[2] ); }
99
99
  ;
100
100
 
101
101
  vcs_declaration
@@ -133,7 +133,10 @@ rule
133
133
  ;
134
134
 
135
135
  build_system_statement
136
- : OPTION identifier STRING { result = BuildSystemOptionNode.new( val[1,2] ); }
136
+ : OPTION identifier STRING { result = BuildSystemOptionNode.new( val[1..-1] ); }
137
+ | OPTION identifier SET STRING { result = BuildSystemOptionNode.new( val[1..-1] ); }
138
+ | OPTION identifier PREPEND STRING { result = BuildSystemOptionNode.new( val[1..-1] ); }
139
+ | OPTION identifier APPEND STRING { result = BuildSystemOptionNode.new( val[1..-1] ); }
137
140
  | INPLACE { result = BuildSystemInplaceNode.new(); }
138
141
  ;
139
142
 
@@ -151,7 +154,8 @@ rule
151
154
  ;
152
155
 
153
156
  environment_statement
154
- : VAR TOKEN SET STRING { result = EnvironmentVariableNode.new( val[1..-1] ); }
157
+ : VAR TOKEN STRING { result = EnvironmentVariableNode.new( val[1..-1] ); }
158
+ | VAR TOKEN SET STRING { result = EnvironmentVariableNode.new( val[1..-1] ); }
155
159
  | VAR TOKEN PREPEND STRING { result = EnvironmentVariableNode.new( val[1..-1] ); }
156
160
  | VAR TOKEN APPEND STRING { result = EnvironmentVariableNode.new( val[1..-1] ); }
157
161
  ;
@@ -52,16 +52,12 @@ class BuildSystemDeclarationNodeVisitor < ListVisitor
52
52
 
53
53
  # Initialize a build system. If no build system is provided we will
54
54
  # create a new one. Which is not registered with the configuration.
55
- def initialize( configuration, build_system = nil )
55
+ def initialize( configuration, build_system )
56
56
  super( configuration )
57
57
  @build_system = build_system
58
58
  end
59
59
 
60
60
  def visit_BuildSystemDeclarationNode( node )
61
- if @build_system.nil?
62
- name = node.values[0]
63
- @build_system = configuration.build_system( name ).dup
64
- end
65
61
  visit_nodes( node.values[1] )
66
62
  return @build_system
67
63
  end
@@ -71,7 +67,19 @@ def visit_BuildSystemInplaceNode( node )
71
67
  end
72
68
 
73
69
  def visit_BuildSystemOptionNode( node )
74
- @build_system[ node.value[0] ] = node.value[1]
70
+ case node.values.length
71
+ when 3
72
+ case node.values[1]
73
+ when 'append'; @build_system.append( node.values[0], node.values[2] )
74
+ when 'prepend'; @build_system.prepend( node.values[0], node.values[2] )
75
+ when 'set'; @build_system.set( node.values[0], node.values[2] )
76
+ else raise StandardError, "Unexpected token #{node.values[1]}!"
77
+ end
78
+ when 2
79
+ @build_system.set( node.values[0], node.values[1] )
80
+ else
81
+ raise StandardError, "Unexpected number of tokens #{node.values.length} #{node.values.join(', ')}"
82
+ end
75
83
  end
76
84
 
77
85
  end
@@ -82,8 +90,11 @@ class StatementVisitor < ListVisitor
82
90
  def visit_BuildSystemDeclarationNode( node )
83
91
  raise ArgumentsError if node.values.length != 2
84
92
  name = node.values[0]
85
- visitor = BuildSystemDeclarationNodeVisitor.new( configuration, configuration.build_system(name) )
86
- configuration.add_build_system( node.accept( visitor ) )
93
+ bs = configuration.build_system_defaults( name )
94
+ visitor = BuildSystemDeclarationNodeVisitor.new(
95
+ configuration,
96
+ bs )
97
+ node.accept( visitor )
87
98
  end
88
99
 
89
100
  def visit_ConfigurationFileList( node )
@@ -104,15 +115,6 @@ def visit_EnableFeatureNode( node )
104
115
  feat.active = true
105
116
  end
106
117
 
107
- def visit_EnableModuleNode( node )
108
- modName = node.value
109
- mod = configuration.module( modName )
110
- if mod.nil?
111
- raise ConfigurationError, "Attempt to enable unknown module '%s'!" % modName
112
- end
113
- mod.active = true
114
- end
115
-
116
118
  def visit_DisableFeatureNode( node )
117
119
  featureName = node.value
118
120
  feat = configuration.feature( featureName )
@@ -122,6 +124,15 @@ def visit_DisableFeatureNode( node )
122
124
  feat.active = false
123
125
  end
124
126
 
127
+ def visit_EnableModuleNode( node )
128
+ modName = node.value
129
+ mod = configuration.module( modName )
130
+ if mod.nil?
131
+ raise ConfigurationError, "Attempt to enable unknown module '%s'!" % modName
132
+ end
133
+ mod.active = true
134
+ end
135
+
125
136
  def visit_DisableModuleNode( node )
126
137
  modName = node.value
127
138
  mod = configuration.module( modName )
@@ -220,11 +231,18 @@ def visit_EnvironmentDeclarationNode( node )
220
231
  end
221
232
 
222
233
  def visit_EnvironmentVariableNode( node )
223
- case node.values[1]
224
- when 'append'; @environment.append( node.values[0], node.values[2] )
225
- when 'prepend'; @environment.prepend( node.values[0], node.values[2] )
226
- when 'set'; @environment.set( node.values[0], node.values[2] )
227
- else raise StandardError, "Unexpected token #{node.values[1]}!"
234
+ case node.values.length
235
+ when 3
236
+ case node.values[1]
237
+ when 'append'; @environment.append( node.values[0], node.values[2] )
238
+ when 'prepend'; @environment.prepend( node.values[0], node.values[2] )
239
+ when 'set'; @environment.set( node.values[0], node.values[2] )
240
+ else raise StandardError, "Unexpected token #{node.values[1]}!"
241
+ end
242
+ when 2
243
+ @environment.set( node.values[0], node.values[1] )
244
+ else
245
+ raise StandardError, "Unexpected number of tokens #{node.values.length} #{node.values.join(', ')}"
228
246
  end
229
247
  end
230
248
 
@@ -353,14 +371,26 @@ def visit_ArchiveDeclarationNode( node )
353
371
  def visit_BuildSystemDeclarationNode( node )
354
372
  raise ArgumentsError if node.values.length != 2
355
373
  name = node.values[0]
356
- if @module.build_system and @module.build_system.name == name
357
- build_system = @module.build_system.dup
374
+ # We have to create a build-system. There are some possibilities:
375
+ # 1. The module has a build-system. Inherit from that one (Overloading)
376
+ # 2. The module has a parent but no build-system: Create the build-system parentless
377
+ # so it forwards to the parent module
378
+ # 3. The module has no parent and no build-system. Inherit from the build-system
379
+ # standard module.
380
+ if @module.our_build_system
381
+ # puts "Inherit from previous build-system for #{@module.name}"
382
+ build_system = configuration.build_system_adjust( name, @module.our_build_system )
383
+ elsif @module.parent
384
+ # puts "Inherit without parent for #{@module.name}"
385
+ build_system = configuration.build_system_adjust( name, nil )
358
386
  else
359
- build_system = nil
387
+ # puts "Inherit from #{name} for #{@module.name}"
388
+ build_system = configuration.build_system_adjust( name, configuration.build_system_defaults( name ) )
360
389
  end
361
390
  visitor = BuildSystemDeclarationNodeVisitor.new( configuration, build_system )
362
391
  @module.build_system = node.accept( visitor )
363
392
  @module.build_system.module = @module
393
+ @module.build_system.feature = configuration.active_feature
364
394
  end
365
395
 
366
396
  def visit_LongDescriptionNode( node )
@@ -481,7 +511,10 @@ def visit_SvnDeclarationNode( node )
481
511
  end
482
512
 
483
513
  def visit_UseBuildSystemNode( node )
484
- @module.build_system = configuration.build_system( node.value ).dup
514
+ # puts "Inherit from build-system #{node.value} for #{@module.name}"
515
+ @module.build_system = configuration.build_system_adjust(
516
+ node.value,
517
+ configuration.build_system_defaults( node.value ) )
485
518
  @module.build_system.module = @module
486
519
  end
487
520
 
@@ -1,7 +1,64 @@
1
+ require 'ansi'
2
+ require 'logging'
1
3
  require 'ftools'
2
4
 
3
5
  module BuildTool
4
6
 
7
+ class Progressbar < Logging::Appender
8
+
9
+ def initialize( title, &block )
10
+ super( 'Progressbar', :level => :DEBUG )
11
+ @pbar = nil
12
+ @oldlogger = nil
13
+ if Logging.appenders['stdout'].level >= ::Logging::level_num(:INFO)
14
+ # We only do the progressbar thing if there is no verbose output active.
15
+ begin
16
+ # Remove the old stdout logger.
17
+ @oldlogger = Logging.appenders[ 'stdout' ]
18
+ Logging.logger[ 'root' ].remove_appenders( 'stdout' )
19
+ Logging.logger[ 'root' ].add_appenders( self )
20
+ # Add the progressbar logger
21
+ @pbar = ANSI::Progressbar.new( title, 100 )
22
+ yield
23
+ ensure
24
+ @pbar.finish
25
+ # Reset the logger
26
+ Logging.logger[ 'root' ].remove_appenders( 'Progressbar' )
27
+ Logging.logger[ 'root' ].add_appenders( @oldlogger )
28
+ end
29
+ else
30
+ # If there is verbose output just print the text
31
+ logger.info( title )
32
+ yield
33
+ end
34
+
35
+ end
36
+
37
+ def write( event )
38
+ message = event.data
39
+ return if message.empty?
40
+
41
+ case event.level
42
+ when ::Logging::level_num( :ERROR )
43
+ when ::Logging::level_num( :WARN )
44
+ # This should never happen. In case of errors an exception is thrown which should
45
+ # be catched in the initialize() method above. And this logger is removed there.
46
+ raise NotImplementedError
47
+
48
+ else
49
+ match = /^\[ *(\d+)%\]/.match( message )
50
+ if match
51
+ # puts match[ 1 ]
52
+ @pbar.set( match[ 1 ].to_i )
53
+ end
54
+ end
55
+ self
56
+ end
57
+
58
+ end # class ProgressLayout
59
+
60
+
61
+
5
62
  module ModuleActions
6
63
 
7
64
  class Base
@@ -176,8 +233,9 @@ def initialize( command, mod, target = nil )
176
233
  end
177
234
 
178
235
  def execute()
179
- logger.info "Building"
180
- @module.build_system_required.make( @target )
236
+ pb = Progressbar.new( "Make #{@target}" ) do
237
+ @module.build_system_required.make( @target )
238
+ end
181
239
  end
182
240
 
183
241
  end
@@ -190,8 +248,9 @@ def initialize( command, mod, fast = false )
190
248
  end
191
249
 
192
250
  def execute()
193
- logger.info "Installing"
194
- @module.build_system_required.install( @fast )
251
+ pb = Progressbar.new( "Install #{@fast ? 'fast' : '' }" ) do
252
+ @module.build_system_required.install( @fast )
253
+ end
195
254
  end
196
255
 
197
256
  end
@@ -365,7 +365,9 @@ def complete_modules( name, include_templates = false )
365
365
  end
366
366
  end
367
367
  # Raise an error if the module was not found
368
- raise UsageError, "Unknown module/package #{name}" if !found
368
+ if !found
369
+ raise UsageError, "Unknown module/package #{name}"
370
+ end
369
371
  # Give a warning if all modules where
370
372
  logger.warn "All modules for #{name} are inactive! Will ignore it." if res.empty?
371
373
  return res
@@ -24,20 +24,35 @@ def initialize_options
24
24
  end
25
25
 
26
26
  def do_execute( args )
27
- if args.length != 0
28
- return usage( "To many arguments." )
29
- end
27
+ if args.length == 0
28
+
29
+ say "%-15s (%s)" % [ "Environment", "Inherits" ]
30
+ say "------------------------------------------------------------"
31
+ configuration.environments.keys.sort.each do |name|
32
+ env = configuration.environment(name)
33
+ next if !env.active? && !@all
34
+ if env.parent
35
+ say "%-15s %s" % [ name, env.parent.name ]
36
+ else
37
+ say name
38
+ end
39
+ end
40
+
41
+ elsif args.length == 1
30
42
 
31
- say "%-15s (%s)" % [ "Environment", "Inherits" ]
32
- say "------------------------------------------------------------"
33
- configuration.environments.keys.sort.each do |name|
34
- env = configuration.environment(name)
35
- next if !env.active? && !@all
43
+ say "Environment:"
44
+ env = configuration.environment( args[ 0 ] )
36
45
  if env.parent
37
- say "%-15s %s" % [ name, env.parent.name ]
38
- else
39
- say name
46
+ say "%-15s %s" % [ "Parent", env.parent.name ]
40
47
  end
48
+ env.vars.sort.each do |var|
49
+ say " %-20s %s" % [ var + ":", env[var] ]
50
+ end
51
+
52
+ else
53
+
54
+ return usage( "To many arguments" )
55
+
41
56
  end
42
57
 
43
58
  return 0
@@ -77,8 +77,8 @@ def do_execute_module( mod )
77
77
  if bs
78
78
  say "Build System: #{bs.name}"
79
79
  say " Out Of Source Build #{bs.out_of_source}"
80
- bs.options.sort.each do |var|
81
- say " %-25s %s" % [ var + ":", bs[var] ]
80
+ bs.option_names.sort.each do |var|
81
+ say " %-28s %s" % [ var + ":", bs[var] ]
82
82
  end
83
83
  else
84
84
  say "Build System: Not configured"
@@ -89,6 +89,9 @@ def do_execute_module( mod )
89
89
 
90
90
  def initialize_options
91
91
  @options.banner = "Usage: #{Pathname.new($0).basename} #{self.fullname} MODULES..."
92
+ options.on( "--all", "Include inactive modules." ) {
93
+ @all = true
94
+ }
92
95
  super
93
96
  end
94
97
 
@@ -111,30 +111,40 @@ def vcs( name )
111
111
  end
112
112
  end
113
113
 
114
- def build_system( name )
114
+ def create_build_system( name, parent = nil, *args )
115
+ return case name
116
+ when "none"
117
+ BuildTool::BuildSystem::None.new( parent, *args )
118
+ when "cmake"
119
+ BuildTool::BuildSystem::CMake.new( parent, *args )
120
+ when "kdel10n"
121
+ BuildTool::BuildSystem::KdeL10n.new( parent, *args )
122
+ when "qt"
123
+ BuildTool::BuildSystem::Qt.new( parent, *args )
124
+ when "qmake"
125
+ BuildTool::BuildSystem::QMake.new( parent, *args )
126
+ when "custom"
127
+ BuildTool::BuildSystem::Custom.new( parent, *args )
128
+ when "autoconf"
129
+ BuildTool::BuildSystem::AutoConf.new( parent, *args )
130
+ else
131
+ raise StandardError, "Unknown Version Control System #{name}"
132
+ end
133
+ end
134
+
135
+ def build_system_adjust( name, parent = nil, *args )
136
+ bs = create_build_system( name )
137
+ bs.defaults = build_system_defaults( name )
138
+ return bs
139
+ end
140
+
141
+ def build_system_defaults( name, *args )
115
142
  return @build_system[name] if @build_system[name]
116
- case name
117
- when "none"
118
- return BuildTool::BuildSystem::None.new
119
- when "cmake"
120
- return BuildTool::BuildSystem::CMake.new
121
- when "kdel10n"
122
- return BuildTool::BuildSystem::KdeL10n.new
123
- when "qt"
124
- return BuildTool::BuildSystem::Qt.new
125
- when "qmake"
126
- return BuildTool::BuildSystem::QMake.new
127
- when "custom"
128
- return BuildTool::BuildSystem::Custom.new
129
- when "autoconf"
130
- return BuildTool::BuildSystem::AutoConf.new
131
- else
132
- raise StandardError, "Unknown Version Control System #{name}"
133
- end
143
+ add_build_system( create_build_system( name ) )
134
144
  end
135
145
 
136
146
  def add_build_system( bs )
137
- @build_system[bs.name] = bs
147
+ return @build_system[bs.name] = bs
138
148
  end
139
149
 
140
150
  end # Configuration
@@ -38,6 +38,7 @@ def initialize( name, parent = nil )
38
38
  attr_writer :feature
39
39
  attr_writer :active
40
40
  attr_reader :patches
41
+ attr_reader :parent
41
42
 
42
43
  def active?
43
44
  # If the module is activated that wins
@@ -96,6 +97,10 @@ def build_system
96
97
  nil
97
98
  end
98
99
 
100
+ def our_build_system
101
+ @build_system
102
+ end
103
+
99
104
  # Will throw a exception if build_system is not set
100
105
  def build_system_required
101
106
  return self.build_system if self.build_system
@@ -343,6 +348,10 @@ def prepare_for_installation
343
348
  return true
344
349
  end
345
350
 
351
+ def to_s
352
+ "#{object_id}: #{name}"
353
+ end
354
+
346
355
  end # Module
347
356
 
348
357