Главная страница | назад





Article #16639: How to rebuild the obsolete classlib libraries

 Question and Answer Database

FAQ1639C.txt   How to rebuild the obsolete classlib libraries
Category   :Command Line Tools
Platform    :All
Product    :   BC++4.5x   BC++5.x

Question:

How to rebuild the obsolete classlib libraries that ship
with BC++4.0x, BC++4.5X, and BC++5.0x.

Answer:

*NOTE: The make file that is found in the source\classlib
directory needs to be edited to allow for the rebuild to 
include the obsolete classes.

add:

PFX=.PATH.cpo

to the Building various file lists portion of the make file.

change:

.cpo.obj:
    $(BCC) $(WFLAG) -P {$& }

to:

.cpo.obj:
    $(BCC) $(WFLAG) -P {$< }

found near the end of the file.
*NOTE This will only be needed in the BC++5,0x versions

The commad line for rebuilding the libraries is:

make -B -r -DDOS -DMODEL=x -DNAME=xxxxxx -DOBJECTS

*NOTE replace 'x' with the memory model, and the file name
for the library you wish to build.


This is a full listing of the makefile

#--------------------------------------------------------------------------#
#                                                                          #
#   MAKEFILE for Class Libraries                                           #
#                                                                          #
#   Copyright (c) Borland International 1991, 1994                         #
#   All Rights Reserved                                                    #
#                                                                          #
#   Usage:                                                                 #
#                                                                          #
#       maker options                                                      #
#                                                                          #
#   Options:                                                               #
#                                                                          #
#       -DDOS, -DWIN32, -DOS2   Specifies target system                    #
#                                                                          #
#       -DMT                    Build multi-thread version                 #
#                                                                          #
#       -DMODEL=x               Specifies memory model for DOS library.    #
#                               Required when building DOS library.        #
#                               Must be s, c, m, l, or h.                  #
#                                                                          #
#       -DNAME=xxx              Base name of the target library or DLL     #
#                               Always required.                           #
#                                                                          #
#       -DSUFFIX=xxx            Suffix to add to the base name when        #
#                               building a DLL. For example, -DSUFFIX=d is #
#                               used when building the DBG DLLs. This puts #
#                               'd' into the name of the dll and the name  #
#                               of the import library.                     #
#                                                                          #
#       -DDLL                   Build a DLL.                               #
#                                                                          #
#       -DDBG                   Build the debugging version of the target. #
#                                                                          #
#       -DOBJECTS               Also build the object-based containers     #
#                                                                          #
#       -DBIDSFARVTABLE         moves class vtables out of dgroup          #
#                                                                          #
#   16-bit non-diagnostic static libraries:                                #
#   make -r -DDOS -DMODEL=s -DNAME=bidss                                   #
#   make -r -DDOS -DMODEL=c -DNAME=bidsc                                   #
#   make -r -DDOS -DMODEL=m -DNAME=bidsm                                   #
#   make -r -DDOS -DMODEL=l -DNAME=bidsl                                   #
#   make -r -DDOS -DMODEL=h -DNAME=bidsh                                   #
#                                                                          #
#   16-bit diagnostic static libraries:                                    #
#   make -r -DDOS -DMODEL=s -DDBG -DNAME=bidsdbs                           #
#   make -r -DDOS -DMODEL=c -DDBG -DNAME=bidsdbc                           #
#   make -r -DDOS -DMODEL=m -DDBG -DNAME=bidsdbm                           #
#   make -r -DDOS -DMODEL=l -DDBG -DNAME=bidsdbl                           #
#   make -r -DDOS -DMODEL=h -DDBG -DNAME=bidsdbh                           #
#                                                                          #
#   16-bit DLLs:                                                           #
#   make -r -DDOS -DDLL -DNAME=bids                                        #
#   make -r -DDOS -DDLL -DDBG -DNAME=bids -DSUFFIX=d                       #
#                                                                          #
#   WIN32 libraries:                                                       #
#   make -r -DWIN32 -DNAME=bidsf                                           #
#   make -r -DWIN32 -DDBG -DNAME=bidsdf                                    #
#                                                                          #
#   WIN32 DLLs:                                                            #
#   make -r -DWIN32 -DDLL -DNAME=bids -DSUFFIX=f                           #
#   make -r -DWIN32 -DDLL -DDBG -DNAME=bids -DSUFFIX=df                    #
#                                                                          #
#   OS/2 libraries:                                                        #
#   make -r -DOS2 -DNAME=bids2                                             #
#   make -r -DOS2 -DDBG -DNAME=bidsdb2                                     #
#                                                                          #
#   OS/2 DLLs:                                                             #
#   make -r -DOS2 -DDLL -DNAME=bids -DSUFFIX=2                             #
#   make -r -DOS2 -DDLL -DDBG -DNAME=bids -DSUFFIX=d2                      #
#                                                                          #
#--------------------------------------------------------------------------#

