37 'WSGIREF': {'setup': 'wsgiref','url': 'https://pypi.python.org/packages/source/w/wsgiref/wsgiref-0.1.2.zip', 'local':"wsgiref-0.1.2.zip", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}}, |
37 'WSGIREF': {'setup': 'wsgiref','url': 'https://pypi.python.org/packages/source/w/wsgiref/wsgiref-0.1.2.zip', 'local':"wsgiref-0.1.2.zip", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}}, |
38 } |
38 } |
39 |
39 |
40 class ResourcesEnv(object): |
40 class ResourcesEnv(object): |
41 |
41 |
42 def __init__(self, src_base, urls, normal_installs): |
42 def __init__(self, src_base, run_base, urls, normal_installs): |
43 self.src_base = src_base |
43 self.src_base = src_base |
|
44 self.run_base = run_base |
44 self.URLS = {} |
45 self.URLS = {} |
45 self.__init_url(urls) |
46 self.__init_url(urls) |
46 self.NORMAL_INSTALL = normal_installs |
47 self.NORMAL_INSTALL = normal_installs |
47 |
48 |
48 def get_src_base_path(self, fpath): |
49 def get_src_base_path(self, fpath): |
49 return os.path.abspath(os.path.join(self.src_base, fpath)).replace("\\","/") |
50 return os.path.abspath(os.path.join(self.src_base, fpath)).replace("\\","/") |
|
51 |
|
52 def get_run_res_base_path(self, fpath): |
|
53 return os.path.abspath(os.path.join(self.run_base, 'res', fpath)).replace("\\","/") |
50 |
54 |
51 def __add_package_def(self, key, dict): |
55 def __add_package_def(self, key, dict): |
52 self.URLS[key] = dict |
56 self.URLS[key] = dict |
53 |
57 |
54 def __init_url(self, urls): |
58 def __init_url(self, urls): |
55 for key, url_dict in urls.items(): |
59 for key, url_dict in urls.items(): |
56 url_dict_copy = url_dict.copy() |
60 url_dict_copy = url_dict.copy() |
|
61 if url_dict.get('install', {}).get('method','pip') == 'pip-req': |
|
62 get_base_path = self.get_run_res_base_path |
|
63 else: |
|
64 get_base_path = self.get_src_base_path |
57 if not url_dict['url'].startswith("http://"): |
65 if not url_dict['url'].startswith("http://"): |
58 url_dict_copy['url'] = self.get_src_base_path(url_dict['url']) |
66 url_dict_copy['url'] = get_base_path(url_dict['url']) |
59 url_dict_copy['local'] = self.get_src_base_path(url_dict['local']) |
67 url_dict_copy['local'] = get_base_path(url_dict['local']) |
60 |
68 |
61 self.__add_package_def(key, url_dict_copy ) |
69 self.__add_package_def(key, url_dict_copy ) |
62 |
70 |
63 def ensure_dir(dir, logger): |
71 def ensure_dir(dir, logger): |
64 logger.notify('Check directory %s' % dir) |
72 logger.notify('Check directory %s' % dir) |
65 if not os.path.exists(dir): |
73 if not os.path.exists(dir): |
182 |
190 |
183 install_libjpeg = gen_install_comp_lib("libjpeg", "LIBJPEG", ['--enable-shared']) |
191 install_libjpeg = gen_install_comp_lib("libjpeg", "LIBJPEG", ['--enable-shared']) |
184 install_zlib = gen_install_comp_lib("zlib", "ZLIB", []) |
192 install_zlib = gen_install_comp_lib("zlib", "ZLIB", []) |
185 |
193 |
186 |
194 |
187 def lib_generate_install_methods(path_locations, src_base, Logger, call_subprocess, normal_installs, options_to_add=None, urls= None): |
195 def lib_generate_install_methods(path_locations, src_base, run_base, Logger, call_subprocess, normal_installs, options_to_add=None, urls= None): |
188 |
196 |
189 all_urls = URLS.copy() |
197 all_urls = URLS.copy() |
190 if urls is not None: |
198 if urls is not None: |
191 all_urls.update(urls) |
199 all_urls.update(urls) |
192 |
200 |
193 res_env = ResourcesEnv(src_base, all_urls, normal_installs) |
201 res_env = ResourcesEnv(src_base, run_base, all_urls, normal_installs) |
194 |
202 |
195 def filter_python_develop(line): |
203 def filter_python_develop(line): |
196 if not line.strip(): |
204 if not line.strip(): |
197 return Logger.DEBUG |
205 return Logger.DEBUG |
198 for prefix in ['Searching for', 'Reading ', 'Best match: ', 'Processing ', |
206 for prefix in ['Searching for', 'Reading ', 'Best match: ', 'Processing ', |
201 if line.startswith(prefix): |
209 if line.startswith(prefix): |
202 return Logger.DEBUG |
210 return Logger.DEBUG |
203 return Logger.NOTIFY |
211 return Logger.NOTIFY |
204 |
212 |
205 |
213 |
206 def normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess): |
214 def normal_install(key, res_path, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess): |
207 logger.notify("Install %s from %s with %s" % (key,res_env.URLS[key][res_source_key],method)) |
215 logger.notify("Install %s from %s with %s" % (key,res_path,method)) |
208 if method == 'pip': |
216 if method == 'pip': |
209 if sys.platform == 'win32': |
217 if sys.platform == 'win32': |
210 args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', res_env.URLS[key][res_source_key]] |
218 args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', res_path] |
211 else: |
219 else: |
212 args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', res_env.URLS[key][res_source_key]] |
220 args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', res_path] |
213 if option_str : |
221 if option_str : |
214 args.append(option_str) |
222 args.append(option_str) |
215 if res_source_key == 'local': |
223 if res_source_key == 'local': |
216 if extra_env is None: |
224 if extra_env is None: |
217 extra_env = {} |
225 extra_env = {} |
218 extra_env["PIP_DOWNLOAD_CACHE"] = res_env.get_src_base_path("") |
226 extra_env["PIP_DOWNLOAD_CACHE"] = res_env.get_src_base_path("") |
219 args.insert(2, '-f') |
227 args.insert(2, '-f') |
220 args.insert(3, res_env.get_src_base_path("")) |
228 args.insert(3, res_env.get_src_base_path("")) |
221 args.insert(4, '--no-index') |
229 args.insert(4, '--no-index') |
222 logger.notify("Install %s from %s with %s args %s " % (key,res_env.URLS[key][res_source_key],method, repr(args))) |
230 logger.notify("Install %s from %s with %s args %s " % (key,res_path,method, repr(args))) |
|
231 call_subprocess(args, |
|
232 cwd=os.path.abspath(tmp_dir), |
|
233 filter_stdout=filter_python_develop, |
|
234 show_stdout=True, |
|
235 extra_env=extra_env) |
|
236 if method == 'pip-req': |
|
237 if sys.platform == 'win32': |
|
238 args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', '-r', res_path] |
|
239 else: |
|
240 args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-r', res_path] |
|
241 if option_str : |
|
242 args.append(option_str) |
|
243 if res_source_key == 'local': |
|
244 if extra_env is None: |
|
245 extra_env = {} |
|
246 extra_env["PIP_DOWNLOAD_CACHE"] = res_env.get_src_base_path("") |
|
247 args.insert(2, '-f') |
|
248 args.insert(3, res_env.get_src_base_path("")) |
|
249 args.insert(4, '--no-index') |
|
250 logger.notify("Install %s from %s with %s args %s " % (key,res_path,method, repr(args))) |
223 call_subprocess(args, |
251 call_subprocess(args, |
224 cwd=os.path.abspath(tmp_dir), |
252 cwd=os.path.abspath(tmp_dir), |
225 filter_stdout=filter_python_develop, |
253 filter_stdout=filter_python_develop, |
226 show_stdout=True, |
254 show_stdout=True, |
227 extra_env=extra_env) |
255 extra_env=extra_env) |
228 else: |
256 else: |
229 if sys.platform == 'win32': |
257 if sys.platform == 'win32': |
230 args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'easy_install')), res_env.URLS[key][res_source_key]] |
258 args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'easy_install')), res_path] |
231 else: |
259 else: |
232 args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), res_env.URLS[key][res_source_key]] |
260 args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), res_path] |
233 if option_str : |
261 if option_str : |
234 args.insert(1,option_str) |
262 args.insert(1,option_str) |
235 call_subprocess(args, |
263 call_subprocess(args, |
236 cwd=os.path.abspath(tmp_dir), |
264 cwd=os.path.abspath(tmp_dir), |
237 filter_stdout=filter_python_develop, |
265 filter_stdout=filter_python_develop, |
270 ignore_packages = options.ignore_packages.split(",") |
298 ignore_packages = options.ignore_packages.split(",") |
271 |
299 |
272 logger.indent += 2 |
300 logger.indent += 2 |
273 try: |
301 try: |
274 for key in res_env.NORMAL_INSTALL: |
302 for key in res_env.NORMAL_INSTALL: |
275 if key not in res_env.URLS: |
303 install_options = None |
276 logger.notify("%s not found in def : passing" % (key,)) |
304 if isinstance(key, dict): |
277 install_options = res_env.URLS[key].get('install', None) |
305 install_options = key.get('install', default_install_options) |
|
306 install_options['method'] = 'pip-req' |
|
307 res_path = res_env.get_run_res_base_path(key['requirement']) |
|
308 else: |
|
309 if key not in res_env.URLS: |
|
310 logger.notify("%s not found in def : passing" % (key,)) |
|
311 install_options = res_env.URLS[key].get('install', None) |
|
312 res_path = res_env.URLS[key][res_source_key] |
278 if install_options is None: |
313 if install_options is None: |
279 install_options = default_install_options |
314 install_options = default_install_options |
280 method = install_options.get('method', default_install_options['method']) |
315 method = install_options.get('method', default_install_options['method']) |
281 option_str = install_options.get('option_str', default_install_options['option_str']) |
316 option_str = install_options.get('option_str', default_install_options['option_str']) |
282 extra_env = install_options.get('dict_extra_env', default_install_options['dict_extra_env']) |
317 extra_env = install_options.get('dict_extra_env', default_install_options['dict_extra_env']) |
291 if callable(method): |
326 if callable(method): |
292 method(option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop) |
327 method(option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop) |
293 elif method in globals() and callable(globals()[method]) and method not in ['pip', 'easy_install']: |
328 elif method in globals() and callable(globals()[method]) and method not in ['pip', 'easy_install']: |
294 globals()[method](option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop) |
329 globals()[method](option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop) |
295 else: |
330 else: |
296 normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess) |
331 normal_install(key, res_path, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess) |
297 |
332 |
298 logger.notify("Clear source dir") |
333 logger.notify("Clear source dir") |
299 shutil.rmtree(src_dir) |
334 shutil.rmtree(src_dir) |
300 |
335 |
301 finally: |
336 finally: |