From 956281b864aa2db86d86086139f841562a395a01 Mon Sep 17 00:00:00 2001 From: Daniel Mensinger Date: Sat, 26 Dec 2020 11:25:44 +0100 Subject: cmake: fix -framework dependencies (fixes #8045) --- mesonbuild/cmake/interpreter.py | 14 ++++++++++++++ .../cmake/2 advanced/subprojects/cmMod/CMakeLists.txt | 10 ++++++++++ .../cmake/2 advanced/subprojects/cmMod/lib/cmMod.cpp | 9 +++++++++ 3 files changed, 33 insertions(+) diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py index 95ce35c..68ff600 100644 --- a/mesonbuild/cmake/interpreter.py +++ b/mesonbuild/cmake/interpreter.py @@ -502,6 +502,20 @@ class ConverterTarget: self.link_libraries = [x for x in self.link_libraries if x.lower() not in blacklist_link_libs] self.link_flags = [x for x in self.link_flags if check_flag(x)] + # Handle OSX frameworks + def handle_frameworks(flags: T.List[str]) -> T.List[str]: + res: T.List[str] = [] + for i in flags: + p = Path(i) + if not p.exists() or not p.name.endswith('.framework'): + res += [i] + continue + res += ['-framework', p.stem] + return res + + self.link_libraries = handle_frameworks(self.link_libraries) + self.link_flags = handle_frameworks(self.link_flags) + # Handle explicit CMake add_dependency() calls for i in self.depends_raw: dep_tgt = output_target_map.target(i) diff --git a/test cases/cmake/2 advanced/subprojects/cmMod/CMakeLists.txt b/test cases/cmake/2 advanced/subprojects/cmMod/CMakeLists.txt index 7fce89e..6258ca0 100644 --- a/test cases/cmake/2 advanced/subprojects/cmMod/CMakeLists.txt +++ b/test cases/cmake/2 advanced/subprojects/cmMod/CMakeLists.txt @@ -23,6 +23,16 @@ target_link_libraries(cmModLib ZLIB::ZLIB) target_link_libraries(cmModLibStatic ;ZLIB::ZLIB;) target_link_libraries(testEXE cmModLib) +if(APPLE) + find_library(COREFOUNDATION_FRAMEWORK "CoreFoundation") + if(NOT COREFOUNDATION_FRAMEWORK) + message(FATAL_ERROR "CoreFoundation framework not found") + endif() + + target_link_libraries(cmModLibStatic "${COREFOUNDATION_FRAMEWORK}") + target_compile_definitions(cmModLibStatic PUBLIC USE_FRAMEWORK) +endif() + target_compile_definitions(cmModLibStatic PUBLIC CMMODLIB_STATIC_DEFINE) install(TARGETS testEXE LIBRARY DESTINATION lib RUNTIME DESTINATION bin) diff --git a/test cases/cmake/2 advanced/subprojects/cmMod/lib/cmMod.cpp b/test cases/cmake/2 advanced/subprojects/cmMod/lib/cmMod.cpp index 027296e..eb41438 100644 --- a/test cases/cmake/2 advanced/subprojects/cmMod/lib/cmMod.cpp +++ b/test cases/cmake/2 advanced/subprojects/cmMod/lib/cmMod.cpp @@ -6,10 +6,19 @@ #error "Invalid value of CONFIG_OPT" #endif +#ifdef USE_FRAMEWORK +#include +#endif + using namespace std; cmModClass::cmModClass(string foo) { str = foo + " World " + zlibVersion(); + +#ifdef USE_FRAMEWORK + CFStringRef ref = CFStringCreateWithCString(NULL, str.c_str(), kCFStringEncodingUTF8); + CFRelease(ref); +#endif } string cmModClass::getStr() const { -- cgit v1.1