xref: /aosp_15_r20/build/soong/cc/strip.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage cc
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"strings"
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
21*333d2b36SAndroid Build Coastguard Worker)
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker// StripProperties defines the type of stripping applied to the module.
24*333d2b36SAndroid Build Coastguard Workertype StripProperties struct {
25*333d2b36SAndroid Build Coastguard Worker	Strip struct {
26*333d2b36SAndroid Build Coastguard Worker		// none forces all stripping to be disabled.
27*333d2b36SAndroid Build Coastguard Worker		// Device modules default to stripping enabled leaving mini debuginfo.
28*333d2b36SAndroid Build Coastguard Worker		// Host modules default to stripping disabled, but can be enabled by setting any other
29*333d2b36SAndroid Build Coastguard Worker		// strip boolean property.
30*333d2b36SAndroid Build Coastguard Worker		None *bool `android:"arch_variant"`
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Worker		// all forces stripping everything, including the mini debug info.
33*333d2b36SAndroid Build Coastguard Worker		All *bool `android:"arch_variant"`
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Worker		// keep_symbols enables stripping but keeps all symbols.
36*333d2b36SAndroid Build Coastguard Worker		Keep_symbols *bool `android:"arch_variant"`
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker		// keep_symbols_list specifies a list of symbols to keep if keep_symbols is enabled.
39*333d2b36SAndroid Build Coastguard Worker		// If it is unset then all symbols are kept.
40*333d2b36SAndroid Build Coastguard Worker		Keep_symbols_list []string `android:"arch_variant"`
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker		// keep_symbols_and_debug_frame enables stripping but keeps all symbols and debug frames.
43*333d2b36SAndroid Build Coastguard Worker		Keep_symbols_and_debug_frame *bool `android:"arch_variant"`
44*333d2b36SAndroid Build Coastguard Worker	} `android:"arch_variant"`
45*333d2b36SAndroid Build Coastguard Worker}
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Worker// Stripper defines the stripping actions and properties for a module.
48*333d2b36SAndroid Build Coastguard Workertype Stripper struct {
49*333d2b36SAndroid Build Coastguard Worker	StripProperties StripProperties
50*333d2b36SAndroid Build Coastguard Worker}
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker// NeedsStrip determines if stripping is required for a module.
53*333d2b36SAndroid Build Coastguard Workerfunc (stripper *Stripper) NeedsStrip(actx android.ModuleContext) bool {
54*333d2b36SAndroid Build Coastguard Worker	forceDisable := Bool(stripper.StripProperties.Strip.None)
55*333d2b36SAndroid Build Coastguard Worker	defaultEnable := (!actx.Config().KatiEnabled() || actx.Device())
56*333d2b36SAndroid Build Coastguard Worker	forceEnable := Bool(stripper.StripProperties.Strip.All) ||
57*333d2b36SAndroid Build Coastguard Worker		Bool(stripper.StripProperties.Strip.Keep_symbols) ||
58*333d2b36SAndroid Build Coastguard Worker		Bool(stripper.StripProperties.Strip.Keep_symbols_and_debug_frame)
59*333d2b36SAndroid Build Coastguard Worker	return !forceDisable && (forceEnable || defaultEnable)
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Workerfunc (stripper *Stripper) strip(actx android.ModuleContext, in android.Path, out android.ModuleOutPath,
63*333d2b36SAndroid Build Coastguard Worker	flags StripFlags, isStaticLib bool) {
64*333d2b36SAndroid Build Coastguard Worker	if actx.Darwin() {
65*333d2b36SAndroid Build Coastguard Worker		transformDarwinStrip(actx, in, out)
66*333d2b36SAndroid Build Coastguard Worker	} else {
67*333d2b36SAndroid Build Coastguard Worker		if Bool(stripper.StripProperties.Strip.Keep_symbols) {
68*333d2b36SAndroid Build Coastguard Worker			flags.StripKeepSymbols = true
69*333d2b36SAndroid Build Coastguard Worker		} else if Bool(stripper.StripProperties.Strip.Keep_symbols_and_debug_frame) {
70*333d2b36SAndroid Build Coastguard Worker			flags.StripKeepSymbolsAndDebugFrame = true
71*333d2b36SAndroid Build Coastguard Worker		} else if len(stripper.StripProperties.Strip.Keep_symbols_list) > 0 {
72*333d2b36SAndroid Build Coastguard Worker			flags.StripKeepSymbolsList = strings.Join(stripper.StripProperties.Strip.Keep_symbols_list, ",")
73*333d2b36SAndroid Build Coastguard Worker		} else if !Bool(stripper.StripProperties.Strip.All) {
74*333d2b36SAndroid Build Coastguard Worker			flags.StripKeepMiniDebugInfo = true
75*333d2b36SAndroid Build Coastguard Worker		}
76*333d2b36SAndroid Build Coastguard Worker		if actx.Config().Debuggable() && !flags.StripKeepMiniDebugInfo && !isStaticLib {
77*333d2b36SAndroid Build Coastguard Worker			flags.StripAddGnuDebuglink = true
78*333d2b36SAndroid Build Coastguard Worker		}
79*333d2b36SAndroid Build Coastguard Worker		transformStrip(actx, in, out, flags)
80*333d2b36SAndroid Build Coastguard Worker	}
81*333d2b36SAndroid Build Coastguard Worker}
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker// StripExecutableOrSharedLib strips a binary or shared library from its debug
84*333d2b36SAndroid Build Coastguard Worker// symbols and other debugging information. The helper function
85*333d2b36SAndroid Build Coastguard Worker// flagsToStripFlags may be used to generate the flags argument.
86*333d2b36SAndroid Build Coastguard Workerfunc (stripper *Stripper) StripExecutableOrSharedLib(actx android.ModuleContext, in android.Path,
87*333d2b36SAndroid Build Coastguard Worker	out android.ModuleOutPath, flags StripFlags) {
88*333d2b36SAndroid Build Coastguard Worker	stripper.strip(actx, in, out, flags, false)
89*333d2b36SAndroid Build Coastguard Worker}
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker// StripStaticLib strips a static library from its debug symbols and other
92*333d2b36SAndroid Build Coastguard Worker// debugging information. The helper function flagsToStripFlags may be used to
93*333d2b36SAndroid Build Coastguard Worker// generate the flags argument.
94*333d2b36SAndroid Build Coastguard Workerfunc (stripper *Stripper) StripStaticLib(actx android.ModuleContext, in android.Path, out android.ModuleOutPath,
95*333d2b36SAndroid Build Coastguard Worker	flags StripFlags) {
96*333d2b36SAndroid Build Coastguard Worker	stripper.strip(actx, in, out, flags, true)
97*333d2b36SAndroid Build Coastguard Worker}
98