rake-delphi 0.0.4 → 0.0.5

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.
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