.autodepend
.swap

!if !$d(DOS) && !$d(WIN32) && !$d(OS2)
!error Must specify target system DOS, WIN32, or OS2
!endif

!if $d(DOS) && !($d(MODEL) || $d(DLL))
!error When building DOS libraries, must specify MODEL or DLL
!endif

!if $d(MODEL) && ($d(OS2) || $d(WIN32))
!error When building OS2 or WIN32 libraries, cannot specify MODEL
!endif

!if $d(DLL) && !$d(NAME)
!error Must specify a NAME for a DLL.
!endif

!if $d(DOS) && $d(MT)
!error Cannot build multi-thread library for DOS.
!endif

!if $d(MODEL)
!if $(MODEL)!=s && $(MODEL)!=c && $(MODEL)!=m && $(MODEL)!=l && $(MODEL)!=h
!Error MODEL must be s, c, m, l, or h
!endif
!endif

#--------------------------------------------------------------------#
#                                                                    #
# Set up the names of the tools to be used. If these macros have     #
#   already been defined in the environment, use those definitions.  #
#                                                                    #
#   BCC is the compiler.                                             #
#   MAKE is make.                                                    #
#   TLIB is the librarian.                                           #
#   TLINK is the linker.                                             #
#                                                                    #
#--------------------------------------------------------------------#


!if !$d(BCC)
!if $d(WIN32)
BCC = bcc32 +turboc.cfg -v- -x
!elif $d(OS2)
BCC = bcc
!else
BCC = bcc -2- -x
!endif
!endif

!if !$d(MAKE)
!if $d(WIN32)
MAKE = maker
!else
MAKE = make
!endif
!endif

!if !$d(TLIB)
!if $d(WIN32)
TLIB = tlib /C
!else
TLIB = tlib /C
!endif
!endif

!if !$d(TLINK)
!if $d(WIN32)
TLINK = tlink32
!else
TLINK = tlink
!endif
!endif

!if !$d(BRCC)
!if $d(WIN32)
BRCC = brcc32 -dWIN32
!else
BRCC = brcc
!endif
!endif

#--------------------------------------------------------------------#
#                                                                    #
# Set up options for the various tools                               #
#                                                                    #
#   WFLAG does some magic to produce a library that works for both   #
#   DOS and Windows.                                                 #
#                                                                    #
#   WLFLAG is a variation of WFLAG for the implib objs               #
#                                                                    #
#   DFLAG contains the debugging switches that will be passed to the #
#   compiler through the .CFG file.                                  #
#                                                                    #
#   LFLAG contains the switches that will be passed to TLIB on the   #
#   command line.                                                    #
#                                                                    #
#   XFLAG handles _RTLDLL, which is passed to the compiler in the    #
#   .CFG file and determines whether classes are to be exported.     #
#   It also handle far vtable options when they are enabled.         #
#                                                                    #
#   LINKOPTS is the list of options for the linker.                  #
#                                                                    #
#--------------------------------------------------------------------#

!if $d(DOS) && $d(DLL)
WFLAG = -WDE -xc
WLFLAG = -Y
!elif $d(DOS) && ($(MODEL) == s || $(MODEL) == c )
WFLAG = -WE
!elif $d(DOS) && ($(MODEL) == m || $(MODEL) == l)
WFLAG = -Y
!endif

!if $d(MT)
!if $d(OS2)
MTFLAG = -sm
!else
MTFLAG = -WM
!endif
!endif

!if $d(DBG)
DFLAG = -v- -D__DEBUG=2 -D__WARN -D__TRACE
LFLAG = /0
!else
DFLAG = -v- -D__DEBUG=0
LFLAG = /0
!endif

!if $d(DLL)
XFLAG = -D_RTLDLL -D_BUILDBIDSDLL
!endif

!if $d(BIDSFARVTABLE)
XFLAG = $(XFLAG) -D_BIDSFARVTABLE  #;_RTLFARVTABLE if RTL is rebuilt too
!endif

!if $d(DOS)
!if $d(DLL)
MFLAG = -ml
!else
MFLAG = -m$(MODEL)
!endif
!endif

!if $d(DOS)
LINKOPTS = /C/c/s/Twd/Oc/Oi/Oa/Or
!elif $d(OS2)
LINKOPTS = /c/s/Tod
!elif $d(WIN32)
LINKOPTS = /c/s/Tpd
!endif

