-
Notifications
You must be signed in to change notification settings - Fork 617
/
env.rb
187 lines (155 loc) · 5.54 KB
/
env.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
require_relative 'helpers'
class Env
require 'win32/registry' if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
def self.exit_if_env_not_set_up
exit_unless_jdk_is_available
exit_unless_android_sdk_is_available
end
def self.exit_unless_android_sdk_is_available
if android_home_path
log "Android SDK found at: #{android_home_path}"
return
end
puts "Could not find an Android SDK please make sure it is installed."
puts "You can read about how Calabash-Android is searching for an Android SDK and how you can help here:"
puts "https://github.com/calabash/calabash-android/blob/master/documentation/installation.md#prerequisites"
exit 1
end
def self.keytool_path
find_executable_on_path(keytool_executable) ||
"\"#{jdk_path}/bin/#{keytool_executable}\""
end
def self.exit_unless_jdk_is_available
jdk = jdk_path
if find_executable_on_path(keytool_executable) || jdk
log "JDK found on PATH." if find_executable_on_path(keytool_executable)
log "JDK found at: #{jdk}" if jdk
return
end
puts "Could not find Java Development Kit please make sure it is installed."
puts "You can read about how Calabash-Android is searching for a JDK and how you can help here:"
puts "https://github.com/calabash/calabash-android/blob/master/documentation/installation.md#prerequisites"
exit 1
end
def self.jarsigner_path
find_executable_on_path(jarsigner_executable) ||
"\"#{jdk_path}/bin/#{jarsigner_executable}\""
end
def self.java_path
find_executable_on_path(java_executable) ||
"\"#{jdk_path}/bin/#{java_executable}\""
end
def self.jdk_path
path_if_jdk(ENV['JAVA_HOME']) ||
if is_windows?
path_if_jdk(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\JavaSoft\\Java Development Kit\\1.8', 'JavaHome')) ||
path_if_jdk(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\JavaSoft\\Java Development Kit\\1.7', 'JavaHome')) ||
path_if_jdk(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\JavaSoft\\Java Development Kit\\1.6', 'JavaHome'))
else
path_if_jdk(read_attribute_from_monodroid_config('java-sdk', 'path'))
end
end
def self.android_home_path
path_if_android_home(ENV["ANDROID_HOME"]) ||
if is_windows?
path_if_android_home(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\Android SDK Tools', 'Path')) ||
path_if_android_home("C:\\Android\\android-sdk")
else
path_if_android_home(read_attribute_from_monodroid_config('android-sdk', 'path'))
end
end
def self.find_executable_on_path(executable)
path_elements.each do |x|
f = File.join(x, executable)
return "\"#{f}\"" if File.exists?(f)
end
nil
end
def self.path_if_jdk(path)
path if path && File.exists?(File.join(path, 'bin', jarsigner_executable))
end
def self.zipalign_path
zipalign_path = File.join(android_home_path, 'tools', zipalign_executable)
unless File.exists?(zipalign_path)
log "Did not find zipalign at '#{zipalign_path}'. Trying to find zipalign in tools directories."
tools_directories.each do |dir|
zipalign_path = File.join(dir, zipalign_executable)
break if File.exists?(zipalign_path)
end
end
if File.exists?(zipalign_path)
log "Found zipalign at '#{zipalign_path}'"
zipalign_path
else
log("Did not find zipalign in any of '#{tools_directories.join("','")}'.", true)
raise 'Could not find zipalign'
end
end
def self.zipalign_executable
is_windows? ? 'zipalign.exe' : 'zipalign'
end
def self.jarsigner_executable
is_windows? ? 'jarsigner.exe' : 'jarsigner'
end
def self.java_executable
is_windows? ? 'java.exe' : 'java'
end
def self.keytool_executable
is_windows? ? 'keytool.exe' : 'keytool'
end
def self.adb_executable
is_windows? ? 'adb.exe' : 'adb'
end
def self.ant_path
is_windows? ? "ant.bat" : "ant"
end
def self.is_windows?
(RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
end
def self.tools_dir
tools_dir = tools_directories.first
log "Found tools directory at '#{tools_dir}'"
tools_dir
end
def self.tools_directories
Dir.chdir(android_home_path) do
dirs = Dir["build-tools/*"] + Dir["platform-tools"]
raise "Could not find tools directory in #{android_home_path}" if dirs.empty?
dirs.map {|dir| File.expand_path(dir)}
end
end
def self.adb_path
%Q("#{android_home_path}/platform-tools/#{adb_executable}")
end
def self.path_if_android_home(path)
path if path && File.exists?(File.join(path, 'platform-tools', adb_executable))
end
def self.path_elements
return [] unless ENV['PATH']
ENV['PATH'].split (/[:;]/)
end
def self.read_attribute_from_monodroid_config(element, attribute)
monodroid_config_file = File.expand_path("~/.config/xbuild/monodroid-config.xml")
if File.exists?(monodroid_config_file)
require 'rexml/document'
begin
return REXML::Document.new(IO.read(monodroid_config_file)).elements["//#{element}"].attributes[attribute]
rescue
end
end
end
def self.android_platform_path
Dir.chdir(android_home_path) do
platforms = Dir["platforms/android-*"].sort_by { |item| '%08s' % item.split('-').last }
raise "No Android SDK found in #{android_home_path}/platforms/" if platforms.empty?
File.expand_path(platforms.last)
end
end
def self.read_registry(root_key, key, value)
begin
root_key.open(key)[value]
rescue
nil
end
end
end