Browse Source

ENH: borland generator 2 is working more or less

Bill Hoffman 24 years ago
parent
commit
e7bb895afd

+ 4 - 0
Source/CMakeLib.dsp

@@ -99,6 +99,10 @@ SOURCE=.\cmBorlandMakefileGenerator.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\cmBorlandMakefileGenerator2.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=.\cmCableClassSet.cxx
 # End Source File
 # Begin Source File

+ 42 - 21
Source/cmBorlandMakefileGenerator2.cxx

@@ -52,6 +52,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 cmBorlandMakefileGenerator2::cmBorlandMakefileGenerator2()
 {
   this->SetLibraryPathOption("-L");
+  this->SetLibraryLinkOption("");
 }
 
 cmBorlandMakefileGenerator2::~cmBorlandMakefileGenerator2()
@@ -85,9 +86,6 @@ void cmBorlandMakefileGenerator2::OutputMakeVariables(std::ostream& fout)
     "# Path to cmake\n"
     "CMAKE_COMMAND = ${CMAKE_COMMAND}\n"    
     "CMAKE_STANDARD_WINDOWS_LIBRARIES = @CMAKE_STANDARD_WINDOWS_LIBRARIES@\n"
-    "FLAGS_LINK_EXE    = @FLAGS_LINK_EXE@ \n"
-    "FLAGS_LINK_LIB    = @FLAGS_LINK_LIB@ \n"
-    "FLAGS_LINK_STATIC    = @FLAGS_LINK_STATIC@ \n"
     "CMAKE_C_COMPILER    = @CMAKE_C_COMPILER@ \n"
     "CMAKE_CFLAGS        = @CMAKE_CFLAGS@ @BUILD_FLAGS@\n"
     "CMAKE_CXX_COMPILER  = @CMAKE_CXX_COMPILER@\n"
