Merge "Ensure that the R8 minification map (ProGuard dictionary) file exists"
diff --git a/OWNERS b/OWNERS
index 121a441..edd2557 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,11 +1,3 @@
-ccross@android.com
-dwillemsen@google.com
-nanzhang@google.com
-
-per-file * = ccross@android.com
-per-file * = dwillemsen@google.com
-per-file * = nanzhang@google.com
-per-file *gen_stub_libs.py = danalbert@google.com
-per-file ndk_*.go = danalbert@google.com
-per-file clang.go = srhines@google.com
-per-file global.go = srhines@google.com
+per-file * = ccross@android.com,dwillemsen@google.com,nanzhang@google.com
+per-file ndk_*.go, *gen_stub_libs.py = danalbert@google.com
+per-file clang.go,global.go,tidy.go = srhines@google.com, chh@google.com
diff --git a/cc/builder.go b/cc/builder.go
index 51d3195..7d207b0 100644
--- a/cc/builder.go
+++ b/cc/builder.go
@@ -150,10 +150,12 @@
},
"crossCompile")
+ _ = pctx.SourcePathVariable("tidyPath", "build/soong/scripts/clang-tidy.sh")
+
clangTidy = pctx.AndroidStaticRule("clangTidy",
blueprint.RuleParams{
- Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
- CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
+ Command: "rm -f $out && CLANG_TIDY=${config.ClangBin}/clang-tidy $tidyPath $tidyFlags $in -- $cFlags && touch $out",
+ CommandDeps: []string{"${config.ClangBin}/clang-tidy", "$tidyPath"},
},
"cFlags", "tidyFlags")
@@ -234,29 +236,30 @@
}
type builderFlags struct {
- globalFlags string
- arFlags string
- asFlags string
- cFlags string
- toolingCFlags string // A separate set of Cflags for clang LibTooling tools
- conlyFlags string
- cppFlags string
- ldFlags string
- libFlags string
- yaccFlags string
- protoFlags string
- protoOutParams string
- tidyFlags string
- sAbiFlags string
- yasmFlags string
- aidlFlags string
- rsFlags string
- toolchain config.Toolchain
- clang bool
- tidy bool
- coverage bool
- sAbiDump bool
- protoRoot bool
+ globalFlags string
+ arFlags string
+ asFlags string
+ cFlags string
+ toolingCFlags string // A separate set of cFlags for clang LibTooling tools
+ toolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
+ conlyFlags string
+ cppFlags string
+ ldFlags string
+ libFlags string
+ yaccFlags string
+ protoFlags string
+ protoOutParams string
+ tidyFlags string
+ sAbiFlags string
+ yasmFlags string
+ aidlFlags string
+ rsFlags string
+ toolchain config.Toolchain
+ clang bool
+ tidy bool
+ coverage bool
+ sAbiDump bool
+ protoRoot bool
systemIncludeFlags string
@@ -328,7 +331,7 @@
toolingCppflags := strings.Join([]string{
commonFlags,
flags.toolingCFlags,
- flags.cppFlags,
+ flags.toolingCppFlags,
}, " ")
cppflags := strings.Join([]string{
diff --git a/cc/config/clang.go b/cc/config/clang.go
index 36afc68..186d790 100644
--- a/cc/config/clang.go
+++ b/cc/config/clang.go
@@ -93,8 +93,10 @@
})
var ClangLibToolingUnknownCflags = []string{
+ // Remove -flto and other flto dependent flags.
"-flto*",
"-fsanitize*",
+ "-fwhole-program-vtables",
}
func init() {
diff --git a/cc/config/tidy.go b/cc/config/tidy.go
index 3d1a0a0..67f92a2 100644
--- a/cc/config/tidy.go
+++ b/cc/config/tidy.go
@@ -19,18 +19,6 @@
"strings"
)
-// clang-tidy doesn't recognize every flag that clang does. This is unlikely to
-// be a complete list, but we can populate this with the ones we know to avoid
-// issues with clang-diagnostic-unused-command-line-argument.
-// b/111885396: -flto affected header include directory;
-// -fsanitize and -fwhole-program-vtables need -flto.
-var ClangTidyUnknownCflags = sorted([]string{
- "-Wa,%",
- "-flto",
- "-fsanitize=%",
- "-fwhole-program-vtables",
-})
-
func init() {
// Most Android source files are not clang-tidy clean yet.
// Global tidy checks include only google*, performance*,
@@ -42,6 +30,7 @@
}
return strings.Join([]string{
"-*",
+ "clang-diagnostic-unused-command-line-argument",
"google*",
"misc-macro-parentheses",
"performance*",
@@ -58,6 +47,7 @@
}
return strings.Join([]string{
"-*",
+ "clang-diagnostic-unused-command-line-argument",
"google*",
"-google-build-using-namespace",
"-google-default-arguments",
diff --git a/cc/makevars.go b/cc/makevars.go
index 072821c..c3ff4ce 100644
--- a/cc/makevars.go
+++ b/cc/makevars.go
@@ -75,7 +75,6 @@
ctx.Strict("LLVM_OBJCOPY", "${config.ClangBin}/llvm-objcopy")
ctx.Strict("LLVM_STRIP", "${config.ClangBin}/llvm-strip")
ctx.Strict("PATH_TO_CLANG_TIDY", "${config.ClangBin}/clang-tidy")
- ctx.Strict("CLANG_TIDY_UNKNOWN_CFLAGS", strings.Join(config.ClangTidyUnknownCflags, " "))
ctx.StrictSorted("CLANG_CONFIG_UNKNOWN_CFLAGS", strings.Join(config.ClangUnknownCflags, " "))
ctx.Strict("RS_LLVM_PREBUILTS_VERSION", "${config.RSClangVersion}")
diff --git a/cc/ndk_sysroot.go b/cc/ndk_sysroot.go
index 144fc09..80b5c6a 100644
--- a/cc/ndk_sysroot.go
+++ b/cc/ndk_sysroot.go
@@ -132,6 +132,10 @@
}
})
+ // Include only a single copy of each license file. The Bionic NOTICE is
+ // long and is referenced by multiple Bionic modules.
+ licensePaths = android.FirstUniquePaths(licensePaths)
+
combinedLicense := getNdkInstallBase(ctx).Join(ctx, "NOTICE")
ctx.Build(pctx, android.BuildParams{
Rule: android.Cat,
diff --git a/cc/sabi.go b/cc/sabi.go
index 42b2f35..72a3c5c 100644
--- a/cc/sabi.go
+++ b/cc/sabi.go
@@ -71,6 +71,7 @@
// Assuming that the cflags which clang LibTooling tools cannot
// understand have not been converted to ninja variables yet.
flags.ToolingCFlags = filterOutWithPrefix(flags.CFlags, config.ClangLibToolingUnknownCflags)
+ flags.ToolingCppFlags = filterOutWithPrefix(flags.CppFlags, config.ClangLibToolingUnknownCflags)
// RSClang does not support recent mcpu option likes exynos-m2.
// So we need overriding mcpu option when we want to use it.
diff --git a/cc/util.go b/cc/util.go
index 8de4210..93cf536 100644
--- a/cc/util.go
+++ b/cc/util.go
@@ -59,29 +59,30 @@
func flagsToBuilderFlags(in Flags) builderFlags {
return builderFlags{
- globalFlags: strings.Join(in.GlobalFlags, " "),
- arFlags: strings.Join(in.ArFlags, " "),
- asFlags: strings.Join(in.AsFlags, " "),
- cFlags: strings.Join(in.CFlags, " "),
- toolingCFlags: strings.Join(in.ToolingCFlags, " "),
- conlyFlags: strings.Join(in.ConlyFlags, " "),
- cppFlags: strings.Join(in.CppFlags, " "),
- yaccFlags: strings.Join(in.YaccFlags, " "),
- protoFlags: strings.Join(in.protoFlags, " "),
- protoOutParams: strings.Join(in.protoOutParams, ","),
- aidlFlags: strings.Join(in.aidlFlags, " "),
- rsFlags: strings.Join(in.rsFlags, " "),
- ldFlags: strings.Join(in.LdFlags, " "),
- libFlags: strings.Join(in.libFlags, " "),
- tidyFlags: strings.Join(in.TidyFlags, " "),
- sAbiFlags: strings.Join(in.SAbiFlags, " "),
- yasmFlags: strings.Join(in.YasmFlags, " "),
- toolchain: in.Toolchain,
- clang: in.Clang,
- coverage: in.Coverage,
- tidy: in.Tidy,
- sAbiDump: in.SAbiDump,
- protoRoot: in.ProtoRoot,
+ globalFlags: strings.Join(in.GlobalFlags, " "),
+ arFlags: strings.Join(in.ArFlags, " "),
+ asFlags: strings.Join(in.AsFlags, " "),
+ cFlags: strings.Join(in.CFlags, " "),
+ toolingCFlags: strings.Join(in.ToolingCFlags, " "),
+ toolingCppFlags: strings.Join(in.ToolingCppFlags, " "),
+ conlyFlags: strings.Join(in.ConlyFlags, " "),
+ cppFlags: strings.Join(in.CppFlags, " "),
+ yaccFlags: strings.Join(in.YaccFlags, " "),
+ protoFlags: strings.Join(in.protoFlags, " "),
+ protoOutParams: strings.Join(in.protoOutParams, ","),
+ aidlFlags: strings.Join(in.aidlFlags, " "),
+ rsFlags: strings.Join(in.rsFlags, " "),
+ ldFlags: strings.Join(in.LdFlags, " "),
+ libFlags: strings.Join(in.libFlags, " "),
+ tidyFlags: strings.Join(in.TidyFlags, " "),
+ sAbiFlags: strings.Join(in.SAbiFlags, " "),
+ yasmFlags: strings.Join(in.YasmFlags, " "),
+ toolchain: in.Toolchain,
+ clang: in.Clang,
+ coverage: in.Coverage,
+ tidy: in.Tidy,
+ sAbiDump: in.SAbiDump,
+ protoRoot: in.ProtoRoot,
systemIncludeFlags: strings.Join(in.SystemIncludeFlags, " "),
diff --git a/cmd/pom2bp/pom2bp.go b/cmd/pom2bp/pom2bp.go
index 9ce6b50..a39642f 100644
--- a/cmd/pom2bp/pom2bp.go
+++ b/cmd/pom2bp/pom2bp.go
@@ -104,6 +104,24 @@
var excludes = make(Exclude)
+type HostModuleNames map[string]bool
+
+func (n HostModuleNames) IsHostModule(groupId string, artifactId string) bool {
+ _, found := n[groupId + ":" + artifactId]
+ return found
+}
+
+func (n HostModuleNames) String() string {
+ return ""
+}
+
+func (n HostModuleNames) Set(v string) error {
+ n[v] = true
+ return nil
+}
+
+var hostModuleNames = HostModuleNames{}
+
var sdkVersion string
var useVersion string
@@ -160,6 +178,14 @@
return p.Packaging == "jar"
}
+func (p Pom) IsHostModule() bool {
+ return hostModuleNames.IsHostModule(p.GroupId, p.ArtifactId)
+}
+
+func (p Pom) IsDeviceModule() bool {
+ return !p.IsHostModule()
+}
+
func (p Pom) BpName() string {
if p.BpTarget == "" {
p.BpTarget = rewriteNames.MavenToBp(p.GroupId, p.ArtifactId)
@@ -278,11 +304,11 @@
],{{end}}
}
-{{if .IsAar}}android_library{{else}}java_library_static{{end}} {
- name: "{{.BpName}}",
+{{if .IsAar}}android_library{{else}}{{if .IsDeviceModule}}java_library_static{{else}}java_library_host{{end}}{{end}} {
+ name: "{{.BpName}}",{{if .IsDeviceModule}}
sdk_version: "{{.SdkVersion}}",{{if .IsAar}}
min_sdk_version: "{{.MinSdkVersion}}",
- manifest: "manifests/{{.BpName}}/AndroidManifest.xml",{{end}}
+ manifest: "manifests/{{.BpName}}/AndroidManifest.xml",{{end}}{{end}}
static_libs: [
"{{.BpName}}-nodeps",{{range .BpJarDeps}}
"{{.}}",{{end}}{{range .BpAarDeps}}
@@ -422,6 +448,7 @@
flag.Var(&excludes, "exclude", "Exclude module")
flag.Var(&extraDeps, "extra-deps", "Extra dependencies needed when depending on a module")
flag.Var(&rewriteNames, "rewrite", "Regex(es) to rewrite artifact names")
+ flag.Var(&hostModuleNames, "host", "Specifies that the corresponding module (specified in the form 'module.group:module.artifact') is a host module")
flag.StringVar(&sdkVersion, "sdk-version", "", "What to write to LOCAL_SDK_VERSION")
flag.StringVar(&useVersion, "use-version", "", "Only read artifacts of a specific version")
flag.Bool("static-deps", false, "Ignored")
diff --git a/java/androidmk.go b/java/androidmk.go
index aebbcc8..877d840 100644
--- a/java/androidmk.go
+++ b/java/androidmk.go
@@ -379,6 +379,9 @@
if ddoc.exactApiFile != nil {
fmt.Fprintln(w, apiFilePrefix+"EXACT_API_FILE := ", ddoc.exactApiFile.String())
}
+ if ddoc.proguardFile != nil {
+ fmt.Fprintln(w, apiFilePrefix+"PROGUARD_FILE := ", ddoc.proguardFile.String())
+ }
},
},
}
diff --git a/java/droiddoc.go b/java/droiddoc.go
index 6a28cfb..52db705 100644
--- a/java/droiddoc.go
+++ b/java/droiddoc.go
@@ -88,6 +88,24 @@
},
"outDir", "srcJarDir", "stubsDir", "docStubsDir", "srcJars", "javaVersion", "bootclasspathArgs",
"classpathArgs", "sourcepath", "opts", "docZip")
+
+ metalavaApiCheck = pctx.AndroidStaticRule("metalavaApiCheck",
+ blueprint.RuleParams{
+ Command: `( rm -rf "$srcJarDir" && mkdir -p "$srcJarDir" && ` +
+ `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +
+ `${config.JavaCmd} -jar ${config.MetalavaJar} -encoding UTF-8 -source $javaVersion @$out.rsp @$srcJarDir/list ` +
+ `$bootclasspathArgs $classpathArgs -sourcepath $sourcepath --no-banner --color --quiet ` +
+ `$opts && touch $out ) || ` +
+ `( echo -e "$msg" ; exit 38 )`,
+ CommandDeps: []string{
+ "${config.ZipSyncCmd}",
+ "${config.JavaCmd}",
+ "${config.MetalavaJar}",
+ },
+ Rspfile: "$out.rsp",
+ RspfileContent: "$in",
+ },
+ "srcJarDir", "srcJars", "javaVersion", "bootclasspathArgs", "classpathArgs", "sourcepath", "opts", "msg")
)
func init() {
@@ -244,6 +262,9 @@
// the generated exact API filename by Doclava.
Exact_api_filename *string
+ // the generated proguard filename by Doclava.
+ Proguard_filename *string
+
// if set to false, don't allow droiddoc to generate stubs source files. Defaults to true.
Create_stubs *bool
@@ -606,6 +627,7 @@
removedDexApiFile android.WritablePath
exactApiFile android.WritablePath
apiMappingFile android.WritablePath
+ proguardFile android.WritablePath
checkCurrentApiTimestamp android.WritablePath
updateCurrentApiTimestamp android.WritablePath
@@ -712,7 +734,8 @@
}
}
-func (d *Droiddoc) initBuilderFlags(ctx android.ModuleContext, implicits *android.Paths, deps deps) (droiddocBuilderFlags, error) {
+func (d *Droiddoc) initBuilderFlags(ctx android.ModuleContext, implicits *android.Paths,
+ deps deps) (droiddocBuilderFlags, error) {
var flags droiddocBuilderFlags
*implicits = append(*implicits, deps.bootClasspath...)
@@ -912,6 +935,13 @@
*implicitOutputs = append(*implicitOutputs, d.apiMappingFile)
}
+ if String(d.properties.Proguard_filename) != "" {
+ d.proguardFile = android.PathForModuleOut(ctx, String(d.properties.Proguard_filename))
+ doclavaFlags += " -proguard " + d.proguardFile.String()
+ // Omitted: metalava support
+ *implicitOutputs = append(*implicitOutputs, d.proguardFile)
+ }
+
if BoolDefault(d.properties.Create_stubs, true) {
doclavaFlags += " -stubs " + android.PathForModuleOut(ctx, "stubsDir").String()
}
@@ -1055,7 +1085,7 @@
checkApiClasspath classpath, msg, opts string, output android.WritablePath) {
ctx.Build(pctx, android.BuildParams{
Rule: apiCheck,
- Description: "Check API",
+ Description: "Doclava Check API",
Output: output,
Inputs: nil,
Implicits: append(android.Paths{apiFile, removedApiFile, d.apiFile, d.removedApiFile},
@@ -1072,6 +1102,29 @@
})
}
+func (d *Droiddoc) transformMetalavaCheckApi(ctx android.ModuleContext, apiFile, removedApiFile android.Path,
+ implicits android.Paths, javaVersion, bootclasspathArgs, classpathArgs, opts, msg string,
+ output android.WritablePath) {
+ ctx.Build(pctx, android.BuildParams{
+ Rule: metalavaApiCheck,
+ Description: "Metalava Check API",
+ Output: output,
+ Inputs: d.Javadoc.srcFiles,
+ Implicits: append(android.Paths{apiFile, removedApiFile, d.apiFile, d.removedApiFile},
+ implicits...),
+ Args: map[string]string{
+ "srcJarDir": android.PathForModuleOut(ctx, "srcjars").String(),
+ "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
+ "javaVersion": javaVersion,
+ "bootclasspathArgs": bootclasspathArgs,
+ "classpathArgs": classpathArgs,
+ "sourcepath": strings.Join(d.Javadoc.sourcepaths.Strings(), ":"),
+ "opts": opts,
+ "msg": msg,
+ },
+ })
+}
+
func (d *Droiddoc) transformUpdateApi(ctx android.ModuleContext, apiFile, removedApiFile android.Path,
output android.WritablePath) {
ctx.Build(pctx, android.BuildParams{
@@ -1107,6 +1160,7 @@
}
flags, err := d.initBuilderFlags(ctx, &implicits, deps)
+ metalavaCheckApiImplicits := implicits
if err != nil {
return
}
@@ -1123,7 +1177,8 @@
flags.dokkaClasspathArgs, outDir, docStubsDir)
d.transformMetalava(ctx, implicits, implicitOutputs, outDir, docStubsDir, javaVersion,
flags.bootClasspathArgs, flags.classpathArgs, flags.metalavaStubsFlags+
- flags.metalavaAnnotationsFlags+" "+strings.Split(flags.args, "--generate-documentation")[0]+
+ flags.metalavaAnnotationsFlags+" "+
+ strings.Split(flags.args, "--generate-documentation")[0]+
flags.metalavaDokkaFlags+" "+strings.Split(flags.args, "--generate-documentation")[1])
} else {
flags.metalavaJavadocFlags = d.collectMetalavaJavadocFlags(
@@ -1131,14 +1186,15 @@
flags.doclavaDocsFlags = d.collectDoclavaDocsFlags(ctx, &implicits, jsilver, doclava)
d.transformMetalava(ctx, implicits, implicitOutputs, outDir, docStubsDir, javaVersion,
flags.bootClasspathArgs, flags.classpathArgs, flags.metalavaStubsFlags+
- flags.metalavaAnnotationsFlags+" "+strings.Split(flags.args, "--generate-documentation")[0]+
+ flags.metalavaAnnotationsFlags+" "+
+ strings.Split(flags.args, "--generate-documentation")[0]+
flags.metalavaJavadocFlags+flags.doclavaDocsFlags+
" "+strings.Split(flags.args, "--generate-documentation")[1])
}
} else {
d.transformMetalava(ctx, implicits, implicitOutputs, outDir, docStubsDir, javaVersion,
flags.bootClasspathArgs, flags.classpathArgs,
- flags.metalavaStubsFlags+flags.metalavaAnnotationsFlags+flags.args)
+ flags.metalavaStubsFlags+flags.metalavaAnnotationsFlags+" "+flags.args)
}
} else {
flags.doclavaDocsFlags = d.collectDoclavaDocsFlags(ctx, &implicits, jsilver, doclava)
@@ -1154,8 +1210,8 @@
removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Current.Removed_api_file),
"check_api.current_removed_api_file")
+ d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp")
if !Bool(d.properties.Metalava_enabled) {
- d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp")
d.transformCheckApi(ctx, apiFile, removedApiFile, checkApiClasspath,
fmt.Sprintf(`\n******************************\n`+
`You have tried to change the API from what has been previously approved.\n\n`+
@@ -1169,10 +1225,22 @@
`******************************\n`, ctx.ModuleName()), String(d.properties.Check_api.Current.Args),
d.checkCurrentApiTimestamp)
} else {
- // TODO(nanzhang): Refactor below when Metalava support API check.
- if d.apiFile == nil || d.removedApiFile == nil {
- ctx.ModuleErrorf("api_filename and removed_api_filename properties cannot be empty for API check!")
- }
+ opts := flags.args + " --check-compatibility:api:current " + apiFile.String() +
+ " --check-compatibility:removed:current " + removedApiFile.String() + " "
+
+ d.transformMetalavaCheckApi(ctx, apiFile, removedApiFile, metalavaCheckApiImplicits,
+ javaVersion, flags.bootClasspathArgs, flags.classpathArgs, opts,
+ fmt.Sprintf(`\n******************************\n`+
+ `You have tried to change the API from what has been previously approved.\n\n`+
+ `To make these errors go away, you have two choices:\n`+
+ ` 1. You can add '@hide' javadoc comments to the methods, etc. listed in the\n`+
+ ` errors above.\n\n`+
+ ` 2. You can update current.txt by executing the following command:\n`+
+ ` make %s-update-current-api\n\n`+
+ ` To submit the revised current.txt to the main Android repository,\n`+
+ ` you will need approval.\n`+
+ `******************************\n`, ctx.ModuleName()),
+ d.checkCurrentApiTimestamp)
}
d.updateCurrentApiTimestamp = android.PathForModuleOut(ctx, "update_current_api.timestamp")
@@ -1180,19 +1248,31 @@
}
if d.checkLastReleasedApi() && !ctx.Config().IsPdkBuild() {
- d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, "check_last_released_api.timestamp")
-
apiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Api_file),
"check_api.last_released.api_file")
removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Removed_api_file),
"check_api.last_released.removed_api_file")
- d.transformCheckApi(ctx, apiFile, removedApiFile, checkApiClasspath,
- `\n******************************\n`+
- `You have tried to change the API from what has been previously released in\n`+
- `an SDK. Please fix the errors listed above.\n`+
- `******************************\n`, String(d.properties.Check_api.Last_released.Args),
- d.checkLastReleasedApiTimestamp)
+ d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, "check_last_released_api.timestamp")
+ if !Bool(d.properties.Metalava_enabled) {
+ d.transformCheckApi(ctx, apiFile, removedApiFile, checkApiClasspath,
+ `\n******************************\n`+
+ `You have tried to change the API from what has been previously released in\n`+
+ `an SDK. Please fix the errors listed above.\n`+
+ `******************************\n`, String(d.properties.Check_api.Last_released.Args),
+ d.checkLastReleasedApiTimestamp)
+ } else {
+ opts := flags.args + " --check-compatibility:api:released " + apiFile.String() +
+ " --check-compatibility:removed:released " + removedApiFile.String() + " "
+
+ d.transformMetalavaCheckApi(ctx, apiFile, removedApiFile, metalavaCheckApiImplicits,
+ javaVersion, flags.bootClasspathArgs, flags.classpathArgs, opts,
+ `\n******************************\n`+
+ `You have tried to change the API from what has been previously released in\n`+
+ `an SDK. Please fix the errors listed above.\n`+
+ `******************************\n`,
+ d.checkLastReleasedApiTimestamp)
+ }
}
}
diff --git a/scripts/clang-tidy.sh b/scripts/clang-tidy.sh
new file mode 100755
index 0000000..04d0bdd
--- /dev/null
+++ b/scripts/clang-tidy.sh
@@ -0,0 +1,37 @@
+#!/bin/bash -e
+
+# Copyright 2018 Google Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Wrapper script to remove clang compiler flags rejected by clang-tidy.
+# Inputs:
+# Environment:
+# CLANG_TIDY: path to the real clang-tidy program
+
+# clang-tidy doesn't recognize every flag that clang compiler does.
+# It gives clang-diagnostic-unused-command-line-argument warnings
+# to -Wa,* flags.
+# The -flto flags caused clang-tidy to ignore the -I flags,
+# see https://bugs.llvm.org/show_bug.cgi?id=38332.
+# -fsanitize and -fwhole-program-vtables need -flto.
+args=("${@}")
+n=${#args[@]}
+for ((i=0; i<$n; ++i)); do
+ case ${args[i]} in
+ -Wa,*|-flto|-flto=*|-fsanitize=*|-fsanitize-*|-fwhole-program-vtables)
+ unset args[i]
+ ;;
+ esac
+done
+${CLANG_TIDY} "${args[@]}"