2001-11-28 19:12:15 +03:00
/*=========================================================================
Program : Insight Segmentation & Registration Toolkit
Module : $ RCSfile $
Language : C + +
Date : $ Date $
Version : $ Revision $
2002-01-21 23:30:43 +03:00
Copyright ( c ) 2002 Insight Consortium . All rights reserved .
See ITKCopyright . txt or http : //www.itk.org/HTML/Copyright.htm for details.
2001-11-28 19:12:15 +03:00
2002-01-21 23:30:43 +03:00
This software is distributed WITHOUT ANY WARRANTY ; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE . See the above copyright notices for more information .
2001-11-28 19:12:15 +03:00
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
2001-12-01 00:48:52 +03:00
# include "cmBorlandMakefileGenerator.h"
2001-11-28 19:12:15 +03:00
# include "cmMakefile.h"
# include "cmStandardIncludes.h"
# include "cmSystemTools.h"
# include "cmSourceFile.h"
# include "cmMakeDepend.h"
# include "cmCacheManager.h"
# include "cmGeneratedFileStream.h"
# include "windows.h"
2002-02-21 23:55:20 +03:00
# include <stdio.h>
2001-11-28 19:12:15 +03:00
2001-12-01 00:48:52 +03:00
cmBorlandMakefileGenerator : : cmBorlandMakefileGenerator ( )
2001-11-28 19:12:15 +03:00
{
this - > SetLibraryPathOption ( " -L " ) ;
2001-11-29 02:07:27 +03:00
this - > SetLibraryLinkOption ( " " ) ;
2001-11-28 19:12:15 +03:00
}
2001-12-01 00:48:52 +03:00
cmBorlandMakefileGenerator : : ~ cmBorlandMakefileGenerator ( )
2001-11-28 19:12:15 +03:00
{
}
2001-12-01 00:48:52 +03:00
void cmBorlandMakefileGenerator : : ComputeSystemInfo ( )
2001-11-28 19:12:15 +03:00
{
// now load the settings
if ( ! m_Makefile - > GetDefinition ( " CMAKE_ROOT " ) )
{
cmSystemTools : : Error (
" CMAKE_ROOT has not been defined, bad GUI or driver program " ) ;
return ;
}
2001-12-07 18:58:06 +03:00
std : : string outdir = m_Makefile - > GetCurrentOutputDirectory ( ) ;
if ( outdir . find ( ' - ' ) ! = std : : string : : npos )
{
std : : string message = " The Borland command line tools do not support path names that have - in them. Please re-name your output directory and use _ instead of -. " ;
message + = " \n Your path currently is: " ;
message + = outdir ;
cmSystemTools : : Error ( message . c_str ( ) ) ;
}
2001-11-28 19:12:15 +03:00
std : : string fpath =
m_Makefile - > GetDefinition ( " CMAKE_ROOT " ) ;
2001-12-01 00:48:52 +03:00
fpath + = " /Templates/CMakeBorlandWindowsSystemConfig.cmake " ;
2001-11-28 19:12:15 +03:00
m_Makefile - > ReadListFile ( NULL , fpath . c_str ( ) ) ;
}
2001-12-01 00:48:52 +03:00
void cmBorlandMakefileGenerator : : OutputMakeVariables ( std : : ostream & fout )
2001-11-28 19:12:15 +03:00
{
fout < < " # NMake Makefile generated by cmake \n " ;
const char * variables =
" # general varibles used in the makefile \n "
" \n "
" CMAKE_STANDARD_WINDOWS_LIBRARIES = @CMAKE_STANDARD_WINDOWS_LIBRARIES@ \n "
2001-11-30 04:59:53 +03:00
" CMAKE_C_FLAGS = @CMAKE_C_FLAGS@ @BUILD_FLAGS@ \n "
2001-11-30 07:24:37 +03:00
" CMAKE_OBJECT_FILE_SUFFIX = @CMAKE_OBJECT_FILE_SUFFIX@ \n "
" CMAKE_EXECUTABLE_SUFFIX = @CMAKE_EXECUTABLE_SUFFIX@ \n "
" CMAKE_STATICLIB_SUFFIX = @CMAKE_STATICLIB_SUFFIX@ \n "
2001-12-04 01:01:40 +03:00
" CMAKE_SHLIB_SUFFIX = @CMAKE_SHLIB_SUFFIX@ \n "
2002-01-13 06:55:35 +03:00
" CMAKE_SHLIB_CFLAGS = -tWR \n "
2001-12-04 01:01:40 +03:00
" CMAKE_LINKER_FLAGS = @CMAKE_LINKER_FLAGS@ @LINKER_BUILD_FLAGS@ \n "
2001-12-18 18:21:59 +03:00
" CMAKE_CXX_FLAGS = -P @CMAKE_CXX_FLAGS@ @BUILD_FLAGS@ \n "
2001-12-21 01:00:52 +03:00
" !IF \" $(OS) \" == \" Windows_NT \" \n "
" NULL= \n "
" !ELSE \n "
" NULL=nul \n "
" !ENDIF \n "
2001-12-20 02:45:22 +03:00
" RM = del \n " ;
2001-11-28 19:12:15 +03:00
std : : string buildType = " CMAKE_CXX_FLAGS_ " ;
buildType + = m_Makefile - > GetDefinition ( " CMAKE_BUILD_TYPE " ) ;
buildType = cmSystemTools : : UpperCase ( buildType ) ;
m_Makefile - > AddDefinition ( " BUILD_FLAGS " ,
m_Makefile - > GetDefinition (
buildType . c_str ( ) ) ) ;
2001-12-04 01:01:40 +03:00
buildType = " CMAKE_LINKER_FLAGS_ " ;
buildType + = m_Makefile - > GetDefinition ( " CMAKE_BUILD_TYPE " ) ;
buildType = cmSystemTools : : UpperCase ( buildType ) ;
m_Makefile - > AddDefinition ( " LINKER_BUILD_FLAGS " ,
m_Makefile - > GetDefinition (
buildType . c_str ( ) ) ) ;
2001-11-28 19:12:15 +03:00
std : : string replaceVars = variables ;
m_Makefile - > ExpandVariablesInString ( replaceVars ) ;
2001-11-30 07:24:37 +03:00
std : : string ccompiler = m_Makefile - > GetDefinition ( " CMAKE_C_COMPILER " ) ;
cmSystemTools : : ConvertToWindowsSlashes ( ccompiler ) ;
fout < < " CMAKE_C_COMPILER = " < < cmSystemTools : : EscapeSpaces ( ccompiler . c_str ( ) )
< < " \n " ;
std : : string cxxcompiler = m_Makefile - > GetDefinition ( " CMAKE_CXX_COMPILER " ) ;
cmSystemTools : : ConvertToWindowsSlashes ( cxxcompiler ) ;
fout < < " CMAKE_CXX_COMPILER = " < < cmSystemTools : : EscapeSpaces ( cxxcompiler . c_str ( ) )
< < " \n " ;
std : : string cmakecommand = m_Makefile - > GetDefinition ( " CMAKE_COMMAND " ) ;
cmSystemTools : : ConvertToWindowsSlashes ( cmakecommand ) ;
fout < < " CMAKE_COMMAND = " < < cmSystemTools : : EscapeSpaces ( cmakecommand . c_str ( ) ) < < " \n " ;
2001-11-28 19:12:15 +03:00
fout < < replaceVars . c_str ( ) ;
fout < < " CMAKE_CURRENT_SOURCE = "
< < ShortPath ( m_Makefile - > GetStartDirectory ( ) )
< < " \n " ;
fout < < " CMAKE_CURRENT_BINARY = "
< < ShortPath ( m_Makefile - > GetStartOutputDirectory ( ) )
< < " \n " ;
fout < < " CMAKE_SOURCE_DIR = "
< < ShortPath ( m_Makefile - > GetHomeDirectory ( ) ) < < " \n " ;
fout < < " CMAKE_BINARY_DIR = "
< < ShortPath ( m_Makefile - > GetHomeOutputDirectory ( ) )
< < " \n " ;
// Output Include paths
fout < < " INCLUDE_FLAGS = " ;
std : : vector < std : : string > & includes = m_Makefile - > GetIncludeDirectories ( ) ;
std : : vector < std : : string > : : iterator i ;
fout < < " -I " < < cmSystemTools : : EscapeSpaces ( m_Makefile - > GetStartDirectory ( ) ) < < " " ;
for ( i = includes . begin ( ) ; i ! = includes . end ( ) ; + + i )
{
std : : string include = * i ;
// Don't output a -I for the standard include path "/usr/include".
// This can cause problems with certain standard library
// implementations because the wrong headers may be found first.
if ( include ! = " /usr/include " )
{
fout < < " -I " < < cmSystemTools : : EscapeSpaces ( i - > c_str ( ) ) . c_str ( ) < < " " ;
}
}
fout < < m_Makefile - > GetDefineFlags ( ) ;
fout < < " \n \n " ;
}
void
2001-12-01 00:48:52 +03:00
cmBorlandMakefileGenerator : :
2001-11-28 19:12:15 +03:00
OutputBuildObjectFromSource ( std : : ostream & fout ,
const char * shortName ,
const cmSourceFile & source ,
const char * extraCompileFlags ,
bool shared )
2001-12-28 23:58:21 +03:00
{
2002-01-13 06:55:35 +03:00
// force shared flag if building shared libraries
if ( cmSystemTools : : IsOn ( m_Makefile - > GetDefinition ( " BUILD_SHARED_LIBS " ) ) )
{
shared = true ;
}
2001-12-28 23:58:21 +03:00
// Header files shouldn't have build rules.
if ( source . IsAHeaderFileOnly ( ) )
return ;
2001-11-28 19:12:15 +03:00
std : : string comment = " Build " ;
std : : string objectFile = std : : string ( shortName ) +
this - > GetOutputExtension ( source . GetSourceExtension ( ) . c_str ( ) ) ;
2001-11-29 02:07:27 +03:00
cmSystemTools : : ConvertToWindowsSlashes ( objectFile ) ;
2001-11-28 19:12:15 +03:00
comment + = objectFile + " From " ;
comment + = source . GetFullPath ( ) ;
std : : string compileCommand ;
std : : string ext = source . GetSourceExtension ( ) ;
if ( ext = = " c " )
{
2001-11-30 04:59:53 +03:00
compileCommand = " $(CMAKE_C_COMPILER) $(CMAKE_C_FLAGS) " ;
2001-11-28 19:12:15 +03:00
compileCommand + = extraCompileFlags ;
if ( shared )
{
compileCommand + = " $(CMAKE_SHLIB_CFLAGS) " ;
}
2001-11-29 02:07:27 +03:00
compileCommand + = " -o " ;
compileCommand + = objectFile ;
compileCommand + = " $(INCLUDE_FLAGS) -c " ;
2001-11-28 19:12:15 +03:00
compileCommand + =
cmSystemTools : : EscapeSpaces ( source . GetFullPath ( ) . c_str ( ) ) ;
}
else if ( ext = = " rc " )
{
2001-11-29 02:07:27 +03:00
compileCommand = " $(RC) -o \" " ;
2001-11-28 19:12:15 +03:00
compileCommand + = objectFile ;
compileCommand + = " \" " ;
compileCommand + =
cmSystemTools : : EscapeSpaces ( source . GetFullPath ( ) . c_str ( ) ) ;
}
else if ( ext = = " def " )
{
// no rule to output for this one
return ;
}
// assume c++ if not c rc or def
else
{
2001-12-01 00:05:55 +03:00
compileCommand = " $(CMAKE_CXX_COMPILER) $(CMAKE_CXX_FLAGS) " ;
2001-11-28 19:12:15 +03:00
compileCommand + = extraCompileFlags ;
if ( shared )
{
compileCommand + = " $(CMAKE_SHLIB_CFLAGS) " ;
}
2001-11-29 02:07:27 +03:00
compileCommand + = " -o " ;
compileCommand + = objectFile ;
compileCommand + = " $(INCLUDE_FLAGS) -c " ;
2001-11-28 19:12:15 +03:00
compileCommand + =
cmSystemTools : : EscapeSpaces ( source . GetFullPath ( ) . c_str ( ) ) ;
}
this - > OutputMakeRule ( fout ,
comment . c_str ( ) ,
objectFile . c_str ( ) ,
cmSystemTools : : EscapeSpaces (
source . GetFullPath ( ) . c_str ( ) ) . c_str ( ) ,
compileCommand . c_str ( ) ) ;
}
2001-12-01 00:48:52 +03:00
void cmBorlandMakefileGenerator : : OutputSharedLibraryRule ( std : : ostream & fout ,
2001-11-28 19:12:15 +03:00
const char * name ,
const cmTarget & t )
{
2001-11-30 07:24:37 +03:00
std : : string target = m_LibraryOutputPath + name ;
std : : string libpath = target + " .lib " ;
target + = " .dll " ;
cmSystemTools : : ConvertToWindowsSlashes ( libpath ) ;
cmSystemTools : : ConvertToWindowsSlashes ( target ) ;
target = cmSystemTools : : EscapeSpaces ( target . c_str ( ) ) ;
libpath = cmSystemTools : : EscapeSpaces ( libpath . c_str ( ) ) ;
2001-11-28 19:12:15 +03:00
std : : string depend = " $( " ;
2002-02-21 23:55:20 +03:00
depend + = this - > CreateMakeVariable ( name , " _SRC_OBJS " ) ;
depend + = " ) $( " + this - > CreateMakeVariable ( name , " _DEPEND_LIBS " ) + " ) " ;
2002-01-13 06:55:35 +03:00
std : : string command = " $(CMAKE_CXX_COMPILER) -tWD $(CMAKE_SHLIB_CFLAGS) $(CMAKE_LINKER_FLAGS) @&&| \n " ;
2001-11-29 02:07:27 +03:00
// must be executable name
command + = " -e " ;
2001-11-30 07:24:37 +03:00
command + = target ;
2001-11-29 02:07:27 +03:00
command + = " " ;
2001-11-28 19:12:15 +03:00
std : : strstream linklibs ;
this - > OutputLinkLibraries ( linklibs , name , t ) ;
linklibs < < std : : ends ;
2001-11-29 02:07:27 +03:00
// then the linker options -L and libraries (any other order will fail!)
2001-11-28 19:12:15 +03:00
command + = linklibs . str ( ) ;
delete [ ] linklibs . str ( ) ;
2002-02-21 23:55:20 +03:00
// then list of object files
command + = " $( " + this - > CreateMakeVariable ( name , " _SRC_OBJS " ) + " ) " ;
2001-11-29 02:07:27 +03:00
std : : string command2 = " implib -w " ;
2001-11-30 07:24:37 +03:00
command2 + = libpath + " " + target ;
2001-11-28 19:12:15 +03:00
const std : : vector < cmSourceFile > & sources = t . GetSourceFiles ( ) ;
for ( std : : vector < cmSourceFile > : : const_iterator i = sources . begin ( ) ;
i ! = sources . end ( ) ; + + i )
{
if ( i - > GetSourceExtension ( ) = = " def " )
{
2001-11-29 02:07:27 +03:00
command + = " " ;
2001-11-28 19:12:15 +03:00
command + = i - > GetFullPath ( ) ;
}
}
command + = " \n | \n " ;
2001-11-29 02:07:27 +03:00
2001-12-07 18:58:06 +03:00
std : : string customCommands = this - > CreateTargetRules ( t , name ) ;
const char * cc = 0 ;
if ( customCommands . size ( ) > 0 )
{
cc = customCommands . c_str ( ) ;
}
2001-11-28 19:12:15 +03:00
this - > OutputMakeRule ( fout , " rules for a shared library " ,
target . c_str ( ) ,
depend . c_str ( ) ,
2001-11-29 02:07:27 +03:00
command . c_str ( ) ,
2001-12-07 18:58:06 +03:00
command2 . c_str ( ) ,
cc ) ;
2001-11-28 19:12:15 +03:00
}
2001-12-01 00:48:52 +03:00
void cmBorlandMakefileGenerator : : OutputModuleLibraryRule ( std : : ostream & fout ,
2001-11-28 19:12:15 +03:00
const char * name ,
const cmTarget & target )
{
this - > OutputSharedLibraryRule ( fout , name , target ) ;
}
2001-12-01 00:48:52 +03:00
void cmBorlandMakefileGenerator : : OutputStaticLibraryRule ( std : : ostream & fout ,
2001-11-28 19:12:15 +03:00
const char * name ,
2001-12-07 18:58:06 +03:00
const cmTarget & t )
2001-11-28 19:12:15 +03:00
{
std : : string target = m_LibraryOutputPath + std : : string ( name ) + " .lib " ;
2001-11-30 07:24:37 +03:00
cmSystemTools : : ConvertToWindowsSlashes ( target ) ;
target = cmSystemTools : : EscapeSpaces ( target . c_str ( ) ) ;
2001-11-28 19:12:15 +03:00
std : : string depend = " $( " ;
2002-02-21 23:55:20 +03:00
depend + = this - > CreateMakeVariable ( name , " _SRC_OBJS " ) + " ) " ;
2002-01-09 01:18:51 +03:00
std : : string command = " tlib @&&| \n \t /p512 /a " ;
2001-11-30 07:24:37 +03:00
command + = target ;
2001-12-20 23:45:37 +03:00
command + = " " ;
2001-11-29 02:07:27 +03:00
std : : string deleteCommand = " if exist " ;
2001-11-30 07:24:37 +03:00
deleteCommand + = target ;
2001-11-29 02:07:27 +03:00
deleteCommand + = " del " ;
2001-11-30 07:24:37 +03:00
deleteCommand + = target ;
2001-12-20 23:45:37 +03:00
2001-11-28 19:12:15 +03:00
command + = " $( " ;
2002-02-21 23:55:20 +03:00
command + = this - > CreateMakeVariable ( name , " _SRC_OBJS_QUOTED " ) + " ) " ;
2001-11-28 19:12:15 +03:00
command + = " \n | \n " ;
std : : string comment = " rule to build static library: " ;
comment + = name ;
2001-12-07 18:58:06 +03:00
std : : string customCommands = this - > CreateTargetRules ( t , name ) ;
const char * cc = 0 ;
if ( customCommands . size ( ) > 0 )
{
cc = customCommands . c_str ( ) ;
}
2001-11-28 19:12:15 +03:00
this - > OutputMakeRule ( fout ,
comment . c_str ( ) ,
target . c_str ( ) ,
depend . c_str ( ) ,
deleteCommand . c_str ( ) ,
2001-12-07 18:58:06 +03:00
command . c_str ( ) , cc ) ;
2001-11-28 19:12:15 +03:00
}
2001-12-01 00:48:52 +03:00
void cmBorlandMakefileGenerator : : OutputExecutableRule ( std : : ostream & fout ,
2001-11-28 19:12:15 +03:00
const char * name ,
const cmTarget & t )
{
2001-11-30 07:24:37 +03:00
std : : string target = m_ExecutableOutputPath + name + m_ExecutableExtension ;
cmSystemTools : : ConvertToWindowsSlashes ( target ) ;
target = cmSystemTools : : EscapeSpaces ( target . c_str ( ) ) ;
2001-11-28 19:12:15 +03:00
std : : string depend = " $( " ;
2002-02-21 23:55:20 +03:00
depend + = this - > CreateMakeVariable ( name , " _SRC_OBJS " ) + " ) $( " +
this - > CreateMakeVariable ( name , " _DEPEND_LIBS " ) + " ) " ;
2001-11-28 19:12:15 +03:00
std : : string command =
" $(CMAKE_CXX_COMPILER) " ;
2001-12-04 01:01:40 +03:00
command + = " $(CMAKE_LINKER_FLAGS) -e " + target ;
2002-01-13 06:55:35 +03:00
if ( cmSystemTools : : IsOn ( m_Makefile - > GetDefinition ( " BUILD_SHARED_LIBS " ) ) )
{
command + = " $(CMAKE_SHLIB_CFLAGS) " ;
}
2001-11-28 19:12:15 +03:00
if ( t . GetType ( ) = = cmTarget : : WIN32_EXECUTABLE )
{
command + = " -tWM " ;
}
else
{
command + = " -tWC " ;
}
std : : strstream linklibs ;
this - > OutputLinkLibraries ( linklibs , 0 , t ) ;
linklibs < < std : : ends ;
command + = linklibs . str ( ) ;
2001-11-29 02:07:27 +03:00
delete [ ] linklibs . str ( ) ;
2002-02-21 23:55:20 +03:00
command + = " $( " + this - > CreateMakeVariable ( name , " _SRC_OBJS " ) + " ) " ;
2001-11-29 02:07:27 +03:00
2001-11-28 19:12:15 +03:00
std : : string comment = " rule to build executable: " ;
comment + = name ;
2001-12-07 18:58:06 +03:00
std : : string customCommands = this - > CreateTargetRules ( t , name ) ;
const char * cc = 0 ;
if ( customCommands . size ( ) > 0 )
{
cc = customCommands . c_str ( ) ;
}
2001-11-28 19:12:15 +03:00
this - > OutputMakeRule ( fout ,
comment . c_str ( ) ,
target . c_str ( ) ,
depend . c_str ( ) ,
2001-12-07 18:58:06 +03:00
command . c_str ( ) , cc ) ;
2001-11-28 19:12:15 +03:00
}
2001-12-01 00:48:52 +03:00
std : : string cmBorlandMakefileGenerator : : GetOutputExtension ( const char * s )
2001-11-28 19:12:15 +03:00
{
std : : string sourceExtension = s ;
if ( sourceExtension = = " def " )
{
return " " ;
}
if ( sourceExtension = = " ico " | | sourceExtension = = " rc2 " )
{
return " " ;
}
if ( sourceExtension = = " rc " )
{
return " .res " ;
}
return " .obj " ;
}
2001-12-01 00:48:52 +03:00
bool cmBorlandMakefileGenerator : : SamePath ( const char * path1 , const char * path2 )
2001-11-28 19:12:15 +03:00
{
// first check to see if they are the same anyway
if ( strcmp ( path1 , path2 ) = = 0 )
{
return true ;
}
// next short path and lower case both of them for the compare
return
cmSystemTools : : LowerCase ( ShortPath ( path1 ) ) = =
cmSystemTools : : LowerCase ( ShortPath ( path2 ) ) ;
}
2001-11-29 02:07:27 +03:00
2002-02-21 23:55:20 +03:00
// borland make does not support variables that are longer than 32
// so use this function to rename any long ones
std : : string cmBorlandMakefileGenerator : : CreateMakeVariable ( const char * s , const char * s2 )
{
std : : string unmodified = s ;
unmodified + = s2 ;
// see if th
if ( m_MakeVariableMap . count ( unmodified ) )
{
return m_MakeVariableMap [ unmodified ] ;
}
std : : string ret = unmodified ;
// if the string is greater the 32 chars it is an invalid vairable name
// for borland make
if ( ret . size ( ) > 32 )
{
std : : string str1 = s ;
std : : string str2 = s2 ;
// we must shorten the combined string by 4 charactors
// keep no more than 24 charactors from the second string
if ( str2 . size ( ) > 24 )
{
str2 = str2 . substr ( 0 , 24 ) ;
}
if ( str1 . size ( ) + str2 . size ( ) > 27 )
{
str1 = str1 . substr ( 0 , 27 - str2 . size ( ) ) ;
}
char buffer [ 5 ] ;
int i = 0 ;
sprintf ( buffer , " %04d " , i ) ;
ret = str1 + str2 + buffer ;
while ( m_ShortMakeVariableMap . count ( ret ) & & i < 1000 )
{
+ + i ;
sprintf ( buffer , " %04d " , i ) ;
ret = str1 + str2 + buffer ;
}
if ( i = = 1000 )
{
cmSystemTools : : Error ( " Borland makefile varible length too long " ) ;
return unmodified ;
}
// once an unused variable is found
m_ShortMakeVariableMap [ ret ] = " 1 " ;
}
// always make an entry into the unmodified to varible map
m_MakeVariableMap [ unmodified ] = ret ;
return ret ;
}