makeconf 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -95,7 +95,7 @@ class Makeconf
95
95
  end
96
96
 
97
97
  opts.on_tail('-V', '--version', 'Display version information and exit') do
98
- puts "Makeconf $Id: makeconf.rb 295 2012-11-10 17:55:29Z mheily $"
98
+ puts "Makeconf $Id: makeconf.rb 301 2012-11-17 16:47:04Z mheily $"
99
99
  exit
100
100
  end
101
101
  end
@@ -124,8 +124,14 @@ class Makeconf
124
124
  end
125
125
  end
126
126
 
127
+ # Adjust the log level to increase debugging output
128
+ def log_level=(level)
129
+ @@logger.level = level
130
+ end
131
+
127
132
  # Examine the operating environment and set configuration options
128
- def configure
133
+ def configure(project = nil)
134
+ @project = project unless project.nil?
129
135
 
130
136
  @@logger.info 'Configuring the project'
131
137
  # FIXME: once the GUI is finished, it should just be
@@ -142,7 +148,7 @@ class Makeconf
142
148
  raise ArgumentError unless options.kind_of?(Hash)
143
149
  options.each do |k,v|
144
150
  case k
145
- when :minimum_version
151
+ when :minimum_version, :log_level
146
152
  send(k.to_s + '=',v)
147
153
  else
148
154
  raise ArgumentError, "Unknown argument #{k}"
@@ -201,13 +207,6 @@ class Makeconf
201
207
  makefile.add_rule('install', Platform.is_windows? ?
202
208
  'dir $(DESTDIR)' + Platform.dev_null :
203
209
  '/usr/bin/test -e $(DESTDIR)')
204
-
205
- # Distribute Makeconf with 'make distdir'
206
- makefile.distribute([
207
- 'configure',
208
- 'makeconf/*.rb',
209
- 'makeconf/makeconf/*.rb',
210
- ])
211
210
  end
212
211
 
213
212
  end
@@ -28,6 +28,7 @@ class BaseProject
28
28
  @license_file = nil
29
29
  @author = 'Unknown author'
30
30
  @config_h = 'config.h'
31
+ @config_h_rules = [] # Makefile rules to generate config.h
31
32
  @header = {} # Hash of system header availablity
32
33
  @build = [] # List of items to build
33
34
  @distribute = [] # List of items to distribute
@@ -35,6 +36,7 @@ class BaseProject
35
36
  @target = [] # List of additional Makefile targets
36
37
  @decls = {} # List of declarations discovered via check_decl()
37
38
  @funcs = {} # List of functions discovered via check_func()
39
+ @defs = {} # Custom preprocessor macro definitions
38
40
  @packager = Packager.new(self)
39
41
  @cc = nil
40
42
 
@@ -166,6 +168,17 @@ class BaseProject
166
168
  # Add custom targets
167
169
  @target.each { |t| makefile.add_target t }
168
170
 
171
+ # Add the config.h target
172
+ @config_h_rules.unshift \
173
+ '@echo "/* AUTOMATICALLY GENERATED -- DO NOT EDIT */" > config.h.tmp',
174
+ '@date > config.log'
175
+ @config_h_rules.push \
176
+ '@rm -f conftest.c conftest.o',
177
+ '@mv config.h.tmp ' + @config_h
178
+ makefile.add_target Target.new('config.h', [], @config_h_rules)
179
+
180
+ makefile.distribute 'Makefile'
181
+
169
182
  makefile
170
183
  end
171
184
 
@@ -175,35 +188,77 @@ class BaseProject
175
188
  @install.each { |x| @installer.install x }
176
189
  end
177
190
 
191
+ # Check if a system header file is available
192
+ def check_header(headers)
193
+ headers = [ headers ] if headers.kind_of? String
194
+ throw ArgumentError unless headers.kind_of? Array
195
+ rc = true
196
+
197
+ headers.each do |header|
198
+ printf "checking for #{header}... "
199
+ @header[header] = @cc.check_header(header)
200
+ if @header[header]
201
+ puts 'yes'
202
+ else
203
+ puts 'no'
204
+ rc = false
205
+ end
206
+ end
207
+
208
+ rc
209
+ end
210
+
178
211
  # Check if a system header declares a macro or symbol
