]> git.proxmox.com Git - ceph.git/blame - ceph/win32_deps_build.sh
import Ceph Pacific 16.2.4
[ceph.git] / ceph / win32_deps_build.sh
CommitLineData
9f95a23c
TL
1#!/usr/bin/env bash
2
3set -e
4
5SCRIPT_DIR="$(dirname "$BASH_SOURCE")"
6SCRIPT_DIR="$(realpath "$SCRIPT_DIR")"
7
f67539c2 8num_vcpus=$(nproc)
9f95a23c
TL
9NUM_WORKERS=${NUM_WORKERS:-$num_vcpus}
10
11DEPS_DIR="${DEPS_DIR:-$SCRIPT_DIR/build.deps}"
12depsSrcDir="$DEPS_DIR/src"
13depsToolsetDir="$DEPS_DIR/mingw"
14
15lz4SrcDir="${depsSrcDir}/lz4"
16lz4Dir="${depsToolsetDir}/lz4"
17lz4Tag="v1.9.2"
f67539c2 18sslTag="OpenSSL_1_1_1c"
9f95a23c 19sslDir="${depsToolsetDir}/openssl"
f67539c2 20sslSrcDir="${depsSrcDir}/openssl"
9f95a23c
TL
21
22curlTag="curl-7_66_0"
23curlSrcDir="${depsSrcDir}/curl"
24curlDir="${depsToolsetDir}/curl"
25
26# For now, we'll keep the version number within the file path when not using git.
f67539c2
TL
27boostUrl="https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.gz"
28boostSrcDir="${depsSrcDir}/boost_1_73_0"
9f95a23c
TL
29boostDir="${depsToolsetDir}/boost"
30zlibDir="${depsToolsetDir}/zlib"
31zlibSrcDir="${depsSrcDir}/zlib"
f67539c2
TL
32backtraceDir="${depsToolsetDir}/libbacktrace"
33backtraceSrcDir="${depsSrcDir}/libbacktrace"
9f95a23c
TL
34snappySrcDir="${depsSrcDir}/snappy"
35snappyDir="${depsToolsetDir}/snappy"
36snappyTag="1.1.7"
37# Additional Windows libraries, which aren't provided by Mingw
38winLibDir="${depsToolsetDir}/windows/lib"
39
f67539c2
TL
40wnbdUrl="https://github.com/cloudbase/wnbd"
41wnbdTag="master"
42wnbdSrcDir="${depsSrcDir}/wnbd"
43wnbdLibDir="${depsToolsetDir}/wnbd/lib"
9f95a23c 44
f67539c2
TL
45dokanUrl="https://github.com/dokan-dev/dokany"
46dokanTag="v1.3.1.1000"
47dokanSrcDir="${depsSrcDir}/dokany"
48dokanLibDir="${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".
53OS=${OS:-"ubuntu"}
9f95a23c
TL
54
55function _make() {
56 make -j $NUM_WORKERS $@
57}
58
f67539c2
TL
59if [[ -d $DEPS_DIR ]]; then
60 echo "Cleaning up dependency build dir: $DEPS_DIR"
61 rm -rf $DEPS_DIR
62fi
63
9f95a23c
TL
64mkdir -p $DEPS_DIR
65mkdir -p $depsToolsetDir
66mkdir -p $depsSrcDir
67
f67539c2
TL
68case "$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 ;;
82esac
9f95a23c 83
f67539c2
TL
84MINGW_CMAKE_FILE="$DEPS_DIR/mingw.cmake"
85source "$SCRIPT_DIR/mingw_conf.sh"
9f95a23c
TL
86
87cd $depsSrcDir
f67539c2 88if [[ ! -d $zlibSrcDir ]]; then
9f95a23c
TL
89 git clone https://github.com/madler/zlib
90fi
f67539c2 91cd $zlibSrcDir
9f95a23c 92# Apparently the configure script is broken...
f67539c2 93sed -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
101cd $depsToolsetDir
102if [[ ! -d $lz4Dir ]]; then
103 git clone https://github.com/lz4/lz4
f67539c2 104 cd $lz4Dir; git checkout $lz4Tag
9f95a23c 105fi
f67539c2
TL
106cd $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
112cd $depsSrcDir
113if [[ ! -d $sslSrcDir ]]; then
f67539c2
TL
114 git clone https://github.com/openssl/openssl
115 cd $sslSrcDir; git checkout $sslTag
9f95a23c
TL
116fi
117cd $sslSrcDir
118mkdir -p $sslDir
f67539c2
TL
119CROSS_COMPILE="${MINGW_PREFIX}" ./Configure \
120 mingw64 shared --prefix=$sslDir --libdir="$sslDir/lib"
9f95a23c
TL
121_make depend
122_make
123_make install
124
125cd $depsSrcDir
126if [[ ! -d $curlSrcDir ]]; then
127 git clone https://github.com/curl/curl
f67539c2 128 cd $curlSrcDir && git checkout $curlTag
9f95a23c
TL
129fi
130cd $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
138cd $depsSrcDir
139if [[ ! -d $boostSrcDir ]]; then
140 wget -qO- $boostUrl | tar xz
141fi
142
143cd $boostSrcDir
f67539c2 144echo "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.
148sed -i 's/lib$(libname)GC2.a/lib$(libname).a/g' ./libs/thread/build/Jamfile.v2
149sed -i 's/mthreads/pthreads/g' ./tools/build/src/tools/gcc.py
150sed -i 's/mthreads/pthreads/g' ./tools/build/src/tools/gcc.jam
151
152sed -i 's/pthreads/mthreads/g' ./tools/build/src/tools/gcc.py
153sed -i 's/pthreads/mthreads/g' ./tools/build/src/tools/gcc.jam
154
f67539c2
TL
155export PTW32_INCLUDE=${PTW32Include}
156export 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 162patch -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
187EOL
188
189# Use pthread if requested
f67539c2 190patch -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
229EOL
230
231# Unix socket support for Windows is currently disabled by Boost.
232# https://github.com/huangqinjin/asio/commit/d27a8ad1870
f67539c2 233patch -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;
245EOL
f67539c2 246patch -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)
264EOL
265
f67539c2
TL
266# TODO: drop this when switching to Boost>=1.75, it's unreleased as of 1.74.
267patch -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 *,
303EOL
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
316cd $depsSrcDir
317if [[ ! -d $backtraceSrcDir ]]; then
318 git clone https://github.com/ianlancetaylor/libbacktrace
319fi
f67539c2
TL
320mkdir -p $backtraceSrcDir/build
321cd $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
328cd $depsSrcDir
329if [[ ! -d $snappySrcDir ]]; then
330 git clone https://github.com/google/snappy
f67539c2 331 cd $snappySrcDir && git checkout $snappyTag
9f95a23c 332fi
f67539c2
TL
333mkdir -p $snappySrcDir/build
334cd $snappySrcDir/build
9f95a23c
TL
335
336cmake -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
345cmake -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.
356mkdir -p $winLibDir
357cat > $winLibDir/mswsock.def <<EOF
358LIBRARY MSWSOCK.DLL
359EXPORTS
360AcceptEx@32
361EnumProtocolsA@12
362EnumProtocolsW@12
363GetAcceptExSockaddrs@32
364GetAddressByNameA@40
365GetAddressByNameW@40
366GetNameByTypeA@12
367GetNameByTypeW@12
368GetServiceA@28
369GetServiceW@28
370GetTypeByNameA@8
371GetTypeByNameW@8
372MigrateWinsockConfiguration@12
373NPLoadNameSpaces@12
374SetServiceA@24
375SetServiceW@24
376TransmitFile@28
377WSARecvEx@16
378dn_expand@20
379getnetbyname@4
380inet_network@4
381rcmd@24
382rexec@24rresvport@4
383s_perror@8sethostname@8
384EOF
385
f67539c2
TL
386$MINGW_DLLTOOL -d $winLibDir/mswsock.def \
387 -l $winLibDir/libmswsock.a
388
389cd $depsSrcDir
390if [[ ! -d $wnbdSrcDir ]]; then
391 git clone $wnbdUrl
392 cd $wnbdSrcDir && git checkout $wnbdTag
393fi
394cd $wnbdSrcDir
395mkdir -p $wnbdLibDir
396$MINGW_DLLTOOL -d $wnbdSrcDir/libwnbd/libwnbd.def \
397 -D libwnbd.dll \
398 -l $wnbdLibDir/libwnbd.a
399
400cd $depsSrcDir
401if [[ ! -d $dokanSrcDir ]]; then
402 git clone $dokanUrl
403fi
404cd $dokanSrcDir
405git checkout $dokanTag
406
407mkdir -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.
414cp $dokanSrcDir/sys/public.h $dokanSrcDir/dokan
415
416touch $depsToolsetDir/completed