From a1bbad83c1bff1868bb86763d7f0bd008d2c01e9 Mon Sep 17 00:00:00 2001 From: Theodore Kisner Date: Wed, 18 Jun 2025 19:37:55 -0700 Subject: [PATCH] Updates to wheel dependencies: - Add Eigen3, GLOG, and Ceres-Solver to wheel builds - Update manylinux wheel container to 2_28 - Update cibuildwheel version to last 2.x version --- .github/workflows/wheels.yml | 11 ++-- test-requirements.txt | 2 - wheels/install_deps_linux.sh | 100 +++++++++++++++++++++++++++++- wheels/install_deps_osx.sh | 100 +++++++++++++++++++++++++++++- wheels/test_local_cibuildwheel.sh | 5 +- 5 files changed, 206 insertions(+), 12 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 2c7da150..12aa28b0 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -94,8 +94,8 @@ jobs: # deploy: 14.0 env: CIBW_BUILD: cp${{ matrix.python }}-${{ matrix.builder }}_${{ matrix.arch }} - CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.builder }}2014 - CIBW_MANYLINUX_I686_IMAGE: ${{ matrix.builder }}2014 + CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.builder }}_2_28 + CIBW_MANYLINUX_I686_IMAGE: ${{ matrix.builder }}_2_28 CIBW_BUILD_VERBOSITY: 3 CIBW_ENVIRONMENT_LINUX: > CC=gcc @@ -121,8 +121,9 @@ jobs: ./wheels/install_deps_osx.sh CIBW_REPAIR_WHEEL_COMMAND_LINUX: ./wheels/repair_wheel_linux.sh {dest_dir} {wheel} CIBW_REPAIR_WHEEL_COMMAND_MACOS: ./wheels/repair_wheel_macos.sh {dest_dir} {wheel} {delocate_archs} - CIBW_BEFORE_TEST: export OMP_NUM_THREADS=2 - CIBW_TEST_REQUIRES: pytest pixell + CIBW_BEFORE_TEST: > + python -m pip install -r test-requirements.txt && + export OMP_NUM_THREADS=2 CIBW_TEST_COMMAND: > python -c 'import so3g.smurf.reader; from spt3g import core' && python -m pytest {package}/test @@ -137,7 +138,7 @@ jobs: - name: Install cibuildwheel run: | - python -m pip install cibuildwheel==2.22.0 + python -m pip install cibuildwheel==2.23.3 - name: Build wheel run: | diff --git a/test-requirements.txt b/test-requirements.txt index 16b00f94..bb64d71e 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,5 +1,3 @@ -# testing pytest pytest-cov -# Required for full pointing support and testing pixell diff --git a/wheels/install_deps_linux.sh b/wheels/install_deps_linux.sh index 7c1d3647..7de0f23b 100755 --- a/wheels/install_deps_linux.sh +++ b/wheels/install_deps_linux.sh @@ -43,7 +43,7 @@ python3 -m pip install -v cmake wheel setuptools pyver=$(python3 --version 2>&1 | awk '{print $2}' | sed -e "s#\(.*\)\.\(.*\)\..*#\1.\2#") # Install build requirements. -CC="${CC}" CFLAGS="${CFLAGS}" python3 -m pip install -v -r "${scriptdir}/../requirements.txt" +CC="${CC}" CFLAGS="${CFLAGS}" python3 -m pip install -v -r "${scriptdir}/../requirements.txt" --prefer-binary # Install Openblas @@ -159,6 +159,104 @@ tar xzf ${gsl_pkg} \ && CC="${CC}" CFLAGS="-O3 -fPIC" ../configure --prefix="${PREFIX}" \ && make -j ${MAKEJ} \ && make install \ + && popd >/dev/null 2>&1 \ + && popd >/dev/null 2>&1 + +# Build Eigen + +eigen_version=3.4.0 +eigen_dir=eigen-${eigen_version} +eigen_pkg=${eigen_dir}.tar.gz + +echo "Fetching Eigen..." + +if [ ! -e ${eigen_pkg} ]; then + curl -SL "https://gitlab.com/libeigen/eigen/-/archive/${eigen_version}/eigen-${eigen_version}.tar.bz2" -o "${eigen_pkg}" +fi + +echo "Building Eigen..." + +rm -rf ${eigen_dir} +tar xjf ${eigen_pkg} \ + && pushd ${eigen_dir} >/dev/null 2>&1 \ + && mkdir -p build \ + && pushd build >/dev/null 2>&1 \ + && cmake \ + -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ + .. \ + && make install \ + && popd >/dev/null 2>&1 \ + && popd >/dev/null 2>&1 + +# Build GLOG + +glog_version=0.7.1 +glog_dir=glog-${glog_version} +glog_pkg=${glog_dir}.tar.gz + +echo "Fetching GLOG..." + +if [ ! -e ${glog_pkg} ]; then + curl -SL "https://github.com/google/glog/archive/refs/tags/v${glog_version}.tar.gz" -o "${glog_pkg}" +fi + +echo "Building GLOG..." + +rm -rf ${glog_dir} +tar xzf ${glog_pkg} \ + && pushd ${glog_dir} >/dev/null 2>&1 \ + && mkdir -p build \ + && pushd build >/dev/null 2>&1 \ + && cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_COMPILER="${CC}" \ + -DCMAKE_C_FLAGS="${CFLAGS}" \ + -DCMAKE_CXX_COMPILER="${CXX}" \ + -DCMAKE_CXX_FLAGS="${CXXFLAGS}" \ + -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ + -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ + .. \ + && make -j ${MAKEJ} install \ + && popd >/dev/null 2>&1 \ + && popd >/dev/null 2>&1 + +# Build Ceres + +ceres_version=2.2.0 +ceres_dir=ceres-solver-${ceres_version} +ceres_pkg=${ceres_dir}.tar.gz + +echo "Fetching ceres-solver..." + +if [ ! -e ${ceres_pkg} ]; then + curl -SL "http://ceres-solver.org/ceres-solver-${ceres_version}.tar.gz" -o "${ceres_pkg}" +fi + +echo "Building ceres-solver..." + +rm -rf ${ceres_dir} +tar xzf ${ceres_pkg} \ + && pushd ${ceres_dir} >/dev/null 2>&1 \ + && mkdir -p build_dir \ + && pushd build_dir >/dev/null 2>&1 \ + && cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_COMPILER="${CC}" \ + -DCMAKE_C_FLAGS="${CFLAGS}" \ + -DCMAKE_CXX_COMPILER="${CXX}" \ + -DCMAKE_CXX_FLAGS="${CXXFLAGS}" \ + -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ + -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_BENCHMARKS=OFF \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_TESTING=OFF \ + -DGFLAGS=OFF \ + -DSUITESPARSE=OFF \ + -DBLAS_LIBRARIES='-L/usr/local/lib -lopenblas -fopenmp -lm -lgfortran' \ + .. \ + && make -j ${MAKEJ} install \ + && popd >/dev/null 2>&1 \ && popd >/dev/null 2>&1 # Astropy caching... diff --git a/wheels/install_deps_osx.sh b/wheels/install_deps_osx.sh index 4a12fad3..a426c676 100755 --- a/wheels/install_deps_osx.sh +++ b/wheels/install_deps_osx.sh @@ -65,7 +65,7 @@ python3 -m pip install cmake wheel setuptools pyver=$(python3 --version 2>&1 | awk '{print $2}' | sed -e "s#\(.*\)\.\(.*\)\..*#\1.\2#") # Install build requirements. -CC="${CC}" CFLAGS="${CFLAGS}" python3 -m pip install -v -r "${scriptdir}/../requirements.txt" scipy_openblas32 +CC="${CC}" CFLAGS="${CFLAGS}" python3 -m pip install -v -r "${scriptdir}/../requirements.txt" --prefer-binary # Install Openblas @@ -157,6 +157,7 @@ tar xzf ${gsl_pkg} \ && CC="${CC}" CFLAGS="-O3 -fPIC" ../configure --prefix="${PREFIX}" \ && make -j ${MAKEJ} \ && make install \ + && popd >/dev/null 2>&1 \ && popd >/dev/null 2>&1 # Install boost @@ -199,6 +200,103 @@ tar xjf ${boost_pkg} \ variant=release threading=multi link=shared runtime-link=shared install \ && popd >/dev/null 2>&1 +# Build Eigen + +eigen_version=3.4.0 +eigen_dir=eigen-${eigen_version} +eigen_pkg=${eigen_dir}.tar.gz + +echo "Fetching Eigen..." + +if [ ! -e ${eigen_pkg} ]; then + curl -SL "https://gitlab.com/libeigen/eigen/-/archive/${eigen_version}/eigen-${eigen_version}.tar.bz2" -o "${eigen_pkg}" +fi + +echo "Building Eigen..." + +rm -rf ${eigen_dir} +tar xjf ${eigen_pkg} \ + && pushd ${eigen_dir} >/dev/null 2>&1 \ + && mkdir -p build \ + && pushd build >/dev/null 2>&1 \ + && cmake \ + -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ + .. \ + && make install \ + && popd >/dev/null 2>&1 \ + && popd >/dev/null 2>&1 + +# Build GLOG + +glog_version=0.7.1 +glog_dir=glog-${glog_version} +glog_pkg=${glog_dir}.tar.gz + +echo "Fetching GLOG..." + +if [ ! -e ${glog_pkg} ]; then + curl -SL "https://github.com/google/glog/archive/refs/tags/v${glog_version}.tar.gz" -o "${glog_pkg}" +fi + +echo "Building GLOG..." + +rm -rf ${glog_dir} +tar xzf ${glog_pkg} \ + && pushd ${glog_dir} >/dev/null 2>&1 \ + && mkdir -p build \ + && pushd build >/dev/null 2>&1 \ + && cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_COMPILER="${CC}" \ + -DCMAKE_C_FLAGS="${CFLAGS}" \ + -DCMAKE_CXX_COMPILER="${CXX}" \ + -DCMAKE_CXX_FLAGS="${CXXFLAGS}" \ + -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ + -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ + .. \ + && make -j ${MAKEJ} install \ + && popd >/dev/null 2>&1 \ + && popd >/dev/null 2>&1 + +# Build Ceres + +ceres_version=2.2.0 +ceres_dir=ceres-solver-${ceres_version} +ceres_pkg=${ceres_dir}.tar.gz + +echo "Fetching ceres-solver..." + +if [ ! -e ${ceres_pkg} ]; then + curl -SL "http://ceres-solver.org/ceres-solver-${ceres_version}.tar.gz" -o "${ceres_pkg}" +fi + +echo "Building ceres-solver..." + +rm -rf ${ceres_dir} +tar xzf ${ceres_pkg} \ + && pushd ${ceres_dir} >/dev/null 2>&1 \ + && mkdir -p build_dir \ + && pushd build_dir >/dev/null 2>&1 \ + && cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_COMPILER="${CC}" \ + -DCMAKE_C_FLAGS="${CFLAGS}" \ + -DCMAKE_CXX_COMPILER="${CXX}" \ + -DCMAKE_CXX_FLAGS="${CXXFLAGS}" \ + -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ + -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_BENCHMARKS=OFF \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_TESTING=OFF \ + -DGFLAGS=OFF \ + -DSUITESPARSE=OFF \ + -DBLAS_LIBRARIES='/usr/local/lib/libopenblas.dylib' \ + .. \ + && make -j ${MAKEJ} install \ + && popd >/dev/null 2>&1 \ + && popd >/dev/null 2>&1 + # Astropy caching... echo "Attempting to trigger astropy IERS download..." diff --git a/wheels/test_local_cibuildwheel.sh b/wheels/test_local_cibuildwheel.sh index 1c39fc4c..f1b4847a 100755 --- a/wheels/test_local_cibuildwheel.sh +++ b/wheels/test_local_cibuildwheel.sh @@ -6,13 +6,12 @@ export CIBW_DEBUG_KEEP_CONTAINER=TRUE export CIBW_BUILD="cp312-manylinux_x86_64" -export CIBW_MANYLINUX_X86_64_IMAGE="manylinux2014" +export CIBW_MANYLINUX_X86_64_IMAGE="manylinux_2_28" export CIBW_BUILD_VERBOSITY=3 export CIBW_ENVIRONMENT_LINUX="CC=gcc CXX=g++ CFLAGS='-O3 -fPIC' CXXFLAGS='-O3 -fPIC -std=c++14'" export CIBW_BEFORE_BUILD_LINUX="./wheels/install_deps_linux.sh" export CIBW_REPAIR_WHEEL_COMMAND_LINUX="./wheels/repair_wheel_linux.sh {dest_dir} {wheel}" -export CIBW_BEFORE_TEST="export OMP_NUM_THREADS=2" -export CIBW_TEST_REQUIRES="pytest" +export CIBW_BEFORE_TEST="python -m pip install -r test-requirements.txt && export OMP_NUM_THREADS=2" export CIBW_TEST_COMMAND="python -c 'import so3g.smurf.reader; from spt3g import core' && python -m pytest {package}/test" # Get the current date for logging