diff --git a/mp-jvm-destructor.patch b/mp-jvm-destructor.patch new file mode 100644 index 0000000..f4235b0 --- /dev/null +++ b/mp-jvm-destructor.patch @@ -0,0 +1,64 @@ +--- mp-7fd4828c934fccf7367499c9e01cc9a1e90a2093/solvers/jacop/java.cc.orig 2020-03-03 23:39:58.000000000 -0700 ++++ mp-7fd4828c934fccf7367499c9e01cc9a1e90a2093/solvers/jacop/java.cc 2021-01-15 14:48:04.231938853 -0700 +@@ -119,7 +119,7 @@ std::string RegKey::GetStrValue(fmt::CSt + + namespace mp { + +-JVM JVM::instance_; ++JVM *JVM::instance_; + + void Env::Throw(jthrowable exception, const char *method_name) { + env_->ExceptionClear(); +@@ -190,8 +190,16 @@ JVM::~JVM() { + jvm_->DestroyJavaVM(); + } + ++void JVM::cleanup_jvm() ++{ ++ if (instance_) { ++ delete instance_; ++ instance_ = nullptr; ++ } ++} ++ + Env JVM::env(const char *const *options) { +- if (!instance_.jvm_) { ++ if (!instance_) { + #ifdef _WIN32 + std::string runtime_lib_path; + bool exists = false; +@@ -251,15 +259,19 @@ Env JVM::env(const char *const *options) + } + vm_args.nOptions = static_cast(jvm_options.size()); + vm_args.options = &jvm_options[0]; ++ instance_ = new JVM(); + void *envp = 0; +- jint result = JNI_CreateJavaVM(&instance_.jvm_, &envp, &vm_args); ++ jint result = JNI_CreateJavaVM(&instance_->jvm_, &envp, &vm_args); + if (result != JNI_OK) { ++ delete instance_; ++ instance_ = nullptr; + throw JavaError(fmt::format( + "Java VM initialization failed, error code = {}", result)); + } +- instance_.env_ = Env(static_cast(envp)); ++ instance_->env_ = Env(static_cast(envp)); ++ std::atexit(cleanup_jvm); + } +- return instance_.env_; ++ return instance_->env_; + } + + ClassBase::~ClassBase() {} +--- mp-7fd4828c934fccf7367499c9e01cc9a1e90a2093/solvers/jacop/java.h.orig 2020-03-03 23:39:58.000000000 -0700 ++++ mp-7fd4828c934fccf7367499c9e01cc9a1e90a2093/solvers/jacop/java.h 2021-01-15 14:33:39.263164981 -0700 +@@ -215,7 +215,8 @@ class JVM { + private: + JavaVM *jvm_; + Env env_; +- static JVM instance_; ++ static JVM *instance_; ++ static void cleanup_jvm(); + + JVM() : jvm_() {} + ~JVM(); diff --git a/mp.spec b/mp.spec index a443d3b..ed63c6a 100644 --- a/mp.spec +++ b/mp.spec @@ -1,9 +1,5 @@ %global __cmake_in_source_build 1 -# 'libmp.so' from 'gmp' conflicts with same library provided by this package. -# mp's libraries are so installed in a private directory on epel6. -# https://lists.centos.org/pipermail/centos-devel/2016-June/014820.html - %if 0%{?fedora} %global with_jacop 1 %global with_gecode 1 @@ -22,10 +18,6 @@ %global blaslib openblas %endif -%if 0%{?rhel} && 0%{?rhel} < 7 -%{!?__global_ldflags: %global __global_ldflags -Wl,-z,relro} -%endif - %if 0%{?rhel} && 0%{?rhel} < 8 %{!?_modulesdir: %global _modulesdir %{_datadir}/Modules/modulefiles} %endif @@ -36,7 +28,7 @@ Name: mp Version: 3.1.0 -Release: 31.%{date}git%{shortcommit}%{?dist} +Release: 32.%{date}git%{shortcommit}%{?dist} License: MIT and BSD Summary: An open-source library for mathematical programming URL: https://github.com/ampl/mp @@ -51,6 +43,9 @@ Patch0: %{name}-strtod.patch Patch1: %{name}-%{version}-jni.patch # Adapt to python 3 Patch2: %{name}-python3.patch +# Avoid crashes due to ambiguous order of destructor execution +# https://bugzilla.redhat.com/show_bug.cgi?id=1858054 +Patch3: %{name}-jvm-destructor.patch %if 0%{?rhel} && 0%{?rhel} <= 7 Requires: config(environment-modules) @@ -137,22 +132,14 @@ Requires: %{name}%{?_isa} = %{version}-%{release} %description devel This package contains the header files for %{name}. -%if 0%{?fedora} || 0%{?rhel} > 6 %package doc Summary: Documentation for %{name} %description doc This package contains the developer documentation for %{name}. -%endif %prep -%autosetup -n %{name}-%{commit} -N -%setup -n %{name}-%{commit} -q -T -D -a 2 -%patch0 -p1 -%patch1 -p1 -%if 0%{?fedora} || 0%{?rhel} > 6 -%patch2 -p1 -%endif +%autosetup -n %{name}-%{commit} -a 2 -p1 %if 0%{?with_jacop} jacopver=$(sed -n 's,^ \(.*\),\1,p' %{_mavenpomdir}/jacop/jacop.pom) @@ -183,8 +170,8 @@ done sed -i 's,sphinx-build,&-3.6,' support/build-docs.py %endif -# python-breathe is broken in EPEL 7 and absent in EPEL 6 and 8, so skip -# building sphinx docs for those distributions. +# python-breathe is broken in EPEL 7 and absent in EPEL 8, so skip building +# sphinx docs for those distributions. %if 0%{?rhel} sed -i 's,returncode == 0,False,' support/build-docs.py %endif @@ -202,12 +189,6 @@ BUILD="jacop,$BUILD" export CPPFLAGS="-I$PWD/src/asl/solvers" export CFLAGS="%{optflags} -DNDEBUG" export CXXFLAGS="%{optflags} -DNDEBUG" -export LDFLAGS="%{__global_ldflags}" -%if 0%{?rhel} && 0%{?rhel} < 7 -export CFLAGS="$CFLAGS -Wl,-z,relro -fPIC -pie -Wl,-z,now" -export CXXFLAGS="$CXXFLAGS -Wl,-z,relro -fPIC -pie -Wl,-z,now" -export LDFLAGS="$LDFLAGS -fPIC -pie -Wl,-z,now -Wl,--as-needed" -%endif # Let cmake create rpaths, so the jacop-using files can find libjvm.so. # We strip out the ones we don't want with chrpath at install time. %cmake3 -DCMAKE_INSTALL_PREFIX:PATH=%{_libdir}/%{name} \ @@ -221,10 +202,8 @@ export LDFLAGS="$LDFLAGS -fPIC -pie -Wl,-z,now -Wl,--as-needed" -DBUILD_SHARED_LIBS:BOOL=YES \ -DBUILD:STRING=$BUILD .. %make_build -%if 0%{?fedora} || 0%{?rhel} > 6 make doc rm doc/ampl.github.io/models/*/.depend -%endif popd %install @@ -266,31 +245,6 @@ install -pm 755 build/bin/smpswriter %{buildroot}%{_libdir}/%{name}/bin install -pm 755 build/bin/tableproxy%{__isa_bits} %{buildroot}%{_libdir}/%{name}/bin ## Fix symbolic links -## On epel6 'mp' conflicts with 'gmp' -## We need to install libraries in a private lib directory -%if 0%{?rhel} && 0%{?rhel} < 7 -install -pm 755 build/bin/libasl.so* %{buildroot}%{_libdir}/%{name} -ln -sf %{_libdir}/%{name}/libasl.so.%{version} %{buildroot}%{_libdir}/%{name}/libasl.so.%{majver} -ln -sf libasl.so.%{majver} %{buildroot}%{_libdir}/%{name}/libasl.so - -install -pm 755 build/bin/libmp.so* %{buildroot}%{_libdir}/%{name} -ln -sf %{_libdir}/%{name}/libmp.so.%{version} %{buildroot}%{_libdir}/%{name}/libmp.so.%{majver} -ln -sf libmp.so.%{majver} %{buildroot}%{_libdir}/%{name}/libmp.so - -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/libasl.so.%{version} -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/amplgsl.dll -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/ampltabl.dll -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/cp.dll -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/fullbit.dll -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/gecode -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/gjh -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/gsl-info -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/libamplgecode.so -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/libamplsmpswriter.so -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/simpbit.dll -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/smpswriter -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/tableproxy%{__isa_bits} -%else install -pm 755 build/bin/libasl.so* %{buildroot}%{_libdir} ln -sf libasl.so.%{version} %{buildroot}%{_libdir}/libasl.so.%{majver} ln -sf libasl.so.%{majver} %{buildroot}%{_libdir}/libasl.so @@ -321,32 +275,15 @@ chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/libamplsmpswriter.so chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/simpbit.dll chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/smpswriter chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/tableproxy%{__isa_bits} -%endif ## -## Some tests fail on EPEL6 ppc64 -# https://github.com/ampl/mp/issues/101 %check pushd build # Some of the tests use the SAME FILENAME to store temporary results, so # running the tests in parallel leads to intermittent test failures, generally # in either os-test or solver-test. Do not pass the parallel flags to ctest. -%if 0%{?rhel} -%if 0%{?rhel} < 7 -# https://github.com/ampl/mp/issues/103 -ctest3 --force-new-ctest-process -E gsl -%else -ctest3 --force-new-ctest-process -%endif -%else -# jacop-test is failing with new java-11-openjdk-11.0.8.10 (rhbz#1859925) -#ctest --force-new-ctest-process -j1 -VV --output-on-failure --debug -R 'jacop-test' && exit 1 -%ifarch %{power64} -ctest --force-new-ctest-process -j1 -E 'jacop-test' -%else ctest --force-new-ctest-process -j1 -%endif -%endif +popd %ldconfig_scriptlets @@ -355,33 +292,25 @@ ctest --force-new-ctest-process -j1 %license LICENSE.rst %dir %{_libdir}/%{name} %{_libdir}/%{name}/bin/ -%if 0%{?rhel} && 0%{?rhel} < 7 -%{_libdir}/%{name}/libasl.so.3* -%{_libdir}/%{name}/libmp.so.3* -%else %{_libdir}/libasl.so.3* %{_libdir}/libmp.so.3* -%endif %{_modulesdir}/%{name}-%{_arch} %files devel -%if 0%{?rhel} && 0%{?rhel} < 7 -%{_libdir}/%{name}/libasl.so -%{_libdir}/%{name}/libmp.so -%else %{_libdir}/libasl.so %{_libdir}/libmp.so -%endif %{_includedir}/asl %{_includedir}/mp -%if 0%{?fedora} || 0%{?rhel} > 6 %files doc %license LICENSE.rst %doc build/doc/ampl.github.io/* -%endif %changelog +* Fri Jan 15 2021 Jerry James - 3.1.0-32.20200303git7fd4828 +- Add -jvm-destructor to fix jacop-related crashes (bz 1858054) +- Remove RHEL 6 support + * Thu Aug 27 2020 Iñaki Úcar - 3.1.0-31.20200303git7fd4828 - https://fedoraproject.org/wiki/Changes/FlexiBLAS_as_BLAS/LAPACK_manager