blob: 6034fb0f2d64b99ca95d6e94aae087dc37de994c [file] [log] [blame]
package main
import (
"log"
"path/filepath"
"strings"
)
func calcCompilerCommand(env env, cfg *config, wrapperCmd *command) (*command, error) {
absWrapperDir, err := getAbsWrapperDir(env, wrapperCmd.path)
if err != nil {
return nil, err
}
rootPath := filepath.Join(absWrapperDir, cfg.rootRelPath)
if err := checkUnsupportedFlags(wrapperCmd); err != nil {
return nil, err
}
builder, err := newCommandBuilder(env, cfg, wrapperCmd)
if err != nil {
return nil, err
}
useClang := builder.target.compilerType == clangType
sysroot := processSysrootFlag(rootPath, builder)
if useClang {
builder.addPreUserArgs(cfg.clangFlags...)
} else {
builder.addPreUserArgs(cfg.gccFlags...)
}
builder.addPreUserArgs(cfg.commonFlags...)
processPieFlags(builder)
processStackProtectorFlags(builder)
processThumbCodeFlags(builder)
processX86Flags(builder)
processSanitizerFlags(builder)
if useClang {
if err := processClangFlags(rootPath, builder); err != nil {
return nil, err
}
} else {
processGccFlags(builder)
}
gomaccUsed := processGomaCccFlags(builder)
if !gomaccUsed {
processCCacheFlag(sysroot, builder)
}
return builder.build(), nil
}
func calcCompilerCommandAndCompareToOld(env env, cfg *config, wrapperCmd *command) (*command, error) {
compilerCmd, err := calcCompilerCommand(env, cfg, wrapperCmd)
if err != nil {
return nil, err
}
if cfg.oldWrapperPath == "" {
return compilerCmd, nil
}
oldCmds, err := calcOldCompilerCommands(env, cfg, wrapperCmd)
if err != nil {
return nil, err
}
if err := compilerCmd.verifySimilarTo(oldCmds[0]); err != nil {
return nil, err
}
return compilerCmd, nil
}
func getAbsWrapperDir(env env, wrapperPath string) (string, error) {
if !filepath.IsAbs(wrapperPath) {
wrapperPath = filepath.Join(env.getwd(), wrapperPath)
}
evaledCmdPath, err := filepath.EvalSymlinks(wrapperPath)
if err != nil {
log.Printf("Unable to EvalSymlinks for %s. Error: %s", evaledCmdPath, err)
return "", err
}
return filepath.Dir(evaledCmdPath), nil
}
// Whether the command should be executed by the old wrapper as we don't
// support it yet.
func shouldForwardToOldWrapper(env env, wrapperCmd *command) bool {
for _, arg := range wrapperCmd.args {
switch {
case strings.HasPrefix(arg, "-Xclang-path="):
fallthrough
case arg == "-clang-syntax":
return true
}
}
switch {
case env.getenv("WITH_TIDY") != "":
fallthrough
case env.getenv("FORCE_DISABLE_WERROR") != "":
fallthrough
case env.getenv("GETRUSAGE") != "":
fallthrough
case env.getenv("BISECT_STAGE") != "":
return true
}
return false
}