@@ -244,7 +242,7 @@ OutputBuildObjectFromSource(std::ostream& fout,
   std::string comment = "Build ";
   std::string objectFile = std::string(shortName) + 
     this->GetOutputExtension(source.GetSourceExtension().c_str());
-  
+  cmSystemTools::ConvertToWindowsSlashes(objectFile);
   comment += objectFile + "  From ";
   comment += source.GetFullPath();
   std::string compileCommand;
@@ -257,15 +255,15 @@ OutputBuildObjectFromSource(std::ostream& fout,
       {
       compileCommand += "$(CMAKE_SHLIB_CFLAGS) ";
       }
-    compileCommand += "$(INCLUDE_FLAGS) -c ";
+    compileCommand += " -o";
+    compileCommand += objectFile;
+    compileCommand += " $(INCLUDE_FLAGS) -c ";
     compileCommand += 
       cmSystemTools::EscapeSpaces(source.GetFullPath().c_str());
-    compileCommand += " /Fo";
-    compileCommand += objectFile;
     }
   else if (ext == "rc")
     {
-    compileCommand = "$(RC) /fo\"";
+    compileCommand = "$(RC) -o\"";
     compileCommand += objectFile;
     compileCommand += "\" ";
     compileCommand += 
@@ -285,11 +283,11 @@ OutputBuildObjectFromSource(std::ostream& fout,
       {
       compileCommand += "$(CMAKE_SHLIB_CFLAGS) ";
       }
-    compileCommand += "$(INCLUDE_FLAGS) -c ";
+    compileCommand += " -o";
+    compileCommand += objectFile;
+    compileCommand += " $(INCLUDE_FLAGS) -c ";
     compileCommand += 
       cmSystemTools::EscapeSpaces(source.GetFullPath().c_str());
-    compileCommand += " /Fo";
-    compileCommand += objectFile;
     }
   m_QuoteNextCommand = false;
   this->OutputMakeRule(fout,
@@ -308,32 +306,43 @@ void cmBorlandMakefileGenerator2::OutputSharedLibraryRule(std::ostream& fout,
   std::string depend = "$(";
   depend += name;
   depend += "_SRC_OBJS) $(" + std::string(name) + "_DEPEND_LIBS)";
-  std::string command = "ilink32 /dll $(FLAGS_LINK_LIB) @&&|\n";
-  command += "$(" + std::string(name) + "_SRC_OBJS) /out:";
-  std::string dllpath = m_LibraryOutputPath +  std::string(name) + ".dll ";
+  std::string command = "$(CMAKE_CXX_COMPILER) -tWD  @&&|\n";
+  std::string dllpath = m_LibraryOutputPath +  std::string(name);
+  std::string libpath = dllpath + ".lib";
+  dllpath += ".dll";
   cmSystemTools::ConvertToWindowsSlashes(dllpath);
+  // must be executable name
+  command += "-e";
   command += cmSystemTools::EscapeSpaces(dllpath.c_str());
+  command += " ";
+  // then list of object files
+  command += " $(" + std::string(name) + "_SRC_OBJS) ";
   std::strstream linklibs;
   this->OutputLinkLibraries(linklibs, name, t);
   linklibs << std::ends;
+  // then the linker options -L and libraries (any other order will fail!)
   command += linklibs.str();
   delete [] linklibs.str();
+  std::string command2 = "implib -w ";
+  command2 += libpath + " " + dllpath;
   const std::vector<cmSourceFile>& sources = t.GetSourceFiles();
   for(std::vector<cmSourceFile>::const_iterator i = sources.begin();
       i != sources.end(); ++i)
     {
     if(i->GetSourceExtension() == "def")
       {
-      command += "/DEF:";
+      command += "";
       command += i->GetFullPath();
       }
     }
   command += "\n|\n";
   m_QuoteNextCommand = false;
+    
   this->OutputMakeRule(fout, "rules for a shared library",
                        target.c_str(),
                        depend.c_str(),
-                       command.c_str());
+                       command.c_str(),
+                       command2.c_str());
 }
 
 void cmBorlandMakefileGenerator2::OutputModuleLibraryRule(std::ostream& fout, 
@@ -350,12 +359,14 @@ void cmBorlandMakefileGenerator2::OutputStaticLibraryRule(std::ostream& fout,
   std::string target = m_LibraryOutputPath + std::string(name) + ".lib";
   std::string depend = "$(";
   depend += std::string(name) + "_SRC_OBJS)";
-  std::string command = "tlib $(FLAGS_LINK_STATIC)  @&&|\n\t /u ";
-  std::string deleteCommand = "del ";
-  deleteCommand += target;
+  std::string command = "tlib  @&&|\n\t /u ";
   std::string libpath = m_LibraryOutputPath + std::string(name) + ".lib";
   cmSystemTools::ConvertToWindowsSlashes(libpath);
   command += cmSystemTools::EscapeSpaces(libpath.c_str());
+  std::string deleteCommand = "if exist ";
+  deleteCommand +=  libpath;
+  deleteCommand += " del ";
+  deleteCommand += libpath;
   command += " $(";
   command += std::string(name) + "_SRC_OBJS)";
   command += "\n|\n";
@@ -380,7 +391,6 @@ void cmBorlandMakefileGenerator2::OutputExecutableRule(std::ostream& fout,
   depend += std::string(name) + "_SRC_OBJS) $(" + std::string(name) + "_DEPEND_LIBS)";
   std::string command = 
     "$(CMAKE_CXX_COMPILER) ";
-  command += "$(" + std::string(name) + "_SRC_OBJS) ";
   std::string path = m_ExecutableOutputPath + name + ".exe";
   command += " -e" + 
     cmSystemTools::EscapeSpaces(path.c_str());
@@ -392,11 +402,13 @@ void cmBorlandMakefileGenerator2::OutputExecutableRule(std::ostream& fout,
     {
     command += " -tWC ";
     }
-  
   std::strstream linklibs;
   this->OutputLinkLibraries(linklibs, 0, t);
   linklibs << std::ends;
   command += linklibs.str();
+  delete [] linklibs.str();
+  command += " $(" + std::string(name) + "_SRC_OBJS) ";
+  
   std::string comment = "rule to build executable: ";
   comment += name;
   m_QuoteNextCommand = false;
@@ -450,3 +462,12 @@ void cmBorlandMakefileGenerator2::OutputBuildLibraryInDir(std::ostream& fout,
 {
   cmNMakeMakefileGenerator::OutputBuildLibraryInDir(fout, path, s, fullpath);
 }
+
+
+std::string cmBorlandMakefileGenerator2::ConvertToNativePath(const char* s)
+{
+  std::string ret = s;
+  cmSystemTools::ConvertToWindowsSlashes(ret);
+  return ret;
+}
+

+ 2 - 0
Source/cmBorlandMakefileGenerator2.h

@@ -102,6 +102,8 @@ protected:
 				       const char* fullpath); 
   ///! return true if the two paths are the same (checks short paths)
   virtual bool SamePath(const char* path1, const char* path2);
+  virtual std::string ConvertToNativePath(const char* s);
+
 private:
   bool m_QuoteNextCommand;      // if this is true, OutputMakeRule
                                 // will not quote the next commands

+ 2 - 0
Source/cmNMakeMakefileGenerator.cxx

@@ -482,6 +482,7 @@ void cmNMakeMakefileGenerator::OutputLinkLibraries(std::ostream& fout,
     if(emitted.insert(libpath).second)
       {
       linkLibs += m_LibraryPathOption;
+      cmSystemTools::ConvertToWindowsSlashes(libpath);
       linkLibs += libpath;
       linkLibs += " ";
       }
@@ -514,6 +515,7 @@ void cmNMakeMakefileGenerator::OutputLinkLibraries(std::ostream& fout,
 	}
       else
 	{
+        librariesLinked += m_LibraryLinkOption;
 	librariesLinked += lib->first;
 	librariesLinked += ".lib ";
 	}

+ 3 - 1
Source/cmNMakeMakefileGenerator.h

@@ -109,12 +109,14 @@ protected:
   ///! return true if the two paths are the same (checks short paths)
   virtual bool SamePath(const char* path1, const char* path2);
   void SetLibraryPathOption(const char* lib){ m_LibraryPathOption = lib;}
+  void SetLibraryLinkOption(const char* lib){ m_LibraryLinkOption = lib;}
 private:
   bool m_QuoteNextCommand;      // if this is true, OutputMakeRule
                                 // will not quote the next commands
                                 // it is reset to false after each
                                 // call to OutputMakeRule
-  std::string m_LibraryPathOption;
+  std::string m_LibraryPathOption;// option to specifiy a link path -LIBPATH 
+  std::string m_LibraryLinkOption; // option to specify a library (like -l, empty for nmake)
 };
 
 #endif

+ 1 - 1
Source/cmUnixMakefileGenerator.cxx

@@ -367,7 +367,7 @@ void cmUnixMakefileGenerator::OutputTargetRules(std::ostream& fout)
               std::string outExt(this->GetOutputExtension(i->GetSourceExtension().c_str()));
               if(outExt.size())
                 {
-                fout << "\\\n" << i->GetSourceName() 
+                fout << "\\\n" << this->ConvertToNativePath(i->GetSourceName().c_str())
                      << outExt.c_str() << " ";
                 }
               }

+ 1 - 0
Source/cmUnixMakefileGenerator.h

@@ -164,6 +164,7 @@ protected:
   void SetStaticLibraryExtension(const char* e) {m_StaticLibraryExtension = e;}
   void SetSharedLibraryExtension(const char* e) {m_SharedLibraryExtension = e;}
   void SetLibraryPrefix(const char* e) { m_LibraryPrefix = e;}
+  virtual std::string ConvertToNativePath(const char* s) { return s;  }
 protected:
   std::string m_ExecutableOutputPath;
   std::string m_LibraryOutputPath;

+ 40 - 0
Templates/CMakeWindowsBorlandConfig2.cmake

@@ -0,0 +1,40 @@
+# microsoft specific config file 
+
+FIND_PATH(BCB_BIN_PATH bcc32.exe
+  "C:/Program Files/Borland/CBuilder5/Bin"
+  "C:/Borland/Bcc55/Bin"
+  "/Borland/Bcc55/Bin"
+  [HKEY_LOCAL_MACHINE/SOFTWARE/Borland/C++Builder/5.0/RootDir]/Bin
+)
+
+SET (WORDS_BIGENDIAN )
+SET (HAVE_LIMITS_H   1)
+SET (HAVE_UNISTD_H   1)
+SET (CMAKE_CXX_COMPILER  "${BCB_BIN_PATH}/bcc32" CACHE FILEPATH
+     "Name of C++ compiler used.")
+SET (CMAKE_C_COMPILER ${BCB_BIN_PATH}/bcc32  CACHE FILEPATH
+     "Name of C compiler used.")
+SET (CMAKE_CFLAGS  "-w- -whid -waus -wpar" CACHE STRING
+     "Flags for C compiler.")
+SET (CMAKE_BUILD_TYPE Debug CACHE STRING 
+"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel")
+SET (CMAKE_CXX_FLAGS_RELEASE "-O2" CACHE STRING
+        "Flags used by the compiler during release builds.)")
+SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-Od" CACHE STRING
+        "Flags used by the compiler during Release with Debug Info builds")
+SET (CMAKE_CXX_FLAGS_MINSIZEREL "-O1" CACHE STRING
+        "Flags used by the compiler during release minsize builds")
+SET (CMAKE_CXX_FLAGS_DEBUG "-Od" CACHE STRING
+        "Flags used by the compiler during debug builds")
+SET (CMAKE_CXX_FLAGS "-w- -whid -waus -wpar" CACHE STRING
+        "Flags used by the compiler during all build types, /GX /GR are for exceptions and rtti in VC++, /Zm1000 increases the compiler's memory allocation to support ANSI C++/stdlib")
+SET (CMAKE_USE_WIN32_THREADS 1 CACHE BOOL "Use the win32 thread library")
+SET (CMAKE_STANDARD_WINDOWS_LIBRARIES "import32.lib"
+         CACHE STRING "Libraries linked by defalut with all applications")
+SET (CMAKE_SHLIB_SUFFIX       ".dll" CACHE STRING "Shared library suffix")
+SET (CMAKE_MODULE_SUFFIX      ".dll" CACHE STRING "Module library suffix")
+
+FIND_PROGRAM(CMAKE_MAKE_PROGRAM make ${BCB_BIN_PATH} )
+
+
+