Parcourir la source

ENH: add IMPORT keyword to ADD_LIBRARY, dependencies are not yet working
STYLE: fix line lengths and indentation, use enum as argument to AddLibrary() instead of int (which was initialized from a bool in some cases)

Alex

Alexander Neundorf il y a 18 ans
Parent
commit
f7d4f27c2a

+ 34 - 19
Source/cmAddLibraryCommand.cxx

@@ -26,62 +26,62 @@ bool cmAddLibraryCommand::InitialPass(std::vector<std::string> const& args)
     }
     }
   // Library type defaults to value of BUILD_SHARED_LIBS, if it exists,
   // Library type defaults to value of BUILD_SHARED_LIBS, if it exists,
   // otherwise it defaults to static library.
   // otherwise it defaults to static library.
-  int shared = 
-    !cmSystemTools::IsOff(this->Makefile->GetDefinition("BUILD_SHARED_LIBS"));
+  cmTarget::TargetType type = cmTarget::SHARED_LIBRARY;
+  if (cmSystemTools::IsOff(this->Makefile->GetDefinition("BUILD_SHARED_LIBS")))
+    {
+    type = cmTarget::STATIC_LIBRARY;
+    }
   bool excludeFromAll = false;
   bool excludeFromAll = false;
+  bool importTarget = false;
   
   
   std::vector<std::string>::const_iterator s = args.begin();
   std::vector<std::string>::const_iterator s = args.begin();
 
 
-  this->LibName = *s;
+  std::string libName = *s;
 
 
   ++s;
   ++s;
   
   
   // If the second argument is "SHARED" or "STATIC", then it controls
   // If the second argument is "SHARED" or "STATIC", then it controls
   // the type of library.  Otherwise, it is treated as a source or
   // the type of library.  Otherwise, it is treated as a source or
-  // source list name. There man be two keyword arguments, check for them
+  // source list name. There may be two keyword arguments, check for them
   while ( s != args.end() )
   while ( s != args.end() )
     {
     {
     std::string libType = *s;
     std::string libType = *s;
     if(libType == "STATIC")
     if(libType == "STATIC")
       {
       {
       ++s;
       ++s;
-      shared = 0;
+      type = cmTarget::STATIC_LIBRARY;
       }
       }
     else if(libType == "SHARED")
     else if(libType == "SHARED")
       {
       {
       ++s;
       ++s;
-      shared = 1;
+      type = cmTarget::SHARED_LIBRARY;
       }
       }
     else if(libType == "MODULE")
     else if(libType == "MODULE")
       {
       {
       ++s;
       ++s;
-      shared = 2;
+      type = cmTarget::MODULE_LIBRARY;
       }
       }
     else if(*s == "EXCLUDE_FROM_ALL")
     else if(*s == "EXCLUDE_FROM_ALL")
       {
       {
       ++s;
       ++s;
       excludeFromAll = true;
       excludeFromAll = true;
       }
       }
+    else if(*s == "IMPORT")
+      {
+      ++s;
+      importTarget = true;
+      }
     else
     else
       {
       {
       break;
       break;
       }
       }
     }
     }
 
 
-  if (s == args.end())
-    {
-    std::string msg = "You have called ADD_LIBRARY for library ";
-    msg += args[0];
-    msg += " without any source files. This typically indicates a problem ";
-    msg += "with your CMakeLists.txt file";
-    cmSystemTools::Message(msg.c_str() ,"Warning");
-    }
-
   /* ideally we should check whether for the linker language of the target 
   /* ideally we should check whether for the linker language of the target 
     CMAKE_${LANG}_CREATE_SHARED_LIBRARY is defined and if not default to
     CMAKE_${LANG}_CREATE_SHARED_LIBRARY is defined and if not default to
     STATIC. But at this point we know only the name of the target, but not 
     STATIC. But at this point we know only the name of the target, but not 
     yet its linker language. */
     yet its linker language. */
-  if ((shared != 0) && 
+  if ((type != cmTarget::STATIC_LIBRARY) && 
        (this->Makefile->IsOn("CMAKE_TARGET_SUPPORTS_ONLY_STATIC_LIBS")))
        (this->Makefile->IsOn("CMAKE_TARGET_SUPPORTS_ONLY_STATIC_LIBS")))
     {
     {
     std::string msg = "ADD_LIBRARY for library ";
     std::string msg = "ADD_LIBRARY for library ";
@@ -90,7 +90,22 @@ bool cmAddLibraryCommand::InitialPass(std::vector<std::string> const& args)
         "platform supports only STATIC libraries. Building it STATIC instead. "
         "platform supports only STATIC libraries. Building it STATIC instead. "
         "This may lead to problems.";
         "This may lead to problems.";
     cmSystemTools::Message(msg.c_str() ,"Warning");
     cmSystemTools::Message(msg.c_str() ,"Warning");
-    shared = 0;
+    type = cmTarget::STATIC_LIBRARY;
+    }
+
+  if (importTarget)
+    {
+    this->Makefile->AddNewTarget(type, libName.c_str(), true);
+    return true;
+    }
+
+  if (s == args.end())
+    {
+    std::string msg = "You have called ADD_LIBRARY for library ";
+    msg += args[0];
+    msg += " without any source files. This typically indicates a problem ";
+    msg += "with your CMakeLists.txt file";
+    cmSystemTools::Message(msg.c_str() ,"Warning");
     }
     }
 
 
   std::vector<std::string> srclists;
   std::vector<std::string> srclists;
