1################################################################################
2#
3# boost
4#
5################################################################################
6
7BOOST_VERSION = 1.83.0
8BOOST_SOURCE = boost_$(subst .,_,$(BOOST_VERSION)).tar.bz2
9BOOST_SITE = https://boostorg.jfrog.io/artifactory/main/release/$(BOOST_VERSION)/source
10BOOST_INSTALL_STAGING = YES
11BOOST_LICENSE = BSL-1.0
12BOOST_LICENSE_FILES = LICENSE_1_0.txt
13BOOST_CPE_ID_VENDOR = boost
14
15# keep host variant as minimal as possible
16HOST_BOOST_FLAGS = --without-icu --with-toolset=gcc \
17	--without-libraries=$(subst $(space),$(comma),atomic chrono context \
18	contract container coroutine date_time exception fiber filesystem graph \
19	graph_parallel iostreams json locale log math mpi nowide program_options \
20	python random serialization stacktrace test thread timer \
21	type_erasure url wave)
22
23BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_ATOMIC),,atomic)
24BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_CHRONO),,chrono)
25BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_CONTAINER),,container)
26BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_CONTEXT),,context)
27BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_CONTRACT),,contract)
28BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_COROUTINE),,coroutine)
29BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_DATE_TIME),,date_time)
30BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_EXCEPTION),,exception)
31BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_FIBER),,fiber)
32BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_FILESYSTEM),,filesystem)
33BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_GRAPH),,graph)
34BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_GRAPH_PARALLEL),,graph_parallel)
35BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_IOSTREAMS),,iostreams)
36BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_JSON),,json)
37BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_LOCALE),,locale)
38BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_LOG),,log)
39BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_MATH),,math)
40BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_MPI),,mpi)
41BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_NOWIDE),,nowide)
42BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_PROGRAM_OPTIONS),,program_options)
43BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_PYTHON),,python)
44BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_RANDOM),,random)
45BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_REGEX),,regex)
46BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_SERIALIZATION),,serialization)
47BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_STACKTRACE),,stacktrace)
48BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_SYSTEM),,system)
49BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_TEST),,test)
50BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_THREAD),,thread)
51BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_TIMER),,timer)
52BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_TYPE_ERASURE),,type_erasure)
53BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_URL),,url)
54BOOST_WITHOUT_FLAGS += $(if $(BR2_PACKAGE_BOOST_WAVE),,wave)
55
56BOOST_TARGET_CXXFLAGS = $(TARGET_CXXFLAGS)
57
58BOOST_FLAGS = --with-toolset=gcc
59
60ifeq ($(BR2_PACKAGE_ICU),y)
61BOOST_FLAGS += --with-icu=$(STAGING_DIR)/usr
62BOOST_DEPENDENCIES += icu
63else
64BOOST_FLAGS += --without-icu
65endif
66
67ifeq ($(BR2_PACKAGE_BOOST_IOSTREAMS),y)
68BOOST_DEPENDENCIES += bzip2 zlib
69endif
70
71ifeq ($(BR2_PACKAGE_BOOST_PYTHON),y)
72BOOST_FLAGS += \
73	--with-python-root=$(HOST_DIR) \
74	--with-python=$(HOST_DIR)/bin/python$(PYTHON3_VERSION_MAJOR)
75BOOST_TARGET_CXXFLAGS += -I$(STAGING_DIR)/usr/include/python$(PYTHON3_VERSION_MAJOR)
76BOOST_DEPENDENCIES += python3
77endif
78
79HOST_BOOST_OPTS += --no-cmake-config toolset=gcc threading=multi \
80	variant=release link=shared runtime-link=shared -j$(PARALLEL_JOBS) -q \
81	--ignore-site-config --layout=system --prefix=$(HOST_DIR) \
82	--user-config=$(@D)/user-config.jam
83
84ifeq ($(BR2_MIPS_OABI32),y)
85BOOST_ABI = o32
86else ifeq ($(BR2_arm)$(BR2_armeb)$(BR2_aarch64)$(BR2_aarch64_be),y)
87BOOST_ABI = aapcs
88else
89BOOST_ABI = sysv
90endif
91
92BOOST_OPTS += --no-cmake-config \
93	toolset=gcc \
94	threading=multi \
95	abi=$(BOOST_ABI) \
96	variant=$(if $(BR2_ENABLE_RUNTIME_DEBUG),debug,release) \
97	-j$(PARALLEL_JOBS) \
98	-q \
99	--ignore-site-config \
100	--layout=system \
101	--user-config=$(@D)/user-config.jam
102
103ifeq ($(BR2_sparc64),y)
104BOOST_OPTS += architecture=sparc instruction-set=ultrasparc
105endif
106
107ifeq ($(BR2_sparc),y)
108BOOST_OPTS += architecture=sparc instruction-set=v8
109endif
110
111# By default, Boost build and installs both the shared and static
112# variants. Override that if we want static only or shared only.
113ifeq ($(BR2_STATIC_LIBS),y)
114BOOST_OPTS += link=static runtime-link=static
115else ifeq ($(BR2_SHARED_LIBS),y)
116BOOST_OPTS += link=shared runtime-link=shared
117endif
118
119ifeq ($(BR2_PACKAGE_BOOST_LOCALE),y)
120ifeq ($(BR2_TOOLCHAIN_USES_UCLIBC),y)
121# posix backend needs monetary.h which isn't available on uClibc
122BOOST_OPTS += boost.locale.posix=off
123endif
124
125BOOST_DEPENDENCIES += $(if $(BR2_ENABLE_LOCALE),,libiconv)
126endif
127
128BOOST_WITHOUT_FLAGS_COMMASEPARATED += $(subst $(space),$(comma),$(strip $(BOOST_WITHOUT_FLAGS)))
129BOOST_FLAGS += $(if $(BOOST_WITHOUT_FLAGS_COMMASEPARATED), --without-libraries=$(BOOST_WITHOUT_FLAGS_COMMASEPARATED))
130
131# how verbose should the build be?
132BOOST_OPTS += $(if $(QUIET),-d0,-d+1)
133HOST_BOOST_OPTS += $(if $(QUIET),-d0,-d+1)
134
135define BOOST_CONFIGURE_CMDS
136	cd $(@D) && ./bootstrap.sh $(BOOST_FLAGS)
137	echo "using gcc : `$(TARGET_CC) -dumpversion` : $(TARGET_CXX) : <cxxflags>\"$(BOOST_TARGET_CXXFLAGS)\" <linkflags>\"$(TARGET_LDFLAGS)\" ;" > $(@D)/user-config.jam
138	sed -i "s/: -O.* ;/: $(TARGET_OPTIMIZATION) ;/" $(@D)/tools/build/src/tools/gcc.jam
139endef
140
141define BOOST_BUILD_CMDS
142	cd $(@D) && $(TARGET_MAKE_ENV) ./b2 $(BOOST_OPTS)
143endef
144
145define BOOST_INSTALL_TARGET_CMDS
146	cd $(@D) && $(TARGET_MAKE_ENV) ./b2 $(BOOST_OPTS) \
147		--prefix=$(TARGET_DIR)/usr install
148endef
149
150define BOOST_INSTALL_STAGING_CMDS
151	cd $(@D) && $(TARGET_MAKE_ENV) ./b2 $(BOOST_OPTS) \
152		--prefix=$(STAGING_DIR)/usr install
153endef
154
155# These hooks will help us to detect missing select in Config.in
156# Indeed boost buildsystem can select a library even if the user has
157# disable it
158define BOOST_REMOVE_TARGET_LIBRARIES
159	rm -rf $(TARGET_DIR)/usr/lib/libboost_*
160endef
161
162BOOST_PRE_INSTALL_TARGET_HOOKS += BOOST_REMOVE_TARGET_LIBRARIES
163
164define BOOST_CHECK_TARGET_LIBRARIES
165	@$(foreach disabled,$(BOOST_WITHOUT_FLAGS),\
166		! ls $(TARGET_DIR)/usr/lib/libboost_$(disabled)* 1>/dev/null 2>&1 || \
167			! echo "libboost_$(disabled) shouldn't have been installed: missing select in boost/Config.in" || \
168			exit 1;)
169endef
170
171BOOST_POST_INSTALL_TARGET_HOOKS += BOOST_CHECK_TARGET_LIBRARIES
172
173define HOST_BOOST_CONFIGURE_CMDS
174	cd $(@D) && ./bootstrap.sh $(HOST_BOOST_FLAGS)
175	echo "using gcc : `$(HOST_CC) -dumpversion` : $(HOSTCXX) : <cxxflags>\"$(HOST_CXXFLAGS)\" <linkflags>\"$(HOST_LDFLAGS)\" ;" > $(@D)/user-config.jam
176endef
177
178define HOST_BOOST_BUILD_CMDS
179	cd $(@D) && ./b2 $(HOST_BOOST_OPTS)
180endef
181
182define HOST_BOOST_INSTALL_CMDS
183	cd $(@D) && ./b2 $(HOST_BOOST_OPTS) install
184endef
185
186$(eval $(generic-package))
187$(eval $(host-generic-package))
188