scipopt / papilo

Parallel Presolve for Integer and Linear Optimization
GNU Lesser General Public License v3.0
64 stars 17 forks source link

`-DBUILD_SHARED_LIBS=ON` does not build dynamic libs #61

Open barracuda156 opened 1 month ago

barracuda156 commented 1 month ago

How to build libpapilo as a dynamic lib? Standard -DBUILD_SHARED_LIBS=ON fails to have an effect, only static libs get built:

Port libpapilo @2.3.0_0+gfortran contains:
  /opt/local/include/papilo/CMakeConfig.hpp
  /opt/local/include/papilo/Config.hpp
  /opt/local/include/papilo/core/Components.hpp
  /opt/local/include/papilo/core/ConstraintMatrix.hpp
  /opt/local/include/papilo/core/MatrixBuffer.hpp
  /opt/local/include/papilo/core/Objective.hpp
  /opt/local/include/papilo/core/Presolve.hpp
  /opt/local/include/papilo/core/PresolveMethod.hpp
  /opt/local/include/papilo/core/PresolveOptions.hpp
  /opt/local/include/papilo/core/ProbingView.hpp
  /opt/local/include/papilo/core/Problem.hpp
  /opt/local/include/papilo/core/ProblemBuilder.hpp
  /opt/local/include/papilo/core/ProblemFlag.hpp
  /opt/local/include/papilo/core/ProblemUpdate.hpp
  /opt/local/include/papilo/core/Reductions.hpp
  /opt/local/include/papilo/core/RowFlags.hpp
  /opt/local/include/papilo/core/SingleRow.hpp
  /opt/local/include/papilo/core/Solution.hpp
  /opt/local/include/papilo/core/SparseStorage.hpp
  /opt/local/include/papilo/core/Statistics.hpp
  /opt/local/include/papilo/core/SymmetryStorage.hpp
  /opt/local/include/papilo/core/VariableDomains.hpp
  /opt/local/include/papilo/core/postsolve/BoundStorage.hpp
  /opt/local/include/papilo/core/postsolve/Postsolve.hpp
  /opt/local/include/papilo/core/postsolve/PostsolveStatus.hpp
  /opt/local/include/papilo/core/postsolve/PostsolveStorage.hpp
  /opt/local/include/papilo/core/postsolve/PostsolveType.hpp
  /opt/local/include/papilo/core/postsolve/ReductionType.hpp
  /opt/local/include/papilo/core/postsolve/SavedRow.hpp
  /opt/local/include/papilo/external/fmt/chrono.h
  /opt/local/include/papilo/external/fmt/color.h
  /opt/local/include/papilo/external/fmt/compile.h
  /opt/local/include/papilo/external/fmt/core.h
  /opt/local/include/papilo/external/fmt/format-inl.h
  /opt/local/include/papilo/external/fmt/format.h
  /opt/local/include/papilo/external/fmt/locale.h
  /opt/local/include/papilo/external/fmt/os.h
  /opt/local/include/papilo/external/fmt/ostream.h
  /opt/local/include/papilo/external/fmt/posix.h
  /opt/local/include/papilo/external/fmt/printf.h
  /opt/local/include/papilo/external/fmt/ranges.h
  /opt/local/include/papilo/external/lusol/clusol.h
  /opt/local/include/papilo/external/pdqsort/pdqsort.h
  /opt/local/include/papilo/external/ska/bytell_hash_map.hpp
  /opt/local/include/papilo/external/ska/flat_hash_map.hpp
  /opt/local/include/papilo/external/ska/unordered_map.hpp
  /opt/local/include/papilo/interfaces/GlopInterface.hpp
  /opt/local/include/papilo/interfaces/GurobiInterface.hpp
  /opt/local/include/papilo/interfaces/HighsInterface.hpp
  /opt/local/include/papilo/interfaces/RoundingsatInterface.hpp
  /opt/local/include/papilo/interfaces/ScipInterface.hpp
  /opt/local/include/papilo/interfaces/SolverInterface.hpp
  /opt/local/include/papilo/interfaces/SoplexInterface.hpp
  /opt/local/include/papilo/io/BoundType.hpp
  /opt/local/include/papilo/io/Message.hpp
  /opt/local/include/papilo/io/MpsParser.hpp
  /opt/local/include/papilo/io/MpsWriter.hpp
  /opt/local/include/papilo/io/OpbParser.hpp
  /opt/local/include/papilo/io/OpbWriter.hpp
  /opt/local/include/papilo/io/ParseKey.hpp
  /opt/local/include/papilo/io/Parser.hpp
  /opt/local/include/papilo/io/SolParser.hpp
  /opt/local/include/papilo/io/SolWriter.hpp
  /opt/local/include/papilo/misc/Alloc.hpp
  /opt/local/include/papilo/misc/Array.hpp
  /opt/local/include/papilo/misc/DependentRows.hpp
  /opt/local/include/papilo/misc/Flags.hpp
  /opt/local/include/papilo/misc/Hash.hpp
  /opt/local/include/papilo/misc/MultiPrecision.hpp
  /opt/local/include/papilo/misc/Num.hpp
  /opt/local/include/papilo/misc/NumericalStatistics.hpp
  /opt/local/include/papilo/misc/OptionsParser.hpp
  /opt/local/include/papilo/misc/ParameterSet.hpp
  /opt/local/include/papilo/misc/PrimalDualSolValidation.hpp
  /opt/local/include/papilo/misc/Signature.hpp
  /opt/local/include/papilo/misc/StableSum.hpp
  /opt/local/include/papilo/misc/String.hpp
  /opt/local/include/papilo/misc/Timer.hpp
  /opt/local/include/papilo/misc/Validation.hpp
  /opt/local/include/papilo/misc/Vec.hpp
  /opt/local/include/papilo/misc/VectorUtils.hpp
  /opt/local/include/papilo/misc/VersionLogger.hpp
  /opt/local/include/papilo/misc/Wrappers.hpp
  /opt/local/include/papilo/misc/compress_vector.hpp
  /opt/local/include/papilo/misc/fmt.hpp
  /opt/local/include/papilo/misc/tbb.hpp
  /opt/local/include/papilo/presolvers/CoefficientStrengthening.hpp
  /opt/local/include/papilo/presolvers/ConstraintPropagation.hpp
  /opt/local/include/papilo/presolvers/DominatedCols.hpp
  /opt/local/include/papilo/presolvers/DualFix.hpp
  /opt/local/include/papilo/presolvers/DualInfer.hpp
  /opt/local/include/papilo/presolvers/FixContinuous.hpp
  /opt/local/include/papilo/presolvers/FreeVarSubstitution.hpp
  /opt/local/include/papilo/presolvers/ImplIntDetection.hpp
  /opt/local/include/papilo/presolvers/ParallelColDetection.hpp
  /opt/local/include/papilo/presolvers/ParallelRowDetection.hpp
  /opt/local/include/papilo/presolvers/Probing.hpp
  /opt/local/include/papilo/presolvers/SimpleProbing.hpp
  /opt/local/include/papilo/presolvers/SimpleSubstitution.hpp
  /opt/local/include/papilo/presolvers/SimplifyInequalities.hpp
  /opt/local/include/papilo/presolvers/SingletonCols.hpp
  /opt/local/include/papilo/presolvers/SingletonStuffing.hpp
  /opt/local/include/papilo/presolvers/Sparsify.hpp
  /opt/local/include/papilo/verification/ArgumentType.hpp
  /opt/local/include/papilo/verification/CertificateInterface.hpp
  /opt/local/include/papilo/verification/EmptyCertificate.hpp
  /opt/local/include/papilo/verification/VeriPb.hpp
  /opt/local/lib/cmake/papilo/FindTBB.cmake
  /opt/local/lib/cmake/papilo/papilo-config-version.cmake
  /opt/local/lib/cmake/papilo/papilo-config.cmake
  /opt/local/lib/cmake/papilo/papilo-targets-macports.cmake
  /opt/local/lib/cmake/papilo/papilo-targets.cmake
  /opt/local/lib/libclusol.a
  /opt/local/lib/libpapilo-core.a

