github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/cc/androidmk.go (about)

     1  // Copyright 2015 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  
    15  package cc
    16  
    17  import (
    18  	"fmt"
    19  	"io"
    20  	"path/filepath"
    21  	"strings"
    22  
    23  	"android/soong/android"
    24  )
    25  
    26  var (
    27  	vendorSuffix = ".vendor"
    28  )
    29  
    30  type AndroidMkContext interface {
    31  	Target() android.Target
    32  	subAndroidMk(*android.AndroidMkData, interface{})
    33  	useVndk() bool
    34  }
    35  
    36  type subAndroidMkProvider interface {
    37  	AndroidMk(AndroidMkContext, *android.AndroidMkData)
    38  }
    39  
    40  func (c *Module) subAndroidMk(data *android.AndroidMkData, obj interface{}) {
    41  	if c.subAndroidMkOnce == nil {
    42  		c.subAndroidMkOnce = make(map[subAndroidMkProvider]bool)
    43  	}
    44  	if androidmk, ok := obj.(subAndroidMkProvider); ok {
    45  		if !c.subAndroidMkOnce[androidmk] {
    46  			c.subAndroidMkOnce[androidmk] = true
    47  			androidmk.AndroidMk(c, data)
    48  		}
    49  	}
    50  }
    51  
    52  func (c *Module) AndroidMk() android.AndroidMkData {
    53  	if c.Properties.HideFromMake {
    54  		return android.AndroidMkData{
    55  			Disabled: true,
    56  		}
    57  	}
    58  
    59  	ret := android.AndroidMkData{
    60  		OutputFile: c.outputFile,
    61  		Extra: []android.AndroidMkExtraFunc{
    62  			func(w io.Writer, outputFile android.Path) {
    63  				if len(c.Properties.Logtags) > 0 {
    64  					fmt.Fprintln(w, "LOCAL_LOGTAGS_FILES :=", strings.Join(c.Properties.Logtags, " "))
    65  				}
    66  				fmt.Fprintln(w, "LOCAL_SANITIZE := never")
    67  				if len(c.Properties.AndroidMkSharedLibs) > 0 {
    68  					fmt.Fprintln(w, "LOCAL_SHARED_LIBRARIES := "+strings.Join(c.Properties.AndroidMkSharedLibs, " "))
    69  				}
    70  				if c.Target().Os == android.Android &&
    71  					String(c.Properties.Sdk_version) != "" && !c.useVndk() {
    72  					fmt.Fprintln(w, "LOCAL_SDK_VERSION := "+String(c.Properties.Sdk_version))
    73  					fmt.Fprintln(w, "LOCAL_NDK_STL_VARIANT := none")
    74  				} else {
    75  					// These are already included in LOCAL_SHARED_LIBRARIES
    76  					fmt.Fprintln(w, "LOCAL_CXX_STL := none")
    77  				}
    78  				if c.useVndk() {
    79  					fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
    80  				}
    81  			},
    82  		},
    83  	}
    84  
    85  	for _, feature := range c.features {
    86  		c.subAndroidMk(&ret, feature)
    87  	}
    88  
    89  	c.subAndroidMk(&ret, c.compiler)
    90  	c.subAndroidMk(&ret, c.linker)
    91  	if c.sanitize != nil {
    92  		c.subAndroidMk(&ret, c.sanitize)
    93  	}
    94  	c.subAndroidMk(&ret, c.installer)
    95  
    96  	if c.useVndk() && c.hasVendorVariant() {
    97  		// .vendor suffix is added only when we will have two variants: core and vendor.
    98  		// The suffix is not added for vendor-only module.
    99  		ret.SubName += vendorSuffix
   100  	}
   101  
   102  	return ret
   103  }
   104  
   105  func androidMkWriteTestData(data android.Paths, ctx AndroidMkContext, ret *android.AndroidMkData) {
   106  	var testFiles []string
   107  	for _, d := range data {
   108  		rel := d.Rel()
   109  		path := d.String()
   110  		if !strings.HasSuffix(path, rel) {
   111  			panic(fmt.Errorf("path %q does not end with %q", path, rel))
   112  		}
   113  		path = strings.TrimSuffix(path, rel)
   114  		testFiles = append(testFiles, path+":"+rel)
   115  	}
   116  	if len(testFiles) > 0 {
   117  		ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   118  			fmt.Fprintln(w, "LOCAL_TEST_DATA := "+strings.Join(testFiles, " "))
   119  		})
   120  	}
   121  }
   122  
   123  func (library *libraryDecorator) androidMkWriteExportedFlags(w io.Writer) {
   124  	exportedFlags := library.exportedFlags()
   125  	if len(exportedFlags) > 0 {
   126  		fmt.Fprintln(w, "LOCAL_EXPORT_CFLAGS :=", strings.Join(exportedFlags, " "))
   127  	}
   128  	exportedFlagsDeps := library.exportedFlagsDeps()
   129  	if len(exportedFlagsDeps) > 0 {
   130  		fmt.Fprintln(w, "LOCAL_EXPORT_C_INCLUDE_DEPS :=", strings.Join(exportedFlagsDeps.Strings(), " "))
   131  	}
   132  }
   133  
   134  func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   135  	if library.static() {
   136  		ret.Class = "STATIC_LIBRARIES"
   137  	} else if library.shared() {
   138  		ctx.subAndroidMk(ret, &library.stripper)
   139  		ctx.subAndroidMk(ret, &library.relocationPacker)
   140  
   141  		ret.Class = "SHARED_LIBRARIES"
   142  	} else if library.header() {
   143  		ret.Custom = func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
   144  			fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)")
   145  			fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir)
   146  			fmt.Fprintln(w, "LOCAL_MODULE :=", name+data.SubName)
   147  
   148  			archStr := ctx.Target().Arch.ArchType.String()
   149  			var host bool
   150  			switch ctx.Target().Os.Class {
   151  			case android.Host:
   152  				fmt.Fprintln(w, "LOCAL_MODULE_HOST_ARCH := ", archStr)
   153  				host = true
   154  			case android.HostCross:
   155  				fmt.Fprintln(w, "LOCAL_MODULE_HOST_CROSS_ARCH := ", archStr)
   156  				host = true
   157  			case android.Device:
   158  				fmt.Fprintln(w, "LOCAL_MODULE_TARGET_ARCH := ", archStr)
   159  			}
   160  
   161  			if host {
   162  				makeOs := ctx.Target().Os.String()
   163  				if ctx.Target().Os == android.Linux || ctx.Target().Os == android.LinuxBionic {
   164  					makeOs = "linux"
   165  				}
   166  				fmt.Fprintln(w, "LOCAL_MODULE_HOST_OS :=", makeOs)
   167  				fmt.Fprintln(w, "LOCAL_IS_HOST_MODULE := true")
   168  			} else if ctx.useVndk() {
   169  				fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
   170  			}
   171  
   172  			library.androidMkWriteExportedFlags(w)
   173  			fmt.Fprintln(w, "include $(BUILD_HEADER_LIBRARY)")
   174  		}
   175  
   176  		return
   177  	}
   178  
   179  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   180  		library.androidMkWriteExportedFlags(w)
   181  		fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES := ")
   182  		if library.sAbiOutputFile.Valid() {
   183  			fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES += ", library.sAbiOutputFile.String())
   184  			if library.sAbiDiff.Valid() && !library.static() {
   185  				fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES += ", library.sAbiDiff.String())
   186  				fmt.Fprintln(w, "HEADER_ABI_DIFFS += ", library.sAbiDiff.String())
   187  			}
   188  		}
   189  
   190  		fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+outputFile.Ext())
   191  
   192  		fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
   193  
   194  		if library.coverageOutputFile.Valid() {
   195  			fmt.Fprintln(w, "LOCAL_PREBUILT_COVERAGE_ARCHIVE :=", library.coverageOutputFile.String())
   196  		}
   197  	})
   198  
   199  	if library.shared() {
   200  		ctx.subAndroidMk(ret, library.baseInstaller)
   201  	}
   202  }
   203  
   204  func (object *objectLinker) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   205  	ret.Custom = func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
   206  		out := ret.OutputFile.Path()
   207  
   208  		fmt.Fprintln(w, "\n$("+prefix+"OUT_INTERMEDIATE_LIBRARIES)/"+name+data.SubName+objectExtension+":", out.String())
   209  		fmt.Fprintln(w, "\t$(copy-file-to-target)")
   210  	}
   211  }
   212  
   213  func (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   214  	ctx.subAndroidMk(ret, binary.baseInstaller)
   215  	ctx.subAndroidMk(ret, &binary.stripper)
   216  
   217  	ret.Class = "EXECUTABLES"
   218  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   219  		fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
   220  		if Bool(binary.Properties.Static_executable) {
   221  			fmt.Fprintln(w, "LOCAL_FORCE_STATIC_EXECUTABLE := true")
   222  		}
   223  
   224  		if len(binary.symlinks) > 0 {
   225  			fmt.Fprintln(w, "LOCAL_MODULE_SYMLINKS := "+strings.Join(binary.symlinks, " "))
   226  		}
   227  
   228  		if binary.coverageOutputFile.Valid() {
   229  			fmt.Fprintln(w, "LOCAL_PREBUILT_COVERAGE_ARCHIVE :=", binary.coverageOutputFile.String())
   230  		}
   231  
   232  		if len(binary.Properties.Overrides) > 0 {
   233  			fmt.Fprintln(w, "LOCAL_OVERRIDES_MODULES := "+strings.Join(binary.Properties.Overrides, " "))
   234  		}
   235  	})
   236  }
   237  
   238  func (benchmark *benchmarkDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   239  	ctx.subAndroidMk(ret, benchmark.binaryDecorator)
   240  	ret.Class = "NATIVE_TESTS"
   241  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   242  		if len(benchmark.Properties.Test_suites) > 0 {
   243  			fmt.Fprintln(w, "LOCAL_COMPATIBILITY_SUITE :=",
   244  				strings.Join(benchmark.Properties.Test_suites, " "))
   245  		}
   246  	})
   247  
   248  	androidMkWriteTestData(benchmark.data, ctx, ret)
   249  }
   250  
   251  func (test *testBinary) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   252  	ctx.subAndroidMk(ret, test.binaryDecorator)
   253  	ret.Class = "NATIVE_TESTS"
   254  	if Bool(test.Properties.Test_per_src) {
   255  		ret.SubName = "_" + String(test.binaryDecorator.Properties.Stem)
   256  	}
   257  
   258  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   259  		if len(test.Properties.Test_suites) > 0 {
   260  			fmt.Fprintln(w, "LOCAL_COMPATIBILITY_SUITE :=",
   261  				strings.Join(test.Properties.Test_suites, " "))
   262  		}
   263  	})
   264  
   265  	androidMkWriteTestData(test.data, ctx, ret)
   266  }
   267  
   268  func (test *testLibrary) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   269  	ctx.subAndroidMk(ret, test.libraryDecorator)
   270  }
   271  
   272  func (library *toolchainLibraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   273  	ret.Class = "STATIC_LIBRARIES"
   274  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   275  		fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+outputFile.Ext())
   276  		fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
   277  	})
   278  }
   279  
   280  func (stripper *stripper) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   281  	// Make only supports stripping target modules
   282  	if ctx.Target().Os != android.Android {
   283  		return
   284  	}
   285  
   286  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   287  		if Bool(stripper.StripProperties.Strip.None) {
   288  
   289  			fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false")
   290  		} else if Bool(stripper.StripProperties.Strip.Keep_symbols) {
   291  			fmt.Fprintln(w, "LOCAL_STRIP_MODULE := keep_symbols")
   292  		} else {
   293  			fmt.Fprintln(w, "LOCAL_STRIP_MODULE := mini-debug-info")
   294  		}
   295  	})
   296  }
   297  
   298  func (packer *relocationPacker) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   299  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   300  		if packer.Properties.PackingRelocations {
   301  			fmt.Fprintln(w, "LOCAL_PACK_MODULE_RELOCATIONS := true")
   302  		}
   303  	})
   304  }
   305  
   306  func (installer *baseInstaller) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   307  	// Soong installation is only supported for host modules. Have Make
   308  	// installation trigger Soong installation.
   309  	if ctx.Target().Os.Class == android.Host {
   310  		ret.OutputFile = android.OptionalPathForPath(installer.path)
   311  	}
   312  
   313  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   314  		path := installer.path.RelPathString()
   315  		dir, file := filepath.Split(path)
   316  		stem := strings.TrimSuffix(file, filepath.Ext(file))
   317  		fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+filepath.Ext(file))
   318  		fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(OUT_DIR)/"+filepath.Clean(dir))
   319  		fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem)
   320  	})
   321  }
   322  
   323  func (c *stubDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   324  	ret.SubName = ndkLibrarySuffix + "." + c.properties.ApiLevel
   325  	ret.Class = "SHARED_LIBRARIES"
   326  
   327  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   328  		path, file := filepath.Split(c.installPath.String())
   329  		stem := strings.TrimSuffix(file, filepath.Ext(file))
   330  		fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
   331  		fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+outputFile.Ext())
   332  		fmt.Fprintln(w, "LOCAL_MODULE_PATH := "+path)
   333  		fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem)
   334  		fmt.Fprintln(w, "LOCAL_NO_NOTICE_FILE := true")
   335  
   336  		// Prevent make from installing the libraries to obj/lib (since we have
   337  		// dozens of libraries with the same name, they'll clobber each other
   338  		// and the real versions of the libraries from the platform).
   339  		fmt.Fprintln(w, "LOCAL_COPY_TO_INTERMEDIATE_LIBRARIES := false")
   340  	})
   341  }
   342  
   343  func (c *llndkStubDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   344  	ret.Class = "SHARED_LIBRARIES"
   345  	ret.SubName = ".vendor"
   346  
   347  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   348  		c.libraryDecorator.androidMkWriteExportedFlags(w)
   349  
   350  		fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+outputFile.Ext())
   351  		fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false")
   352  		fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
   353  		fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true")
   354  		fmt.Fprintln(w, "LOCAL_NO_NOTICE_FILE := true")
   355  		fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
   356  	})
   357  }
   358  
   359  func (c *vndkPrebuiltLibraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   360  	ret.Class = "SHARED_LIBRARIES"
   361  
   362  	ret.SubName = c.NameSuffix()
   363  
   364  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   365  		c.libraryDecorator.androidMkWriteExportedFlags(w)
   366  
   367  		path := c.path.RelPathString()
   368  		dir, file := filepath.Split(path)
   369  		stem := strings.TrimSuffix(file, filepath.Ext(file))
   370  		fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false")
   371  		fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
   372  		fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
   373  		fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+outputFile.Ext())
   374  		fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+filepath.Ext(file))
   375  		fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(OUT_DIR)/"+filepath.Clean(dir))
   376  		fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem)
   377  	})
   378  }
   379  
   380  func (c *ndkPrebuiltStlLinker) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   381  	ret.Class = "SHARED_LIBRARIES"
   382  
   383  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   384  		// Prevent make from installing the libraries to obj/lib (since we have
   385  		// dozens of libraries with the same name, they'll clobber each other
   386  		// and the real versions of the libraries from the platform).
   387  		fmt.Fprintln(w, "LOCAL_COPY_TO_INTERMEDIATE_LIBRARIES := false")
   388  	})
   389  }
   390  
   391  func (c *vendorPublicLibraryStubDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
   392  	ret.Class = "SHARED_LIBRARIES"
   393  	ret.SubName = vendorPublicLibrarySuffix
   394  
   395  	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
   396  		c.libraryDecorator.androidMkWriteExportedFlags(w)
   397  
   398  		fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+outputFile.Ext())
   399  		fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false")
   400  		fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
   401  		fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true")
   402  		fmt.Fprintln(w, "LOCAL_NO_NOTICE_FILE := true")
   403  	})
   404  }