From 8928669a69f63311d9c6db59b3f7b3c83a85ca24 Mon Sep 17 00:00:00 2001 From: David Seifert <16636962+SoapGentoo@users.noreply.github.com> Date: Sat, 18 Nov 2023 01:08:41 -0800 Subject: [PATCH] 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 --- mesonbuild/backend/backends.py | 2 +- test cases/common/272 unity/meson.build | 13 +++++++++++++ test cases/common/272 unity/slib.c | 6 ++++++ test cases/common/272 unity/slib1.c | 3 +++ test cases/common/272 unity/slib2.c | 3 +++ test cases/common/272 unity/test.json | 5 +++++ 6 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 test cases/common/272 unity/meson.build create mode 100644 test cases/common/272 unity/slib.c create mode 100644 test cases/common/272 unity/slib1.c create mode 100644 test cases/common/272 unity/slib2.c create mode 100644 test cases/common/272 unity/test.json diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index b8b958883d67..2c24e4c314a7 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -920,7 +920,7 @@ def _determine_ext_objs(self, extobj: 'build.ExtractedObjects', proj_dir_to_buil 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 000000000000..9acb9b8fe6ff --- /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 000000000000..d7053366a47f --- /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 000000000000..35304eed65f1 --- /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 000000000000..5badf23bcb72 --- /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 000000000000..0a10fddb5989 --- /dev/null +++ b/test cases/common/272 unity/test.json @@ -0,0 +1,5 @@ +{ + "installed": [ + {"type": "file", "file": "usr/lib/libslib_installed.a"} + ] +}