@@ -100,7 +115,7 @@ bool cmAddLibraryCommand::InitialPass(std::vector<std::string> const& args)
     ++s;
     ++s;
     }
     }
 
 
-  this->Makefile->AddLibrary(this->LibName.c_str(), shared, srclists,
+  this->Makefile->AddLibrary(libName.c_str(), type, srclists,
                              excludeFromAll);
                              excludeFromAll);
   
   
   return true;
   return true;

+ 0 - 3
Source/cmAddLibraryCommand.h

@@ -76,9 +76,6 @@ public:
     }
     }
   
   
   cmTypeMacro(cmAddLibraryCommand, cmCommand);
   cmTypeMacro(cmAddLibraryCommand, cmCommand);
-
-private:
-  std::string LibName;
 };
 };
 
 
 
 

+ 3 - 1
Source/cmCPluginAPI.cxx

@@ -394,7 +394,9 @@ void CCONV cmAddLibrary(void *arg, const char *libname, int shared,
     {
     {
     srcs2.push_back(srcs[i]);
     srcs2.push_back(srcs[i]);
     }
     }
-  mf->AddLibrary(libname, (shared ? true : false), srcs2);
+  mf->AddLibrary(libname, 
+                 (shared? cmTarget::SHARED_LIBRARY : cmTarget::STATIC_LIBRARY),
+                  srcs2);
 }
 }
 
 
 char CCONV *cmExpandVariablesInString(void *arg, const char *source,
 char CCONV *cmExpandVariablesInString(void *arg, const char *source,

+ 18 - 21
Source/cmMakefile.cxx

@@ -1336,26 +1336,19 @@ void cmMakefile::AddGlobalLinkInformation(const char* name, cmTarget& target)
 }
 }
 
 
 
 
-void cmMakefile::AddLibrary(const char* lname, int shared,
+void cmMakefile::AddLibrary(const char* lname, cmTarget::TargetType type,
                             const std::vector<std::string> &srcs,
                             const std::vector<std::string> &srcs,
                             bool excludeFromAll)
                             bool excludeFromAll)
 {
 {
-  cmTarget* target=0;
-  switch (shared)
+  // wrong type ? default to STATIC
+  if (    (type != cmTarget::STATIC_LIBRARY) 
+       && (type != cmTarget::SHARED_LIBRARY) 
+       && (type != cmTarget::MODULE_LIBRARY))
     {
     {
-    case 0:
-      target=this->AddNewTarget(cmTarget::STATIC_LIBRARY, lname, false);
-      break;
-    case 1:
-      target=this->AddNewTarget(cmTarget::SHARED_LIBRARY, lname, false);
-      break;
-    case 2:
-      target=this->AddNewTarget(cmTarget::MODULE_LIBRARY, lname, false);
-      break;
-    default:
-      target=this->AddNewTarget(cmTarget::STATIC_LIBRARY, lname, false);
+    type = cmTarget::STATIC_LIBRARY;
     }
     }
 
 
+  cmTarget* target = this->AddNewTarget(type, lname, false);
   // Clear its dependencies. Otherwise, dependencies might persist
   // Clear its dependencies. Otherwise, dependencies might persist
   // over changes in CMakeLists.txt, making the information stale and
   // over changes in CMakeLists.txt, making the information stale and
   // hence useless.
   // hence useless.
@@ -1383,21 +1376,25 @@ cmTarget* cmMakefile::AddExecutable(const char *exeName,
 }
 }
 
 
 
 
-cmTarget* cmMakefile::AddNewTarget(cmTarget::TargetType type, const char* name, bool isImported)
+cmTarget* cmMakefile::AddNewTarget(cmTarget::TargetType type, 
+                                   const char* name, 
+                                   bool isImported)
 {
 {
   cmTargets::iterator it;
   cmTargets::iterator it;
   cmTarget target;
   cmTarget target;
   target.SetType(type, name);
   target.SetType(type, name);
   target.SetMakefile(this);
   target.SetMakefile(this);
   if (isImported)
   if (isImported)
-  {
+    {
     target.MarkAsImported();
     target.MarkAsImported();
-    it=this->ImportedTargets.insert(cmTargets::value_type(target.GetName(), target)).first;
-  }
+    it=this->ImportedTargets.insert(
+                        cmTargets::value_type(target.GetName(), target)).first;
+    }
   else
   else
-  {
-    it=this->Targets.insert(cmTargets::value_type(target.GetName(), target)).first;
-  }
+    {
+    it=this->Targets.insert(
+                        cmTargets::value_type(target.GetName(), target)).first;
+    }
   this->LocalGenerator->GetGlobalGenerator()->AddTarget(*it);
   this->LocalGenerator->GetGlobalGenerator()->AddTarget(*it);
   return &it->second;
   return &it->second;
 }
 }

+ 1 - 1
Source/cmMakefile.h

@@ -283,7 +283,7 @@ public:
   /**
   /**
    * Set the name of the library.
    * Set the name of the library.
    */
    */
-  void AddLibrary(const char *libname, int shared,
+  void AddLibrary(const char *libname, cmTarget::TargetType type,
                   const std::vector<std::string> &srcs,
                   const std::vector<std::string> &srcs,
                   bool excludeFromAll = false);
                   bool excludeFromAll = false);