Commit 41e12704 authored by Ken Martin's avatar Ken Martin

support for debug and opt libraries

parent 888e47dd
......@@ -68,7 +68,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 CM_OPTIMIZED_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
!ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 Debug"
......@@ -95,7 +95,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 CM_DEBUG_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
!ENDIF
......
......@@ -63,7 +63,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
# ADD LINK32 CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
# ADD LINK32 CM_OPTIMIZED_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
!ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 Debug"
......@@ -88,7 +88,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /IGNORE:4089
# ADD LINK32 CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /IGNORE:4089
# ADD LINK32 CM_DEBUG_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /IGNORE:4089
!ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 Release MinSize"
# PROP BASE Use_MFC 0
......@@ -110,7 +110,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
# ADD LINK32 CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
# ADD LINK32 CM_OPTIMIZED_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /IGNORE:4089
!ENDIF
......
......@@ -91,7 +91,7 @@ EXSTYLE WS_EX_APPWINDOW
CAPTION "CMakeSetupDialog"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "Close",IDOK,319,39,50,14
DEFPUSHBUTTON "Close",IDOK,231,206,50,14
EDITTEXT IDC_WhereSource,129,4,135,13,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",IDC_BUTTON2,269,5,43,13
LTEXT "Where is the source code:",IDC_STATIC,39,6,86,9
......@@ -99,11 +99,13 @@ BEGIN
PUSHBUTTON "Browse...",IDC_BUTTON3,268,25,43,13
LTEXT "Where do you want to build the binaries:",IDC_STATIC,1,
27,128,9
PUSHBUTTON "Build Project Files",IDC_BuildProjects,6,39,67,15
GROUPBOX "Cache Values",IDC_STATIC,2,67,370,156
LISTBOX IDC_LIST2,13,84,344,122,LBS_OWNERDRAWVARIABLE |
PUSHBUTTON "Build Project Files",IDC_BuildProjects,81,205,67,15
GROUPBOX "Cache Values",IDC_STATIC,9,43,356,141
LISTBOX IDC_LIST2,15,55,344,122,LBS_OWNERDRAWVARIABLE |
LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL |
WS_TABSTOP
CTEXT "Right click on cache entries for additional options",
IDC_STATIC,19,190,333,11
END
......@@ -165,11 +167,6 @@ BEGIN
TOPMARGIN, 7
BOTTOMMARGIN, 48
END
IDD_CMakeSetupDialog_DIALOG, DIALOG
BEGIN
BOTTOMMARGIN, 215
END
END
#endif // APSTUDIO_INVOKED
......
......@@ -13,6 +13,7 @@
#define IDC_BUTTON3 1004
#define IDC_BuildProjects 1006
#define IDC_LIST2 1007
#define IDC_LIST3 1010
// Next default values for new objects
//
......@@ -20,7 +21,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 131
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1008
#define _APS_NEXT_CONTROL_VALUE 1011
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
......@@ -53,10 +53,8 @@ void cmDSPMakefile::OutputDSPFile()
}
// Create the DSP or set of DSP's for libraries and executables
const char* cacheValue
= cmCacheManager::GetInstance()->GetCacheValue("BUILD_SHARED_LIBS");
m_LibraryBuildType = STATIC_LIBRARY;
if(cacheValue && strcmp(cacheValue,"0"))
if(cmCacheManager::GetInstance()->IsOn("BUILD_SHARED_LIBS"))
{
m_LibraryBuildType = DLL;
}
......@@ -69,30 +67,6 @@ void cmDSPMakefile::OutputDSPFile()
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)
{
std::string libOptions;
std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
for(i = libdirs.begin(); i != libdirs.end(); ++i)
{
libOptions += " /LIBPATH:\"";
libOptions += *i;
libOptions += "/$(OUTDIR)\" ";
libOptions += " /LIBPATH:\"";
libOptions += *i;
libOptions += "\" ";
}
std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
for(i = libs.begin(); i != libs.end(); ++i)
{
// add libraries to executables and dlls (but never include
// a library in a library, bad recursion)
if (!l->second.IsALibrary() ||
(m_LibraryBuildType == DLL && l->first.c_str() != *i))
{
libOptions += " ";
libOptions += *i;
libOptions += ".lib ";
}
}
if (l->second.IsALibrary())
{
this->SetBuildType(m_LibraryBuildType, l->first.c_str());
......@@ -101,13 +75,11 @@ void cmDSPMakefile::OutputDSPFile()
{
this->SetBuildType(EXECUTABLE,l->first.c_str());
}
libOptions += "/STACK:10000000 ";
this->CreateSingleDSP(l->first.c_str(),l->second, libOptions);
this->CreateSingleDSP(l->first.c_str(),l->second);
}
}
void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target,
const std::string &libOptions)
void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target)
{
std::string fname;
fname = m_Makefile->GetStartOutputDirectory();
......@@ -121,7 +93,7 @@ void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target,
{
cmSystemTools::Error("Error Writing ", fname.c_str());
}
this->WriteDSPFile(fout,lname,target, libOptions);
this->WriteDSPFile(fout,lname,target);
}
void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout)
......@@ -189,11 +161,10 @@ void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup)
void cmDSPMakefile::WriteDSPFile(std::ostream& fout,
const char *libName,
cmTarget &target,
const std::string &libOptions)
cmTarget &target)
{
// Write the DSP file's header.
this->WriteDSPHeader(fout, libName, libOptions);
this->WriteDSPHeader(fout, libName, target);
// We may be modifying the source groups temporarily, so make a copy.
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
......@@ -405,8 +376,55 @@ void cmDSPMakefile::SetBuildType(BuildType b, const char *libName)
}
void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName,
const std::string &libOptions)
const cmTarget &target)
{
// determine the link directories
std::string libOptions;
std::string libDebugOptions;
std::string libOptimizedOptions;
std::vector<std::string>::iterator i;
std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
for(i = libdirs.begin(); i != libdirs.end(); ++i)
{
libOptions += " /LIBPATH:\"";
libOptions += *i;
libOptions += "/$(OUTDIR)\" ";
libOptions += " /LIBPATH:\"";
libOptions += *i;
libOptions += "\" ";
}
// find link libraries
cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries();
cmMakefile::LinkLibraries::const_iterator j;
for(j = libs.begin(); j != libs.end(); ++j)
{
// add libraries to executables and dlls (but never include
// a library in a library, bad recursion)
if (!target.IsALibrary() ||
(m_LibraryBuildType == DLL && libName != j->first))
{
if (j->second == cmMakefile::GENERAL)
{
libOptions += " ";
libOptions += j->first;
libOptions += ".lib ";
}
if (j->second == cmMakefile::DEBUG)
{
libDebugOptions += " ";
libDebugOptions += j->first;
libDebugOptions += ".lib ";
}
if (j->second == cmMakefile::OPTIMIZED)
{
libOptimizedOptions += " ";
libOptimizedOptions += j->first;
libOptimizedOptions += ".lib ";
}
}
}
libOptions += "/STACK:10000000 ";
std::ifstream fin(m_DSPHeaderTemplate.c_str());
if(!fin)
{
......@@ -420,6 +438,10 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName,
std::string line = buffer;
cmSystemTools::ReplaceString(line, "CM_LIBRARIES",
libOptions.c_str());
cmSystemTools::ReplaceString(line, "CM_DEBUG_LIBRARIES",
libDebugOptions.c_str());
cmSystemTools::ReplaceString(line, "CM_OPTIMIZED_LIBRARIES",
libOptimizedOptions.c_str());
cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
m_IncludeOptions.c_str());
cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",libName);
......
......@@ -67,16 +67,15 @@ private:
std::string m_DSPFooterTemplate;
std::vector<std::string> m_CreatedProjectNames;
void CreateSingleDSP(const char *lname, cmTarget &tgt,
const std::string &libs);
void CreateSingleDSP(const char *lname, cmTarget &tgt);
void WriteDSPFile(std::ostream& fout, const char *libName,
cmTarget &tgt, const std::string &libs);
cmTarget &tgt);
void WriteDSPBeginGroup(std::ostream& fout,
const char* group,
const char* filter);
void WriteDSPEndGroup(std::ostream& fout);
void WriteDSPHeader(std::ostream& fout, const char *libName,
const std::string &libs);
const cmTarget &tgt);
void WriteDSPBuildRule(std::ostream& fout, const char*);
void WriteDSPBuildRule(std::ostream& fout);
void WriteDSPFooter(std::ostream& fout);
......
......@@ -53,10 +53,8 @@ void cmDSPMakefile::OutputDSPFile()
}
// Create the DSP or set of DSP's for libraries and executables
const char* cacheValue
= cmCacheManager::GetInstance()->GetCacheValue("BUILD_SHARED_LIBS");
m_LibraryBuildType = STATIC_LIBRARY;
if(cacheValue && strcmp(cacheValue,"0"))
if(cmCacheManager::GetInstance()->IsOn("BUILD_SHARED_LIBS"))
{
m_LibraryBuildType = DLL;
}
......@@ -69,30 +67,6 @@ void cmDSPMakefile::OutputDSPFile()
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)
{
std::string libOptions;
std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
for(i = libdirs.begin(); i != libdirs.end(); ++i)
{
libOptions += " /LIBPATH:\"";
libOptions += *i;
libOptions += "/$(OUTDIR)\" ";
libOptions += " /LIBPATH:\"";
libOptions += *i;
libOptions += "\" ";
}
std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
for(i = libs.begin(); i != libs.end(); ++i)
{
// add libraries to executables and dlls (but never include
// a library in a library, bad recursion)
if (!l->second.IsALibrary() ||
(m_LibraryBuildType == DLL && l->first.c_str() != *i))
{
libOptions += " ";
libOptions += *i;
libOptions += ".lib ";
}
}
if (l->second.IsALibrary())
{
this->SetBuildType(m_LibraryBuildType, l->first.c_str());
......@@ -101,13 +75,11 @@ void cmDSPMakefile::OutputDSPFile()
{
this->SetBuildType(EXECUTABLE,l->first.c_str());
}
libOptions += "/STACK:10000000 ";
this->CreateSingleDSP(l->first.c_str(),l->second, libOptions);
this->CreateSingleDSP(l->first.c_str(),l->second);
}
}
void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target,
const std::string &libOptions)
void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target)
{
std::string fname;
fname = m_Makefile->GetStartOutputDirectory();
......@@ -121,7 +93,7 @@ void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target,
{
cmSystemTools::Error("Error Writing ", fname.c_str());
}
this->WriteDSPFile(fout,lname,target, libOptions);
this->WriteDSPFile(fout,lname,target);
}
void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout)
......@@ -189,11 +161,10 @@ void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup)
void cmDSPMakefile::WriteDSPFile(std::ostream& fout,
const char *libName,
cmTarget &target,
const std::string &libOptions)
cmTarget &target)
{
// Write the DSP file's header.
this->WriteDSPHeader(fout, libName, libOptions);
this->WriteDSPHeader(fout, libName, target);
// We may be modifying the source groups temporarily, so make a copy.
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
......@@ -405,8 +376,55 @@ void cmDSPMakefile::SetBuildType(BuildType b, const char *libName)
}
void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName,
const std::string &libOptions)
const cmTarget &target)
{
// determine the link directories
std::string libOptions;
std::string libDebugOptions;
std::string libOptimizedOptions;
std::vector<std::string>::iterator i;
std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
for(i = libdirs.begin(); i != libdirs.end(); ++i)
{
libOptions += " /LIBPATH:\"";
libOptions += *i;
libOptions += "/$(OUTDIR)\" ";
libOptions += " /LIBPATH:\"";
libOptions += *i;
libOptions += "\" ";
}
// find link libraries
cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries();
cmMakefile::LinkLibraries::const_iterator j;
for(j = libs.begin(); j != libs.end(); ++j)
{
// add libraries to executables and dlls (but never include
// a library in a library, bad recursion)
if (!target.IsALibrary() ||
(m_LibraryBuildType == DLL && libName != j->first))
{
if (j->second == cmMakefile::GENERAL)
{
libOptions += " ";
libOptions += j->first;
libOptions += ".lib ";
}
if (j->second == cmMakefile::DEBUG)
{
libDebugOptions += " ";
libDebugOptions += j->first;
libDebugOptions += ".lib ";
}
if (j->second == cmMakefile::OPTIMIZED)
{
libOptimizedOptions += " ";
libOptimizedOptions += j->first;
libOptimizedOptions += ".lib ";
}
}
}
libOptions += "/STACK:10000000 ";
std::ifstream fin(m_DSPHeaderTemplate.c_str());
if(!fin)
{
......@@ -420,6 +438,10 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName,
std::string line = buffer;
cmSystemTools::ReplaceString(line, "CM_LIBRARIES",
libOptions.c_str());
cmSystemTools::ReplaceString(line, "CM_DEBUG_LIBRARIES",
libDebugOptions.c_str());
cmSystemTools::ReplaceString(line, "CM_OPTIMIZED_LIBRARIES",
libOptimizedOptions.c_str());
cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
m_IncludeOptions.c_str());
cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",libName);
......
......@@ -67,16 +67,15 @@ private:
std::string m_DSPFooterTemplate;
std::vector<std::string> m_CreatedProjectNames;
void CreateSingleDSP(const char *lname, cmTarget &tgt,
const std::string &libs);
void CreateSingleDSP(const char *lname, cmTarget &tgt);
void WriteDSPFile(std::ostream& fout, const char *libName,
cmTarget &tgt, const std::string &libs);
cmTarget &tgt);
void WriteDSPBeginGroup(std::ostream& fout,
const char* group,
const char* filter);
void WriteDSPEndGroup(std::ostream& fout);
void WriteDSPHeader(std::ostream& fout, const char *libName,
const std::string &libs);
const cmTarget &tgt);
void WriteDSPBuildRule(std::ostream& fout, const char*);
void WriteDSPBuildRule(std::ostream& fout);
void WriteDSPFooter(std::ostream& fout);
......
......@@ -126,23 +126,24 @@ void cmDSWMakefile::WriteProject(std::ostream& fout,
fout << "{{{\n";
// insert Begin Project Dependency Project_Dep_Name project stuff here
std::vector<std::string>::iterator i, end;
i = project->GetMakefile()->GetLinkLibraries().begin();
end = project->GetMakefile()->GetLinkLibraries().end();
for(;i!= end; ++i)
cmMakefile::LinkLibraries::const_iterator j, jend;
j = project->GetMakefile()->GetLinkLibraries().begin();
jend = project->GetMakefile()->GetLinkLibraries().end();
for(;j!= jend; ++j)
{
if(*i != dspname)
if(j->first != dspname)
{
if (!l.IsALibrary() ||
project->GetLibraryBuildType() == cmDSPMakefile::DLL)
{
fout << "Begin Project Dependency\n";
fout << "Project_Dep_Name " << *i << "\n";
fout << "Project_Dep_Name " << j->first << "\n";
fout << "End Project Dependency\n";
}
}
}
std::vector<std::string>::iterator i, end;
// write utility dependencies.
i = project->GetMakefile()->GetUtilities().begin();
end = project->GetMakefile()->GetUtilities().end();
......
......@@ -126,23 +126,24 @@ void cmDSWMakefile::WriteProject(std::ostream& fout,
fout << "{{{\n";
// insert Begin Project Dependency Project_Dep_Name project stuff here
std::vector<std::string>::iterator i, end;
i = project->GetMakefile()->GetLinkLibraries().begin();
end = project->GetMakefile()->GetLinkLibraries().end();
for(;i!= end; ++i)
cmMakefile::LinkLibraries::const_iterator j, jend;
j = project->GetMakefile()->GetLinkLibraries().begin();
jend = project->GetMakefile()->GetLinkLibraries().end();
for(;j!= jend; ++j)
{
if(*i != dspname)
if(j->first != dspname)
{
if (!l.IsALibrary() ||
project->GetLibraryBuildType() == cmDSPMakefile::DLL)
{
fout << "Begin Project Dependency\n";
fout << "Project_Dep_Name " << *i << "\n";
fout << "Project_Dep_Name " << j->first << "\n";
fout << "End Project Dependency\n";
}
}
}
std::vector<std::string>::iterator i, end;
// write utility dependencies.
i = project->GetMakefile()->GetUtilities().begin();
end = project->GetMakefile()->GetUtilities().end();
......
......@@ -23,10 +23,27 @@ bool cmLinkLibrariesCommand::Invoke(std::vector<std::string>& args)
this->SetError("called with incorrect number of arguments");
return false;
}
// add libraries, nothe that there is an optional prefix
// of debug and optimized than can be used
for(std::vector<std::string>::iterator i = args.begin();
i != args.end(); ++i)
{
m_Makefile->AddLinkLibrary((*i).c_str());
if (*i == "debug")
{
++i;
m_Makefile->AddLinkLibrary(i->c_str(),
cmMakefile::DEBUG);
}
else if (*i == "optimized")
{
++i;
m_Makefile->AddLinkLibrary(i->c_str(),
cmMakefile::OPTIMIZED);
}
else
{
m_Makefile->AddLinkLibrary(i->c_str());
}
}
return true;
}
......
......@@ -70,11 +70,14 @@ public:
virtual const char* GetFullDocumentation()
{
return
"LINK_LIBRARIES(library1 library2)\n"
"LINK_LIBRARIES(library1 <debug | optimized> library2 ...)\n"
"Specify a list of libraries to be linked into\n"
"executables or shared objects. This command is passed\n"
"down to all other commands. The library name should be\n"
"the same as the name used in the LIBRARY(library) command.";
"the same as the name used in the LIBRARY(library) command.\n"
"The debug and optimized strings may be used to indicate that\n"
"the next library listed is to be used only for that specific\n"
"type of build";
}
cmTypeMacro(cmLinkLibrariesCommand, cmCommand);
......
......@@ -127,7 +127,6 @@ void cmMakefile::Print() const
this->PrintStringVector("m_MakeVerbatim ", m_MakeVerbatim);
this->PrintStringVector("m_IncludeDirectories;", m_IncludeDirectories);
this->PrintStringVector("m_LinkDirectories", m_LinkDirectories);
this->PrintStringVector("m_LinkLibraries", m_LinkLibraries);
this->PrintStringVector("m_Utilities", m_Utilities);
this->PrintStringVector("m_UtilityDirectories", m_UtilityDirectories);
}
......@@ -335,9 +334,15 @@ void cmMakefile::AddUtilityDirectory(const char* dir)
m_UtilityDirectories.push_back(dir);
}
void cmMakefile::AddLinkLibrary(const char* lib, LinkLibraryType llt)
{
m_LinkLibraries.push_back(
std::pair<std::string, LinkLibraryType>(lib,llt));
}
void cmMakefile::AddLinkLibrary(const char* lib)
{
m_LinkLibraries.push_back(lib);
this->AddLinkLibrary(lib,GENERAL);
}
void cmMakefile::AddLinkDirectory(const char* dir)
......@@ -483,11 +488,12 @@ void cmMakefile::ExpandVariables()
{
this->ExpandVariablesInString(*j);
}
begin = m_LinkLibraries.begin();
end = m_LinkLibraries.end();
for(j = begin; j != end; ++j)
LinkLibraries::iterator j2, end2;
j2 = m_LinkLibraries.begin();
end2 = m_LinkLibraries.end();
for(; j2 != end2; ++j2)
{
this->ExpandVariablesInString(*j);
this->ExpandVariablesInString(j2->first);
}
}
......
......@@ -118,10 +118,21 @@ public:
*/
void AddUtilityDirectory(const char*);
/**
* Get a list of link libraries in the build.
*/
enum LinkLibraryType {GENERAL, DEBUG, OPTIMIZED};
typedef std::vector<std::pair<std::string,LinkLibraryType> > LinkLibraries;
LinkLibraries& GetLinkLibraries()
{
return m_LinkLibraries;
}
/**
* Add a link library to the build.
*/
void AddLinkLibrary(const char*);
void AddLinkLibrary(const char*, LinkLibraryType type);
/**
* Add a link directory to the build.
......@@ -332,14 +343,6 @@ public:
return m_UtilityDirectories;
}
/**
* Get a list of link libraries in the build.
*/
std::vector<std::string>& GetLinkLibraries()
{
return m_LinkLibraries;
}
/**
* Return a list of source files in this makefile.
*/
......@@ -446,7 +449,7 @@ protected:
std::vector<std::string> m_LinkDirectories;
std::vector<std::string> m_Utilities;
std::vector<std::string> m_UtilityDirectories;
std::vector<std::string> m_LinkLibraries;
LinkLibraries m_LinkLibraries;
std::string m_IncludeFileRegularExpression;
std::string m_DefineFlags;
std::vector<cmSourceGroup> m_SourceGroups;
......
......@@ -133,18 +133,21 @@ void cmUnixMakefileGenerator::OutputLinkLibraries(std::ostream& fout,
linkLibs += " ";
}
std::string librariesLinked;
std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
for(j = libs.begin(); j != libs.end(); ++j)
cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries();
cmMakefile::LinkLibraries::const_iterator j2;
for(j2 = libs.begin(); j2 != libs.end(); ++j2)
{
// Don't link the library against itself!
if(targetLibrary && (*j == targetLibrary)) continue;
std::string::size_type pos = (*j).find("-l");
if(targetLibrary && (j2->first == targetLibrary)) continue;
// don't look at debug libraries
if (j2->second == cmMakefile::DEBUG) continue;
std::string::size_type pos = j2->first.find("-l");
if((pos == std::string::npos || pos > 0)
&& (*j).find("${") == std::string::npos)
&& j2->first.find("${") == std::string::npos)
{
librariesLinked += "-l";
}
librariesLinked += *j;
librariesLinked += j2->first;
librariesLinked += " ";
}
linkLibs += librariesLinked;
......@@ -206,22 +209,22 @@ void cmUnixMakefileGenerator::OutputTargets(std::ostream& fout)
void cmUnixMakefileGenerator::OutputDependencies(std::ostream& fout)
{
fout << "CMAKE_DEPEND_LIBS = ";
std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
std::vector<std::string>::iterator dir, lib;
cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries();
cmMakefile::LinkLibraries::const_iterator lib2;
// Search the list of libraries that will be linked into
// the executable
for(lib = libs.begin(); lib != libs.end(); ++lib)
for(lib2 = libs.begin(); lib2 != libs.end(); ++lib2)
{
// loop over the list of directories that the libraries might
// be in, looking for an ADD_LIBRARY(lib...) line. This would
// be stored in the cache
const char* cacheValue
= cmCacheManager::GetInstance()->GetCacheValue(lib->c_str());
= cmCacheManager::GetInstance()->GetCacheValue(lib2->first.c_str());
if(cacheValue)
{
std::string libpath = cacheValue;
libpath += "/lib";
libpath += *lib;
libpath += lib2->first;
libpath += "${CMAKE_LIB_EXT}";
fout << libpath << " ";
}
......@@ -229,7 +232,7 @@ void cmUnixMakefileGenerator::OutputDependencies(std::ostream& fout)
std::vector<std::string>& utils = m_Makefile->GetUtilities();
std::vector<std::string>& utildirs = m_Makefile->GetUtilityDirectories();
std::vector<std::string>::iterator util;
std::vector<std::string>::iterator dir, util;
// Search the list of utilities that may be used to generate code for
// this project.
for(util = utils.begin(); util != utils.end(); ++util)
......
......@@ -26,9 +26,7 @@ bool cmVTKWrapPythonCommand::Invoke(std::vector<std::string>& args)
// Now check and see if the value has been stored in the cache