2019-01-10 03:40:20 +08:00
#!/usr/bin/env bash
set -ue
function usage( ) {
cat <<EOM
2019-08-07 04:01:28 +08:00
$( basename ${ 0 } ) [ -h| --help] --monorepo-root <MONOREPO-ROOT> --std <STD> --arch <ARCHITECTURE> --deployment-target <TARGET> --sdk-version <SDK-VERSION> [ --lit-args <ARGS...>]
2019-01-10 03:40:20 +08:00
This script is used to continually test the back-deployment use case of libc++ and libc++abi on MacOS.
2019-08-07 04:01:28 +08:00
--monorepo-root Full path to the root of the LLVM monorepo. Both libc++ and libc++abi headers from the monorepo are used.
2019-01-10 03:40:20 +08:00
--std Version of the C++ Standard to run the tests under ( c++03, c++11, etc..) .
--arch Architecture to build the tests for ( 32, 64) .
2019-02-28 07:36:22 +08:00
--deployment-target The deployment target to run the tests for . This should be a version number of MacOS ( e.g. 10.12) . All MacOS versions until and including 10.9 are supported.
2020-02-11 20:50:38 +08:00
--sdk-version The version of the SDK to test with. This should be a version number of MacOS ( e.g. 10.12) . We'll link against the libc++ dylib in that SDK, but we' ll run against the one on the given deployment target. The SDK version must be no older than the deployment target.
2019-01-10 03:40:20 +08:00
[ --lit-args] Additional arguments to pass to lit ( optional) . If there are multiple arguments, quote them to pass them as a single argument to this script.
[ --no-cleanup] Do not cleanup the temporary directory that was used for testing at the end. This can be useful to debug failures. Make sure to clean up manually after.
[ -h, --help] Print this help.
EOM
}
2020-02-11 20:50:38 +08:00
function version-less-equal( ) {
[ " $1 " = " $( echo -e " $1 \n $2 " | sort -V | head -n1) " ]
}
function version-less( ) {
[ " $1 " = " $2 " ] && return 1 || version-less-equal $1 $2
}
2019-01-10 03:40:20 +08:00
while [ [ $# -gt 0 ] ] ; do
case " $1 " in
2019-08-07 04:01:28 +08:00
--monorepo-root)
MONOREPO_ROOT = " ${ 2 } "
if [ [ ! -d " ${ MONOREPO_ROOT } " ] ] ; then
echo " --monorepo-root ' ${ MONOREPO_ROOT } ' is not a valid directory "
2019-01-10 03:40:20 +08:00
usage
exit 1
fi
shift; shift
; ;
--std)
STD = " ${ 2 } "
shift; shift
; ;
--arch)
ARCH = " ${ 2 } "
shift; shift
; ;
--deployment-target)
DEPLOYMENT_TARGET = " ${ 2 } "
shift; shift
; ;
--sdk-version)
MACOS_SDK_VERSION = " ${ 2 } "
shift; shift
; ;
--lit-args)
ADDITIONAL_LIT_ARGS = " ${ 2 } "
shift; shift
; ;
--no-cleanup)
NO_CLEANUP = ""
shift
; ;
-h| --help)
usage
exit 0
; ;
*)
echo " ${ 1 } is not a supported argument "
usage
exit 1
; ;
esac
done
2019-08-07 04:01:28 +08:00
if [ [ -z ${ MONOREPO_ROOT +x } ] ] ; then echo "--monorepo-root is a required parameter" ; usage; exit 1; fi
2019-01-10 03:40:20 +08:00
if [ [ -z ${ STD +x } ] ] ; then echo "--std is a required parameter" ; usage; exit 1; fi
if [ [ -z ${ ARCH +x } ] ] ; then echo "--arch is a required parameter" ; usage; exit 1; fi
if [ [ -z ${ DEPLOYMENT_TARGET +x } ] ] ; then echo "--deployment-target is a required parameter" ; usage; exit 1; fi
if [ [ -z ${ MACOS_SDK_VERSION +x } ] ] ; then echo "--sdk-version is a required parameter" ; usage; exit 1; fi
if [ [ -z ${ ADDITIONAL_LIT_ARGS +x } ] ] ; then ADDITIONAL_LIT_ARGS = "" ; fi
2020-02-11 20:50:38 +08:00
if version-less " ${ MACOS_SDK_VERSION } " " ${ DEPLOYMENT_TARGET } " ; then
echo " SDK version ${ MACOS_SDK_VERSION } shouldn't be older than the deployment target ( ${ DEPLOYMENT_TARGET } ) "
usage
exit 1
fi
2019-01-10 03:40:20 +08:00
TEMP_DIR = " $( mktemp -d) "
echo " Created temporary directory ${ TEMP_DIR } "
function cleanup {
if [ [ -z ${ NO_CLEANUP +x } ] ] ; then
echo " Removing temporary directory ${ TEMP_DIR } "
rm -rf " ${ TEMP_DIR } "
else
echo " Temporary directory is at ' ${ TEMP_DIR } ', make sure to clean it up yourself "
fi
}
trap cleanup EXIT
2019-08-07 04:01:28 +08:00
LLVM_BUILD_DIR = " ${ TEMP_DIR } /llvm-build "
LLVM_INSTALL_DIR = " ${ TEMP_DIR } /llvm-install "
2019-01-10 03:40:20 +08:00
PREVIOUS_DYLIBS_URL = "http://lab.llvm.org:8080/roots/libcxx-roots.tar.gz"
LLVM_TARBALL_URL = "https://github.com/llvm-mirror/llvm/archive/master.tar.gz"
2020-04-09 04:05:02 +08:00
echo "@@@ Setting up LIT flags for architecture @@@"
LIT_ARCH_STRING = ""
if [ [ " ${ ARCH } " = = "32" ] ] ; then
LIT_ARCH_STRING = "--param=enable_32bit=true"
fi
2019-01-10 03:40:20 +08:00
echo "@@@@@@"
2019-08-07 04:01:28 +08:00
echo "@@@ Configuring CMake @@@"
mkdir -p " ${ LLVM_BUILD_DIR } "
( cd " ${ LLVM_BUILD_DIR } " &&
2019-09-12 00:57:19 +08:00
xcrun cmake \
-C " ${ MONOREPO_ROOT } /libcxx/cmake/caches/Apple.cmake " \
-GNinja \
2019-08-07 04:01:28 +08:00
-DCMAKE_INSTALL_PREFIX= " ${ LLVM_INSTALL_DIR } " \
-DLLVM_ENABLE_PROJECTS= "libcxx;libcxxabi" \
2020-04-09 04:05:02 +08:00
-DCMAKE_OSX_ARCHITECTURES= "i386;x86_64" \
2019-09-12 00:57:19 +08:00
" ${ MONOREPO_ROOT } /llvm "
2019-01-10 03:40:20 +08:00
)
echo "@@@@@@"
echo "@@@ Installing the latest libc++ headers @@@"
2019-08-07 04:01:28 +08:00
ninja -C " ${ LLVM_BUILD_DIR } " install-cxx-headers
2019-01-10 03:40:20 +08:00
echo "@@@@@@"
echo "@@@ Downloading dylibs for older deployment targets @@@"
# TODO: We should also link against the libc++abi.dylib that was shipped in the SDK
PREVIOUS_DYLIBS_DIR = " ${ TEMP_DIR } /libcxx-dylibs "
mkdir " ${ PREVIOUS_DYLIBS_DIR } "
curl " ${ PREVIOUS_DYLIBS_URL } " | tar -xz --strip-components= 1 -C " ${ PREVIOUS_DYLIBS_DIR } "
LIBCXX_ON_DEPLOYMENT_TARGET = " ${ PREVIOUS_DYLIBS_DIR } /macOS/ ${ DEPLOYMENT_TARGET } /libc++.dylib "
2019-04-13 00:58:25 +08:00
LIBCXXABI_ON_DEPLOYMENT_TARGET = " ${ PREVIOUS_DYLIBS_DIR } /macOS/ ${ DEPLOYMENT_TARGET } /libc++abi.dylib "
2019-01-10 03:40:20 +08:00
LIBCXX_IN_SDK = " ${ PREVIOUS_DYLIBS_DIR } /macOS/ ${ MACOS_SDK_VERSION } /libc++.dylib "
echo "@@@@@@"
# TODO: We need to also run the tests for libc++abi.
echo "@@@ Running tests for libc++ @@@"
2019-08-07 04:01:28 +08:00
" ${ LLVM_BUILD_DIR } /bin/llvm-lit " -sv " ${ MONOREPO_ROOT } /libcxx/test " \
--param= enable_experimental = false \
${ LIT_ARCH_STRING } \
--param= cxx_headers = " ${ LLVM_INSTALL_DIR } /include/c++/v1 " \
--param= std = " ${ STD } " \
--param= platform = " macosx ${ DEPLOYMENT_TARGET } " \
--param= cxx_runtime_root = " $( dirname " ${ LIBCXX_ON_DEPLOYMENT_TARGET } " ) " \
--param= abi_library_path = " $( dirname " ${ LIBCXXABI_ON_DEPLOYMENT_TARGET } " ) " \
--param= use_system_cxx_lib = " $( dirname " ${ LIBCXX_IN_SDK } " ) " \
${ ADDITIONAL_LIT_ARGS }
2019-01-10 03:40:20 +08:00
echo "@@@@@@"