]>
Commit | Line | Data |
---|---|---|
9f95a23c TL |
1 | #!/usr/bin/env bash |
2 | ||
3 | set -e | |
4 | ||
5 | SCRIPT_DIR="$(dirname "$BASH_SOURCE")" | |
6 | SCRIPT_DIR="$(realpath "$SCRIPT_DIR")" | |
7 | ||
f67539c2 | 8 | num_vcpus=$(nproc) |
9f95a23c TL |
9 | NUM_WORKERS=${NUM_WORKERS:-$num_vcpus} |
10 | ||
11 | DEPS_DIR="${DEPS_DIR:-$SCRIPT_DIR/build.deps}" | |
12 | depsSrcDir="$DEPS_DIR/src" | |
13 | depsToolsetDir="$DEPS_DIR/mingw" | |
14 | ||
15 | lz4SrcDir="${depsSrcDir}/lz4" | |
16 | lz4Dir="${depsToolsetDir}/lz4" | |
17 | lz4Tag="v1.9.2" | |
f67539c2 | 18 | sslTag="OpenSSL_1_1_1c" |
9f95a23c | 19 | sslDir="${depsToolsetDir}/openssl" |
f67539c2 | 20 | sslSrcDir="${depsSrcDir}/openssl" |
9f95a23c TL |
21 | |
22 | curlTag="curl-7_66_0" | |
23 | curlSrcDir="${depsSrcDir}/curl" | |
24 | curlDir="${depsToolsetDir}/curl" | |
25 | ||
26 | # For now, we'll keep the version number within the file path when not using git. | |
f67539c2 TL |
27 | boostUrl="https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.gz" |
28 | boostSrcDir="${depsSrcDir}/boost_1_73_0" | |
9f95a23c TL |
29 | boostDir="${depsToolsetDir}/boost" |
30 | zlibDir="${depsToolsetDir}/zlib" | |
31 | zlibSrcDir="${depsSrcDir}/zlib" | |
f67539c2 TL |
32 | backtraceDir="${depsToolsetDir}/libbacktrace" |
33 | backtraceSrcDir="${depsSrcDir}/libbacktrace" | |
9f95a23c TL |
34 | snappySrcDir="${depsSrcDir}/snappy" |
35 | snappyDir="${depsToolsetDir}/snappy" | |
36 | snappyTag="1.1.7" | |
37 | # Additional Windows libraries, which aren't provided by Mingw | |
38 | winLibDir="${depsToolsetDir}/windows/lib" | |
39 | ||
f67539c2 TL |
40 | wnbdUrl="https://github.com/cloudbase/wnbd" |
41 | wnbdTag="master" | |
42 | wnbdSrcDir="${depsSrcDir}/wnbd" | |
43 | wnbdLibDir="${depsToolsetDir}/wnbd/lib" | |
9f95a23c | 44 | |
f67539c2 TL |
45 | dokanUrl="https://github.com/dokan-dev/dokany" |
46 | dokanTag="v1.3.1.1000" | |
47 | dokanSrcDir="${depsSrcDir}/dokany" | |
48 | dokanLibDir="${depsToolsetDir}/dokany/lib" | |
49 | ||
50 | # Allow for OS specific customizations through the OS flag (normally | |
51 | # passed through from win32_build). | |
52 | # Valid options are currently "ubuntu" and "suse". | |
53 | OS=${OS:-"ubuntu"} | |
9f95a23c TL |
54 | |
55 | function _make() { | |
56 | make -j $NUM_WORKERS $@ | |
57 | } | |
58 | ||
f67539c2 TL |
59 | if [[ -d $DEPS_DIR ]]; then |
60 | echo "Cleaning up dependency build dir: $DEPS_DIR" | |
61 | rm -rf $DEPS_DIR | |
62 | fi | |
63 | ||
9f95a23c TL |
64 | mkdir -p $DEPS_DIR |
65 | mkdir -p $depsToolsetDir | |
66 | mkdir -p $depsSrcDir | |
67 | ||
f67539c2 TL |
68 | case "$OS" in |
69 | ubuntu) | |
70 | sudo apt-get update | |
71 | sudo apt-get -y install mingw-w64 cmake pkg-config python3-dev python3-pip \ | |
72 | autoconf libtool ninja-build zip | |
73 | sudo python3 -m pip install cython | |
74 | ;; | |
75 | suse) | |
76 | for PKG in mingw64-cross-gcc-c++ mingw64-libgcc_s_seh1 mingw64-libstdc++6 \ | |
77 | cmake pkgconf python3-devel autoconf libtool ninja zip \ | |
78 | python3-Cython gcc patch wget git; do | |
79 | rpm -q $PKG >/dev/null || zypper -n install $PKG | |
80 | done | |
81 | ;; | |
82 | esac | |
9f95a23c | 83 | |
f67539c2 TL |
84 | MINGW_CMAKE_FILE="$DEPS_DIR/mingw.cmake" |
85 | source "$SCRIPT_DIR/mingw_conf.sh" | |
9f95a23c TL |
86 | |
87 | cd $depsSrcDir | |
f67539c2 | 88 | if [[ ! -d $zlibSrcDir ]]; then |
9f95a23c TL |
89 | git clone https://github.com/madler/zlib |
90 | fi | |
f67539c2 | 91 | cd $zlibSrcDir |
9f95a23c | 92 | # Apparently the configure script is broken... |
f67539c2 | 93 | sed -e s/"PREFIX = *$"/"PREFIX = ${MINGW_PREFIX}"/ -i win32/Makefile.gcc |
9f95a23c TL |
94 | _make -f win32/Makefile.gcc |
95 | _make BINARY_PATH=$zlibDir \ | |
96 | INCLUDE_PATH=$zlibDir/include \ | |
97 | LIBRARY_PATH=$zlibDir/lib \ | |
98 | SHARED_MODE=1 \ | |
99 | -f win32/Makefile.gcc install | |
100 | ||
101 | cd $depsToolsetDir | |
102 | if [[ ! -d $lz4Dir ]]; then | |
103 | git clone https://github.com/lz4/lz4 | |
f67539c2 | 104 | cd $lz4Dir; git checkout $lz4Tag |
9f95a23c | 105 | fi |
f67539c2 TL |
106 | cd $lz4Dir |
107 | _make BUILD_STATIC=no CC=${MINGW_CC%-posix*} \ | |
108 | DLLTOOL=${MINGW_DLLTOOL} \ | |
109 | WINDRES=${MINGW_WINDRES} \ | |
110 | TARGET_OS=Windows_NT | |
9f95a23c TL |
111 | |
112 | cd $depsSrcDir | |
113 | if [[ ! -d $sslSrcDir ]]; then | |
f67539c2 TL |
114 | git clone https://github.com/openssl/openssl |
115 | cd $sslSrcDir; git checkout $sslTag | |
9f95a23c TL |
116 | fi |
117 | cd $sslSrcDir | |
118 | mkdir -p $sslDir | |
f67539c2 TL |
119 | CROSS_COMPILE="${MINGW_PREFIX}" ./Configure \ |
120 | mingw64 shared --prefix=$sslDir --libdir="$sslDir/lib" | |
9f95a23c TL |
121 | _make depend |
122 | _make | |
123 | _make install | |
124 | ||
125 | cd $depsSrcDir | |
126 | if [[ ! -d $curlSrcDir ]]; then | |
127 | git clone https://github.com/curl/curl | |
f67539c2 | 128 | cd $curlSrcDir && git checkout $curlTag |
9f95a23c TL |
129 | fi |
130 | cd $curlSrcDir | |
9f95a23c TL |
131 | ./buildconf |
132 | ./configure --prefix=$curlDir --with-ssl=$sslDir --with-zlib=$zlibDir \ | |
f67539c2 | 133 | --host=${MINGW_BASE} --libdir="$curlDir/lib" |
9f95a23c TL |
134 | _make |
135 | _make install | |
136 | ||
137 | ||
138 | cd $depsSrcDir | |
139 | if [[ ! -d $boostSrcDir ]]; then | |
140 | wget -qO- $boostUrl | tar xz | |
141 | fi | |
142 | ||
143 | cd $boostSrcDir | |
f67539c2 | 144 | echo "using gcc : mingw32 : ${MINGW_CXX} ;" > user-config.jam |
9f95a23c TL |
145 | |
146 | # Workaround for https://github.com/boostorg/thread/issues/156 | |
147 | # Older versions of mingw provided a different pthread lib. | |
148 | sed -i 's/lib$(libname)GC2.a/lib$(libname).a/g' ./libs/thread/build/Jamfile.v2 | |
149 | sed -i 's/mthreads/pthreads/g' ./tools/build/src/tools/gcc.py | |
150 | sed -i 's/mthreads/pthreads/g' ./tools/build/src/tools/gcc.jam | |
151 | ||
152 | sed -i 's/pthreads/mthreads/g' ./tools/build/src/tools/gcc.py | |
153 | sed -i 's/pthreads/mthreads/g' ./tools/build/src/tools/gcc.jam | |
154 | ||
f67539c2 TL |
155 | export PTW32_INCLUDE=${PTW32Include} |
156 | export PTW32_LIB=${PTW32Lib} | |
9f95a23c TL |
157 | |
158 | # Fix getting Windows page size | |
159 | # TODO: send this upstream and maybe use a fork until it merges. | |
160 | # Meanwhile, we might consider moving those to ceph/cmake/modules/BuildBoost.cmake. | |
161 | # This cmake module will first have to be updated to support Mingw though. | |
f67539c2 | 162 | patch -N boost/thread/pthread/thread_data.hpp <<EOL |
9f95a23c TL |
163 | --- boost/thread/pthread/thread_data.hpp 2019-10-11 15:26:15.678703586 +0300 |
164 | +++ boost/thread/pthread/thread_data.hpp.new 2019-10-11 15:26:07.321463698 +0300 | |
165 | @@ -32,6 +32,10 @@ | |
166 | # endif | |
167 | #endif | |
168 | ||
169 | +#if defined(_WIN32) | |
170 | +#include <windows.h> | |
171 | +#endif | |
172 | + | |
173 | #include <pthread.h> | |
174 | #include <unistd.h> | |
175 | ||
176 | @@ -54,6 +58,10 @@ | |
177 | if (size==0) return; | |
178 | #ifdef BOOST_THREAD_USES_GETPAGESIZE | |
179 | std::size_t page_size = getpagesize(); | |
180 | +#elif _WIN32 | |
181 | + SYSTEM_INFO system_info; | |
182 | + ::GetSystemInfo (&system_info); | |
183 | + std::size_t page_size = system_info.dwPageSize; | |
184 | #else | |
185 | std::size_t page_size = ::sysconf( _SC_PAGESIZE); | |
186 | #endif | |
187 | EOL | |
188 | ||
189 | # Use pthread if requested | |
f67539c2 | 190 | patch -N boost/asio/detail/thread.hpp <<EOL |
9f95a23c TL |
191 | --- boost/asio/detail/thread.hpp 2019-10-11 16:26:11.191094656 +0300 |
192 | +++ boost/asio/detail/thread.hpp.new 2019-10-11 16:26:03.310542438 +0300 | |
193 | @@ -19,6 +19,8 @@ | |
194 | ||
195 | #if !defined(BOOST_ASIO_HAS_THREADS) | |
196 | # include <boost/asio/detail/null_thread.hpp> | |
197 | +#elif defined(BOOST_ASIO_HAS_PTHREADS) | |
198 | +# include <boost/asio/detail/posix_thread.hpp> | |
199 | #elif defined(BOOST_ASIO_WINDOWS) | |
200 | # if defined(UNDER_CE) | |
201 | # include <boost/asio/detail/wince_thread.hpp> | |
202 | @@ -27,8 +29,6 @@ | |
203 | # else | |
204 | # include <boost/asio/detail/win_thread.hpp> | |
205 | # endif | |
206 | -#elif defined(BOOST_ASIO_HAS_PTHREADS) | |
207 | -# include <boost/asio/detail/posix_thread.hpp> | |
208 | #elif defined(BOOST_ASIO_HAS_STD_THREAD) | |
209 | # include <boost/asio/detail/std_thread.hpp> | |
210 | #else | |
211 | @@ -41,6 +41,8 @@ | |
212 | ||
213 | #if !defined(BOOST_ASIO_HAS_THREADS) | |
214 | typedef null_thread thread; | |
215 | +#elif defined(BOOST_ASIO_HAS_PTHREADS) | |
216 | +typedef posix_thread thread; | |
217 | #elif defined(BOOST_ASIO_WINDOWS) | |
218 | # if defined(UNDER_CE) | |
219 | typedef wince_thread thread; | |
220 | @@ -49,8 +51,6 @@ | |
221 | # else | |
222 | typedef win_thread thread; | |
223 | # endif | |
224 | -#elif defined(BOOST_ASIO_HAS_PTHREADS) | |
225 | -typedef posix_thread thread; | |
226 | #elif defined(BOOST_ASIO_HAS_STD_THREAD) | |
227 | typedef std_thread thread; | |
228 | #endif | |
229 | EOL | |
230 | ||
231 | # Unix socket support for Windows is currently disabled by Boost. | |
232 | # https://github.com/huangqinjin/asio/commit/d27a8ad1870 | |
f67539c2 | 233 | patch -N boost/asio/detail/socket_types.hpp <<EOL |
9f95a23c TL |
234 | --- boost/asio/detail/socket_types.hpp 2019-11-29 16:50:58.647125797 +0000 |
235 | +++ boost/asio/detail/socket_types.hpp.new 2020-01-13 11:45:05.015104678 +0000 | |
236 | @@ -200,6 +200,8 @@ | |
237 | typedef ipv6_mreq in6_mreq_type; | |
238 | typedef sockaddr_in6 sockaddr_in6_type; | |
239 | typedef sockaddr_storage sockaddr_storage_type; | |
240 | +struct sockaddr_un_type { u_short sun_family; | |
241 | + char sun_path[108]; }; /* copy from afunix.h */ | |
242 | typedef addrinfo addrinfo_type; | |
243 | # endif | |
244 | typedef ::linger linger_type; | |
245 | EOL | |
f67539c2 | 246 | patch -N boost/asio/detail/config.hpp <<EOL |
9f95a23c TL |
247 | --- boost/asio/detail/config.hpp 2019-11-29 16:50:58.691126211 +0000 |
248 | +++ boost/asio/detail/config.hpp.new 2020-01-13 13:09:17.966771750 +0000 | |
249 | @@ -1142,13 +1142,9 @@ | |
250 | // UNIX domain sockets. | |
251 | #if !defined(BOOST_ASIO_HAS_LOCAL_SOCKETS) | |
252 | # if !defined(BOOST_ASIO_DISABLE_LOCAL_SOCKETS) | |
253 | -# if !defined(BOOST_ASIO_WINDOWS) \\ | |
254 | - && !defined(BOOST_ASIO_WINDOWS_RUNTIME) \\ | |
255 | - && !defined(__CYGWIN__) | |
256 | +# if !defined(BOOST_ASIO_WINDOWS_RUNTIME) | |
257 | # define BOOST_ASIO_HAS_LOCAL_SOCKETS 1 | |
258 | -# endif // !defined(BOOST_ASIO_WINDOWS) | |
259 | - // && !defined(BOOST_ASIO_WINDOWS_RUNTIME) | |
260 | - // && !defined(__CYGWIN__) | |
261 | +# endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME) | |
262 | # endif // !defined(BOOST_ASIO_DISABLE_LOCAL_SOCKETS) | |
263 | #endif // !defined(BOOST_ASIO_HAS_LOCAL_SOCKETS) | |
264 | EOL | |
265 | ||
f67539c2 TL |
266 | # TODO: drop this when switching to Boost>=1.75, it's unreleased as of 1.74. |
267 | patch -N boost/process/detail/windows/handle_workaround.hpp <<EOL | |
268 | --- boost/process/detail/windows/handle_workaround.hpp | |
269 | +++ boost/process/detail/windows/handle_workaround.hpp.new | |
270 | @@ -198,20 +198,20 @@ typedef struct _OBJECT_TYPE_INFORMATION_ { | |
271 | ||
272 | ||
273 | /* | |
274 | -__kernel_entry NTSTATUS NtQuerySystemInformation( | |
275 | +NTSTATUS NtQuerySystemInformation( | |
276 | IN SYSTEM_INFORMATION_CLASS SystemInformationClass, | |
277 | OUT PVOID SystemInformation, | |
278 | IN ULONG SystemInformationLength, | |
279 | OUT PULONG ReturnLength | |
280 | ); | |
281 | */ | |
282 | -typedef ::boost::winapi::NTSTATUS_ (__kernel_entry *nt_system_query_information_p )( | |
283 | +typedef ::boost::winapi::NTSTATUS_ (*nt_system_query_information_p )( | |
284 | SYSTEM_INFORMATION_CLASS_, | |
285 | void *, | |
286 | ::boost::winapi::ULONG_, | |
287 | ::boost::winapi::PULONG_); | |
288 | /* | |
289 | -__kernel_entry NTSYSCALLAPI NTSTATUS NtQueryObject( | |
290 | +NTSYSCALLAPI NTSTATUS NtQueryObject( | |
291 | HANDLE Handle, | |
292 | OBJECT_INFORMATION_CLASS ObjectInformationClass, | |
293 | PVOID ObjectInformation, | |
294 | @@ -220,7 +220,7 @@ __kernel_entry NTSYSCALLAPI NTSTATUS NtQueryObject( | |
295 | ); | |
296 | */ | |
297 | ||
298 | -typedef ::boost::winapi::NTSTATUS_ (__kernel_entry *nt_query_object_p )( | |
299 | +typedef ::boost::winapi::NTSTATUS_ (*nt_query_object_p )( | |
300 | ::boost::winapi::HANDLE_, | |
301 | OBJECT_INFORMATION_CLASS_, | |
302 | void *, | |
303 | EOL | |
304 | ||
9f95a23c TL |
305 | ./bootstrap.sh |
306 | ||
307 | ./b2 install --user-config=user-config.jam toolset=gcc-mingw32 \ | |
308 | target-os=windows release \ | |
f67539c2 | 309 | link=static,shared \ |
9f95a23c TL |
310 | threadapi=pthread --prefix=$boostDir \ |
311 | address-model=64 architecture=x86 \ | |
312 | binary-format=pe abi=ms -j $NUM_WORKERS \ | |
313 | -sZLIB_INCLUDE=$zlibDir/include -sZLIB_LIBRARY_PATH=$zlibDir/lib \ | |
f67539c2 | 314 | --without-python --without-mpi --without-log --without-wave |
9f95a23c TL |
315 | |
316 | cd $depsSrcDir | |
317 | if [[ ! -d $backtraceSrcDir ]]; then | |
318 | git clone https://github.com/ianlancetaylor/libbacktrace | |
319 | fi | |
f67539c2 TL |
320 | mkdir -p $backtraceSrcDir/build |
321 | cd $backtraceSrcDir/build | |
9f95a23c | 322 | ../configure --prefix=$backtraceDir --exec-prefix=$backtraceDir \ |
f67539c2 TL |
323 | --host ${MINGW_BASE} --enable-host-shared \ |
324 | --libdir="$backtraceDir/lib" | |
9f95a23c TL |
325 | _make LDFLAGS="-no-undefined" |
326 | _make install | |
9f95a23c TL |
327 | |
328 | cd $depsSrcDir | |
329 | if [[ ! -d $snappySrcDir ]]; then | |
330 | git clone https://github.com/google/snappy | |
f67539c2 | 331 | cd $snappySrcDir && git checkout $snappyTag |
9f95a23c | 332 | fi |
f67539c2 TL |
333 | mkdir -p $snappySrcDir/build |
334 | cd $snappySrcDir/build | |
9f95a23c TL |
335 | |
336 | cmake -DCMAKE_INSTALL_PREFIX=$snappyDir \ | |
337 | -DCMAKE_BUILD_TYPE=Release \ | |
338 | -DBUILD_SHARED_LIBS=ON \ | |
339 | -DSNAPPY_BUILD_TESTS=OFF \ | |
340 | -DCMAKE_TOOLCHAIN_FILE=$MINGW_CMAKE_FILE \ | |
341 | ../ | |
342 | _make | |
343 | _make install | |
344 | ||
345 | cmake -DCMAKE_INSTALL_PREFIX=$snappyDir \ | |
346 | -DCMAKE_BUILD_TYPE=Release \ | |
347 | -DBUILD_SHARED_LIBS=OFF \ | |
348 | -DSNAPPY_BUILD_TESTS=OFF \ | |
349 | -DCMAKE_TOOLCHAIN_FILE=$MINGW_CMAKE_FILE \ | |
350 | ../ | |
351 | _make | |
352 | _make install | |
353 | ||
354 | # mswsock.lib is not provided by mingw, so we'll have to generate | |
355 | # it. | |
356 | mkdir -p $winLibDir | |
357 | cat > $winLibDir/mswsock.def <<EOF | |
358 | LIBRARY MSWSOCK.DLL | |
359 | EXPORTS | |
360 | AcceptEx@32 | |
361 | EnumProtocolsA@12 | |
362 | EnumProtocolsW@12 | |
363 | GetAcceptExSockaddrs@32 | |
364 | GetAddressByNameA@40 | |
365 | GetAddressByNameW@40 | |
366 | GetNameByTypeA@12 | |
367 | GetNameByTypeW@12 | |
368 | GetServiceA@28 | |
369 | GetServiceW@28 | |
370 | GetTypeByNameA@8 | |
371 | GetTypeByNameW@8 | |
372 | MigrateWinsockConfiguration@12 | |
373 | NPLoadNameSpaces@12 | |
374 | SetServiceA@24 | |
375 | SetServiceW@24 | |
376 | TransmitFile@28 | |
377 | WSARecvEx@16 | |
378 | dn_expand@20 | |
379 | getnetbyname@4 | |
380 | inet_network@4 | |
381 | rcmd@24 | |
382 | rexec@24rresvport@4 | |
383 | s_perror@8sethostname@8 | |
384 | EOF | |
385 | ||
f67539c2 TL |
386 | $MINGW_DLLTOOL -d $winLibDir/mswsock.def \ |
387 | -l $winLibDir/libmswsock.a | |
388 | ||
389 | cd $depsSrcDir | |
390 | if [[ ! -d $wnbdSrcDir ]]; then | |
391 | git clone $wnbdUrl | |
392 | cd $wnbdSrcDir && git checkout $wnbdTag | |
393 | fi | |
394 | cd $wnbdSrcDir | |
395 | mkdir -p $wnbdLibDir | |
396 | $MINGW_DLLTOOL -d $wnbdSrcDir/libwnbd/libwnbd.def \ | |
397 | -D libwnbd.dll \ | |
398 | -l $wnbdLibDir/libwnbd.a | |
399 | ||
400 | cd $depsSrcDir | |
401 | if [[ ! -d $dokanSrcDir ]]; then | |
402 | git clone $dokanUrl | |
403 | fi | |
404 | cd $dokanSrcDir | |
405 | git checkout $dokanTag | |
406 | ||
407 | mkdir -p $dokanLibDir | |
408 | $MINGW_DLLTOOL -d $dokanSrcDir/dokan/dokan.def \ | |
409 | -l $dokanLibDir/libdokan.a | |
410 | ||
411 | # That's probably the easiest way to deal with the dokan imports. | |
412 | # dokan.h is defined in both ./dokan and ./sys while both are using | |
413 | # sys/public.h without the "sys" prefix. | |
414 | cp $dokanSrcDir/sys/public.h $dokanSrcDir/dokan | |
415 | ||
416 | touch $depsToolsetDir/completed |