def create_argument_parser()

in utils/build_swift/build_swift/driver_arguments.py [0:0]


def create_argument_parser():
    """Return a configured argument parser."""

    # NOTE: USAGE, DESCRIPTION and EPILOG are defined at the bottom of the file
    parser = _ApplyDefaultsArgumentParser(
        apply_defaults=_apply_default_arguments,
        formatter_class=argparse.RawDescriptionHelpFormatter,
        usage=USAGE,
        description=DESCRIPTION,
        epilog=EPILOG)

    builder = parser.to_builder()

    # Prepare DSL functions
    option = builder.add_option
    set_defaults = builder.set_defaults
    in_group = builder.in_group
    mutually_exclusive_group = builder.mutually_exclusive_group

    # Prepare DSL actions
    append = builder.actions.append
    store = builder.actions.store
    store_true = builder.actions.store_true
    store_false = builder.actions.store_false
    store_int = builder.actions.store_int
    store_path = builder.actions.store_path
    toggle_true = builder.actions.toggle_true
    toggle_false = builder.actions.toggle_false
    unsupported = builder.actions.unsupported

    # -------------------------------------------------------------------------
    # Top-level options

    option(['-n', '--dry-run'], store_true,
           help='print the commands that would be executed, but do not '
                'execute them')
    option('--dump-config', toggle_true,
           help='instead of building, write JSON to stdout containing '
                'various values used to build in this configuration')

    option(['--reconfigure'], store_true,
           help="Reconfigure all projects as we build")

    option('--legacy-impl', store_true('legacy_impl'),
           help='use legacy implementation')

    option('--build-runtime-with-host-compiler', toggle_true,
           help='Use the host compiler, not the self-built one to compile the '
                'Swift runtime')

    option(['-i', '--ios'], store_true,
           help='also build for iOS, but disallow tests that require an iOS '
                'device')
    option(['-I', '--ios-all'], store_true('ios_all'),
           help='also build for iOS, and allow all iOS tests')

    option(['--skip-local-build'], toggle_true('skip_local_build'),
           help='set to skip building for the local platform')

    option('--skip-ios', store_false('ios'),
           help='set to skip everything iOS-related')

    option('--tvos', toggle_true,
           help='also build for tvOS, but disallow tests that require a tvos '
                'device')
    option('--tvos-all', toggle_true('tvos_all'),
           help='also build for tvOS, and allow all tvOS tests')
    option('--skip-tvos', store_false('tvos'),
           help='set to skip everything tvOS-related')

    option('--watchos', toggle_true,
           help='also build for watchOS, but disallow tests that require an '
                'watchOS device')
    option('--watchos-all', toggle_true('watchos_all'),
           help='also build for Apple watchOS, and allow all Apple watchOS '
                'tests')
    option('--skip-watchos', store_false('watchos'),
           help='set to skip everything watchOS-related')

    option('--maccatalyst', toggle_true,
           help='Enable building Swift with macCatalyst support')

    option('--maccatalyst-ios-tests', toggle_true,
           help='When building for macCatalyst run tests with iOS-like '
                'target triple')

    option('--android', toggle_true,
           help='also build for Android')

    option('--swift-analyze-code-coverage', store,
           choices=['false', 'not-merged', 'merged'],
           # so CMake can see the inert mode as a false value
           default=defaults.SWIFT_ANALYZE_CODE_COVERAGE,
           help='enable code coverage analysis in Swift (false, not-merged, '
                'merged).')

    option('--swift-disable-dead-stripping', toggle_true, 
           help="Turn off Darwin-specific dead stripping for Swift host tools")

    option('--build-subdir', store,
           metavar='PATH',
           help='name of the directory under $SWIFT_BUILD_ROOT where the '
                'build products will be placed')
    option('--relocate-xdg-cache-home-under-build-subdir',
           store_true,
           help='relocate $XDG_CACHE_HOME to the same location '
                'where build products will be placed; '
                'this supports having multiple runs for different branches '
                'in CI bots for Linux')
    option('--install-prefix', store_path,
           default=targets.install_prefix(),
           help='The installation prefix. This is where built Swift products '
                '(like bin, lib, and include) will be installed.')
    option('--install-symroot', store_path,
           help='the path to install debug symbols into')
    option('--install-destdir', store_path,
           help='the path to use as the filesystem root for the installation')
    option('--install-all', toggle_true,
           help='Assume all built products should be installed')

    option(['-j', '--jobs'], store_int('build_jobs'),
           default=multiprocessing.cpu_count(),
           help='the number of parallel build jobs to use')

    option('--darwin-xcrun-toolchain', store,
           help='the name of the toolchain to use on Darwin')
    option('--cmake', store_path(executable=True),
           help='the path to a CMake executable that will be used to build '
                'Swift')
    option('--show-sdks', toggle_true,
           help='print installed Xcode and SDK versions')

    option('--extra-swift-args', append,
           help='Pass through extra flags to swift in the form of a CMake '
                'list "module_regexp;flag". Can be called multiple times to '
                'add multiple such module_regexp flag pairs. All semicolons '
                'in flags must be escaped with a "\\"')

    option('--host-cc', store_path(executable=True),
           help='the absolute path to CC, the "clang" compiler for the host '
                'platform. Default is auto detected.')
    option('--host-cxx', store_path(executable=True),
           help='the absolute path to CXX, the "clang++" compiler for the '
                'host platform. Default is auto detected.')
    option('--native-swift-tools-path', store_path,
           help='the path to a directory that contains prebuilt Swift tools '
                'that are executable on the host platform')
    option('--native-clang-tools-path', store_path,
           help='the path to a directory that contains prebuilt Clang tools '
                'that are executable on the host platform')
    option('--native-llvm-tools-path', store_path,
           help='the path to a directory that contains prebuilt LLVM tools '
                'that are executable on the host platform')
    option('--cmake-c-launcher', store_path(executable=True),
           default=os.environ.get('C_COMPILER_LAUNCHER', None),
           help='the absolute path to set CMAKE_C_COMPILER_LAUNCHER')
    option('--cmake-cxx-launcher', store_path(executable=True),
           default=os.environ.get('CXX_COMPILER_LAUNCHER', None),
           help='the absolute path to set CMAKE_CXX_COMPILER_LAUNCHER')
    option('--host-lipo', store_path(executable=True),
           help='the absolute path to lipo. Default is auto detected.')
    option('--host-libtool', store_path(executable=True),
           help='the absolute path to libtool. Default is auto detected.')
    option('--distcc', toggle_true,
           default=os.environ.get('USE_DISTCC') == '1',
           help='use distcc in pump mode')
    option('--sccache', toggle_true,
           default=os.environ.get('SWIFT_USE_SCCACHE') == '1',
           help='use sccache')
    option('--enable-asan', toggle_true,
           help='enable Address Sanitizer')
    option('--enable-ubsan', toggle_true,
           help='enable Undefined Behavior Sanitizer')
    option('--enable-tsan', toggle_true,
           help='enable Thread Sanitizer for swift tools')
    option('--enable-tsan-runtime', toggle_true,
           help='enable Thread Sanitizer on the swift runtime')
    option('--enable-lsan', toggle_true,
           help='enable Leak Sanitizer for swift tools')
    option('--enable-sanitize-coverage', toggle_true,
           help='enable sanitizer coverage for swift tools. Necessary for '
                'fuzzing swiftc')

    option('--compiler-vendor', store,
           choices=['none', 'apple'],
           default=defaults.COMPILER_VENDOR,
           help='Compiler vendor name')
    option('--clang-compiler-version', store,
           type=argparse.ClangVersionType(),
           metavar='MAJOR.MINOR.PATCH',
           help='string that indicates a compiler version for Clang')
    option('--clang-user-visible-version', store,
           type=argparse.ClangVersionType(),
           default=defaults.CLANG_USER_VISIBLE_VERSION,
           metavar='MAJOR.MINOR.PATCH',
           help='User-visible version of the embedded Clang and LLVM '
                'compilers')
    option('--swift-compiler-version', store,
           type=argparse.SwiftVersionType(),
           metavar='MAJOR.MINOR',
           help='string that indicates a compiler version for Swift')
    option('--swift-user-visible-version', store,
           type=argparse.SwiftVersionType(),
           default=defaults.SWIFT_USER_VISIBLE_VERSION,
           metavar='MAJOR.MINOR',
           help='User-visible version of the embedded Swift compiler')

    option('--darwin-deployment-version-osx', store,
           default=defaults.DARWIN_DEPLOYMENT_VERSION_OSX,
           metavar='MAJOR.MINOR',
           help='minimum deployment target version for OS X')
    option('--darwin-deployment-version-ios', store,
           default=defaults.DARWIN_DEPLOYMENT_VERSION_IOS,
           metavar='MAJOR.MINOR',
           help='minimum deployment target version for iOS')
    option('--darwin-deployment-version-tvos', store,
           default=defaults.DARWIN_DEPLOYMENT_VERSION_TVOS,
           metavar='MAJOR.MINOR',
           help='minimum deployment target version for tvOS')
    option('--darwin-deployment-version-watchos', store,
           default=defaults.DARWIN_DEPLOYMENT_VERSION_WATCHOS,
           metavar='MAJOR.MINOR',
           help='minimum deployment target version for watchOS')

    option('--extra-cmake-options', append,
           type=argparse.ShellSplitType(),
           help='Pass through extra options to CMake in the form of comma '
                'separated options "-DCMAKE_VAR1=YES,-DCMAKE_VAR2=/tmp". Can '
                'be called multiple times to add multiple such options.')

    option('--build-args', store,
           type=argparse.ShellSplitType(),
           default=[],
           help='arguments to the build tool. This would be prepended to the '
                'default argument that is "-j8" when CMake generator is '
                '"Ninja".')

    option('--verbose-build', toggle_true,
           help='print the commands executed during the build')

    option('--lto', store('lto_type'),
           choices=['thin', 'full'],
           const='full',
           default=None,
           metavar='LTO_TYPE',
           help='use lto optimization on llvm/swift tools. This does not '
                'imply using lto on the swift standard library or runtime. '
                'Options: thin, full. If no optional arg is provided, full is '
                'chosen by default')

    option('--clang-profile-instr-use', store_path,
           help='profile file to use for clang PGO')

    option('--llvm-max-parallel-lto-link-jobs', store_int,
           default=defaults.LLVM_MAX_PARALLEL_LTO_LINK_JOBS,
           metavar='COUNT',
           help='the maximum number of parallel link jobs to use when '
                'compiling llvm')

    option('--swift-tools-max-parallel-lto-link-jobs', store_int,
           default=defaults.SWIFT_MAX_PARALLEL_LTO_LINK_JOBS,
           metavar='COUNT',
           help='the maximum number of parallel link jobs to use when '
                'compiling swift tools.')

    option('--dsymutil-jobs', store_int,
           default=defaults.DSYMUTIL_JOBS,
           metavar='COUNT',
           help='the maximum number of parallel dsymutil jobs to use when '
                'extracting symbols. Tweak with caution, since dsymutil '
                'is memory intensive.')

    option('--disable-guaranteed-normal-arguments', store_true,
           help='Disable guaranteed normal arguments')

    option('--enable-stdlibcore-exclusivity-checking', store_true,
           help='Enable exclusivity checking in stdlibCore')

    option('--force-optimized-typechecker', store_true,
           help='Force the type checker to be built with '
                'optimization')

    option('--lit-args', store,
           default='-sv',
           metavar='LITARGS',
           help='lit args to use when testing')

    option('--coverage-db', store_path,
           help='coverage database to use when prioritizing testing')

    option('--llvm-install-components', store,
           default=defaults.llvm_install_components(),
           help='A semi-colon split list of llvm components to install')

    option('--bootstrapping', store('bootstrapping_mode'),
           choices=['off', 'hosttools', 'bootstrapping', 'bootstrapping-with-hostlibs'],
           help='The bootstrapping build mode for swift compiler modules')

    # -------------------------------------------------------------------------
    in_group('Host and cross-compilation targets')

    option('--host-target', store,
           default=StdlibDeploymentTarget.host_target().name,
           help='The host target. LLVM, Clang, and Swift will be built for '
                'this target. The built LLVM and Clang will be used to '
                'compile Swift for the cross-compilation targets.')

    option('--cross-compile-hosts', append,
           type=argparse.ShellSplitType(),
           default=[],
           help='A space separated list of targets to cross-compile host '
                'Swift tools for. Can be used multiple times.')

    option('--cross-compile-deps-path', store_path,
           help='The path to a directory that contains prebuilt cross-compiled '
                'library dependencies of the corelibs and other Swift repos, '
                'such as the libcurl dependency of FoundationNetworking')

    option('--cross-compile-append-host-target-to-destdir', toggle_true,
           default=True,
           help="Append each cross-compilation host target's name as a subdirectory "
                "for each cross-compiled toolchain's destdir, useful when building "
                "multiple toolchains and can be disabled if only cross-compiling one.")

    option('--stdlib-deployment-targets', store,
           type=argparse.ShellSplitType(),
           default=None,
           help='The targets to compile or cross-compile the Swift standard '
                'library for. %(default)s by default.'
                ' Comma separated list: {}'.format(
                    ' '.join(StdlibDeploymentTarget.get_target_names())))

    option('--build-stdlib-deployment-targets', store,
           type=argparse.ShellSplitType(),
           default=['all'],
           help='A space-separated list that filters which of the configured '
                'targets to build the Swift standard library for, or "all".')

    option('--swift-darwin-supported-archs', store,
           metavar='ARCHS',
           help='Semicolon-separated list of architectures to configure on '
                'Darwin platforms. If left empty all default architectures '
                'are configured.')

    option('--swift-darwin-module-archs', store,
           metavar='ARCHS',
           help='Semicolon-separated list of architectures to configure Swift '
                'module-only targets on Darwin platforms. These targets are '
                'in addition to the full library targets.')

    option('--swift-freestanding-is-darwin', toggle_true,
           help='True if the freestanding platform is a Darwin one.')

    # -------------------------------------------------------------------------
    in_group('Options to select projects')

    option('--infer', toggle_true('infer_dependencies'),
           help='Infer any downstream dependencies from enabled projects')

    option(['-l', '--lldb'], toggle_true('build_lldb'),
           help='build LLDB')

    option(['-b', '--llbuild'], toggle_true('build_llbuild'),
           help='build llbuild')

    option(['--back-deploy-concurrency'], toggle_true('build_backdeployconcurrency'),
           help='build back-deployment support for concurrency')

    option(['--install-back-deploy-concurrency'],
           toggle_true('install_backdeployconcurrency'),
           help='install back-deployment support libraries for concurrency')

    option(['--libcxx'], toggle_true('build_libcxx'),
           help='build libcxx')

    option(['-p', '--swiftpm'], toggle_true('build_swiftpm'),
           help='build swiftpm')

    option(['--install-swiftpm'], toggle_true('install_swiftpm'),
           help='install swiftpm')

    option(['--swiftsyntax'], toggle_true('build_swiftsyntax'),
           help='build swiftSyntax')

    option(['--skstresstester'], toggle_true('build_skstresstester'),
           help='build the SourceKit stress tester')

    option(['--swiftformat'], toggle_true('build_swiftformat'),
           help='build swift-format')

    option(['--swiftevolve'], toggle_true('build_swiftevolve'),
           help='build the swift-evolve tool')

    option(['--swift-driver'], toggle_true('build_swift_driver'),
           help='build swift-driver')
    option(['--swiftdocc'], toggle_true('build_swiftdocc'),
           help='build Swift DocC')

    option(['--skip-early-swift-driver'], toggle_false('build_early_swift_driver'),
           help='skip building the early swift-driver')

    option(['--indexstore-db'], toggle_true('build_indexstoredb'),
           help='build IndexStoreDB')
    option('--test-indexstore-db-sanitize-all',
           toggle_true('test_indexstoredb_sanitize_all'),
           help='run indexstore-db tests under all sanitizers')
    option(['--sourcekit-lsp'], toggle_true('build_sourcekitlsp'),
           help='build SourceKitLSP')
    option('--test-sourcekit-lsp-sanitize-all',
           toggle_true('test_sourcekitlsp_sanitize_all'),
           help='run sourcekit-lsp tests under all sanitizers')
    option('--install-swiftsyntax', toggle_true('install_swiftsyntax'),
           help='install SwiftSyntax')
    option('--swiftsyntax-verify-generated-files',
           toggle_true('swiftsyntax_verify_generated_files'),
           help='set to verify that the generated files in the source tree '
                'match the ones that would be generated from current main')
    option(['--install-sourcekit-lsp'], toggle_true('install_sourcekitlsp'),
           help='install SourceKitLSP')
    option(['--install-skstresstester'], toggle_true('install_skstresstester'),
           help='install the SourceKit stress tester')
    option(['--install-swift-driver'], toggle_true('install_swift_driver'),
           help='install new Swift driver')
    option(['--install-swiftevolve'], toggle_true('install_swiftevolve'),
           help='install SwiftEvolve')
    option(['--install-swiftdocc'], toggle_true('install_swiftdocc'),
           help='install Swift DocC')
    option(['--toolchain-benchmarks'],
           toggle_true('build_toolchainbenchmarks'),
           help='build Swift Benchmarks using swiftpm against the just built '
                'toolchain')
    option(['--swift-inspect'],
           toggle_true('build_swift_inspect'),
           help='build SwiftInspect using swiftpm against the just built '
                'toolchain')

    option('--xctest', toggle_true('build_xctest'),
           help='build xctest')

    option('--foundation', toggle_true('build_foundation'),
           help='build foundation')

    option('--libdispatch', toggle_true('build_libdispatch'),
           help='build libdispatch')

    option('--libicu', toggle_true('build_libicu'),
           help='build libicu')

    option('--playgroundsupport', toggle_true('build_playgroundsupport'),
           help='build PlaygroundSupport')
    option('--install-playgroundsupport',
           toggle_true('install_playgroundsupport'),
           help='install playground support')

    option('--build-ninja', toggle_true,
           help='build the Ninja tool')

    option(['--build-libparser-only'], toggle_true('build_libparser_only'),
           help='build only libParser for SwiftSyntax')

    option('--skip-build-clang-tools-extra',
           toggle_false('build_clang_tools_extra'),
           default=True,
           help='skip building clang-tools-extra as part of llvm')

    # -------------------------------------------------------------------------
    in_group('Extra actions to perform before or in addition to building')

    option(['-c', '--clean'], store_true,
           help='do a clean build')

    option(['--clean-install-destdir'], store_true,
           help='Clean the install destroot before building.')

    option('--export-compile-commands', toggle_true,
           help='generate compilation databases in addition to building')

    option('--symbols-package', store_path,
           help='if provided, an archive of the symbols directory will be '
                'generated at this path')
    option('--darwin-symroot-path-filters', append,
           type=argparse.ShellSplitType(),
           help='Space separated list of patterns used to match '
                'a subset of files to generate symbols for. '
                'Only supported on Darwin. Can be called multiple times '
                'to add multiple such options.')

    # -------------------------------------------------------------------------
    in_group('Build variant')

    with mutually_exclusive_group():

        set_defaults(build_variant='Debug')

        option(['-d', '--debug'], store('build_variant'),
               const='Debug',
               help='build the Debug variant of everything (LLVM, Clang, '
                    'Swift host tools, target Swift standard libraries, LLDB) '
                    '(default is %(default)s)')

        option(['-r', '--release-debuginfo'], store('build_variant'),
               const='RelWithDebInfo',
               help='build the RelWithDebInfo variant of everything (default '
                    'is %(default)s)')

        option(['-R', '--release'], store('build_variant'),
               const='Release',
               help='build the Release variant of everything (default is '
                    '%(default)s)')

        option(['--min-size-release'], store('build_variant'),
               const='MinSizeRel',
               help='build the MinSizeRel variant of everything (default is '
                    '%(default)s)')

    # -------------------------------------------------------------------------
    in_group('Override build variant for a specific project')

    option('--debug-llvm', store('llvm_build_variant'),
           const='Debug',
           help='build the Debug variant of LLVM')

    option('--debug-swift', store('swift_build_variant'),
           const='Debug',
           help='build the Debug variant of Swift host tools')

    option('--debug-swift-stdlib', store('swift_stdlib_build_variant'),
           const='Debug',
           help='build the Debug variant of the Swift standard library and '
                ' SDK overlay')

    option('--debug-lldb', store('lldb_build_variant'),
           const='Debug',
           help='build the Debug variant of LLDB')

    option('--lldb-build-with-xcode', store('lldb_build_with_xcode'),
           const='1',
           help='build LLDB using xcodebuild, if possible')

    option('--lldb-build-with-cmake', store('lldb_build_with_xcode'),
           const='0',
           help='build LLDB using CMake')

    option('--debug-cmark', store('cmark_build_variant'),
           const='Debug',
           help='build the Debug variant of CommonMark')

    option('--debug-foundation', store('foundation_build_variant'),
           const='Debug',
           help='build the Debug variant of Foundation')

    option('--debug-libdispatch', store('libdispatch_build_variant'),
           const='Debug',
           help='build the Debug variant of libdispatch')

    option('--debug-libicu', store('libicu_build_variant'),
           const='Debug',
           help='build the Debug variant of libicu')

    # -------------------------------------------------------------------------
    # Assertions group

    with mutually_exclusive_group():
        set_defaults(assertions=True)

        # TODO: Convert to store_true
        option(['-a', '--assertions'], store,
               const=True,
               help='enable assertions in all projects')

        # TODO: Convert to store_false
        option(['-A', '--no-assertions'], store('assertions'),
               const=False,
               help='disable assertions in all projects')

    # -------------------------------------------------------------------------
    in_group('Control assertions in a specific project')

    option('--cmark-assertions', store,
           const=True,
           help='enable assertions in CommonMark')

    option('--llvm-assertions', store,
           const=True,
           help='enable assertions in LLVM')
    option('--no-llvm-assertions', store('llvm_assertions'),
           const=False,
           help='disable assertions in LLVM')

    option('--swift-assertions', store,
           const=True,
           help='enable assertions in Swift')
    option('--no-swift-assertions', store('swift_assertions'),
           const=False,
           help='disable assertions in Swift')

    option('--swift-stdlib-assertions', store,
           const=True,
           help='enable assertions in the Swift standard library')
    option('--no-swift-stdlib-assertions', store('swift_stdlib_assertions'),
           const=False,
           help='disable assertions in the Swift standard library')

    option('--lldb-assertions', store,
           const=True,
           help='enable assertions in LLDB')
    option('--no-lldb-assertions', store('lldb_assertions'),
           const=False,
           help='disable assertions in LLDB')

    option('--llbuild-assertions', store,
           const=True,
           help='enable assertions in llbuild')
    option('--no-llbuild-assertions', store('llbuild_assertions'),
           const=False,
           help='disable assertions in llbuild')

    # -------------------------------------------------------------------------
    in_group('Select the CMake generator')

    set_defaults(cmake_generator=defaults.CMAKE_GENERATOR)

    option(['-e', '--eclipse'], store('cmake_generator'),
           const='Eclipse CDT4 - Ninja',
           help="use CMake's Eclipse generator (%(default)s by default)")
    option(['-m', '--make'], store('cmake_generator'),
           const='Unix Makefiles',
           help="use CMake's Makefile generator (%(default)s by default)")
    option(['-x', '--xcode'], store('cmake_generator'),
           const='Xcode',
           help="use CMake's Xcode generator (%(default)s by default)")

    # -------------------------------------------------------------------------
    in_group('Run tests')

    # NOTE: We can't merge -t and --test, because nargs='?' makes
    #       `-ti` to be treated as `-t=i`.
    # FIXME: Convert to store_true action
    option('-t', store('test', const=True),
           help='test Swift after building')
    option('--test', toggle_true,
           help='test Swift after building')

    option('-T', store('validation_test', const=True),
           help='run the validation test suite (implies --test)')
    option('--validation-test', toggle_true,
           help='run the validation test suite (implies --test)')

    # FIXME: Convert to store_true action
    option('-o', store('test_optimized', const=True),
           help='run the test suite in optimized mode too (implies --test)')
    option('--test-optimized', toggle_true,
           help='run the test suite in optimized mode too (implies --test)')

    # FIXME: Convert to store_true action
    option('-s', store('test_optimize_for_size', const=True),
           help='run the test suite in optimize for size mode too '
                '(implies --test)')
    option('--test-optimize-for-size', toggle_true,
           help='run the test suite in optimize for size mode too '
                '(implies --test)')

    # FIXME: Convert to store_true action
    option('-y', store('test_optimize_none_with_implicit_dynamic', const=True),
           help='run the test suite in optimize none with implicit dynamic'
                ' mode too (implies --test)')
    option('--test-optimize-none-with-implicit-dynamic', toggle_true,
           help='run the test suite in optimize none with implicit dynamic'
                'mode too (implies --test)')

    option('--long-test', toggle_true,
           help='run the long test suite')

    option('--stress-test', toggle_true,
           help='run the stress test suite')

    option('--host-test', toggle_true,
           help='run executable tests on host devices (such as iOS or tvOS)')

    option('--only-executable-test', toggle_true,
           help='Only run executable tests. Does nothing if host-test is not '
                'allowed')
    option('--only-non-executable-test', toggle_true,
           help='Only run non-executable tests.')

    option('--test-paths', append,
           type=argparse.ShellSplitType(),
           help='run tests located in specific directories and/or files '
                '(implies --test and/or --validation-test)')

    option(['-B', '--benchmark'], store_true,
           help='run the Swift Benchmark Suite after building')
    option('--benchmark-num-o-iterations', store_int,
           default=3,
           help='if the Swift Benchmark Suite is run after building, run N '
                'iterations with -O')
    option('--benchmark-num-onone-iterations', store_int,
           default=3,
           help='if the Swift Benchmark Suite is run after building, run N '
                'iterations with -Onone')

    # We want to run the TSan (compiler-rt) libdispatch tests on Linux, where
    # libdispatch is just another library and not available by default. To do
    # so we build Clang/LLVM/libdispatch and use it to compile/run the TSan
    # libdispatch tests.
    option('--tsan-libdispatch-test', toggle_true,
           help='Builds a new toolchain including the libdispatch C library. '
                'Then re-builds the TSan runtime (compiler-rt) using this '
                'freshly-built Clang and runs the TSan libdispatch tests.')

    option('--skip-test-osx', toggle_false('test_osx'),
           help='skip testing Swift stdlibs for Mac OS X')
    option('--skip-test-linux', toggle_false('test_linux'),
           help='skip testing Swift stdlibs for Linux')
    option('--skip-test-freebsd', toggle_false('test_freebsd'),
           help='skip testing Swift stdlibs for FreeBSD')
    option('--skip-test-cygwin', toggle_false('test_cygwin'),
           help='skip testing Swift stdlibs for Cygwin')

    # -------------------------------------------------------------------------
    in_group('Run build')

    option('--build-swift-dynamic-stdlib', toggle_true,
           default=True,
           help='build dynamic variants of the Swift standard library')

    option('--build-swift-static-stdlib', toggle_true,
           help='build static variants of the Swift standard library')

    option('--build-swift-dynamic-sdk-overlay', toggle_true,
           default=True,
           help='build dynamic variants of the Swift SDK overlay')

    option('--build-swift-static-sdk-overlay', toggle_true,
           help='build static variants of the Swift SDK overlay')

    option('--build-swift-stdlib-unittest-extra', toggle_true,
           help='Build optional StdlibUnittest components')

    option('--build-swift-stdlib-static-print', toggle_true,
           help='Build constant_vprintf support')

    option('--build-swift-stdlib-unicode-data', toggle_true,
           default=True,
           help='Include Unicode data in the standard library.'
                'Note: required for full String functionality')

    option(['-S', '--skip-build'], store_true,
           help='generate build directory only without building')

    option('--skip-build-linux', toggle_false('build_linux'),
           help='skip building Swift stdlibs for Linux')
    option('--skip-build-freebsd', toggle_false('build_freebsd'),
           help='skip building Swift stdlibs for FreeBSD')
    option('--skip-build-cygwin', toggle_false('build_cygwin'),
           help='skip building Swift stdlibs for Cygwin')
    option('--skip-build-osx', toggle_false('build_osx'),
           help='skip building Swift stdlibs for MacOSX')

    option('--skip-build-ios', toggle_false('build_ios'),
           help='skip building Swift stdlibs for iOS')
    option('--skip-build-ios-device', toggle_false('build_ios_device'),
           help='skip building Swift stdlibs for iOS devices '
                '(i.e. build simulators only)')
    option('--skip-build-ios-simulator', toggle_false('build_ios_simulator'),
           help='skip building Swift stdlibs for iOS simulator '
                '(i.e. build devices only)')

    option('--skip-build-tvos', toggle_false('build_tvos'),
           help='skip building Swift stdlibs for tvOS')
    option('--skip-build-tvos-device', toggle_false('build_tvos_device'),
           help='skip building Swift stdlibs for tvOS devices '
                '(i.e. build simulators only)')
    option('--skip-build-tvos-simulator', toggle_false('build_tvos_simulator'),
           help='skip building Swift stdlibs for tvOS simulator '
                '(i.e. build devices only)')

    option('--skip-build-watchos', toggle_false('build_watchos'),
           help='skip building Swift stdlibs for watchOS')
    option('--skip-build-watchos-device', toggle_false('build_watchos_device'),
           help='skip building Swift stdlibs for watchOS devices '
                '(i.e. build simulators only)')
    option('--skip-build-watchos-simulator',
           toggle_false('build_watchos_simulator'),
           help='skip building Swift stdlibs for watchOS simulator '
                '(i.e. build devices only)')

    option('--skip-build-android', toggle_false('build_android'),
           help='skip building Swift stdlibs for Android')

    option('--skip-build-benchmarks', toggle_false('build_benchmarks'),
           help='skip building Swift Benchmark Suite')

    option('--build-external-benchmarks', toggle_true,
           help='skip building Swift Benchmark Suite')

    option('--build-swift-private-stdlib', toggle_true,
           default=True,
           help='build the private part of the Standard Library. '
                'This can be useful to reduce build times when e.g. '
                'tests do not need to run')

    # -------------------------------------------------------------------------
    in_group('Skip testing specified targets')

    option('--skip-test-ios',
           toggle_false('test_ios'),
           help='skip testing all iOS targets. Equivalent to specifying both '
                '--skip-test-ios-simulator and --skip-test-ios-host')
    option('--skip-test-ios-simulator',
           toggle_false('test_ios_simulator'),
           help='skip testing iOS simulator targets')
    option('--skip-test-ios-32bit-simulator',
           toggle_false('test_ios_32bit_simulator'),
           default=False,
           help='skip testing iOS 32 bit simulator targets')
    option('--skip-test-watchos-32bit-simulator',
           toggle_false('test_watchos_32bit_simulator'),
           default=True,
           help='skip testing watchOS 32 bit simulator targets')
    option('--skip-test-ios-host',
           toggle_false('test_ios_host'),
           help='skip testing iOS device targets on the host machine (the '
                'phone itself)')

    option('--skip-test-tvos',
           toggle_false('test_tvos'),
           help='skip testing all tvOS targets. Equivalent to specifying both '
                '--skip-test-tvos-simulator and --skip-test-tvos-host')
    option('--skip-test-tvos-simulator',
           toggle_false('test_tvos_simulator'),
           help='skip testing tvOS simulator targets')
    option('--skip-test-tvos-host',
           toggle_false('test_tvos_host'),
           help='skip testing tvOS device targets on the host machine (the '
                'TV itself)')

    option('--skip-test-watchos',
           toggle_false('test_watchos'),
           help='skip testing all tvOS targets. Equivalent to specifying both '
                '--skip-test-watchos-simulator and --skip-test-watchos-host')
    option('--skip-test-watchos-simulator',
           toggle_false('test_watchos_simulator'),
           help='skip testing watchOS simulator targets')
    option('--skip-test-watchos-host',
           toggle_false('test_watchos_host'),
           help='skip testing watchOS device targets on the host machine (the '
                'watch itself)')

    option('--skip-test-android',
           toggle_false('test_android'),
           help='skip testing all Android targets.')
    option('--skip-test-android-host',
           toggle_false('test_android_host'),
           help='skip testing Android device targets on the host machine (the '
                'phone itself)')
    option('--skip-clean-libdispatch', toggle_false('clean_libdispatch'),
           help='skip cleaning up libdispatch')
    option('--skip-clean-foundation', toggle_false('clean_foundation'),
           help='skip cleaning up foundation')
    option('--skip-clean-xctest', toggle_false('clean_xctest'),
           help='skip cleaning up xctest')
    option('--skip-clean-llbuild', toggle_false('clean_llbuild'),
           help='skip cleaning up llbuild')
    option('--clean-early-swift-driver', toggle_true('clean_early_swift_driver'),
           help='Clean up the early SwiftDriver')
    option('--skip-test-early-swift-driver',
           store('test_early_swift_driver', const=False),
           help='Test the early SwiftDriver against the host toolchain')
    option('--skip-clean-swiftpm', toggle_false('clean_swiftpm'),
           help='skip cleaning up swiftpm')
    option('--skip-clean-swift-driver', toggle_false('clean_swift_driver'),
           help='skip cleaning up Swift driver')
    option('--skip-test-cmark', toggle_false('test_cmark'),
           help='skip testing cmark')
    option('--skip-test-swiftpm', toggle_false('test_swiftpm'),
           help='skip testing swiftpm')
    option('--skip-test-swift-driver', toggle_false('test_swift_driver'),
           help='skip testing Swift driver')
    option('--skip-test-swiftsyntax', toggle_false('test_swiftsyntax'),
           help='skip testing SwiftSyntax')
    option('--skip-test-indexstore-db', toggle_false('test_indexstoredb'),
           help='skip testing indexstore-db')
    option('--skip-test-sourcekit-lsp', toggle_false('test_sourcekitlsp'),
           help='skip testing sourcekit-lsp')
    option('--skip-test-playgroundsupport',
           toggle_false('test_playgroundsupport'),
           help='skip testing PlaygroundSupport')
    option('--skip-test-skstresstester', toggle_false('test_skstresstester'),
           help='skip testing the SourceKit Stress tester')
    option('--skip-test-swiftformat', toggle_false('test_swiftformat'),
           help='skip testing swift-format')
    option('--skip-test-swiftevolve', toggle_false('test_swiftevolve'),
           help='skip testing SwiftEvolve')
    option('--skip-test-toolchain-benchmarks',
           toggle_false('test_toolchainbenchmarks'),
           help='skip testing toolchain benchmarks')
    option('--skip-test-swift-inspect',
           toggle_false('test_swift_inspect'),
           help='skip testing swift_inspect')
    option('--skip-test-swiftdocc', toggle_false('test_swiftdocc'),
           help='skip testing swift-docc')

    # -------------------------------------------------------------------------
    in_group('Build settings specific for LLVM')

    option('--llvm-targets-to-build', store,
           default='X86;ARM;AArch64;PowerPC;SystemZ;Mips',
           help='LLVM target generators to build')

    option('--llvm-ninja-targets', append,
           type=argparse.ShellSplitType(),
           help='Space separated list of ninja targets to build for LLVM '
                'instead of the default ones. Only supported when using '
                'ninja to build. Can be called multiple times '
                'to add multiple such options.')

    option('--llvm-ninja-targets-for-cross-compile-hosts', append,
           type=argparse.ShellSplitType(),
           help='Space separated list of ninja targets to build for LLVM '
                'in cross compile hosts instead of the ones specified in '
                'llvm-ninja-targets (or the default ones). '
                'Can be called multiple times '
                'to add multiple such options.')

    # -------------------------------------------------------------------------
    in_group('Build settings for Android')

    option('--android-ndk', store_path,
           help='An absolute path to the NDK that will be used as a libc '
                'implementation for Android builds')

    option('--android-api-level', store,
           default='21',
           help='The Android API level to target when building for Android. '
                'Currently only 21 or above is supported')

    option('--android-deploy-device-path', store_path,
           default=android.adb.commands.DEVICE_TEMP_DIR,
           help='Path on an Android device to which built Swift stdlib '
                'products will be deployed. If running host tests, specify '
                'the "{}" directory.'.format(
                    android.adb.commands.DEVICE_TEMP_DIR))

    option('--android-arch', store,
           choices=['armv7', 'aarch64', 'x86_64'],
           default='armv7',
           help='The target architecture when building for Android. '
                'Currently, only armv7, aarch64, and x86_64 are supported. '
                '%(default)s is the default.')

    # -------------------------------------------------------------------------
    in_group('Experimental language features')

    option('--enable-experimental-differentiable-programming', toggle_true,
           default=True,
           help='Enable experimental Swift differentiable programming.')

    option('--enable-experimental-concurrency', toggle_true,
           default=True,
           help='Enable experimental Swift concurrency model.')

    option('--enable-experimental-distributed', toggle_true,
           default=True,
           help='Enable experimental Swift distributed actors.')

    option('--enable-experimental-string-processing', toggle_true,
           default=True,
           help='Enable experimental Swift string processing.')

    # -------------------------------------------------------------------------
    in_group('Unsupported options')

    option('--build-jobs', unsupported)
    option('--common-cmake-options', unsupported)
    option('--only-execute', unsupported)
    option('--skip-test-optimize-for-size', unsupported)
    option('--skip-test-optimize-none-with-implicit-dynamic', unsupported)
    option('--skip-test-optimized', unsupported)

    # -------------------------------------------------------------------------
    in_group('Build-script-impl arguments (for disambiguation)')

    # We need to represent these options so that we can skip installing them if
    # the user is running in install-all mode.
    option('--skip-build-cmark', toggle_false('build_cmark'),
           help='skip building cmark')
    option('--skip-build-llvm', toggle_false('build_llvm'),
           help='skip building llvm')
    option('--skip-build-swift', toggle_false('build_swift'),
           help='skip building swift')

    # We need to list --skip-test-swift explicitly because otherwise argparse
    # will auto-expand arguments like --skip-test-swift to the only known
    # argument --skip-test-swiftevolve.
    # These arguments are forwarded to impl_args in migration.py

    option('--install-swift', toggle_true('impl_install_swift'))
    option('--skip-test-swift', toggle_true('impl_skip_test_swift'))

    # -------------------------------------------------------------------------
    return builder.build()