rake-delphi 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/Gemfile +4 -0
  2. data/Gemfile.lock +19 -0
  3. data/Rakefile.rb +6 -0
  4. data/lib/rake/common/git.rb +3 -2
  5. data/lib/rake/common/logger.rb +26 -0
  6. data/lib/rake/common/sendmailtask.rb +1 -1
  7. data/lib/rake/common/ziptask.rb +3 -3
  8. data/lib/rake/delphi.rb +1 -0
  9. data/lib/rake/delphi/dcc32.rb +63 -13
  10. data/lib/rake/delphi/envvariables.rb +41 -13
  11. data/lib/rake/delphi/project.rb +0 -1
  12. data/lib/rake/delphi/projectinfo.rb +28 -7
  13. data/lib/rake/delphi/resources.rb +3 -2
  14. data/lib/rake/delphi/tool.rb +45 -13
  15. data/lib/rake/delphi/version.rb +1 -1
  16. data/lib/rake/helpers/filelist.rb +1 -0
  17. data/lib/rake/helpers/logger.rb +1 -0
  18. data/lib/rake/helpers/rake.rb +1 -0
  19. data/lib/rake/helpers/raketask.rb +1 -2
  20. data/rake-delphi.gemspec +2 -1
  21. data/test/helpers/verinfo.rb +42 -0
  22. data/test/resources/testproject/Rakefile.rb +5 -2
  23. data/test/resources/testproject/bin/test_compile/testproject.exe +0 -0
  24. data/test/resources/testproject/bin/test_compile_alter_cfg/testproject.exe +0 -0
  25. data/test/resources/testproject/bin/test_compile_consts/testproject.exe +0 -0
  26. data/test/resources/testproject/bin/test_compile_debug_info/testproject.drc +366 -0
  27. data/test/resources/testproject/bin/test_compile_debug_info/testproject.exe +0 -0
  28. data/test/resources/testproject/bin/test_compile_debug_info/testproject.map +1798 -0
  29. data/test/resources/testproject/bin/test_compile_defines/testproject.exe +0 -0
  30. data/test/resources/testproject/bin/test_compile_use_absent_config/testproject.exe +0 -0
  31. data/test/resources/testproject/bin/test_compile_use_config/testproject.exe +0 -0
  32. data/test/resources/testproject/bin/test_compile_use_library_path/testproject.exe +0 -0
  33. data/test/resources/testproject/bin/test_compile_with_explicit_and_implicit_libs/testproject.exe +0 -0
  34. data/test/resources/testproject/bin/test_compile_with_explicit_libs/testproject.exe +0 -0
  35. data/test/resources/testproject/bin/test_compile_with_libs/testproject.exe +0 -0
  36. data/test/resources/testproject/bin/test_compile_with_resources/testproject.exe +0 -0
  37. data/test/resources/testproject/bin/test_compile_with_resources_and_libs/testproject.exe +0 -0
  38. data/test/resources/testproject/dcu/ExplicitLibUnit.dcu +0 -0
  39. data/test/resources/testproject/dcu/LibUnit.dcu +0 -0
  40. data/test/resources/testproject/resources.res +0 -0
  41. data/test/resources/testproject/{testproject.bdsproj → testproject.2006.bdsproj} +0 -0
  42. data/test/resources/testproject/{testproject.dproj → testproject.2007.dproj} +0 -0
  43. data/test/resources/testproject/testproject.2010.dproj +108 -0
  44. data/test/resources/testproject/testproject.cfg.1 +8 -0
  45. data/test/resources/testproject/testproject.dproj.2007 +77 -0
  46. data/test/resources/testproject/testproject.drc +210 -0
  47. data/test/resources/testproject/testproject.exe +0 -0
  48. data/test/resources/testproject/testproject.identcache +0 -0
  49. data/test/resources/testproject/testproject.rc +60 -0
  50. data/test/resources/testproject/testproject.res +0 -0
  51. data/test/resources/testproject/testproject.xe5.dproj +179 -0
  52. data/test/test-delphi.rb +33 -5
  53. data/test/test-envvariables.rb +23 -0
  54. data/test/test-git.rb +2 -2
  55. data/test/test-hashes.rb +0 -1
  56. data/test/test-projectinfo.rb +89 -9
  57. data/test/test-zip.rb +0 -8
  58. metadata +100 -43
  59. data/.gitignore +0 -17
  60. data/test/resources/testproject/.gitignore +0 -8
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in rake-delphi.gemspec
4
4
  gemspec
