OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # | 2 # |
3 # Please keep this code python 2.4 compatible and stand alone. | 3 # Please keep this code python 2.4 compatible and stand alone. |
4 | 4 |
5 """ | 5 """ |
6 Fetch, build and install external Python library dependancies. | 6 Fetch, build and install external Python library dependancies. |
7 | 7 |
8 This fetches external python libraries, builds them using your host's | 8 This fetches external python libraries, builds them using your host's |
9 python and installs them under our own autotest/site-packages/ directory. | 9 python and installs them under our own autotest/site-packages/ directory. |
10 | 10 |
11 Usage? Just run it. | 11 Usage? Just run it. |
12 utils/build_externals.py | 12 utils/build_externals.py |
13 """ | 13 """ |
14 | 14 |
15 import compileall, logging, os, sha, shutil, sys, tempfile, time, urllib2 | 15 import compileall, logging, os, shutil, sys, tempfile, time, urllib2 |
16 import subprocess, re | 16 import subprocess, re |
17 import common | 17 import common |
18 from autotest_lib.client.common_lib import logging_config, logging_manager | 18 from autotest_lib.client.common_lib import logging_config, logging_manager |
19 from autotest_lib.client.common_lib import utils | 19 from autotest_lib.client.common_lib import utils |
20 from autotest_lib.utils import external_packages | 20 from autotest_lib.utils import external_packages |
21 | 21 |
22 # bring in site packages as well | 22 # bring in site packages as well |
23 utils.import_site_module(__file__, 'autotest_lib.utils.site_external_packages') | 23 utils.import_site_module(__file__, 'autotest_lib.utils.site_external_packages') |
24 | 24 |
25 # Where package source be fetched to relative to the top of the autotest tree. | 25 # Where package source be fetched to relative to the top of the autotest tree. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 # for the source code before checking the directory of the .pyc file. | 77 # for the source code before checking the directory of the .pyc file. |
78 # Don't leave references to our temporary build dir in the files. | 78 # Don't leave references to our temporary build dir in the files. |
79 logging.info('compiling .py files in %s to .pyc', install_dir) | 79 logging.info('compiling .py files in %s to .pyc', install_dir) |
80 compileall.compile_dir(install_dir, quiet=True) | 80 compileall.compile_dir(install_dir, quiet=True) |
81 | 81 |
82 # Some things install with whacky permissions, fix that. | 82 # Some things install with whacky permissions, fix that. |
83 external_packages.system("chmod -R a+rX '%s'" % install_dir) | 83 external_packages.system("chmod -R a+rX '%s'" % install_dir) |
84 | 84 |
85 errors = fetch_errors + install_errors | 85 errors = fetch_errors + install_errors |
86 for error_msg in errors: | 86 for error_msg in errors: |
87 print >>sys.stderr, error_msg | 87 logging.error(error_msg) |
88 | 88 |
89 return len(errors) | 89 return len(errors) |
90 | 90 |
91 | 91 |
92 def fetch_necessary_packages(dest_dir, install_dir): | 92 def fetch_necessary_packages(dest_dir, install_dir): |
93 """ | 93 """ |
94 Fetches all ExternalPackages into dest_dir. | 94 Fetches all ExternalPackages into dest_dir. |
95 | 95 |
96 @param dest_dir: Directory the packages should be fetched into. | 96 @param dest_dir: Directory the packages should be fetched into. |
97 @param install_dir: Directory where packages will later installed. | 97 @param install_dir: Directory where packages will later installed. |
(...skipping 11 matching lines...) Expand all Loading... |
109 if names_to_check and package.name.lower() not in names_to_check: | 109 if names_to_check and package.name.lower() not in names_to_check: |
110 continue | 110 continue |
111 if not package.is_needed(install_dir): | 111 if not package.is_needed(install_dir): |
112 logging.info('A new %s is not needed on this system.', | 112 logging.info('A new %s is not needed on this system.', |
113 package.name) | 113 package.name) |
114 if INSTALL_ALL: | 114 if INSTALL_ALL: |
115 logging.info('Installing anyways...') | 115 logging.info('Installing anyways...') |
116 else: | 116 else: |
117 continue | 117 continue |
118 if not package.fetch(dest_dir): | 118 if not package.fetch(dest_dir): |
119 msg = '!!! Unable to download %s' % package.name | 119 msg = 'Unable to download %s' % package.name |
120 print msg | 120 logging.error(msg) |
121 errors.append(msg) | 121 errors.append(msg) |
122 else: | 122 else: |
123 fetched_packages.append(package) | 123 fetched_packages.append(package) |
124 | 124 |
125 return fetched_packages, errors | 125 return fetched_packages, errors |
126 | 126 |
127 | 127 |
128 def build_and_install_packages(packages, install_dir): | 128 def build_and_install_packages(packages, install_dir): |
129 """ | 129 """ |
130 Builds and installs all packages into install_dir. | 130 Builds and installs all packages into install_dir. |
131 | 131 |
132 @param packages - A list of already fetched ExternalPackage instances. | 132 @param packages - A list of already fetched ExternalPackage instances. |
133 @param install_dir - Directory the packages should be installed into. | 133 @param install_dir - Directory the packages should be installed into. |
134 | 134 |
135 @returns A list of error messages for any installs that failed. | 135 @returns A list of error messages for any installs that failed. |
136 """ | 136 """ |
137 errors = [] | 137 errors = [] |
138 for package in packages: | 138 for package in packages: |
139 if not package.build_and_install(install_dir): | 139 if not package.build_and_install(install_dir): |
140 msg = '!!! Unable to build and install %s' % package.name | 140 msg = 'Unable to build and install %s' % package.name |
141 print msg | 141 logging.error(msg) |
142 errors.append(msg) | 142 errors.append(msg) |
143 return errors | 143 return errors |
144 | 144 |
145 | 145 |
146 if __name__ == '__main__': | 146 if __name__ == '__main__': |
147 sys.exit(main()) | 147 sys.exit(main()) |
OLD | NEW |