P. S. Original issue: https://github.com/lgottwald/PaPILO/issues/56

svigerske commented 1 month ago

libpapilo is a library with an API that lets you set up an LP or MIP and get it solved via SCIP and SoPlex, as far as I see. It is only build if SCIP and SoPlex are found. However, for this library, -DBUILD_SHARED_LIBS=ON should have an effect.

But libpapilo-core and libclusol are defined to be always build as static libraries. I don't know the history, e.g., whether these libs were initially meant not to be installed. Also, I'm not sure whether the classes in methods in libpapilo-core were even meant to be part of a public API. They are no attributes in the source that declare what should be visible in a shared/dynamic library. By default, all symbols there have visibility=hidden, which is ok for static libs, but makes them unusable in shared libs. Therefore, if you need to build these as shared libs, you will have to remove this too:

--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -29,8 +29,6 @@ include(GNUInstallDirs)

 # path to e.g. findGMP module
 list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules/)
-set(CMAKE_CXX_VISIBILITY_PRESET hidden)
-set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
 set(CMAKE_POSITION_INDEPENDENT_CODE ON)

 # disable fused floating point contraction to enhance reproducibility across compilers and architectures
@@ -211,7 +209,7 @@ endif()
 if(CMAKE_Fortran_COMPILER AND BLAS_FOUND)
    enable_language(Fortran)

-   add_library(clusol STATIC
+   add_library(clusol
       src/papilo/external/lusol/src/lusol6b.f
       src/papilo/external/lusol/src/lusol7b.f
       src/papilo/external/lusol/src/lusol8b.f
@@ -257,7 +255,7 @@ else()
    set(PAPILO_USE_STANDARD_HASHMAP 1)
 endif()

-add_library(papilo-core STATIC
+add_library(papilo-core
    src/papilo/core/VariableDomains.cpp
    src/papilo/core/SparseStorage.cpp
    src/papilo/core/ConstraintMatrix.cpp

I can then get these libs are shared libs when setting -DBUILD_SHARED_LIBS=ON on my Linux system. I have some doubt that it would be sufficient to build usable Windows DLLs though, since there nothing is exported in a DLL unless it got an explicit dllexport attribute (or via .def file).