From e26ed056c22400552918c3a97dfb13614c9a03f5 Mon Sep 17 00:00:00 2001 From: Rui Dias Gomes <66125272+rmdg88@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:20:52 +0100 Subject: [PATCH] fix: windows build properly linking to system libraries (#36) Signed-off-by: rmdg88 --- .github/workflows/wheels.yml | 17 +++++---- cmake/extlib_qpdf_v11.cmake | 71 ++++++++++++++++++++---------------- poetry.lock | 33 ++++++++++++++--- pyproject.toml | 2 + 4 files changed, 79 insertions(+), 44 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 3a90d738..428f1825 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -242,12 +242,15 @@ jobs: update: true install: > mingw-w64-x86_64-toolchain - mingw-w64-i686-toolchain + mingw-w64-x86_64-gcc-libs - - name: Set up QPDF external-libs [windows] + - name: Set up external-libs [windows] if: ${{matrix.os.platform_id == 'win_amd64'}} shell: pwsh run: | + Copy-Item -Path "C:/mingw64/bin/libgcc_s_seh-1.dll" -Destination ".\docling_parse" + Copy-Item -Path "C:/mingw64/bin/libstdc++-6.dll" -Destination ".\docling_parse" + Copy-Item -Path "C:/mingw64/bin/libwinpthread-1.dll" -Destination ".\docling_parse" New-Item -Path 'C:\windows-libs' -ItemType Directory -Force Invoke-WebRequest -Uri 'https://github.com/qpdf/external-libs/releases/download/release-2024-06-07/qpdf-external-libs-bin.zip' -OutFile 'C:\windows-libs\qpdf-external-libs-bin.zip' Expand-Archive -Path 'C:\windows-libs\qpdf-external-libs-bin.zip' -DestinationPath 'C:\windows-libs' -Force @@ -268,11 +271,11 @@ jobs: CIBW_BUILD_VERBOSITY: 3 CIBW_ARCHS: AMD64 CIBW_PROJECT_REQUIRES_PYTHON: "~=${{ matrix.python-version }}.0" - PKG_CONFIG_PATH: "C:/msys64/mingw64/lib/pkgconfig" - PKG_CONFIG_EXECUTABLE: "C:/msys64/usr/bin/pkg-config.exe" - CMAKE_PREFIX_PATH: "C:/msys64/mingw64;C:/windows-libs/external-libs" - CMAKE_LIBRARY_PATH: "C:/msys64/mingw64/lib;C:/windows-libs/external-libs/lib-mingw64" - CMAKE_INCLUDE_PATH: "C:/msys64/mingw64/include;C:/windows-libs/external-libs/include" + PKG_CONFIG_PATH: "C:/msys64/usr/lib/pkgconfig" + PKG_CONFIG_EXECUTABLE: "C:/mingw64/bin/pkg-config.exe" + CMAKE_PREFIX_PATH: "C:/msys64/mingw64;C:/mingw64;C:/windows-libs/external-libs" + CMAKE_LIBRARY_PATH: "C:/msys64/mingw64/lib;C:/mingw64/lib;C:/windows-libs/external-libs/lib-mingw64" + CMAKE_INCLUDE_PATH: "C:/msys64/mingw64/include;C:/mingw64/include;C:/windows-libs/external-libs/include" CMAKE_GENERATOR: "MSYS Makefiles" BUILD_THREADS: 1 ASM_NASM: "C:/nasm/nasm.exe" diff --git a/cmake/extlib_qpdf_v11.cmake b/cmake/extlib_qpdf_v11.cmake index 5ff76cd6..624a9fde 100644 --- a/cmake/extlib_qpdf_v11.cmake +++ b/cmake/extlib_qpdf_v11.cmake @@ -19,13 +19,22 @@ else() set(QPDF_URL https://github.com/qpdf/qpdf.git) set(QPDF_TAG v11.9.1 ) + + set(QPDF_LIB ${EXTERNALS_PREFIX_PATH}/lib/libqpdf.a) + set(JPEG_LIB ${EXTERNALS_PREFIX_PATH}/lib/libjpeg.a) if(UNIX) - set(QPDF_EXTRA_CXX_FLAGS "-fPIC ") - set(QPDF_EXTRA_C_FLAGS "-fPIC ") + set(QPDF_EXTRA_CXX_FLAGS "-fPIC ") + set(QPDF_EXTRA_C_FLAGS "-fPIC ") + set(BUILD_SHARED_LIBS ON) + elseif(WIN32) + set(QPDF_EXTRA_CXX_FLAGS "") + set(QPDF_EXTRA_C_FLAGS "") + set(BUILD_SHARED_LIBS OFF) else() - set(QPDF_EXTRA_CXX_FLAGS " ") - set(QPDF_EXTRA_C_FLAGS " ") + set(QPDF_EXTRA_CXX_FLAGS " ") + set(QPDF_EXTRA_C_FLAGS " ") + set(BUILD_SHARED_LIBS ON) endif() ExternalProject_Add(extlib_qpdf @@ -44,35 +53,33 @@ else() INSTALL_DIR ${EXTERNALS_PREFIX_PATH} - CMAKE_ARGS \\ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \\ - -DBUILD_SHARED_LIBS=ON \\ - -DUSE_IMPLICIT_CRYPTO=OFF \\ - -DREQUIRE_CRYPTO_NATIVE=ON \\ - -DCMAKE_CXX_FLAGS=${QPDF_EXTRA_CXX_FLAGS} \\ - -DCMAKE_C_FLAGS=${QPDF_EXTRA_C_FLAGS} \\ - -DLIBJPEG_LIBRARY=${EXTERNALS_PREFIX_PATH}/lib/libjpeg.a \\ - -DLIBJPEG_LIBRARIES=${EXTERNALS_PREFIX_PATH}/lib/libjpeg.a \\ - -DLIBJPEG_LIB_PATH=${EXTERNALS_PREFIX_PATH}/lib/libjpeg.a \\ - -DLIBJPEG_LIBDIR=${EXTERNALS_PREFIX_PATH}/lib \\ - -DLIBJPEG_H_PATH=${EXTERNALS_PREFIX_PATH}/include \\ - -DLIBJPEG_INCLUDEDIR=${EXTERNALS_PREFIX_PATH}/include \\ - -Dpc_libjpeg_LIBRARY=${EXTERNALS_PREFIX_PATH}/lib/libjpeg.a \\ - -Dpc_libjpeg_LIBRARIES=${EXTERNALS_PREFIX_PATH}/lib/libjpeg.a \\ - -Dpc_libjpeg_LIB_PATH=${EXTERNALS_PREFIX_PATH}/lib/libjpeg.a \\ - -Dpc_libjpeg_LIBDIR=${EXTERNALS_PREFIX_PATH}/lib \\ - -Dpc_libjpeg_H_PATH=${EXTERNALS_PREFIX_PATH}/include \\ - -Dpc_libjpeg_INCLUDEDIR=${EXTERNALS_PREFIX_PATH}/include \\ - -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} \\ - -DINSTALL_EXAMPLES=OFF \\ - -DBUILD_DOC_DIST=OFF \\ - -DCMAKE_INSTALL_LIBDIR=${EXTERNALS_PREFIX_PATH}/lib \\ + CMAKE_ARGS \\ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \\ + -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} \\ + -DUSE_IMPLICIT_CRYPTO=OFF \\ + -DREQUIRE_CRYPTO_NATIVE=ON \\ + -DCMAKE_CXX_FLAGS=${QPDF_EXTRA_CXX_FLAGS} \\ + -DCMAKE_C_FLAGS=${QPDF_EXTRA_C_FLAGS} \\ + -DLIBJPEG_LIBRARY=${JPEG_LIB} \\ + -DLIBJPEG_LIBRARIES=${JPEG_LIB} \\ + -DLIBJPEG_LIB_PATH=${JPEG_LIB} \\ + -DLIBJPEG_LIBDIR=${EXTERNALS_PREFIX_PATH}/lib \\ + -DLIBJPEG_H_PATH=${EXTERNALS_PREFIX_PATH}/include \\ + -DLIBJPEG_INCLUDEDIR=${EXTERNALS_PREFIX_PATH}/include \\ + -Dpc_libjpeg_LIBRARY=${JPEG_LIB} \\ + -Dpc_libjpeg_LIBRARIES=${JPEG_LIB} \\ + -Dpc_libjpeg_LIB_PATH=${JPEG_LIB} \\ + -Dpc_libjpeg_LIBDIR=${EXTERNALS_PREFIX_PATH}/lib \\ + -Dpc_libjpeg_H_PATH=${EXTERNALS_PREFIX_PATH}/include \\ + -Dpc_libjpeg_INCLUDEDIR=${EXTERNALS_PREFIX_PATH}/include \\ + -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} \\ + -DINSTALL_EXAMPLES=OFF \\ + -DBUILD_DOC_DIST=OFF \\ + -DCMAKE_INSTALL_LIBDIR=${EXTERNALS_PREFIX_PATH}/lib \\ -DCMAKE_INSTALL_PREFIX=${EXTERNALS_PREFIX_PATH} LOG_DOWNLOAD ON - # LOG_CONFIGURE ON - # LOG_BUILD ON - ) + ) add_library(${ext_name} STATIC IMPORTED) add_dependencies(${ext_name} extlib_qpdf) @@ -82,8 +89,8 @@ else() # ref: https://gitlab.kitware.com/cmake/cmake/-/issues/15052 file(MAKE_DIRECTORY ${EXT_INCLUDE_DIRS}) set_target_properties(${ext_name} PROPERTIES - IMPORTED_LOCATION ${EXTERNALS_PREFIX_PATH}/lib/libqpdf.a - INTERFACE_LINK_LIBRARIES ${EXTERNALS_PREFIX_PATH}/lib/libjpeg.a + IMPORTED_LOCATION ${QPDF_LIB} + INTERFACE_LINK_LIBRARIES ${JPEG_LIB} INTERFACE_LINK_DIRECTORIES ${EXTERNALS_PREFIX_PATH}/lib INTERFACE_INCLUDE_DIRECTORIES ${EXT_INCLUDE_DIRS} ) diff --git a/poetry.lock b/poetry.lock index 643d7cb8..7f3301ce 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1207,6 +1207,29 @@ docs = ["Jinja2 (==3.0.3)", "Sphinx (==1.8.6)"] mypy = ["mypy", "types-requests"] test = ["coverage (>=5,<6)", "mock (==1.3.0)", "pytest (>=7,<8)", "pytest-mock (>=2,<3)", "pytest-xdist (>=1,<2)", "responses (==0.13.3)"] +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + [[package]] name = "pywin32-ctypes" version = "0.2.3" @@ -1442,13 +1465,13 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -1615,4 +1638,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "bdea8f34a11e0c9723977591858e65d1b3d6fd7822ad8ee719a8e256b2d94b78" +content-hash = "264ea9ccfbffc8d7f2030a893b8a7e06ccbdf8068f6d327f67296fc9dff261fa" diff --git a/pyproject.toml b/pyproject.toml index 7daf1f3d..8bd3553a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ packages = [{include = "docling_parse"}] include = [ {path = "docling_parse/*.so", format = "wheel"}, {path = "docling_parse/*.pyd", format = "wheel"}, + {path = "docling_parse/*.dll", format = "wheel"}, {path = "docling_parse/pdf_resources", format = ["sdist", "wheel"]}, {path = "docling_parse/pdf_resources", format = ["sdist", "wheel"]}, {path = "CMakeLists.txt", format = "sdist"}, @@ -47,6 +48,7 @@ build = "build.py" [tool.poetry.dependencies] python = "^3.9" tabulate = ">=0.9.0,<1.0.0" +pywin32 = { version = "^306", markers = "sys_platform == 'win32'" } [tool.poetry.group.dev.dependencies] pytest = "^7.4.2"