Alexandre Rames | b78f139 | 2016-07-01 14:22:22 +0100 | [diff] [blame] | 1 | # Copyright 2015, VIXL authors |
armvixl | ad96eda | 2013-06-14 11:42:37 +0100 | [diff] [blame] | 2 | # All rights reserved. |
| 3 | # |
| 4 | # Redistribution and use in source and binary forms, with or without |
| 5 | # modification, are permitted provided that the following conditions are met: |
| 6 | # |
| 7 | # * Redistributions of source code must retain the above copyright notice, |
| 8 | # this list of conditions and the following disclaimer. |
| 9 | # * Redistributions in binary form must reproduce the above copyright notice, |
| 10 | # this list of conditions and the following disclaimer in the documentation |
| 11 | # and/or other materials provided with the distribution. |
| 12 | # * Neither the name of ARM Limited nor the names of its contributors may be |
| 13 | # used to endorse or promote products derived from this software without |
| 14 | # specific prior written permission. |
| 15 | # |
| 16 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND |
| 17 | # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 18 | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 19 | # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE |
| 20 | # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 21 | # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| 22 | # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| 23 | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| 24 | # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 25 | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 26 | |
armvixl | db64434 | 2015-07-21 11:37:10 +0100 | [diff] [blame] | 27 | import glob |
armvixl | 6e2c827 | 2015-03-31 11:04:14 +0100 | [diff] [blame] | 28 | import os |
armvixl | ad96eda | 2013-06-14 11:42:37 +0100 | [diff] [blame] | 29 | import re |
armvixl | db64434 | 2015-07-21 11:37:10 +0100 | [diff] [blame] | 30 | import shlex |
| 31 | import subprocess |
| 32 | import sys |
| 33 | |
| 34 | |
| 35 | def ListCCFilesWithoutExt(path): |
| 36 | return map(lambda x : os.path.splitext(os.path.basename(x))[0], |
| 37 | glob.glob(os.path.join(path, '*.cc'))) |
armvixl | ad96eda | 2013-06-14 11:42:37 +0100 | [diff] [blame] | 38 | |
| 39 | |
| 40 | def abort(message): |
| 41 | print('ABORTING: ' + message) |
| 42 | sys.exit(1) |
| 43 | |
| 44 | |
| 45 | # Emulate python3 subprocess.getstatusoutput. |
armvixl | db64434 | 2015-07-21 11:37:10 +0100 | [diff] [blame] | 46 | def getstatusoutput(command, shell=False): |
armvixl | ad96eda | 2013-06-14 11:42:37 +0100 | [diff] [blame] | 47 | try: |
| 48 | args = shlex.split(command) |
armvixl | db64434 | 2015-07-21 11:37:10 +0100 | [diff] [blame] | 49 | output = subprocess.check_output(args, stderr=subprocess.STDOUT, shell=shell) |
armvixl | ad96eda | 2013-06-14 11:42:37 +0100 | [diff] [blame] | 50 | return 0, output.rstrip('\n') |
| 51 | except subprocess.CalledProcessError as e: |
| 52 | return e.returncode, e.output.rstrip('\n') |
| 53 | |
| 54 | |
armvixl | 0f35e36 | 2016-05-10 13:57:58 +0100 | [diff] [blame] | 55 | def IsCommandAvailable(command): |
| 56 | retcode, unused_output = getstatusoutput('which %s' % command) |
| 57 | return retcode == 0 |
| 58 | |
| 59 | |
armvixl | db64434 | 2015-07-21 11:37:10 +0100 | [diff] [blame] | 60 | def ensure_dir(path_name): |
| 61 | if not os.path.exists(path_name): |
| 62 | os.makedirs(path_name) |
armvixl | 6e2c827 | 2015-03-31 11:04:14 +0100 | [diff] [blame] | 63 | |
| 64 | |
armvixl | db64434 | 2015-07-21 11:37:10 +0100 | [diff] [blame] | 65 | # Check that the specified program is available. |
| 66 | def require_program(program_name): |
| 67 | rc, out = getstatusoutput('which %s' % program_name) |
| 68 | if rc != 0: |
| 69 | print('ERROR: The required program %s was not found.' % program_name) |
| 70 | sys.exit(rc) |
Alexandre Rames | 81c76e6 | 2016-07-19 09:53:09 +0100 | [diff] [blame] | 71 | |
| 72 | def relrealpath(path, start=os.getcwd()): |
| 73 | return os.path.relpath(os.path.realpath(path), start) |
Pierre Langlois | a3b2146 | 2016-08-04 16:01:51 +0100 | [diff] [blame] | 74 | |
| 75 | # Query the target architecture of the compiler. The 'target' architecture of |
| 76 | # the compiler used to build VIXL is considered to be the 'host' architecture of |
| 77 | # VIXL itself. |
| 78 | def GetHostArch(cxx): |
| 79 | # Instruct the compiler to dump all its preprocessor macros. |
| 80 | dump = subprocess.Popen([cxx, '-E', '-dM', '-'], stdin=subprocess.PIPE, |
| 81 | stdout=subprocess.PIPE) |
| 82 | out, _ = dump.communicate() |
| 83 | macro_list = [ |
| 84 | # Extract the macro name. |
| 85 | match.group(1) |
| 86 | for match in [ |
| 87 | # Capture macro name. |
| 88 | re.search('#define (.*?) 1', macro) |
| 89 | for macro in out.split('\n') |
| 90 | ] |
| 91 | # Filter out non-matches. |
| 92 | if match |
| 93 | ] |
| 94 | if "__x86_64__" in macro_list: |
| 95 | return "x86_64" |
| 96 | elif "__arm__" in macro_list: |
| 97 | return "aarch32" |
| 98 | elif "__aarch64__" in macro_list: |
| 99 | return "aarch64" |
| 100 | else: |
| 101 | raise Exception("Unsupported archtecture") |