• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
15package cc
16
17import (
18	"reflect"
19	"testing"
20)
21
22func 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