!if $d(DLL)
DEFFILE=deffile
!endif

#--------------------------------------------------------------------#
#                                                                    #
# Build the macros to provide the startup code and library names     #
# for building DLLs.                                                 #
#                                                                    #
#   STARTUP is the startup code.                                     #
#                                                                    #
#   LINKLIBS is the list of libraries.                               #
#                                                                    #
#--------------------------------------------------------------------#

!if !$d(DLL)

TARGETLIB = $(NAME)

!else

VER = 45

!if $d(DLL) && $d(WIN32) && $d(DBG)
TARGETFILE = bds$(VER)$(SUFFIX)     # name is too long if we use 'bids'
!else
TARGETFILE = $(NAME)$(VER)$(SUFFIX)
!endif
TARGETLIB  = $(NAME)$(SUFFIX)i.lib

!if $d(DOS)

STARTUP = $(LIB)\c0dl.obj
LINKLIBS = $(LIB)\import.lib $(LIB)\crtldll.lib

!elif $d(OS2)

STARTUP = $(LIB)\c02d.obj

!if $d(MT)
LINKLIBS = $(LIB)\c2mti.lib $(LIB)\os2.lib
!else
LINKLIBS = $(LIB)\c2i.lib $(LIB)\os2.lib
!endif

!else

STARTUP = $(LIB)\c0d32.obj

!if $d(MT)
LINKLIBS = $(LIB)\cw32mti.lib $(LIB)\import32.lib
!else
LINKLIBS = $(LIB)\cw32i.lib $(LIB)\import32.lib
!endif

!endif

!endif

#--------------------------------------------------------------------#
#                                                                    #
# OBJDIRLIST is the list of subdirectories under the OBJ directory   #
#                                                                    #
#   This is used by dirs to be sure all the subdirectories are       #
#   present and by clean to remove all OBJ files                     #
#                                                                    #
#--------------------------------------------------------------------#

!if $d(DOS)
OBJDIRLIST = s ds c dc m dm l dl h dh i di
!endif

!if $d(WIN32)
OBJDIRLIST = 32 d32 i32 di32
!endif

!if $d(OS2)
OBJDIRLIST = 2 d2 i2 di2
!endif

#--------------------------------------------------------------------#
#                                                                    #
# Set up the paths that will be needed later.                        #
#                                                                    #
#   INCLUDE is the full path to the compiler's include files and     #
#   to the classlib's include files.  If it is not defined in the    #
#   environment, it is assumed to be under the directory where the   #
#   compiler was installed in the subdirectory INCLUDE.              #
#                                                                    #
#   LIB is the full path to the compiler's libraries.  If it is not  #
#   defined in the environment, it is assumed to be under the        #
#   directory where the compiler was installed in the subdirectory   #
#   LIB.                                                             #
#                                                                    #
#   SOURCEDIR is the full path to the source code.  If it is not     #
#   defined in the environment, it is assumed to be under the        #
#   directory where the compiler was installed in the subdirectory   #
#   SOURCE\CLASSLIB.                                                 #
#                                                                    #
#   ROOTDIR is the full path to the directory in which the makefile  #
#   is located.  If it is not defined in the environment, it is      #
#   assumed to be the same as SOURCEDIR.                             #
#                                                                    #
#   LIBDIR is the full path to the directory in which the libraries  #
#   should be placed when they are built.  If it is not defined in   #
#   the environment, it is assumed to be the same as the directory   #
#   specified by LIB.                                                #
#                                                                    #
#--------------------------------------------------------------------#

!if !$d(BCROOT)
!if $d(OS2)
BCROOT=$(MAKEDIR)\..
!else
!include $(MAKEDIR)\bcroot.inc
!endif
!endif

!if !$d(INCLUDE)
INCLUDE = $(BCROOT)\include
!endif

!if !$d(RCINCLUDE)
RCINCLUDE = $(BCROOT)\include
!endif

!if !$d(LIB)
LIB = $(BCROOT)\lib
!endif

!if !$d(SOURCEDIR)
SOURCEDIR = $(BCROOT)\source\classlib
!endif

!if !$d(LIBDIR)
LIBDIR = $(LIB)
!endif

!if !$d(ROOTDIR)
ROOTDIR = $(SOURCEDIR)
!endif

#--------------------------------------------------------------------#
#                                                                    #
# Set up the various paths that MAKE will use                        #
#                                                                    #
#   OBJDIR will only have been defined when we've decide on a target #
#   platform and a set of options. Since .PATH.obj isn't used in any #
#   context in which DBG and SUFFIX haven't been defined, it's ok    #
#   to use DBG and SUFFIX to define it.                              #
#                                                                    #
#--------------------------------------------------------------------#

