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
This commit is contained in:
parent
1d9889c5d3
commit
f7d4f27c2a
|
@ -26,48 +26,79 @@ 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 =
|
cmTarget::TargetType type = cmTarget::SHARED_LIBRARY;
|
||||||
!cmSystemTools::IsOff(this->Makefile->GetDefinition("BUILD_SHARED_LIBS"));
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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())
|
if (s == args.end())
|
||||||
{
|
{
|
||||||
std::string msg = "You have called ADD_LIBRARY for library ";
|
std::string msg = "You have called ADD_LIBRARY for library ";
|
||||||
|
@ -77,22 +108,6 @@ bool cmAddLibraryCommand::InitialPass(std::vector<std::string> const& args)
|
||||||
cmSystemTools::Message(msg.c_str() ,"Warning");
|
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<std::string> srclists;
|
std::vector<std::string> srclists;
|
||||||
while (s != args.end())
|
while (s != args.end())
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
|
|
@ -76,9 +76,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
cmTypeMacro(cmAddLibraryCommand, cmCommand);
|
cmTypeMacro(cmAddLibraryCommand, cmCommand);
|
||||||
|
|
||||||
private:
|
|
||||||
std::string LibName;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
// wrong type ? default to STATIC
|
||||||
switch (shared)
|
if ( (type != cmTarget::STATIC_LIBRARY)
|
||||||
|
&& (type != cmTarget::SHARED_LIBRARY)
|
||||||
|
&& (type != cmTarget::MODULE_LIBRARY))
|
||||||
{
|
{
|
||||||
case 0:
|
type = cmTarget::STATIC_LIBRARY;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue