ninja backend: manually escape cuda target name
Nvcc doesn't support `-MQ` flag, so we have to manually escape cuda target name. This commit escape `$out` to `$CUDA_ESCAPED_TARGET`, so now we can just use `-MT` flag in nvcc to generate header dependencies.
This commit is contained in:
parent
e2458c6f94
commit
d4fb2d693d
|
@ -2448,7 +2448,11 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
|
|||
# See also: https://github.com/ninja-build/ninja/pull/2275
|
||||
options['extra'] = 'restat = 1'
|
||||
rule = self.compiler_to_rule_name(compiler)
|
||||
depargs = NinjaCommandArg.list(compiler.get_dependency_gen_args('$out', '$DEPFILE'), Quoting.none)
|
||||
if langname == 'cuda':
|
||||
# for cuda, we manually escape target name ($out) as $CUDA_ESCAPED_TARGET because nvcc doesn't support `-MQ` flag
|
||||
depargs = NinjaCommandArg.list(compiler.get_dependency_gen_args('$CUDA_ESCAPED_TARGET', '$DEPFILE'), Quoting.none)
|
||||
else:
|
||||
depargs = NinjaCommandArg.list(compiler.get_dependency_gen_args('$out', '$DEPFILE'), Quoting.none)
|
||||
command = compiler.get_exelist()
|
||||
args = ['$ARGS'] + depargs + NinjaCommandArg.list(compiler.get_output_args('$out'), Quoting.none) + compiler.get_compile_only_args() + ['$in']
|
||||
description = f'Compiling {compiler.get_display_language()} object $out'
|
||||
|
@ -3003,6 +3007,28 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
|
|||
element.add_orderdep(i)
|
||||
if dep_file:
|
||||
element.add_item('DEPFILE', dep_file)
|
||||
if compiler.get_language() == 'cuda':
|
||||
# for cuda, we manually escape target name ($out) as $CUDA_ESCAPED_TARGET because nvcc doesn't support `-MQ` flag
|
||||
def quote_make_target(targetName: str) -> str:
|
||||
# this escape implementation is taken from llvm
|
||||
result = ''
|
||||
for (i, c) in enumerate(targetName):
|
||||
if c in {' ', '\t'}:
|
||||
# Escape the preceding backslashes
|
||||
for j in range(i - 1, -1, -1):
|
||||
if targetName[j] == '\\':
|
||||
result += '\\'
|
||||
else:
|
||||
break
|
||||
# Escape the space/tab
|
||||
result += '\\'
|
||||
elif c == '$':
|
||||
result += '$'
|
||||
elif c == '#':
|
||||
result += '\\'
|
||||
result += c
|
||||
return result
|
||||
element.add_item('CUDA_ESCAPED_TARGET', quote_make_target(rel_obj))
|
||||
element.add_item('ARGS', commands)
|
||||
|
||||
self.add_dependency_scanner_entries_to_element(target, compiler, element, src)
|
||||
|
|
Loading…
Reference in New Issue