ソースを参照

Make sure INTERFACE properties work with OBJECT libraries.

Stephen Kelly 12 年 前
コミット
faa927e273

+ 8 - 0
Source/cmTarget.cxx

@@ -4781,6 +4781,10 @@ bool isLinkDependentProperty(cmTarget *tgt, const std::string &p,
 bool cmTarget::IsLinkInterfaceDependentBoolProperty(const std::string &p,
                                            const char *config)
 {
+  if (this->TargetTypeValue == OBJECT_LIBRARY)
+    {
+    return false;
+    }
   return (p == "POSITION_INDEPENDENT_CODE") ||
     isLinkDependentProperty(this, p, "COMPATIBLE_INTERFACE_BOOL",
                                  config);
@@ -4790,6 +4794,10 @@ bool cmTarget::IsLinkInterfaceDependentBoolProperty(const std::string &p,
 bool cmTarget::IsLinkInterfaceDependentStringProperty(const std::string &p,
                                     const char *config)
 {
+  if (this->TargetTypeValue == OBJECT_LIBRARY)
+    {
+    return false;
+    }
   return isLinkDependentProperty(this, p, "COMPATIBLE_INTERFACE_STRING",
                                  config);
 }

+ 5 - 1
Tests/ObjectLibrary/B/CMakeLists.txt

@@ -10,7 +10,11 @@ if(CMAKE_SHARED_LIBRARY_C_FLAGS AND NOT WATCOM)
   set(CMAKE_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS} ${CMAKE_C_FLAGS}")
 endif()
 
-add_definitions(-DB_DEF)
 add_library(B OBJECT b1.c b2.c)
+target_include_directories(B PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
+target_compile_definitions(B PUBLIC B_DEF)
+
 add_library(Bexport OBJECT b1${vs6}.c b2${vs6}.c)
 set_property(TARGET Bexport PROPERTY COMPILE_DEFINITIONS Bexport)
+target_include_directories(Bexport PRIVATE $<TARGET_PROPERTY:B,INTERFACE_INCLUDE_DIRECTORIES>)
+target_compile_definitions(Bexport PRIVATE $<TARGET_PROPERTY:B,INTERFACE_COMPILE_DEFINITIONS>)

+ 7 - 0
Tests/ObjectLibrary/B/b.h

@@ -4,8 +4,15 @@
 #ifndef B_DEF
 # error "B_DEF not defined"
 #endif
+
 #if defined(_WIN32) && defined(Bexport)
 # define EXPORT_B __declspec(dllexport)
 #else
 # define EXPORT_B
 #endif
+
+#if defined(_WIN32) && defined(SHARED_B)
+# define IMPORT_B __declspec(dllimport)
+#else
+# define IMPORT_B
+#endif

+ 8 - 0
Tests/ObjectLibrary/CMakeLists.txt

@@ -26,6 +26,9 @@ endif()
 
 # Test static library without its own sources.
 add_library(ABstatic STATIC ${dummy} $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>)
+target_include_directories(ABstatic PUBLIC $<TARGET_PROPERTY:B,INTERFACE_INCLUDE_DIRECTORIES>)
+target_compile_definitions(ABstatic PUBLIC $<TARGET_PROPERTY:B,INTERFACE_COMPILE_DEFINITIONS>)
+
 add_executable(UseABstatic mainAB.c)
 target_link_libraries(UseABstatic ABstatic)
 
@@ -41,12 +44,17 @@ endif()
 
 # Test shared library without its own sources.
 add_library(ABshared SHARED ${dummy} ${ABshared_SRCS})
+target_include_directories(ABshared PUBLIC $<TARGET_PROPERTY:B,INTERFACE_INCLUDE_DIRECTORIES>)
+target_compile_definitions(ABshared PUBLIC $<TARGET_PROPERTY:B,INTERFACE_COMPILE_DEFINITIONS>)
+
 add_executable(UseABshared mainAB.c)
 set_property(TARGET UseABshared PROPERTY COMPILE_DEFINITIONS SHARED_B ${NO_A})
 target_link_libraries(UseABshared ABshared)
 
 # Test executable without its own sources.
 add_library(ABmain OBJECT mainAB.c)
+target_include_directories(ABmain PUBLIC $<TARGET_PROPERTY:B,INTERFACE_INCLUDE_DIRECTORIES>)
+target_compile_definitions(ABmain PUBLIC $<TARGET_PROPERTY:B,INTERFACE_COMPILE_DEFINITIONS>)
 add_executable(UseABinternal ${dummy}
   $<TARGET_OBJECTS:ABmain> $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>
   )

+ 3 - 5
Tests/ObjectLibrary/mainAB.c

@@ -1,8 +1,6 @@
-#if defined(_WIN32) && defined(SHARED_B)
-# define IMPORT_B __declspec(dllimport)
-#else
-# define IMPORT_B
-#endif
+
+#include "b.h"
+
 extern IMPORT_B int b1(void);
 extern IMPORT_B int b2(void);
 #ifndef NO_A