.PATH.cpp = $(SOURCEDIR)
.PATH.cpo = $(SOURCEDIR)\obsolete

.PATH.lib = $(LIBDIR)

.PATH.rc = $(SOURCEDIR)

!if $d(DOS)
OBJDIR=$(MODEL)
!elif $d(OS2)
OBJDIR=2
!else
OBJDIR=32
!endif

!if $d(DLL)
OBJDIR=i$(OBJDIR)
!endif

!if $d(DBG)
.PATH.obj = $(SOURCEDIR)\d$(OBJDIR)
!else
.PATH.obj = $(SOURCEDIR)\$(OBJDIR)
!endif

#--------------------------------------------------------------------#
#                                                                    #
# Build the various file lists needed for dependency checking,       #
# and LIBing.                                                        #
#                                                                    #
#   OBJS is the main list, conditionalized for the various targets   #
#       and options.                                                 #
#                                                                    #
#   OBJS_LIB are the objs that only go in libs & implib, not the dll #
#                                                                    #
#   OBJS_DLL are the objs that only go in the dll, not the libs      #
#                                                                    #
#   DEPOBJS is the list of object files for dependency checking      #
#                                                                    #
#   LIBOBJS is the list of object files for building the library     #
#                                                                    #
#--------------------------------------------------------------------#

!if $d(OBJECTS)
PFX=.PATH.cpo
OBJS =              \
    PFXassoc.obj    \
    PFXbtree.obj    \
    PFXbtreeinn.obj \
    PFXbtreelfn.obj \
    PFXcollect.obj  \
    PFXcontain.obj  \
    PFXdbllist.obj  \
    PFXhashtbl.obj  \
    PFXldate.obj    \
    PFXlist.obj     \
    PFXltime.obj    \
    PFXobject.obj
!endif

OBJS = $(OBJS)      \
    PFXbinimp.obj   \
    PFXcastable.obj \
    PFXdate.obj     \
    PFXdateio.obj   \
    PFXdatep.obj    \
    PFXfile.obj     \
    PFXheapsel.obj  \
    PFXobjstrm.obj  \
    PFXtime.obj     \
    PFXtimep.obj    \
    PFXtimeio.obj   \
    PFXversion.obj

!if !$d(OS2)
OBJS = $(OBJS)      \
    PFXexbase.obj   \
    PFXgeometry.obj \
    PFXgeomstrm.obj \
    PFXreglink.obj
!endif

OBJS_LIB =          \
    PFXlocale.obj   \
    PFXlocaleco.obj \
    PFXlocaleid.obj \
    PFXregheap.obj  \
    PFXustring.obj

OBJS_DLL =

!if $d(DOS) && !$d(DLL)
OBJS = $(OBJS) PFXtimer.obj
!endif

!if $d(WIN32) || $d(OS2)
OBJS = $(OBJS) PFXthread.obj
!endif

!if $d(OBJECTS)
!if $d(TEMPLATES)
OBJS = $(OBJS)      \
    PFXbabstary.obj \
    PFXbdict.obj    \
    PFXbsortary.obj
!else
OBJS = $(OBJS)      \
    PFXabstarry.obj \
    PFXarray.obj    \
    PFXdeque.obj    \
    PFXdict.obj     \
    PFXsortarry.obj \
    PFXstack.obj
!endif
!endif

!if $d(DLL) && $(DOS)
OBJS = $(OBJS) PFXclasmain.obj
!endif

!if $d(DLL) && $d(OBJECTS)

!if $d(TEMPLATES)
OBJS = $(OBJS) PFXtmpl2.obj
!else
OBJS = $(OBJS) PFXtmpl1.obj
!endif

!endif

!if $d(DLL) && !$d(OBJECTS) && !$d(OS2)
RESFILE = version.res
!endif

#PFXOBJS = $(OBJS:SFX=)
#SFXOBJS = $(OBJS:PFX=)

DEPOBJS = $(OBJS:PFX=) $(OBJS_LIB:PFX=) $(OBJS_DLL:PFX=)
!if $d(DLL)
LIBOBJS = $(OBJS_LIB:PFX=+)
LINKOBJS = $(OBJS:PFX=) $(OBJS_DLL:PFX=)
!else
LIBOBJS = $(OBJS:PFX=-+) $(OBJS_LIB:PFX=-+)
!endif

