[libcxx] r291072 - Get test-suite configuring on Windows with clang-cl

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 13 17:52:20 PST 2017


On Thu, Jan 12, 2017 at 1:17 AM, Shoaib Meenai <smeenai at fb.com> wrote:

> What was the rationale for forcing the use of lld? Were errors encountered
> with link? It's slightly annoying to have the extra dependency;



Initially I thought it was required in order to avoid re-writing all of the
linker flags.
However that is probably incorrect, and having the extra dependency is
annoying.

 I've also found link to work fine in my testing.
>

Awesome! I'll confirm and remove the dependency on lld.


>
> On 1/4/17, 7:57 PM, "cfe-commits on behalf of Eric Fiselier via
> cfe-commits" <cfe-commits-bounces at lists.llvm.org on behalf of
> cfe-commits at lists.llvm.org> wrote:
>
>     Author: ericwf
>     Date: Wed Jan  4 21:57:40 2017
>     New Revision: 291072
>
>     URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.
> org_viewvc_llvm-2Dproject-3Frev-3D291072-26view-3Drev&d=DgIGaQ&c=
> 5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=jS0vP-
> p0BnF2TFo1eVjVMYDQAs59MFAk7Df_s6nplms&s=cUS_8mdoEB_rXOeiVb12wPPxI4SMXpq9A_
> cY9hOGe2g&e=
>     Log:
>     Get test-suite configuring on Windows with clang-cl
>
>     This patch gets the test suite "working" on Windows, although
>     none of the tests pass.
>
>     In order to reuse the existing configuration, which uses UNIX
>     style flags not accepted by clang-cl, this patch only works with
> clang++.
>     When clang-cl is specified the test harness secretly looks for
>     clang++ and then it configures it using the INCLUDE and LIB enviroment
>     variables.
>
>     This is very much a work in progress.
>
>     Modified:
>         libcxx/trunk/test/libcxx/test/config.py
>
>     Modified: libcxx/trunk/test/libcxx/test/config.py
>     URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.
> org_viewvc_llvm-2Dproject_libcxx_trunk_test_libcxx_test_
> config.py-3Frev-3D291072-26r1-3D291071-26r2-3D291072-26view-
> 3Ddiff&d=DgIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=jS0vP-
> p0BnF2TFo1eVjVMYDQAs59MFAk7Df_s6nplms&s=VifHtrNoBswm5JlmYYAj81SdYnWxg3
> XJxLzZsaw9vrs&e=
>     ============================================================
> ==================
>     --- libcxx/trunk/test/libcxx/test/config.py (original)
>     +++ libcxx/trunk/test/libcxx/test/config.py Wed Jan  4 21:57:40 2017
>     @@ -57,7 +57,9 @@ class Configuration(object):
>          def __init__(self, lit_config, config):
>              self.lit_config = lit_config
>              self.config = config
>     +        self.is_windows = platform.system() == 'Windows'
>              self.cxx = None
>     +        self.cxx_is_clang_cl = None
>              self.cxx_stdlib_under_test = None
>              self.project_obj_root = None
>              self.libcxx_src_root = None
>     @@ -95,6 +97,13 @@ class Configuration(object):
>              self.lit_config.fatal(
>                  "parameter '{}' should be true or false".format(name))
>
>     +    def make_static_lib_name(self, name):
>     +        """Return the full filename for the specified library name"""
>     +        if self.is_windows:
>     +            return name + '.lib'
>     +        else:
>     +            return 'lib' + name + '.a'
>     +
>          def configure(self):
>              self.configure_executor()
>              self.configure_target_info()
>     @@ -171,20 +180,25 @@ class Configuration(object):
>          def configure_cxx(self):
>              # Gather various compiler parameters.
>              cxx = self.get_lit_conf('cxx_under_test')
>     -
>     +        self.cxx_is_clang_cl = cxx is not None and \
>     +                               os.path.basename(cxx) == 'clang-cl.exe'
>              # If no specific cxx_under_test was given, attempt to infer
> it as
>              # clang++.
>     -        if cxx is None:
>     +        if cxx is None or self.cxx_is_clang_cl:
>                  clangxx = lit.util.which('clang++',
>                                           self.config.environment['PATH'])
>                  if clangxx:
>                      cxx = clangxx
>                      self.lit_config.note(
>                          "inferred cxx_under_test as: %r" % cxx)
>     +            elif self.cxx_is_clang_cl:
>     +                self.lit_config.fatal('Failed to find clang++
> substitution for'
>     +                                      ' clang-cl')
>              if not cxx:
>                  self.lit_config.fatal('must specify user parameter
> cxx_under_test '
>                                        '(e.g.,
> --param=cxx_under_test=clang++)')
>     -        self.cxx = CXXCompiler(cxx)
>     +        self.cxx = CXXCompiler(cxx) if not self.cxx_is_clang_cl else \
>     +                   self._configure_clang_cl(cxx)
>              cxx_type = self.cxx.type
>              if cxx_type is not None:
>                  assert self.cxx.version is not None
>     @@ -194,6 +208,25 @@ class Configuration(object):
>                  self.config.available_features.add('%s-%s.%s' % (
>                      cxx_type, maj_v, min_v))
>
>     +    def _configure_clang_cl(self, clang_path):
>     +        assert self.cxx_is_clang_cl
>     +        # FIXME: don't hardcode the target
>     +        flags = ['-fms-compatibility-version=19.00',
>     +                 '--target=i686-unknown-windows']
>     +        compile_flags = []
>     +        link_flags = ['-fuse-ld=lld']
>     +        if 'INCLUDE' in os.environ:
>     +            compile_flags += ['-isystem %s' % p.strip()
>     +                              for p in os.environ['INCLUDE'].split(';
> ')
>     +                              if p.strip()]
>     +        if 'LIB' in os.environ:
>     +            link_flags += ['-L%s' % p.strip()
>     +                           for p in os.environ['LIB'].split(';') if
> p.strip()]
>     +        return CXXCompiler(clang_path, flags=flags,
>     +                           compile_flags=compile_flags,
>     +                           link_flags=link_flags)
>     +
>     +
>          def configure_src_root(self):
>              self.libcxx_src_root = self.get_lit_conf(
>                  'libcxx_src_root', os.path.dirname(self.config.
> test_source_root))
>     @@ -400,7 +433,8 @@ class Configuration(object):
>
>          def configure_compile_flags_header_includes(self):
>              support_path = os.path.join(self.libcxx_src_root,
> 'test/support')
>     -        if self.cxx_stdlib_under_test != 'libstdc++':
>     +        if self.cxx_stdlib_under_test != 'libstdc++' and \
>     +           not self.is_windows:
>                  self.cxx.compile_flags += [
>                      '-include', os.path.join(support_path,
> 'nasty_macros.hpp')]
>              self.configure_config_site_header()
>     @@ -459,6 +493,8 @@ class Configuration(object):
>              # Transform each macro name into the feature name used in the
> tests.
>              # Ex. _LIBCPP_HAS_NO_THREADS -> libcpp-has-no-threads
>              for m in feature_macros:
>     +            if m == '_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS':
>     +                continue
>                  if m == '_LIBCPP_ABI_VERSION':
>                      self.config.available_features.add('libcpp-abi-
> version-v%s'
>                          % feature_macros[m])
>     @@ -558,15 +594,16 @@ class Configuration(object):
>              if not self.use_system_cxx_lib:
>                  if self.cxx_library_root:
>                      self.cxx.link_flags += ['-L' + self.cxx_library_root]
>     -            if self.cxx_runtime_root:
>     +            if self.cxx_runtime_root and not self.is_windows:
>                      self.cxx.link_flags += ['-Wl,-rpath,' +
> self.cxx_runtime_root]
>
>          def configure_link_flags_abi_library_path(self):
>              # Configure ABI library paths.
>              self.abi_library_root = self.get_lit_conf('abi_library_path')
>              if self.abi_library_root:
>     -            self.cxx.link_flags += ['-L' + self.abi_library_root,
>     -                                    '-Wl,-rpath,' +
> self.abi_library_root]
>     +            self.cxx.link_flags += ['-L' + self.abi_library_root]
>     +            if not self.is_windows:
>     +                self.cxx.link_flags += ['-Wl,-rpath,' +
> self.abi_library_root]
>
>          def configure_link_flags_cxx_library(self):
>              libcxx_experimental = self.get_lit_bool('enable_experimental',
> default=False)
>     @@ -579,7 +616,10 @@ class Configuration(object):
>              else:
>                  cxx_library_root = self.get_lit_conf('cxx_library_root')
>                  if cxx_library_root:
>     -                abs_path = os.path.join(cxx_library_root, 'libc++.a')
>     +                libname = self.make_static_lib_name('c++')
>     +                abs_path = os.path.join(cxx_library_root, libname)
>     +                assert os.path.exists(abs_path) and \
>     +                       "static libc++ library does not exist"
>                      self.cxx.link_flags += [abs_path]
>                  else:
>                      self.cxx.link_flags += ['-lc++']
>     @@ -598,7 +638,8 @@ class Configuration(object):
>                      else:
>                          cxxabi_library_root = self.get_lit_conf('abi_
> library_path')
>                          if cxxabi_library_root:
>     -                        abs_path = os.path.join(cxxabi_library_root,
> 'libc++abi.a')
>     +                        libname = self.make_static_lib_name('c++abi')
>     +                        abs_path = os.path.join(cxxabi_library_root,
> libname)
>                              self.cxx.link_flags += [abs_path]
>                          else:
>                              self.cxx.link_flags += ['-lc++abi']
>
>
>     _______________________________________________
>     cfe-commits mailing list
>     cfe-commits at lists.llvm.org
>     https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.
> llvm.org_cgi-2Dbin_mailman_listinfo_cfe-2Dcommits&d=DgIGaQ&c=
> 5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=jS0vP-
> p0BnF2TFo1eVjVMYDQAs59MFAk7Df_s6nplms&s=0bJPrzT8cGOR-
> 4NThzsZY0hJjgj8ZN6uI7u17ZnekqY&e=
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170113/1040264e/attachment-0001.html>


More information about the cfe-commits mailing list