Home | History | Annotate | Download | only in cc
      1 // Copyright 2017 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 	"reflect"
     19 	"testing"
     20 )
     21 
     22 func TestLibraryReuse(t *testing.T) {
     23 	t.Run("simple", func(t *testing.T) {
     24 		ctx := testCc(t, `
     25 		cc_library {
     26 			name: "libfoo",
     27 			srcs: ["foo.c"],
     28 		}`)
     29 
     30 		libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Rule("ld")
     31 		libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_static").Output("libfoo.a")
     32 
     33 		if len(libfooShared.Inputs) != 1 {
     34 			t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
     35 		}
     36 
     37 		if len(libfooStatic.Inputs) != 1 {
     38 			t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
     39 		}
     40 
     41 		if libfooShared.Inputs[0] != libfooStatic.Inputs[0] {
     42 			t.Errorf("static object not reused for shared library")
     43 		}
     44 	})
     45 
     46 	t.Run("extra static source", func(t *testing.T) {
     47 		ctx := testCc(t, `
     48 		cc_library {
     49 			name: "libfoo",
     50 			srcs: ["foo.c"],
     51 			static: {
     52 				srcs: ["bar.c"]
     53 			},
     54 		}`)
     55 
     56 		libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Rule("ld")
     57 		libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_static").Output("libfoo.a")
     58 
     59 		if len(libfooShared.Inputs) != 1 {
     60 			t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
     61 		}
     62 
     63 		if len(libfooStatic.Inputs) != 2 {
     64 			t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
     65 		}
     66 
     67 		if libfooShared.Inputs[0] != libfooStatic.Inputs[0] {
     68 			t.Errorf("static object not reused for shared library")
     69 		}
     70 	})
     71 
     72 	t.Run("extra shared source", func(t *testing.T) {
     73 		ctx := testCc(t, `
     74 		cc_library {
     75 			name: "libfoo",
     76 			srcs: ["foo.c"],
     77 			shared: {
     78 				srcs: ["bar.c"]
     79 			},
     80 		}`)
     81 
     82 		libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Rule("ld")
     83 		libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_static").Output("libfoo.a")
     84 
     85 		if len(libfooShared.Inputs) != 2 {
     86 			t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
     87 		}
     88 
     89 		if len(libfooStatic.Inputs) != 1 {
     90 			t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
     91 		}
     92 
     93 		if libfooShared.Inputs[0] != libfooStatic.Inputs[0] {
     94 			t.Errorf("static object not reused for shared library")
     95 		}
     96 	})
     97 
     98 	t.Run("extra static cflags", func(t *testing.T) {
     99 		ctx := testCc(t, `
    100 		cc_library {
    101 			name: "libfoo",
    102 			srcs: ["foo.c"],
    103 			static: {
    104 				cflags: ["-DFOO"],
    105 			},
    106 		}`)
    107 
    108 		libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Rule("ld")
    109 		libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_static").Output("libfoo.a")
    110 
    111 		if len(libfooShared.Inputs) != 1 {
    112 			t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
    113 		}
    114 
    115 		if len(libfooStatic.Inputs) != 1 {
    116 			t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
    117 		}
    118 
    119 		if libfooShared.Inputs[0] == libfooStatic.Inputs[0] {
    120 			t.Errorf("static object reused for shared library when it shouldn't be")
    121 		}
    122 	})
    123 
    124 	t.Run("extra shared cflags", func(t *testing.T) {
    125 		ctx := testCc(t, `
    126 		cc_library {
    127 			name: "libfoo",
    128 			srcs: ["foo.c"],
    129 			shared: {
    130 				cflags: ["-DFOO"],
    131 			},
    132 		}`)
    133 
    134 		libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Rule("ld")
    135 		libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_static").Output("libfoo.a")
    136 
    137 		if len(libfooShared.Inputs) != 1 {
    138 			t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
    139 		}
    140 
    141 		if len(libfooStatic.Inputs) != 1 {
    142 			t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
    143 		}
    144 
    145 		if libfooShared.Inputs[0] == libfooStatic.Inputs[0] {
    146 			t.Errorf("static object reused for shared library when it shouldn't be")
    147 		}
    148 	})
    149 
    150 	t.Run("global cflags for reused generated sources", func(t *testing.T) {
    151 		ctx := testCc(t, `
    152 		cc_library {
    153 			name: "libfoo",
    154 			srcs: [
    155 				"foo.c",
    156 				"a.proto",
    157 			],
    158 			shared: {
    159 				srcs: [
    160 					"bar.c",
    161 				],
    162 			},
    163 		}`)
    164 
    165 		libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Rule("ld")
    166 		libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_static").Output("libfoo.a")
    167 
    168 		if len(libfooShared.Inputs) != 3 {
    169 			t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings())
    170 		}
    171 
    172 		if len(libfooStatic.Inputs) != 2 {
    173 			t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings())
    174 		}
    175 
    176 		if !reflect.DeepEqual(libfooShared.Inputs[0:2].Strings(), libfooStatic.Inputs.Strings()) {
    177 			t.Errorf("static objects not reused for shared library")
    178 		}
    179 
    180 		libfoo := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Module().(*Module)
    181 		if !inList("-DGOOGLE_PROTOBUF_NO_RTTI", libfoo.flags.CFlags) {
    182 			t.Errorf("missing protobuf cflags")
    183 		}
    184 	})
    185 }
    186