blob: 38a64a07b951a18f6ba580ca3bc86c3c709cf677 [file] [log] [blame]
Dan Willemsen20acc5c2016-05-25 14:47:21 -07001// 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
15package cc
16
17// This file contains utility functions to check for bad or illegal cflags
18// specified by a module
19
20import (
21 "path/filepath"
22 "strings"
23)
24
25// Check for invalid c/conly/cpp/asflags and suggest alternatives. Only use this
26// for flags explicitly passed by the user, since these flags may be used internally.
27func CheckBadCompilerFlags(ctx ModuleContext, prop string, flags []string) {
28 for _, flag := range flags {
29 flag = strings.TrimSpace(flag)
30
31 if !strings.HasPrefix(flag, "-") {
32 ctx.PropertyErrorf(prop, "Flag `%s` must start with `-`", flag)
33 } else if strings.HasPrefix(flag, "-I") || strings.HasPrefix(flag, "-isystem") {
34 ctx.PropertyErrorf(prop, "Bad flag `%s`, use local_include_dirs or include_dirs instead", flag)
35 } else if inList(flag, illegalFlags) {
36 ctx.PropertyErrorf(prop, "Illegal flag `%s`", flag)
37 } else if strings.Contains(flag, " ") {
38 args := strings.Split(flag, " ")
39 if args[0] == "-include" {
40 if len(args) > 2 {
41 ctx.PropertyErrorf(prop, "`-include` only takes one argument: `%s`", flag)
42 }
43 path := filepath.Clean(args[1])
44 if strings.HasPrefix("/", path) {
45 ctx.PropertyErrorf(prop, "Path must not be an absolute path: %s", flag)
46 } else if strings.HasPrefix("../", path) {
47 ctx.PropertyErrorf(prop, "Path must not start with `../`: `%s`. Use include_dirs to -include from a different directory", flag)
48 }
49 } else {
50 ctx.PropertyErrorf(prop, "Bad flag: `%s` is not an allowed multi-word flag. Should it be split into multiple flags?", flag)
51 }
52 }
53 }
54}
55
56// Check for bad ldflags and suggest alternatives. Only use this for flags
57// explicitly passed by the user, since these flags may be used internally.
58func CheckBadLinkerFlags(ctx ModuleContext, prop string, flags []string) {
59 for _, flag := range flags {
60 flag = strings.TrimSpace(flag)
61
62 if !strings.HasPrefix(flag, "-") {
63 ctx.PropertyErrorf(prop, "Flag `%s` must start with `-`", flag)
64 } else if strings.HasPrefix(flag, "-l") {
65 if ctx.Host() {
66 ctx.PropertyErrorf(prop, "Bad flag: `%s`, use shared_libs or host_ldlibs instead", flag)
67 } else {
68 ctx.PropertyErrorf(prop, "Bad flag: `%s`, use shared_libs instead", flag)
69 }
70 } else if strings.HasPrefix(flag, "-L") {
71 ctx.PropertyErrorf(prop, "Bad flag: `%s` is not allowed", flag)
Dan Willemsen58f9bb12016-06-03 13:54:46 -070072 } else if strings.HasPrefix(flag, "-Wl,--version-script") {
73 ctx.PropertyErrorf(prop, "Bad flag: `%s`, use version_script instead", flag)
Dan Willemsen20acc5c2016-05-25 14:47:21 -070074 } else if strings.Contains(flag, " ") {
75 ctx.PropertyErrorf(prop, "Bad flag: `%s` is not an allowed multi-word flag. Should it be split into multiple flags?", flag)
76 }
77 }
78}
79
80// Check for bad host_ldlibs
81func CheckBadHostLdlibs(ctx ModuleContext, prop string, flags []string) {
82 allowed_ldlibs := ctx.toolchain().AvailableLibraries()
83
84 if !ctx.Host() {
85 panic("Invalid call to CheckBadHostLdlibs")
86 }
87
88 for _, flag := range flags {
89 flag = strings.TrimSpace(flag)
90
91 // TODO: Probably should just redo this property to prefix -l in Soong
92 if !strings.HasPrefix(flag, "-l") {
93 ctx.PropertyErrorf(prop, "Invalid flag: `%s`, must start with `-l`", flag)
94 } else if !inList(flag, allowed_ldlibs) {
95 ctx.PropertyErrorf(prop, "Host library `%s` not available", flag)
96 }
97 }
98}