1SUMMARY = "Free peer-reviewed portable C++ source libraries"
2SECTION = "libs"
3DEPENDS = "bjam-native zlib bzip2"
4
5CVE_PRODUCT = "boost:boost"
6
7ARM_INSTRUCTION_SET_armv4 = "arm"
8ARM_INSTRUCTION_SET_armv5 = "arm"
9
10BOOST_LIBS = "\
11	atomic \
12	chrono \
13	container \
14	contract \
15	date_time \
16	exception \
17	filesystem \
18	graph \
19	iostreams \
20	log \
21	math \
22	program_options \
23	random \
24	regex \
25	serialization \
26	system \
27	timer \
28	test \
29	thread \
30	wave \
31	"
32
33# only supported by x86 and powerpc
34BOOST_LIBS_append_x86 = " context coroutine"
35BOOST_LIBS_append_x86-64 = " context coroutine"
36BOOST_LIBS_append_powerpc = " context coroutine"
37BOOST_LIBS_append_arm = " context coroutine"
38# need consistent settings for native builds (x86 override not applied for native)
39BOOST_LIBS_remove_class-native = " context coroutine"
40# does not compile
41BOOST_LIBS_remove_mips16e = "wave"
42
43# optional libraries
44PACKAGECONFIG ??= "locale python"
45PACKAGECONFIG[locale] = ",,icu"
46PACKAGECONFIG[graph_parallel] = ",,,boost-mpi mpich"
47PACKAGECONFIG[mpi] = ",,mpich"
48PACKAGECONFIG[python] = ",,python3"
49
50BOOST_LIBS += "\
51    ${@bb.utils.filter('PACKAGECONFIG', 'locale python', d)} \
52    ${@bb.utils.contains('PACKAGECONFIG', 'graph_parallel', 'graph_parallel mpi', \
53                         bb.utils.filter('PACKAGECONFIG', 'mpi', d), d)} \
54"
55
56inherit python3-dir
57PYTHON_ROOT = "${STAGING_DIR_HOST}/${prefix}"
58
59# Make a package for each library, plus -dev
60PACKAGES = "${PN}-dbg ${BOOST_PACKAGES}"
61python __anonymous () {
62    packages = []
63    extras = []
64    for lib in d.getVar('BOOST_LIBS').split():
65        extras.append("--with-%s" % lib)
66        pkg = "boost-%s" % lib.replace("_", "-")
67        packages.append(pkg)
68        if not d.getVar("FILES_%s" % pkg):
69                d.setVar("FILES_%s" % pkg, "${libdir}/libboost_%s*.so.*" % lib)
70    d.setVar("BOOST_PACKAGES", " ".join(packages))
71    d.setVar("BJAM_EXTRA", " ".join(extras))
72}
73
74# Override the contents of specific packages
75FILES_${PN}-graph_parallel = "${libdir}/libboost_graph_parallel.so.*"
76FILES_${PN}-locale = "${libdir}/libboost_locale.so.*"
77FILES_${PN}-mpi = "${libdir}/mpi.so ${libdir}/libboost_mpi*.so.*"
78FILES_boost-serialization = "${libdir}/libboost_serialization*.so.* \
79	${libdir}/libboost_wserialization*.so.*"
80FILES_boost-test = "${libdir}/libboost_prg_exec_monitor*.so.* \
81	${libdir}/libboost_unit_test_framework*.so.*"
82
83# -dev last to pick up the remaining stuff
84PACKAGES += "${PN}-dev ${PN}-staticdev"
85FILES_${PN}-dev = "${includedir} ${libdir}/libboost_*.so"
86FILES_${PN}-staticdev = "${libdir}/libboost_*.a"
87
88# "boost" is a metapackage which pulls in all boost librabries
89PACKAGES += "${PN}"
90FILES_${PN} = ""
91ALLOW_EMPTY_${PN} = "1"
92RRECOMMENDS_${PN} += "${BOOST_PACKAGES}"
93RRECOMMENDS_${PN}_class-native = ""
94
95# to avoid GNU_HASH QA errors added LDFLAGS to ARCH; a little bit dirty but at least it works
96TARGET_CC_ARCH += "${LDFLAGS}"
97
98# Oh yippee, a new build system, it's sooo cooool I could eat my own
99# foot.  inlining=on lets the compiler choose, I think.  At least this
100# stuff is documented...
101# NOTE: if you leave <debug-symbols>on then in a debug build the build sys
102# objcopy will be invoked, and that won't work.  Building debug apparently
103# requires hacking gcc-tools.jam
104#
105# Sometimes I wake up screaming.  Famous figures are gathered in the nightmare,
106# Steve Bourne, Larry Wall, the whole of the ANSI C committee.  They're just
107# standing there, waiting, but the truely terrifying thing is what they carry
108# in their hands.  At first sight each seems to bear the same thing, but it is
109# not so for the forms in their grasp are ever so slightly different one from
110# the other.  Each is twisted in some grotesque way from the other to make each
111# an unspeakable perversion impossible to perceive without the onset of madness.
112# True insanity awaits anyone who perceives all of these horrors together.
113#
114# Quotation marks, there might be an easier way to do this, but I can't find
115# it.  The problem is that the user.hpp configuration file must receive a
116# pre-processor macro defined as the appropriate string - complete with "'s
117# around it.  (<> is a possibility here but the danger to that is that the
118# failure case interprets the < and > as shell redirections, creating
119# random files in the source tree.)
120#
121#bjam: '-DBOOST_PLATFORM_CONFIG=\"config\"'
122#do_compile: '-sGCC=... '"'-DBOOST_PLATFORM_CONFIG=\"config\"'"
123SQD = '"'
124EQD = '\"'
125#boost.bb:   "...  '-sGCC=... '${SQD}'-DBOOST_PLATFORM_CONFIG=${EQD}config${EQD}'${SQD} ..."
126BJAM_CONF = "${SQD}'-DBOOST_PLATFORM_CONFIG=${EQD}boost/config/platform/${TARGET_OS}.hpp${EQD}'${SQD}"
127
128BJAM_TOOLS   = "--ignore-site-config \
129		'-sTOOLS=gcc' \
130		'-sGCC=${CC} '${BJAM_CONF} \
131		'-sGXX=${CXX} '${BJAM_CONF} \
132		'-sGCC_INCLUDE_DIRECTORY=${STAGING_INCDIR}' \
133		'-sGCC_STDLIB_DIRECTORY=${STAGING_LIBDIR}' \
134		'-sBUILD=release <optimization>space <threading>multi <inlining>on <debug-symbols>off' \
135		'-sPYTHON_ROOT=${PYTHON_ROOT}' \
136		'--layout=system' \
137		"
138
139# use PARALLEL_MAKE to speed up the build
140BOOST_PARALLEL_MAKE = "${@oe.utils.parallel_make_argument(d, '-j%d')}"
141BJAM_OPTS    = '${BOOST_PARALLEL_MAKE} -d+2 -q \
142		${BJAM_TOOLS} \
143		-sBOOST_BUILD_USER_CONFIG=${WORKDIR}/user-config.jam \
144		--build-dir=${S}/${TARGET_SYS} \
145		--disable-icu \
146		${BJAM_EXTRA}'
147
148# Native compilation of bzip2 isn't working
149BJAM_OPTS_append_class-native = ' -sNO_BZIP2=1'
150
151# Adjust the build for x32
152BJAM_OPTS_append_x86-x32 = " abi=x32 address-model=64"
153
154# cross compiling for arm fails to detect abi, so provide some help
155BJAM_OPTS_append_arm = " abi=aapcs architecture=arm"
156
157do_configure() {
158	cp -f ${S}/boost/config/platform/linux.hpp ${S}/boost/config/platform/linux-gnueabi.hpp
159
160	# D2194:Fixing the failure of "error: duplicate initialization of gcc with the following parameters" during compilation.
161	rm -f ${WORKDIR}/user-config.jam
162	echo 'using gcc : 4.3.1 : ${CXX} : <cflags>"${CFLAGS}" <cxxflags>"${CXXFLAGS}" <linkflags>"${LDFLAGS}" ;' >> ${WORKDIR}/user-config.jam
163
164	# If we want Python then we need to tell Boost *exactly* where to find it
165	if ${@bb.utils.contains('BOOST_LIBS', 'python', 'true', 'false', d)}; then
166		echo "using python : ${PYTHON_BASEVERSION} : ${STAGING_DIR_HOST}${bindir}/python3 : ${STAGING_DIR_HOST}${includedir}/${PYTHON_DIR}${PYTHON_ABI} : ${STAGING_DIR_HOST}${libdir}/${PYTHON_DIR} ;" >> ${WORKDIR}/user-config.jam
167	fi
168
169	if ${@bb.utils.contains('BOOST_LIBS', 'mpi', 'true', 'false', d)}; then
170		echo "using mpi : : <find-shared-library>mpi ;" >> ${WORKDIR}/user-config.jam
171	fi
172
173	CC="${BUILD_CC}" CFLAGS="${BUILD_CFLAGS}" ./bootstrap.sh --with-bjam=bjam --with-toolset=gcc
174
175	# Boost can't be trusted to find Python on it's own, so remove any mention
176	# of it from the boost configuration
177	sed -i '/using python/d' ${S}/project-config.jam
178}
179
180do_compile() {
181	rm -rf ${S}/${TARGET_SYS}
182	bjam ${BJAM_OPTS} --prefix=${prefix} \
183		--exec-prefix=${exec_prefix} \
184		--libdir=${libdir} \
185		--includedir=${includedir} \
186		--debug-configuration
187}
188
189do_install() {
190	bjam ${BJAM_OPTS} \
191		--libdir=${D}${libdir} \
192		--includedir=${D}${includedir} \
193		install
194	for lib in ${BOOST_LIBS}; do
195		if [ -e ${D}${libdir}/libboost_${lib}.a ]; then
196			ln -s libboost_${lib}.a ${D}${libdir}/libboost_${lib}-mt.a
197		fi
198		if [ -e ${D}${libdir}/libboost_${lib}.so ]; then
199			ln -s libboost_${lib}.so ${D}${libdir}/libboost_${lib}-mt.so
200		fi
201	done
202
203}
204
205BBCLASSEXTEND = "native nativesdk"
206