# Testing configuration for back-deployment against older Apple system libc++abi.
#
# Under this configuration, we compile and link all the test suite against the latest libc++abi,
# however we run against the libc++abi on a different platform. This emulates the workflow of
# a developer building their application using recent tools but with the goal of deploying
# on existing devices running an older OS (and hence an older dylib).

import os, site
site.addsitedir(os.path.join('@LIBCXXABI_LIBCXX_PATH@', 'utils'))
import libcxx.test.params, libcxx.test.newconfig, libcxx.test.dsl

lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg')

BACKDEPLOYMENT_PARAMETERS = [
    libcxx.test.dsl.Parameter(name='cxx_runtime_root', type=str,
        actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{cxx-runtime-root}', root)],
        help="""
        The simulated root of the system (for libc++) when running tests.

        This should be a directory hierarchy under which the libc++ dylib can be found.
        The dylib in that hierarchy is the one that will be used at runtime when running
        the tests.
        """),
    libcxx.test.dsl.Parameter(name='abi_runtime_root', type=str,
        actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{abi-runtime-root}', root)],
        help="""
        The simulated root of the system (for libc++abi) when running tests.

        This should be a directory hierarchy under which the libc++abi dylib can be found.
        The dylib in that hierarchy is the one that will be used at runtime when running
        the tests.
        """),
    libcxx.test.dsl.Parameter(name='unwind_runtime_root', type=str,
        actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{unwind-runtime-root}', root)],
        help="""
        The simulated root of the system (for libunwind) when running tests.

        This should be a directory hierarchy under which the libunwind dylib can be found.
        The dylib in that hierarchy is the one that will be used at runtime when running
        the tests.
        """),
]

config.substitutions.append(('%{flags}',
    '-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else ''
))
config.substitutions.append(('%{compile_flags}',
    '-nostdinc++ -I %{include} -I %{cxx-include} -I %{cxx-target-include} -DLIBCXXABI_NO_TIMER -D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS ' +
    '-I %{libcxx}/test/support -I %{libcxx}/src'
))
config.substitutions.append(('%{link_flags}',
    '-nostdlib++ -L %{lib} -lc++ -lc++abi'
))
config.substitutions.append(('%{exec}',
    '%{executor} --execdir %T --env DYLD_LIBRARY_PATH="%{cxx-runtime-root}:%{abi-runtime-root}:%{unwind-runtime-root}" -- '
))

libcxx.test.newconfig.configure(
    libcxx.test.params.DEFAULT_PARAMETERS + BACKDEPLOYMENT_PARAMETERS,
    libcxx.test.features.DEFAULT_FEATURES,
    config,
    lit_config
)
