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.
This commit is contained in:
parent
554b484468
commit
390f0b8b52
|
@ -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
|
||||
|
|
|
@ -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(' ')
|
||||
|
|
Loading…
Reference in New Issue