5
+ gem 'rake', '~> 10.0.4'
6
+ gem 'xml-simple'
7
+ gem 'rubyzip', '~> 0.9.9'
8
+ gem 'inifile
data/Gemfile.lock ADDED
@@ -0,0 +1,19 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rake-delphi (0.0.4)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ rake (10.0.4)
10
+ xml-simple (1.1.3)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ bundler (~> 1.3)
17
+ rake (~> 10.0.4)
18
+ rake-delphi!
19
+ xml-simple
data/Rakefile.rb CHANGED
@@ -5,8 +5,14 @@ require 'rake/testtask'
5
5
 
6
6
  task :default => :test
7
7
 
8
+ task :"test:prerequisites" do
9
+ raise 'Please define DELPHI_VERSION environment variable' \
10
+ + ' to run tests with appropriate Delphi compiler' unless ENV['DELPHI_VERSION']
11
+ end
12
+
8
13
  Rake::TestTask.new('test') do |t|
9
14
  t.ruby_opts << '-d' if Rake.application.options.trace
10
15
  t.libs << 'test'
11
16
  t.verbose = true
17
+ Rake::application[t.name].enhance([:"test:prerequisites"])
12
18
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'rake/common/classes'
4
+ require 'rake/common/logger'
4
5
  require 'rake/helpers/rake'
5
6
 
6
7
  module Rake
@@ -52,7 +53,7 @@ module Rake
52
53
  cmd = ['git']
53
54
  cmd << "-c i18n.logOutputEncoding=#{opts[:logoutputencoding]}" if opts[:logoutputencoding]
54
55
  cmd << 'log' << '--format=%B' << "#{opts[:since]}..HEAD"
