From 178c4d4f6ed6e7a7a1894b2c4931a44a371c944a Mon Sep 17 00:00:00 2001 From: Jerry James Date: Feb 21 2020 18:22:02 +0000 Subject: Update to latest git snapshot for bug fixes. Also: - Add -doc subpackage. - Add gecode 5 support, enabling gecode support for all releases. - Add -python3 patch to adapt to python3. - Jacop support did not work at all. Add Requires: jacop, symlink to jacop.jar where mp expects to find it, and fix rpath handling so libjvm.so can be found. - Do not invoke rpm to get the jacop version; that is not guaranteed to work. - Build with openblas instead of atlas. - Run all tests on Fedora and EPEL 7+. - Numerous small spec file cleanups. --- diff --git a/.gitignore b/.gitignore index 280c4b2..7d0b6f6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ -/mp-35060ba2a59f2b0f0fd622ed9df678f142f846ed.tar.gz -/mp-9fdb5147068f3b719999210e56b493327f1ca5e7.zip -/mp-3.1.0.tar.gz -/mp-1f39801af085656e4bf72250356a3a70d5d98e73.zip -/mp-1f39801af085656e4bf72250356a3a70d5d98e73.tar.gz +/mp-*.tar.gz +/mp-*.zip +/ampl.github.io.tar.xz diff --git a/mp-gecode5.patch b/mp-gecode5.patch new file mode 100644 index 0000000..3fbe3a0 --- /dev/null +++ b/mp-gecode5.patch @@ -0,0 +1,539 @@ +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.ampl.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.ampl +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.ampl.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.ampl 2020-02-13 10:54:58.310164230 -0700 +@@ -1,10 +1,10 @@ + # Declarations of suffixes and parameters for Gecode. + +-# Constraint suffix that specifies consistency level for integer propagators. +-suffix icl integer >= 0 <= 3 IN; ++# Constraint suffix that specifies propagation level for integer propagators. ++suffix ipl integer >= 0 <= 3 IN; + +-# Possible values for the icl suffix. +-param icl_val = 0; +-param icl_bnd = 1; +-param icl_dom = 2; +-param icl_def = 3; ++# Possible values for the ipl suffix. ++param ipl_def = 0; ++param ipl_val = 1; ++param ipl_bnd = 2; ++param ipl_dom = 3; +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.cc.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.cc +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.cc.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.cc 2020-02-13 12:00:24.824170732 -0700 +@@ -37,11 +37,11 @@ namespace Search = Gecode::Search; + + namespace { + +-const mp::OptionValueInfo INT_CON_LEVELS[] = { +- {"val", "value propagation or consistency (naive)", Gecode::ICL_VAL}, +- {"bnd", "bounds propagation or consistency", Gecode::ICL_BND}, +- {"dom", "domain propagation or consistency", Gecode::ICL_DOM}, +- {"def", "the default consistency for a constraint", Gecode::ICL_DEF} ++const mp::OptionValueInfo INT_PROP_LEVELS[] = { ++ {"val", "value propagation or consistency (naive)", Gecode::IPL_VAL}, ++ {"bnd", "bounds propagation or consistency", Gecode::IPL_BND}, ++ {"dom", "domain propagation or consistency", Gecode::IPL_DOM}, ++ {"def", "the default propagation for a constraint", Gecode::IPL_DEF} + }; + + const mp::OptionValueInfo VAR_BRANCHINGS[] = { +@@ -76,14 +76,14 @@ const mp::OptionValueInfo VAR_BRANCHINGS + IntVarBranch::SEL_AFC_MAX + }, + { +- "activity_min", +- "lowest activity", +- IntVarBranch::SEL_ACTIVITY_MIN ++ "action_min", ++ "lowest action", ++ IntVarBranch::SEL_ACTION_MIN + }, + { +- "activity_max", +- "highest activity", +- IntVarBranch::SEL_ACTIVITY_MAX ++ "action_max", ++ "highest action", ++ IntVarBranch::SEL_ACTION_MAX + }, + { + "min_min", +@@ -136,13 +136,13 @@ const mp::OptionValueInfo VAR_BRANCHINGS + IntVarBranch::SEL_AFC_SIZE_MAX + }, + { +- "activity_size_min", +- "smallest activity by domain size", +- IntVarBranch::SEL_ACTIVITY_SIZE_MIN}, ++ "action_size_min", ++ "smallest action divided by domain size", ++ IntVarBranch::SEL_ACTION_SIZE_MIN}, + { +- "activity_size_max", +- "largest activity by domain size", +- IntVarBranch::SEL_ACTIVITY_SIZE_MAX ++ "action_size_max", ++ "largest action divided by domain size", ++ IntVarBranch::SEL_ACTION_SIZE_MAX + }, + { + "regret_min_min", +@@ -232,12 +232,12 @@ const mp::OptionValueInfo RESTART_MODES[ + + namespace mp { + +-GecodeProblem::GecodeProblem(int num_vars, Gecode::IntConLevel icl) : +- vars_(space(), num_vars), obj_irt_(Gecode::IRT_NQ), icl_(icl) { ++GecodeProblem::GecodeProblem(int num_vars, Gecode::IntPropLevel ipl) : ++ vars_(space(), num_vars), obj_irt_(Gecode::IRT_NQ), ipl_(ipl) { + } + + GecodeProblem::GecodeProblem(bool share, GecodeProblem &s) : +- Gecode::Space(share, s), obj_irt_(s.obj_irt_), icl_(s.icl_) { ++ Gecode::Space(share, s), obj_irt_(s.obj_irt_), ipl_(s.ipl_) { + vars_.update(*this, share, s.vars_); + if (obj_irt_ != Gecode::IRT_NQ) + obj_.update(*this, share, s.obj_); +@@ -255,7 +255,7 @@ void GecodeProblem::SetObj(obj::Type obj + void GecodeProblem::constrain(const Gecode::Space &best) { + if (obj_irt_ != Gecode::IRT_NQ) { + rel(*this, obj_, obj_irt_, +- static_cast(best).obj_, icl_); ++ static_cast(best).obj_, ipl_); + } + } + +@@ -265,19 +265,19 @@ BoolExpr MPToGecodeConverter::Convert( + int index = 0; + for (IteratedLogicalExpr::iterator + i = e.begin(), end = e.end(); i != end; ++i, ++index) { +- args[index] = Gecode::expr(problem_, Visit(*i), icl_); ++ args[index] = Gecode::expr(problem_, Visit(*i), ipl_); + } + Gecode::BoolVar var(problem_, 0, 1); +- rel(problem_, op, args, var, icl_); ++ rel(problem_, op, args, var, ipl_); + return var; + } + + LinExpr MPToGecodeConverter::Convert(IteratedExpr e, VarArgFunc f) { + IntVarArgs args; + for (VarArgExpr::iterator i = e.begin(), end = e.end(); i != end; ++i) +- args << Gecode::expr(problem_, Visit(*i), icl_); ++ args << Gecode::expr(problem_, Visit(*i), ipl_); + IntVar result(problem_, Gecode::Int::Limits::min, Gecode::Int::Limits::max); +- f(problem_, args, result, icl_); ++ f(problem_, args, result, ipl_); + return result; + } + +@@ -307,15 +307,15 @@ LinExpr MPToGecodeConverter::ConvertExpr + return expr; + } + +-Gecode::IntConLevel MPToGecodeConverter::GetICL(int con_index) const { +- if (!icl_suffix_) +- return icl_; +- int value = icl_suffix_.value(con_index); +- assert(value == Gecode::ICL_VAL || value == Gecode::ICL_BND || +- value == Gecode::ICL_DOM || value == Gecode::ICL_DEF); +- if (value < 0 || value > Gecode::ICL_DEF) +- throw Error("Invalid value \"{}\" for suffix \"icl\"", value); +- return static_cast(value); ++Gecode::IntPropLevel MPToGecodeConverter::GetIPL(int con_index) const { ++ if (!ipl_suffix_) ++ return ipl_; ++ int value = ipl_suffix_.value(con_index); ++ assert(value == Gecode::IPL_VAL || value == Gecode::IPL_BND || ++ value == Gecode::IPL_DOM || value == Gecode::IPL_DEF); ++ if (value < 0 || value > Gecode::IPL_DEF) ++ throw Error("Invalid value \"{}\" for suffix \"ipl\"", value); ++ return static_cast(value); + } + + void MPToGecodeConverter::Convert(const Problem &p) { +@@ -343,19 +343,19 @@ void MPToGecodeConverter::Convert(const + ConvertExpr(obj.linear_expr(), obj.nonlinear_expr())); + } + +- icl_suffix_ = p.suffixes(suf::CON).Find("icl"); ++ ipl_suffix_ = p.suffixes(suf::CON).Find("ipl"); + +- class ICLSetter { ++ class IPLSetter { + private: +- Gecode::IntConLevel &icl_; +- Gecode::IntConLevel saved_value_; ++ Gecode::IntPropLevel &ipl_; ++ Gecode::IntPropLevel saved_value_; + + public: +- ICLSetter(Gecode::IntConLevel &icl, Gecode::IntConLevel new_value) : +- icl_(icl), saved_value_(icl) { +- icl = new_value; ++ IPLSetter(Gecode::IntPropLevel &ipl, Gecode::IntPropLevel new_value) : ++ ipl_(ipl), saved_value_(ipl) { ++ ipl = new_value; + } +- ~ICLSetter() { icl_ = saved_value_; } ++ ~IPLSetter() { ipl_ = saved_value_; } + }; + + // Convert algebraic constraints. +@@ -364,21 +364,21 @@ void MPToGecodeConverter::Convert(const + LinExpr con_expr( + ConvertExpr(con.linear_expr(), con.nonlinear_expr())); + double lb = con.lb(), ub = con.ub(); +- ICLSetter icl_setter(icl_, GetICL(i)); ++ IPLSetter ipl_setter(ipl_, GetIPL(i)); + if (lb <= -inf) { +- rel(problem_, con_expr <= CastToInt(ub), icl_); ++ rel(problem_, con_expr <= CastToInt(ub), ipl_); + continue; + } + if (ub >= inf) { +- rel(problem_, con_expr >= CastToInt(lb), icl_); ++ rel(problem_, con_expr >= CastToInt(lb), ipl_); + continue; + } + int int_lb = CastToInt(lb), int_ub = CastToInt(ub); + if (int_lb == int_ub) { +- rel(problem_, con_expr == int_lb, icl_); ++ rel(problem_, con_expr == int_lb, ipl_); + } else { +- rel(problem_, con_expr >= int_lb, icl_); +- rel(problem_, con_expr <= int_ub, icl_); ++ rel(problem_, con_expr >= int_lb, ipl_); ++ rel(problem_, con_expr <= int_ub, ipl_); + } + } + +@@ -386,9 +386,9 @@ void MPToGecodeConverter::Convert(const + int num_logical_cons = p.num_logical_cons(); + for (int i = 0; i < num_logical_cons; ++i) { + LogicalExpr e = p.logical_con(i).expr(); +- ICLSetter icl_setter(icl_, GetICL(p.num_algebraic_cons() + i)); ++ IPLSetter ipl_setter(ipl_, GetIPL(p.num_algebraic_cons() + i)); + if (e.kind() != expr::ALLDIFF) { +- rel(problem_, Visit(e), icl_); ++ rel(problem_, Visit(e), ipl_); + continue; + } + PairwiseExpr alldiff = Cast(e); +@@ -399,9 +399,9 @@ void MPToGecodeConverter::Convert(const + if (arg.kind() == expr::VARIABLE) + args[i] = vars[Cast(arg).index()]; + else +- args[i] = Gecode::expr(problem_, Visit(arg), icl_); ++ args[i] = Gecode::expr(problem_, Visit(arg), ipl_); + } +- distinct(problem_, args, icl_); ++ distinct(problem_, args, ipl_); + } + } + +@@ -422,16 +422,16 @@ LinExpr MPToGecodeConverter::VisitIf(IfE + if (false_const && false_const.value() == 0) { + NumericConstant true_const = Cast(then_expr); + if (true_const && true_const.value() == 1) { +- Gecode::channel(problem_, Gecode::expr(problem_, condition, icl_), result); ++ Gecode::channel(problem_, Gecode::expr(problem_, condition, ipl_), result); + return result; + } + } + rel(problem_, result, Gecode::IRT_EQ, +- Gecode::expr(problem_, Visit(then_expr), icl_), +- Reify(Gecode::expr(problem_, condition, icl_), Gecode::RM_IMP), icl_); ++ Gecode::expr(problem_, Visit(then_expr), ipl_), ++ Reify(Gecode::expr(problem_, condition, ipl_), Gecode::RM_IMP), ipl_); + rel(problem_, result, Gecode::IRT_EQ, +- Gecode::expr(problem_, Visit(else_expr), icl_), +- Reify(Gecode::expr(problem_, !condition, icl_), Gecode::RM_IMP), icl_); ++ Gecode::expr(problem_, Visit(else_expr), ipl_), ++ Reify(Gecode::expr(problem_, !condition, ipl_), Gecode::RM_IMP), ipl_); + return result; + } + +@@ -450,10 +450,10 @@ LinExpr MPToGecodeConverter::VisitCount( + int index = 0; + for (CountExpr::iterator + i = e.begin(), end = e.end(); i != end; ++i, ++index) { +- args[index] = Gecode::expr(problem_, Visit(*i), icl_); ++ args[index] = Gecode::expr(problem_, Visit(*i), ipl_); + } + IntVar result(problem_, 0, e.num_args()); +- Gecode::linear(problem_, args, Gecode::IRT_EQ, result, icl_); ++ Gecode::linear(problem_, args, Gecode::IRT_EQ, result, ipl_); + return result; + } + +@@ -465,8 +465,8 @@ LinExpr MPToGecodeConverter::VisitNumber + int num_args = e.num_args(); + IntVarArgs args(num_args - 1); + for (int i = 1; i < num_args; ++i) +- args[i - 1] = Gecode::expr(problem_, Visit(e.arg(i)), icl_); +- count(problem_, args, Gecode::expr(problem_, Visit(e.arg(0)), icl_), ++ args[i - 1] = Gecode::expr(problem_, Visit(e.arg(i)), ipl_); ++ count(problem_, args, Gecode::expr(problem_, Visit(e.arg(0)), ipl_), + Gecode::IRT_EQ, result); + return result; + } +@@ -492,12 +492,12 @@ BoolExpr MPToGecodeConverter::LogicalExp + for (int i = 0; i < n; ++i) { + for (int j = i + 1; j < n; ++j) { + Gecode::BoolExpr expr = negate ? args[i] == args[j] : args[i] != args[j]; +- logical_args[index++] = Gecode::expr(problem, expr, converter_.icl_); ++ logical_args[index++] = Gecode::expr(problem, expr, converter_.ipl_); + } + } + Gecode::BoolVar var(problem, 0, 1); + rel(problem, negate ? Gecode::BOT_OR : Gecode::BOT_AND, +- logical_args, var, converter_.icl_); ++ logical_args, var, converter_.ipl_); + return var; + } + +@@ -594,7 +594,7 @@ GecodeSolver::GecodeSolver() + : SolverImpl( + "gecode", "gecode " GECODE_VERSION, 20160205, MULTIPLE_SOL), + output_(false), output_frequency_(1), output_count_(0), solve_code_(-1), +- icl_(Gecode::ICL_DEF), ++ ipl_(Gecode::IPL_DEF), + var_branching_(IntVarBranch::SEL_SIZE_MIN), + val_branching_(IntValBranch::SEL_MIN), + decay_(1), +@@ -604,7 +604,7 @@ GecodeSolver::GecodeSolver() + + set_version("Gecode " GECODE_VERSION); + +- AddSuffix("icl", 0, suf::CON); ++ AddSuffix("ipl", 0, suf::CON); + + set_option_header( + "Gecode Options for AMPL\n" +@@ -625,13 +625,13 @@ GecodeSolver::GecodeSolver() + "Output frequency in seconds. The value should be a positive number.", + &GecodeSolver::GetOutputFrequency, &GecodeSolver::SetOutputFrequency); + +- AddStrOption("icl", +- "Consistency level for integer propagators. Possible values:\n" ++ AddStrOption("ipl", ++ "Propagation level for integer propagators. Possible values:\n" + "\n" + ".. value-table::\n", +- &GecodeSolver::GetEnumOption, +- &GecodeSolver::SetEnumOption, +- &icl_, INT_CON_LEVELS); ++ &GecodeSolver::GetEnumOption, ++ &GecodeSolver::SetEnumOption, ++ &ipl_, INT_PROP_LEVELS); + + AddStrOption("var_branching", + "Variable branching. Possible values:\n" +@@ -726,7 +726,7 @@ void GetSolution(GecodeProblem &gecode_p + solution[j] = vars[j].val(); + } + +-template class, typename> class Meta> ++template class> class Meta> + GecodeSolver::ProblemPtr GecodeSolver::Search( + Problem &p, GecodeProblem &problem, + Search::Statistics &stats, SolutionHandler &sh) { +@@ -734,7 +734,7 @@ GecodeSolver::ProblemPtr GecodeSolver::S + unsigned solution_limit = solution_limit_; + unsigned num_solutions = 0; + if (problem.has_obj()) { +- Meta engine(&problem, options_); ++ Meta engine(&problem, options_); + while (GecodeProblem *next = engine.next()) { + if (output_) + Output("{:46}\n", next->obj().val()); +@@ -748,7 +748,7 @@ GecodeSolver::ProblemPtr GecodeSolver::S + } else { + if (solution_limit == UINT_MAX) + solution_limit = 1; +- Meta engine(&problem, options_); ++ Meta engine(&problem, options_); + std::vector solution; + bool multiple_sol = need_multiple_solutions(); + if (multiple_sol) +@@ -775,7 +775,7 @@ void GecodeSolver::Solve(Problem &p, Sol + SetStatus(-1, ""); + + // Set up an optimization problem in Gecode. +- MPToGecodeConverter converter(p.num_vars(), icl_); ++ MPToGecodeConverter converter(p.num_vars(), ipl_); + converter.Convert(p); + + // Post branching. +@@ -787,12 +787,12 @@ void GecodeSolver::Solve(Problem &p, Sol + break; + case IntVarBranch::SEL_AFC_MIN: + case IntVarBranch::SEL_AFC_MAX: +- case IntVarBranch::SEL_ACTIVITY_MIN: +- case IntVarBranch::SEL_ACTIVITY_MAX: ++ case IntVarBranch::SEL_ACTION_MIN: ++ case IntVarBranch::SEL_ACTION_MAX: + case IntVarBranch::SEL_AFC_SIZE_MIN: + case IntVarBranch::SEL_AFC_SIZE_MAX: +- case IntVarBranch::SEL_ACTIVITY_SIZE_MIN: +- case IntVarBranch::SEL_ACTIVITY_SIZE_MAX: ++ case IntVarBranch::SEL_ACTION_SIZE_MIN: ++ case IntVarBranch::SEL_ACTION_SIZE_MAX: + var_branch = IntVarBranch(var_branching_, decay_, 0); + break; + default: +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.h.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.h +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.h.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/solvers/gecode/gecode.h 2020-02-13 11:59:18.839277859 -0700 +@@ -52,12 +52,12 @@ class GecodeProblem: public Gecode::Spac + Gecode::IntVar obj_; + Gecode::IntRelType obj_irt_; // IRT_NQ - no objective, + // IRT_LE - minimization, IRT_GR - maximization +- Gecode::IntConLevel icl_; ++ Gecode::IntPropLevel ipl_; + + Gecode::Space &space() { return *this; } + + public: +- GecodeProblem(int num_vars, Gecode::IntConLevel icl); ++ GecodeProblem(int num_vars, Gecode::IntPropLevel ipl); + GecodeProblem(bool share, GecodeProblem &s); + + Gecode::Space *copy(bool share); +@@ -75,8 +75,8 @@ class GecodeProblem: public Gecode::Spac + class MPToGecodeConverter : public ExprVisitor { + private: + GecodeProblem problem_; +- Gecode::IntConLevel icl_; +- IntSuffix icl_suffix_; ++ Gecode::IntPropLevel ipl_; ++ IntSuffix ipl_suffix_; + std::vector common_exprs_; + + typedef Gecode::BoolExpr BoolExpr; +@@ -92,7 +92,7 @@ class MPToGecodeConverter : public ExprV + + typedef void (*VarArgFunc)( + Gecode::Home, const Gecode::IntVarArgs &, +- Gecode::IntVar, Gecode::IntConLevel); ++ Gecode::IntVar, Gecode::IntPropLevel); + + LinExpr Convert(IteratedExpr e, VarArgFunc f); + +@@ -100,7 +100,7 @@ class MPToGecodeConverter : public ExprV + + LinExpr ConvertExpr(const LinearExpr &linear, NumericExpr nonlinear); + +- Gecode::IntConLevel GetICL(int con_index) const; ++ Gecode::IntPropLevel GetIPL(int con_index) const; + + class LogicalExprConverter : + public ExprConverter { +@@ -182,8 +182,8 @@ class MPToGecodeConverter : public ExprV + } + + public: +- MPToGecodeConverter(int num_vars, Gecode::IntConLevel icl) +- : problem_(num_vars, icl), icl_(icl) {} ++ MPToGecodeConverter(int num_vars, Gecode::IntPropLevel ipl) ++ : problem_(num_vars, ipl), ipl_(ipl) {} + + void Convert(const Problem &p); + +@@ -297,7 +297,7 @@ class GecodeSolver : public SolverImpl

