Open wangjia184 opened 4 years ago
I have worked around this issue, the basic idea is to build jemalloc manually
./configure --host=x86_64-w64-mingw32 --build=x86_64-unknown_linux-gnu --disable-cxx --disable-initial-exec-tls --with-private-namespace=_rjem_ --with-jemalloc-prefix=;
make;
Then create the static library manually.
ar crus /usr/local/lib/libjemalloc.a src/jemalloc.o src/arena.o src/background_thread.o src/base.o \
src/bin.o src/bitmap.o src/ckh.o src/ctl.o src/div.o src/extent.o src/extent_dss.o src/extent_mmap.o \
src/hash.o src/hook.o src/large.o src/log.o src/malloc_io.o src/mutex.o src/mutex_pool.o src/nstime.o \
src/pages.o src/prng.o src/prof.o src/rtree.o src/safety_check.o src/stats.o src/sc.o src/sz.o src/tcache.o \
src/test_hooks.o src/ticker.o src/tsd.o src/witness.o;
Next, set JEMALLOC_OVERRIDE=/usr/local/lib/libjemalloc.a
environment
In this way, we can have Linux-based docker image running in CI to build windows binaries.
Here is full dockerfile
FROM rust:slim-buster
RUN apt-get update; \
apt-get install -y mingw-w64 build-essential curl; \
apt-get clean;
RUN rustup target add x86_64-pc-windows-gnu
RUN mkdir ~/.cargo/ && \
printf "\n[target.x86_64-pc-windows-gnu]" >> ~/.cargo/config && \
printf "\nlinker = \"/usr/bin/x86_64-w64-mingw32-gcc\"" >> ~/.cargo/config && \
printf "\nar = \"/usr/bin/x86_64-w64-mingw32-gcc-ar\"" >> ~/.cargo/config && \
printf "\nnm = \"/usr/bin/x86_64-w64-mingw32-gcc-nm\"" >> ~/.cargo/config && \
printf "\nranlib = \"/usr/bin/x86_64-w64-mingw32-gcc-ranlib\"" >> ~/.cargo/config && \
printf "\ncrt-static = true" >> ~/.cargo/config
RUN curl -L https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2 --output jemalloc.tar.bz2; \
tar -xvjf ./jemalloc.tar.bz2; \
rm -f ./jemalloc.tar.bz2; \
cd jemalloc-5.2.1; \
./configure --host=x86_64-w64-mingw32 --build=x86_64-unknown_linux-gnu --disable-cxx --disable-initial-exec-tls --with-private-namespace=_rjem_ --with-jemalloc-prefix=; \
make; \
ar crus /usr/local/lib/libjemalloc.a src/jemalloc.o src/arena.o src/background_thread.o src/base.o \
src/bin.o src/bitmap.o src/ckh.o src/ctl.o src/div.o src/extent.o src/extent_dss.o src/extent_mmap.o \
src/hash.o src/hook.o src/large.o src/log.o src/malloc_io.o src/mutex.o src/mutex_pool.o src/nstime.o \
src/pages.o src/prng.o src/prof.o src/rtree.o src/safety_check.o src/stats.o src/sc.o src/sz.o src/tcache.o \
src/test_hooks.o src/ticker.o src/tsd.o src/witness.o; \
cd ..; \
rm -rf ./jemalloc-5.2.1;
ENV JEMALLOC_OVERRIDE=/usr/local/lib/libjemalloc.a
Compile on Linux targeting windows.
cargo build --target x86_64-pc-windows-gnu --release --verbose
Here is the building environment dockerfile.
Same error occurs if compiling with cross