blob: 0708dd18db6073227bbab196e97fc070e51377ca [file] [log] [blame]
# Copyright (c) 2014 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
import platform
from webports import error, util
VALID_TOOLCHAINS = ['glibc', 'pnacl', 'clang-newlib', 'emscripten']
VALID_LIBC = ['newlib', 'glibc']
class Configuration(object):
"""Class representing the build configuration for webports packages.
This consists of the following attributes:
toolchain - clang-newlib, glibc, pnacl
arch - x86_64, x86_32, arm, pnacl
debug - True/False
config_name - 'debug' or 'release'
If not specified in the constructor these are read from the
environment variables (TOOLCHAIN, NACL_ARCH, NACL_DEBUG).
"""
default_toolchain = 'pnacl'
def __init__(self, arch=None, toolchain=None, debug=None):
self.debug = None
self.libc = None
self.config_name = None
self.set_config(debug)
if arch is None:
arch = os.environ.get('NACL_ARCH')
if toolchain is None:
toolchain = os.environ.get('TOOLCHAIN')
if not toolchain:
if arch == 'pnacl':
toolchain = 'pnacl'
elif arch == 'emscripten':
toolchain = 'emscripten'
else:
toolchain = self.default_toolchain
self.toolchain = toolchain
if self.toolchain not in VALID_TOOLCHAINS:
raise error.Error("Invalid toolchain: %s" % self.toolchain)
if not arch:
if self.toolchain == 'pnacl':
arch = 'pnacl'
elif self.toolchain == 'emscripten':
arch = 'emscripten'
elif platform.machine() == 'i686':
arch = 'i686'
else:
arch = 'x86_64'
self.arch = arch
if self.arch not in util.arch_to_pkgarch:
raise error.Error("Invalid arch: %s" % arch)
self.set_libc()
def set_config(self, debug):
if debug is None:
if os.environ.get('NACL_DEBUG') == '1':
debug = True
else:
debug = False
self.debug = debug
if self.debug:
self.config_name = 'debug'
else:
self.config_name = 'release'
def set_libc(self):
if self.toolchain in ('pnacl', 'clang-newlib'):
self.libc = 'newlib'
elif self.toolchain == 'emscripten':
self.libc = 'emscripten'
else:
self.libc = self.toolchain
def __hash__(self):
return hash(str(self))
def __cmp__(self, other):
return cmp((self.libc, self.toolchain, self.debug),
(other.libc, other.toolchain, other.debug))
def __str__(self):
if self.arch == self.toolchain:
# For some toolchains (emscripten and pnacl), arch will always match the
# toolchain name is redundant to report it twice.
return '%s/%s' % (self.toolchain, self.config_name)
else:
return '%s/%s/%s' % (self.arch, self.toolchain, self.config_name)
def __repr__(self):
return '<Configuration %s>' % str(self)