-# Copyright 2005 Dave Abrahams
-# Copyright 2003 Rene Rivera
-# Copyright 2003, 2004, 2005 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2005 Dave Abrahams
+# Copyright 2003 Rene Rivera
+# Copyright 2003, 2004, 2005 Vladimir Prus
+# Copyright (c) 2020 Edward Diener
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
#| tag::doc[]
[[bbv2.reference.tools.compiler.borland]]
= Borland C++ Compiler
-The `borland` module supports the command line C++ compiler included in
-http://www.borland.com/us/products/cbuilder/index.html[C++ Builder 2006]
-product and earlier version of it, running on Microsoft Windows.
-
-The supported products are listed below. The version reported by the
-command lines tools is also listed for reference.:
-
-* C++ Builder 2006 -- 5.8.2
-* CBuilderX -- 5.6.5, 5.6.4 (depending on release)
-* CBuilder6 -- 5.6.4
-* Free command line tools -- 5.5.1
+The `borland` module supports the 32-bit command line C++ compilers
+running on Microsoft Windows. This is the bcc32 executable for all
+versions of Borland C++ and C++ Builder, as well as the command line
+compatible compiler bcc32c on later versions of C++ Builder.
The module is initialized using the following syntax:
This statement may be repeated several times, if you want to configure
several versions of the compiler.
-If the command is not specified, B2 will search for a binary
+If the command is not specified, Boost.Build will search for a binary
named `bcc32` in PATH.
The following options can be provided, using
`linkflags`::
Specifies additional command line options that will be passed to the linker.
+`user-interface`::
+Specifies the user interface for applications. Valid choices are `console`
+for a console applicatiuon and `gui` for a Windows application.
+
|# # end::doc[]
# Support for the Borland's command line compiler
import feature : get-values ;
import type ;
import common ;
+import version ;
feature.extend toolset : borland ;
rule init ( version ? : command * : options * )
{
+
local condition = [ common.check-init-parameters borland :
version $(version) ] ;
-
- local command = [ common.get-invocation-command borland : bcc32.exe
+
+ local command = [ common.get-invocation-command borland : bcc32.exe
: $(command) ] ;
-
+
common.handle-options borland : $(condition) : $(command) : $(options) ;
-
+
+ local just_bcc32 = [ MATCH ".*(bcc32)([^a-z0-9]|$)" : $(command:L) ] ;
+
if $(command)
{
command = [ common.get-absolute-tool-path $(command[-1]) ] ;
- }
- root = $(command:D) ;
-
+ }
+ root = $(command:D) ;
+
flags borland.compile STDHDRS $(condition) : $(root)/include/ ;
flags borland.link STDLIBPATH $(condition) : $(root)/lib ;
flags borland.link RUN_PATH $(condition) : $(root)/bin ;
- flags borland .root $(condition) : $(root)/bin/ ;
+ flags borland .root $(condition) : $(root)/bin/ ;
+
+ local jv ;
+
+ if $(version)
+ {
+ jv = [ MATCH "^([0-9.]+)" : $(version) ] ;
+ }
+ if ! $(jv) || [ version.version-less [ version-split $(jv) ] : 6 30 ]
+ {
+ init-earlier-releases $(condition) ;
+ }
+ else
+ {
+ init-later-releases $(condition) ;
+ }
+
+ if $(just_bcc32) && ( $(just_bcc32[1]) = bcc32 )
+ {
+ flags borland.compile OPTIONS $(condition) : -g255 -Vx- -Ve- -b- ;
+ }
+}
+
+# Splits a version in its form of n[.n][.n] into n n n etc.
+#
+local rule version-split ( v )
+{
+return [ SPLIT_BY_CHARACTERS $(v) : . ] ;
}
+local rule init-earlier-releases ( condition )
+{
+
+# Deal with various runtime configs...
+
+# This should be not for DLL
+flags borland OPTIONS $(condition)/<user-interface>console : -tWC ;
+
+# -tWR sets -tW as well, so we turn it off here and then turn it
+# on again later if we need it:
+flags borland OPTIONS $(condition)/<runtime-link>shared : -tWR -tWC ;
+
+flags borland OPTIONS $(condition)/<main-target-type>LIB/<link>shared : -tWD ;
+# Hmm.. not sure what's going on here.
+flags borland OPTIONS $(condition) : -WM- ;
+flags borland OPTIONS $(condition)/<threading>multi : -tWM ;
+
+flags borland.link OPTIONS $(condition)/<link>shared : -tWD ;
+
+}
+
+local rule init-later-releases ( condition )
+{
+
+# Deal with various runtime configs...
+
+# This should be not for DLL
+flags borland OPTIONS $(condition)/<user-interface>console : -tC ;
+
+flags borland OPTIONS $(condition)/<runtime-link>shared : -tR ;
+
+flags borland OPTIONS $(condition)/<main-target-type>LIB/<link>shared : -tD ;
+flags borland OPTIONS $(condition)/<main-target-type>EXE : -tC ;
+flags borland OPTIONS $(condition)/<threading>multi : -tM ;
+
+flags borland.link.dll OPTIONS $(condition)/<link>shared : -tD ;
+
+}
# A borland-specific target type
type.register BORLAND.TDS : tds ;
generators.register-c-compiler borland.compile.c : C : OBJ : <toolset>borland ;
generators.register-standard borland.asm : ASM : OBJ : <toolset>borland ;
-# Declare flags
+# Declare flags
flags borland.compile OPTIONS <debug-symbols>on : -v ;
flags borland.link OPTIONS <debug-symbols>on : -v ;
flags borland.compile OPTIONS <warnings>off : -w- ;
flags borland.compile OPTIONS <warnings>all : -w ;
+flags borland.compile OPTIONS <warnings>extra : -w ;
+flags borland.compile OPTIONS <warnings>pedantic : -w ;
flags borland.compile OPTIONS <warnings-as-errors>on : -w! ;
-
-# Deal with various runtime configs...
-
-# This should be not for DLL
-flags borland OPTIONS <user-interface>console : -tWC ;
-
-# -tWR sets -tW as well, so we turn it off here and then turn it
-# on again later if we need it:
-flags borland OPTIONS <runtime-link>shared : -tWR -tWC ;
flags borland OPTIONS <user-interface>gui : -tW ;
-flags borland OPTIONS <main-target-type>LIB/<link>shared : -tWD ;
-# Hmm.. not sure what's going on here.
-flags borland OPTIONS : -WM- ;
-flags borland OPTIONS <threading>multi : -tWM ;
-
-
-
flags borland.compile OPTIONS <cflags> ;
flags borland.compile.c++ OPTIONS <cxxflags> ;
flags borland.compile DEFINES <define> ;
# -q no banner
# -c compile to object
# -P C++ code regardless of file extension
-# -a8 8 byte alignment, this option is on in the IDE by default
+# -a8 8 byte alignment, this option is on in the IDE by default
# and effects binary compatibility.
#
actions compile.c++
{
- "$(CONFIG_COMMAND)" -j5 -g255 -q -c -P -a8 -Vx- -Ve- -b- $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
+ "$(CONFIG_COMMAND)" -j5 -q -c -P -a8 $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
}
# For C, we don't pass -P flag
actions compile.c
{
- "$(CONFIG_COMMAND)" -j5 -g255 -q -c -a8 -Vx- -Ve- -b- $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
+ "$(CONFIG_COMMAND)" -j5 -q -c -a8 $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
}
# Declare flags and action for linking
-toolset.flags borland.link OPTIONS <debug-symbols>on : -v ;
-toolset.flags borland.link LIBRARY_PATH <library-path> ;
-toolset.flags borland.link FINDLIBS_ST <find-static-library> ;
-toolset.flags borland.link FINDLIBS_SA <find-shared-library> ;
-toolset.flags borland.link LIBRARIES <library-file> ;
+flags borland.link OPTIONS <debug-symbols>on : -v ;
+flags borland.link LIBRARY_PATH <library-path> ;
+flags borland.link FINDLIBS_ST <find-static-library> ;
+flags borland.link FINDLIBS_SA <find-shared-library> ;
+flags borland.link LIBRARIES <library-file> ;
flags borland.link OPTIONS <linkflags> ;
-flags borland.link OPTIONS <link>shared : -tWD ;
flags borland.link LIBRARY_PATH_OPTION <toolset>borland : -L : unchecked ;
flags borland.link LIBRARY_OPTION <toolset>borland : "" : unchecked ;
# values tlib fails when building large applications.
# CONSIDER: don't know what 'together' is for...
actions updated together piecemeal archive
-{
+{
$(.set-path)$(.root:W)$(.old-path)
tlib $(AROPTIONS) /P256 /u /a /C "$(<:W)" +-"$(>:W)"
}
{
.set-path = "cmd /S /C set \"PATH=" ;
.old-path = ";%PATH%\" \"&&\"" ;
-
+
# Couldn't get TLIB to stop being confused about pathnames
# containing dashes (it seemed to treat them as option separators
# about pathname style! Forward slashes, too, are treated as
# options.
actions updated together piecemeal archive
- {
+ {
chdir $(<:D)
echo +-$(>:BS) > $(<:BS).rsp
$(.set-path)$(.root)$(.old-path) "tlib.exe" $(AROPTIONS) /P256 /C $(<:BS) @$(<:BS).rsp && $(RM) $(<:BS).rsp
- }
+ }
}
else if [ os.name ] = NT
{