From 390f0b8b522a7c73880349a250400a2802927b66 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 29 Nov 2017 10:23:57 +0530 Subject: [PATCH] dependencies: Convert /c/foo/bar paths to C:/foo/bar MSVC cannot handle MinGW-esque /c/foo paths, convert them to C:/foo. We cannot resolve other paths starting with / like /home/foo so leave them as-is so the user gets an error/warning from the compiler/linker. These paths are commonly found in pkg-config files generated using Autotools inside MinGW/MSYS and MinGW/MSYS2 environments. Currently this is only done for PkgConfigDependency. --- mesonbuild/dependencies/base.py | 15 +++++++++++++++ test cases/unit/17 pkgconfig static/meson.build | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index a72023275..81b93c46c 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -22,6 +22,7 @@ import shlex import shutil import textwrap from enum import Enum +from pathlib import PurePath from .. import mlog from .. import mesonlib @@ -424,6 +425,20 @@ class PkgConfigDependency(ExternalDependency): self.link_args = [] libpaths = [] for lib in shlex.split(out): + # MSVC cannot handle MinGW-esque /c/foo paths, convert them to C:/foo. + # We cannot resolve other paths starting with / like /home/foo so leave + # them as-is so the user gets an error/warning from the compiler/linker. + if self.compiler.id == 'msvc': + # Library search path + if lib.startswith('-L/'): + pargs = PurePath(lib[2:]).parts + if len(pargs) > 1 and len(pargs[1]) == 1: + lib = '-L{}:/{}'.format(pargs[1], '/'.join(pargs[2:])) + # Full path to library or .la file + elif lib.startswith('/'): + pargs = PurePath(lib).parts + if len(pargs) > 1 and len(pargs[1]) == 1: + lib = '{}:/{}'.format(pargs[1], '/'.join(pargs[2:])) # If we want to use only static libraries, we have to look for the # file ourselves instead of depending on the compiler to find it # with -lfoo or foo.lib. However, we can only do this if we already diff --git a/test cases/unit/17 pkgconfig static/meson.build b/test cases/unit/17 pkgconfig static/meson.build index caeb4aae2..d1b0fd5ac 100644 --- a/test cases/unit/17 pkgconfig static/meson.build +++ b/test cases/unit/17 pkgconfig static/meson.build @@ -5,8 +5,22 @@ if build_machine.system() != 'windows' else # pkg-config files should not use paths with \ prefix_parts = meson.source_root().split('\\') - prefix = '/'.join(prefix_parts) + # If the path is C:/foo/bar, convert it to /c/foo/bar so we can test if our + # automatic conversion to C:/foo/bar inside PkgConfigDependency is working. + if prefix_parts[0][1] == ':' + drive = prefix_parts[0][0] + else + drive = prefix_parts[0] + endif + new_parts = [] + foreach part : prefix_parts + if part != prefix_parts[0] + new_parts += part + endif + endforeach + prefix = '/@0@/@1@'.format(drive, '/'.join(new_parts)) endif +message(prefix) # Escape spaces prefix_parts = prefix.split(' ')