Changes to allow MODULE type target for a shared library
This commit is contained in:
parent
0b58132cd4
commit
247c1640da
|
@ -52,7 +52,7 @@ bool cmAddLibraryCommand::InitialPass(std::vector<std::string>& 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.
|
||||||
bool shared = !cmSystemTools::IsOff(m_Makefile->GetDefinition("BUILD_SHARED_LIBS"));
|
int shared = !cmSystemTools::IsOff(m_Makefile->GetDefinition("BUILD_SHARED_LIBS"));
|
||||||
|
|
||||||
std::vector<std::string>::iterator s = args.begin();
|
std::vector<std::string>::iterator s = args.begin();
|
||||||
++s;
|
++s;
|
||||||
|
@ -67,12 +67,17 @@ bool cmAddLibraryCommand::InitialPass(std::vector<std::string>& args)
|
||||||
if(libType == "STATIC")
|
if(libType == "STATIC")
|
||||||
{
|
{
|
||||||
++s;
|
++s;
|
||||||
shared = false;
|
shared = 0;
|
||||||
}
|
}
|
||||||
else if(libType == "SHARED")
|
else if(libType == "SHARED")
|
||||||
{
|
{
|
||||||
++s;
|
++s;
|
||||||
shared = true;
|
shared = 1;
|
||||||
|
}
|
||||||
|
else if(libType == "MODULE")
|
||||||
|
{
|
||||||
|
++s;
|
||||||
|
shared = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::vector<std::string> srclists(s, args.end());
|
std::vector<std::string> srclists(s, args.end());
|
||||||
|
|
|
@ -86,9 +86,11 @@ public:
|
||||||
virtual const char* GetFullDocumentation()
|
virtual const char* GetFullDocumentation()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
"ADD_LIBRARY(libname [SHARED | STATIC] srclist srclist srclist ...)\n"
|
"ADD_LIBRARY(libname [SHARED | STATIC | MODULE] srclist srclist ...)\n"
|
||||||
"Adds a library target. If the keyword SHARED or STATIC appears, it\n"
|
"Adds a library target. SHARED, STATIC or MODULE keywords are used\n"
|
||||||
"sets the library type. If neither keyword appears as the second\n"
|
"to set the library type. If the keywork MODULE appears, the library\n"
|
||||||
|
"type is set to MH_BUNDLE on systems which use dyld. Systems without\n"
|
||||||
|
"dyld MODULE is treated like SHARED. If no keywords appear as the second\n"
|
||||||
"argument, the type defaults to the current value of BUILD_SHARED_LIBS.\n"
|
"argument, the type defaults to the current value of BUILD_SHARED_LIBS.\n"
|
||||||
"If this variable is not set, the type defaults to STATIC.";
|
"If this variable is not set, the type defaults to STATIC.";
|
||||||
}
|
}
|
||||||
|
|
|
@ -608,11 +608,25 @@ void cmMakefile::SetProjectName(const char* p)
|
||||||
m_ProjectName = p;
|
m_ProjectName = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmMakefile::AddLibrary(const char* lname, bool shared,
|
void cmMakefile::AddLibrary(const char* lname, int shared,
|
||||||
const std::vector<std::string> &srcs)
|
const std::vector<std::string> &srcs)
|
||||||
{
|
{
|
||||||
cmTarget target;
|
cmTarget target;
|
||||||
target.SetType(shared? cmTarget::SHARED_LIBRARY : cmTarget::STATIC_LIBRARY);
|
switch (shared)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
target.SetType(cmTarget::STATIC_LIBRARY);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
target.SetType(cmTarget::SHARED_LIBRARY);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
target.SetType(cmTarget::MODULE_LIBRARY);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
target.SetType(cmTarget::STATIC_LIBRARY);
|
||||||
|
}
|
||||||
|
|
||||||
target.SetInAll(true);
|
target.SetInAll(true);
|
||||||
target.GetSourceLists() = srcs;
|
target.GetSourceLists() = srcs;
|
||||||
m_Targets.insert(cmTargets::value_type(lname,target));
|
m_Targets.insert(cmTargets::value_type(lname,target));
|
||||||
|
@ -626,11 +640,36 @@ void cmMakefile::AddLibrary(const char* lname, bool shared,
|
||||||
// Add an entry into the cache
|
// Add an entry into the cache
|
||||||
std::string ltname = lname;
|
std::string ltname = lname;
|
||||||
ltname += "_LIBRARY_TYPE";
|
ltname += "_LIBRARY_TYPE";
|
||||||
cmCacheManager::GetInstance()->
|
switch (shared)
|
||||||
AddCacheEntry(ltname.c_str(),
|
{
|
||||||
shared? "SHARED":"STATIC",
|
case 0:
|
||||||
"Whether a library is static or shared.",
|
cmCacheManager::GetInstance()->
|
||||||
cmCacheManager::INTERNAL);
|
AddCacheEntry(ltname.c_str(),
|
||||||
|
"STATIC",
|
||||||
|
"Whether a library is static, shared or module.",
|
||||||
|
cmCacheManager::INTERNAL);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
cmCacheManager::GetInstance()->
|
||||||
|
AddCacheEntry(ltname.c_str(),
|
||||||
|
"SHARED",
|
||||||
|
"Whether a library is static, shared or module.",
|
||||||
|
cmCacheManager::INTERNAL);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
cmCacheManager::GetInstance()->
|
||||||
|
AddCacheEntry(ltname.c_str(),
|
||||||
|
"MODULE",
|
||||||
|
"Whether a library is static, shared or module.",
|
||||||
|
cmCacheManager::INTERNAL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
cmCacheManager::GetInstance()->
|
||||||
|
AddCacheEntry(ltname.c_str(),
|
||||||
|
"STATIC",
|
||||||
|
"Whether a library is static, shared or module.",
|
||||||
|
cmCacheManager::INTERNAL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmMakefile::AddExecutable(const char *exeName,
|
void cmMakefile::AddExecutable(const char *exeName,
|
||||||
|
|
|
@ -243,7 +243,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Set the name of the library.
|
* Set the name of the library.
|
||||||
*/
|
*/
|
||||||
void AddLibrary(const char *libname, bool shared,
|
void AddLibrary(const char *libname, int shared,
|
||||||
const std::vector<std::string> &srcs);
|
const std::vector<std::string> &srcs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -55,7 +55,7 @@ class cmTarget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum TargetType { EXECUTABLE, WIN32_EXECUTABLE, STATIC_LIBRARY,
|
enum TargetType { EXECUTABLE, WIN32_EXECUTABLE, STATIC_LIBRARY,
|
||||||
SHARED_LIBRARY, UTILITY, INSTALL_FILES, INSTALL_PROGRAMS };
|
SHARED_LIBRARY, MODULE_LIBRARY, UTILITY, INSTALL_FILES, INSTALL_PROGRAMS };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the type of target.
|
* Return the type of target.
|
||||||
|
|
|
@ -281,6 +281,11 @@ void cmUnixMakefileGenerator::OutputTargetRules(std::ostream& fout)
|
||||||
fout << " \\\n" << m_LibraryOutputPath << "lib" << l->first.c_str()
|
fout << " \\\n" << m_LibraryOutputPath << "lib" << l->first.c_str()
|
||||||
<< m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX");
|
<< m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX");
|
||||||
}
|
}
|
||||||
|
else if(l->second.GetType() == cmTarget::MODULE_LIBRARY)
|
||||||
|
{
|
||||||
|
fout << " \\\n" << m_LibraryOutputPath << "lib" << l->first.c_str()
|
||||||
|
<< m_Makefile->GetDefinition("CMAKE_MODULE_SUFFIX");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// executables
|
// executables
|
||||||
|
@ -539,6 +544,22 @@ void cmUnixMakefileGenerator::OutputTargets(std::ostream& fout)
|
||||||
this->OutputLinkLibraries(fout, l->first.c_str(), l->second);
|
this->OutputLinkLibraries(fout, l->first.c_str(), l->second);
|
||||||
fout << "\n\n";
|
fout << "\n\n";
|
||||||
}
|
}
|
||||||
|
else if (l->second.GetType() == cmTarget::MODULE_LIBRARY)
|
||||||
|
{
|
||||||
|
fout << "#---------------------------------------------------------\n";
|
||||||
|
fout << "# rules for a shared module library\n";
|
||||||
|
fout << "#\n";
|
||||||
|
fout << m_LibraryOutputPath << "lib" << l->first << "$(MODULE_SUFFIX): ${" <<
|
||||||
|
l->first << "_SRC_OBJS} \n";
|
||||||
|
fout << "\trm -f lib" << l->first << "$(MODULE_SUFFIX)\n";
|
||||||
|
fout << "\t$(CMAKE_CXX_COMPILER) ${CMAKE_MODULE_LINK_FLAGS} "
|
||||||
|
"${CMAKE_MODULE_BUILD_FLAGS} ${CMAKE_CXXFLAGS} -o \\\n";
|
||||||
|
fout << "\t " << m_LibraryOutputPath << "lib" << l->first << "$(MODULE_SUFFIX) \\\n";
|
||||||
|
fout << "\t ${" << l->first <<
|
||||||
|
"_SRC_OBJS} ";
|
||||||
|
this->OutputLinkLibraries(fout, l->first.c_str(), l->second);
|
||||||
|
fout << "\n\n";
|
||||||
|
}
|
||||||
else if ((l->second.GetType() == cmTarget::EXECUTABLE)
|
else if ((l->second.GetType() == cmTarget::EXECUTABLE)
|
||||||
|| (l->second.GetType() == cmTarget::WIN32_EXECUTABLE))
|
|| (l->second.GetType() == cmTarget::WIN32_EXECUTABLE))
|
||||||
{
|
{
|
||||||
|
@ -608,6 +629,10 @@ void cmUnixMakefileGenerator::OutputDependencies(std::ostream& fout)
|
||||||
{
|
{
|
||||||
libpath += m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX");
|
libpath += m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX");
|
||||||
}
|
}
|
||||||
|
else if (libType && std::string(libType) == "MODULE")
|
||||||
|
{
|
||||||
|
libpath += m_Makefile->GetDefinition("CMAKE_MODULE_SUFFIX");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
libpath += ".a";
|
libpath += ".a";
|
||||||
|
@ -642,6 +667,10 @@ void cmUnixMakefileGenerator::OutputDependencies(std::ostream& fout)
|
||||||
{
|
{
|
||||||
library += m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX");
|
library += m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX");
|
||||||
}
|
}
|
||||||
|
else if(libType && std::string(libType) == "MODULE")
|
||||||
|
{
|
||||||
|
library += m_Makefile->GetDefinition("CMAKE_MODULE_SUFFIX");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
library += ".a";
|
library += ".a";
|
||||||
|
@ -994,12 +1023,15 @@ void cmUnixMakefileGenerator::OutputMakeVariables(std::ostream& fout)
|
||||||
"CMAKE_CXX_COMPILER = @CMAKE_CXX_COMPILER@\n"
|
"CMAKE_CXX_COMPILER = @CMAKE_CXX_COMPILER@\n"
|
||||||
"CMAKE_CXXFLAGS = @CMAKE_CXX_FLAGS@ @CMAKE_TEMPLATE_FLAGS@\n"
|
"CMAKE_CXXFLAGS = @CMAKE_CXX_FLAGS@ @CMAKE_TEMPLATE_FLAGS@\n"
|
||||||
"\n"
|
"\n"
|
||||||
"CMAKE_SHLIB_BUILD_FLAGS = @CMAKE_SHLIB_BUILD_FLAGS@\n"
|
"CMAKE_SHLIB_BUILD_FLAGS = @CMAKE_SHLIB_BUILD_FLAGS@\n"
|
||||||
"CMAKE_SHLIB_LINK_FLAGS = @CMAKE_SHLIB_LINK_FLAGS@\n"
|
"CMAKE_SHLIB_LINK_FLAGS = @CMAKE_SHLIB_LINK_FLAGS@\n"
|
||||||
"DL_LIBS = @CMAKE_DL_LIBS@\n"
|
"CMAKE_MODULE_BUILD_FLAGS = @CMAKE_MODULE_BUILD_FLAGS@\n"
|
||||||
"SHLIB_LD_LIBS = @CMAKE_SHLIB_LD_LIBS@\n"
|
"CMAKE_MODULE_LINK_FLAGS = @CMAKE_MODULE_LINK_FLAGS@\n"
|
||||||
"SHLIB_SUFFIX = @CMAKE_SHLIB_SUFFIX@\n"
|
"DL_LIBS = @CMAKE_DL_LIBS@\n"
|
||||||
"THREAD_LIBS = @CMAKE_THREAD_LIBS@\n"
|
"SHLIB_LD_LIBS = @CMAKE_SHLIB_LD_LIBS@\n"
|
||||||
|
"SHLIB_SUFFIX = @CMAKE_SHLIB_SUFFIX@\n"
|
||||||
|
"MODULE_SUFFIX = @CMAKE_MODULE_SUFFIX@\n"
|
||||||
|
"THREAD_LIBS = @CMAKE_THREAD_LIBS@\n"
|
||||||
"\n"
|
"\n"
|
||||||
"# set up the path to the rulesgen program\n"
|
"# set up the path to the rulesgen program\n"
|
||||||
"CMAKE_COMMAND = ${CMAKE_COMMAND}\n"
|
"CMAKE_COMMAND = ${CMAKE_COMMAND}\n"
|
||||||
|
@ -1065,6 +1097,12 @@ void cmUnixMakefileGenerator::OutputInstallRules(std::ostream& fout)
|
||||||
fout << m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX");
|
fout << m_Makefile->GetDefinition("CMAKE_SHLIB_SUFFIX");
|
||||||
fout << " " << prefix << l->second.GetInstallPath() << "\n";
|
fout << " " << prefix << l->second.GetInstallPath() << "\n";
|
||||||
break;
|
break;
|
||||||
|
case cmTarget::MODULE_LIBRARY:
|
||||||
|
fout << "\t$(INSTALL_DATA) " << m_LibraryOutputPath << "lib"
|
||||||
|
<< l->first;
|
||||||
|
fout << m_Makefile->GetDefinition("CMAKE_MODULE_SUFFIX");
|
||||||
|
fout << " " << prefix << l->second.GetInstallPath() << "\n";
|
||||||
|
break;
|
||||||
case cmTarget::WIN32_EXECUTABLE:
|
case cmTarget::WIN32_EXECUTABLE:
|
||||||
case cmTarget::EXECUTABLE:
|
case cmTarget::EXECUTABLE:
|
||||||
fout << "\t$(INSTALL_PROGRAM) " << m_ExecutableOutputPath
|
fout << "\t$(INSTALL_PROGRAM) " << m_ExecutableOutputPath
|
||||||
|
@ -1263,7 +1301,8 @@ void cmUnixMakefileGenerator::OutputSourceObjectBuildRules(std::ostream& fout)
|
||||||
for(std::map<cmStdString, cmTarget>::const_iterator target = targets.begin();
|
for(std::map<cmStdString, cmTarget>::const_iterator target = targets.begin();
|
||||||
target != targets.end(); ++target)
|
target != targets.end(); ++target)
|
||||||
{
|
{
|
||||||
bool shared = (target->second.GetType() == cmTarget::SHARED_LIBRARY);
|
bool shared = ((target->second.GetType() == cmTarget::SHARED_LIBRARY) ||
|
||||||
|
(target->second.GetType() == cmTarget::MODULE_LIBRARY));
|
||||||
std::string exportsDef = "";
|
std::string exportsDef = "";
|
||||||
if(shared)
|
if(shared)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue