forked from openMSX/openMSX
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdetectsys.py
128 lines (120 loc) · 3.81 KB
/
detectsys.py
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
# Detect the native CPU and OS.
# Actually we rely on the Python "platform" module and map its output to names
# that the openMSX build understands.
from executils import captureStdout
from platform import architecture, machine, system
from subprocess import PIPE, STDOUT, Popen
import sys
def detectCPU():
'''Detects the CPU family (not the CPU model) of the machine were are
running on.
Raises ValueError if no known CPU is detected.
'''
cpu = machine().lower()
dashIndex = cpu.find('-')
if dashIndex != -1:
# Hurd returns "cputype-cpusubtype" instead of just "cputype".
cpu = cpu[ : dashIndex]
if cpu in ('x86_64', 'amd64'):
return 'x86_64'
elif cpu in ('x86', 'i386', 'i486', 'i586', 'i686'):
return 'x86'
elif cpu == 'ppc64le':
return 'ppc64le'
elif cpu.startswith('ppc') or cpu.endswith('ppc') or cpu.startswith('power'):
return 'ppc64' if cpu.endswith('64') else 'ppc'
elif cpu.startswith('arm'):
return 'arm'
elif cpu == 'aarch64':
return 'aarch64'
elif cpu == 'aarch64_be':
return 'aarch64_be'
elif cpu.startswith('mips') or cpu == 'sgi':
return 'mipsel' if cpu.endswith('el') else 'mips'
elif cpu == 'm68k':
return 'm68k'
elif cpu == 'ia64':
return 'ia64'
elif cpu.startswith('alpha'):
return 'alpha'
elif cpu.startswith('hppa') or cpu.startswith('parisc'):
return 'hppa'
elif cpu.startswith('s390'):
return 's390'
elif cpu.startswith('sparc') or cpu.startswith('sun4u'):
return 'sparc'
elif cpu.startswith('sh'):
return 'sheb' if cpu.endswith('eb') else 'sh'
elif cpu == 'avr32':
return 'avr32'
elif cpu == '':
# Python couldn't figure it out.
os = system().lower()
if os == 'windows':
# Relatively safe bet.
return 'x86'
raise ValueError('Unable to detect CPU')
else:
raise ValueError('Unsupported or unrecognised CPU "%s"' % cpu)
def detectOS():
'''Detects the operating system of the machine were are running on.
Raises ValueError if no known OS is detected.
'''
os = system().lower()
if os in (
'linux', 'darwin', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'gnu'
):
return os
elif os.startswith('gnu/'):
# GNU userland on non-Hurd kernel, for example Debian GNU/kFreeBSD.
# For openMSX the kernel is not really relevant, so treat it like
# a generic GNU system.
return 'gnu'
elif os.startswith('mingw') or os == 'windows':
return 'mingw-w64'
elif os == 'sunos':
return 'solaris'
elif os == '':
# Python couldn't figure it out.
raise ValueError('Unable to detect OS')
else:
raise ValueError('Unsupported or unrecognised OS "%s"' % os)
def getCompilerMachine():
# Note: Recent GCC and Clang versions support this option.
machine = captureStdout(sys.stderr, 'cc -dumpmachine')
if machine is not None:
machineParts = machine.split('-')
if len(machineParts) >= 3:
return machineParts[0], machineParts[2]
return None, None
if __name__ == '__main__':
try:
hostCPU = detectCPU()
if hostCPU == 'mips':
# Little endian MIPS is reported as just "mips" by Linux Python.
compilerCPU, compilerOS = getCompilerMachine()
if compilerCPU == 'mips':
pass
elif compilerCPU == 'mipsel':
hostCPU = compilerCPU
else:
print(
'Warning: Unabling to determine endianess; '
'compiling for big endian',
file=sys.stderr
)
hostOS = detectOS()
if hostOS == 'mingw32' and hostCPU == 'x86_64':
# It is possible to run MinGW on 64-bit Windows, but producing
# 64-bit code is not supported yet.
hostCPU = 'x86'
elif hostOS == 'darwin' and hostCPU == 'x86':
# If Python is 64-bit, both the CPU and OS support it, so we can
# compile openMSX for x86-64. Compiling in 32-bit mode might seem
# safer, but will fail if using MacPorts on a 64-bit capable system.
if architecture()[0] == '64bit':
hostCPU = 'x86_64'
print(hostCPU, hostOS)
except ValueError as ex:
print(ex, file=sys.stderr)
sys.exit(1)