diff --git a/build/pkgs/ecm/spkg-configure.m4 b/build/pkgs/ecm/spkg-configure.m4 index d456f1d8f2c..dbc76db0001 100644 --- a/build/pkgs/ecm/spkg-configure.m4 +++ b/build/pkgs/ecm/spkg-configure.m4 @@ -1,5 +1,6 @@ SAGE_SPKG_CONFIGURE([ecm], [ m4_pushdef([SAGE_ECM_MINVER],[7.0.4]) + ECMBIN=ecm SAGE_SPKG_DEPCHECK([gmp], [ AC_CHECK_HEADER(ecm.h, [ AX_ABSOLUTE_HEADER([ecm.h]) @@ -18,20 +19,21 @@ SAGE_SPKG_CONFIGURE([ecm], [ AC_SEARCH_LIBS([ecm_factor], [ecm], [], [sage_spkg_install_ecm=yes]) ]) ]) - AC_PATH_PROG([ECMBIN], [ecm]) - if test x$ECMBIN != x; then + AC_PATH_PROGS([ECMBIN], [ecm gmp-ecm]) + AS_IF([test x$ECMBIN != x], [ ecmbin_version=`echo 121 | $ECMBIN 4 | grep ^GMP | $SED -n -e 's/GMP\-ECM \([[0-9]]*\.[[0-9]]*\.[[0-9]]*\).*/\1/p'` - fi - AS_IF([test -n "$ecmbin_version"], [ - AX_COMPARE_VERSION([$ecmbin_version], [ge], [$SAGE_ECM_MINVER], [ - ac_cv_ECMBIN="$ecmbin_version" + AS_IF([test -n "$ecmbin_version"], [ + AX_COMPARE_VERSION([$ecmbin_version], [ge], [$SAGE_ECM_MINVER], [ + ac_cv_ECMBIN="$ecmbin_version" + ]) ]) - ]) + ], [ECMBIN=ecm]) fi AS_IF([test -z "$ac_cv_ECM"], [sage_spkg_install_ecm=yes]) AS_IF([test -z "$ac_cv_ECMBIN"], [sage_spkg_install_ecm=yes]) ], [sage_spkg_install_ecm=yes]) ]) m4_popdef([SAGE_ECM_MINVER]) + AC_SUBST(SAGE_ECMBIN, $ECMBIN) ]) diff --git a/pkgs/sage-conf/_sage_conf/_conf.py.in b/pkgs/sage-conf/_sage_conf/_conf.py.in index ccc1c9695fb..54a59fdbacf 100644 --- a/pkgs/sage-conf/_sage_conf/_conf.py.in +++ b/pkgs/sage-conf/_sage_conf/_conf.py.in @@ -32,6 +32,8 @@ ECL_CONFIG = "@SAGE_ECL_CONFIG@".replace('${prefix}', SAGE_LOCAL) SAGE_NAUTY_BINS_PREFIX = "@SAGE_NAUTY_BINS_PREFIX@" +SAGE_ECMBIN = "@SAGE_ECMBIN@" + # Names or paths of the 4ti2 executables FOURTITWO_HILBERT = "@FOURTITWO_HILBERT@" FOURTITWO_MARKOV = "@FOURTITWO_MARKOV@" diff --git a/src/sage/env.py b/src/sage/env.py index da9bad48da9..a6a99ca9303 100644 --- a/src/sage/env.py +++ b/src/sage/env.py @@ -220,6 +220,7 @@ def var(key: str, *fallbacks: Optional[str], force: bool = False) -> Optional[st MAXIMA_FAS = var("MAXIMA_FAS") KENZO_FAS = var("KENZO_FAS") SAGE_NAUTY_BINS_PREFIX = var("SAGE_NAUTY_BINS_PREFIX", "") +SAGE_ECMBIN = var("SAGE_ECMBIN") RUBIKS_BINS_PREFIX = var("RUBIKS_BINS_PREFIX", "") FOURTITWO_HILBERT = var("FOURTITWO_HILBERT") FOURTITWO_MARKOV = var("FOURTITWO_MARKOV") diff --git a/src/sage/features/ecm.py b/src/sage/features/ecm.py new file mode 100644 index 00000000000..79a1e77918f --- /dev/null +++ b/src/sage/features/ecm.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +r""" +Feature for testing the presence of ``ecm`` or ``gmp-ecm`` +""" +# **************************************************************************** +# Copyright (C) 2032 Dima Pasechnik +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# https://www.gnu.org/licenses/ +# **************************************************************************** + +from . import Executable +from sage.env import SAGE_ECMBIN + + +class Ecm(Executable): + r""" + A :class:`~sage.features.Feature` describing the presence of :ref:`GMP-ECM `. + + EXAMPLES:: + + sage: from sage.features.ecm import Ecm + sage: Ecm().is_present() + FeatureTestResult('ecm', True) + """ + def __init__(self): + r""" + TESTS:: + + sage: from sage.features.ecm import Ecm + sage: isinstance(Ecm(), Ecm) + True + """ + Executable.__init__(self, name="ecm", executable=SAGE_ECMBIN, + spkg="ecm", type="standard") + + +def all_features(): + return [Ecm()] diff --git a/src/sage/interfaces/ecm.py b/src/sage/interfaces/ecm.py index a2c882643c4..ae1379861f2 100644 --- a/src/sage/interfaces/ecm.py +++ b/src/sage/interfaces/ecm.py @@ -55,6 +55,7 @@ from sage.structure.sage_object import SageObject from sage.rings.integer_ring import ZZ +from sage.env import SAGE_ECMBIN class ECM(SageObject): @@ -182,7 +183,7 @@ def __init__(self, B1=10, B2=None, **kwds): self._cmd = self._make_cmd(B1, B2, kwds) def _make_cmd(self, B1, B2, kwds): - ecm = ['ecm'] + ecm = [SAGE_ECMBIN] options = [] for x, v in kwds.items(): if v is False: