aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlexa Bilaniuk <obilaniu@gmail.com>2021-03-12 05:51:44 -0500
committerJussi Pakkanen <jpakkane@gmail.com>2021-03-28 20:12:45 +0300
commit3dbd493de218cbecac056fc133e9147a2246a91d (patch)
treeaea07ccb8b82000238e1895041b5b19ba2979da0
parent268a78f0f473c1b5193e8b44a067030b74a6559d (diff)
downloadmeson-3dbd493de218cbecac056fc133e9147a2246a91d.zip
meson-3dbd493de218cbecac056fc133e9147a2246a91d.tar.gz
meson-3dbd493de218cbecac056fc133e9147a2246a91d.tar.bz2
Canonicalize and merge consecutive -Xcompiler flags together.
Makes command-line more readable.
-rw-r--r--mesonbuild/compilers/cuda.py48
1 files changed, 47 insertions, 1 deletions
diff --git a/mesonbuild/compilers/cuda.py b/mesonbuild/compilers/cuda.py
index ef6375a..1471d84 100644
--- a/mesonbuild/compilers/cuda.py
+++ b/mesonbuild/compilers/cuda.py
@@ -260,6 +260,52 @@ class CudaCompiler(Compiler):
return r'\,'.join(l)
@classmethod
+ def _merge_flags(cls, flags: T.List[str]) -> T.List[str]:
+ r"""
+ The flags to NVCC gets exceedingly verbose and unreadable when too many of them
+ are shielded with -Xcompiler. Merge consecutive -Xcompiler-wrapped arguments
+ into one.
+ """
+ if len(flags) <= 1:
+ return flags
+ flagit = iter(flags)
+ xflags = []
+
+ def is_xcompiler_flag_isolated(flag: str) -> bool:
+ return flag == '-Xcompiler'
+ def is_xcompiler_flag_glued(flag: str) -> bool:
+ return flag.startswith('-Xcompiler=')
+ def is_xcompiler_flag(flag: str) -> bool:
+ return is_xcompiler_flag_isolated(flag) or is_xcompiler_flag_glued(flag)
+ def get_xcompiler_val(flag: str, flagit: T.Iterator[str]) -> str:
+ if is_xcompiler_flag_glued(flag):
+ return flag[len('-Xcompiler='):]
+ else:
+ try:
+ return next(flagit)
+ except StopIteration:
+ return ""
+
+ ingroup = False
+ for flag in flagit:
+ if not is_xcompiler_flag(flag):
+ ingroup = False
+ xflags.append(flag)
+ elif ingroup:
+ xflags[-1] += ','
+ xflags[-1] += get_xcompiler_val(flag, flagit)
+ elif is_xcompiler_flag_isolated(flag):
+ ingroup = True
+ xflags.append(flag)
+ xflags.append(get_xcompiler_val(flag, flagit))
+ elif is_xcompiler_flag_glued(flag):
+ ingroup = True
+ xflags.append(flag)
+ else:
+ raise ValueError("-Xcompiler flag merging failed, unknown argument form!")
+ return xflags
+
+ @classmethod
def _to_host_flags(cls, flags: T.List[str], phase: _Phase = _Phase.COMPILER) -> T.List[str]:
"""
Translate generic "GCC-speak" plus particular "NVCC-speak" flags to NVCC flags.
@@ -432,7 +478,7 @@ class CudaCompiler(Compiler):
xflags.append(flag)
xflags.append(val)
- return xflags
+ return cls._merge_flags(xflags)
def needs_static_linker(self) -> bool:
return False