Browse Source

Merge topic 'OBJECTLibrariesInCodeBlocks'

38d4c1e CodeBlocks: improve support for OBJECT libraries
d2ed3c7 -fix #13081: support OBJECT libraries in CodeBlocks/QtCreator projects
David Cole 13 years ago
parent
commit
81e696c99d
2 changed files with 43 additions and 2 deletions
  1. 41 2
      Source/cmExtraCodeBlocksGenerator.cxx
  2. 2 0
      Source/cmExtraCodeBlocksGenerator.h

+ 41 - 2
Source/cmExtraCodeBlocksGenerator.cxx

@@ -386,6 +386,7 @@ void cmExtraCodeBlocksGenerator
         case cmTarget::STATIC_LIBRARY:
         case cmTarget::SHARED_LIBRARY:
         case cmTarget::MODULE_LIBRARY:
+        case cmTarget::OBJECT_LIBRARY:
           {
           this->AppendTarget(fout, ti->first.c_str(), &ti->second,
                              make.c_str(), makefile, compiler.c_str());
@@ -423,6 +424,7 @@ void cmExtraCodeBlocksGenerator
         case cmTarget::STATIC_LIBRARY:
         case cmTarget::SHARED_LIBRARY:
         case cmTarget::MODULE_LIBRARY:
+        case cmTarget::OBJECT_LIBRARY:
         case cmTarget::UTILITY: // can have sources since 2.6.3
           {
           const std::vector<cmSourceFile*>&sources=ti->second.GetSourceFiles();
@@ -535,6 +537,31 @@ void cmExtraCodeBlocksGenerator
 }
 
 
+// Write a dummy file for OBJECT libraries, so C::B can reference some file
+std::string cmExtraCodeBlocksGenerator::CreateDummyTargetFile(
+                                        cmMakefile* mf, cmTarget* target) const
+{
+  // this file doesn't seem to be used by C::B in custom makefile mode,
+  // but we generate a unique file for each OBJECT library so in case
+  // C::B uses it in some way, the targets don't interfere with each other.
+  std::string filename = mf->GetCurrentOutputDirectory();
+  filename += "/";
+  filename += mf->GetLocalGenerator()->GetTargetDirectory(*target);
+  filename += "/";
+  filename += target->GetName();
+  filename += ".objlib";
+  cmGeneratedFileStream fout(filename.c_str());
+  if(fout)
+    {
+    fout << "# This is a dummy file for the OBJECT library "
+         << target->GetName()
+         << " for the CMake CodeBlocks project generator.\n"
+         << "# Don't edit, this file will be overwritten.\n";
+    }
+  return filename;
+}
+
+
 // Generate the xml code for one target.
 void cmExtraCodeBlocksGenerator::AppendTarget(cmGeneratedFileStream& fout,
                                               const char* targetName,
@@ -573,7 +600,18 @@ void cmExtraCodeBlocksGenerator::AppendTarget(cmGeneratedFileStream& fout,
       }
 
     const char* buildType = makefile->GetDefinition("CMAKE_BUILD_TYPE");
-    fout<<"         <Option output=\"" << target->GetLocation(buildType)
+    std::string location;
+    if ( target->GetType()==cmTarget::OBJECT_LIBRARY)
+      {
+      location = this->CreateDummyTargetFile(const_cast<cmMakefile*>(makefile),
+                                             target);
+      }
+    else
+      {
+      location = target->GetLocation(buildType);
+      }
+
+    fout<<"         <Option output=\"" << location
                             << "\" prefix_auto=\"0\" extension_auto=\"0\" />\n"
           "         <Option working_dir=\"" << workingDir << "\" />\n"
           "         <Option object_output=\"./\" />\n"
@@ -731,7 +769,8 @@ int cmExtraCodeBlocksGenerator::GetCBTargetType(cmTarget* target)
       return 1;
       }
     }
-  else if ( target->GetType()==cmTarget::STATIC_LIBRARY)
+  else if (( target->GetType()==cmTarget::STATIC_LIBRARY)
+        || (target->GetType()==cmTarget::OBJECT_LIBRARY))
     {
     return 2;
     }

+ 2 - 0
Source/cmExtraCodeBlocksGenerator.h

@@ -44,6 +44,8 @@ private:
 
   void CreateNewProjectFile(const std::vector<cmLocalGenerator*>& lgs,
                                 const std::string& filename);
+  std::string CreateDummyTargetFile(cmMakefile* mf, cmTarget* target) const;
+
   std::string GetCBCompilerId(const cmMakefile* mf);
   int GetCBTargetType(cmTarget* target);
   std::string BuildMakeCommand(const std::string& make, const char* makefile,