#--------------------------------------------------------------------#
#                                                                    #
# These are the targets that we can make.                            #
#                                                                    #
#   target: builds the target file                                   #
#                                                                    #
#   dirs:   makes sure all the necessary subdirectories are present  #
#                                                                    #
#   clean:  deletes the .OBJ files                                   #
#                                                                    #
#   config: builds a .CFG file with the correct flags                #
#                                                                    #
#--------------------------------------------------------------------#

target: config $(DEFFILE) $(DEPOBJS) $(RESFILE)
!if !$d(DLL)
    cd $(.PATH.obj)
    $(TLIB) $(LFLAG) $(.PATH.lib)\$(TARGETLIB) @&&!
$(LIBOBJS)
!
    cd $(ROOTDIR)
!else
    cd $(.PATH.obj)
    $(TLINK) @&&!
$(STARTUP)+
$(LINKOBJS)
$(TARGETFILE).dll
$(LINKOPTS) $(.PATH.lib)\$(TARGETFILE).map
$(LINKLIBS)
temp.def
$(RESFILE)
!
!if $(TARGET) == DOS
    rc -30 $(TARGETFILE)
!endif
    implib $(TARGETLIB) $(TARGETFILE).dll
    tlib $(LFLAG) $(TARGETLIB) @&&|
$(LIBOBJS)
|
    cd $(ROOTDIR)
    copy $(.PATH.obj)\$(TARGETFILE).dll $(.PATH.lib)
    del $(.PATH.obj)\$(TARGETFILE).dll
    copy $(.PATH.obj)\$(TARGETLIB) $(.PATH.lib)
    del $(.PATH.obj)\$(TARGETLIB)
!endif


dirs:
    -for %d in ($(OBJDIRLIST)) do md $(SOURCEDIR)\%d

clean:
    -for %d in ($(OBJDIRLIST)) do del $(SOURCEDIR)\%d\*.obj

config:
    @-if not exist $(.PATH.obj)\..\NUL md $(.PATH.obj)\..
    @-if not exist $(.PATH.obj)\NUL md $(.PATH.obj)
    @type &&!
-c -n$(.PATH.obj) -I$(INCLUDE) $(DFLAG) $(XFLAG) $(MFLAG) $(TFLAG)
! >turboc.cfg

deffile:
!if $d(DOS)
    @echo >$(.PATH.obj)\temp.def LIBRARY     $(TARGETFILE)
!else
    @echo >$(.PATH.obj)\temp.def LIBRARY     $(TARGETFILE) INITINSTANCE
!endif
    @echo >>$(.PATH.obj)\temp.def DESCRIPTION 'Parametrized Class Library for BC++'
!if $d(DOS)
    @echo >>$(.PATH.obj)\temp.def EXETYPE     WINDOWS
    @echo >>$(.PATH.obj)\temp.def CODE        PRELOAD MOVEABLE DISCARDABLE
    @echo >>$(.PATH.obj)\temp.def DATA        PRELOAD MOVEABLE SINGLE
!else
    @echo >>$(.PATH.obj)\temp.def DATA        MULTIPLE NONSHARED
!endif
    @echo >>$(.PATH.obj)\temp.def HEAPSIZE    4096


#--------------------------------------------------------------------#
#                                                                    #
# We need an implicit rule for building .OBJ files, and a few        #
# explicit rules for special cases.                                  #
#                                                                    #
#   TIMER.OBJ is never built for windows, so doesn't need the        #
#       windows flags.                                               #
#                                                                    #
#--------------------------------------------------------------------#

timer.obj: timer.cpp
    $(BCC) $(SOURCEDIR)\timer

tmpl1.obj: tmplinst.cpp
    $(BCC) -o$(.PATH.obj)\tmpl1.obj $(WFLAG) $(.PATH.cpp)\tmplinst

tmpl2.obj: tmplinst.cpp
    $(BCC) -o$(.PATH.obj)\tmpl2.obj -DTEMPLATES $(WFLAG) $(.PATH.cpp)\tmplinst

.cpo.obj:
    $(BCC) $(WFLAG) -P {$< }

.cpp.obj:
    $(BCC) $(WFLAG) $(MTFLAG) {$* }

.rc.res:
    $(BRCC) -i$(RCINCLUDE) $*.rc
    copy $*.res $(.PATH.obj)
    del $*.res

!if $d(DOS) && $d(DLL)
$(OBJS_LIB:PFX=):
    $(BCC) $(WLFLAG) $(MTFLAG) -D_BIDSDLL -U_BUILDBIDSDLL $(.PATH.cpp)\$&.cpp
!endif

7/2/98 10:32:32 AM
 

Last Modified: 01-SEP-99