diff --git a/libcxx/cmake/caches/Apple.cmake b/libcxx/cmake/caches/Apple.cmake index c884eb561d0414..6f4030ec05b630 100644 --- a/libcxx/cmake/caches/Apple.cmake +++ b/libcxx/cmake/caches/Apple.cmake @@ -18,3 +18,6 @@ set(LIBCXXABI_HERMETIC_STATIC_LIBRARY ON CACHE BOOL "") set(LIBCXXABI_ENABLE_ASSERTIONS OFF CACHE BOOL "") set(LIBCXXABI_ENABLE_FORGIVING_DYNAMIC_CAST ON CACHE BOOL "") + +set(LIBCXX_TEST_PARAMS "stdlib=apple-libc++" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/libcxx/test/configs/legacy.cfg.in b/libcxx/test/configs/legacy.cfg.in index 23aa5051eaea6c..a131978b97a275 100644 --- a/libcxx/test/configs/legacy.cfg.in +++ b/libcxx/test/configs/legacy.cfg.in @@ -8,6 +8,7 @@ import site config.cxx_headers = "@LIBCXX_GENERATED_INCLUDE_DIR@" config.cxx_under_test = "@CMAKE_CXX_COMPILER@" config.project_obj_root = "@CMAKE_BINARY_DIR@" +config.install_root = "@CMAKE_BINARY_DIR@" config.libcxx_src_root = "@LIBCXX_SOURCE_DIR@" config.libcxx_obj_root = "@LIBCXX_BINARY_DIR@" config.cxx_library_root = "@LIBCXX_LIBRARY_DIR@" diff --git a/libcxx/test/configs/libcxx-trunk-shared.cfg.in b/libcxx/test/configs/libcxx-trunk-shared.cfg.in index 3711d5d321434c..1cc51bd87c796c 100644 --- a/libcxx/test/configs/libcxx-trunk-shared.cfg.in +++ b/libcxx/test/configs/libcxx-trunk-shared.cfg.in @@ -49,6 +49,7 @@ config.substitutions.append(('%{exec}', pipes.quote(sys.executable), pipes.quote(runPy)) )) +config.substitutions.append(('%{install}', INSTALL_ROOT)) # Add parameters and features to the config libcxx.test.newconfig.configure( diff --git a/libcxx/test/configs/libcxx-trunk-static.cfg.in b/libcxx/test/configs/libcxx-trunk-static.cfg.in index 07f5890699fe07..6aeeb329994efa 100644 --- a/libcxx/test/configs/libcxx-trunk-static.cfg.in +++ b/libcxx/test/configs/libcxx-trunk-static.cfg.in @@ -49,6 +49,7 @@ config.substitutions.append(('%{exec}', pipes.quote(sys.executable), pipes.quote(runPy)) )) +config.substitutions.append(('%{install}', INSTALL_ROOT)) # Add parameters and features to the config libcxx.test.newconfig.configure( diff --git a/libcxx/test/libcxx/vendor/apple/system-install-properties.sh.cpp b/libcxx/test/libcxx/vendor/apple/system-install-properties.sh.cpp new file mode 100644 index 00000000000000..ff14dda2f0b216 --- /dev/null +++ b/libcxx/test/libcxx/vendor/apple/system-install-properties.sh.cpp @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// REQUIRES: stdlib=apple-libc++ + +// This file checks various properties of the installation of libc++ when built as +// a system library on Apple platforms. +// +// TODO: We should install to `/usr` in CMake and check that path instead. + +// Make sure we install the libc++ headers in the right location. +// +// RUN: stat "%{install}/include/c++/v1/__config" + +// Make sure we install libc++.1.dylib in the right location. +// +// RUN: stat "%{install}/lib/libc++.1.dylib" + +// Make sure we install a symlink from libc++.dylib to libc++.1.dylib. +// +// RUN: stat "%{install}/lib/libc++.dylib" +// RUN: readlink "%{install}/lib/libc++.dylib" | grep "libc++.1.dylib" + +// Make sure the install_name is /usr/lib. +// +// In particular, make sure we don't use any @rpath in the load commands. When building as +// a system library, it is important to hardcode the installation paths in the dylib, because +// various tools like dyld and ld64 will treat us specially if they recognize us as being a +// system library. +// +// TODO: We currently don't do that correctly in the CMake build. +// +// XRUNX: otool -L "%{install}/lib/libc++.1.dylib" | grep '/usr/lib/libc++.1.dylib' +// XRUNX: ! otool -l "%{install}/lib/libc++.1.dylib" | grep -E "LC_RPATH|@loader_path|@rpath" + +// Make sure the compatibility_version of libc++ is 1.0.0. +// Failure to respect this can result in applications not being able to find libc++ +// when they are loaded by dyld, if the compatibility version was bumped. +// +// RUN: otool -L "%{install}/lib/libc++.1.dylib" | grep "libc++.1.dylib" | grep "compatibility version 1.0.0" diff --git a/libcxx/test/std/strings/c.strings/cuchar.pass.cpp b/libcxx/test/std/strings/c.strings/cuchar.pass.cpp index b63df56c429520..d0f6142acd6b15 100644 --- a/libcxx/test/std/strings/c.strings/cuchar.pass.cpp +++ b/libcxx/test/std/strings/c.strings/cuchar.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// // -// XFAIL: stdlib=libc++ +// XFAIL: stdlib={{.+}}-libc++ // Skip this test on windows. If built on top of the MSVC runtime, the // header actually does exist (although not provided by us). diff --git a/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.bool.fail.cpp b/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.bool.fail.cpp index d77131775dfcbf..5d7b6450d2ef10 100644 --- a/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.bool.fail.cpp +++ b/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.bool.fail.cpp @@ -7,8 +7,8 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03 -// UNSUPPORTED: !stdlib=libc++ && c++11 -// UNSUPPORTED: !stdlib=libc++ && c++14 +// UNSUPPORTED: !stdlib={{.+}}-libc++ && c++11 +// UNSUPPORTED: !stdlib={{.+}}-libc++ && c++14 // // In diff --git a/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.pass.cpp b/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.pass.cpp index 0c10c0dfb5bca0..350b1bf12c65a4 100644 --- a/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.pass.cpp +++ b/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.pass.cpp @@ -7,8 +7,8 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03 -// UNSUPPORTED: !stdlib=libc++ && c++11 -// UNSUPPORTED: !stdlib=libc++ && c++14 +// UNSUPPORTED: !stdlib={{.+}}-libc++ && c++11 +// UNSUPPORTED: !stdlib={{.+}}-libc++ && c++14 // diff --git a/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.roundtrip.pass.cpp b/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.roundtrip.pass.cpp index 6aa49534d243d2..a57a70911ffab5 100644 --- a/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.roundtrip.pass.cpp +++ b/libcxx/test/std/utilities/charconv/charconv.from.chars/integral.roundtrip.pass.cpp @@ -7,8 +7,8 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03 -// UNSUPPORTED: !stdlib=libc++ && c++11 -// UNSUPPORTED: !stdlib=libc++ && c++14 +// UNSUPPORTED: !stdlib={{.+}}-libc++ && c++11 +// UNSUPPORTED: !stdlib={{.+}}-libc++ && c++14 // The roundtrip test uses to_chars, which requires functions in the dylib // that were introduced in Mac OS 10.15. diff --git a/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.bool.fail.cpp b/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.bool.fail.cpp index 096d979a2fc1ca..81ce986e2820dd 100644 --- a/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.bool.fail.cpp +++ b/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.bool.fail.cpp @@ -7,8 +7,8 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03 -// UNSUPPORTED: !stdlib=libc++ && c++11 -// UNSUPPORTED: !stdlib=libc++ && c++14 +// UNSUPPORTED: !stdlib={{.+}}-libc++ && c++11 +// UNSUPPORTED: !stdlib={{.+}}-libc++ && c++14 // // In diff --git a/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.pass.cpp b/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.pass.cpp index d137461ea3bc25..fab0c968edc488 100644 --- a/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.pass.cpp +++ b/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.pass.cpp @@ -7,8 +7,8 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03 -// UNSUPPORTED: !stdlib=libc++ && c++11 -// UNSUPPORTED: !stdlib=libc++ && c++14 +// UNSUPPORTED: !stdlib={{.+}}-libc++ && c++11 +// UNSUPPORTED: !stdlib={{.+}}-libc++ && c++14 // to_chars requires functions in the dylib that were introduced in Mac OS 10.15. // diff --git a/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/default.pass.cpp b/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/default.pass.cpp index 8bcd525f9a148a..9d6bc5011e03b1 100644 --- a/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/default.pass.cpp +++ b/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/default.pass.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 -// XFAIL: stdlib=libc++ +// XFAIL: stdlib={{.+}}-libc++ // diff --git a/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/hash.pass.cpp b/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/hash.pass.cpp index 3ff0f0d27f675a..170a2ba5f64ffa 100644 --- a/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/hash.pass.cpp +++ b/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/hash.pass.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 -// XFAIL: stdlib=libc++ +// XFAIL: stdlib={{.+}}-libc++ // diff --git a/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/hash.pred.pass.cpp b/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/hash.pred.pass.cpp index e4e72be2b6b371..1a0e27bf518b85 100644 --- a/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/hash.pred.pass.cpp +++ b/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/hash.pred.pass.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 -// XFAIL: stdlib=libc++ +// XFAIL: stdlib={{.+}}-libc++ // diff --git a/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/pred.pass.cpp b/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/pred.pass.cpp index f6f88518c8889c..6ca2962ce22d0f 100644 --- a/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/pred.pass.cpp +++ b/libcxx/test/std/utilities/function.objects/func.search/func.search.bm/pred.pass.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 -// XFAIL: stdlib=libc++ +// XFAIL: stdlib={{.+}}-libc++ // diff --git a/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/default.pass.cpp b/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/default.pass.cpp index 828d6fc72157e0..266ceb8e16d690 100644 --- a/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/default.pass.cpp +++ b/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/default.pass.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 -// XFAIL: stdlib=libc++ +// XFAIL: stdlib={{.+}}-libc++ // diff --git a/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/hash.pass.cpp b/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/hash.pass.cpp index 904623ff278197..237211e674366d 100644 --- a/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/hash.pass.cpp +++ b/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/hash.pass.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 -// XFAIL: stdlib=libc++ +// XFAIL: stdlib={{.+}}-libc++ // diff --git a/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/hash.pred.pass.cpp b/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/hash.pred.pass.cpp index 53700884cd446f..22d40b6e4b377c 100644 --- a/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/hash.pred.pass.cpp +++ b/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/hash.pred.pass.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 -// XFAIL: stdlib=libc++ +// XFAIL: stdlib={{.+}}-libc++ // diff --git a/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/pred.pass.cpp b/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/pred.pass.cpp index 137d1a66ad32ce..acc229542e1885 100644 --- a/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/pred.pass.cpp +++ b/libcxx/test/std/utilities/function.objects/func.search/func.search.bmh/pred.pass.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 -// XFAIL: stdlib=libc++ +// XFAIL: stdlib={{.+}}-libc++ // diff --git a/libcxx/utils/libcxx/test/config.py b/libcxx/utils/libcxx/test/config.py index 3cd0db454964b2..77827df261b1c3 100644 --- a/libcxx/utils/libcxx/test/config.py +++ b/libcxx/utils/libcxx/test/config.py @@ -467,6 +467,7 @@ def configure_substitutions(self): sub.append(('%{flags}', ' '.join(map(self.quote, flags)))) sub.append(('%{compile_flags}', ' '.join(map(self.quote, compile_flags)))) sub.append(('%{link_flags}', ' '.join(map(self.quote, self.cxx.link_flags)))) + sub.append(('%{install}', self.quote(self.config.install_root))) codesign_ident = self.get_lit_conf('llvm_codesign_identity', '') env_vars = ' '.join('%s=%s' % (k, self.quote(v)) for (k, v) in self.exec_env.items()) diff --git a/libcxx/utils/libcxx/test/params.py b/libcxx/utils/libcxx/test/params.py index 090e0589789a7c..ec80b9ab2b6af0 100644 --- a/libcxx/utils/libcxx/test/params.py +++ b/libcxx/utils/libcxx/test/params.py @@ -91,8 +91,21 @@ def getStdFlag(cfg, std): AddCompileFlag('-fno-rtti') ]), - Parameter(name='stdlib', choices=['libc++', 'libstdc++', 'msvc'], type=str, default='libc++', - help="The C++ Standard Library implementation being tested.", + Parameter(name='stdlib', choices=['llvm-libc++', 'apple-libc++', 'libstdc++', 'msvc'], type=str, default='llvm-libc++', + help="""The C++ Standard Library implementation being tested. + + Note that this parameter can also be used to encode different 'flavors' of the same + standard library, such as libc++ as shipped by a different vendor, if it has different + properties worth testing. + + The Standard libraries currently supported are: + - llvm-libc++: The 'upstream' libc++ as shipped with LLVM. + - apple-libc++: libc++ as shipped by Apple. This is basically like the LLVM one, but + there are a few differences like installation paths and the use of + universal dylibs. + - libstdc++: The GNU C++ library typically shipped with GCC. + - msvc: The Microsoft implementation of the C++ Standard Library. + """, actions=lambda stdlib: [ AddFeature('stdlib={}'.format(stdlib)) ]), diff --git a/libcxxabi/test/lit.site.cfg.in b/libcxxabi/test/lit.site.cfg.in index 049f822b5ed56b..585e03e8222f99 100644 --- a/libcxxabi/test/lit.site.cfg.in +++ b/libcxxabi/test/lit.site.cfg.in @@ -7,6 +7,7 @@ import site config.cxx_under_test = "@CMAKE_CXX_COMPILER@" config.project_obj_root = "@CMAKE_BINARY_DIR@" +config.install_root = "@CMAKE_BINARY_DIR@" config.libcxxabi_hdr_root = "@LIBCXXABI_HEADER_DIR@" config.libcxxabi_src_root = "@LIBCXXABI_SOURCE_DIR@" config.libcxxabi_obj_root = "@LIBCXXABI_BINARY_DIR@" diff --git a/libcxxabi/test/vendor/apple/system-install-properties.sh.cpp b/libcxxabi/test/vendor/apple/system-install-properties.sh.cpp new file mode 100644 index 00000000000000..791fc67d33a86e --- /dev/null +++ b/libcxxabi/test/vendor/apple/system-install-properties.sh.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// REQUIRES: stdlib=apple-libc++ + +// This file checks various properties of the installation of libc++abi when built +// as a system library on Apple platforms. +// +// TODO: We should install to `/usr` in CMake and check that path instead. + +// Make sure we install the libc++abi headers in the right location. +// TODO: We don't currently install them, but we should. +// +// XRUNX: stat "%{install}/include/cxxabi.h" + +// Make sure we install libc++abi.dylib in the right location. +// +// RUN: stat "%{install}/lib/libc++abi.dylib" + +// Make sure we don't install a symlink from libc++abi.dylib to libc++abi.1.dylib, +// unlike what we do for libc++.dylib. +// TODO: We currently don't do that correctly in the CMake build. +// +// XRUNX: ! readlink "%{install}/lib/libc++abi.dylib" +// XRUNX: ! stat "%{install}/lib/libc++abi.1.dylib" + +// Make sure the install_name is /usr/lib. +// +// In particular, make sure we don't use any @rpath in the load commands. When building as +// a system library, it is important to hardcode the installation paths in the dylib, because +// various tools like dyld and ld64 will treat us specially if they recognize us as being a +// system library. +// +// TODO: We currently don't do that correctly in the CMake build. +// +// XRUNX: otool -L "%{install}/lib/libc++abi.dylib" | grep '/usr/lib/libc++abi.dylib' +// XRUNX: ! otool -l "%{install}/lib/libc++abi.dylib" | grep -E "LC_RPATH|@loader_path|@rpath" + +// Make sure the compatibility_version of libc++abi is 1.0.0. Failure to respect this can result +// in applications not being able to find libc++abi when they are loaded by dyld, if the +// compatibility version was bumped. +// +// RUN: otool -L "%{install}/lib/libc++abi.dylib" | grep "libc++abi.1.dylib" | grep "compatibility version 1.0.0"