diff --git a/docker/manylinux2014/README.md b/docker/manylinux2014/README.md index c9a5ee9ace18c335a86c1aac2f9be50007e015e7..d56ed1497cb8a45824fb1afa57f3bbc60d5ea18e 100644 --- a/docker/manylinux2014/README.md +++ b/docker/manylinux2014/README.md @@ -76,29 +76,20 @@ zlib-devel ``` #!/bin/bash -eux -source "/work/config/config" +source "/io/config/config" for PYBIN in /opt/python/*/bin; do "$PYBIN"/pip install numpy - "$PYBIN"/pip install -i https://test.pypi.org/simple/ eigenpy==2.4.2 + "$PYBIN"/pip install -i https://test.pypi.org/simple/ eigenpy-test==2.4.3 done -# TODO: eigenpyTargets-release.cmake has the wrong path to libeigenpy -sed -i 's:IMPORTED_LOCATION_RELEASE "":IMPORTED_LOCATION_RELEASE "/usr/lib/python2.7/site-packages/eigenpy/eigenpy.libs/libeigenpy-453555c1.so":' /usr/lib/cmake/eigenpy/eigenpyTargets-release.cmake -sed -i 's:libeigenpy.so:libeigenpy-453555c1.so:' /usr/lib/cmake/eigenpy/eigenpyTargets-release.cmake - -# TODO: the files in /opt/_internal/cpython-*/lib/cmake/eigenpy/eigenpyTargets-release.cmake need to be modified -# TODO: but even then cmake need to be searching in the right directory (with the right python version) to find these files - git clone -j"$NPROC" git://github.com/OctoMap/octomap.git cd octomap/ mkdir build && cd build cmake .. make -j"$NPROC" install -cd /io +cd /src rm -rf octomap ``` -To build : `LD_LIBRARY_PATH=/usr/lib/python2.7/site-packages/eigenpy/eigenpy.libs:$LD_LIBRARY_PATH ./build_wheels.sh` - -Only the python 2.7 wheels are working for now, to test the wheels make sure `libgl1-mesa-dev` is installed. +To test the wheels make sure `libgl1` is installed. diff --git a/docker/manylinux2014/scripts/build_wheels.sh b/docker/manylinux2014/scripts/build_wheels.sh index b0f5bf27e6faad03013838bf7cdfa84f37b61451..3222983824d8abbf1a3175bc3ca40e0423f84622 100755 --- a/docker/manylinux2014/scripts/build_wheels.sh +++ b/docker/manylinux2014/scripts/build_wheels.sh @@ -1,4 +1,4 @@ -#!/bin/bash -eu +#!/bin/bash -eux function repair_wheel { wheel="$1" @@ -31,16 +31,20 @@ source config # Build wheels for PYBIN in /opt/python/*/bin; do - PYVERSION=$(find "$PYBIN" -name 'python[0-9]\.[0-9]' -printf "%f\n" | grep -Eo '[0-9].[0-9]') [ -n "$INSTALL_REQUIRES" ] && "$PYBIN/pip" install "$(echo "$INSTALL_REQUIRES" | sed -E 's/"|\[|\]|,//g')" - "$PYBIN/python" setup.py bdist_wheel -- -- -j"$NPROC" + + PYVERSION=$(find "$PYBIN" -type f -name 'python*.*' | head -1 | grep -Eo "[0-9]\.[0-9]") + CMAKE_PREFIX_PATH=$(find / -path "*$PYVERSION*" -type d -name cmake | tr '\n' ';') + + "$PYBIN/python" setup.py bdist_wheel -DCMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH" -DBUILD_TESTING=OFF -j"$NPROC" # Bundle external shared libraries into the wheels MAIN_LIB=$(find _skbuild/*/cmake-build -type f ! -path '*test/*' -name 'lib*.so*') MAIN_LIB_DIR=$(pwd)/$(dirname "$MAIN_LIB") + OTHER_LIB_DIRS=$(find / -path "*$PYVERSION*.libs/*" -name *.so | xargs dirname | tr '\n' ':') WHEEL_NAME=$(ls -Art dist/ | tail -n 1) - LD_LIBRARY_PATH="$MAIN_LIB_DIR:$LD_LIBRARY_PATH" \ + LD_LIBRARY_PATH="$MAIN_LIB_DIR:$OTHER_LIB_DIRS$LD_LIBRARY_PATH" \ repair_wheel "dist/$WHEEL_NAME" rm -rf _skbuild done @@ -52,7 +56,7 @@ for whl in /io/wheelhouse/*.whl; do LIB_DIR=$(find . -type d -name '*.libs') PACKAGE_DIR=$(dirname "$MAIN_LIB") LIB64_DIR=$(find . -type d -name 'lib64') - WHEEL_DIR=$(echo "$MAIN_LIB" | cut -d'/' -f2) + WHEEL_DIR=$(find . -name *.so | head -1 | cut -d'/' -f2) # Put the libs inside the package directory so the relative path to the libs is always the same mv "$LIB_DIR" "$PACKAGE_DIR"/ @@ -69,15 +73,6 @@ for whl in /io/wheelhouse/*.whl; do # Remove libraries that are present twice (auditwheel already copied them in the .libs directory) rm -f "$LIB64_DIR"/*.so* - #TODO: .cmake files should not have references to _skbuild, temporary fix (only for eigenpy.so): - find "$WHEEL_DIR" -name '*.cmake' | while read -r file; do - sed -i 's:;/src/_skbuild/linux-x86_64-.*/cmake-install/include::' "$file" - sed -i 's:/src/_skbuild/linux-x86_64-.*/cmake-install/lib64/libeigenpy.so:/usr/lib/python2.7/site-packages/eigenpy/eigenpy.libs/libeigenpy-453555c1.so:' "$file" - sed -i 's:libeigenpy.so:libeigenpy-453555c1.so:' "$file" - sed -i 's:/src/_skbuild/linux-x86_64-.*/cmake-install/include:/usr/local/include:' "$file" - sed -i 's:/src/_skbuild/linux-x86_64-.*/cmake-install/lib64:/usr/local/lib64:' "$file" - done - wheel pack "$WHEEL_DIR" -d /io/wheelhouse rm -rf "${WHEEL_DIR:?}"/ done @@ -88,6 +83,28 @@ for PYBIN in /opt/python/*/bin; do (cd "$HOME"; test "$PYBIN/python") done +# TODO: Fix generated .cmake files (need to be done after installing the wheels so we know where the shared libraries are installed) +for whl in /io/wheelhouse/*.whl; do + wheel unpack "$whl" + + WHEEL_DIR=$(find . -name *.so | head -1 | cut -d'/' -f2) + PYVERSION=$(find "$WHEEL_DIR" -type d -name 'python*' | tail -c4) + MAIN_LIB=$(find / ! -path "*$WHEEL_DIR*" -path "*$PYVERSION*$PACKAGE_NAME*.libs/*" -name "*$PACKAGE_NAME*.so") + MAIN_LIB_NAME=$(basename "$MAIN_LIB") # libeigenpy-[hash].so + MAIN_LIB_NAME_NO_HASH=$(echo $MAIN_LIB_NAME | sed 's/-.*\.so/\.so/') # libeigenpy.so + + #TODO: .cmake files should not have references to _skbuild, this is only a temporary fix to be able to build hpp-fcl + find "$WHEEL_DIR" -name '*.cmake' | while read -r file; do + sed -i 's:/src/_skbuild/linux-x86_64-.*/cmake-install/include:/usr/local/include:' "$file" || true + sed -i "s:/src/_skbuild/linux-x86_64-.*/cmake-install/lib64/.*\.so:$MAIN_LIB:" "$file" || true + sed -i "s:$MAIN_LIB_NAME_NO_HASH:$MAIN_LIB_NAME:" "$file" || true + sed -i 's:/src/_skbuild/linux-x86_64-.*/cmake-install/lib64:/usr/local/lib64:' "$file" || true + done + + wheel pack "$WHEEL_DIR" -d /io/wheelhouse + rm -rf "${WHEEL_DIR:?}"/ +done + rm -rf "$TARGET_NAME".egg-info/ dist/ ls /io/wheelhouse