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

     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  }