From e670dccdb03fe40575d2d0633ff402522179669a Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Fri, 15 Nov 2024 14:42:08 +0100 Subject: [PATCH] cmake: Bump Protobuf to v28.3 and use shared libraries --- .github/workflows/amd64_windows_cmake_cpp.yml | 4 +- .../workflows/amd64_windows_cmake_dotnet.yml | 2 +- .../workflows/amd64_windows_cmake_java.yml | 2 +- .../workflows/amd64_windows_cmake_python.yml | 2 +- .github/workflows/arm64_macos_cmake_cpp.yml | 2 +- Dependencies.txt | 2 +- cmake/README.md | 2 + cmake/dependencies/CMakeLists.txt | 27 +++- cmake/host.CMakeLists.txt | 4 +- cmake/java.cmake | 139 +++++++++++++++++ cmake/python.cmake | 144 +++++++++++++++++- ortools/dotnet/Google.OrTools-full.csproj.in | 2 +- ortools/dotnet/Google.OrTools-local.csproj.in | 2 +- .../dotnet/Google.OrTools.runtime.csproj.in | 108 ++++++++++++- ortools/java/com/google/ortools/Loader.java | 31 +++- ortools/java/pom-full.xml.in | 2 +- ortools/java/pom-local.xml.in | 2 +- ortools/python/__init__.py.in | 20 +++ ortools/python/setup.py.in | 7 +- patches/BUILD.bazel | 1 - patches/protobuf-v26.1.patch | 68 --------- 21 files changed, 480 insertions(+), 93 deletions(-) delete mode 100644 patches/protobuf-v26.1.patch diff --git a/.github/workflows/amd64_windows_cmake_cpp.yml b/.github/workflows/amd64_windows_cmake_cpp.yml index d30baf8625..d7904aeee6 100644 --- a/.github/workflows/amd64_windows_cmake_cpp.yml +++ b/.github/workflows/amd64_windows_cmake_cpp.yml @@ -13,7 +13,7 @@ jobs: {generator: "Visual Studio 17 2022", config: Debug, build_target: ALL_BUILD, test_target: RUN_TESTS, install_target: INSTALL}, ] fail-fast: false - name: Windows • ${{ matrix.cmake.generator }} (${{ matrix.cmake.config }}) • C++ + name: Windows • VS 2022 (${{ matrix.cmake.config }}) • C++ runs-on: windows-latest env: CTEST_OUTPUT_ON_FAILURE: 1 @@ -27,7 +27,7 @@ jobs: run: > cmake -S. -Bbuild -G "${{ matrix.cmake.generator }}" - -DCMAKE_BUILD_TYPE=${{ matrix.cmake.config }} + -DCMAKE_CONFIGURATION_TYPES=${{ matrix.cmake.config }} -DBUILD_DEPS=ON -DCMAKE_INSTALL_PREFIX=install - name: Build diff --git a/.github/workflows/amd64_windows_cmake_dotnet.yml b/.github/workflows/amd64_windows_cmake_dotnet.yml index 4e8e612092..9010ebfd66 100644 --- a/.github/workflows/amd64_windows_cmake_dotnet.yml +++ b/.github/workflows/amd64_windows_cmake_dotnet.yml @@ -12,7 +12,7 @@ jobs: {generator: "Visual Studio 17 2022", config: Release, build_target: ALL_BUILD, test_target: RUN_TESTS, install_target: INSTALL}, ] fail-fast: false - name: Windows • ${{ matrix.cmake.generator }} • .Net + name: Windows • VS 2022 • .Net runs-on: windows-latest env: CTEST_OUTPUT_ON_FAILURE: 1 diff --git a/.github/workflows/amd64_windows_cmake_java.yml b/.github/workflows/amd64_windows_cmake_java.yml index 190ebf7d3f..e1f1b18b3f 100644 --- a/.github/workflows/amd64_windows_cmake_java.yml +++ b/.github/workflows/amd64_windows_cmake_java.yml @@ -28,7 +28,7 @@ jobs: {distrib: 'microsoft', version: '21'}, # 2028/09 ] fail-fast: false - name: Windows • ${{ matrix.cmake.generator }} • ${{ matrix.java.distrib }}-${{ matrix.java.version }} + name: Windows • VS 2022 • ${{ matrix.java.distrib }}-${{ matrix.java.version }} runs-on: windows-latest env: CTEST_OUTPUT_ON_FAILURE: 1 diff --git a/.github/workflows/amd64_windows_cmake_python.yml b/.github/workflows/amd64_windows_cmake_python.yml index 7cc795f5c3..0b6191ccf0 100644 --- a/.github/workflows/amd64_windows_cmake_python.yml +++ b/.github/workflows/amd64_windows_cmake_python.yml @@ -19,7 +19,7 @@ jobs: {version: "3.13", dir: Python313}, ] fail-fast: false - name: Windows • ${{ matrix.cmake.generator }} • Python-${{ matrix.python.version }} + name: Windows • VS 2022 • Python-${{ matrix.python.version }} runs-on: windows-latest env: CTEST_OUTPUT_ON_FAILURE: 1 diff --git a/.github/workflows/arm64_macos_cmake_cpp.yml b/.github/workflows/arm64_macos_cmake_cpp.yml index 8388c59aa1..92071673df 100644 --- a/.github/workflows/arm64_macos_cmake_cpp.yml +++ b/.github/workflows/arm64_macos_cmake_cpp.yml @@ -14,7 +14,7 @@ jobs: ] fail-fast: false name: MacOS • ${{ matrix.cmake.generator }} • C++ - runs-on: macos-latest # macos arm64 based runner + runs-on: macos-latest # macos M1 based runner steps: - uses: actions/checkout@v4 - name: Check cmake diff --git a/Dependencies.txt b/Dependencies.txt index 2ec6f3297b..23cc7b11eb 100644 --- a/Dependencies.txt +++ b/Dependencies.txt @@ -1,6 +1,6 @@ ZLIB=1.3.1 abseil-cpp=20240722.0 -Protobuf=v26.1 +Protobuf=v28.3 Eigen=3.4.0 Re2=2024-04-01 CoinUtils=2.11.6 diff --git a/cmake/README.md b/cmake/README.md index 07c0d3fee8..f656bde866 100644 --- a/cmake/README.md +++ b/cmake/README.md @@ -246,6 +246,8 @@ cmake -S. -Bbuild -LH | `USE_DOTNET_CORE_31` | OFF | Enable .Net Core 3.1 LTS support
Only available if `BUILD_DOTNET=ON` and not targeting arm64 platform | | `USE_DOTNET_6` | ON | Enable .Net 6 LTS support
Only available if `BUILD_DOTNET=ON` | | `USE_DOTNET_7` | OFF | Enable .Net 7 support
Only available if `BUILD_DOTNET=ON` | +| `USE_DOTNET_8` | OFF | Enable .Net 8 LTS support
Only available if `BUILD_DOTNET=ON` | +| `USE_DOTNET_9` | OFF | Enable .Net 9 support
Only available if `BUILD_DOTNET=ON` | | `UNIVERSAL_DOTNET_PACKAGE` | OFF | Build a multi platform package (i.e. `Google.OrTools` will depends on all runtime packages)
Only available if `BUILD_DOTNET=ON` | | | | | | `SKIP_GPG` | ON | Disable GPG sign
Only available if `BUILD_JAVA=ON` | diff --git a/cmake/dependencies/CMakeLists.txt b/cmake/dependencies/CMakeLists.txt index 868b5459eb..2fa8d309de 100644 --- a/cmake/dependencies/CMakeLists.txt +++ b/cmake/dependencies/CMakeLists.txt @@ -49,7 +49,7 @@ endif() include(FetchContent) set(FETCHCONTENT_QUIET OFF) set(FETCHCONTENT_UPDATES_DISCONNECTED ON) -set(BUILD_SHARED_LIBS OFF) +set(BUILD_SHARED_LIBS ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(BUILD_TESTING OFF) set(CMAKE_Fortran_COMPILER OFF) @@ -101,17 +101,17 @@ if(BUILD_Protobuf) message(CHECK_START "Fetching Protobuf") list(APPEND CMAKE_MESSAGE_INDENT " ") set(protobuf_BUILD_TESTS OFF) - set(protobuf_BUILD_SHARED_LIBS OFF) + set(protobuf_BUILD_SHARED_LIBS ON) set(protobuf_BUILD_EXPORT OFF) set(protobuf_MSVC_STATIC_RUNTIME OFF) #set(protobuf_BUILD_LIBUPB ON) FetchContent_Declare( Protobuf GIT_REPOSITORY "https://github.com/protocolbuffers/protobuf.git" - GIT_TAG "v26.1" + GIT_TAG "v28.3" GIT_SHALLOW TRUE GIT_SUBMODULES "" - PATCH_COMMAND git apply --ignore-whitespace "${CMAKE_CURRENT_LIST_DIR}/../../patches/protobuf-v26.1.patch" + PATCH_COMMAND git apply --ignore-whitespace "${CMAKE_CURRENT_LIST_DIR}/../../patches/protobuf-v28.3.patch" ) FetchContent_MakeAvailable(Protobuf) list(POP_BACK CMAKE_MESSAGE_INDENT) @@ -295,6 +295,9 @@ endif() # ############################################################################## # Coin-OR does not support C++17/C++20 (use of 'register' storage class specifier) set(CMAKE_CXX_STANDARD 11) +if(WIN32) + set(BUILD_SHARED_LIBS OFF) +endif() if(BUILD_CoinUtils) message(CHECK_START "Fetching CoinUtils") @@ -388,6 +391,9 @@ if(BUILD_Cbc) message(CHECK_PASS "fetched") endif() +if(WIN32) + set(BUILD_SHARED_LIBS ON) +endif() if(MSVC) set(CMAKE_CXX_STANDARD 20) else() @@ -412,7 +418,14 @@ if(BUILD_googletest) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) set(INSTALL_GTEST OFF) set(GTEST_HAS_ABSL ON) + if(WIN32) + set(BUILD_SHARED_LIBS OFF) + endif() FetchContent_MakeAvailable(googletest) + if(WIN32) + set(BUILD_SHARED_LIBS ON) + endif() + list(POP_BACK CMAKE_MESSAGE_INDENT) message(CHECK_PASS "fetched") endif() @@ -430,7 +443,13 @@ if(BUILD_benchmark) set(BENCHMARK_ENABLE_TESTING OFF) set(BENCHMARK_ENABLE_WERROR OFF) set(BENCHMARK_ENABLE_INSTALL OFF) + if(WIN32) + set(BUILD_SHARED_LIBS OFF) + endif() FetchContent_MakeAvailable(benchmark) + if(WIN32) + set(BUILD_SHARED_LIBS ON) + endif() list(POP_BACK CMAKE_MESSAGE_INDENT) message(CHECK_PASS "fetched") endif() diff --git a/cmake/host.CMakeLists.txt b/cmake/host.CMakeLists.txt index b58971db9d..28baee21a8 100644 --- a/cmake/host.CMakeLists.txt +++ b/cmake/host.CMakeLists.txt @@ -121,9 +121,9 @@ set(protobuf_WITH_ZLIB OFF) FetchContent_Declare( protobuf GIT_REPOSITORY "https://github.com/protocolbuffers/protobuf.git" - GIT_TAG "v26.1" + GIT_TAG "v28.3" GIT_SUBMODULES "" - PATCH_COMMAND git apply "${CMAKE_CURRENT_LIST_DIR}/@PATCHES_PATH@/protobuf-v26.1.patch") + PATCH_COMMAND git apply "${CMAKE_CURRENT_LIST_DIR}/@PATCHES_PATH@/protobuf-v28.3.patch") FetchContent_MakeAvailable(protobuf) list(POP_BACK CMAKE_MESSAGE_INDENT) message(CHECK_PASS "fetched") diff --git a/cmake/java.cmake b/cmake/java.cmake index 5b2f2e6bd5..d9ad71b901 100644 --- a/cmake/java.cmake +++ b/cmake/java.cmake @@ -306,6 +306,145 @@ add_custom_command( $ $<${is_ortools_shared}:$> ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + COMMAND ${CMAKE_COMMAND} -E + $,copy,true> + $<${need_unix_zlib_lib}:$> + $<${need_windows_zlib_lib}:$> + ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + COMMAND ${CMAKE_COMMAND} -E + $,copy,true> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_windows_absl_lib}:$> + ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + + COMMAND ${CMAKE_COMMAND} -E + $,copy,true> + $<${need_unix_re2_lib}:$> + $<${need_windows_re2_lib}:$> + ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + + COMMAND ${CMAKE_COMMAND} -E + $,copy,true> + $<${need_unix_protobuf_lib}:$> + $<${need_unix_protobuf_lib}:$> + $<${need_windows_protobuf_lib}:$> + $<${need_windows_protobuf_lib}:$> + ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_coinutils_lib}:$> + ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_osi_lib}:$> + ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_clp_lib}:$> + $<${need_unix_clp_lib}:$> + $<${need_unix_clp_lib}:$> + ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_cgl_lib}:$> + ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_cbc_lib}:$> + $<${need_unix_cbc_lib}:$> + $<${need_unix_cbc_lib}:$> + ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + + COMMAND ${CMAKE_COMMAND} -E + $,copy,true> + $<${need_unix_highs_lib}:$> + $<${need_windows_highs_lib}:$> + ${JAVA_RESSOURCES_PATH}/${JAVA_NATIVE_PROJECT}/ + COMMAND ${MAVEN_EXECUTABLE} compile -B COMMAND ${MAVEN_EXECUTABLE} package -B $<$:-Dfatjar=true> COMMAND ${MAVEN_EXECUTABLE} install -B $<$:-Dgpg.skip=true> diff --git a/cmake/python.cmake b/cmake/python.cmake index 619eae713e..6cc3dc9857 100644 --- a/cmake/python.cmake +++ b/cmake/python.cmake @@ -456,9 +456,147 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E remove -f ortools_timestamp COMMAND ${CMAKE_COMMAND} -E make_directory ${PYTHON_PROJECT}/.libs COMMAND ${CMAKE_COMMAND} -E - $,SHARED_LIBRARY>,copy,true> - $<$,SHARED_LIBRARY>:$> - ${PYTHON_PROJECT}/.libs + $,copy,true> + $<${need_unix_zlib_lib}:$> + $<${need_windows_zlib_lib}:$> + ${PYTHON_PROJECT}/.libs + COMMAND ${CMAKE_COMMAND} -E + $,copy,true> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_unix_absl_lib}:$> + $<${need_windows_absl_lib}:$> + ${PYTHON_PROJECT}/.libs + + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_re2_lib}:$> + ${PYTHON_PROJECT}/.libs + + COMMAND ${CMAKE_COMMAND} -E + $,copy,true> + $<${need_unix_protobuf_lib}:$> + $<${need_unix_protobuf_lib}:$> + $<${need_windows_protobuf_lib}:$> + $<${need_windows_protobuf_lib}:$> + ${PYTHON_PROJECT}/.libs + + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_coinutils_lib}:$> + ${PYTHON_PROJECT}/.libs + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_osi_lib}:$> + ${PYTHON_PROJECT}/.libs + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_clp_lib}:$> + $<${need_unix_clp_lib}:$> + $<${need_unix_clp_lib}:$> + ${PYTHON_PROJECT}/.libs + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_cgl_lib}:$> + ${PYTHON_PROJECT}/.libs + COMMAND ${CMAKE_COMMAND} -E + $ + $<${need_unix_cbc_lib}:$> + $<${need_unix_cbc_lib}:$> + $<${need_unix_cbc_lib}:$> + ${PYTHON_PROJECT}/.libs + + COMMAND ${CMAKE_COMMAND} -E + $,copy,true> + $<${need_unix_highs_lib}:$> + $<${need_windows_highs_lib}:$> + ${PYTHON_PROJECT}/.libs + + COMMAND ${CMAKE_COMMAND} -E + $ + $<${is_ortools_shared}:$> + ${PYTHON_PROJECT}/.libs COMMAND ${CMAKE_COMMAND} -E touch ${PROJECT_BINARY_DIR}/python/ortools_timestamp MAIN_DEPENDENCY ortools/python/setup.py.in diff --git a/ortools/dotnet/Google.OrTools-full.csproj.in b/ortools/dotnet/Google.OrTools-full.csproj.in index 94fe0d295a..86acea665e 100644 --- a/ortools/dotnet/Google.OrTools-full.csproj.in +++ b/ortools/dotnet/Google.OrTools-full.csproj.in @@ -184,7 +184,7 @@ - + diff --git a/ortools/dotnet/Google.OrTools-local.csproj.in b/ortools/dotnet/Google.OrTools-local.csproj.in index 851b23a537..83175a918a 100644 --- a/ortools/dotnet/Google.OrTools-local.csproj.in +++ b/ortools/dotnet/Google.OrTools-local.csproj.in @@ -172,7 +172,7 @@ - + diff --git a/ortools/dotnet/Google.OrTools.runtime.csproj.in b/ortools/dotnet/Google.OrTools.runtime.csproj.in index ad6d3dba0c..50a23ea38a 100644 --- a/ortools/dotnet/Google.OrTools.runtime.csproj.in +++ b/ortools/dotnet/Google.OrTools.runtime.csproj.in @@ -26,7 +26,113 @@ runtimes/@DOTNET_RID@/native/%(Filename)%(Extension) true diff --git a/ortools/java/com/google/ortools/Loader.java b/ortools/java/com/google/ortools/Loader.java index a1243d0839..8f67a28a94 100644 --- a/ortools/java/com/google/ortools/Loader.java +++ b/ortools/java/com/google/ortools/Loader.java @@ -131,8 +131,37 @@ public class Loader { loaded = true; return; } catch (IOException | UnsatisfiedLinkError e) { + // Do nothing. // System.out.println("Can't System.load(jniortools)"); - throw new RuntimeException(e); + } + + // On windows, try to load each libraries one by one. + // System.out.println("Prefix: " + Platform.RESOURCE_PREFIX); + if (Platform.RESOURCE_PREFIX.equals("win32-x86-64")) { + try { + URI resourceURI = getNativeResourceURI(); + Path tempPath = unpackNativeResources(resourceURI); + // libraries order does matter ! + List dlls = Arrays.asList( + "zlib1", "abseil_dll", "re2", "utf8_validity", "libprotobuf", "highs", "jniortools"); + for (String dll : dlls) { + try { + // System.out.println("System.load(" + dll + ")"); + System.load(tempPath.resolve(RESOURCE_PATH) + .resolve(System.mapLibraryName(dll)) + .toAbsolutePath() + .toString()); + } catch (UnsatisfiedLinkError e) { + System.out.println("System.load(" + dll + ") failed!"); + throw new RuntimeException(e); + } + } + loaded = true; + return; + } catch (IOException e) { + // Do nothing. + // System.out.println("unpack failed"); + } } } } diff --git a/ortools/java/pom-full.xml.in b/ortools/java/pom-full.xml.in index ae6b07cc1b..0172065fa7 100644 --- a/ortools/java/pom-full.xml.in +++ b/ortools/java/pom-full.xml.in @@ -109,7 +109,7 @@ com.google.protobuf protobuf-java - 4.26.1 + 4.28.3 diff --git a/ortools/java/pom-local.xml.in b/ortools/java/pom-local.xml.in index 3861137fad..d6544d6bca 100644 --- a/ortools/java/pom-local.xml.in +++ b/ortools/java/pom-local.xml.in @@ -81,7 +81,7 @@ com.google.protobuf protobuf-java - 4.26.1 + 4.28.3 diff --git a/ortools/python/__init__.py.in b/ortools/python/__init__.py.in index 5c23ff8534..8eed3a3e5c 100644 --- a/ortools/python/__init__.py.in +++ b/ortools/python/__init__.py.in @@ -43,3 +43,23 @@ This repository contains several component: __docformat__ = "markdown" # explicitly disable rST processing above. __version__ = "@PROJECT_VERSION@" + +import os + +def _load_ortools_libs(): + """Load shared libraries on Windows""" + if os.name == "nt": + try: + from ctypes import WinDLL + basedir = os.path.dirname(__file__) + except: + pass + else: + for dll in ["zlib1.dll", "abseil_dll.dll", "utf8_validity.dll", "libprotobuf.dll", "highs.dll"]: + dll_path = os.path.join(basedir, ".libs", dll) + if os.path.exists(dll_path): + print(f"load {dll_path}...") + WinDLL(dll_path) + + +_load_ortools_libs() diff --git a/ortools/python/setup.py.in b/ortools/python/setup.py.in index e60b038049..68fd5375ef 100644 --- a/ortools/python/setup.py.in +++ b/ortools/python/setup.py.in @@ -46,11 +46,14 @@ setup( 'absl-py >= 2.0.0', 'numpy >= 1.13.3', 'pandas >= 2.0.0', - 'protobuf >= 5.26.1,<5.27', + 'protobuf >= 5.28.3,<5.29', 'immutabledict >= 3.0.0', ], package_data={ - '@PYTHON_PROJECT@':[$<$,SHARED_LIBRARY>:'.libs/*','../$'>], + '@PYTHON_PROJECT@':[ + '.libs/*', + $<$,SHARED_LIBRARY>:'../$'> + ], '@PYTHON_PROJECT@.init.python':[ '$', '*.pyi' diff --git a/patches/BUILD.bazel b/patches/BUILD.bazel index 9adce1f26c..66d2505fd6 100644 --- a/patches/BUILD.bazel +++ b/patches/BUILD.bazel @@ -14,7 +14,6 @@ exports_files([ "abseil-cpp-20240722.0.patch", "highs-v1.8.0.patch", - "protobuf-v26.1.patch", "protobuf-v28.3.patch", "pybind11_abseil.patch", "pybind11_bazel.patch", diff --git a/patches/protobuf-v26.1.patch b/patches/protobuf-v26.1.patch deleted file mode 100644 index 3e0935fcf8..0000000000 --- a/patches/protobuf-v26.1.patch +++ /dev/null @@ -1,68 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 312eeb928..3e154785b 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -41,7 +41,7 @@ else (BUILD_SHARED_LIBS) - endif (BUILD_SHARED_LIBS) - option(protobuf_BUILD_SHARED_LIBS "Build Shared Libraries" ${protobuf_BUILD_SHARED_LIBS_DEFAULT}) - include(CMakeDependentOption) --cmake_dependent_option(protobuf_MSVC_STATIC_RUNTIME "Link static runtime libraries" ON -+cmake_dependent_option(protobuf_MSVC_STATIC_RUNTIME "Link static runtime libraries" OFF - "NOT protobuf_BUILD_SHARED_LIBS" OFF) - set(protobuf_WITH_ZLIB_DEFAULT ON) - option(protobuf_WITH_ZLIB "Build with zlib support" ${protobuf_WITH_ZLIB_DEFAULT}) -@@ -158,24 +158,16 @@ endif() - - set(_protobuf_FIND_ZLIB) - if (protobuf_WITH_ZLIB) -- find_package(ZLIB) -- if (ZLIB_FOUND) -- set(HAVE_ZLIB 1) -- # FindZLIB module define ZLIB_INCLUDE_DIRS variable -- # Set ZLIB_INCLUDE_DIRECTORIES for compatible -- set(ZLIB_INCLUDE_DIRECTORIES ${ZLIB_INCLUDE_DIRECTORIES} ${ZLIB_INCLUDE_DIRS}) -- # Using imported target if exists -- if (TARGET ZLIB::ZLIB) -- set(ZLIB_LIBRARIES ZLIB::ZLIB) -- set(_protobuf_FIND_ZLIB "if(NOT ZLIB_FOUND)\n find_package(ZLIB)\nendif()") -- endif (TARGET ZLIB::ZLIB) -- else (ZLIB_FOUND) -- set(HAVE_ZLIB 0) -- # Explicitly set these to empty (override NOT_FOUND) so cmake doesn't -- # complain when we use them later. -- set(ZLIB_INCLUDE_DIRECTORIES) -- set(ZLIB_LIBRARIES) -- endif (ZLIB_FOUND) -+ if (NOT TARGET ZLIB::ZLIB) -+ find_package(ZLIB REQUIRED) -+ endif() -+ set(HAVE_ZLIB 1) -+ # FindZLIB module define ZLIB_INCLUDE_DIRS variable -+ # Set ZLIB_INCLUDE_DIRECTORIES for compatible -+ set(ZLIB_INCLUDE_DIRECTORIES ${ZLIB_INCLUDE_DIRECTORIES} ${ZLIB_INCLUDE_DIRS}) -+ # Using imported target if exists -+ set(ZLIB_LIBRARIES ZLIB::ZLIB) -+ set(_protobuf_FIND_ZLIB "if(NOT ZLIB_FOUND AND NOT TARGET ZLIB::ZLIB)\n find_package(ZLIB REQUIRED)\nendif()") - endif (protobuf_WITH_ZLIB) - - # We need to link with libatomic on systems that do not have builtin atomics, or -@@ -277,7 +269,6 @@ else (MSVC) - endif (MSVC) - - include_directories( -- ${ZLIB_INCLUDE_DIRECTORIES} - ${protobuf_BINARY_DIR} - # Support #include-ing other top-level directories, i.e. upb_generator. - ${protobuf_SOURCE_DIR} -diff --git a/cmake/install.cmake b/cmake/install.cmake -index 52914a8ea..d7dc5f232 100644 ---- a/cmake/install.cmake -+++ b/cmake/install.cmake -@@ -31,6 +31,7 @@ foreach(_library ${_protobuf_libraries}) - set_property(TARGET ${_library} - PROPERTY INTERFACE_INCLUDE_DIRECTORIES - $ -+ $ - $) - if (UNIX AND NOT APPLE) - set_property(TARGET ${_library}