179
- def check_decl(header,decl)
180
- throw ArgumentError unless header.kind_of? String
212
+ def check_decl(decl, opt = { :include => 'stdlib.h' })
181
213
  decl = [ decl ] if decl.kind_of? String
182
214
  throw ArgumentError unless decl.kind_of? Array
183
-
184
- @cc ||= CCompiler.new() #FIXME: stop this
215
+ rc = true
185
216
 
186
217
  decl.each do |x|
187
218
  next if @decls.has_key? x
188
219
  printf "checking whether #{x} is declared... "
189
- @decls[x] = @cc.test_compile "#define _GNU_SOURCE\n#include <#{header}>\nint main() { #{x}; }"
190
- puts @decls[x] ? 'yes' : 'no'
220
+ source = [
221
+ "#define _GNU_SOURCE",
222
+ "#include <#{opt[:include]}>",
223
+ "int main() { #{x}; }"
224
+ ].join("\n")
225
+ @decls[x] = @cc.test_compile(source)
226
+ if @decls[x]
227
+ puts 'yes'
228
+ else
229
+ puts 'no'
230
+ rc = false
231
+ end
191
232
  end
233
+
234
+ rc
192
235
  end
193
236
 
194
237
  # Check if a function is available in the standard C library
195
238
  # TODO: probably should add :ldadd when checking..
196
- def check_func(func)
239
+ def check_function(func, *arg)
197
240
  func = [ func ] if func.kind_of? String
198
241
  throw ArgumentError unless func.kind_of? Array
242
+ rc = true
199
243
 
200
- @cc ||= CCompiler.new() #FIXME: stop this
201
244
  func.each do |x|
202
245
  next if @funcs.has_key? x
203
246
  printf "checking for #{x}... "
204
247
  @funcs[x] = @cc.test_link "void *#{x}();\nint main() { void *p;\np = &#{x}; }"
205
- puts @funcs[x] ? 'yes' : 'no'
248
+ if @funcs[x]
249
+ puts 'yes'
250
+ else
251
+ puts 'no'
252
+ rc = false
253
+ end
206
254
  end
255
+
256
+ rc
257
+ end
258
+
259
+ # Define a C preprocessor symbol
260
+ def define(id,value)
261
+ @defs[id] = value
207
262
  end
208
263
 
209
264
  def add_binary(options)
@@ -343,6 +398,7 @@ class BaseProject
343
398
  @header.keys.sort.each { |k| buf["HAVE_#{k}".upcase] = @header[k] }
344
399
  @decls.keys.sort.each { |x| buf["HAVE_DECL_#{x}".upcase] = @decls[x] }
345
400
  @funcs.keys.sort.each { |x| buf["HAVE_#{x}".upcase] = @funcs[x] }
401
+ @defs.keys.sort.each { |x| buf[x] = @defs[x] }
346
402
 
347
403
  puts 'creating ' + ofile
348
404
  f = File.open(ofile, 'w')
@@ -353,7 +409,7 @@ class BaseProject
353
409
  if v == true
354
410
  f.printf "#define #{id} 1\n"
355
411
  else
356
- f.printf "#undef #{id}\n"
412
+ f.printf "/* #undef #{id} */\n"
357
413
  end
358
414
  end
359
415
  f.close
@@ -382,5 +438,4 @@ class BaseProject
382
438
  end
383
439
  return false
384
440
  end
385
-
386
441
  end
@@ -180,7 +180,7 @@ class Buildable
180
180
  @ldadd = [ @ldadd ] if @ldadd.kind_of?(String)
181
181
  @ldadd.each { |lib| ld.library lib }
182
182
 
183
- makefile.add_target(obj, [src, localdep[src]].flatten, cc.rule)
183
+ makefile.add_target(obj, [@project.config_h, src, localdep[src]].flatten, cc.rule)
184
184
  makefile.clean(obj)
185
185
  objs.push obj
186
186
  end
@@ -4,7 +4,7 @@ class Compiler
4
4
 
5
5
  require 'tempfile'
6
6
 
7
- attr_accessor :sysroot
7
+ attr_accessor :sysroot, :output
8
8
  attr_reader :ld
9
9
 
10
10
  def initialize(language, extension)
@@ -55,11 +55,6 @@ class Compiler
55
55
  @quiet = b
56
56
  end
57
57
 
58
- def output=(s)
59
- @output = s
60
- ld.output = s
61
- end
62
-
63
58
  def makefile
