1// Copyright 2019 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 "fmt" 19 "testing" 20 21 "android/soong/android" 22) 23 24func TestMinSdkVersionsOfCrtObjects(t *testing.T) { 25 bp := ` 26 cc_object { 27 name: "crt_foo", 28 srcs: ["foo.c"], 29 crt: true, 30 stl: "none", 31 min_sdk_version: "28", 32 vendor_available: true, 33 } 34 ` 35 variants := []struct { 36 variant string 37 num string 38 }{ 39 {"android_arm64_armv8-a", "10000"}, 40 {"android_arm64_armv8-a_sdk_28", "28"}, 41 {"android_arm64_armv8-a_sdk_29", "29"}, 42 {"android_arm64_armv8-a_sdk_30", "30"}, 43 {"android_arm64_armv8-a_sdk_current", "10000"}, 44 {"android_vendor_arm64_armv8-a", "10000"}, 45 } 46 47 ctx := prepareForCcTest.RunTestWithBp(t, bp) 48 for _, v := range variants { 49 cflags := ctx.ModuleForTests("crt_foo", v.variant).Rule("cc").Args["cFlags"] 50 expected := "-target aarch64-linux-android" + v.num + " " 51 android.AssertStringDoesContain(t, "cflag", cflags, expected) 52 } 53 ctx = prepareForCcTest.RunTestWithBp(t, bp) 54 android.AssertStringDoesContain(t, "cflag", 55 ctx.ModuleForTests("crt_foo", "android_vendor_arm64_armv8-a").Rule("cc").Args["cFlags"], 56 "-target aarch64-linux-android10000 ") 57} 58 59func TestUseCrtObjectOfCorrectVersion(t *testing.T) { 60 ctx := testCc(t, ` 61 cc_binary { 62 name: "bin", 63 srcs: ["foo.c"], 64 stl: "none", 65 min_sdk_version: "29", 66 sdk_version: "current", 67 } 68 `) 69 70 // Sdk variant uses the crt object of the matching min_sdk_version 71 variant := "android_arm64_armv8-a_sdk" 72 crt := ctx.ModuleForTests("bin", variant).Rule("ld").Args["crtBegin"] 73 android.AssertStringDoesContain(t, "crt dep of sdk variant", crt, 74 "29/crtbegin_dynamic.o") 75 76 // platform variant uses the crt object built for platform 77 variant = "android_arm64_armv8-a" 78 crt = ctx.ModuleForTests("bin", variant).Rule("ld").Args["crtBegin"] 79 android.AssertStringDoesContain(t, "crt dep of platform variant", crt, 80 variant+"/crtbegin_dynamic.o") 81} 82 83func TestLinkerScript(t *testing.T) { 84 t.Run("script", func(t *testing.T) { 85 testCc(t, ` 86 cc_object { 87 name: "foo", 88 srcs: ["baz.o"], 89 linker_script: "foo.lds", 90 }`) 91 }) 92} 93 94func TestCcObjectOutputFile(t *testing.T) { 95 testcases := []struct { 96 name string 97 moduleName string 98 bp string 99 }{ 100 { 101 name: "normal", 102 moduleName: "foo", 103 bp: ` 104 srcs: ["bar.c"], 105 `, 106 }, 107 { 108 name: "suffix", 109 moduleName: "foo.o", 110 bp: ` 111 srcs: ["bar.c"], 112 `, 113 }, 114 { 115 name: "keep symbols", 116 moduleName: "foo", 117 bp: ` 118 srcs: ["bar.c"], 119 prefix_symbols: "foo_", 120 `, 121 }, 122 { 123 name: "partial linking", 124 moduleName: "foo", 125 bp: ` 126 srcs: ["bar.c", "baz.c"], 127 `, 128 }, 129 { 130 name: "partial linking and prefix symbols", 131 moduleName: "foo", 132 bp: ` 133 srcs: ["bar.c", "baz.c"], 134 prefix_symbols: "foo_", 135 `, 136 }, 137 } 138 139 for _, testcase := range testcases { 140 bp := fmt.Sprintf(` 141 cc_object { 142 name: "%s", 143 %s 144 } 145 `, testcase.moduleName, testcase.bp) 146 t.Run(testcase.name, func(t *testing.T) { 147 ctx := PrepareForIntegrationTestWithCc.RunTestWithBp(t, bp) 148 android.AssertPathRelativeToTopEquals(t, "expected output file foo.o", 149 fmt.Sprintf("out/soong/.intermediates/%s/android_arm64_armv8-a/foo.o", testcase.moduleName), 150 ctx.ModuleForTests(testcase.moduleName, "android_arm64_armv8-a").Output("foo.o").Output) 151 }) 152 } 153 154} 155