Fix unity builds (#12452)
* unity builds: correct integer ceiling division
* edge case failure with unity builds:
- static archive bar that gets installed, that links with another static
archive foo that does not get installed
- the number of files in static archive foo is divisible by unity_size
would yield an error with ninja:
ninja: error: 'subprojects/foo/src/libfoo.a.p/meson-generated_foo-unity1.cpp.o', needed by 'src/libbar.a', missing and no known rule to make it
* unity builds: test for build failure when #files is divisible by unity_size
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index b8b9588..2c24e4c 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -920,7 +920,7 @@
if comp.language in LANGS_CANT_UNITY:
sources += srcs
continue
- for i in range(len(srcs) // unity_size + 1):
+ for i in range((len(srcs) + unity_size - 1) // unity_size):
_src = self.get_unity_source_file(extobj.target,
comp.get_default_suffix(), i)
sources.append(_src)
diff --git a/test cases/common/272 unity/meson.build b/test cases/common/272 unity/meson.build
new file mode 100644
index 0000000..9acb9b8
--- /dev/null
+++ b/test cases/common/272 unity/meson.build
@@ -0,0 +1,13 @@
+project('unity', 'c',
+ default_options : [
+ 'unity_size=2'])
+
+if get_option('unity') != 'on'
+ error('MESON_SKIP_TEST: unity builds not enabled')
+endif
+
+slib_notinstalled = static_library('slib_notinstalled',
+ # test depends on the number of files being divisible by unity_size
+ ['slib1.c', 'slib2.c'])
+
+slib_installed = static_library('slib_installed', ['slib1.c', 'slib2.c'], link_with : slib_notinstalled, install : true)
diff --git a/test cases/common/272 unity/slib.c b/test cases/common/272 unity/slib.c
new file mode 100644
index 0000000..d705336
--- /dev/null
+++ b/test cases/common/272 unity/slib.c
@@ -0,0 +1,6 @@
+int func1(void);
+int func2(void);
+
+int static_lib_func(void) {
+ return func1() + func2();
+}
diff --git a/test cases/common/272 unity/slib1.c b/test cases/common/272 unity/slib1.c
new file mode 100644
index 0000000..35304ee
--- /dev/null
+++ b/test cases/common/272 unity/slib1.c
@@ -0,0 +1,3 @@
+int func1(void) {
+ return 1;
+}
diff --git a/test cases/common/272 unity/slib2.c b/test cases/common/272 unity/slib2.c
new file mode 100644
index 0000000..5badf23
--- /dev/null
+++ b/test cases/common/272 unity/slib2.c
@@ -0,0 +1,3 @@
+int func2(void) {
+ return 2;
+}
diff --git a/test cases/common/272 unity/test.json b/test cases/common/272 unity/test.json
new file mode 100644
index 0000000..0a10fdd
--- /dev/null
+++ b/test cases/common/272 unity/test.json
@@ -0,0 +1,5 @@
+{
+ "installed": [
+ {"type": "file", "file": "usr/lib/libslib_installed.a"}
+ ]
+}