| # Define custom utilities |
| # Test for OSX with [ -n "$IS_OSX" ] |
| |
| function pre_build { |
| # Any stuff that you need to do before you start building the wheels |
| # Runs in the root directory of this repository. |
| pushd protobuf |
| |
| if [ "$PLAT" == "aarch64" ] |
| then |
| local configure_host_flag="--host=aarch64" |
| fi |
| |
| # Build protoc and libprotobuf |
| ./autogen.sh |
| CXXFLAGS="-fPIC -g -O2" ./configure $configure_host_flag |
| make -j8 |
| |
| if [ "$PLAT" == "aarch64" ] |
| then |
| # we are crosscompiling for aarch64 while running on x64 |
| # the simplest way for build_py command to be able to generate |
| # the protos is by running the protoc process under |
| # an emulator. That way we don't have to build a x64 version |
| # of protoc. The qemu-arm emulator is already included |
| # in the dockcross docker image. |
| # Running protoc under an emulator is fast as protoc doesn't |
| # really do much. |
| |
| # create a simple shell wrapper that runs crosscompiled protoc under qemu |
| echo '#!/bin/bash' >protoc_qemu_wrapper.sh |
| echo 'exec qemu-aarch64 "../src/protoc" "$@"' >>protoc_qemu_wrapper.sh |
| chmod ugo+x protoc_qemu_wrapper.sh |
| |
| # PROTOC variable is by build_py step that runs under ./python directory |
| export PROTOC=../protoc_qemu_wrapper.sh |
| fi |
| |
| # Generate python dependencies. |
| pushd python |
| python setup.py build_py |
| popd |
| |
| popd |
| } |
| |
| function bdist_wheel_cmd { |
| # Builds wheel with bdist_wheel, puts into wheelhouse |
| # |
| # It may sometimes be useful to use bdist_wheel for the wheel building |
| # process. For example, versioneer has problems with versions which are |
| # fixed with bdist_wheel: |
| # https://github.com/warner/python-versioneer/issues/121 |
| local abs_wheelhouse=$1 |
| |
| # Modify build version |
| pwd |
| ls |
| |
| if [ "$PLAT" == "aarch64" ] |
| then |
| # when crosscompiling for aarch64, --plat-name needs to be set explicitly |
| # to end up with correctly named wheel file |
| # the value should be manylinuxABC_ARCH and dockcross docker image |
| # conveniently provides the value in the AUDITWHEEL_PLAT env |
| local plat_name_flag="--plat-name=$AUDITWHEEL_PLAT" |
| |
| # override the value of EXT_SUFFIX to make sure the crosscompiled .so files in the wheel have the correct filename suffix |
| export PROTOCOL_BUFFERS_OVERRIDE_EXT_SUFFIX="$(python -c 'import sysconfig; print(sysconfig.get_config_var("EXT_SUFFIX").replace("-x86_64-linux-gnu.so", "-aarch64-linux-gnu.so"))')" |
| fi |
| |
| python setup.py bdist_wheel --cpp_implementation --compile_static_extension $plat_name_flag |
| cp dist/*.whl $abs_wheelhouse |
| } |
| |
| function build_wheel { |
| build_wheel_cmd "bdist_wheel_cmd" $@ |
| } |
| |
| function run_tests { |
| # Runs tests on installed distribution from an empty directory |
| python --version |
| python -c "from google.protobuf.pyext import _message;" |
| } |
| |
| if [ "$PLAT" == "aarch64" ] |
| then |
| # when crosscompiling for aarch64, override the default multibuild's repair_wheelhouse logic |
| # since "auditwheel repair" doesn't work for crosscompiled wheels |
| function repair_wheelhouse { |
| echo "Skipping repair_wheelhouse since auditwheel requires build architecture to match wheel architecture." |
| } |
| fi |