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 187 188 189 190 191 192 193 194 195 196 197
|
# Copyright (C) 2006 Tobi Vollebregt
# Functions copied from the old build system.
import re, sys
########################################
### platform/cpu detection functions ###
########################################
def platform():
if sys.platform == 'linux2' or sys.platform == 'linux-i386':
print "Detected platform : linux"
detected_platform='linux'
elif sys.platform[:7] == 'freebsd':
print "Detected platform : freebsd (%s)" % sys.platform
print "WARNING: support is incomplete"
detected_platform='freebsd'
elif sys.platform == 'win32':
print "Detected platform : windows"
detected_platform='windows'
elif sys.platform == 'darwin':
print "Detected platform : darwin"
print "WARNING: support is incomplete"
detected_platform='darwin'
print "NOTE: xcode files are available in /trunk/rts/build/xcode"
else:
print "Platform not supported yet, please edit SConstruct file"
detected_platform='unknown'
return detected_platform
# Set gcc_3_4 to false for versions of gcc below 3.4.
def processor(gcc_3_4=True):
print "Detecting processor..."
try:
f = open('/proc/cpuinfo', 'r')
except IOError:
import platform
bits = platform.architecture()[0]
if bits == '32bit':
# default to i686 on 32 bit platforms without /proc/cpuinfo
print " couldn't detect; assuming Pentium Pro or better"
archflags=['-march=i686']
else:
print " couldn't detect"
archflags=[]
return archflags
str = f.readline()
family=""
model=-1
vendor=""
archflags=[]
while str:
if str.startswith("vendor_id"):
if str.find("GenuineTMx86") != -1:
# Transmeta
vendor="GenuineTMx86"
elif str.find("GenuineIntel") != -1:
# Intel
vendor="GenuineIntel"
elif str.find("AuthenticAMD") != -1:
# AMD
vendor="AuthenticAMD"
elif str.startswith("cpu"):
# first re does not do anything more than family = str.strip() in my case
family = re.sub('^[^0-9A-Za-z]*', '', str).strip()
# this is more useful, finds the first block of numbers
family_number = re.findall('[0-9]+', str)[0]
elif str.startswith("model") and str.find("name") == -1:
model = re.sub('^[^0-9]*', '', str).strip()
if vendor == "GenuineTMx86":
if str.startswith("model name"):
if str.find("Transmeta Efficeon") != -1:
# Automatically reorders/realigns when
# converting to VLIW, so no alignment
# saves space without sacrificing speed
print " found Transmeta Efficeon"
archflags=['-march=i686']
if gcc_3_4: archflags+=['-mtune=pentium3']
else: archflags+=['-mcpu=pentium3']
archflags+=['-msse2', '-mfpmath=sse', '-falign-functions=0', '-falign-jumps=0', '-falign-loops=0']
elif vendor == "GenuineIntel":
if str.startswith("model name"):
if str.find("Intel(R) Pentium(R) 4 CPU") != -1:
print " found Intel Pentium 4"
archflags=['-march=pentium4']
elif str.find("Coppermine") != -1:
print " found Intel Celeron (Coppermine)"
archflags=['-march=pentium3']
elif str.find("Pentium III") != -1:
print " found Intel Pentium III"
archflags=['-march=pentium3']
elif str.find("Pentium II") != -1:
print " found Intel Pentium II"
archflags=['-march=pentium2']
elif str.find("Intel(R) Celeron(R) CPU") != -1:
print " found Intel Celeron (Willamette)"
archflags=['-march=pentium4']
elif str.find("Celeron") != -1:
print " found Intel Celeron 1"
archflags=['-march=pentium2']
elif str.find("Intel(R) Pentium(R) M") != -1:
print " found Intel Pentium-M"
if gcc_3_4: archflags=['-march=pentium-m']
else:
print "WARNING: gcc versions below 3.4 don't support -march=pentium-m, using -march=pentium4 instead"
archflags=['-march=pentium4']
elif str.find("Intel(R) Xeon(TM) CPU") != -1:
print " found Intel Xeon w/EM64T"
archflags=['-march=nocona', '-mmmx', '-msse3']
elif vendor == "AuthenticAMD":
if str.startswith("model name"):
if str.find("Duron") != -1:
if model == 7:
print " found AMD Duron Morgan"
archflags=['-march=athlon-xp']
elif model == 3:
print " found AMD Mobile Duron"
archflags=['-march=athlon-tbird']
else:
print " found AMD Duron"
archflags=['-march=athlon-tbird']
elif str.find("Sempron") != -1:
print " found AMD Sempron 64"
if gcc_3_4: archflags=['-march=athlon64']
else:
print "WARNING: gcc versions below 3.4 don't support -march=athlon64, using -march=athlon-4 -msse2 -mfpmath=sse instead"
archflags=['-march=athlon', '-msse2', '-mfpmath=sse']
elif (str.find("Athlon") != -1) or (str.find("Turion") != -1):
if str.find("64") != -1:
print " found AMD64"
if gcc_3_4: archflags=['-march=athlon64']
else:
print "WARNING: gcc versions below 3.4 don't support -march=athlon64, using -march=athlon-4 -msse2 -mfpmath=sse instead"
archflags=['-march=athlon', '-msse2', '-mfpmath=sse']
# maybe this should use int(family_number) rather than family
# i have no way of checking
elif family == 6 and model == 8:
print " found AMD Athlon Thunderbird XP"
archflags=['-march=athlon-xp']
else:
print " found AMD Athlon"
archflags=['-march=athlon']
elif str.find("Opteron") != -1:
print " found AMD Opteron"
if gcc_3_4: archflags=['-march=opteron']
else:
print "WARNING: gcc versions below 3.4 don't support -march=opteron, using -march=athlon-4 -msse2 -mfpmath=sse instead"
archflags=['-march=athlon-4', '-msse2', '-mfpmath=sse']
else:
if str.find("Nehemiah") != -1:
print " found VIA Nehemiah"
archflags=['-march=c3-2']
elif str.find("Eden") != -1:
print " found VIA Eden C3"
archflags=['-march=c3']
elif str.find("Ezra") != -1:
print " found VIA Ezra"
archflags=['-march=c3']
str = f.readline()
if len(archflags) == 0:
if vendor == "":
if family != -1: # has to be checked...
if family_number in ('970'):
print " found PowerPC 970 (G5)"
archflags=['-mtune=G5', '-maltivec', '-mabi=altivec']
#i think these are all the same as far as gcc cares
elif family_number in ('7450','7455','7445','7447','7457'):
print " found PowerPC 7450 (G4 v2)"
archflags=['-mtune=7450', '-maltivec', '-mabi=altivec']
elif family_number in ('7400','7410'):
print " found PowerPC 7400 (G4)"
archflags=['-mtune=7400', '-maltivec', '-mabi=altivec']
elif family_number in ('750'):
print " found PowerPC 750 (G3)"
archflags=['-mtune=750']
elif family_number in ('740'):
print " found PowerPC 740 (G3)"
archflags=['-mtune=740']
elif family_number in ('604'):
print " found PowerPC 604"
archflags=['-mtune=604']
elif family_number in ('603'):
print " found PowerPC 603"
archflags=['-mtune=603']
f.close()
if len(archflags) == 0:
print "Couldn't detect your CPU, guessing i686 compatible.."
archflags=['-march=i686']
return archflags
|