From 04d1189bc7deba0fb56f8c95af7983b434ce666e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barnab=C3=A1s=20P=C5=91cze?= Date: Fri, 26 Jun 2026 13:58:58 +0200 Subject: [PATCH] cmake/interpreter: propagate object library pie flag If the target has no ordinary or generated sources, then propagate the "pie" flag from the object libraries. Otherwise it will not use position independent code, making it impossible to link into shared libraries. Fixes #10764 --- mesonbuild/cmake/interpreter.py | 3 +++ test cases/cmake/29 object library pic/meson.build | 7 +++++++ test cases/cmake/29 object library pic/slib.c | 3 +++ .../subprojects/cmTest/CMakeLists.txt | 9 +++++++++ .../cmake/29 object library pic/subprojects/cmTest/x.c | 1 + 5 files changed, 23 insertions(+) create mode 100644 test cases/cmake/29 object library pic/meson.build create mode 100644 test cases/cmake/29 object library pic/slib.c create mode 100644 test cases/cmake/29 object library pic/subprojects/cmTest/CMakeLists.txt create mode 100644 test cases/cmake/29 object library pic/subprojects/cmTest/x.c diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py index 291157f2f827..4866b30a5c49 100644 --- a/mesonbuild/cmake/interpreter.py +++ b/mesonbuild/cmake/interpreter.py @@ -534,6 +534,9 @@ def process_object_libs(self, obj_target_list: T.List['ConverterTarget'], linker # Filter out object files from the sources self.generated = [x for x in self.generated if not any(x.name.endswith('.' + y) for y in obj_suffixes)] + if not self.sources and not self.generated and self.object_libs: + self.pie |= all(x.pie for x in self.object_libs) + def _append_objlib_sources(self, tgt: 'ConverterTarget') -> None: self.includes += tgt.includes self.sources += tgt.sources diff --git a/test cases/cmake/29 object library pic/meson.build b/test cases/cmake/29 object library pic/meson.build new file mode 100644 index 000000000000..217507f86c98 --- /dev/null +++ b/test cases/cmake/29 object library pic/meson.build @@ -0,0 +1,7 @@ +project('29 object library pic', 'c') + +cm = import('cmake') +sub_pro = cm.subproject('cmTest') +sub_dep = sub_pro.dependency('cmTestLib') + +shared_library('slib', 'slib.c', dependencies: sub_dep) diff --git a/test cases/cmake/29 object library pic/slib.c b/test cases/cmake/29 object library pic/slib.c new file mode 100644 index 000000000000..de8d06c9965a --- /dev/null +++ b/test cases/cmake/29 object library pic/slib.c @@ -0,0 +1,3 @@ +extern void f(void); + +void g(void) { f(); } diff --git a/test cases/cmake/29 object library pic/subprojects/cmTest/CMakeLists.txt b/test cases/cmake/29 object library pic/subprojects/cmTest/CMakeLists.txt new file mode 100644 index 000000000000..f8c668109408 --- /dev/null +++ b/test cases/cmake/29 object library pic/subprojects/cmTest/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION ${CMAKE_VERSION}) + +project(cmTest C) + +add_library(cmTestLib_objs OBJECT "x.c") +set_target_properties(cmTestLib_objs PROPERTIES POSITION_INDEPENDENT_CODE TRUE) + +add_library(cmTestLib STATIC $) +set_target_properties(cmTestLib PROPERTIES POSITION_INDEPENDENT_CODE TRUE) diff --git a/test cases/cmake/29 object library pic/subprojects/cmTest/x.c b/test cases/cmake/29 object library pic/subprojects/cmTest/x.c new file mode 100644 index 000000000000..bcafe0498410 --- /dev/null +++ b/test cases/cmake/29 object library pic/subprojects/cmTest/x.c @@ -0,0 +1 @@ +void f(void) { }