1# Copyright Vladimir Prus 2004.
2# Copyright Toon Knapen 2004.
3# Distributed under the Boost Software License, Version 1.0.
4# (See accompanying file LICENSE_1_0.txt
5# or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7#
8# Boost.Build V2 toolset for the IBM XL C++ compiler
9#
10
11import toolset : flags ;
12import feature ;
13import common ;
14import generators ;
15import os ;
16
17feature.extend toolset : vacpp ;
18toolset.inherit vacpp : unix ;
19generators.override vacpp.prebuilt : builtin.prebuilt ;
20generators.override vacpp.searched-lib-generator : searched-lib-generator ;
21
22# Configure the vacpp toolset
23rule init ( version ? : command * : options * )
24{
25    local condition = [
26        common.check-init-parameters vacpp : version $(version) ] ;
27
28    command = [ common.get-invocation-command vacpp : xlC
29        : $(command) : "/usr/vacpp/bin/xlC" ] ;
30
31    common.handle-options vacpp : $(condition) : $(command) : $(options) ;
32}
33
34# Declare generators
35generators.register-c-compiler vacpp.compile.c : C : OBJ : <toolset>vacpp ;
36generators.register-c-compiler vacpp.compile.c++ : CPP : OBJ : <toolset>vacpp ;
37
38# Allow C++ style comments in C files
39flags vacpp CFLAGS : -qcpluscmt ;
40
41# Declare flags
42flags vacpp CFLAGS <optimization>off : -qNOOPTimize ;
43flags vacpp CFLAGS <optimization>speed : -O3 -qstrict ;
44flags vacpp CFLAGS <optimization>space : -O2 -qcompact ;
45
46# Discretionary inlining (not recommended)
47flags vacpp CFLAGS <inlining>off : -qnoinline ;
48flags vacpp CFLAGS <inlining>on : -qinline ;
49#flags vacpp CFLAGS <inlining>full : -qinline ;
50flags vacpp CFLAGS <inlining>full : ;
51
52# Exception handling
53flags vacpp C++FLAGS <exception-handling>off : -qnoeh ;
54flags vacpp C++FLAGS <exception-handling>on : -qeh ;
55
56# Run-time Type Identification
57flags vacpp C++FLAGS <rtti>off : -qnortti ;
58flags vacpp C++FLAGS <rtti>on : -qrtti ;
59
60# Enable 64-bit memory addressing model
61flags vacpp CFLAGS <address-model>64 : -q64 ;
62flags vacpp LINKFLAGS <address-model>64 : -q64 ;
63flags vacpp ARFLAGS <target-os>aix/<address-model>64 : -X 64 ;
64
65# Use absolute path when generating debug information
66flags vacpp CFLAGS <debug-symbols>on : -g -qfullpath ;
67flags vacpp LINKFLAGS <debug-symbols>on : -g -qfullpath ;
68flags vacpp LINKFLAGS <debug-symbols>off : -s ;
69
70if [ os.name ] = AIX
71{
72    flags vacpp.compile C++FLAGS : -qfuncsect ;
73
74    # The -bnoipath strips the prepending (relative) path of libraries from
75    # the loader section in the target library or executable. Hence, during
76    # load-time LIBPATH (identical to LD_LIBRARY_PATH) or a hard-coded
77    # -blibpath (*similar* to -lrpath/-lrpath-link) is searched. Without
78    # this option, the prepending (relative) path + library name is
79    # hard-coded in the loader section, causing *only* this path to be
80    # searched during load-time. Note that the AIX linker does not have an
81    # -soname equivalent, this is as close as it gets.
82    #
83    # The above options are definately for AIX 5.x, and most likely also for
84    # AIX 4.x and AIX 6.x. For details about the AIX linker see:
85    # http://download.boulder.ibm.com/ibmdl/pub/software/dw/aix/es-aix_ll.pdf
86    #
87    flags vacpp.link LINKFLAGS <link>shared : -bnoipath ;
88
89    # Run-time linking
90    flags vacpp.link EXE-LINKFLAGS <link>shared : -brtl ;
91}
92else
93{
94    # Linux PPC
95    flags vacpp.compile CFLAGS <link>shared : -qpic=large ;
96    flags vacpp FINDLIBS : rt ;
97}
98
99# Profiling
100flags vacpp CFLAGS <profiling>on : -pg ;
101flags vacpp LINKFLAGS <profiling>on : -pg ;
102
103flags vacpp.compile OPTIONS <cflags> ;
104flags vacpp.compile.c++ OPTIONS <cxxflags> ;
105flags vacpp DEFINES <define> ;
106flags vacpp UNDEFS <undef> ;
107flags vacpp HDRS <include> ;
108flags vacpp STDHDRS <sysinclude> ;
109flags vacpp.link OPTIONS <linkflags> ;
110flags vacpp ARFLAGS <arflags> ;
111
112flags vacpp LIBPATH <library-path> ;
113flags vacpp NEEDLIBS <library-file> ;
114flags vacpp FINDLIBS <find-shared-library> ;
115flags vacpp FINDLIBS <find-static-library> ;
116
117# Select the compiler name according to the threading model.
118flags vacpp VA_C_COMPILER  <threading>single : xlc   ;
119flags vacpp VA_C_COMPILER  <threading>multi : xlc_r ;
120flags vacpp VA_CXX_COMPILER <threading>single : xlC   ;
121flags vacpp VA_CXX_COMPILER <threading>multi : xlC_r ;
122
123SPACE = " " ;
124
125flags vacpp.link.dll HAVE_SONAME <target-os>linux : "" ;
126
127actions vacpp.link bind NEEDLIBS
128{
129    $(VA_CXX_COMPILER) $(EXE-LINKFLAGS) $(LINKFLAGS) -o "$(<[1])" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) $(OPTIONS) $(USER_OPTIONS)
130}
131
132actions vacpp.link.dll bind NEEDLIBS
133{
134    xlC_r -G $(LINKFLAGS) -o "$(<[1])" $(HAVE_SONAME)-Wl,-soname$(SPACE)-Wl,$(<[-1]:D=) -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) $(OPTIONS) $(USER_OPTIONS)
135}
136
137actions vacpp.compile.c
138{
139    $(VA_C_COMPILER) -c $(OPTIONS) $(USER_OPTIONS) -I$(BOOST_ROOT) -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -o "$(<)" "$(>)"
140}
141
142actions vacpp.compile.c++
143{
144    $(VA_CXX_COMPILER) -c $(OPTIONS) $(USER_OPTIONS) -I$(BOOST_ROOT) -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(C++FLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -o "$(<)" "$(>)"
145}
146
147actions updated together piecemeal vacpp.archive
148{
149    ar $(ARFLAGS) ru "$(<)" "$(>)"
150}
151