xref: /aosp_15_r20/external/toolchain-utils/compiler_wrapper/sysroot_flag.go (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li// Copyright 2019 The ChromiumOS Authors
2*760c253cSXin Li// Use of this source code is governed by a BSD-style license that can be
3*760c253cSXin Li// found in the LICENSE file.
4*760c253cSXin Li
5*760c253cSXin Lipackage main
6*760c253cSXin Li
7*760c253cSXin Liimport (
8*760c253cSXin Li	"path/filepath"
9*760c253cSXin Li	"strings"
10*760c253cSXin Li)
11*760c253cSXin Li
12*760c253cSXin Liconst skipSysrootAutodetectionFlag = "--cros-skip-wrapper-sysroot-autodetection"
13*760c253cSXin Li
14*760c253cSXin Lifunc processSysrootFlag(builder *commandBuilder) {
15*760c253cSXin Li	hadSkipSysrootMagicFlag := false
16*760c253cSXin Li	fromUser := false
17*760c253cSXin Li	userSysroot := ""
18*760c253cSXin Li	builder.transformArgs(func(arg builderArg) string {
19*760c253cSXin Li		switch {
20*760c253cSXin Li		// In rare cases (e.g., glibc), we want all sysroot autodetection logic to be
21*760c253cSXin Li		// disabled. This flag can be passed to disable that.
22*760c253cSXin Li		case arg.value == skipSysrootAutodetectionFlag:
23*760c253cSXin Li			hadSkipSysrootMagicFlag = true
24*760c253cSXin Li			return ""
25*760c253cSXin Li
26*760c253cSXin Li		case arg.fromUser && strings.HasPrefix(arg.value, "--sysroot="):
27*760c253cSXin Li			fromUser = true
28*760c253cSXin Li			sysrootArg := strings.Split(arg.value, "=")
29*760c253cSXin Li			if len(sysrootArg) == 2 {
30*760c253cSXin Li				userSysroot = sysrootArg[1]
31*760c253cSXin Li			}
32*760c253cSXin Li			return arg.value
33*760c253cSXin Li
34*760c253cSXin Li		default:
35*760c253cSXin Li			return arg.value
36*760c253cSXin Li		}
37*760c253cSXin Li	})
38*760c253cSXin Li
39*760c253cSXin Li	if hadSkipSysrootMagicFlag {
40*760c253cSXin Li		return
41*760c253cSXin Li	}
42*760c253cSXin Li
43*760c253cSXin Li	sysroot, syrootPresent := builder.env.getenv("SYSROOT")
44*760c253cSXin Li	if syrootPresent {
45*760c253cSXin Li		builder.updateEnv("SYSROOT=")
46*760c253cSXin Li	}
47*760c253cSXin Li	if sysroot == "" {
48*760c253cSXin Li		// Use the bundled sysroot by default.
49*760c253cSXin Li		sysroot = filepath.Join(builder.rootPath, "usr", builder.target.target)
50*760c253cSXin Li	}
51*760c253cSXin Li	if !fromUser {
52*760c253cSXin Li		builder.addPreUserArgs("--sysroot=" + sysroot)
53*760c253cSXin Li	} else {
54*760c253cSXin Li		sysroot = userSysroot
55*760c253cSXin Li	}
56*760c253cSXin Li
57*760c253cSXin Li	libdir := "-L" + sysroot + "/usr/lib"
58*760c253cSXin Li	if strings.Contains(builder.target.target, "64") {
59*760c253cSXin Li		libdir += "64"
60*760c253cSXin Li	}
61*760c253cSXin Li	builder.addPostUserArgs(libdir)
62*760c253cSXin Li}
63