Browse Source

ENH: Added target property CLEAN_DIRECT_OUTPUT to not clean all forms of a library name so that static and shared libraries of the same name can coexist in a single build directory.

Brad King 19 years ago
parent
commit
441d208bb3

+ 83 - 49
Source/cmMakefileLibraryTargetGenerator.cxx

@@ -305,59 +305,93 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
   // Construct a list of files associated with this library that may
   // need to be cleaned.
   std::vector<std::string> libCleanFiles;
-  {
-  std::string cleanStaticName;
-  std::string cleanSharedName;
-  std::string cleanSharedSOName;
-  std::string cleanSharedRealName;
-  std::string cleanImportName;
-  this->Target->GetLibraryCleanNames(
-    cleanStaticName,
-    cleanSharedName,
-    cleanSharedSOName,
-    cleanSharedRealName,
-    cleanImportName,
-    this->LocalGenerator->ConfigurationName.c_str());
-  std::string cleanFullStaticName = outpath + cleanStaticName;
-  std::string cleanFullSharedName = outpath + cleanSharedName;
-  std::string cleanFullSharedSOName = outpath + cleanSharedSOName;
-  std::string cleanFullSharedRealName = outpath + cleanSharedRealName;
-  std::string cleanFullImportName = outpath + cleanImportName;
-  libCleanFiles.push_back
-    (this->Convert(cleanFullStaticName.c_str(),cmLocalGenerator::START_OUTPUT,
-                   cmLocalGenerator::UNCHANGED));
-  if(cleanSharedRealName != cleanStaticName)
-    {
-    libCleanFiles.push_back(this->Convert(cleanFullSharedRealName.c_str(),
-                                          cmLocalGenerator::START_OUTPUT,
-                                          cmLocalGenerator::UNCHANGED));
-    }
-  if(cleanSharedSOName != cleanStaticName &&
-     cleanSharedSOName != cleanSharedRealName)
-    {
-    libCleanFiles.push_back(this->Convert(cleanFullSharedSOName.c_str(),
-                                          cmLocalGenerator::START_OUTPUT,
-                                          cmLocalGenerator::UNCHANGED));
-    }
-  if(cleanSharedName != cleanStaticName &&
-     cleanSharedName != cleanSharedSOName &&
-     cleanSharedName != cleanSharedRealName)
+  if(this->Target->GetPropertyAsBool("CLEAN_DIRECT_OUTPUT"))
     {
-    libCleanFiles.push_back(this->Convert(cleanFullSharedName.c_str(),
-                                          cmLocalGenerator::START_OUTPUT,
-                                          cmLocalGenerator::UNCHANGED));
+    // The user has requested that only the files directly built
+    // by this target be cleaned instead of all possible names.
+    libCleanFiles.push_back(this->Convert(targetFullPath.c_str(),
+          cmLocalGenerator::START_OUTPUT,
+          cmLocalGenerator::UNCHANGED));
+    if(targetNameReal != targetName)
+      {
+      libCleanFiles.push_back(this->Convert(targetFullPathReal.c_str(),
+          cmLocalGenerator::START_OUTPUT,
+          cmLocalGenerator::UNCHANGED));
+      }
+    if(targetNameSO != targetName &&
+       targetNameSO != targetNameReal)
+      {
+      libCleanFiles.push_back(this->Convert(targetFullPathSO.c_str(),
+          cmLocalGenerator::START_OUTPUT,
+          cmLocalGenerator::UNCHANGED));
+      }
+    if(!targetNameImport.empty() &&
+       targetNameImport != targetName &&
+       targetNameImport != targetNameReal &&
+       targetNameImport != targetNameSO)
+      {
+      libCleanFiles.push_back(this->Convert(targetFullPathImport.c_str(),
+          cmLocalGenerator::START_OUTPUT,
+          cmLocalGenerator::UNCHANGED));
+      }
     }
-  if(!cleanImportName.empty() &&
-     cleanImportName != cleanStaticName &&
-     cleanImportName != cleanSharedSOName &&
-     cleanImportName != cleanSharedRealName &&
-     cleanImportName != cleanSharedName)
+  else
     {
-    libCleanFiles.push_back(this->Convert(cleanFullImportName.c_str(),
-                                          cmLocalGenerator::START_OUTPUT,
-                                          cmLocalGenerator::UNCHANGED));
+    // This target may switch between static and shared based
+    // on a user option or the BUILD_SHARED_LIBS switch.  Clean
+    // all possible names.
+    std::string cleanStaticName;
+    std::string cleanSharedName;
+    std::string cleanSharedSOName;
+    std::string cleanSharedRealName;
+    std::string cleanImportName;
+    this->Target->GetLibraryCleanNames(
+      cleanStaticName,
+      cleanSharedName,
+      cleanSharedSOName,
+      cleanSharedRealName,
+      cleanImportName,
+      this->LocalGenerator->ConfigurationName.c_str());
+    std::string cleanFullStaticName = outpath + cleanStaticName;
+    std::string cleanFullSharedName = outpath + cleanSharedName;
+    std::string cleanFullSharedSOName = outpath + cleanSharedSOName;
+    std::string cleanFullSharedRealName = outpath + cleanSharedRealName;
+    std::string cleanFullImportName = outpath + cleanImportName;
+    libCleanFiles.push_back
+      (this->Convert(cleanFullStaticName.c_str(),cmLocalGenerator::START_OUTPUT,
+                     cmLocalGenerator::UNCHANGED));
+    if(cleanSharedRealName != cleanStaticName)
+      {
+      libCleanFiles.push_back(this->Convert(cleanFullSharedRealName.c_str(),
+          cmLocalGenerator::START_OUTPUT,
+          cmLocalGenerator::UNCHANGED));
+      }
+    if(cleanSharedSOName != cleanStaticName &&
+      cleanSharedSOName != cleanSharedRealName)
+      {
+      libCleanFiles.push_back(this->Convert(cleanFullSharedSOName.c_str(),
+          cmLocalGenerator::START_OUTPUT,
+          cmLocalGenerator::UNCHANGED));
+      }
+    if(cleanSharedName != cleanStaticName &&
+      cleanSharedName != cleanSharedSOName &&
+      cleanSharedName != cleanSharedRealName)
+      {
+      libCleanFiles.push_back(this->Convert(cleanFullSharedName.c_str(),
+          cmLocalGenerator::START_OUTPUT,
+          cmLocalGenerator::UNCHANGED));
+      }
+    if(!cleanImportName.empty() &&
+      cleanImportName != cleanStaticName &&
+      cleanImportName != cleanSharedSOName &&
+      cleanImportName != cleanSharedRealName &&
+      cleanImportName != cleanSharedName)
+      {
+      libCleanFiles.push_back(this->Convert(cleanFullImportName.c_str(),
+          cmLocalGenerator::START_OUTPUT,
+          cmLocalGenerator::UNCHANGED));
+      }
     }
-  }
   // Add a command to remove any existing files for this library.
   std::vector<std::string> commands1;
   this->LocalGenerator->AppendCleanCommand(commands1, libCleanFiles,

+ 7 - 0
Source/cmSetTargetPropertiesCommand.h

@@ -133,6 +133,13 @@ public:
         "the target in an IDE like visual studio.  VS_KEYWORD can be set "
         "to change the visual studio keyword, for example QT integration "
         "works better if this is set to Qt4VSv1.0.\n"
+        "When a library is built CMake by default generates code to remove "
+        "any existing library using all possible names.  This is needed "
+        "to support libraries that switch between STATIC and SHARED by "
+        "a user option.  However when using OUTPUT_NAME to build a static "
+        "and shared library of the same name using different logical target "
+        "names the two targets will remove each other's files.  This can be "
+        "prevented by setting the CLEAN_DIRECT_OUTPUT property to 1.\n"
         "The PRE_INSTALL_SCRIPT and POST_INSTALL_SCRIPT properties are the "
         "old way to specify CMake scripts to run before and after "
         "installing a target.  They are used only when the old "

+ 11 - 0
Source/cmTarget.cxx

@@ -1158,6 +1158,17 @@ void cmTarget::GetFullNameInternal(TargetType type,
     return;
     }
 
+  // Return an empty name for the import library if this platform
+  // does not support import libraries.
+  if(implib &&
+     !this->Makefile->GetDefinition("CMAKE_IMPORT_LIBRARY_SUFFIX"))
+    {
+    outPrefix = "";
+    outBase = "";
+    outSuffix = "";
+    return;
+    }
+
   // The implib option is only allowed for shared libraries.
   if(type != cmTarget::SHARED_LIBRARY)
     {