aboutsummaryrefslogtreecommitdiff
path: root/test cases
diff options
context:
space:
mode:
authorNirbheek Chauhan <nirbheek@centricular.com>2017-06-02 05:25:17 +0530
committerNirbheek Chauhan <nirbheek@centricular.com>2017-06-02 07:10:55 +0530
commitae9b23832e3ef4064e5735265ce7008794ab0491 (patch)
tree6627edee2bf234862526816e73fb820dff09d94d /test cases
parentd2dc38abd45bf7427ef27043847cf9c89513bd1e (diff)
downloadmeson-ae9b23832e3ef4064e5735265ce7008794ab0491.zip
meson-ae9b23832e3ef4064e5735265ce7008794ab0491.tar.gz
meson-ae9b23832e3ef4064e5735265ce7008794ab0491.tar.bz2
ninja: De-dup libraries and use --start/end-group
Now we aggressively de-dup the list of libraries used while linking, and when linking with GNU ld we have to enclose all static libraries with -Wl,--start-group and -Wl,--end-group to force the linker to resolve all symbols recursively. This is needed when static libraries have circular deps on each other (see included test). The --start/end-group change is also needed for circular dependencies between static libraries because we no longer recursively list out all library dependencies. The size of build.ninja for GStreamer is now down to 6.1M from 20M, and yields a net reduction in configuration time of 10%
Diffstat (limited to 'test cases')
-rw-r--r--test cases/common/153 recursive linking/3rdorderdeps/meson.build9
-rw-r--r--test cases/common/153 recursive linking/circular/lib1.c6
-rw-r--r--test cases/common/153 recursive linking/circular/lib2.c6
-rw-r--r--test cases/common/153 recursive linking/circular/lib3.c6
-rw-r--r--test cases/common/153 recursive linking/circular/main.c28
-rw-r--r--test cases/common/153 recursive linking/circular/meson.build5
-rw-r--r--test cases/common/153 recursive linking/circular/prop1.c3
-rw-r--r--test cases/common/153 recursive linking/circular/prop2.c3
-rw-r--r--test cases/common/153 recursive linking/circular/prop3.c3
-rw-r--r--test cases/common/153 recursive linking/lib.h9
-rw-r--r--test cases/common/153 recursive linking/main.c6
-rw-r--r--test cases/common/153 recursive linking/meson.build4
-rw-r--r--test cases/common/153 recursive linking/stnodep/meson.build3
-rw-r--r--test cases/common/153 recursive linking/stshdep/meson.build3
-rw-r--r--test cases/common/153 recursive linking/ststdep/meson.build3
15 files changed, 87 insertions, 10 deletions
diff --git a/test cases/common/153 recursive linking/3rdorderdeps/meson.build b/test cases/common/153 recursive linking/3rdorderdeps/meson.build
index a2907f3..d4ef745 100644
--- a/test cases/common/153 recursive linking/3rdorderdeps/meson.build
+++ b/test cases/common/153 recursive linking/3rdorderdeps/meson.build
@@ -16,8 +16,10 @@ foreach dep2 : ['sh', 'st']
if libtype == 'sh'
target = 'shared_library'
+ build_args = []
elif libtype == 'st'
target = 'static_library'
+ build_args = ['-DMESON_STATIC_BUILD']
else
error('Unknown libtype "@0@"'.format(libtype))
endif
@@ -31,13 +33,16 @@ foreach dep2 : ['sh', 'st']
output : name + '-lib.c',
configuration : cdata)
dep = get_variable(dep1 + dep2 + 'dep')
- dep3_lib = build_target(name, lib_c, link_with : dep, target_type : target)
+ dep3_lib = build_target(name, lib_c, link_with : dep,
+ target_type : target,
+ c_args : build_args)
dep3_libs += [dep3_lib]
main_c = configure_file(input : 'main.c.in',
output : name + '-main.c',
configuration : cdata)
- dep3_bin = executable(name, main_c, link_with : dep3_lib)
+ dep3_bin = executable(name, main_c, link_with : dep3_lib,
+ c_args : build_args)
test(name + 'test', dep3_bin)
endforeach
endforeach
diff --git a/test cases/common/153 recursive linking/circular/lib1.c b/test cases/common/153 recursive linking/circular/lib1.c
new file mode 100644
index 0000000..38889cf
--- /dev/null
+++ b/test cases/common/153 recursive linking/circular/lib1.c
@@ -0,0 +1,6 @@
+int get_st2_prop (void);
+int get_st3_prop (void);
+
+int get_st1_value (void) {
+ return get_st2_prop () + get_st3_prop ();
+}
diff --git a/test cases/common/153 recursive linking/circular/lib2.c b/test cases/common/153 recursive linking/circular/lib2.c
new file mode 100644
index 0000000..31cd37c
--- /dev/null
+++ b/test cases/common/153 recursive linking/circular/lib2.c
@@ -0,0 +1,6 @@
+int get_st1_prop (void);
+int get_st3_prop (void);
+
+int get_st2_value (void) {
+ return get_st1_prop () + get_st3_prop ();
+}
diff --git a/test cases/common/153 recursive linking/circular/lib3.c b/test cases/common/153 recursive linking/circular/lib3.c
new file mode 100644
index 0000000..67d473a
--- /dev/null
+++ b/test cases/common/153 recursive linking/circular/lib3.c
@@ -0,0 +1,6 @@
+int get_st1_prop (void);
+int get_st2_prop (void);
+
+int get_st3_value (void) {
+ return get_st1_prop () + get_st2_prop ();
+}
diff --git a/test cases/common/153 recursive linking/circular/main.c b/test cases/common/153 recursive linking/circular/main.c
new file mode 100644
index 0000000..5f797a5
--- /dev/null
+++ b/test cases/common/153 recursive linking/circular/main.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+
+#include "../lib.h"
+
+int get_st1_value (void);
+int get_st2_value (void);
+int get_st3_value (void);
+
+int main(int argc, char *argv[]) {
+ int val;
+
+ val = get_st1_value ();
+ if (val != 5) {
+ printf("st1 value was %i instead of 5\n", val);
+ return -1;
+ }
+ val = get_st2_value ();
+ if (val != 4) {
+ printf("st2 value was %i instead of 4\n", val);
+ return -2;
+ }
+ val = get_st3_value ();
+ if (val != 3) {
+ printf("st3 value was %i instead of 3\n", val);
+ return -3;
+ }
+ return 0;
+}
diff --git a/test cases/common/153 recursive linking/circular/meson.build b/test cases/common/153 recursive linking/circular/meson.build
new file mode 100644
index 0000000..b7a70a8
--- /dev/null
+++ b/test cases/common/153 recursive linking/circular/meson.build
@@ -0,0 +1,5 @@
+st1 = static_library('st1', 'lib1.c', 'prop1.c')
+st2 = static_library('st2', 'lib2.c', 'prop2.c')
+st3 = static_library('st3', 'lib3.c', 'prop3.c')
+
+test('circular', executable('circular', 'main.c', link_with : [st1, st2, st3]))
diff --git a/test cases/common/153 recursive linking/circular/prop1.c b/test cases/common/153 recursive linking/circular/prop1.c
new file mode 100644
index 0000000..4e571f5
--- /dev/null
+++ b/test cases/common/153 recursive linking/circular/prop1.c
@@ -0,0 +1,3 @@
+int get_st1_prop (void) {
+ return 1;
+}
diff --git a/test cases/common/153 recursive linking/circular/prop2.c b/test cases/common/153 recursive linking/circular/prop2.c
new file mode 100644
index 0000000..ceabba0
--- /dev/null
+++ b/test cases/common/153 recursive linking/circular/prop2.c
@@ -0,0 +1,3 @@
+int get_st2_prop (void) {
+ return 2;
+}
diff --git a/test cases/common/153 recursive linking/circular/prop3.c b/test cases/common/153 recursive linking/circular/prop3.c
new file mode 100644
index 0000000..246206c
--- /dev/null
+++ b/test cases/common/153 recursive linking/circular/prop3.c
@@ -0,0 +1,3 @@
+int get_st3_prop (void) {
+ return 3;
+}
diff --git a/test cases/common/153 recursive linking/lib.h b/test cases/common/153 recursive linking/lib.h
index b6b75fa..b54bf36 100644
--- a/test cases/common/153 recursive linking/lib.h
+++ b/test cases/common/153 recursive linking/lib.h
@@ -1,6 +1,11 @@
#if defined _WIN32
- #define SYMBOL_IMPORT __declspec(dllimport)
- #define SYMBOL_EXPORT __declspec(dllexport)
+ #ifdef MESON_STATIC_BUILD
+ #define SYMBOL_EXPORT
+ #define SYMBOL_IMPORT
+ #else
+ #define SYMBOL_IMPORT __declspec(dllimport)
+ #define SYMBOL_EXPORT __declspec(dllexport)
+ #endif
#else
#define SYMBOL_IMPORT
#if defined __GNUC__
diff --git a/test cases/common/153 recursive linking/main.c b/test cases/common/153 recursive linking/main.c
index f1219a6..0851611 100644
--- a/test cases/common/153 recursive linking/main.c
+++ b/test cases/common/153 recursive linking/main.c
@@ -2,12 +2,12 @@
#include "lib.h"
-SYMBOL_IMPORT int get_stnodep_value (void);
+int get_stnodep_value (void);
+int get_stshdep_value (void);
+int get_ststdep_value (void);
SYMBOL_IMPORT int get_shnodep_value (void);
SYMBOL_IMPORT int get_shshdep_value (void);
SYMBOL_IMPORT int get_shstdep_value (void);
-SYMBOL_IMPORT int get_stshdep_value (void);
-SYMBOL_IMPORT int get_ststdep_value (void);
int main(int argc, char *argv[]) {
int val;
diff --git a/test cases/common/153 recursive linking/meson.build b/test cases/common/153 recursive linking/meson.build
index f17fc4a..4cecd57 100644
--- a/test cases/common/153 recursive linking/meson.build
+++ b/test cases/common/153 recursive linking/meson.build
@@ -20,3 +20,7 @@ test('alldeps',
# More combinations of static and shared libraries
subdir('3rdorderdeps')
+
+# Circular dependencies between static libraries
+# This requires the use of --start/end-group with GNU ld
+subdir('circular')
diff --git a/test cases/common/153 recursive linking/stnodep/meson.build b/test cases/common/153 recursive linking/stnodep/meson.build
index 0334f23..77f7129 100644
--- a/test cases/common/153 recursive linking/stnodep/meson.build
+++ b/test cases/common/153 recursive linking/stnodep/meson.build
@@ -1 +1,2 @@
-stnodep = static_library('stnodep', 'lib.c')
+stnodep = static_library('stnodep', 'lib.c',
+ c_args : '-DMESON_STATIC_BUILD')
diff --git a/test cases/common/153 recursive linking/stshdep/meson.build b/test cases/common/153 recursive linking/stshdep/meson.build
index 7e8e7c8..0967c1c 100644
--- a/test cases/common/153 recursive linking/stshdep/meson.build
+++ b/test cases/common/153 recursive linking/stshdep/meson.build
@@ -1 +1,2 @@
-stshdep = static_library('stshdep', 'lib.c', link_with : shnodep)
+stshdep = static_library('stshdep', 'lib.c', link_with : shnodep,
+ c_args : '-DMESON_STATIC_BUILD')
diff --git a/test cases/common/153 recursive linking/ststdep/meson.build b/test cases/common/153 recursive linking/ststdep/meson.build
index 92b0230..3602442 100644
--- a/test cases/common/153 recursive linking/ststdep/meson.build
+++ b/test cases/common/153 recursive linking/ststdep/meson.build
@@ -1 +1,2 @@
-ststdep = static_library('ststdep', 'lib.c', link_with : stnodep)
+ststdep = static_library('ststdep', 'lib.c', link_with : stnodep,
+ c_args : '-DMESON_STATIC_BUILD')