Home | History | Annotate | Download | only in config
      1 // Copyright 2016 Google Inc. All rights reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 package config
     16 
     17 import (
     18 	"android/soong/android"
     19 	"strings"
     20 )
     21 
     22 func init() {
     23 	// Most Android source files are not clang-tidy clean yet.
     24 	// Global tidy checks include only google*, performance*,
     25 	// and misc-macro-parentheses, but not google-readability*
     26 	// or google-runtime-references.
     27 	pctx.VariableFunc("TidyDefaultGlobalChecks", func(ctx android.PackageVarContext) string {
     28 		if override := ctx.Config().Getenv("DEFAULT_GLOBAL_TIDY_CHECKS"); override != "" {
     29 			return override
     30 		}
     31 		return strings.Join([]string{
     32 			"-*",
     33 			"clang-diagnostic-unused-command-line-argument",
     34 			"google*",
     35 			"misc-macro-parentheses",
     36 			"performance*",
     37 			"-google-readability*",
     38 			"-google-runtime-references",
     39 		}, ",")
     40 	})
     41 
     42 	// There are too many clang-tidy warnings in external and vendor projects.
     43 	// Enable only some google checks for these projects.
     44 	pctx.VariableFunc("TidyExternalVendorChecks", func(ctx android.PackageVarContext) string {
     45 		if override := ctx.Config().Getenv("DEFAULT_EXTERNAL_VENDOR_TIDY_CHECKS"); override != "" {
     46 			return override
     47 		}
     48 		return strings.Join([]string{
     49 			"-*",
     50 			"clang-diagnostic-unused-command-line-argument",
     51 			"google*",
     52 			"-google-build-using-namespace",
     53 			"-google-default-arguments",
     54 			"-google-explicit-constructor",
     55 			"-google-readability*",
     56 			"-google-runtime-int",
     57 			"-google-runtime-references",
     58 		}, ",")
     59 	})
     60 
     61 	// Give warnings to header files only in selected directories.
     62 	// Do not give warnings to external or vendor header files, which contain too
     63 	// many warnings.
     64 	pctx.VariableFunc("TidyDefaultHeaderDirs", func(ctx android.PackageVarContext) string {
     65 		if override := ctx.Config().Getenv("DEFAULT_TIDY_HEADER_DIRS"); override != "" {
     66 			return override
     67 		}
     68 		return strings.Join([]string{
     69 			"art/",
     70 			"bionic/",
     71 			"bootable/",
     72 			"build/",
     73 			"cts/",
     74 			"dalvik/",
     75 			"developers/",
     76 			"development/",
     77 			"frameworks/",
     78 			"libcore/",
     79 			"libnativehelper/",
     80 			"system/",
     81 		}, "|")
     82 	})
     83 
     84 	// Use WTIH_TIDY_FLAGS to pass extra global default clang-tidy flags.
     85 	pctx.VariableFunc("TidyWithTidyFlags", func(ctx android.PackageVarContext) string {
     86 		return ctx.Config().Getenv("WITH_TIDY_FLAGS")
     87 	})
     88 }
     89 
     90 type PathBasedTidyCheck struct {
     91 	PathPrefix string
     92 	Checks     string
     93 }
     94 
     95 const tidyDefault = "${config.TidyDefaultGlobalChecks}"
     96 const tidyExternalVendor = "${config.TidyExternalVendorChecks}"
     97 
     98 // This is a map of local path prefixes to the set of default clang-tidy checks
     99 // to be used.
    100 // The last matched local_path_prefix should be the most specific to be used.
    101 var DefaultLocalTidyChecks = []PathBasedTidyCheck{
    102 	{"external/", tidyExternalVendor},
    103 	{"external/google", tidyDefault},
    104 	{"external/webrtc", tidyDefault},
    105 	{"frameworks/compile/mclinker/", tidyExternalVendor},
    106 	{"hardware/qcom", tidyExternalVendor},
    107 	{"vendor/", tidyExternalVendor},
    108 	{"vendor/google", tidyDefault},
    109 	{"vendor/google_devices", tidyExternalVendor},
    110 }
    111 
    112 var reversedDefaultLocalTidyChecks = reverseTidyChecks(DefaultLocalTidyChecks)
    113 
    114 func reverseTidyChecks(in []PathBasedTidyCheck) []PathBasedTidyCheck {
    115 	ret := make([]PathBasedTidyCheck, len(in))
    116 	for i, check := range in {
    117 		ret[len(in)-i-1] = check
    118 	}
    119 	return ret
    120 }
    121 
    122 func TidyChecksForDir(dir string) string {
    123 	for _, pathCheck := range reversedDefaultLocalTidyChecks {
    124 		if strings.HasPrefix(dir, pathCheck.PathPrefix) {
    125 			return pathCheck.Checks
    126 		}
    127 	}
    128 	return tidyDefault
    129 }
    130