diff options
author | Craig Scott <craig.scott@crascit.com> | 2020-10-04 21:05:49 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2020-10-04 21:05:57 (GMT) |
commit | 1291dd310329f5997b2e08d238cb691d34ff4866 (patch) | |
tree | 0e5bc2fec0d5db14260c733de132a2bb68d894ce | |
parent | a771e2146a6954fd1ef6739fd4f73ef108cfe2bc (diff) | |
parent | ce2dee9e5bae37c8117087bb83add075c3c123b4 (diff) | |
download | CMake-1291dd310329f5997b2e08d238cb691d34ff4866.zip CMake-1291dd310329f5997b2e08d238cb691d34ff4866.tar.gz CMake-1291dd310329f5997b2e08d238cb691d34ff4866.tar.bz2 |
Merge topic 'xcode-refactor-framework-linking'
ce2dee9e5b Xcode: Don't add framework as -framework argument in linker info list
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !5216
7 files changed, 78 insertions, 17 deletions
diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index 4a331fb..201a9d9 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -1293,11 +1293,17 @@ void cmComputeLinkInformation::AddFrameworkItem(std::string const& item) // add runtime information this->AddLibraryRuntimeInfo(full_fw); - // Add the item using the -framework option. - this->Items.emplace_back(std::string("-framework"), false); - cmOutputConverter converter(this->Makefile->GetStateSnapshot()); - fw = converter.EscapeForShell(fw); - this->Items.emplace_back(fw, false); + if (this->GlobalGenerator->IsXcode()) { + // Add framework path - it will be handled by Xcode after it's added to + // "Link Binary With Libraries" build phase + this->Items.emplace_back(item, true); + } else { + // Add the item using the -framework option. + this->Items.emplace_back(std::string("-framework"), false); + cmOutputConverter converter(this->Makefile->GetStateSnapshot()); + fw = converter.EscapeForShell(fw); + this->Items.emplace_back(fw, false); + } } void cmComputeLinkInformation::AddDirectoryItem(std::string const& item) diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index acae2b6..f1a1ce6 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -3579,8 +3579,16 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target) for (auto const& libItem : configItemMap[configName]) { auto const& libName = *libItem; if (libName.IsPath) { - libPaths.Add(this->XCodeEscapePath(libName.Value.Value)); const auto libPath = GetLibraryOrFrameworkPath(libName.Value.Value); + if (cmSystemTools::StringEndsWith(libPath.c_str(), ".framework")) { + const auto fwName = + cmSystemTools::GetFilenameWithoutExtension(libPath); + const auto fwDir = cmSystemTools::GetParentDirectory(libPath); + libPaths.Add("-F " + this->XCodeEscapePath(fwDir)); + libPaths.Add("-framework " + fwName); + } else { + libPaths.Add(this->XCodeEscapePath(libName.Value.Value)); + } if ((!libName.Target || libName.Target->IsImported()) && IsLinkPhaseLibraryExtension(libPath)) { // Create file reference for embedding diff --git a/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase.cmake b/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase.cmake index 22a181f..7abc58b 100644 --- a/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase.cmake +++ b/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase.cmake @@ -9,16 +9,28 @@ int func2(); int func3(); int func4(); int func5(); +int func6(); +int func7(); +]]) +set(prototypes_objc [[ +#import <CoreFoundation/CoreFoundation.h> ]]) set(impl [[ { printf("%p %p\n", compress, res_close); - return func1() + func2() + func3() + func4() + func5(); + return func1() + func2() + func3() + func4() + func5() + func6() + func7(); +} +]]) +set(impl_objc [[ +{ + CFStringRef cfStr = CFSTR("This is a string"); + printf("%p %p %ld\n", compress, res_close, (long)CFStringGetLength(cfStr)); + return func1() + func2() + func3() + func4() + func5() + func6() + func7(); } ]]) -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/mainOuter.c - "${prototypes}\nint main(int argc, char** argv) ${impl}" +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/mainOuter.m + "${prototypes}\n${prototypes_objc}\nint main(int argc, char** argv) ${impl_objc}" ) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/funcOuter.c @@ -31,7 +43,28 @@ foreach(i RANGE 1 5) ) endforeach() -add_executable(app1 mainOuter.c) +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/CMakeLists.txt +[[ +cmake_minimum_required(VERSION 3.18) +project(ExternalFrameworks) +add_library(staticFrameworkExt STATIC func6.c) +add_library(sharedFrameworkExt SHARED func7.c) +set_target_properties(staticFrameworkExt PROPERTIES FRAMEWORK TRUE) +set_target_properties(sharedFrameworkExt PROPERTIES FRAMEWORK TRUE) +]] +) + +foreach(i RANGE 6 7) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/func${i}.c + "int func${i}() { return 32 + ${i}; }\n" + ) +endforeach() + +add_custom_target(prebuildDependencies ALL + COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks -B ${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build -G Xcode + COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build --target staticFrameworkExt sharedFrameworkExt --config Debug +) +add_executable(app1 mainOuter.m) add_library(static1 STATIC funcOuter.c) add_library(shared1 SHARED funcOuter.c) add_library(module1 MODULE funcOuter.c) @@ -40,6 +73,13 @@ add_library(staticFramework1 STATIC funcOuter.c) add_library(sharedFramework1 SHARED funcOuter.c) set_target_properties(staticFramework1 PROPERTIES FRAMEWORK TRUE) set_target_properties(sharedFramework1 PROPERTIES FRAMEWORK TRUE) +add_dependencies(app1 prebuildDependencies) +add_dependencies(static1 prebuildDependencies) +add_dependencies(shared1 prebuildDependencies) +add_dependencies(module1 prebuildDependencies) +add_dependencies(obj1 prebuildDependencies) +add_dependencies(staticFramework1 prebuildDependencies) +add_dependencies(sharedFramework1 prebuildDependencies) add_library(static2 STATIC func1.c) add_library(shared2 SHARED func2.c) @@ -49,9 +89,10 @@ add_library(sharedFramework2 SHARED func5.c) set_target_properties(staticFramework2 PROPERTIES FRAMEWORK TRUE) set_target_properties(sharedFramework2 PROPERTIES FRAMEWORK TRUE) -# Pick a couple of libraries that are always present in the Xcode SDK +# Pick some external libraries that are always present in the Xcode SDK find_library(libz z REQUIRED) find_library(libresolv resolv REQUIRED) +find_library(CoreFoundation CoreFoundation REQUIRED) add_library(imported2 UNKNOWN IMPORTED) set_target_properties(imported2 PROPERTIES IMPORTED_LOCATION ${libz}) @@ -59,6 +100,7 @@ set_target_properties(imported2 PROPERTIES IMPORTED_LOCATION ${libz}) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/foundLibs.cmake " set(libz \"${libz}\") set(libresolv \"${libresolv}\") +set(CoreFoundation \"${CoreFoundation}\") ") set(mainTargets @@ -78,6 +120,9 @@ set(linkToThings sharedFramework2 imported2 ${libresolv} + ${CoreFoundation} + "${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build/Debug/sharedFrameworkExt.framework" + "${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build/Debug/staticFrameworkExt.framework" ) foreach(mainTarget IN LISTS mainTargets) diff --git a/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_BUILT_ONLY-check.cmake b/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_BUILT_ONLY-check.cmake index 2b7edf5..d07a25b 100644 --- a/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_BUILT_ONLY-check.cmake +++ b/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_BUILT_ONLY-check.cmake @@ -6,7 +6,7 @@ include(${RunCMake_TEST_BINARY_DIR}/foundLibs.cmake) foreach(mainTarget IN ITEMS app1 shared1 module1 sharedFramework1) checkFlags(OTHER_LDFLAGS ${mainTarget} - "obj2;${libz};${libresolv}" + "obj2;${libz};${libresolv};CoreFoundation;sharedFrameworkExt;staticFrameworkExt" "static2;shared2;staticFramework2;sharedFramework2" ) endforeach() @@ -14,6 +14,6 @@ endforeach() foreach(mainTarget IN ITEMS static1 staticFramework1) checkFlags(OTHER_LIBTOOLFLAGS ${mainTarget} "obj2" - "static2;shared2;staticFramework2;sharedFramework2;${libz};${libresolv}" + "static2;shared2;staticFramework2;sharedFramework2;${libz};${libresolv};CoreFoundation;sharedFrameworkExt;staticFrameworkExt" ) endforeach() diff --git a/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_Funcs.cmake b/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_Funcs.cmake index 601e52f..e72bf4d 100644 --- a/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_Funcs.cmake +++ b/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_Funcs.cmake @@ -1,3 +1,5 @@ +cmake_minimum_required(VERSION 3.18...3.19) + macro(returnOnError errorMsg) if(NOT "${errorMsg}" STREQUAL "") set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}\n${errorMsg}" PARENT_SCOPE) diff --git a/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_KNOWN_LOCATION-check.cmake b/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_KNOWN_LOCATION-check.cmake index b0d2f7f..e1484e7 100644 --- a/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_KNOWN_LOCATION-check.cmake +++ b/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_KNOWN_LOCATION-check.cmake @@ -7,13 +7,13 @@ include(${RunCMake_TEST_BINARY_DIR}/foundLibs.cmake) foreach(mainTarget IN ITEMS app1 shared1 module1 sharedFramework1) checkFlags(OTHER_LDFLAGS ${mainTarget} "obj2" - "static2;shared2;staticFramework2;sharedFramework2;${libz};${libresolv}" + "static2;shared2;staticFramework2;sharedFramework2;${libz};${libresolv};CoreFoundation;sharedFrameworkExt;staticFrameworkExt" ) endforeach() foreach(mainTarget IN ITEMS static1 staticFramework1) checkFlags(OTHER_LIBTOOLFLAGS ${mainTarget} "obj2" - "static2;shared2;staticFramework2;sharedFramework2;${libz};${libresolv}" + "static2;shared2;staticFramework2;sharedFramework2;${libz};${libresolv};CoreFoundation;sharedFrameworkExt;staticFrameworkExt" ) endforeach() diff --git a/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_NONE-check.cmake b/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_NONE-check.cmake index 3074881..2601676 100644 --- a/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_NONE-check.cmake +++ b/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase_NONE-check.cmake @@ -6,7 +6,7 @@ include(${RunCMake_TEST_BINARY_DIR}/foundLibs.cmake) foreach(mainTarget IN ITEMS app1 shared1 module1 sharedFramework1) checkFlags(OTHER_LDFLAGS ${mainTarget} - "static2;shared2;staticFramework2;sharedFramework2;obj2;${libz};${libresolv}" + "static2;shared2;staticFramework2;sharedFramework2;obj2;${libz};${libresolv};CoreFoundation;sharedFrameworkExt;staticFrameworkExt" "" ) endforeach() @@ -14,6 +14,6 @@ endforeach() foreach(mainTarget IN ITEMS static1 staticFramework1) checkFlags(OTHER_LIBTOOLFLAGS ${mainTarget} "obj2" - "static2;shared2;staticFramework2;sharedFramework2;${libz};${libresolv}" + "static2;shared2;staticFramework2;sharedFramework2;${libz};${libresolv};CoreFoundation;sharedFrameworkExt;staticFrameworkExt" ) endforeach() |