1// 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
17import (
18	"strings"
19
20	"android/soong/android"
21)
22
23type StripProperties struct {
24	Strip struct {
25		None                         *bool    `android:"arch_variant"`
26		All                          *bool    `android:"arch_variant"`
27		Keep_symbols                 *bool    `android:"arch_variant"`
28		Keep_symbols_list            []string `android:"arch_variant"`
29		Keep_symbols_and_debug_frame *bool    `android:"arch_variant"`
30	} `android:"arch_variant"`
31}
32
33type stripper struct {
34	StripProperties StripProperties
35}
36
37func (stripper *stripper) needsStrip(ctx ModuleContext) bool {
38	// TODO(ccross): enable host stripping when embedded in make?  Make never had support for stripping host binaries.
39	return (!ctx.Config().EmbeddedInMake() || ctx.Device()) && !Bool(stripper.StripProperties.Strip.None)
40}
41
42func (stripper *stripper) strip(ctx ModuleContext, in android.Path, out android.ModuleOutPath,
43	flags builderFlags, isStaticLib bool) {
44	if ctx.Darwin() {
45		TransformDarwinStrip(ctx, in, out)
46	} else {
47		if Bool(stripper.StripProperties.Strip.Keep_symbols) {
48			flags.stripKeepSymbols = true
49		} else if Bool(stripper.StripProperties.Strip.Keep_symbols_and_debug_frame) {
50			flags.stripKeepSymbolsAndDebugFrame = true
51		} else if len(stripper.StripProperties.Strip.Keep_symbols_list) > 0 {
52			flags.stripKeepSymbolsList = strings.Join(stripper.StripProperties.Strip.Keep_symbols_list, ",")
53		} else if !Bool(stripper.StripProperties.Strip.All) {
54			flags.stripKeepMiniDebugInfo = true
55		}
56		if ctx.Config().Debuggable() && !flags.stripKeepMiniDebugInfo && !isStaticLib {
57			flags.stripAddGnuDebuglink = true
58		}
59		TransformStrip(ctx, in, out, flags)
60	}
61}
62
63func (stripper *stripper) stripExecutableOrSharedLib(ctx ModuleContext, in android.Path,
64	out android.ModuleOutPath, flags builderFlags) {
65	stripper.strip(ctx, in, out, flags, false)
66}
67
68func (stripper *stripper) stripStaticLib(ctx ModuleContext, in android.Path, out android.ModuleOutPath,
69	flags builderFlags) {
70	stripper.strip(ctx, in, out, flags, true)
71}
72