diff --git a/Source/cmAddLibraryCommand.cxx b/Source/cmAddLibraryCommand.cxx index bdf59ad01..cc55f8031 100644 --- a/Source/cmAddLibraryCommand.cxx +++ b/Source/cmAddLibraryCommand.cxx @@ -26,48 +26,79 @@ bool cmAddLibraryCommand::InitialPass(std::vector const& args) } // Library type defaults to value of BUILD_SHARED_LIBS, if it exists, // 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 importTarget = false; std::vector::const_iterator s = args.begin(); - this->LibName = *s; + std::string libName = *s; ++s; // If the second argument is "SHARED" or "STATIC", then it controls // 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() ) { std::string libType = *s; if(libType == "STATIC") { ++s; - shared = 0; + type = cmTarget::STATIC_LIBRARY; } else if(libType == "SHARED") { ++s; - shared = 1; + type = cmTarget::SHARED_LIBRARY; } else if(libType == "MODULE") { ++s; - shared = 2; + type = cmTarget::MODULE_LIBRARY; } else if(*s == "EXCLUDE_FROM_ALL") { ++s; excludeFromAll = true; } + else if(*s == "IMPORT") + { + ++s; + importTarget = true; + } else { break; } } + /* ideally we should check whether for the linker language of the target + 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 + yet its linker language. */ + if ((type != cmTarget::STATIC_LIBRARY) && + (this->Makefile->IsOn("CMAKE_TARGET_SUPPORTS_ONLY_STATIC_LIBS"))) + { + std::string msg = "ADD_LIBRARY for library "; + msg += args[0]; + msg += " is used with the SHARED or MODULE option, but the target " + "platform supports only STATIC libraries. Building it STATIC instead. " + "This may lead to problems."; + cmSystemTools::Message(msg.c_str() ,"Warning"); + 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 "; @@ -77,22 +108,6 @@ bool cmAddLibraryCommand::InitialPass(std::vector const& args) cmSystemTools::Message(msg.c_str() ,"Warning"); } - /* ideally we should check whether for the linker language of the target - 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 - yet its linker language. */ - if ((shared != 0) && - (this->Makefile->IsOn("CMAKE_TARGET_SUPPORTS_ONLY_STATIC_LIBS"))) - { - std::string msg = "ADD_LIBRARY for library "; - msg += args[0]; - msg += " is used with the SHARED or MODULE option, but the target " - "platform supports only STATIC libraries. Building it STATIC instead. " - "This may lead to problems."; - cmSystemTools::Message(msg.c_str() ,"Warning"); - shared = 0; - } - std::vector srclists; while (s != args.end()) { @@ -100,7 +115,7 @@ bool cmAddLibraryCommand::InitialPass(std::vector const& args) ++s; } - this->Makefile->AddLibrary(this->LibName.c_str(), shared, srclists, + this->Makefile->AddLibrary(libName.c_str(), type, srclists, excludeFromAll); return true; diff --git a/Source/cmAddLibraryCommand.h b/Source/cmAddLibraryCommand.h index 497634ce5..b128a0820 100644 --- a/Source/cmAddLibraryCommand.h +++ b/Source/cmAddLibraryCommand.h @@ -76,9 +76,6 @@ public: } cmTypeMacro(cmAddLibraryCommand, cmCommand); - -private: - std::string LibName; }; diff --git a/Source/cmCPluginAPI.cxx b/Source/cmCPluginAPI.cxx index acd663deb..81a556270 100644 --- a/Source/cmCPluginAPI.cxx +++ b/Source/cmCPluginAPI.cxx @@ -394,7 +394,9 @@ void CCONV cmAddLibrary(void *arg, const char *libname, int shared, { 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, diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 13422b1e0..b49f826f7 100644 --- a/Source/cmMakefile.cxx +++ b/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 &srcs, 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 // over changes in CMakeLists.txt, making the information stale and // 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; cmTarget target; target.SetType(type, name); target.SetMakefile(this); if (isImported) - { + { 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 - { - 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); return &it->second; } diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index b027e3000..bc6bd5b84 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -283,7 +283,7 @@ public: /** * Set the name of the library. */ - void AddLibrary(const char *libname, int shared, + void AddLibrary(const char *libname, cmTarget::TargetType type, const std::vector &srcs, bool excludeFromAll = false);