############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# from __future__ import print_function import sys import os import warnings def _warn_multiple_option(option): warnings.warn('Option "{}" occurs multiple times on the command line.'.format(option)) def _warn_deprecated_option(option, replacement=None): w = 'Option "{}" is deprecated and may be removed in a future release.'.format(option) if replacement: w = '{}\nUse "{}" instead.'.format(w, replacement) warnings.warn(w) class Options(object): def __init__(self): # Dictionary containing values of all the possible options. self.dict = {} def has_option(self, name, remove=True): """ Returns True if argument '--name' was passed on the command line. """ option = '--{}'.format(name) count = sys.argv.count(option) remove_count = count if not remove and count > 0: remove_count -= 1 for i in range(remove_count): sys.argv.remove(option) if count > 1: _warn_multiple_option(option) return count > 0 def option_value(self, name, short_option_name=None, remove=True): """ Returns the value of a command line option or environment variable. :param name: The name of the command line option or environment variable. :param remove: Whether the option and its value should be removed from sys.argv. Useful when there's a need to query for the value and also pass it along to setuptools for example. :return: Either the option value or None. """ option = '--' + name short_option = '-' + short_option_name if short_option_name else None single_option_prefix = option + '=' value = None for index in reversed(range(len(sys.argv))): arg = sys.argv[index] if arg == option or short_option and arg == short_option: if value: _warn_multiple_option(option) else: if index + 1 >= len(sys.argv): raise RuntimeError("The option {} requires a value".format(option)) value = sys.argv[index + 1] if remove: sys.argv[index:index + 2] = [] elif arg.startswith(single_option_prefix): if value: _warn_multiple_option(option) else: value = arg[len(single_option_prefix):] if remove: sys.argv[index:index + 1] = [] if value is None: value = os.getenv(name.upper().replace('-', '_')) self.dict[name] = value return value options = Options() def has_option(*args, **kwargs): return options.has_option(*args, **kwargs) def option_value(*args, **kwargs): return options.option_value(*args, **kwargs) # Declare options OPTION = { "BUILD_TYPE": option_value("build-type"), "INTERNAL_BUILD_TYPE": option_value("internal-build-type"), "DEBUG": has_option("debug"), "RELWITHDEBINFO": has_option('relwithdebinfo'), "QMAKE": option_value("qmake"), "QT_VERSION": option_value("qt"), "CMAKE": option_value("cmake"), "OPENSSL": option_value("openssl"), "SHIBOKEN_CONFIG_DIR": option_value("shiboken-config-dir"), "ONLYPACKAGE": has_option("only-package"), "STANDALONE": has_option("standalone"), "MAKESPEC": option_value("make-spec"), "IGNOREGIT": has_option("ignore-git"), # don't generate documentation "SKIP_DOCS": has_option("skip-docs"), # don't include pyside2-examples "NOEXAMPLES": has_option("no-examples"), # number of parallel build jobs "JOBS": option_value('parallel', short_option_name='j'), # Legacy, not used any more. "JOM": has_option('jom'), # Do not use jom instead of nmake with msvc "NO_JOM": has_option('no-jom'), "BUILDTESTS": has_option("build-tests"), "MACOS_ARCH": option_value("macos-arch"), "MACOS_USE_LIBCPP": has_option("macos-use-libc++"), "MACOS_SYSROOT": option_value("macos-sysroot"), "MACOS_DEPLOYMENT_TARGET": option_value("macos-deployment-target"), "XVFB": has_option("use-xvfb"), "REUSE_BUILD": has_option("reuse-build"), "SKIP_CMAKE": has_option("skip-cmake"), "SKIP_MAKE_INSTALL": has_option("skip-make-install"), "SKIP_PACKAGING": has_option("skip-packaging"), "SKIP_MODULES": option_value("skip-modules"), "MODULE_SUBSET": option_value("module-subset"), "RPATH_VALUES": option_value("rpath"), "QT_CONF_PREFIX": option_value("qt-conf-prefix"), "QT_SRC": option_value("qt-src-dir"), "QUIET": has_option('quiet', remove=False), "VERBOSE_BUILD": has_option("verbose-build"), "SANITIZE_ADDRESS": has_option("sanitize-address"), "SNAPSHOT_BUILD": has_option("snapshot-build"), "LIMITED_API": option_value("limited-api"), "PACKAGE_TIMESTAMP": option_value("package-timestamp"), "SHORTER_PATHS": has_option("shorter-paths"), # This is used automatically by distutils.command.install object, to # specify the final installation location. "FINAL_INSTALL_PREFIX": option_value("prefix", remove=False), } _deprecated_option_jobs = option_value('jobs') if _deprecated_option_jobs: _warn_deprecated_option('jobs', 'parallel') OPTION["JOBS"] = _deprecated_option_jobs