Browse Source

Use linked frameworks as a source of include directories.

Stephen Kelly 12 years ago
parent
commit
f5ca872e8b

+ 28 - 0
Source/cmTarget.cxx

@@ -3344,6 +3344,34 @@ std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config)
                         new cmTargetInternals::TargetPropertyEntry(cge,
                                                               it->Value));
       }
+
+    if(this->Makefile->IsOn("APPLE"))
+      {
+      LinkImplementation const* impl = this->GetLinkImplementation(config,
+                                                                   this);
+      for(std::vector<std::string>::const_iterator
+          it = impl->Libraries.begin();
+          it != impl->Libraries.end(); ++it)
+        {
+        std::string libDir = cmSystemTools::CollapseFullPath(it->c_str());
+
+        static cmsys::RegularExpression
+          frameworkCheck("(.*\\.framework)(/Versions/[^/]+)?/[^/]+$");
+        if(!frameworkCheck.find(libDir))
+          {
+          continue;
+          }
+
+        libDir = frameworkCheck.match(1);
+
+        cmGeneratorExpression ge(lfbt);
+        cmsys::auto_ptr<cmCompiledGeneratorExpression> cge =
+                  ge.Parse(libDir.c_str());
+        this->Internal
+                ->CachedLinkInterfaceIncludeDirectoriesEntries[configString]
+                .push_back(new cmTargetInternals::TargetPropertyEntry(cge));
+        }
+      }
     }
 
   processIncludeDirectories(this,

+ 5 - 0
Source/cmTargetLinkLibrariesCommand.h

@@ -109,6 +109,11 @@ public:
       " INTERFACE_POSITION_INDEPENDENT_CODE: Sets POSITION_INDEPENDENT_CODE\n"
       "   or checked for consistency with existing value\n"
       "\n"
+      "If an <item> is a library in a Mac OX framework, the Headers "
+      "directory of the framework will also be processed as a \"usage "
+      "requirement\".  This has the same effect as passing the framework "
+      "directory as an include directory."
+      "\n"
       "  target_link_libraries(<target> LINK_INTERFACE_LIBRARIES\n"
       "                        [[debug|optimized|general] <lib>] ...)\n"
       "The LINK_INTERFACE_LIBRARIES mode appends the libraries "

+ 6 - 0
Tests/ExportImport/Export/CMakeLists.txt

@@ -312,6 +312,12 @@ install(
   FRAMEWORK DESTINATION Frameworks
   BUNDLE DESTINATION Applications
   )
+if (APPLE)
+  file(COPY testLib4.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/testLib4.framework/Headers)
+  file(COPY testLib4.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Debug/testLib4.framework/Headers)
+  file(COPY testLib4.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Release/testLib4.framework/Headers)
+  install(FILES testLib4.h DESTINATION Frameworks/testLib4.framework/Headers)
+endif()
 install(
   TARGETS
   testExe2libImp testLib3Imp

+ 2 - 0
Tests/ExportImport/Export/testLib4.h

@@ -0,0 +1,2 @@
+
+#define TESTLIB4_H

+ 4 - 0
Tests/ExportImport/Import/A/CMakeLists.txt

@@ -210,6 +210,10 @@ if (run_pic_test)
   target_compile_definitions(deps_shared_iface PRIVATE CHECK_PIC_WORKS)
 endif()
 
+if(APPLE)
+  add_subdirectory(framework_interface)
+endif()
+
 #-----------------------------------------------------------------------------
 # Test that targets imported from the build tree have their dependencies
 # evaluated correctly. The above already tests the same for the install tree.

+ 9 - 0
Tests/ExportImport/Import/A/framework_interface/CMakeLists.txt

@@ -0,0 +1,9 @@
+
+add_library(exp_framework_test framework_test.cpp)
+get_target_property(exp_loc exp_testLib4 LOCATION)
+target_link_libraries(exp_framework_test ${exp_loc})
+
+
+add_library(bld_framework_test framework_test.cpp)
+get_target_property(bld_loc bld_testLib4 LOCATION)
+target_link_libraries(bld_framework_test ${bld_loc})

+ 6 - 0
Tests/ExportImport/Import/A/framework_interface/framework_test.cpp

@@ -0,0 +1,6 @@
+
+#include <testLib4/testLib4.h>
+
+#ifndef TESTLIB4_H
+#error Expected define TESTLIB4_H
+#endif