55
- p cmd if trace?
56
+ Logger.trace(Logger::VERBOSE, cmd)
56
57
  @changelog=%x[#{cmd.join(' ')}].lines.to_a
57
58
  @changelog.map! do |line|
58
59
  line.chomp!
@@ -69,7 +70,7 @@ module Rake
69
70
  @changelog.uniq!
70
71
  do_filter
71
72
  do_process
72
- puts @changelog if trace?
73
+ Logger.trace(Logger::TRACE, @changelog)
73
74
  end
74
75
 
75
76
  def charset
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ module Rake
4
+ module Delphi
5
+ class Logger
6
+ NORMAL = 0
7
+ VERBOSE = 1
8
+ DEBUG = 2
9
+ TRACE = 3
10
+ def self.debug?
11
+ return ENV['RAKE_DELPHI_TRACE'].to_i >= DEBUG
12
+ end
13
+
14
+ def self.trace(level, msg)
15
+ if ENV['RAKE_DELPHI_TRACE'].to_i >= level
16
+ if msg.kind_of?(String)
17
+ $stderr.puts(msg)
18
+ else
19
+ require 'pp'
20
+ PP.pp(msg, $stderr)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -15,7 +15,7 @@ module Rake
15
15
  cmd += "#{predefined[k]} #{opts[k]} " if opts[k]
16
16
  end
17
17
  cmd = "#{sendmail} -i #{cmd}"
18
- pp cmd if trace?
18
+ Logger.trace(Logger::VERBOSE, cmd)
19
19
  if @task.application.windows? && Rake.ruby18?
20
20
  require 'win32/open3'
21
21
  else
@@ -36,7 +36,7 @@ module Rake
36
36
  class ZipTask < BasicTask
37
37
  def initialize(task, zipfile, files, options = nil)
38
38
  super(task)
39
- pp [zipfile, files] if trace?
39
+ Logger.trace(Logger::VERBOSE, [zipfile, files])
40
40
  raise "zipfile name is not defined!" if zipfile.nil? || zipfile.empty?
41
41
  @norubyzip = nil
42
42
  @options = options || {}
@@ -52,7 +52,7 @@ module Rake
52
52
  raise "no ZIP library (nor zipruby nor rubyzip) found!" if @norubyzip
53
53
  if defined? Zip::Archive
54
54
  # zipruby used
55
- $stderr.puts '`zipruby` gem is used' if trace?
55
+ Logger.trace(Logger::VERBOSE, '`zipruby` gem is used')
56
56
  Zip::Archive.open(zipfile, Zip::CREATE | Zip::TRUNC) do |z|
57
57
  files.each do |f|
58
58
  zip_addfile(z, f)
@@ -60,7 +60,7 @@ module Rake
60
60
  end
61
61
  else
62
62
  # work with rubyzip
63
- $stderr.puts '`rubyzip` gem is used' if trace?
63
+ Logger.trace(Logger::VERBOSE, '`rubyzip` gem is used')
64
64
  File.unlink(zipfile) if File.exists?(zipfile)
65
65
  Zip.options[:continue_on_exists_proc] = true
66
66
  Zip::ZipFile.open(zipfile, Zip::ZipFile::CREATE) do |z|
data/lib/rake/delphi.rb CHANGED
@@ -2,3 +2,4 @@
2
2
 
3
3
  require 'rake/helpers/rake'
4
4
  require 'rake/helpers/raketask'
5
+ require 'rake/delphi/version'
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'rake'
4
4
  require 'rake/common/chdirtask'
5
+ require 'rake/common/logger'
5
6
  require 'rake/delphi/envvariables'
6
7
  require 'rake/delphi/resources'
7
8
  require 'rake/delphi/tool'
@@ -15,16 +16,30 @@ module Rake
15
16
  'bin/dcc32.exe'
16
17
  end
17
18
 
18
- def readLibraryPaths
19
- libpaths = self.class.readUserOption('Library', 'Search Path', self.version).split(';') \
19
+ def delphidir
20
+ @@delphidir
21
+ end
22
+
23
+ def delphilib
24
+ ENV['BDSLIB']
25
+ end
26
+
27
+ def readLibraryPaths(platform)
28
+ warn "WARNING! You are using Delphi XE or above but no platform defined!" if ENV['DELPHI_VERSION'].to_i >= 14 && ! platform
29
+
30
+ platform = platform.to_s != '' ? '\\' + platform : ''
31
+ # platform not used for old Delphis 'SearchPath'
32
+ libpaths = self.class.readUserOption('Library' + platform, 'Search Path', self.version).split(';') \
20
33
  | self.class.readUserOption('Library', 'SearchPath', self.version).split(';')
34
+ Logger.trace(Logger::TRACE, libpaths)
21
35
  dev = EnvVariables.new(self.class.rootForVersion(self.version) + '\Environment Variables', self.delphidir)
22
36
  libpaths.map! do |lp|
23
- if !lp.nil? && !lp.empty?
37
+ unless lp.to_s.empty?
24
38
  lp = dev.expand(lp)
25
39
  end
26
40
  lp
27
41
  end
42
+ Logger.trace(Logger::TRACE, libpaths)
28
43
  return libpaths
29
44
  end
30
45
  end
@@ -36,11 +51,11 @@ module Rake
36
51
  @@symbols = [:quiet, :assertions, :build, :optimization, :debug, :defines,
37
52
  :debuginfo, :localsymbols, :console, :warnings, :hints, :altercfg,
38
53
  :includepaths, :writeableconst,
39
- :map, :dcuoutput, :bploutput,
54
+ :map, :dcuoutput, :bploutput, :aliases, :platform, :namespaces,
40
55
  :dcpoutput, :dcu, :uselibrarypath, :uselibrarypath, :usecfg]
41
56
  public
42
57
  @@symbols.map do |sym|
43
- attr_accessor sym
58
+ attr_accessor sym unless method_defined?(sym)
44
59
  end
45
60
 
46
61
  def initialize(name, application)
@@ -50,9 +65,17 @@ module Rake
50
65
  @rc_template_task = application.define_task(RCTemplateTask, shortname + ':rc:template')
51
66
  @rc_task = application.define_task(RCTask, shortname + ':rc')
52
67
  enhance([@rc_template_task, @rc_task])
68
+ @platform = nil
53
69
  @dcc32Tool = Dcc32Tool.new
54
70
  end
55
71
 
72
+ # used in tests
73
+ def reenable
74
+ # recreate Dcc32Tool to reinitialize paths to tool
75
+ @dcc32Tool = Dcc32Tool.new(true)
76
+ super
77
+ end
78
+
56
79
  def versionInfoClass
57
80
  @dcc32Tool.versionInfoClass
58
81
  end
@@ -66,7 +89,19 @@ module Rake
66
89
  end
67
90
 
68
91
  def delphilibs
69
- return [@dcc32Tool.delphidir + 'Lib'] | @dcc32Tool.readLibraryPaths
92
+ return [@dcc32Tool.delphilib] | @dcc32Tool.readLibraryPaths(@platform)
93
+ end
94
+
95
+ def platform=(value)
96
+ @platform = value
97
+ Logger.trace(Logger::DEBUG, 'PLATFORM set: ' + value)
98
+ ENV['PLATFORM'] = @platform
99
+ # for XE and above set default aliases and namespaces
100
+ if ENV['DELPHI_VERSION'].to_i >= 14
101
+ @aliases = 'Generics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE'
102
+ @namespaces = 'Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;System;Xml;Data;Datasnap;Web;Soap'
103
+ Logger.trace(Logger::TRACE, 'Aliases and namespaces are set for Delphi XE')
104
+ end
70
105
  end
71
106
 
72
107
  def _paths(ppaths)
@@ -113,6 +148,14 @@ module Rake
113
148
  return @quiet ? '-Q' : ''
114
149
  end
115
150
 
151
+ def aliases
152
+ return @aliases ? Rake.quotepath('-A', @aliases) : ''
153
+ end
154
+
155
+ def namespaces
156
+ return @namespaces ? Rake.quotepath('-NS', @namespaces) : ''
157
+ end
158
+
116
159
  def exeoutput
117
160
  return @exeoutput || @bin
118
161
  end
@@ -157,16 +200,20 @@ module Rake
157
200
  def build_args
158
201
  args = []
159
202
  args << build? << warnings? << hints? << quiet? << debug? << alldebuginfo << map
160
- args << defines << writeableconst
203
+ args << defines << writeableconst << aliases << namespaces
161
204
  args << _source << outputs << implicitpaths
162
205
  args.flatten
163
206
  end
164
207
 
165
208
  public
166
209
  def init(properties)
167
- pp properties if trace?
210
+ Logger.trace(Logger::TRACE, properties)
168
211
  properties.map do |key, value|
169
- instance_variable_set("@#{key}", value)
212
+ begin
213
+ send("#{key}=", value)
214
+ rescue NoMethodError
215
+ instance_variable_set("@#{key}", value)
216
+ end
170
217
  end
171
218
  @_source = properties[:projectfile].pathmap('%X.dpr')
172
219
  src = @_source.gsub('\\', '/')
@@ -223,12 +270,16 @@ module Rake
223
270
  cmd = Rake.quotepath('', @dcc32Tool.toolpath)
224
271
  cmd << ([''] | args).join(' ')
225
272
  ChDir.new(self, File.dirname(@_source)) do |dir|
226
- RakeFileUtils.verbose(trace?) do
273
+ RakeFileUtils.verbose(Logger.debug?) do
227
274
  begin
228
275
  unless @usecfg
229
276
  cfg = @systempath.pathmap('%X.cfg')
230
277
  bak_cfg = @systempath.pathmap('%X.rake.cfg')
231
- mv cfg, bak_cfg
278
+ if File.exists?(cfg)
279
+ mv cfg, bak_cfg
280
+ else
281
+ warn "WARNING! Config #{cfg} is absent!"
282
+ end
232
283
  if @altercfg
233
284
  cp @altercfg, cfg
234
285
  end
@@ -238,7 +289,6 @@ module Rake
238
289
  paths.each do |p|
239
290
  f.write(p + "\n")
240
291
  end
241
- f.close
242
292
  end
243
293
  end
244
294
  sh cmd
@@ -247,7 +297,7 @@ module Rake
247
297
  begin
248
298
  cp cfg, cfg + '.1' if trace?
249
299
  ensure
250
- mv bak_cfg, cfg
300
+ mv bak_cfg, cfg if File.exists?(bak_cfg)
251
301
  end
252
302
  end
253
303
  end
@@ -1,39 +1,67 @@
1
1
  # encoding: utf-8
2
+ require 'rake/common/logger'
2
3
 
3
4
  module Rake
4
5
  module Delphi
5
- class EnvVariable
6
- attr_reader :name
7
- attr_accessor :value
6
+ class EnvVariables < ::Hash
7
+ def self.delphi_version
8
+ ENV['DELPHI_VERSION']
9
+ end
8
10
 
9
- def initialize(name, value)
10
- @name, @value = name, value
11
+ def readreg(regpath)
12
+ return unless regpath
13
+ begin
14
+ require 'win32/registry'
15
+ Logger.trace(Logger::DEBUG, "Reading environment variables from '#{regpath}'")
16
+ begin
17
+ ::Win32::Registry::HKEY_CURRENT_USER.open(regpath) do |reg|
18
+ reg.each do |name|
19
+ reg_type, value = reg.read(name)
20
+ value.gsub!('\\', '/')
21
+ add(name, value)
22
+ end
23
+ end
24
+ rescue ::Win32::Registry::Error
25
+ Logger.trace(Logger::DEBUG, "No reg key '%s'?!" % regpath)
26
+ end
27
+ rescue LoadError
28
+ Logger.trace(Logger::DEBUG, 'No `win32/registry` gem?!')
29
+ end
11
30
  end
12
- end
13
31
 
14
- class EnvVariables < ::Array
15
32
  def initialize(regpath, delphidir)
33
+ readreg(regpath)
16
34
  _dir = delphidir.gsub(/\/$/, '')
17
35
  add('DELPHI', _dir)
18
36
  add('BDS', _dir)
37
+ add('BDSLIB', _dir + '/Lib')
19
38
  expand_vars
39
+ Logger.trace(Logger::TRACE, self)
20
40
  end
21
41
 
22
42
  def add(var, value)
23
- self << EnvVariable.new(var, value)
43
+ self[var] = value
44
+ end
45
+
46
+ def expand_global(value)
47
+ value.gsub!(/\$\((?'env_name'\w+)\)/) do |match|
48
+ name = Regexp.last_match[:env_name].upcase
49
+ ENV[name] || match
50
+ end
51
+ value
24
52
  end
25
53
 
26
54
  def expand(value)
27
- self.each do |ev|
28
- value.gsub!("$(#{ev.name})", ev.value)
55
+ self.each do |name, val|
56
+ value.gsub!("$(#{name})", val)
57
+ value = expand_global(value)
29
58
  end
30
59
  value
31
60
  end
32
61
 
33
62
  def expand_vars
34
- self.map! do |v|
35
- v.value = expand(v.value)
36
- v
63
+ self.each do |name, value|
64
+ self[name] = expand(value)
37
65
  end
38
66
  end
39
67
  end
@@ -7,7 +7,6 @@ require 'rake/delphi/dcc32'
7
7
  require 'rake/helpers/file'
8
8
  require 'rake/helpers/raketask'
9
9
  require 'rake/helpers/string'
10
- require 'pp'
11
10
 
12
11
  module Rake
13
12
  module Delphi
@@ -32,27 +32,39 @@ module Rake
32
32
  class BDSVersionInfo < ProjectVersionInfo
33
33
  def initialize(task)
34
34
  super(task)
35
- content = @content['Delphi.Personality']['VersionInfoKeys']['VersionInfoKeys']
35
+ versioninfo = get_versioninfo_tag(@content)
36
+ # no need to continue if no version info file
37
+ return unless versioninfo
38
+ versioninfo = versioninfo['Delphi.Personality']['VersionInfoKeys']['VersionInfoKeys']
36
39
  use_encode = String.new.respond_to?(:encode)
37
40
  encoding = self.class.encoding
38
41
  if encoding && ! use_encode
39
42
  require 'iconv'
40
43
  iconv = Iconv.new(encoding, 'UTF-8')
41
44
  end
42
- content.each do |v|
45
+ versioninfo.each do |v|
43
46
  cv = v['content']
44
- cv = (use_encode ? cv.encode(encoding, 'UTF-8') : iconv.iconv(cv)) if encoding
47
+ cv = (use_encode ? cv.encode(encoding, 'UTF-8') : iconv.iconv(cv)) if cv && encoding
45
48
  @info[v['Name'].to_sym] = cv
46
49
  end
47
50
  end
48
51
 
52
+ def get_versioninfo_tag(content)
53
+ return content
54
+ end
55
+
49
56
  def self.encoding
50
57
  # override to set your own encoding
51
58
  nil
52
59
  end
53
60
 
54
61
  def do_getcontent
55
- @content = XmlSimple.xml_in(@file, :ForceArray => false)
62
+ if File.exists?(@file)
63
+ @content = XmlSimple.xml_in(@file, :ForceArray => false)
64
+ else
65
+ warn "WARNING! Version info file #{@file} does not exists"
66
+ @content = nil
67
+ end
56
68
  end
57
69
 
58
70
  def _ext
@@ -65,12 +77,21 @@ module Rake
65
77
  return 'dproj'
66
78
  end
67
79
 
68
- def do_getcontent
69
- super
80
+ def get_versioninfo_tag(content)
81
+ # .dproj file has more nesting levels
82
+ return content['ProjectExtensions']['BorlandProject']['BorlandProject'] if content
83
+ end
84
+ end
85
+
86
+ class RAD2010VersionInfo < RAD2007VersionInfo
87
+ def get_versioninfo_tag(content)
70
88
  # .dproj file has more nesting levels
71
- @content = @content['ProjectExtensions']['BorlandProject']['BorlandProject']
89
+ return content['ProjectExtensions']['BorlandProject'] if content
72
90
  end
73
91
  end
74
92
 
93
+ class XEVersionInfo < RAD2010VersionInfo
94
+ end
95
+
75
96
  end
76
97
  end