blob: 6034fb0f2d64b99ca95d6e94aae087dc37de994c [file] [log] [blame]
Tobias Boschef8f9692019-06-10 15:50:33 -07001package main
2
3import (
4 "log"
5 "path/filepath"
6 "strings"
7)
8
9func calcCompilerCommand(env env, cfg *config, wrapperCmd *command) (*command, error) {
10 absWrapperDir, err := getAbsWrapperDir(env, wrapperCmd.path)
11 if err != nil {
12 return nil, err
13 }
14 rootPath := filepath.Join(absWrapperDir, cfg.rootRelPath)
15 if err := checkUnsupportedFlags(wrapperCmd); err != nil {
16 return nil, err
17 }
Tobias Boschaa311162019-06-20 17:47:19 -070018 builder, err := newCommandBuilder(env, cfg, wrapperCmd)
Tobias Boschef8f9692019-06-10 15:50:33 -070019 if err != nil {
20 return nil, err
21 }
22 useClang := builder.target.compilerType == clangType
23 sysroot := processSysrootFlag(rootPath, builder)
24 if useClang {
25 builder.addPreUserArgs(cfg.clangFlags...)
26 } else {
27 builder.addPreUserArgs(cfg.gccFlags...)
28 }
29 builder.addPreUserArgs(cfg.commonFlags...)
30 processPieFlags(builder)
31 processStackProtectorFlags(builder)
32 processThumbCodeFlags(builder)
33 processX86Flags(builder)
34 processSanitizerFlags(builder)
35 if useClang {
36 if err := processClangFlags(rootPath, builder); err != nil {
37 return nil, err
38 }
39 } else {
40 processGccFlags(builder)
41 }
42 gomaccUsed := processGomaCccFlags(builder)
43 if !gomaccUsed {
44 processCCacheFlag(sysroot, builder)
45 }
46
47 return builder.build(), nil
48}
49
50func calcCompilerCommandAndCompareToOld(env env, cfg *config, wrapperCmd *command) (*command, error) {
51 compilerCmd, err := calcCompilerCommand(env, cfg, wrapperCmd)
52 if err != nil {
53 return nil, err
54 }
55 if cfg.oldWrapperPath == "" {
56 return compilerCmd, nil
57 }
58 oldCmds, err := calcOldCompilerCommands(env, cfg, wrapperCmd)
59 if err != nil {
60 return nil, err
61 }
62 if err := compilerCmd.verifySimilarTo(oldCmds[0]); err != nil {
63 return nil, err
64 }
65 return compilerCmd, nil
66}
67
68func getAbsWrapperDir(env env, wrapperPath string) (string, error) {
69 if !filepath.IsAbs(wrapperPath) {
70 wrapperPath = filepath.Join(env.getwd(), wrapperPath)
71 }
72 evaledCmdPath, err := filepath.EvalSymlinks(wrapperPath)
73 if err != nil {
74 log.Printf("Unable to EvalSymlinks for %s. Error: %s", evaledCmdPath, err)
75 return "", err
76 }
77 return filepath.Dir(evaledCmdPath), nil
78}
79
80// Whether the command should be executed by the old wrapper as we don't
81// support it yet.
82func shouldForwardToOldWrapper(env env, wrapperCmd *command) bool {
83 for _, arg := range wrapperCmd.args {
84 switch {
85 case strings.HasPrefix(arg, "-Xclang-path="):
86 fallthrough
87 case arg == "-clang-syntax":
88 return true
89 }
90 }
91 switch {
92 case env.getenv("WITH_TIDY") != "":
93 fallthrough
94 case env.getenv("FORCE_DISABLE_WERROR") != "":
95 fallthrough
96 case env.getenv("GETRUSAGE") != "":
97 fallthrough
98 case env.getenv("BISECT_STAGE") != "":
99 return true
100 }
101 return false
102}