summaryrefslogtreecommitdiffstats
path: root/deps/jemalloc/scripts
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-14 13:40:54 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-14 13:40:54 +0000
commit317c0644ccf108aa23ef3fd8358bd66c2840bfc0 (patch)
treec417b3d25c86b775989cb5ac042f37611b626c8a /deps/jemalloc/scripts
parentInitial commit. (diff)
downloadredis-317c0644ccf108aa23ef3fd8358bd66c2840bfc0.tar.xz
redis-317c0644ccf108aa23ef3fd8358bd66c2840bfc0.zip
Adding upstream version 5:7.2.4.upstream/5%7.2.4
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'deps/jemalloc/scripts')
-rwxr-xr-xdeps/jemalloc/scripts/check-formatting.sh28
-rw-r--r--deps/jemalloc/scripts/freebsd/before_install.sh3
-rw-r--r--deps/jemalloc/scripts/freebsd/before_script.sh10
-rw-r--r--deps/jemalloc/scripts/freebsd/script.sh3
-rwxr-xr-xdeps/jemalloc/scripts/gen_run_tests.py130
-rwxr-xr-xdeps/jemalloc/scripts/gen_travis.py327
-rw-r--r--deps/jemalloc/scripts/linux/before_install.sh13
-rw-r--r--deps/jemalloc/scripts/windows/before_install.sh83
-rw-r--r--deps/jemalloc/scripts/windows/before_script.sh20
-rw-r--r--deps/jemalloc/scripts/windows/script.sh10
10 files changed, 627 insertions, 0 deletions
diff --git a/deps/jemalloc/scripts/check-formatting.sh b/deps/jemalloc/scripts/check-formatting.sh
new file mode 100755
index 0000000..68cafd8
--- /dev/null
+++ b/deps/jemalloc/scripts/check-formatting.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# The files that need to be properly formatted. We'll grow this incrementally
+# until it includes all the jemalloc source files (as we convert things over),
+# and then just replace it with
+# find -name '*.c' -o -name '*.h' -o -name '*.cpp
+FILES=(
+)
+
+if command -v clang-format &> /dev/null; then
+ CLANG_FORMAT="clang-format"
+elif command -v clang-format-8 &> /dev/null; then
+ CLANG_FORMAT="clang-format-8"
+else
+ echo "Couldn't find clang-format."
+fi
+
+if ! $CLANG_FORMAT -version | grep "version 8\." &> /dev/null; then
+ echo "clang-format is the wrong version."
+ exit 1
+fi
+
+for file in ${FILES[@]}; do
+ if ! cmp --silent $file <($CLANG_FORMAT $file) &> /dev/null; then
+ echo "Error: $file is not clang-formatted"
+ exit 1
+ fi
+done
diff --git a/deps/jemalloc/scripts/freebsd/before_install.sh b/deps/jemalloc/scripts/freebsd/before_install.sh
new file mode 100644
index 0000000..f2bee32
--- /dev/null
+++ b/deps/jemalloc/scripts/freebsd/before_install.sh
@@ -0,0 +1,3 @@
+#!/bin/tcsh
+
+su -m root -c 'pkg install -y git'
diff --git a/deps/jemalloc/scripts/freebsd/before_script.sh b/deps/jemalloc/scripts/freebsd/before_script.sh
new file mode 100644
index 0000000..29406f6
--- /dev/null
+++ b/deps/jemalloc/scripts/freebsd/before_script.sh
@@ -0,0 +1,10 @@
+#!/bin/tcsh
+
+autoconf
+# We don't perfectly track freebsd stdlib.h definitions. This is fine when
+# we count as a system header, but breaks otherwise, like during these
+# tests.
+./configure --with-jemalloc-prefix=ci_ ${COMPILER_FLAGS:+ CC="$CC $COMPILER_FLAGS" CXX="$CXX $COMPILER_FLAGS"} $CONFIGURE_FLAGS
+JE_NCPUS=`sysctl -n kern.smp.cpus`
+gmake -j${JE_NCPUS}
+gmake -j${JE_NCPUS} tests
diff --git a/deps/jemalloc/scripts/freebsd/script.sh b/deps/jemalloc/scripts/freebsd/script.sh
new file mode 100644
index 0000000..d9c53a2
--- /dev/null
+++ b/deps/jemalloc/scripts/freebsd/script.sh
@@ -0,0 +1,3 @@
+#!/bin/tcsh
+
+gmake check
diff --git a/deps/jemalloc/scripts/gen_run_tests.py b/deps/jemalloc/scripts/gen_run_tests.py
new file mode 100755
index 0000000..7c3075f
--- /dev/null
+++ b/deps/jemalloc/scripts/gen_run_tests.py
@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+
+import sys
+from itertools import combinations
+from os import uname
+from multiprocessing import cpu_count
+from subprocess import call
+
+# Later, we want to test extended vaddr support. Apparently, the "real" way of
+# checking this is flaky on OS X.
+bits_64 = sys.maxsize > 2**32
+
+nparallel = cpu_count() * 2
+
+uname = uname()[0]
+
+if call("command -v gmake", shell=True) == 0:
+ make_cmd = 'gmake'
+else:
+ make_cmd = 'make'
+
+def powerset(items):
+ result = []
+ for i in range(len(items) + 1):
+ result += combinations(items, i)
+ return result
+
+possible_compilers = []
+for cc, cxx in (['gcc', 'g++'], ['clang', 'clang++']):
+ try:
+ cmd_ret = call([cc, "-v"])
+ if cmd_ret == 0:
+ possible_compilers.append((cc, cxx))
+ except:
+ pass
+possible_compiler_opts = [
+ '-m32',
+]
+possible_config_opts = [
+ '--enable-debug',
+ '--enable-prof',
+ '--disable-stats',
+ '--enable-opt-safety-checks',
+ '--with-lg-page=16',
+]
+if bits_64:
+ possible_config_opts.append('--with-lg-vaddr=56')
+
+possible_malloc_conf_opts = [
+ 'tcache:false',
+ 'dss:primary',
+ 'percpu_arena:percpu',
+ 'background_thread:true',
+]
+
+print('set -e')
+print('if [ -f Makefile ] ; then %(make_cmd)s relclean ; fi' % {'make_cmd':
+ make_cmd})
+print('autoconf')
+print('rm -rf run_tests.out')
+print('mkdir run_tests.out')
+print('cd run_tests.out')
+
+ind = 0
+for cc, cxx in possible_compilers:
+ for compiler_opts in powerset(possible_compiler_opts):
+ for config_opts in powerset(possible_config_opts):
+ for malloc_conf_opts in powerset(possible_malloc_conf_opts):
+ if cc == 'clang' \
+ and '-m32' in possible_compiler_opts \
+ and '--enable-prof' in config_opts:
+ continue
+ config_line = (
+ 'EXTRA_CFLAGS=-Werror EXTRA_CXXFLAGS=-Werror '
+ + 'CC="{} {}" '.format(cc, " ".join(compiler_opts))
+ + 'CXX="{} {}" '.format(cxx, " ".join(compiler_opts))
+ + '../../configure '
+ + " ".join(config_opts) + (' --with-malloc-conf=' +
+ ",".join(malloc_conf_opts) if len(malloc_conf_opts) > 0
+ else '')
+ )
+
+ # We don't want to test large vaddr spaces in 32-bit mode.
+ if ('-m32' in compiler_opts and '--with-lg-vaddr=56' in
+ config_opts):
+ continue
+
+ # Per CPU arenas are only supported on Linux.
+ linux_supported = ('percpu_arena:percpu' in malloc_conf_opts \
+ or 'background_thread:true' in malloc_conf_opts)
+ # Heap profiling and dss are not supported on OS X.
+ darwin_unsupported = ('--enable-prof' in config_opts or \
+ 'dss:primary' in malloc_conf_opts)
+ if (uname == 'Linux' and linux_supported) \
+ or (not linux_supported and (uname != 'Darwin' or \
+ not darwin_unsupported)):
+ print("""cat <<EOF > run_test_%(ind)d.sh
+#!/bin/sh
+
+set -e
+
+abort() {
+ echo "==> Error" >> run_test.log
+ echo "Error; see run_tests.out/run_test_%(ind)d.out/run_test.log"
+ exit 255 # Special exit code tells xargs to terminate.
+}
+
+# Environment variables are not supported.
+run_cmd() {
+ echo "==> \$@" >> run_test.log
+ \$@ >> run_test.log 2>&1 || abort
+}
+
+echo "=> run_test_%(ind)d: %(config_line)s"
+mkdir run_test_%(ind)d.out
+cd run_test_%(ind)d.out
+
+echo "==> %(config_line)s" >> run_test.log
+%(config_line)s >> run_test.log 2>&1 || abort
+
+run_cmd %(make_cmd)s all tests
+run_cmd %(make_cmd)s check
+run_cmd %(make_cmd)s distclean
+EOF
+chmod 755 run_test_%(ind)d.sh""" % {'ind': ind, 'config_line': config_line,
+ 'make_cmd': make_cmd})
+ ind += 1
+
+print('for i in `seq 0 %(last_ind)d` ; do echo run_test_${i}.sh ; done | xargs'
+ ' -P %(nparallel)d -n 1 sh' % {'last_ind': ind-1, 'nparallel': nparallel})
diff --git a/deps/jemalloc/scripts/gen_travis.py b/deps/jemalloc/scripts/gen_travis.py
new file mode 100755
index 0000000..4366a06
--- /dev/null
+++ b/deps/jemalloc/scripts/gen_travis.py
@@ -0,0 +1,327 @@
+#!/usr/bin/env python3
+
+from itertools import combinations, chain
+from enum import Enum, auto
+
+
+LINUX = 'linux'
+OSX = 'osx'
+WINDOWS = 'windows'
+FREEBSD = 'freebsd'
+
+
+AMD64 = 'amd64'
+ARM64 = 'arm64'
+PPC64LE = 'ppc64le'
+
+
+TRAVIS_TEMPLATE = """\
+# This config file is generated by ./scripts/gen_travis.py.
+# Do not edit by hand.
+
+# We use 'minimal', because 'generic' makes Windows VMs hang at startup. Also
+# the software provided by 'generic' is simply not needed for our tests.
+# Differences are explained here:
+# https://docs.travis-ci.com/user/languages/minimal-and-generic/
+language: minimal
+dist: focal
+
+jobs:
+ include:
+{jobs}
+
+before_install:
+ - |-
+ if test -f "./scripts/$TRAVIS_OS_NAME/before_install.sh"; then
+ source ./scripts/$TRAVIS_OS_NAME/before_install.sh
+ fi
+
+before_script:
+ - |-
+ if test -f "./scripts/$TRAVIS_OS_NAME/before_script.sh"; then
+ source ./scripts/$TRAVIS_OS_NAME/before_script.sh
+ else
+ scripts/gen_travis.py > travis_script && diff .travis.yml travis_script
+ autoconf
+ # If COMPILER_FLAGS are not empty, add them to CC and CXX
+ ./configure ${{COMPILER_FLAGS:+ CC="$CC $COMPILER_FLAGS" \
+CXX="$CXX $COMPILER_FLAGS"}} $CONFIGURE_FLAGS
+ make -j3
+ make -j3 tests
+ fi
+
+script:
+ - |-
+ if test -f "./scripts/$TRAVIS_OS_NAME/script.sh"; then
+ source ./scripts/$TRAVIS_OS_NAME/script.sh
+ else
+ make check
+ fi
+"""
+
+
+class Option(object):
+ class Type:
+ COMPILER = auto()
+ COMPILER_FLAG = auto()
+ CONFIGURE_FLAG = auto()
+ MALLOC_CONF = auto()
+ FEATURE = auto()
+
+ def __init__(self, type, value):
+ self.type = type
+ self.value = value
+
+ @staticmethod
+ def as_compiler(value):
+ return Option(Option.Type.COMPILER, value)
+
+ @staticmethod
+ def as_compiler_flag(value):
+ return Option(Option.Type.COMPILER_FLAG, value)
+
+ @staticmethod
+ def as_configure_flag(value):
+ return Option(Option.Type.CONFIGURE_FLAG, value)
+
+ @staticmethod
+ def as_malloc_conf(value):
+ return Option(Option.Type.MALLOC_CONF, value)
+
+ @staticmethod
+ def as_feature(value):
+ return Option(Option.Type.FEATURE, value)
+
+ def __eq__(self, obj):
+ return (isinstance(obj, Option) and obj.type == self.type
+ and obj.value == self.value)
+
+
+# The 'default' configuration is gcc, on linux, with no compiler or configure
+# flags. We also test with clang, -m32, --enable-debug, --enable-prof,
+# --disable-stats, and --with-malloc-conf=tcache:false. To avoid abusing
+# travis though, we don't test all 2**7 = 128 possible combinations of these;
+# instead, we only test combinations of up to 2 'unusual' settings, under the
+# hope that bugs involving interactions of such settings are rare.
+MAX_UNUSUAL_OPTIONS = 2
+
+
+GCC = Option.as_compiler('CC=gcc CXX=g++')
+CLANG = Option.as_compiler('CC=clang CXX=clang++')
+CL = Option.as_compiler('CC=cl.exe CXX=cl.exe')
+
+
+compilers_unusual = [CLANG,]
+
+
+CROSS_COMPILE_32BIT = Option.as_feature('CROSS_COMPILE_32BIT')
+feature_unusuals = [CROSS_COMPILE_32BIT]
+
+
+configure_flag_unusuals = [Option.as_configure_flag(opt) for opt in (
+ '--enable-debug',
+ '--enable-prof',
+ '--disable-stats',
+ '--disable-libdl',
+ '--enable-opt-safety-checks',
+ '--with-lg-page=16',
+)]
+
+
+malloc_conf_unusuals = [Option.as_malloc_conf(opt) for opt in (
+ 'tcache:false',
+ 'dss:primary',
+ 'percpu_arena:percpu',
+ 'background_thread:true',
+)]
+
+
+all_unusuals = (compilers_unusual + feature_unusuals
+ + configure_flag_unusuals + malloc_conf_unusuals)
+
+
+def get_extra_cflags(os, compiler):
+ if os == FREEBSD:
+ return []
+
+ if os == WINDOWS:
+ # For non-CL compilers under Windows (for now it's only MinGW-GCC),
+ # -fcommon needs to be specified to correctly handle multiple
+ # 'malloc_conf' symbols and such, which are declared weak under Linux.
+ # Weak symbols don't work with MinGW-GCC.
+ if compiler != CL.value:
+ return ['-fcommon']
+ else:
+ return []
+
+ # We get some spurious errors when -Warray-bounds is enabled.
+ extra_cflags = ['-Werror', '-Wno-array-bounds']
+ if compiler == CLANG.value or os == OSX:
+ extra_cflags += [
+ '-Wno-unknown-warning-option',
+ '-Wno-ignored-attributes'
+ ]
+ if os == OSX:
+ extra_cflags += [
+ '-Wno-deprecated-declarations',
+ ]
+ return extra_cflags
+
+
+# Formats a job from a combination of flags
+def format_job(os, arch, combination):
+ compilers = [x.value for x in combination if x.type == Option.Type.COMPILER]
+ assert(len(compilers) <= 1)
+ compiler_flags = [x.value for x in combination if x.type == Option.Type.COMPILER_FLAG]
+ configure_flags = [x.value for x in combination if x.type == Option.Type.CONFIGURE_FLAG]
+ malloc_conf = [x.value for x in combination if x.type == Option.Type.MALLOC_CONF]
+ features = [x.value for x in combination if x.type == Option.Type.FEATURE]
+
+ if len(malloc_conf) > 0:
+ configure_flags.append('--with-malloc-conf=' + ','.join(malloc_conf))
+
+ if not compilers:
+ compiler = GCC.value
+ else:
+ compiler = compilers[0]
+
+ extra_environment_vars = ''
+ cross_compile = CROSS_COMPILE_32BIT.value in features
+ if os == LINUX and cross_compile:
+ compiler_flags.append('-m32')
+
+ features_str = ' '.join([' {}=yes'.format(feature) for feature in features])
+
+ stringify = lambda arr, name: ' {}="{}"'.format(name, ' '.join(arr)) if arr else ''
+ env_string = '{}{}{}{}{}{}'.format(
+ compiler,
+ features_str,
+ stringify(compiler_flags, 'COMPILER_FLAGS'),
+ stringify(configure_flags, 'CONFIGURE_FLAGS'),
+ stringify(get_extra_cflags(os, compiler), 'EXTRA_CFLAGS'),
+ extra_environment_vars)
+
+ job = ' - os: {}\n'.format(os)
+ job += ' arch: {}\n'.format(arch)
+ job += ' env: {}'.format(env_string)
+ return job
+
+
+def generate_unusual_combinations(unusuals, max_unusual_opts):
+ """
+ Generates different combinations of non-standard compilers, compiler flags,
+ configure flags and malloc_conf settings.
+
+ @param max_unusual_opts: Limit of unusual options per combination.
+ """
+ return chain.from_iterable(
+ [combinations(unusuals, i) for i in range(max_unusual_opts + 1)])
+
+
+def included(combination, exclude):
+ """
+ Checks if the combination of options should be included in the Travis
+ testing matrix.
+
+ @param exclude: A list of options to be avoided.
+ """
+ return not any(excluded in combination for excluded in exclude)
+
+
+def generate_jobs(os, arch, exclude, max_unusual_opts, unusuals=all_unusuals):
+ jobs = []
+ for combination in generate_unusual_combinations(unusuals, max_unusual_opts):
+ if included(combination, exclude):
+ jobs.append(format_job(os, arch, combination))
+ return '\n'.join(jobs)
+
+
+def generate_linux(arch):
+ os = LINUX
+
+ # Only generate 2 unusual options for AMD64 to reduce matrix size
+ max_unusual_opts = MAX_UNUSUAL_OPTIONS if arch == AMD64 else 1
+
+ exclude = []
+ if arch == PPC64LE:
+ # Avoid 32 bit builds and clang on PowerPC
+ exclude = (CROSS_COMPILE_32BIT, CLANG,)
+
+ return generate_jobs(os, arch, exclude, max_unusual_opts)
+
+
+def generate_macos(arch):
+ os = OSX
+
+ max_unusual_opts = 1
+
+ exclude = ([Option.as_malloc_conf(opt) for opt in (
+ 'dss:primary',
+ 'percpu_arena:percpu',
+ 'background_thread:true')] +
+ [Option.as_configure_flag('--enable-prof')] +
+ [CLANG,])
+
+ return generate_jobs(os, arch, exclude, max_unusual_opts)
+
+
+def generate_windows(arch):
+ os = WINDOWS
+
+ max_unusual_opts = 3
+ unusuals = (
+ Option.as_configure_flag('--enable-debug'),
+ CL,
+ CROSS_COMPILE_32BIT,
+ )
+ return generate_jobs(os, arch, (), max_unusual_opts, unusuals)
+
+
+def generate_freebsd(arch):
+ os = FREEBSD
+
+ max_unusual_opts = 4
+ unusuals = (
+ Option.as_configure_flag('--enable-debug'),
+ Option.as_configure_flag('--enable-prof --enable-prof-libunwind'),
+ Option.as_configure_flag('--with-lg-page=16 --with-malloc-conf=tcache:false'),
+ CROSS_COMPILE_32BIT,
+ )
+ return generate_jobs(os, arch, (), max_unusual_opts, unusuals)
+
+
+
+def get_manual_jobs():
+ return """\
+ # Development build
+ - os: linux
+ env: CC=gcc CXX=g++ CONFIGURE_FLAGS="--enable-debug \
+--disable-cache-oblivious --enable-stats --enable-log --enable-prof" \
+EXTRA_CFLAGS="-Werror -Wno-array-bounds"
+ # --enable-expermental-smallocx:
+ - os: linux
+ env: CC=gcc CXX=g++ CONFIGURE_FLAGS="--enable-debug \
+--enable-experimental-smallocx --enable-stats --enable-prof" \
+EXTRA_CFLAGS="-Werror -Wno-array-bounds"
+"""
+
+
+def main():
+ jobs = '\n'.join((
+ generate_windows(AMD64),
+
+ generate_freebsd(AMD64),
+
+ generate_linux(AMD64),
+ generate_linux(PPC64LE),
+
+ generate_macos(AMD64),
+
+ get_manual_jobs(),
+ ))
+
+ print(TRAVIS_TEMPLATE.format(jobs=jobs))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/deps/jemalloc/scripts/linux/before_install.sh b/deps/jemalloc/scripts/linux/before_install.sh
new file mode 100644
index 0000000..6741746
--- /dev/null
+++ b/deps/jemalloc/scripts/linux/before_install.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+set -ev
+
+if [[ "$TRAVIS_OS_NAME" != "linux" ]]; then
+ echo "Incorrect \$TRAVIS_OS_NAME: expected linux, got $TRAVIS_OS_NAME"
+ exit 1
+fi
+
+if [[ "$CROSS_COMPILE_32BIT" == "yes" ]]; then
+ sudo apt-get update
+ sudo apt-get -y install gcc-multilib g++-multilib
+fi
diff --git a/deps/jemalloc/scripts/windows/before_install.sh b/deps/jemalloc/scripts/windows/before_install.sh
new file mode 100644
index 0000000..2740c45
--- /dev/null
+++ b/deps/jemalloc/scripts/windows/before_install.sh
@@ -0,0 +1,83 @@
+#!/bin/bash
+
+set -e
+
+# The purpose of this script is to install build dependencies and set
+# $build_env to a function that sets appropriate environment variables,
+# to enable (mingw32|mingw64) environment if we want to compile with gcc, or
+# (mingw32|mingw64) + vcvarsall.bat if we want to compile with cl.exe
+
+if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then
+ echo "Incorrect \$TRAVIS_OS_NAME: expected windows, got $TRAVIS_OS_NAME"
+ exit 1
+fi
+
+[[ ! -f C:/tools/msys64/msys2_shell.cmd ]] && rm -rf C:/tools/msys64
+choco uninstall -y mingw
+choco upgrade --no-progress -y msys2
+
+msys_shell_cmd="cmd //C RefreshEnv.cmd && set MSYS=winsymlinks:nativestrict && C:\\tools\\msys64\\msys2_shell.cmd"
+
+msys2() { $msys_shell_cmd -defterm -no-start -msys2 -c "$*"; }
+mingw32() { $msys_shell_cmd -defterm -no-start -mingw32 -c "$*"; }
+mingw64() { $msys_shell_cmd -defterm -no-start -mingw64 -c "$*"; }
+
+if [[ "$CROSS_COMPILE_32BIT" == "yes" ]]; then
+ mingw=mingw32
+ mingw_gcc_package_arch=i686
+else
+ mingw=mingw64
+ mingw_gcc_package_arch=x86_64
+fi
+
+if [[ "$CC" == *"gcc"* ]]; then
+ $mingw pacman -S --noconfirm --needed \
+ autotools \
+ git \
+ mingw-w64-${mingw_gcc_package_arch}-make \
+ mingw-w64-${mingw_gcc_package_arch}-gcc \
+ mingw-w64-${mingw_gcc_package_arch}-binutils
+ build_env=$mingw
+elif [[ "$CC" == *"cl"* ]]; then
+ $mingw pacman -S --noconfirm --needed \
+ autotools \
+ git \
+ mingw-w64-${mingw_gcc_package_arch}-make \
+ mingw-w64-${mingw_gcc_package_arch}-binutils
+
+ # In order to use MSVC compiler (cl.exe), we need to correctly set some environment
+ # variables, namely PATH, INCLUDE, LIB and LIBPATH. The correct values of these
+ # variables are set by a batch script "vcvarsall.bat". The code below generates
+ # a batch script that calls "vcvarsall.bat" and prints the environment variables.
+ #
+ # Then, those environment variables are transformed from cmd to bash format and put
+ # into a script $apply_vsenv. If cl.exe needs to be used from bash, one can
+ # 'source $apply_vsenv' and it will apply the environment variables needed for cl.exe
+ # to be located and function correctly.
+ #
+ # At last, a function "mingw_with_msvc_vars" is generated which forwards user input
+ # into a correct mingw (32 or 64) subshell that automatically performs 'source $apply_vsenv',
+ # making it possible for autotools to discover and use cl.exe.
+ vcvarsall="vcvarsall.tmp.bat"
+ echo "@echo off" > $vcvarsall
+ echo "call \"c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\\\vcvarsall.bat\" $USE_MSVC" >> $vcvarsall
+ echo "set" >> $vcvarsall
+
+ apply_vsenv="./apply_vsenv.sh"
+ cmd //C $vcvarsall | grep -E "^PATH=" | sed -n -e 's/\(.*\)=\(.*\)/export \1=$PATH:"\2"/g' \
+ -e 's/\([a-zA-Z]\):[\\\/]/\/\1\//g' \
+ -e 's/\\/\//g' \
+ -e 's/;\//:\//gp' > $apply_vsenv
+ cmd //C $vcvarsall | grep -E "^(INCLUDE|LIB|LIBPATH)=" | sed -n -e 's/\(.*\)=\(.*\)/export \1="\2"/gp' >> $apply_vsenv
+
+ cat $apply_vsenv
+ mingw_with_msvc_vars() { $msys_shell_cmd -defterm -no-start -$mingw -c "source $apply_vsenv && ""$*"; }
+ build_env=mingw_with_msvc_vars
+
+ rm -f $vcvarsall
+else
+ echo "Unknown C compiler: $CC"
+ exit 1
+fi
+
+echo "Build environment function: $build_env"
diff --git a/deps/jemalloc/scripts/windows/before_script.sh b/deps/jemalloc/scripts/windows/before_script.sh
new file mode 100644
index 0000000..9d30aba
--- /dev/null
+++ b/deps/jemalloc/scripts/windows/before_script.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+set -e
+
+if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then
+ echo "Incorrect \$TRAVIS_OS_NAME: expected windows, got $TRAVIS_OS_NAME"
+ exit 1
+fi
+
+$build_env autoconf
+$build_env ./configure $CONFIGURE_FLAGS
+# mingw32-make simply means "make", unrelated to mingw32 vs mingw64.
+# Simply disregard the prefix and treat is as "make".
+$build_env mingw32-make -j3
+# At the moment, it's impossible to make tests in parallel,
+# seemingly due to concurrent writes to '.pdb' file. I don't know why
+# that happens, because we explicitly supply '/Fs' to the compiler.
+# Until we figure out how to fix it, we should build tests sequentially
+# on Windows.
+$build_env mingw32-make tests
diff --git a/deps/jemalloc/scripts/windows/script.sh b/deps/jemalloc/scripts/windows/script.sh
new file mode 100644
index 0000000..3a27f70
--- /dev/null
+++ b/deps/jemalloc/scripts/windows/script.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+set -e
+
+if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then
+ echo "Incorrect \$TRAVIS_OS_NAME: expected windows, got $TRAVIS_OS_NAME"
+ exit 1
+fi
+
+$build_env mingw32-make -k check