| # This source file is part of the Swift.org open source project |
| # |
| # Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors |
| # Licensed under Apache License v2.0 with Runtime Library Exception |
| # |
| # See http://swift.org/LICENSE.txt for license information |
| # See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| # |
| |
| from .config import Configuration |
| import platform |
| |
| class ArchType: |
| UnknownArch = 0 |
| armv7 = 1 |
| armeb = 2 |
| aarch64 = 3 |
| aarch64_be = 4 |
| bpfel = 5 |
| bpfeb = 6 |
| hexagon = 7 |
| mips = 8 |
| mipsel = 9 |
| mips64 = 10 |
| mips64el = 11 |
| msp430 = 12 |
| ppc = 13 |
| ppc64 = 14 |
| ppc64le = 15 |
| r600 = 16 |
| amdgcn = 17 |
| sparc = 18 |
| sparcv9 = 19 |
| sparcel = 20 |
| systemz = 21 |
| tce = 22 |
| thumb = 23 |
| thumbeb = 24 |
| x86 = 25 |
| x86_64 = 26 |
| xcore = 27 |
| nvptx = 28 |
| nvptx64 = 29 |
| le32 = 30 |
| le64 = 31 |
| amdil = 32 |
| amdil64 = 33 |
| hsail = 34 |
| hsail64 = 35 |
| spir = 36 |
| spir64 = 37 |
| kalimba = 38 |
| shave = 39 |
| armv6 = 40 |
| s390x = 41 |
| # Do not assume that these are 1:1 mapping. This should follow |
| # canonical naming conventions for arm, etc. architectures. |
| # See apple/swift PR #608 |
| @staticmethod |
| def to_string(value): |
| if value == ArchType.armv7: |
| return "armv7" |
| if value == ArchType.armv6: |
| return "armv6" |
| if value == ArchType.armeb: |
| return "armeb" |
| if value == ArchType.aarch64: |
| return "aarch64" |
| if value == ArchType.aarch64_be: |
| return "aarch64_be" |
| if value == ArchType.bpfel: |
| return "bpfel" |
| if value == ArchType.bpfeb: |
| return "bpfeb" |
| if value == ArchType.hexagon: |
| return "hexagon" |
| if value == ArchType.mips: |
| return "mips" |
| if value == ArchType.mipsel: |
| return "mipsel" |
| if value == ArchType.mips64: |
| return "mips64" |
| if value == ArchType.mips64el: |
| return "mips64el" |
| if value == ArchType.msp430: |
| return "msp430" |
| if value == ArchType.ppc: |
| return "powerpc" |
| if value == ArchType.ppc64: |
| return "powerpc64" |
| if value == ArchType.ppc64le: |
| return "powerpc64le" |
| if value == ArchType.r600: |
| return "r600" |
| if value == ArchType.amdgcn: |
| return "amdgcn" |
| if value == ArchType.sparc: |
| return "sparc" |
| if value == ArchType.sparcv9: |
| return "sparcv9" |
| if value == ArchType.sparcel: |
| return "sparcel" |
| if value == ArchType.systemz: |
| return "systemz" |
| if value == ArchType.tce: |
| return "tce" |
| if value == ArchType.thumb: |
| return "armv7" |
| if value == ArchType.thumbeb: |
| return "thumbeb" |
| if value == ArchType.x86: |
| return "i386" |
| if value == ArchType.x86_64: |
| return "x86_64" |
| if value == ArchType.xcore: |
| return "xcore" |
| if value == ArchType.nvptx: |
| return "nvptx" |
| if value == ArchType.nvptx64: |
| return "nvptx64" |
| if value == ArchType.le32: |
| return "le32" |
| if value == ArchType.le64: |
| return "le64" |
| if value == ArchType.amdil: |
| return "amdil" |
| if value == ArchType.amdil64: |
| return "amdil64" |
| if value == ArchType.hsail: |
| return "hsail" |
| if value == ArchType.hsail64: |
| return "hsail64" |
| if value == ArchType.spir: |
| return "spir" |
| if value == ArchType.spir64: |
| return "spir64" |
| if value == ArchType.kalimba: |
| return "kalimba" |
| if value == ArchType.shave: |
| return "shave" |
| if value == ArchType.s390x: |
| return "s390x" |
| return "unknown" |
| # Not 1:1, See to_string |
| @staticmethod |
| def from_string(string): |
| if string == "armeb": |
| return ArchType.armeb |
| if string == "arm": |
| return ArchType.armv7 |
| if string == "armv7": |
| return ArchType.armv7 |
| if string == "armv7l": |
| return ArchType.armv7 |
| if string == "armv6": |
| return ArchType.armv6 |
| if string == "armv6l": |
| return ArchType.armv6 |
| if string == "aarch64": |
| return ArchType.aarch64 |
| if string == "aarch64_be": |
| return ArchType.aarch64_be |
| if string == "bpfel": |
| return ArchType.bpfel |
| if string == "bpfeb": |
| return ArchType.bpfeb |
| if string == "hexagon": |
| return ArchType.hexagon |
| if string == "mips": |
| return ArchType.mips |
| if string == "mipsel": |
| return ArchType.mipsel |
| if string == "mips64": |
| return ArchType.mips64 |
| if string == "mips64el": |
| return ArchType.mips64el |
| if string == "msp430": |
| return ArchType.msp430 |
| if string == "ppc" or string == "powerpc": |
| return ArchType.ppc |
| if string == "ppc64" or string == "powerpc64": |
| return ArchType.ppc64 |
| if string == "ppc64le" or string == "powerpc64le": |
| return ArchType.ppc64le |
| if string == "r600": |
| return ArchType.r600 |
| if string == "amdgcn": |
| return ArchType.amdgcn |
| if string == "sparc": |
| return ArchType.sparc |
| if string == "sparcv9": |
| return ArchType.sparcv9 |
| if string == "sparcel": |
| return ArchType.sparcel |
| if string == "systemz": |
| return ArchType.systemz |
| if string == "tce": |
| return ArchType.tce |
| if string == "thumb": |
| return ArchType.thumb |
| if string == "thumbeb": |
| return ArchType.thumbeb |
| if string == "x86": |
| return ArchType.x86 |
| if string == "x86_64": |
| return ArchType.x86_64 |
| if string == "xcore": |
| return ArchType.xcore |
| if string == "nvptx": |
| return ArchType.nvptx |
| if string == "nvptx64": |
| return ArchType.nvptx64 |
| if string == "le32": |
| return ArchType.le32 |
| if string == "le64": |
| return ArchType.le64 |
| if string == "amdil": |
| return ArchType.amdil |
| if string == "amdil64": |
| return ArchType.amdil64 |
| if string == "hsail": |
| return ArchType.hsail |
| if string == "hsail64": |
| return ArchType.hsail64 |
| if string == "spir": |
| return ArchType.spir |
| if string == "spir64": |
| return ArchType.spir64 |
| if string == "kalimba": |
| return ArchType.kalimba |
| if string == "shave": |
| return ArchType.shave |
| if string == "s390x": |
| return ArchType.s390x |
| |
| return ArchType.UnknownArch |
| |
| |
| class ArchSubType: |
| NoSubArch = 0 |
| ARMSubArch_v8_1a = 1 |
| ARMSubArch_v8 = 2 |
| ARMSubArch_v7 = 3 |
| ARMSubArch_v7em = 4 |
| ARMSubArch_v7m = 5 |
| ARMSubArch_v7s = 6 |
| ARMSubArch_v6 = 7 |
| ARMSubArch_v6m = 8 |
| ARMSubArch_v6k = 9 |
| ARMSubArch_v6t2 = 10 |
| ARMSubArch_v5 = 11 |
| ARMSubArch_v5te = 12 |
| ARMSubArch_v4t = 13 |
| KalimbaSubArch_v3 = 14 |
| KalimbaSubArch_v4 = 15 |
| KalimbaSubArch_v5 = 16 |
| |
| |
| class OSType: |
| UnknownOS = 0 |
| CloudABI = 1 |
| Darwin = 2 |
| DragonFly = 3 |
| FreeBSD = 4 |
| IOS = 5 |
| KFreeBSD = 6 |
| Linux = 7 |
| Lv2 = 8 |
| MacOSX = 9 |
| NetBSD = 10 |
| OpenBSD = 11 |
| Solaris = 12 |
| Win32 = 13 |
| Haiku = 14 |
| Minix = 15 |
| RTEMS = 16 |
| NaCl = 17 |
| CNK = 18 |
| Bitrig = 19 |
| AIX = 20 |
| CUDA = 21 |
| NVCL = 22 |
| AMDHSA = 23 |
| PS4 = 24 |
| |
| |
| class ObjectFormat: |
| UnknownObjectFormat = 0 |
| COFF = 1 |
| ELF = 2 |
| MachO = 3 |
| |
| |
| class EnvironmentType: |
| UnknownEnvironment = 0 |
| GNU = 1 |
| GNUEABI = 2 |
| GNUEABIHF = 3 |
| GNUX32 = 4 |
| CODE16 = 5 |
| EABI = 6 |
| EABIHF = 7 |
| Android = 8 |
| MSVC = 9 |
| Itanium = 10 |
| Cygnus = 11 |
| |
| |
| class Vendor: |
| UnknownVendor = 0 |
| Apple = 1 |
| PC = 2 |
| SCEI = 3 |
| BGP = 4 |
| BGQ = 5 |
| Freescale = 6 |
| IBM = 7 |
| ImaginationTechnologies = 8 |
| MipsTechnologies = 9 |
| NVIDIA = 10 |
| CSR = 11 |
| |
| |
| class Target: |
| triple = None |
| sdk = None |
| arch = None |
| environ = None |
| executable_suffix = "" |
| dynamic_library_prefix = "lib" |
| dynamic_library_suffix = ".dylib" |
| static_library_prefix = "lib" |
| static_library_suffix = ".a" |
| |
| def __init__(self, triple): |
| if "linux" in triple: |
| self.sdk = OSType.Linux |
| self.dynamic_library_suffix = ".so" |
| elif "freebsd" in triple: |
| self.sdk = OSType.FreeBSD |
| self.dynamic_library_suffix = ".so" |
| elif "windows" in triple or "win32" in triple: |
| self.sdk = OSType.Win32 |
| self.dynamic_library_suffix = ".dll" |
| self.executable_suffix = ".exe" |
| if "cygnus" in triple: |
| self.environ = EnvironmentType.Cygnus |
| else: |
| self.environ = EnvironmentType.UnknownEnvironment |
| elif "darwin" in triple: |
| self.sdk = OSType.MacOSX |
| else: |
| print("Unknown platform") |
| |
| self.triple = triple |
| |
| comps = triple.split('-') |
| self.arch = ArchType.from_string(comps[0]) |
| |
| @staticmethod |
| def default(): |
| arch = ArchType.from_string(platform.machine()) |
| triple = ArchType.to_string(arch) |
| if platform.system() == "Linux": |
| if (arch == ArchType.armv6) or (arch == ArchType.armv7): |
| triple += "-linux-gnueabihf" |
| else: |
| triple += "-linux-gnu" |
| elif platform.system() == "Darwin": |
| triple += "-apple-darwin" |
| elif platform.system() == "FreeBSD": |
| # Make this work on 10 as well. |
| triple += "-freebsd11.0" |
| elif platform.system() == "CYGWIN_NT-10.0": |
| triple += "-windows-cygnus" |
| else: |
| # TODO: This should be a bit more exhaustive |
| print("unknown host os") |
| return None |
| return triple |
| |
| @property |
| def swift_triple(self): |
| triple = ArchType.to_string(self.arch) |
| if self.sdk == OSType.MacOSX: |
| return None |
| elif self.sdk == OSType.Linux: |
| # FIXME: It would be nice to detect the host ABI here |
| if (self.arch == ArchType.armv6) or (self.arch == ArchType.armv7): |
| if Configuration.current.target.triple == "armv7-none-linux-androideabi": |
| triple = Configuration.current.target.triple |
| else: |
| triple += "-unknown-linux-gnueabihf" |
| else: |
| triple += "-unknown-linux" |
| elif self.sdk == OSType.FreeBSD: |
| triple += "-unknown-freebsd" |
| elif self.sdk == OSType.Win32 and self.environ == EnvironmentType.Cygnus: |
| triple += "-unknown-windows-cygnus" |
| else: |
| print("unknown sdk for swift") |
| return None |
| |
| return triple |
| |
| @property |
| def swift_sdk_name(self): |
| if self.sdk == OSType.MacOSX: |
| return "macosx" |
| elif self.sdk == OSType.Linux and "android" in self.triple: |
| return "android" |
| elif self.sdk == OSType.Linux: |
| return "linux" |
| elif self.sdk == OSType.FreeBSD: |
| return "freebsd" |
| elif self.sdk == OSType.Win32: |
| return "cygwin" |
| else: |
| print("unknown sdk for swift") |
| return None |
| |
| |
| @property |
| def swift_arch(self): |
| return ArchType.to_string(self.arch) |
| |
| class TargetConditional: |
| _sdk = None |
| _arch = None |
| _default = None |
| def __init__(self, sdk = None, arch = None, default = None): |
| self._sdk = sdk |
| self._arch = arch |
| self._default = default |
| |
| def evalulate(self, target): |
| if self._sdk is not None and target.sdk in self._sdk: |
| return self._sdk[target.sdk] |
| if self._arch is not None and target.arch in self._arch: |
| return self._arch[target.arch] |
| return self._default |
| |
| @staticmethod |
| def value(value): |
| if type(value) is TargetConditional: |
| return value.evalulate(Configuration.current.target) |
| return value |