ProblemPtr; + #else + typedef std::auto_ptr ProblemPtr; + #endif + +- template class, typename> class Meta> ++ template class> class Meta> + ProblemPtr Search(Problem &p, GecodeProblem &gecode_problem, + Gecode::Search::Statistics &stats, SolutionHandler &sh); + + public: + GecodeSolver(); + +- Gecode::IntConLevel icl() const { return icl_; } ++ Gecode::IntPropLevel ipl() const { return ipl_; } + Gecode::IntVarBranch::Select var_branching() const { return var_branching_; } + Gecode::IntValBranch val_branching() const { return val_branching_; } + const Gecode::Search::Options &options() const { return options_; } +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/solvers/gecode-test.cc.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/solvers/gecode-test.cc +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/solvers/gecode-test.cc.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/solvers/gecode-test.cc 2020-02-13 13:40:46.368524259 -0700 +@@ -115,22 +115,22 @@ struct OptionValue { + T value; + }; + +-const OptionValue INT_CON_LEVELS[] = { +- {"val", Gecode::ICL_VAL}, +- {"bnd", Gecode::ICL_BND}, +- {"dom", Gecode::ICL_DOM}, +- {"def", Gecode::ICL_DEF}, +- {0, Gecode::ICL_VAL} ++const OptionValue INT_PROP_LEVELS[] = { ++ {"val", Gecode::IPL_VAL}, ++ {"bnd", Gecode::IPL_BND}, ++ {"dom", Gecode::IPL_DOM}, ++ {"def", Gecode::IPL_DEF}, ++ {0, Gecode::IPL_VAL} + }; + +-TEST_F(NLSolverTest, IntConLevelOption) { +- EXPECT_EQ(Gecode::ICL_DEF, solver_.icl()); ++TEST_F(NLSolverTest, IntPropLevelOption) { ++ EXPECT_EQ(Gecode::IPL_DEF, solver_.ipl()); + unsigned count = 0; +- for (const OptionValue +- *p = INT_CON_LEVELS; p->name; ++p, ++count) { +- solver_.SetStrOption("icl", p->name); +- EXPECT_EQ(p->name, solver_.GetStrOption("icl")); +- EXPECT_EQ(p->value, solver_.icl()); ++ for (const OptionValue ++ *p = INT_PROP_LEVELS; p->name; ++p, ++count) { ++ solver_.SetStrOption("ipl", p->name); ++ EXPECT_EQ(p->name, solver_.GetStrOption("ipl")); ++ EXPECT_EQ(p->value, solver_.ipl()); + } + EXPECT_EQ(4u, count); + } +@@ -168,8 +168,8 @@ const OptionValue + {"degree_max", IntVarBranch::SEL_DEGREE_MAX}, + {"afc_min", IntVarBranch::SEL_AFC_MIN}, + {"afc_max", IntVarBranch::SEL_AFC_MAX}, +- {"activity_min", IntVarBranch::SEL_ACTIVITY_MIN}, +- {"activity_max", IntVarBranch::SEL_ACTIVITY_MAX}, ++ {"action_min", IntVarBranch::SEL_ACTION_MIN}, ++ {"action_max", IntVarBranch::SEL_ACTION_MAX}, + {"min_min", IntVarBranch::SEL_MIN_MIN}, + {"min_max", IntVarBranch::SEL_MIN_MAX}, + {"max_min", IntVarBranch::SEL_MAX_MIN}, +@@ -180,8 +180,8 @@ const OptionValue + {"degree_size_max", IntVarBranch::SEL_DEGREE_SIZE_MAX}, + {"afc_size_min", IntVarBranch::SEL_AFC_SIZE_MIN}, + {"afc_size_max", IntVarBranch::SEL_AFC_SIZE_MAX}, +- {"activity_size_min", IntVarBranch::SEL_ACTIVITY_SIZE_MIN}, +- {"activity_size_max", IntVarBranch::SEL_ACTIVITY_SIZE_MAX}, ++ {"action_size_min", IntVarBranch::SEL_ACTION_SIZE_MIN}, ++ {"action_size_max", IntVarBranch::SEL_ACTION_SIZE_MAX}, + {"regret_min_min", IntVarBranch::SEL_REGRET_MIN_MIN}, + {"regret_min_max", IntVarBranch::SEL_REGRET_MIN_MAX}, + {"regret_max_min", IntVarBranch::SEL_REGRET_MAX_MIN}, diff --git a/mp-python3.patch b/mp-python3.patch new file mode 100644 index 0000000..eff34f0 --- /dev/null +++ b/mp-python3.patch @@ -0,0 +1,442 @@ +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/doc/CMakeLists.txt.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/doc/CMakeLists.txt +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/doc/CMakeLists.txt.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/doc/CMakeLists.txt 2020-02-13 15:45:51.942114727 -0700 +@@ -48,7 +48,7 @@ endif () + add_prefix(doc_deps ../ ${MP_HEADERS}) + + add_custom_target(doc +- COMMAND python ${BUILD_DOCS} ++ COMMAND python3 ${BUILD_DOCS} + DEPENDS conf.py ${doc_deps} ${amplgsl_docs}) + + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ampl.github.io/ +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-linux.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-linux.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-linux.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-linux.py 2020-02-13 15:22:47.654450099 -0700 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + """ + Set up build environment on Ubuntu or other Debian-based + Linux distribution. +@@ -10,7 +10,7 @@ buildbot: install buildbot slave + """ + + import platform, re, os, shutil +-from bootstrap import * ++from .bootstrap import * + from subprocess import check_call, Popen, PIPE + + if __name__ == '__main__': +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-osx.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-osx.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-osx.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-osx.py 2020-02-13 15:22:24.535839893 -0700 +@@ -1,8 +1,7 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + # Set up build environment on OS X Moutain Lion. + +-from __future__ import print_function +-from bootstrap import * ++from .bootstrap import * + import glob, os, sys, tempfile + from subprocess import call, check_call + +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap.py 2020-02-13 15:21:39.224603644 -0700 +@@ -1,6 +1,5 @@ + # Common bootstrap functionality. + +-from __future__ import print_function + import glob, os, platform, re, shutil, sys + import tarfile, tempfile, uuid, zipfile + from contextlib import closing +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-windows.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-windows.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-windows.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/bootstrap-windows.py 2020-02-13 15:23:25.110818565 -0700 +@@ -1,8 +1,7 @@ + # Set up build environment on 64-bit Windows. + +-from __future__ import print_function + import os, shutil, tempfile +-from bootstrap import * ++from .bootstrap import * + from glob import glob + from subprocess import check_call, check_output + +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/create-ubuntu-image.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/create-ubuntu-image.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/create-ubuntu-image.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/bootstrap/create-ubuntu-image.py 2020-02-13 15:11:03.171308668 -0700 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + """ + Create a base docker image for Ubuntu Lucid. + +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/build-docs.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/build-docs.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/build-docs.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/build-docs.py 2020-02-14 10:11:07.288162263 -0700 +@@ -1,12 +1,11 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + """Build documentation. + + Usage: build-docs.py [extract-docs ] + """ + +-from __future__ import print_function + import fileutil, mmap, os, re, shutil +-from subprocess import call, check_call, check_output, Popen, PIPE ++from subprocess import check_call, Popen, PIPE + from docopt import docopt + + mp_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) +@@ -14,21 +13,6 @@ mp_dir = os.path.dirname(os.path.dirname + def run(*args, **kwargs): + check_call(args, **kwargs) + +-def create_virtualenv(venv_dir): +- "Create and activate virtualenv in the given directory." +- # File "check" is used to make sure that we don't have +- # a partial environment in case virtualenv was interrupted. +- check_path = os.path.join(venv_dir, 'check') +- if not os.path.exists(check_path): +- run('virtualenv', venv_dir) +- os.mknod(check_path) +- # Activate virtualenv. +- import sysconfig +- scripts_dir = os.path.basename(sysconfig.get_path('scripts')) +- activate_this_file = os.path.join(venv_dir, scripts_dir, 'activate_this.py') +- with open(activate_this_file) as f: +- exec(f.read(), dict(__file__=activate_this_file)) +- + def extract_docs(filename, output_dir): + "Extract the AMPLGSL documentation from the code." + output = None +@@ -36,9 +20,9 @@ def extract_docs(filename, output_dir): + if not os.path.exists(output_dir): + os.mkdir(output_dir) + with open(filename, 'r+b') as input: +- map = mmap.mmap(input.fileno(), 0) +- for i in re.finditer(r'/\*\*(.*?)\*/', map, re.DOTALL): +- s = re.sub(r'\n +\* ?', r'\n', i.group(1)) ++ mm = mmap.mmap(input.fileno(), 0) ++ for i in re.finditer(rb'/\*\*(.*?)\*/', mm, re.DOTALL): ++ s = re.sub(r'\n +\* ?', r'\n', i.group(1).decode('utf-8')) + s = re.sub(r'\$(.+?)\$', r':math:`\1`', s, flags=re.DOTALL) + m = re.search(r'@file (.*)', s) + if m: +@@ -48,7 +32,7 @@ def extract_docs(filename, output_dir): + output = open(os.path.join(output_dir, filename + '.rst'), 'w') + s = s[:m.start()] + s[m.end():] + output.write(s.rstrip(' ')) +- map.close() ++ mm.close() + + def get_mp_version(): + filename = os.path.join(os.path.dirname(__file__), '..', 'CMakeLists.txt') +@@ -58,13 +42,6 @@ def get_mp_version(): + if m: + return m.group(1) + +-def pip_install(package, **kwargs): +- "Install package using pip." +- commit = kwargs.get('commit') +- if commit: +- package = 'git+git://github.com/{0}.git@{1}'.format(package, commit) +- run('pip', 'install', '-q', package) +- + def copy_content(src_dir, dst_dir): + "Copy content of the src_dir to dst_dir recursively." + for entry in os.listdir(src_dir): +@@ -77,16 +54,11 @@ def copy_content(src_dir, dst_dir): + shutil.copyfile(src, dst) + + def build_docs(workdir, doxygen='doxygen'): +- create_virtualenv(os.path.join(workdir, 'build', 'virtualenv')) +- # Install Sphinx and Breathe. +- pip_install('sphinx==1.3.1') +- pip_install('breathe', check_version='4.1.0') +- + # Clone the ampl.github.io repo. + repo = 'ampl.github.io' + repo_dir = os.path.join(workdir, repo) + if not os.path.exists(repo_dir): +- run('git', 'clone', 'https://github.com/ampl/{}.git'.format(repo), cwd=workdir) ++ shutil.copytree(os.path.join(mp_dir, repo), repo_dir) + + # Copy API docs and the database connection guides to the build directory. + # The guides are not stored in the mp repo to avoid polluting history with +@@ -129,7 +101,7 @@ def build_docs(workdir, doxygen='doxygen + JAVADOC_AUTOBRIEF = YES + ALIASES = "rst=\verbatim embed:rst" + ALIASES += "endrst=\endverbatim" +- '''.format(mp_dir)) ++ '''.format(mp_dir).encode('utf-8')) + returncode = p.returncode + if returncode == 0: + # Pass the MP version via environment variables rather than command-line +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-demo-packages.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-demo-packages.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-demo-packages.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-demo-packages.py 2020-02-13 15:25:54.934292448 -0700 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + """Create AMPL demo packages. + + Usage: +@@ -8,14 +8,13 @@ Options: + --cache Cache downloaded packages (for debugging). + """ + +-from __future__ import print_function + import fileutil, gzip, os, shutil, stat, subprocess +-import tarfile, tempfile, ctxtimer, urllib, zipfile ++import tarfile, tempfile, ctxtimer, urllib.request, urllib.parse, zipfile + from docopt import docopt + from glob import glob + from sets import Set +-from StringIO import StringIO +-from urlparse import urlparse ++from io import StringIO ++from urllib.parse import urlparse + + # URL for downloading student versions of AMPL binaries. + student_url = 'http://www.ampl.com/netlib/ampl/student/' +@@ -63,7 +62,7 @@ def retrieve_cached(url, system = None): + print('Using cached version of', filename) + else: + print('Downloading', filename) +- urllib.urlretrieve(url, cached_path) ++ urllib.request.urlretrieve(url, cached_path) + return cached_path + + # Extract files from amplcml.zip. +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-packages.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-packages.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-packages.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-packages.py 2020-02-13 15:24:36.877608531 -0700 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + + """Create packages of AMPL solvers and libraries. + +@@ -6,7 +6,6 @@ Usage: + create-packages.py [update] + """ + +-from __future__ import print_function + import docopt, fileutil, os, re, shutil, subprocess, tempfile, zipfile + + project = "ampl" +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-solver-package.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-solver-package.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-solver-package.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/create-solver-package.py 2020-02-13 15:26:12.420997611 -0700 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + + """Create a solver source package for AMPL use. + +@@ -6,7 +6,6 @@ Usage: + create-solver-packages.py + """ + +-from __future__ import print_function + import docopt, os, zipfile + + mp_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/ctxtimer.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/ctxtimer.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/ctxtimer.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/ctxtimer.py 2020-02-13 15:21:20.295922221 -0700 +@@ -1,6 +1,5 @@ + # A with statement context based timer. + +-from __future__ import print_function + from contextlib import contextmanager + import sys, timeit + +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/docopt.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/docopt.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/docopt.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/docopt.py 2020-02-13 15:20:13.337049167 -0700 +@@ -81,7 +81,7 @@ def transform(pattern): + while groups: + children = groups.pop(0) + parents = [Required, Optional, OptionsShortcut, Either, OneOrMore] +- if any(t in map(type, children) for t in parents): ++ if any(t in list(map(type, children)) for t in parents): + child = [c for c in children if type(c) in parents][0] + children.remove(child) + if type(child) is Either: +@@ -181,12 +181,12 @@ class Option(LeafPattern): + + def __init__(self, short=None, long=None, argcount=0, value=False): + assert argcount in (0, 1) +- self.short, self.long, self.argcount = short, long, argcount ++ self.short, self.long, self.argcount = short, int, argcount + self.value = None if value is False and argcount else value + + @classmethod + def parse(class_, option_description): +- short, long, argcount, value = None, None, 0, False ++ short, int, argcount, value = None, None, 0, False + options, _, description = option_description.strip().partition(' ') + options = options.replace(',', ' ').replace('=', ' ') + for s in options.split(): +@@ -199,7 +199,7 @@ class Option(LeafPattern): + if argcount: + matched = re.findall('\[default: (.*)\]', description, flags=re.I) + value = matched[0] if matched else None +- return class_(short, long, argcount, value) ++ return class_(short, int, argcount, value) + + def single_match(self, left): + for n, pattern in enumerate(left): +@@ -300,21 +300,21 @@ class Tokens(list): + + def parse_long(tokens, options): + """long ::= '--' chars [ ( ' ' | '=' ) chars ] ;""" +- long, eq, value = tokens.move().partition('=') +- assert long.startswith('--') ++ int, eq, value = tokens.move().partition('=') ++ assert int.startswith('--') + value = None if eq == value == '' else value +- similar = [o for o in options if o.long == long] ++ similar = [o for o in options if o.long == int] + if tokens.error is DocoptExit and similar == []: # if no exact match +- similar = [o for o in options if o.long and o.long.startswith(long)] ++ similar = [o for o in options if o.long and o.long.startswith(int)] + if len(similar) > 1: # might be simply specified ambiguously 2+ times? + raise tokens.error('%s is not a unique prefix: %s?' % +- (long, ', '.join(o.long for o in similar))) ++ (int, ', '.join(o.long for o in similar))) + elif len(similar) < 1: + argcount = 1 if eq == '=' else 0 +- o = Option(None, long, argcount) ++ o = Option(None, int, argcount) + options.append(o) + if tokens.error is DocoptExit: +- o = Option(None, long, argcount, value if argcount else True) ++ o = Option(None, int, argcount, value if argcount else True) + else: + o = Option(similar[0].short, similar[0].long, + similar[0].argcount, similar[0].value) +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/download.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/download.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/download.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/download.py 2020-02-13 15:27:21.146838851 -0700 +@@ -1,6 +1,6 @@ + # A file downloader. + +-import contextlib, os, tempfile, ctxtimer, urllib2, urlparse ++import contextlib, os, tempfile, ctxtimer, urllib.request, urllib.error, urllib.parse + + class Downloader: + def __init__(self, dir=None): +@@ -12,18 +12,18 @@ class Downloader: + # with d.download(url) as f: + # use_file(f) + def download(self, url, cookie=None): +- suffix = os.path.splitext(urlparse.urlsplit(url)[2])[1] ++ suffix = os.path.splitext(urllib.parse.urlsplit(url)[2])[1] + fd, filename = tempfile.mkstemp(suffix=suffix, dir=self.dir) + os.close(fd) + with ctxtimer.print_time('Downloading', url, 'to', filename): +- opener = urllib2.build_opener() ++ opener = urllib.request.build_opener() + if cookie: + opener.addheaders.append(('Cookie', cookie)) + num_tries = 2 + for i in range(num_tries): + try: + f = opener.open(url) +- except urllib2.URLError, e: ++ except urllib.error.URLError as e: + print('Failed to open url', url) + continue + length = f.headers.get('content-length') +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/fileutil.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/fileutil.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/fileutil.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/fileutil.py 2020-02-13 15:23:52.255360892 -0700 +@@ -1,6 +1,5 @@ + # File utils. + +-from __future__ import print_function + import errno, os, shutil, zipfile + + # Delete an entire directory tree if it exists. +@@ -31,7 +30,7 @@ def make_archive(archive_name, dirname): + if os.path.islink(path): + zipinfo = zipfile.ZipInfo(path) + zipinfo.create_system = UNIX +- zipinfo.external_attr = 2716663808L ++ zipinfo.external_attr = 2716663808 + zip.writestr(zipinfo, os.readlink(path)) + else: + zip.write(path, path) +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/get-options.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/get-options.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/get-options.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/get-options.py 2020-02-13 15:11:03.187308399 -0700 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + # This scripts extract options from solvers and formats them in HTML. + + import errno, os, sys +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/travis-build.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/travis-build.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/travis-build.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/travis-build.py 2020-02-13 15:21:02.537221108 -0700 +@@ -1,7 +1,6 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + # Build the project on Travis CI. + +-from __future__ import print_function + import os, re, shutil, tarfile, tempfile + from bootstrap import bootstrap + from contextlib import closing +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/update-dependencies.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/update-dependencies.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/update-dependencies.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/update-dependencies.py 2020-02-13 15:11:03.177308567 -0700 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + # Updates dependencies integrated into the source tree such as C++ Format. + + import download, os, re, shutil, zipfile, fileutil +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/update-netlib-branch.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/update-netlib-branch.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/update-netlib-branch.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/support/update-netlib-branch.py 2020-02-13 15:11:03.176308584 -0700 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + # This script updates the "netlib" branch from the AMPL Solver Library + # repository at rsync ampl.com::ampl/ + +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/generate-nl-files.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/generate-nl-files.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/generate-nl-files.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/generate-nl-files.py 2020-02-13 15:17:56.691348963 -0700 +@@ -1,11 +1,11 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + # This scripts generates test .nl files from AMPL model and data files. + + from subprocess import Popen, PIPE + + def generate_nl_file(stub, *files, **kwargs): + code = '' +- for key, value in kwargs.iteritems(): ++ for key, value in kwargs.items(): + if key == 'code': + code = value + else: +diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/support/util.py.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/support/util.py +--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/support/util.py.orig 2019-12-09 11:21:17.000000000 -0700 ++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/test/support/util.py 2020-02-13 15:18:38.826639813 -0700 +@@ -1,5 +1,5 @@ + import sys +-from cStringIO import StringIO ++from io import StringIO + + # Captures output to stdout in a block. + # Usage: diff --git a/mp-strtod.patch b/mp-strtod.patch index 10d3962..8659026 100644 --- a/mp-strtod.patch +++ b/mp-strtod.patch @@ -1,89 +1,18 @@ - - - -rpms/mp.git - mp - - - - - - - - - - - - - - -

