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