From 4b963f8d6a7bff85327b81aa0038190bd7dc630d Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Thu, 29 Sep 2016 14:06:02 -0700 Subject: Ninja and shell escape command line flags Strings like cflags in Android.bp files are parsed by blueprint, written to build.ninja files, parsed by ninja, and then passed to /bin/sh -c. This had resulted in a combination of blueprint (\"), ninja ($$), and shell (\$) escaping being necessary. Update Soong to automatically handle ninja and shell escaping in cflags and ldflags. Bug: 31221587 Test: m -j Change-Id: Ibe087b2788b355b73c3225b5928870619a0a53bc --- cc/compiler.go | 20 ++++++++++++-------- cc/linker.go | 4 +++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/cc/compiler.go b/cc/compiler.go index 37dc7449..db4c076c 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -19,6 +19,8 @@ import ( "path/filepath" "strings" + "github.com/google/blueprint/proptools" + "android/soong/android" "android/soong/cc/config" ) @@ -130,11 +132,13 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flag CheckBadCompilerFlags(ctx, "conlyflags", compiler.Properties.Conlyflags) CheckBadCompilerFlags(ctx, "asflags", compiler.Properties.Asflags) - flags.CFlags = append(flags.CFlags, compiler.Properties.Cflags...) - flags.CppFlags = append(flags.CppFlags, compiler.Properties.Cppflags...) - flags.ConlyFlags = append(flags.ConlyFlags, compiler.Properties.Conlyflags...) - flags.AsFlags = append(flags.AsFlags, compiler.Properties.Asflags...) - flags.YaccFlags = append(flags.YaccFlags, compiler.Properties.Yaccflags...) + esc := proptools.NinjaAndShellEscape + + flags.CFlags = append(flags.CFlags, esc(compiler.Properties.Cflags)...) + flags.CppFlags = append(flags.CppFlags, esc(compiler.Properties.Cppflags)...) + flags.ConlyFlags = append(flags.ConlyFlags, esc(compiler.Properties.Conlyflags)...) + flags.AsFlags = append(flags.AsFlags, esc(compiler.Properties.Asflags)...) + flags.YaccFlags = append(flags.YaccFlags, esc(compiler.Properties.Yaccflags)...) // Include dir cflags rootIncludeDirs := android.PathsForSource(ctx, compiler.Properties.Include_dirs) @@ -198,15 +202,15 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flag CheckBadCompilerFlags(ctx, "release.cflags", compiler.Properties.Release.Cflags) // TODO: debug - flags.CFlags = append(flags.CFlags, compiler.Properties.Release.Cflags...) + flags.CFlags = append(flags.CFlags, esc(compiler.Properties.Release.Cflags)...) if flags.Clang { CheckBadCompilerFlags(ctx, "clang_cflags", compiler.Properties.Clang_cflags) CheckBadCompilerFlags(ctx, "clang_asflags", compiler.Properties.Clang_asflags) flags.CFlags = config.ClangFilterUnknownCflags(flags.CFlags) - flags.CFlags = append(flags.CFlags, compiler.Properties.Clang_cflags...) - flags.AsFlags = append(flags.AsFlags, compiler.Properties.Clang_asflags...) + flags.CFlags = append(flags.CFlags, esc(compiler.Properties.Clang_cflags)...) + flags.AsFlags = append(flags.AsFlags, esc(compiler.Properties.Clang_asflags)...) flags.CppFlags = config.ClangFilterUnknownCflags(flags.CppFlags) flags.ConlyFlags = config.ClangFilterUnknownCflags(flags.ConlyFlags) flags.LdFlags = config.ClangFilterUnknownCflags(flags.LdFlags) diff --git a/cc/linker.go b/cc/linker.go index 2c4c2505..399074d0 100644 --- a/cc/linker.go +++ b/cc/linker.go @@ -17,6 +17,8 @@ package cc import ( "android/soong/android" "fmt" + + "github.com/google/blueprint/proptools" ) // This file contains the basic functionality for linking against static libraries and shared @@ -167,7 +169,7 @@ func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags { CheckBadLinkerFlags(ctx, "ldflags", linker.Properties.Ldflags) - flags.LdFlags = append(flags.LdFlags, linker.Properties.Ldflags...) + flags.LdFlags = append(flags.LdFlags, proptools.NinjaAndShellEscape(linker.Properties.Ldflags)...) if ctx.Host() { rpath_prefix := `\$$ORIGIN/` -- cgit v1.2.3