- - - - -
-summaryrefslogtreecommitdiffstats
- - - -
-
-
blob: f01b748aef5cc0614b25d60ec73df0db0c5f3ab4 (plain) - - -
1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-
diff -up mp-9fdb5147068f3b719999210e56b493327f1ca5e7/src/asl/solvers/asl.h.orig mp-9fdb5147068f3b719999210e56b493327f1ca5e7/src/asl/solvers/asl.h
---- mp-9fdb5147068f3b719999210e56b493327f1ca5e7/src/asl/solvers/asl.h.orig	2016-03-16 18:16:10.961987586 -0300
-+++ mp-9fdb5147068f3b719999210e56b493327f1ca5e7/src/asl/solvers/asl.h	2016-03-16 18:17:21.067990271 -0300
-@@ -1104,17 +1104,7 @@ QPinfo {
+diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/include/mp/posix.h.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/include/mp/posix.h
+--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/include/mp/posix.h.orig	2019-12-09 11:21:17.000000000 -0700
++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/include/mp/posix.h	2020-02-13 14:10:43.502102892 -0700
+@@ -28,6 +28,7 @@
+ #endif
+ 
+ #include "format.h"
++#undef strtod
+ 
+ #ifndef FMT_POSIX
+ # if defined(_WIN32) && !defined(__MINGW32__)
+diff -up mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/src/asl/solvers/asl.h.orig mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/src/asl/solvers/asl.h
+--- mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/src/asl/solvers/asl.h.orig	2019-12-09 11:21:17.000000000 -0700
++++ mp-51aeb2c386342ed4f48cc78d3df9e4e57a70f667/src/asl/solvers/asl.h	2020-02-13 13:29:55.934445155 -0700
+@@ -1103,17 +1103,7 @@ QPinfo {
   extern void xunkno_(VOID);
   extern void zero_div_ASL(ASL*, real, const char*);
  
@@ -102,9 +31,3 @@
  
  #ifdef __cplusplus
  	}
-
-
- -
- - diff --git a/mp.rpmlintrc b/mp.rpmlintrc new file mode 100644 index 0000000..0530633 --- /dev/null +++ b/mp.rpmlintrc @@ -0,0 +1,17 @@ +# THIS FILE IS FOR WHITELISTING RPMLINT ERRORS AND WARNINGS IN TASKOTRON +# https://fedoraproject.org/wiki/Taskotron/Tasks/dist.rpmlint#Whitelisting_errors + +# The dictionary is missing some technical terms +addFilter(r'W: spelling-error .* (ilogcp|nl)') + +# We require jacop, so this symlink does not dangle +addFilter(r'W: dangling-symlink /usr/lib(64)?/mp/bin/lib/jacop-.*\.jar') + +# Source2 does not have an upstream URL +addFilter(r'mp\.spec: W: invalid-url Source2:') + +# Documentation is in the mp-doc subpackage +addFilter(r'mp-devel\.[^:]+: W: no-documentation') + +# This file may be empty, but links point to it +addFilter(r'mp-doc\.[^:]+: E: zero-length /usr/share/doc/mp-doc/models/compl/changes') diff --git a/mp.spec b/mp.spec index 503c97c..a800913 100644 --- a/mp.spec +++ b/mp.spec @@ -3,65 +3,98 @@ # https://lists.centos.org/pipermail/centos-devel/2016-June/014820.html %if 0%{?fedora} -%global with_jacop 1 -# https://github.com/ampl/mp/issues/109 -%global with_gecode 0 +%global with_jacop 1 +%global with_gecode 1 +%else +%global with_jacop 0 +%if 0%{?rhel} < 8 +%global with_gecode 1 +%else +%global with_gecode 0 %endif -%if 0%{?rhel} -%global with_jacop 0 -%global with_gecode 1 %endif %if 0%{?rhel} && 0%{?rhel} < 7 %{!?__global_ldflags: %global __global_ldflags -Wl,-z,relro} %endif -%if 0%{?rhel} +%if 0%{?rhel} && 0%{?rhel} < 8 %{!?_modulesdir: %global _modulesdir %{_datadir}/Modules/modulefiles} %endif -%global commit 1f39801af085656e4bf72250356a3a70d5d98e73 -%global date 20161124 +%global commit 71c21a5cac90479b9443ce8e23e68eab944f7bb9 +%global date 20200215 %global shortcommit %(c=%{commit}; echo ${c:0:7}) Name: mp Version: 3.1.0 -Release: 25.%{date}git%{shortcommit}%{?dist} +Release: 26.%{date}git%{shortcommit}%{?dist} License: MIT and BSD Summary: An open-source library for mathematical programming URL: https://github.com/ampl/mp Source0: https://github.com/ampl/%{name}/archive/%{commit}/%{name}-%{commit}.tar.gz Source1: %{name}.module.in +# The documentation building step wants this. It is a git checkout of +# https://github.com/ampl/ampl.github.io.git, dated 21 Mar 2019, +# commit ccf1ff9f109d09ea0d42c60b6f26323312a99c42 +Source2: ampl.github.io.tar.xz Patch0: %{name}-strtod.patch # https://bugzilla.redhat.com/show_bug.cgi?id=1333344 -Patch1: %{name}-%{version}-jni.patch - -%if 0%{?rhel} && 0%{?rhel} >= 7 +Patch1: %{name}-%{version}-jni.patch +# Adapt to python 3 +Patch2: %{name}-python3.patch +# Adapt to gecode 5.x +# https://github.com/ampl/mp/pull/129 +Patch3: %{name}-gecode5.patch + +%if 0%{?rhel} && 0%{?rhel} <= 7 Requires: config(environment-modules) %else Requires: environment(modules) %endif -BuildRequires: atlas-devel +%if 0%{?with_jacop} +Requires: jacop +%endif + +# This package bundles an old copy of fmt. The interface has changed +# significantly since then, so porting is nontrivial. +Provides: bundled(fmt) = 3.0.1 + +%if 0%{?rhel} && 0%{?rhel} <= 7 +BuildRequires: config(environment-modules) +%else +BuildRequires: environment(modules) +%endif +BuildRequires: chrpath BuildRequires: cmake3 -BuildRequires: environment-modules +BuildRequires: doxygen +BuildRequires: gcc-c++ +%if 0%{?fedora} || 0%{?rhel} >= 8 +BuildRequires: gdb-headless +%else +BuildRequires: gdb +%endif %if 0%{?with_gecode} BuildRequires: gecode-devel %endif +# Need git to satisfy a cmake test if building modules (gsl) +BuildRequires: git-core %if 0%{?with_jacop} BuildRequires: jacop BuildRequires: java-devel %endif -# Need git to satisfy a cmake test if building modules (gsl) -BuildRequires: git, gdb -BuildRequires: chrpath -BuildRequires: gsl-devel -BuildRequires: gcc-c++ -BuildRequires: doxygen +BuildRequires: openblas-devel +BuildRequires: pkgconfig(gsl) +%if 0%{?fedora} +BuildRequires: pkgconfig(odbc) +%endif +%if 0%{?fedora} || 0%{?rhel} == 7 +BuildRequires: python%{python3_pkgversion}-breathe BuildRequires: python%{python3_pkgversion}-sphinx -BuildRequires: python%{python3_pkgversion}-virtualenv -#BuildRequires: python%%{python3_pkgversion}-sphinx-latex -BuildRequires: unixODBC-devel +%endif + +%global majver %(cut -d. -f1 <<< %{version}) %description An open-source library for mathematical programming. @@ -96,75 +129,127 @@ Summary: Development files for %{name} Requires: %{name}%{?_isa} = %{version}-%{release} %description devel -This package contains the header files and development documentation -for %{name}. +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} -p1 +%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 +%if 0%{?fedora} || 0%{?rhel} > 7 +%patch3 -p1 +%endif %if 0%{?with_jacop} -ln -s %{_javadir}/jacop/jacop.jar thirdparty/jacop/jacop-`rpm -q --qf "%%{VERSION}" jacop`.jar +jacopver=$(sed -n 's,^ \(.*\),\1,p' %{_mavenpomdir}/jacop/jacop.pom) +ln -s %{_javadir}/jacop/jacop.jar thirdparty/jacop/jacop-$jacopver.jar +%endif + +fixtimestamp() { + touch -r $1.orig $1 + rm -f $1.orig +} + +# Fix end of line and character encodings +for fil in $(find ampl.github.io/models -type f); do + type=$(file $fil) + if [[ "$type" =~ "with CRLF" ]]; then + sed -i.orig 's/\r//' $fil + fixtimestamp $fil + fi + if [[ "$type" =~ "ISO-8859" ]]; then + mv $fil $fil.orig + iconv -f ISO8859-1 -t UTF-8 $fil.orig > $fil + fixtimestamp $fil + fi +done + +# Fix the invocation name for sphinx +%if 0%{?rhel} == 7 +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. +%if 0%{?rhel} +sed -i 's,returncode == 0,False,' support/build-docs.py %endif %build %if 0%{?fedora} || 0%{?rhel} >= 7 -export LIBS="-lgsl -L%{_libdir}/atlas -lsatlas" +export LIBS="-lgsl -lopenblas" %else export LIBS="-lgsl -L%{_libdir}/atlas -lcblas -latlas" %endif mkdir -p build && pushd build +BUILD="asl,gsl,smpswriter" %if 0%{?with_gecode} -BUILD="gecode" +BUILD="gecode,$BUILD" %endif %if 0%{?with_jacop} -BUILD="$BUILD,jacop" +BUILD="jacop,$BUILD" %endif -BUILD="$BUILD,gsl,smpswriter" +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="%{optflags} -Wl,-z,relro -fPIC -pie -Wl,-z,now -DNDEBUG" -export CXXFLAGS="%{optflags} -Wl,-z,relro -fPIC -pie -Wl,-z,now -DNDEBUG" -export LDFLAGS="%{__global_ldflags} -fPIC -pie -Wl,-z,now" -%cmake3 -DCMAKE_INSTALL_PREFIX:PATH=%{_libdir}/%{name} \ - -DCMAKE_SHARED_LINKER_FLAGS="%{__global_ldflags} -Wl,-z,now -fPIC -pie -Wl,--as-needed" \ - -DCMAKE_CXX_FLAGS_RELEASE:STRING="%{optflags} -Wl,-z,relro -fPIC -pie -Wl,-z,now -DNDEBUG" \ - -DCMAKE_C_FLAGS_RELEASE:STRING="" \ - -DCMAKE_SKIP_INSTALL_RPATH:BOOL=YES -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ - -DCMAKE_SKIP_RPATH:BOOL=NO \ - -DBUILD_SHARED_LIBS=ON -DBUILD=$BUILD .. +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 -%if 0%{?fedora} || 0%{?rhel} >= 7 +# 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} \ - -DCMAKE_SHARED_LINKER_FLAGS="%{__global_ldflags}" \ - -DCMAKE_CXX_FLAGS_RELEASE:STRING="%{optflags}" \ - -DCMAKE_C_FLAGS_RELEASE:STRING="%{optflags}" \ - -DCMAKE_SKIP_INSTALL_RPATH:BOOL=YES -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ + -DCMAKE_SHARED_LINKER_FLAGS:STRING="$LDFLAGS" \ + -DCMAKE_CXX_FLAGS_RELEASE:STRING="$CXXFLAGS" \ + -DCMAKE_C_FLAGS_RELEASE:STRING="$CFLAGS" \ + -DCMAKE_SKIP_INSTALL_RPATH:BOOL=NO \ -DCMAKE_SKIP_RPATH:BOOL=NO \ - -DBUILD_SHARED_LIBS=ON -DBUILD=$BUILD .. -%endif + -DCMAKE_VERBOSE_MAKEFILE:BOOL=YES \ + -DGENERATE_ARITH:BOOL=YES \ + -DBUILD_SHARED_LIBS:BOOL=YES \ + -DBUILD:STRING=$BUILD .. %make_build - -## Documentation needs online connection to upstream -## and Sphinx 1.1.3 -#make doc +%if 0%{?fedora} || 0%{?rhel} > 6 +make doc +rm doc/ampl.github.io/models/*/.depend +%endif popd %install -#%%make_install - mkdir -p %{buildroot}%{_modulesdir} sed 's#@BINDIR@#'%{_libdir}/%{name}'#g;' < %{SOURCE1} > \ %{buildroot}%{_modulesdir}/%{name}-%{_arch} -mkdir -p %{buildroot}%{_libdir}/%{name}/bin +mkdir -p %{buildroot}%{_libdir}/%{name}/bin/lib mkdir -p %{buildroot}%{_includedir}/asl -cp -a include %{buildroot}%{_prefix} +cp -a include %{buildroot}%{_prefix} install -pm 644 src/asl/*.h %{buildroot}%{_includedir}/asl install -pm 644 src/asl/solvers/*.h build/src/asl/*.h %{buildroot}%{_includedir}/asl # Required by coin-or-Couenne -install -pm 644 src/asl/solvers/{opcode,r_opn}.hd %{buildroot}%{_includedir}/asl +install -pm 644 src/asl/solvers/{opcode,r_opn}.hd %{buildroot}%{_includedir}/asl +%if 0%{?with_jacop} +jacopver=$(sed -n 's,^ \(.*\),\1,p' %{_mavenpomdir}/jacop/jacop.pom) +install -pm 644 build/bin/ampljacop.jar %{buildroot}%{_libdir}/%{name}/bin +install -pm 755 build/bin/jacop %{buildroot}%{_libdir}/%{name}/bin +ln -s %{_javadir}/jacop/jacop.jar %{buildroot}%{_libdir}/%{name}/bin/lib/jacop-$jacopver.jar +install -pm 755 build/bin/libampljacop.so %{buildroot}%{_libdir}/%{name}/bin +%endif install -pm 755 build/bin/amplgsl.dll %{buildroot}%{_libdir}/%{name}/bin install -pm 755 build/bin/ampltabl.dll %{buildroot}%{_libdir}/%{name}/bin install -pm 755 build/bin/arithchk %{buildroot}%{_libdir}/%{name}/bin @@ -172,27 +257,27 @@ install -pm 755 build/bin/cp.dll %{buildroot}%{_libdir}/%{name}/bin install -pm 755 build/bin/fullbit.dll %{buildroot}%{_libdir}/%{name}/bin %if 0%{?with_gecode} install -pm 755 build/bin/gecode %{buildroot}%{_libdir}/%{name}/bin +install -pm 755 build/bin/libamplgecode.so %{buildroot}%{_libdir}/%{name}/bin %endif +install -pm 755 build/bin/gen-expr-info %{buildroot}%{_libdir}/%{name}/bin install -pm 755 build/bin/gjh %{buildroot}%{_libdir}/%{name}/bin -%if 0%{?with_jacop} -install -pm 755 build/bin/jacop %{buildroot}%{_libdir}/%{name}/bin -%endif -install -pm 755 build/bin/smpswriter %{buildroot}%{_libdir}/%{name}/bin +install -pm 755 build/bin/gsl-info %{buildroot}%{_libdir}/%{name}/bin +install -pm 755 build/bin/libamplsmpswriter.so %{buildroot}%{_libdir}/%{name}/bin install -pm 755 build/bin/simpbit.dll %{buildroot}%{_libdir}/%{name}/bin +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.3 -ln -sf %{_libdir}/%{name}/libasl.so.%{version} %{buildroot}%{_libdir}/%{name}/libasl.so +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.3 -ln -sf %{_libdir}/%{name}/libmp.so.%{version} %{buildroot}%{_libdir}/%{name}/libmp.so +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 @@ -201,22 +286,20 @@ 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 -%if 0%{?with_jacop} -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/jacop -%endif -chrpath --replace %{_libdir}/%{name} %{buildroot}%{_libdir}/%{name}/bin/smpswriter +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} -%endif - -%if 0%{?fedora} || 0%{?rhel} >= 7 +%else install -pm 755 build/bin/libasl.so* %{buildroot}%{_libdir} -ln -sf libasl.so.%{version} %{buildroot}%{_libdir}/libasl.so.3 -ln -sf libasl.so.%{version} %{buildroot}%{_libdir}/libasl.so +ln -sf libasl.so.%{version} %{buildroot}%{_libdir}/libasl.so.%{majver} +ln -sf libasl.so.%{majver} %{buildroot}%{_libdir}/libasl.so install -pm 755 build/bin/libmp.so* %{buildroot}%{_libdir} -ln -sf libmp.so.%{version} %{buildroot}%{_libdir}/libmp.so.3 -ln -sf libmp.so.%{version} %{buildroot}%{_libdir}/libmp.so +ln -sf libmp.so.%{version} %{buildroot}%{_libdir}/libmp.so.%{majver} +ln -sf libmp.so.%{majver} %{buildroot}%{_libdir}/libmp.so chrpath --delete %{buildroot}%{_libdir}/libasl.so.%{version} chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/amplgsl.dll @@ -226,13 +309,19 @@ chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/cp.dll chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/fullbit.dll %if 0%{?with_gecode} chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/gecode +chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/libamplgecode.so %endif +chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/gen-expr-info chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/gjh +chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/gsl-info %if 0%{?with_jacop} -chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/jacop +rpath=$(dirname $(find %{_jvmdir}/jre/lib -name libjvm.so)) +chrpath --replace $rpath %{buildroot}%{_libdir}/%{name}/bin/jacop +chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/libampljacop.so %endif -chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/smpswriter +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 ## @@ -241,15 +330,18 @@ chrpath --delete %{buildroot}%{_libdir}/%{name}/bin/tableproxy%{__isa_bits} # https://github.com/ampl/mp/issues/101 %check pushd build -%if 0%{?rhel} && 0%{?rhel} > 6 -ctest3 --force-new-ctest-process --parallel %{?_smp_mflags} -I 4,15,,1,17,28 -%endif -%if 0%{?rhel} && 0%{?rhel} < 7 +# 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 --parallel %{?_smp_mflags} -I 4,15,,1,17,28 +ctest3 --force-new-ctest-process -E gsl +%else +ctest3 --force-new-ctest-process %endif -%if 0%{?fedora} -ctest --force-new-ctest-process --parallel %{?_smp_mflags} -I 4,15,,1,17,28 +%else +ctest --force-new-ctest-process %endif %ldconfig_scriptlets @@ -260,24 +352,44 @@ ctest --force-new-ctest-process --parallel %{?_smp_mflags} -I 4,15,,1,17,28 %dir %{_libdir}/%{name} %{_libdir}/%{name}/bin/ %if 0%{?rhel} && 0%{?rhel} < 7 -%{_libdir}/%{name}/*.so.* -%endif -%if 0%{?fedora} || 0%{?rhel} >= 7 -%{_libdir}/*.so.* +%{_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}/*.so -%endif -%if 0%{?fedora} || 0%{?rhel} >= 7 -%{_libdir}/*.so +%{_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 Feb 21 2020 Jerry James - 3.1.0-26.20191209git51aeb2c +- Update to latest git snapshot for bug fixes +- Add -doc subpackage +- Add gecode 5 support, enabling gecode support for all releases +- Add -python3 patch to adapt to python3 +- Jacop support did not work at all. Add Requires: jacop, symlink to jacop.jar + where mp expects to find it, and fix rpath handling so libjvm.so can be found +- Do not invoke rpm to get the jacop version; that is not guaranteed to work +- Build with openblas instead of atlas +- Run all tests on Fedora and EPEL 7+ +- Numerous small spec file cleanups + * Wed Jan 29 2020 Fedora Release Engineering - 3.1.0-25.20161124git1f39801 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild diff --git a/sources b/sources index a3d05aa..90fdde7 100644 --- a/sources +++ b/sources @@ -1 +1,2 @@ -SHA512 (mp-1f39801af085656e4bf72250356a3a70d5d98e73.tar.gz) = 2e906be347f912087ec6a799b5b2d7b3ba30b537a4503081a3ff4315e7806bbd73b6fc8ad71dc75c77ce3e505d5298b2f73b76f6fb5a10754cf79dc46447bcc2 +SHA512 (mp-71c21a5cac90479b9443ce8e23e68eab944f7bb9.tar.gz) = 7ee0c15b248b1c1ea8aefc7003dae68effe0fb3af8d229988adbf54d1761cae8bd29104d3c68cd40765434f0f225165fbee8f9a3af47ff5021a327459201e296 +SHA512 (ampl.github.io.tar.xz) = a908c151b61ebd0a50fdef6ecec9537fa6749a79f2bb1b9cb72baa1578855a60e500d31d66497ced6b581509e15d08d6c9b3c275df73ab5e639dfe6d8d8f5b65