Commit 288287b3 authored by John Biddiscombe's avatar John Biddiscombe

ENH: Major fix of the Borland generator which addresses the problem of libraries

with dependencies (other libraries) not linking when required. Dependency checking
required the full path to be supplied to each file when they're not in the current directory
(very tedious). All seems to be working nicely now.
parent ea40b866
...@@ -14,7 +14,7 @@ cmBorlandMakefileGenerator::cmBorlandMakefileGenerator() ...@@ -14,7 +14,7 @@ cmBorlandMakefileGenerator::cmBorlandMakefileGenerator()
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void cmBorlandMakefileGenerator::GenerateMakefile() void cmBorlandMakefileGenerator::GenerateMakefile()
{ {
// suppoirt override in output directories // support override in output directories
if (m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH")) if (m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH"))
{ {
m_LibraryOutputPath = m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH"); m_LibraryOutputPath = m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH");
...@@ -140,21 +140,14 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file) ...@@ -140,21 +140,14 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file)
fout << m_Makefile->ExpandVariablesInString(replace); fout << m_Makefile->ExpandVariablesInString(replace);
replace = "BCB = $(BCBBINPATH)/.. \n"; replace = "BCB = $(BCBBINPATH)/.. \n";
fout << m_Makefile->ExpandVariablesInString(replace); fout << m_Makefile->ExpandVariablesInString(replace);
// replace = "OUTDIRLIB = @LIBRARY_OUTPUT_PATH@ \n";
// fout << cmSystemTools::ConvertToWindowsSlashes(m_Makefile->ExpandVariablesInString(replace));
// replace = "OUTDIREXE = @EXECUTABLE_OUTPUT_PATH@ \n";
// fout << m_Makefile->ExpandVariablesInString(replace);
replace = "OUTDIRLIB = "; replace = "OUTDIRLIB = ";
replace += m_LibraryOutputPath; replace += m_LibraryOutputPath;
replace += "\n"; replace += "\n";
fout << cmSystemTools::ConvertToWindowsSlashes(replace); fout << cmSystemTools::ConvertToWindowsSlashes(replace);
replace = "OUTDIREXE = "; replace = "OUTDIREXE = ";
replace += m_ExecutableOutputPath; replace += m_ExecutableOutputPath;
replace += "\n"; replace += "\n";
fout << cmSystemTools::ConvertToWindowsSlashes(replace); fout << cmSystemTools::ConvertToWindowsSlashes(replace);
replace = "USERDEFINES = @DEFS_USER@ \n"; replace = "USERDEFINES = @DEFS_USER@ \n";
fout << m_Makefile->ExpandVariablesInString(replace); fout << m_Makefile->ExpandVariablesInString(replace);
replace = "SYSDEFINES = @DEFS_SYS@ \n"; replace = "SYSDEFINES = @DEFS_SYS@ \n";
...@@ -178,9 +171,6 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file) ...@@ -178,9 +171,6 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file)
fout << "CMAKE_CURRENT_BINARY = " << m_Makefile->GetStartOutputDirectory() << "\n"; fout << "CMAKE_CURRENT_BINARY = " << m_Makefile->GetStartOutputDirectory() << "\n";
fout << "OBJDIR = " << m_Makefile->GetStartOutputDirectory() << "\n"; fout << "OBJDIR = " << m_Makefile->GetStartOutputDirectory() << "\n";
fout << "CMAKEDEFINES = " << m_Makefile->GetDefineFlags() << "\n"; fout << "CMAKEDEFINES = " << m_Makefile->GetDefineFlags() << "\n";
fout << "LINK_LIB = \\ \n";
fout << " import32.lib \\ \n";
fout << " cw32mti.lib \n\n";
// //
// create a make variable with all of the sources for this makefile for depend purposes. // create a make variable with all of the sources for this makefile for depend purposes.
// //
...@@ -196,13 +186,10 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file) ...@@ -196,13 +186,10 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file)
for (std::vector<std::string>::const_iterator i=lfiles.begin(); for (std::vector<std::string>::const_iterator i=lfiles.begin();
i!=lfiles.end(); ++i) i!=lfiles.end(); ++i)
{ {
dir = *i; fout << " " << *i << " \\\n";
// cmSystemTools::ConvertToWindowsSlashes(dir);
fout << " " << dir << " \\\n";
} }
dir = m_Makefile->GetHomeOutputDirectory(); dir = m_Makefile->GetHomeOutputDirectory();
dir += "/CMakeCache.txt"; dir += "/CMakeCache.txt";
// cmSystemTools::ConvertToWindowsSlashes(dir);
fout << " " << dir << "\n\n"; fout << " " << dir << "\n\n";
// //
// Output Include paths // Output Include paths
...@@ -220,7 +207,7 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file) ...@@ -220,7 +207,7 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file)
// //
// for each target add to the list of targets // for each target add to the list of targets
// //
fout << "TARGETS = "; fout << "TARGETS = ";
const cmTargets &tgts = m_Makefile->GetTargets(); const cmTargets &tgts = m_Makefile->GetTargets();
// list libraries first // list libraries first
for (cmTargets::const_iterator l=tgts.begin(); for (cmTargets::const_iterator l=tgts.begin();
...@@ -283,7 +270,29 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file) ...@@ -283,7 +270,29 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file)
} }
} }
// //
// Create the link dir list - use same for all targets
//
std::vector<std::string> linkdirs = m_Makefile->GetLinkDirectories();
replace = "@BCB_BIN_PATH@/../lib";
m_Makefile->ExpandVariablesInString(replace);
linkdirs.push_back(replace);
replace = "@BCB_BIN_PATH@/../lib/debug";
m_Makefile->ExpandVariablesInString(replace);
linkdirs.push_back(replace);
fout << "LINK_DIR =";
for (std::vector<std::string>::const_iterator d=linkdirs.begin(); d!=linkdirs.end(); d++)
{
std::string temp = cmSystemTools::EscapeSpaces(d->c_str());
fout << temp << ";";
}
fout << "\n\n";
//
// Create the link lib list for each target // Create the link lib list for each target
// We also want to make all of these lib/bpi dependencies of the
// target, but Borland MAKE is very annoying and insists on the full
// path being used on the dependency line.
// If lib is a target add OUTDIRLIB
// otherwise try to find full path....
// //
// do .lib files // do .lib files
std::string libname; std::string libname;
...@@ -302,27 +311,38 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file) ...@@ -302,27 +311,38 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file)
l!=libs.end(); l++) l!=libs.end(); l++)
{ {
if ((t->first!=l->first) && if ((t->first!=l->first) &&
(t->second.GetType()!=cmTarget::INSTALL_FILES (t->second.GetType()!=cmTarget::INSTALL_FILES
|| t->second.GetType()!=cmTarget::INSTALL_PROGRAMS)) || t->second.GetType()!=cmTarget::INSTALL_PROGRAMS))
{ {
// Get the lib name
libname = l->first;
// reject any bpi files
if (l->first.find(".bpi")!=std::string::npos) continue;
// make sure it has .lib extension
cmSystemTools::ReplaceString(libname, ".lib", "");
libname += ".lib";
// if this lib is not a target then don't add OUTDIRLIB to it // if this lib is not a target then don't add OUTDIRLIB to it
// but do try to find complete path
if (tgts.find(l->first)==tgts.end()) if (tgts.find(l->first)==tgts.end())
libname = l->first; {
std::string path = cmSystemTools::FindFile(libname.c_str(),linkdirs);
if (path.size()) libname = path;
}
else else
libname = "$(OUTDIRLIB)/" + l->first; {
if (libname.find(".bpi")!=std::string::npos) continue; libname = "$(OUTDIRLIB)\\" + libname;
cmSystemTools::ReplaceString(libname, ".lib", ""); }
libname += ".lib";
fout << " \\\n " << cmSystemTools::EscapeSpaces(libname.c_str()); fout << " \\\n " << cmSystemTools::EscapeSpaces(libname.c_str());
} }
} }
fout << "\n\n"; fout << "\n\n";
} }
} }
// do .bpi package files // Create the link bpi list for each target : see notes above for lib files
for (cmTargets::const_iterator t=tgts.begin(); t!=tgts.end(); t++) for (cmTargets::const_iterator t=tgts.begin(); t!=tgts.end(); t++)
{ {
cmTarget::LinkLibraries const& libs = t->second.GetLinkLibraries(); cmTarget::LinkLibraries const& libs = t->second.GetLinkLibraries();
if ((t->second.GetType() == cmTarget::STATIC_LIBRARY) || if ((t->second.GetType() == cmTarget::STATIC_LIBRARY) ||
(t->second.GetType() == cmTarget::SHARED_LIBRARY) || (t->second.GetType() == cmTarget::SHARED_LIBRARY) ||
(t->second.GetType() == cmTarget::MODULE_LIBRARY) || (t->second.GetType() == cmTarget::MODULE_LIBRARY) ||
...@@ -330,37 +350,34 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file) ...@@ -330,37 +350,34 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file)
(t->second.GetType() == cmTarget::WIN32_EXECUTABLE)) (t->second.GetType() == cmTarget::WIN32_EXECUTABLE))
{ {
fout << t->first << "_LINK_BPI = "; fout << t->first << "_LINK_BPI = ";
for (cmTarget::LinkLibraries::const_iterator l=libs.begin(); for (cmTarget::LinkLibraries::const_iterator l=libs.begin();
l!=libs.end(); l++) l!=libs.end(); l++)
{ {
if ((t->first!=l->first) && if ((t->first!=l->first) &&
(t->second.GetType()!=cmTarget::INSTALL_FILES (t->second.GetType()!=cmTarget::INSTALL_FILES
|| t->second.GetType()!=cmTarget::INSTALL_PROGRAMS)) || t->second.GetType()!=cmTarget::INSTALL_PROGRAMS))
{ {
// if this lib is not a target then don't add OUTDIRLIB to it // Get the lib name
libname = l->first;
// only allow bpi files
if (l->first.find(".bpi")==std::string::npos) continue;
// if this bpi is not a target then don't add OUTDIRLIB to it
// but do try to find complete path
if (tgts.find(l->first)==tgts.end()) if (tgts.find(l->first)==tgts.end())
libname = l->first; {
std::string path = cmSystemTools::FindFile(libname.c_str(),linkdirs);
if (path.size()) libname = path;
}
else else
libname = "$(OUTDIRLIB)/" + l->first; {
if (libname.find(".bpi")==std::string::npos) continue; libname = "$(OUTDIRLIB)\\" + libname + ".bpi";
}
fout << " \\\n " << cmSystemTools::EscapeSpaces(libname.c_str()); fout << " \\\n " << cmSystemTools::EscapeSpaces(libname.c_str());
} }
} }
fout << "\n\n"; fout << "\n\n";
} }
} }
//
// Create the link dir list - use same for all targets
//
std::vector<std::string> dirs = m_Makefile->GetLinkDirectories();
fout << "LINK_DIR =";
for (std::vector<std::string>::const_iterator d=dirs.begin(); d!=dirs.end(); d++)
{
std::string temp = cmSystemTools::EscapeSpaces(d->c_str());
fout << temp << ";";
}
fout << "\n\n";
// //
// The project rule - Build All targets // The project rule - Build All targets
// //
...@@ -418,22 +435,25 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file) ...@@ -418,22 +435,25 @@ void cmBorlandMakefileGenerator::OutputMakefile(const char* file)
// output the list of libraries that the executables in this makefile will depend on. // output the list of libraries that the executables in this makefile will depend on.
void cmBorlandMakefileGenerator::OutputDependencies(std::ostream& fout) void cmBorlandMakefileGenerator::OutputDependencies(std::ostream& fout)
{ {
// not required under win32 // not required with the Borland generator
// .autodepend
// is added to the start of the makefile to enable automatic dependency
// checking of source files
} }
void cmBorlandMakefileGenerator::OutputTargets(std::ostream& fout) void cmBorlandMakefileGenerator::OutputTargets(std::ostream& fout)
{ {
// Do Libraries first as executables may depend on them // Do Libraries first as executables may depend on them
const cmTargets &tgts = m_Makefile->GetTargets(); const cmTargets &tgts = m_Makefile->GetTargets();
for (cmTargets::const_iterator l=tgts.begin(); l!=tgts.end(); l++) for (cmTargets::const_iterator l=tgts.begin(); l!=tgts.end(); l++)
{ {
if (l->second.GetType() == cmTarget::STATIC_LIBRARY) if (l->second.GetType() == cmTarget::STATIC_LIBRARY)
{ {
// //
// WARNING. TLIB fails with Unix style Forward slashes - use $(OUTDIRLIB)\\ // WARNING. TLIB fails with Unix style Forward slashes - use $(OUTDIRLIB)\\
// //
fout << "# this should be a static library \n"; fout << "# this should be a static library \n";
fout << "$(OUTDIRLIB)\\" << l->first << ".lib : ${" << l->first << "_SRC_OBJS} \n"; fout << "$(OUTDIRLIB)\\" << l->first << ".lib : ${" << l->first << "_SRC_OBJS} ${" << l->first << "_LINK_LIB} ${" << l->first << "_LINK_BPI} \n";
std::string Libname = "$(OUTDIRLIB)\\" + l->first + ".lib"; std::string Libname = "$(OUTDIRLIB)\\" + l->first + ".lib";
fout << " TLib.exe $(LINKFLAGS_STATIC) /u " << Libname.c_str() << " @&&| \n"; fout << " TLib.exe $(LINKFLAGS_STATIC) /u " << Libname.c_str() << " @&&| \n";
fout << " $? \n"; fout << " $? \n";
...@@ -442,53 +462,53 @@ void cmBorlandMakefileGenerator::OutputTargets(std::ostream& fout) ...@@ -442,53 +462,53 @@ void cmBorlandMakefileGenerator::OutputTargets(std::ostream& fout)
if (l->second.GetType() == cmTarget::SHARED_LIBRARY) if (l->second.GetType() == cmTarget::SHARED_LIBRARY)
{ {
fout << "# this should be a shared (DLL) library \n"; fout << "# this should be a shared (DLL) library \n";
fout << "$(OUTDIRLIB)/" << l->first << ".dll : ${" << l->first << "_SRC_OBJS} \n"; fout << "$(OUTDIRLIB)\\" << l->first << ".dll : ${" << l->first << "_SRC_OBJS} ${" << l->first << "_LINK_LIB} ${" << l->first << "_LINK_BPI} \n";
fout << " @ilink32.exe @&&| \n"; fout << " @ilink32.exe @&&| \n";
fout << " -L\"$(BCB)/lib\" -L$(LINK_DIR) $(LINKFLAGS_DLL) $(LINKFLAGS_DEBUG) \"$(BCB)/lib/c0d32.obj\" "; fout << " -L$(LINK_DIR) $(LINKFLAGS_DLL) $(LINKFLAGS_DEBUG) \"$(BCB)/lib/c0d32.obj\" ";
fout << "$(" << l->first << "_SRC_OBJS) "; fout << "$(" << l->first << "_SRC_OBJS) ";
fout << "$(" << l->first << "_LINK_BPI) , $<, $*, "; fout << "$(" << l->first << "_LINK_BPI) , $<, $*, ";
fout << "$(" << l->first << "_LINK_LIB) $(LINK_LIB) \n"; fout << "$(" << l->first << "_LINK_LIB) import32.lib cw32mti.lib \n";
fout << "| \n"; fout << "| \n";
fout << " @implib -w " << "$(OUTDIRLIB)/" << l->first << ".lib " << "$(OUTDIRLIB)/" << l->first << ".dll \n\n"; fout << " @implib -w " << "$(OUTDIRLIB)\\" << l->first << ".lib " << "$(OUTDIRLIB)\\" << l->first << ".dll \n\n";
} }
if (l->second.GetType() == cmTarget::MODULE_LIBRARY) if (l->second.GetType() == cmTarget::MODULE_LIBRARY)
{ {
fout << "# this should be a Borland Package library \n"; fout << "# this should be a Borland Package library \n";
fout << "$(OUTDIRLIB)/" << l->first << ".bpl : ${" << l->first << "_SRC_OBJS} \n"; fout << "$(OUTDIRLIB)\\" << l->first << ".bpl : ${" << l->first << "_SRC_OBJS} ${" << l->first << "_LINK_LIB} ${" << l->first << "_LINK_BPI} \n";
fout << " @ilink32.exe @&&| \n"; fout << " @ilink32.exe @&&| \n";
fout << " -L\"$(BCB)/lib\" -L$(LINK_DIR) $(LINKFLAGS_BPL) $(LINKFLAGS_DEBUG) \"$(BCB)/lib/c0pkg32.obj\" "; fout << " -L\"$(BCB)/lib\" -L$(LINK_DIR) $(LINKFLAGS_BPL) $(LINKFLAGS_DEBUG) \"$(BCB)/lib/c0pkg32.obj \" ";
fout << "$(" << l->first << "_SRC_OBJS) "; fout << "$(" << l->first << "_LINK_BPI) memmgr.lib sysinit.obj ";
fout << "$(" << l->first << "_LINK_BPI) , $<, $*, "; fout << "$(" << l->first << "_SRC_OBJS) , $<, $*, ";
fout << "$(" << l->first << "_LINK_LIB) $(LINK_LIB) \n"; fout << "$(" << l->first << "_LINK_LIB) import32.lib cp32mti.lib \n";
fout << "| \n"; fout << "| \n";
} }
} }
// Do Executables // Do Executables
for (cmTargets::const_iterator l=tgts.begin(); l!=tgts.end(); l++) for (cmTargets::const_iterator l=tgts.begin(); l!=tgts.end(); l++)
{ {
if (l->second.GetType()==cmTarget::WIN32_EXECUTABLE) if (l->second.GetType()==cmTarget::WIN32_EXECUTABLE)
{ {
fout << l->first << ".exe : ${" << l->first << "_SRC_OBJS} \n"; fout << l->first << ".exe : ${" << l->first << "_SRC_OBJS} ${" << l->first << "_LINK_LIB} ${" << l->first << "_LINK_BPI} \n";
fout << " @ilink32.exe @&&| \n"; fout << " @ilink32.exe @&&| \n";
fout << " -L\"$(BCB)/lib\" -L$(LINK_DIR) $(LINKFLAGS_EXE) $(LINKFLAGS_DEBUG) \"$(BCB)/lib/c0w32.obj\" "; fout << " -L\"$(BCB)/lib\" -L$(LINK_DIR) $(LINKFLAGS_EXE) $(LINKFLAGS_DEBUG) \"$(BCB)/lib/c0w32.obj\" ";
fout << "$(" << l->first << "_SRC_OBJS) "; fout << "$(" << l->first << "_SRC_OBJS) ";
fout << "$(" << l->first << "_LINK_BPI) , $<, $*, "; fout << "$(" << l->first << "_LINK_BPI) , $<, $*, ";
fout << "$(" << l->first << "_LINK_LIB) $(LINK_LIB) \n"; fout << "$(" << l->first << "_LINK_LIB) import32.lib cw32mti.lib \n";
fout << "| \n\n"; fout << "| \n\n";
} }
else if (l->second.GetType()==cmTarget::EXECUTABLE) else if (l->second.GetType()==cmTarget::EXECUTABLE)
{ {
fout << l->first << ".exe : ${" << l->first << "_SRC_OBJS} \n"; fout << l->first << ".exe : ${" << l->first << "_SRC_OBJS} ${" << l->first << "_LINK_LIB} ${" << l->first << "_LINK_BPI} \n";
fout << " @ilink32.exe @&&| \n"; fout << " @ilink32.exe @&&| \n";
fout << " -L\"$(BCB)/lib\" -L$(LINK_DIR) $(LINKFLAGS_EXE) $(LINKFLAGS_DEBUG) \"$(BCB)/lib/c0x32.obj\" "; fout << " -L\"$(BCB)/lib\" -L$(LINK_DIR) $(LINKFLAGS_EXE) $(LINKFLAGS_DEBUG) \"$(BCB)/lib/c0x32.obj\" ";
fout << "$(" << l->first << "_SRC_OBJS) , $<, $*, "; fout << "$(" << l->first << "_SRC_OBJS) , $<, $*, ";
fout << "$(" << l->first << "_LINK_LIB) $(LINK_LIB) \n"; fout << "$(" << l->first << "_LINK_LIB) import32.lib cw32mti.lib \n";
fout << "| \n\n"; fout << "| \n\n";
} }
} }
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void cmBorlandMakefileGenerator::OutputSubDirectoryRules(std::ostream& fout) void cmBorlandMakefileGenerator::OutputSubDirectoryRules(std::ostream& fout)
{ {
// output rules for decending into sub directories // output rules for decending into sub directories
const std::vector<std::string>& SubDirectories = m_Makefile->GetSubDirectories(); const std::vector<std::string>& SubDirectories = m_Makefile->GetSubDirectories();
...@@ -569,7 +589,7 @@ void cmBorlandMakefileGenerator::OutputSubDirectoryVars(std::ostream& fout, ...@@ -569,7 +589,7 @@ void cmBorlandMakefileGenerator::OutputSubDirectoryVars(std::ostream& fout,
// (tab) command... // (tab) command...
// This routine is copied direct from unix makefile generator // This routine is copied direct from unix makefile generator
void cmBorlandMakefileGenerator::OutputCustomRules(std::ostream& fout) void cmBorlandMakefileGenerator::OutputCustomRules(std::ostream& fout)
{ {
// We may be modifying the source groups temporarily, so make a copy. // We may be modifying the source groups temporarily, so make a copy.
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups(); std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
...@@ -659,8 +679,6 @@ void cmBorlandMakefileGenerator::OutputCustomRules(std::ostream& fout) ...@@ -659,8 +679,6 @@ void cmBorlandMakefileGenerator::OutputCustomRules(std::ostream& fout)
fout << "# End of source group \"" << name.c_str() << "\"\n\n"; fout << "# End of source group \"" << name.c_str() << "\"\n\n";
} }
} }
fout << "# End Custom Rules \n";
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "cmMakefile.h" #include "cmMakefile.h"
#include "cmMakefileGenerator.h" #include "cmMakefileGenerator.h"
/** \class cmBorlandMakefileGenerator /** \class cmBorlandMakefileGenerator
* \brief Write Borland BCB5 compatible makefiles. * \brief Write Borland BCB5 compatible makefiles.
* *
* cmBorlandMakefileGenerator produces Borland BCB5 compatible makefiles * cmBorlandMakefileGenerator produces Borland BCB5 compatible makefiles
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment