2001-11-28 19:12:15 +03:00
/*=========================================================================
Program : Insight Segmentation & Registration Toolkit
Module : $ RCSfile $
Language : C + +
Date : $ Date $
Version : $ Revision $
Copyright ( c ) 2001 Insight Consortium
All rights reserved .
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions are met :
* Redistributions of source code must retain the above copyright notice ,
this list of conditions and the following disclaimer .
* Redistributions in binary form must reproduce the above copyright notice ,
this list of conditions and the following disclaimer in the documentation
and / or other materials provided with the distribution .
* The name of the Insight Consortium , nor the names of any consortium members ,
nor of any contributors , may be used to endorse or promote products derived
from this software without specific prior written permission .
* Modified source versions must be plainly marked as such , and must not be
misrepresented as being the original software .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ` ` AS IS ' '
AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED . IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY ,
OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
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"
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 = " $( " ;
depend + = name ;
depend + = " _SRC_OBJS) $( " + std : : string ( 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 ( ) ;
2001-11-29 17:09:11 +03:00
// then list of object files
command + = " $( " + std : : string ( 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 = " $( " ;
depend + = std : : string ( 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 + = " $( " ;
command + = std : : string ( name ) + " _SRC_OBJS) " ;
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 = " $( " ;
depend + = std : : string ( name ) + " _SRC_OBJS) $( " + std : : string ( name ) + " _DEPEND_LIBS) " ;
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 ( ) ;
command + = " $( " + std : : string ( name ) + " _SRC_OBJS) " ;
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