lib/rake/delphi/tool.rb in rake-delphi-0.0.4 vs lib/rake/delphi/tool.rb in rake-delphi-0.0.5

- old
+ new

@@ -1,60 +1,68 @@ # encoding: utf-8 require 'rake/common/exectask' +require 'rake/common/logger' require 'rake/delphi/projectinfo' +require 'rake/delphi/envvariables' module Rake module Delphi class CustomDelphiTool < CustomExec DelphiRegRoot = 'SOFTWARE\\Borland\\Delphi' BDSRegRoot = 'SOFTWARE\\Borland\\BDS' EDSRegRoot = 'SOFTWARE\\CodeGear\\BDS' + EmbarcaderoRegRoot = 'SOFTWARE\\Embarcadero\\BDS' # used mainly in tests def self.reinit @@version, @@delphidir, @@toolpath = nil, nil, nil end + reinit - def initialize - @@version, @@delphidir, @@toolpath = self.class.find unless @@version + def initialize(checkExistance = false) + @@version, @@delphidir, @@toolpath = self.class.find(checkExistance) unless @@version end def self.toolName raise 'Abstract method "toolName". Override it' end def version @@version end - def delphidir - @@delphidir - end - def toolpath @@toolpath end def versionInfoClass - return @@version.to_f < 11 ? BDSVersionInfo : RAD2007VersionInfo + return @@version.to_f < 11 ? BDSVersionInfo : \ + @@version.to_f < 13 ? RAD2007VersionInfo : \ + @@version.to_f < 14 ? RAD2010VersionInfo : XEVersionInfo end def self.readUserOption(key, name, ver) begin require 'win32/registry' root = rootForVersion(ver) + '\\' + key + key_exists = false begin + Logger.trace(Logger::DEBUG, "Reading user option '#{name}' in '#{root}'") ::Win32::Registry::HKEY_CURRENT_USER.open(root) do |reg| + key_exists = true reg_typ, reg_val = reg.read(name) return reg_val.gsub('\\', '/') end rescue ::Win32::Registry::Error + Logger.trace(Logger::DEBUG, "No reg key '%s'?!" % \ + (key_exists ? "#{root}\\#{name}" : root)) return '' end rescue LoadError + Logger.trace(Logger::DEBUG, 'No `win32/registry` gem?!') return '' end end def self.version4version(version) @@ -71,69 +79,93 @@ if version.to_f < 9 regRoot = DelphiRegRoot else if version.to_f < 12 regRoot = BDSRegRoot - else + elsif version.to_f < 14 regRoot = EDSRegRoot + else + regRoot = EmbarcaderoRegRoot end end version = version4version(version) - return regRoot + '\\' + version + regRoot = regRoot + '\\' + version + Logger.trace(Logger::DEBUG, "Root for version #{version}: '#{regRoot}'") + return regRoot end def self.readDelphiDir(ver) begin require 'win32/registry' [::Win32::Registry::HKEY_LOCAL_MACHINE, \ # for local/manual installations ::Win32::Registry::HKEY_CURRENT_USER].each do |regRoot| begin + Logger.trace(Logger::DEBUG, "Finding Delphi dir for #{ver}") regRoot.open(rootForVersion(ver)) do |reg| reg_typ, reg_val = reg.read('RootDir') return reg_val.gsub('\\', '/') end rescue ::Win32::Registry::Error + Logger.trace(Logger::DEBUG, "No reg key '#{regRoot}'?!") end end return nil rescue LoadError + Logger.trace(Logger::DEBUG, 'No `win32/registry` gem?!') return nil end end def self.find(failIfNotFound = false) - v = ENV['DELPHI_VERSION'] + v = EnvVariables.delphi_version if ENV['DELPHI_DIR'] + Logger.trace(Logger::DEBUG, 'DELPHI_DIR is set: ' + ENV['DELPHI_DIR']) # append trailing path delimiter ENV['DELPHI_DIR'] = ENV['DELPHI_DIR'].gsub(/[^\/]$/, '\&/') tool = ENV['DELPHI_DIR'] + toolName checkToolFailure(tool) if failIfNotFound return v, ENV['DELPHI_DIR'], tool end if v.to_s.empty? v = [] - (4..14).each { |n| v << n.to_s } + (4..20).each { |n| v << n.to_s } v.reverse! else + Logger.trace(Logger::DEBUG, 'DELPHI_VERSION is set: ' + v) v = [v] end + tool_was_found = false v.each do |ver| path = readDelphiDir(ver) next unless path tool = path + toolName + tool_was_found = true + Logger.trace(Logger::DEBUG, "Got tool: '#{tool}'") if File.exists?(tool) # found it ! ENV['DELPHI_VERSION'] = ver ENV['DELPHI_DIR'] = path + Logger.trace(Logger::DEBUG, "Set: DELPHI_VERSION=#{ver}; DELPHI_DIR='#{path}'") return ver, path, tool + else + Logger.trace(Logger::DEBUG, 'But file does not exist!') end end - checkToolFailure(nil) if failIfNotFound + checkToolFailure(tool_was_found) if failIfNotFound return nil end def self.checkToolFailure(toolpath) - fail 'Could not find %s: (%s)' % [toolName, toolpath.to_s] unless File.exists?(toolpath.to_s) + if toolpath.kind_of?(TrueClass) || toolpath.kind_of?(FalseClass) + unless toolpath + fail 'Could not detect path for %s! Check your registry and DELPHI_VERSION environment variable.' % [toolName] + end + cond = ! toolpath + toolpath = '' + else + cond = File.exists?(toolpath) + end + fail 'Could not find %s: (%s)' % [toolName, toolpath] unless cond end end end end