64
59
  m = Makefile.new
65
60
  m.define_variable('CC', ':=', @path)
@@ -69,7 +64,7 @@ class Compiler
69
64
 
70
65
  # Return the command formatted as a Makefile rule
71
66
  def rule
72
- [ '$(CC)', '-c', flags, '$(CFLAGS)', @sources ].flatten.join(' ')
67
+ [ '$(CC)', '-DHAVE_CONFIG_H', flags, '$(CFLAGS)', '-c', @sources ].flatten.join(' ')
73
68
  end
74
69
 
75
70
  # Return the complete command line to compile an object
@@ -99,7 +94,7 @@ class Compiler
99
94
  # return [ @path, cflags, '-combine', ldflags, inputs, ldadd ].flatten.join(' ')
100
95
  #
101
96
 
102
- cmd = [ @path, '-c', flags, @sources ].flatten.join(' ')
97
+ cmd = [ @path, '-DHAVE_CONFIG_H', flags, '-c', @sources ].flatten.join(' ')
103
98
 
104
99
  cmd += Platform.dev_null if @quiet
105
100
 
@@ -197,31 +192,49 @@ class Compiler
197
192
  # Run the compilation command
198
193
  def compile
199
194
  cmd = self.command
195
+ #puts ' + ' + cmd
200
196
  log.debug "Invoking the compiler"
201
197
  rc = Platform.execute cmd
202
198
  log.debug "Compilation complete; rc=#{rc.to_s}"
199
+ rc
200
+ end
201
+
202
+ # Run the link command
203
+ def link
204
+ throw 'Invalid linker' unless @ld.is_a?(Linker)
205
+ throw 'One or more source files are required' unless @sources.length > 0
206
+ cmd = @ld.command
207
+ log.debug "Invoking the linker: " + cmd
208
+ rc = Platform.execute cmd
209
+ log.debug "Linking complete; rc=#{rc.to_s}"
210
+ rc
203
211
  end
204
212
 
205
213
  # Compile a test program
206
214
  def test_compile(code, stage = :compile)
215
+ log.debug "Testing compilation of:\n" + code
207
216
 
208
217
  # Write the code to a temporary source file
209
218
  f = Tempfile.new(['test_compile', @extension]);
210
219
  f.print code
211
220
  f.flush
212
- ###objfile = f.path + '.out'
213
221
 
214
222
  # Run the compiler
215
223
  cc = self.clone
216
224
  cc.sources = f.path
217
- ### cc.output = objfile
218
- cc.flags += '-o /dev/null' #FIXME: /dev/null not portable
225
+ cc.output = f.path.sub(/\.c$/, '.o')
219
226
  cc.quiet = true
220
227
  rc = cc.compile
221
228
 
222
- # Delete the object file
223
- objfile = File.basename( f.path.sub(@extension, '.o') )
224
- File.unlink(objfile) if File.exist? objfile
229
+ # (Optional) Run the linker
230
+ if (rc == true and stage == :combined)
231
+ cc.ld.quiet = true
232
+ rc = cc.link
233
+ File.unlink(cc.ld.output) if File.exist? cc.ld.output
234
+ end
235
+
236
+ # Delete the output file(s)
237
+ File.unlink(cc.output) if File.exist? cc.output
225
238
 
226
239
  return rc
227
240
  end
@@ -8,7 +8,7 @@ class Linker
8
8
  def initialize
9
9
  @flags = []
10
10
  @objects = []
11
- @output = nil
11
+ @output = 'a.out'
12
12
  @shared_library = false
13
13
  @ldadd = []
14
14
  @quiet = false # If true, output will be suppressed
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: makeconf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.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: 2011-12-30 00:00:00.000000000 Z
12
+ date: 2012-11-17 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: An alternative to GNU autoconf/automake/libtool/etc
15
15
  email: mark@heily.com
@@ -37,7 +37,7 @@ files:
37
37
  - lib/makeconf/externalproject.rb
38
38
  - lib/makeconf/systemtype.rb
39
39
  - lib/makeconf/androidproject.rb
40
- homepage: http://mark.heily.com/project/makeconf
40
+ homepage: http://sourceforge.net/p/makeconf
41
41
  licenses: []
42
42
  post_install_message:
43
43
  rdoc_options: []