Replacing crypto of all routing daemons with openssl Disabling EIGRP crypto because it is broken Disabling crypto in FIPS mode
841 lines
28 KiB
Diff
841 lines
28 KiB
Diff
From 45da32d7a417ea639a092029c37c7fcc3bbc7813 Mon Sep 17 00:00:00 2001
|
|
From: David Lamparter <equinox@diac24.net>
|
|
Date: Tue, 28 May 2019 00:35:24 +0200
|
|
Subject: [PATCH] build: refactor & revamp python autoconf logic
|
|
|
|
Signed-off-by: David Lamparter <equinox@diac24.net>
|
|
---
|
|
configure.ac | 129 ++------
|
|
doc/developer/building-frr-for-centos6.rst | 5 +-
|
|
doc/developer/building-frr-for-debian8.rst | 4 +-
|
|
doc/developer/building-frr-for-debian9.rst | 4 +-
|
|
doc/developer/building-frr-for-fedora.rst | 4 +-
|
|
doc/developer/building-frr-for-freebsd10.rst | 2 +-
|
|
doc/developer/building-frr-for-freebsd11.rst | 2 +-
|
|
doc/developer/building-frr-for-freebsd9.rst | 4 +-
|
|
doc/developer/building-frr-for-netbsd6.rst | 9 +-
|
|
doc/developer/building-frr-for-netbsd7.rst | 9 +-
|
|
doc/developer/building-frr-for-ubuntu1404.rst | 2 +-
|
|
doc/developer/building-frr-for-ubuntu1604.rst | 2 +-
|
|
doc/developer/building-frr-for-ubuntu1804.rst | 2 +-
|
|
doc/developer/packaging-redhat.rst | 2 +-
|
|
doc/subdir.am | 11 +-
|
|
doc/user/installation.rst | 21 ++
|
|
m4/ax_python.m4 | 284 ++++++++++++++++++
|
|
redhat/frr.spec.in | 8 +-
|
|
tests/subdir.am | 2 -
|
|
20 files changed, 361 insertions(+), 146 deletions(-)
|
|
create mode 100644 m4/ax_python.m4
|
|
|
|
diff --git a/configure.ac b/configure.ac
|
|
index c228ff0c91..906006a974 100755
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -183,15 +183,17 @@ AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
|
|
AC_LINK_IFELSE(
|
|
[$3],
|
|
[
|
|
- AC_MSG_RESULT([yes])
|
|
CFLAGS="$ac_cflags_save"
|
|
LIBS="$ac_libs_save"
|
|
- $5
|
|
+ m4_default([$5], [
|
|
+ AC_MSG_RESULT([yes])
|
|
+ ])
|
|
], [
|
|
- AC_MSG_RESULT([no])
|
|
CFLAGS="$ac_cflags_save"
|
|
LIBS="$ac_libs_save"
|
|
- $4
|
|
+ m4_default([$4], [
|
|
+ AC_MSG_RESULT([no])
|
|
+ ])
|
|
])
|
|
AC_LANG_POP([C])
|
|
}])
|
|
@@ -609,92 +611,30 @@ AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
|
|
# Python for clippy
|
|
#
|
|
|
|
-AC_DEFUN([FRR_PYTHON_CHECK_WORKING], [
|
|
- AC_MSG_CHECKING([whether we found a working Python version])
|
|
- AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
|
|
-#include <Python.h>
|
|
-#if PY_VERSION_HEX < 0x02070000
|
|
-#error python too old
|
|
-#endif
|
|
-int main(void);
|
|
-],
|
|
-[
|
|
-{
|
|
- Py_Initialize();
|
|
- return 0;
|
|
-}
|
|
-])], [
|
|
- # some python installs are missing the zlib dependency...
|
|
- PYTHON_LIBS="${PYTHON_LIBS} -lz"
|
|
- AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
|
|
-#include <Python.h>
|
|
-#if PY_VERSION_HEX < 0x02070000
|
|
-#error python too old
|
|
-#endif
|
|
-int main(void);
|
|
-],
|
|
-[
|
|
-{
|
|
- Py_Initialize();
|
|
- return 0;
|
|
-}
|
|
-])], [
|
|
- m4_if([$1], [], [
|
|
- PYTHONCONFIG=""
|
|
- unset PYTHON_LIBS
|
|
- unset PYTHON_CFLAGS
|
|
- ], [$1])
|
|
- ])
|
|
- ])
|
|
-])
|
|
-
|
|
AS_IF([test "$host" = "$build"], [
|
|
- PYTHONCONFIG=""
|
|
-
|
|
- # ordering:
|
|
- # 1. try python3, but respect the user's preference on which minor ver
|
|
- # 2. try python, which might be py3 or py2 again on the user's preference
|
|
- # 3. try python2 (can really only be 2.7 but eh)
|
|
- # 4. try 3.6 > 3.5 > 3.4 > 3.3 > 3.2 > 2.7 through pkg-config (no user pref)
|
|
- #
|
|
- # (AX_PYTHON_DEVEL has no clue about py3 vs py2)
|
|
- # (AX_PYTHON does not do what we need)
|
|
-
|
|
- AC_CHECK_TOOLS([PYTHONCONFIG], [ \
|
|
- python3-config \
|
|
- python-config \
|
|
- python2-config \
|
|
- python3.6-config \
|
|
- python3.5-config \
|
|
- python3.4-config \
|
|
- python3.3-config \
|
|
- python3.2-config \
|
|
- python2.7-config ])
|
|
- if test -n "$PYTHONCONFIG"; then
|
|
- PYTHON_CFLAGS="`\"${PYTHONCONFIG}\" --includes`"
|
|
- PYTHON_LIBS="`\"${PYTHONCONFIG}\" --ldflags`"
|
|
-
|
|
- FRR_PYTHON_CHECK_WORKING([])
|
|
- fi
|
|
+ FRR_PYTHON_DEV
|
|
+], [
|
|
+ FRR_PYTHON
|
|
+])
|
|
|
|
- if test -z "$PYTHONCONFIG"; then
|
|
- PKG_CHECK_MODULES([PYTHON], [python-3.6], [], [
|
|
- PKG_CHECK_MODULES([PYTHON], [python-3.5], [], [
|
|
- PKG_CHECK_MODULES([PYTHON], [python-3.4], [], [
|
|
- PKG_CHECK_MODULES([PYTHON], [python-3.3], [], [
|
|
- PKG_CHECK_MODULES([PYTHON], [python-3.2], [], [
|
|
- PKG_CHECK_MODULES([PYTHON], [python-2.7], [], [
|
|
- AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
|
|
- ])])])])])])
|
|
+FRR_PYTHON_MODULES([pytest])
|
|
|
|
+if test "${enable_doc}" != "no"; then
|
|
+ FRR_PYTHON_MODULES([sphinx], , [
|
|
+ if test "${enable_doc}" = "yes"; then
|
|
+ AC_MSG_ERROR([Documentation was explicitly requested with --enable-doc but sphinx is not available for $PYTHON. Please disable docs or install sphinx.])
|
|
+ fi
|
|
+ ])
|
|
+fi
|
|
+AM_CONDITIONAL([DOC], [test "${enable_doc}" != "no" -a "$frr_py_mod_sphinx" != "false"])
|
|
+AM_CONDITIONAL([DOC_HTML], [test "${enable_doc_html}" = "yes"])
|
|
|
|
- FRR_PYTHON_CHECK_WORKING([
|
|
- AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
|
|
- ])
|
|
- fi
|
|
+FRR_PYTHON_MOD_EXEC([sphinx], [--version], [
|
|
+ PYSPHINX="-m sphinx"
|
|
+], [
|
|
+ PYSPHINX="-c 'import sys; from sphinx import main; sys.exit(main(sys.argv))'"
|
|
])
|
|
-AC_SUBST([PYTHON_CFLAGS])
|
|
-AC_SUBST([PYTHON_LIBS])
|
|
+AC_SUBST([PYSPHINX])
|
|
|
|
#
|
|
# Logic for protobuf support.
|
|
@@ -1507,16 +1447,6 @@ FRR_INCLUDES
|
|
#endif
|
|
])dnl
|
|
|
|
-dnl disable doc check
|
|
-AC_CHECK_PROGS([SPHINXBUILD], [sphinx-build sphinx-build3 sphinx-build2], [/bin/false])
|
|
-if test "$SPHINXBUILD" = "/bin/false"; then
|
|
- if test "${enable_doc}" = "yes"; then
|
|
- AC_MSG_ERROR([Documentation was explicitly requested with --enable-doc but sphinx-build is not available. Please disable docs or install sphinx.])
|
|
- fi
|
|
-fi
|
|
-AM_CONDITIONAL([DOC], [test "${enable_doc}" != "no" -a "$SPHINXBUILD" != "/bin/false"])
|
|
-AM_CONDITIONAL([DOC_HTML], [test "${enable_doc_html}" = "yes"])
|
|
-
|
|
dnl --------------------
|
|
dnl Daemon disable check
|
|
dnl --------------------
|
|
@@ -1666,6 +1596,7 @@ int main(void);
|
|
return 0;
|
|
}
|
|
])], [
|
|
+ AC_MSG_RESULT([no])
|
|
AC_MSG_ERROR([--enable-snmp given but not usable])])
|
|
case "${enable_snmp}" in
|
|
yes)
|
|
@@ -2356,7 +2287,9 @@ zebra protobuf enabled : ${enable_protobuf:-no}
|
|
The above user and group must have read/write access to the state file
|
|
directory and to the config files in the config file directory."
|
|
|
|
-if test "${enable_doc}" != "no";then
|
|
- AS_IF([test "$SPHINXBUILD" = /bin/false],
|
|
- AC_MSG_WARN([sphinx-build is missing but required to build documentation]))
|
|
+if test "${enable_doc}" != "no" -a "$frr_py_mod_sphinx" = false; then
|
|
+ AC_MSG_WARN([sphinx is missing but required to build documentation])
|
|
+fi
|
|
+if test "$frr_py_mod_pytest" = false; then
|
|
+ AC_MSG_WARN([pytest is missing, unit tests cannot be performed])
|
|
fi
|
|
diff --git a/doc/developer/building-frr-for-centos6.rst b/doc/developer/building-frr-for-centos6.rst
|
|
index f1ec2ad3ea..ee0ffc2bf7 100644
|
|
--- a/doc/developer/building-frr-for-centos6.rst
|
|
+++ b/doc/developer/building-frr-for-centos6.rst
|
|
@@ -163,10 +163,9 @@ an example.)
|
|
--disable-ldpd \
|
|
--enable-fpm \
|
|
--with-pkg-git-version \
|
|
- --with-pkg-extra-version=-MyOwnFRRVersion \
|
|
- SPHINXBUILD=sphinx-build2.7
|
|
+ --with-pkg-extra-version=-MyOwnFRRVersion
|
|
make
|
|
- make check PYTHON=/usr/bin/python2.7
|
|
+ make check
|
|
sudo make install
|
|
|
|
Create empty FRR configuration files
|
|
diff --git a/doc/developer/building-frr-for-debian8.rst b/doc/developer/building-frr-for-debian8.rst
|
|
index a26d055bc2..76f927853d 100644
|
|
--- a/doc/developer/building-frr-for-debian8.rst
|
|
+++ b/doc/developer/building-frr-for-debian8.rst
|
|
@@ -16,7 +16,7 @@ Add packages:
|
|
::
|
|
|
|
sudo apt-get install git autoconf automake libtool make \
|
|
- libreadline-dev texinfo libjson-c-dev pkg-config bison flex python-pip \
|
|
+ libreadline-dev texinfo libjson-c-dev pkg-config bison flex python3-pip \
|
|
libc-ares-dev python3-dev python3-sphinx build-essential libsystemd-dev
|
|
|
|
Install newer pytest (>3.0) from pip
|
|
@@ -24,7 +24,7 @@ Install newer pytest (>3.0) from pip
|
|
|
|
::
|
|
|
|
- sudo pip install pytest
|
|
+ sudo pip3 install pytest
|
|
|
|
.. include:: building-libyang.rst
|
|
|
|
diff --git a/doc/developer/building-frr-for-debian9.rst b/doc/developer/building-frr-for-debian9.rst
|
|
index 2c5a9681af..e58c59f451 100644
|
|
--- a/doc/developer/building-frr-for-debian9.rst
|
|
+++ b/doc/developer/building-frr-for-debian9.rst
|
|
@@ -9,8 +9,8 @@ Add packages:
|
|
::
|
|
|
|
sudo apt-get install git autoconf automake libtool make \
|
|
- libreadline-dev texinfo libjson-c-dev pkg-config bison flex python-pip \
|
|
- libc-ares-dev python3-dev python-pytest python3-sphinx build-essential \
|
|
+ libreadline-dev texinfo libjson-c-dev pkg-config bison flex \
|
|
+ libc-ares-dev python3-dev python3-pytest python3-sphinx build-essential \
|
|
libsystemd-dev
|
|
|
|
.. include:: building-libyang.rst
|
|
diff --git a/doc/developer/building-frr-for-fedora.rst b/doc/developer/building-frr-for-fedora.rst
|
|
index 204c185f56..d11da2d647 100644
|
|
--- a/doc/developer/building-frr-for-fedora.rst
|
|
+++ b/doc/developer/building-frr-for-fedora.rst
|
|
@@ -13,8 +13,8 @@ Installing Dependencies
|
|
|
|
sudo dnf install git autoconf automake libtool make \
|
|
readline-devel texinfo net-snmp-devel groff pkgconfig json-c-devel \
|
|
- pam-devel pytest bison flex c-ares-devel python3-devel python2-sphinx \
|
|
- perl-core patch
|
|
+ pam-devel python3-pytest bison flex c-ares-devel python3-devel \
|
|
+ python3-sphinx perl-core patch
|
|
|
|
.. include:: building-libyang.rst
|
|
|
|
diff --git a/doc/developer/building-frr-for-freebsd10.rst b/doc/developer/building-frr-for-freebsd10.rst
|
|
index 86c44f4d90..e85cb80053 100644
|
|
--- a/doc/developer/building-frr-for-freebsd10.rst
|
|
+++ b/doc/developer/building-frr-for-freebsd10.rst
|
|
@@ -17,7 +17,7 @@ is first package install and asked)
|
|
::
|
|
|
|
pkg install git autoconf automake libtool gmake json-c pkgconf \
|
|
- bison flex py27-pytest c-ares python3 py-sphinx
|
|
+ bison flex py36-pytest c-ares python3.6 py36-sphinx
|
|
|
|
Make sure there is no /usr/bin/flex preinstalled (and use the newly
|
|
installed in /usr/local/bin): (FreeBSD frequently provides a older flex
|
|
diff --git a/doc/developer/building-frr-for-freebsd11.rst b/doc/developer/building-frr-for-freebsd11.rst
|
|
index 5e56c8cd7a..b97538b763 100644
|
|
--- a/doc/developer/building-frr-for-freebsd11.rst
|
|
+++ b/doc/developer/building-frr-for-freebsd11.rst
|
|
@@ -17,7 +17,7 @@ is first package install and asked)
|
|
.. code-block:: shell
|
|
|
|
pkg install git autoconf automake libtool gmake json-c pkgconf \
|
|
- bison flex py27-pytest c-ares python3 py36-sphinx texinfo
|
|
+ bison flex py36-pytest c-ares python3.6 py36-sphinx texinfo
|
|
|
|
Make sure there is no /usr/bin/flex preinstalled (and use the newly
|
|
installed in /usr/local/bin): (FreeBSD frequently provides a older flex
|
|
diff --git a/doc/developer/building-frr-for-freebsd9.rst b/doc/developer/building-frr-for-freebsd9.rst
|
|
index 59241d1d13..1e97749795 100644
|
|
--- a/doc/developer/building-frr-for-freebsd9.rst
|
|
+++ b/doc/developer/building-frr-for-freebsd9.rst
|
|
@@ -17,8 +17,8 @@ is first package install and asked)
|
|
::
|
|
|
|
pkg install -y git autoconf automake libtool gmake \
|
|
- pkgconf texinfo json-c bison flex py27-pytest c-ares \
|
|
- python3 py-sphinx libexecinfo
|
|
+ pkgconf texinfo json-c bison flex py36-pytest c-ares \
|
|
+ python3 py36-sphinx libexecinfo
|
|
|
|
Make sure there is no /usr/bin/flex preinstalled (and use the newly
|
|
installed in /usr/local/bin): (FreeBSD frequently provides a older flex
|
|
diff --git a/doc/developer/building-frr-for-netbsd6.rst b/doc/developer/building-frr-for-netbsd6.rst
|
|
index 49091c49b4..e50d11130a 100644
|
|
--- a/doc/developer/building-frr-for-netbsd6.rst
|
|
+++ b/doc/developer/building-frr-for-netbsd6.rst
|
|
@@ -23,7 +23,7 @@ Add packages:
|
|
::
|
|
|
|
sudo pkg_add git autoconf automake libtool gmake openssl \
|
|
- pkg-config json-c python27 py27-test python35 py-sphinx
|
|
+ pkg-config json-c py36-test python36 py36-sphinx
|
|
|
|
Install SSL Root Certificates (for git https access):
|
|
|
|
@@ -33,13 +33,6 @@ Install SSL Root Certificates (for git https access):
|
|
sudo touch /etc/openssl/openssl.cnf
|
|
sudo mozilla-rootcerts install
|
|
|
|
-Select default Python and py.test
|
|
-
|
|
-::
|
|
-
|
|
- sudo ln -s /usr/pkg/bin/python2.7 /usr/bin/python
|
|
- sudo ln -s /usr/pkg/bin/py.test-2.7 /usr/bin/py.test
|
|
-
|
|
.. include:: building-libyang.rst
|
|
|
|
Get FRR, compile it and install it (from Git)
|
|
diff --git a/doc/developer/building-frr-for-netbsd7.rst b/doc/developer/building-frr-for-netbsd7.rst
|
|
index 64c462a5c8..32d1145edc 100644
|
|
--- a/doc/developer/building-frr-for-netbsd7.rst
|
|
+++ b/doc/developer/building-frr-for-netbsd7.rst
|
|
@@ -14,7 +14,7 @@ Install required packages
|
|
::
|
|
|
|
sudo pkgin install git autoconf automake libtool gmake openssl \
|
|
- pkg-config json-c python27 py27-test python35 py-sphinx
|
|
+ pkg-config json-c python36 py36-test py36-sphinx
|
|
|
|
Install SSL Root Certificates (for git https access):
|
|
|
|
@@ -24,13 +24,6 @@ Install SSL Root Certificates (for git https access):
|
|
sudo touch /etc/openssl/openssl.cnf
|
|
sudo mozilla-rootcerts install
|
|
|
|
-Select default Python and py.test
|
|
-
|
|
-::
|
|
-
|
|
- sudo ln -s /usr/pkg/bin/python2.7 /usr/bin/python
|
|
- sudo ln -s /usr/pkg/bin/py.test-2.7 /usr/bin/py.test
|
|
-
|
|
.. include:: building-libyang.rst
|
|
|
|
Get FRR, compile it and install it (from Git)
|
|
diff --git a/doc/developer/building-frr-for-ubuntu1404.rst b/doc/developer/building-frr-for-ubuntu1404.rst
|
|
index 6e2765c1c8..569b3bded1 100644
|
|
--- a/doc/developer/building-frr-for-ubuntu1404.rst
|
|
+++ b/doc/developer/building-frr-for-ubuntu1404.rst
|
|
@@ -12,7 +12,7 @@ Installing Dependencies
|
|
apt-get update
|
|
apt-get install \
|
|
git autoconf automake libtool make libreadline-dev texinfo \
|
|
- pkg-config libpam0g-dev libjson-c-dev bison flex python-pytest \
|
|
+ pkg-config libpam0g-dev libjson-c-dev bison flex python3-pytest \
|
|
libc-ares-dev python3-dev python3-sphinx install-info build-essential \
|
|
libsnmp-dev perl
|
|
|
|
diff --git a/doc/developer/building-frr-for-ubuntu1604.rst b/doc/developer/building-frr-for-ubuntu1604.rst
|
|
index a9a0a2f733..03852a62aa 100644
|
|
--- a/doc/developer/building-frr-for-ubuntu1604.rst
|
|
+++ b/doc/developer/building-frr-for-ubuntu1604.rst
|
|
@@ -12,7 +12,7 @@ Installing Dependencies
|
|
apt-get update
|
|
apt-get install \
|
|
git autoconf automake libtool make libreadline-dev texinfo \
|
|
- pkg-config libpam0g-dev libjson-c-dev bison flex python-pytest \
|
|
+ pkg-config libpam0g-dev libjson-c-dev bison flex python3-pytest \
|
|
libc-ares-dev python3-dev libsystemd-dev python-ipaddress python3-sphinx \
|
|
install-info build-essential libsystemd-dev libsnmp-dev perl
|
|
|
|
diff --git a/doc/developer/building-frr-for-ubuntu1804.rst b/doc/developer/building-frr-for-ubuntu1804.rst
|
|
index 8bdc2b9c76..96c0efe02a 100644
|
|
--- a/doc/developer/building-frr-for-ubuntu1804.rst
|
|
+++ b/doc/developer/building-frr-for-ubuntu1804.rst
|
|
@@ -12,7 +12,7 @@ Installing Dependencies
|
|
sudo apt update
|
|
sudo apt-get install \
|
|
git autoconf automake libtool make libreadline-dev texinfo \
|
|
- pkg-config libpam0g-dev libjson-c-dev bison flex python-pytest \
|
|
+ pkg-config libpam0g-dev libjson-c-dev bison flex python3-pytest \
|
|
libc-ares-dev python3-dev libsystemd-dev python-ipaddress python3-sphinx \
|
|
install-info build-essential libsystemd-dev libsnmp-dev perl
|
|
|
|
diff --git a/doc/developer/packaging-redhat.rst b/doc/developer/packaging-redhat.rst
|
|
index f6b9931156..d344046148 100644
|
|
--- a/doc/developer/packaging-redhat.rst
|
|
+++ b/doc/developer/packaging-redhat.rst
|
|
@@ -32,7 +32,7 @@ Tested on CentOS 6, CentOS 7 and Fedora 24.
|
|
|
|
cd frr
|
|
./bootstrap.sh
|
|
- ./configure --with-pkg-extra-version=-MyRPMVersion SPHINXBUILD=sphinx-build2.7
|
|
+ ./configure --with-pkg-extra-version=-MyRPMVersion
|
|
make dist
|
|
|
|
.. note::
|
|
diff --git a/doc/subdir.am b/doc/subdir.am
|
|
index 7d3792bf2b..a1297a4f81 100644
|
|
--- a/doc/subdir.am
|
|
+++ b/doc/subdir.am
|
|
@@ -4,7 +4,6 @@
|
|
|
|
# You can set these variables from the command line.
|
|
SPHINXOPTS ?=
|
|
-SPHINXBUILD ?= sphinx-build
|
|
PAPER ?=
|
|
|
|
# Internal variables.
|
|
@@ -32,20 +31,20 @@ am__v_MAKEINFO_1 =
|
|
doc/%/_build/.doctrees/environment.pickle:
|
|
$(AM_V_SPHINX) ( \
|
|
subdoc="$@"; subdoc="$${subdoc#doc/}"; subdoc="doc/$${subdoc%%/*}"; \
|
|
- $(SPHINXBUILD) -a -q -b text -d "$${subdoc}/_build/.doctrees" \
|
|
+ $(PYTHON) $(PYSPHINX) -a -q -b text -d "$${subdoc}/_build/.doctrees" \
|
|
$(ALLSPHINXOPTS) "$(top_srcdir)/$${subdoc}" "$${subdoc}/_build/text" \
|
|
)
|
|
doc/%/_build/html/.buildinfo: doc/%/_build/.doctrees/environment.pickle
|
|
$(AM_V_SPHINX) ( \
|
|
subdoc="$@"; subdoc="$${subdoc#doc/}"; subdoc="doc/$${subdoc%%/*}"; \
|
|
- $(SPHINXBUILD) -q -b html -d "$${subdoc}/_build/.doctrees" \
|
|
+ $(PYTHON) $(PYSPHINX) -q -b html -d "$${subdoc}/_build/.doctrees" \
|
|
$(ALLSPHINXOPTS) "$(top_srcdir)/$${subdoc}" "$${subdoc}/_build/html" \
|
|
)
|
|
.PRECIOUS: doc/%/_build/texinfo/frr.texi
|
|
doc/%/_build/texinfo/frr.texi: doc/%/_build/.doctrees/environment.pickle
|
|
$(AM_V_SPHINX) ( \
|
|
subdoc="$@"; subdoc="$${subdoc#doc/}"; subdoc="doc/$${subdoc%%/*}"; \
|
|
- $(SPHINXBUILD) -q -b texinfo -d "$${subdoc}/_build/.doctrees" \
|
|
+ $(PYTHON) $(PYSPHINX) -q -b texinfo -d "$${subdoc}/_build/.doctrees" \
|
|
$(ALLSPHINXOPTS) "$(top_srcdir)/$${subdoc}" "$${subdoc}/_build/texinfo" \
|
|
)
|
|
doc/%/_build/texinfo/frr.info: doc/%/_build/texinfo/frr.texi
|
|
@@ -54,7 +53,7 @@ doc/%/_build/man/man.stamp: doc/%/_build/.doctrees/environment.pickle
|
|
$(AM_V_SPHINX) ( \
|
|
subdoc="$@"; subdoc="$${subdoc#doc/}"; subdoc="doc/$${subdoc%%/*}"; \
|
|
$(MKDIR_P) "$${subdoc}/_build/man"; touch $@.tmp; \
|
|
- $(SPHINXBUILD) -a -q -b man -d "$${subdoc}/_build/.doctrees" \
|
|
+ $(PYTHON) $(PYSPHINX) -a -q -b man -d "$${subdoc}/_build/.doctrees" \
|
|
$(ALLSPHINXOPTS) "$(top_srcdir)/$${subdoc}" "$${subdoc}/_build/man" && \
|
|
mv -f $@.tmp $@ \
|
|
)
|
|
@@ -80,7 +79,7 @@ $(M_SPHINXTARGETS): doc/%/_build/.doctrees/environment.pickle
|
|
builder="$${target##*/}"; \
|
|
subdoc="$${target#doc/}"; subdoc="doc/$${subdoc%%/*}"; \
|
|
rm -rf "$@"; \
|
|
- $(SPHINXBUILD) -q -b $${builder} -d $${subdoc}/_build/.doctrees \
|
|
+ $(PYTHON) $(PYSPHINX) -q -b $${builder} -d $${subdoc}/_build/.doctrees \
|
|
$(ALLSPHINXOPTS) $(top_srcdir)/$${subdoc} $@ \
|
|
)
|
|
|
|
diff --git a/doc/user/installation.rst b/doc/user/installation.rst
|
|
index 964297292f..6438c11413 100644
|
|
--- a/doc/user/installation.rst
|
|
+++ b/doc/user/installation.rst
|
|
@@ -347,6 +347,27 @@ compile directory:
|
|
./configure --with-libyang-pluginsdir="`pwd`/yang/libyang_plugins/.libs" \
|
|
--with-yangmodelsdir="`pwd`/yang"
|
|
|
|
+Python dependency, documentation and tests
|
|
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
+
|
|
+FRR's documentation and basic unit tests heavily use code written in Python.
|
|
+Additionally, FRR ships Python extensions written in C which are used during
|
|
+its build process.
|
|
+
|
|
+To this extent, FRR needs the following:
|
|
+
|
|
+* an installation of CPython, preferably version 3.2 or newer (2.7 works but
|
|
+ is end of life and will stop working at some point.)
|
|
+* development files (mostly headers) for that version of CPython
|
|
+* an installation of `sphinx` for that version of CPython, to build the
|
|
+ documentation
|
|
+* an installation of `pytest` for that version of CPython, to run the unit
|
|
+ tests
|
|
+
|
|
+The `sphinx` and `pytest` dependencies can be avoided by not building
|
|
+documentation / not running ``make check``, but the CPython dependency is a
|
|
+hard dependency of the FRR build process (for the `clippy` tool.)
|
|
+
|
|
.. _least-privilege-support:
|
|
|
|
Least-Privilege Support
|
|
diff --git a/m4/ax_python.m4 b/m4/ax_python.m4
|
|
new file mode 100644
|
|
index 0000000000..32043c81ae
|
|
--- /dev/null
|
|
+++ b/m4/ax_python.m4
|
|
@@ -0,0 +1,288 @@
|
|
+dnl FRR Python autoconf magic
|
|
+dnl 2019 David Lamparter for NetDEF, Inc.
|
|
+dnl SPDX-License-Identifier: GPL-2.0-or-later
|
|
+
|
|
+dnl the _ at the beginning will be cut off (to support the empty version string)
|
|
+m4_define_default([_FRR_PY_VERS], [_3 _ _2 _3.7 _3.6 _3.5 _3.4 _3.3 _3.2 _2.7])
|
|
+
|
|
+dnl check basic interpreter properties (py2/py3)
|
|
+dnl doubles as simple check whether the interpreter actually works
|
|
+dnl also swaps in the full path to the interpreter
|
|
+dnl arg1: if-true, arg2: if-false
|
|
+AC_DEFUN([_FRR_PYTHON_INTERP], [dnl
|
|
+AC_ARG_VAR([PYTHON], [Python interpreter to use])dnl
|
|
+ AC_MSG_CHECKING([python interpreter $PYTHON])
|
|
+ AC_RUN_LOG(["$PYTHON" -c 'import sys; open("conftest.pyver", "w").write(sys.executable or ""); sys.exit(not (sys.version_info.major == 2 and sys.version_info.minor >= 7))'])
|
|
+ py2=$ac_status
|
|
+ _py2_full="`cat conftest.pyver 2>/dev/null`"
|
|
+ rm -f "conftest.pyver" >/dev/null 2>/dev/null
|
|
+
|
|
+ AC_RUN_LOG(["$PYTHON" -c 'import sys; open("conftest.pyver", "w").write(sys.executable or ""); sys.exit(not ((sys.version_info.major == 3 and sys.version_info.minor >= 2) or sys.version_info.major > 3))'])
|
|
+ py3=$ac_status
|
|
+ _py3_full="`cat conftest.pyver 2>/dev/null`"
|
|
+ rm -f "conftest.pyver" >/dev/null 2>/dev/null
|
|
+
|
|
+ case "p${py2}p${py3}" in
|
|
+ p0p1) frr_cv_python=python2
|
|
+ _python_full="$_py2_full" ;;
|
|
+ p1p0) frr_cv_python=python3
|
|
+ _python_full="$_py3_full" ;;
|
|
+ *) frr_cv_python=none ;;
|
|
+ esac
|
|
+
|
|
+ if test "$frr_cv_python" = none; then
|
|
+ AC_MSG_RESULT([not working])
|
|
+ $2
|
|
+ else
|
|
+ test -n "$_python_full" -a -x "$_python_full" && PYTHON="$_python_full"
|
|
+ AC_MSG_RESULT([$PYTHON ($frr_cv_python)])
|
|
+ $1
|
|
+ fi
|
|
+
|
|
+ dnl return value
|
|
+ test "$frr_cv_python" != none
|
|
+])
|
|
+
|
|
+dnl check whether $PYTHON has modules available
|
|
+dnl arg1: list of modules (space separated)
|
|
+dnl arg2: if all true, arg3: if any missing
|
|
+dnl also sets frr_py_mod_<name> to "true" or "false"
|
|
+AC_DEFUN([FRR_PYTHON_MODULES], [
|
|
+ result=true
|
|
+ for pymod in $1; do
|
|
+ AC_MSG_CHECKING([whether $PYTHON module $pymod is available])
|
|
+ AC_RUN_LOG(["$PYTHON" -c "import $pymod"])
|
|
+ sane="`echo \"$pymod\" | tr -c '[a-zA-Z0-9\n]' '_'`"
|
|
+ if test "$ac_status" -eq 0; then
|
|
+ AC_MSG_RESULT([yes])
|
|
+ eval frr_py_mod_$sane=true
|
|
+ else
|
|
+ AC_MSG_RESULT([no])
|
|
+ eval frr_py_mod_$sane=false
|
|
+ result=false
|
|
+ fi
|
|
+ done
|
|
+ if $result; then
|
|
+ m4_default([$2], [:])
|
|
+ else
|
|
+ m4_default([$3], [:])
|
|
+ fi
|
|
+ $result
|
|
+])
|
|
+
|
|
+dnl check whether $PYTHON has modules available
|
|
+dnl arg1: list of modules (space separated)
|
|
+dnl arg2: command line parameters for executing
|
|
+dnl arg3: if all true, arg4: if any missing
|
|
+dnl also sets frr_py_modexec_<name> to "true" or "false"
|
|
+AC_DEFUN([FRR_PYTHON_MOD_EXEC], [
|
|
+ result=true
|
|
+ for pymod in $1; do
|
|
+ AC_MSG_CHECKING([whether $PYTHON module $pymod is executable])
|
|
+ AC_RUN_LOG(["$PYTHON" -m "$pymod" $2 > /dev/null])
|
|
+ sane="`echo \"$pymod\" | tr -c '[a-zA-Z0-9\n]' '_'`"
|
|
+ if test "$ac_status" -eq 0; then
|
|
+ AC_MSG_RESULT([yes])
|
|
+ eval frr_py_modexec_$sane=true
|
|
+ else
|
|
+ AC_MSG_RESULT([no])
|
|
+ eval frr_py_modexec_$sane=false
|
|
+ result=false
|
|
+ fi
|
|
+ done
|
|
+ if $result; then
|
|
+ m4_default([$3], [:])
|
|
+ else
|
|
+ m4_default([$4], [:])
|
|
+ fi
|
|
+ $result
|
|
+])
|
|
+
|
|
+dnl check whether we can build & link python bits
|
|
+dnl input: PYTHON_CFLAGS and PYTHON_LIBS
|
|
+AC_DEFUN([_FRR_PYTHON_DEVENV], [
|
|
+ result=true
|
|
+ AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
|
|
+#include <Python.h>
|
|
+#if PY_VERSION_HEX < 0x02070000
|
|
+#error python too old
|
|
+#endif
|
|
+int main(void);
|
|
+],
|
|
+[
|
|
+{
|
|
+ Py_Initialize();
|
|
+ return 0;
|
|
+}
|
|
+])], [
|
|
+ # some python installs are missing the zlib dependency...
|
|
+ PYTHON_LIBS="${PYTHON_LIBS} -lz"
|
|
+ AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
|
|
+#include <Python.h>
|
|
+#if PY_VERSION_HEX < 0x02070000
|
|
+#error python too old
|
|
+#endif
|
|
+int main(void);
|
|
+],
|
|
+[
|
|
+{
|
|
+ Py_Initialize();
|
|
+ return 0;
|
|
+}
|
|
+])], [
|
|
+ result=false
|
|
+ AC_MSG_RESULT([no])
|
|
+ ], [:])
|
|
+ ], [:])
|
|
+
|
|
+ if $result; then
|
|
+ AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
|
|
+#include <Python.h>
|
|
+#if PY_VERSION_HEX != $1
|
|
+#error python version mismatch
|
|
+#endif
|
|
+int main(void);
|
|
+],
|
|
+[
|
|
+{
|
|
+ Py_Initialize();
|
|
+ return 0;
|
|
+}
|
|
+])], [
|
|
+ result=false
|
|
+ AC_MSG_RESULT([version mismatch])
|
|
+ ], [
|
|
+ AC_MSG_RESULT([yes])
|
|
+ ])
|
|
+ fi
|
|
+
|
|
+ if $result; then
|
|
+ m4_default([$2], [:])
|
|
+ else
|
|
+ m4_default([$3], [
|
|
+ unset PYTHON_LIBS
|
|
+ unset PYTHON_CFLAGS
|
|
+ ])
|
|
+ fi
|
|
+])
|
|
+
|
|
+AC_DEFUN([_FRR_PYTHON_GETDEV], [dnl
|
|
+AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
|
+
|
|
+ py_abi="` \"$1\" -c \"import sys; print(getattr(sys, 'abiflags', ''))\"`"
|
|
+ py_hex="` \"$1\" -c \"import sys; print(hex(sys.hexversion))\"`"
|
|
+ py_ldver="` \"$1\" -c \"import sysconfig; print(sysconfig.get_config_var('LDVERSION') or '')\"`"
|
|
+ py_ver="` \"$1\" -c \"import sysconfig; print(sysconfig.get_config_var('VERSION') or '')\"`"
|
|
+ py_bindir="`\"$1\" -c \"import sysconfig; print(sysconfig.get_config_var('BINDIR') or '')\"`"
|
|
+ test -z "$py_bindir" || py_bindir="$py_bindir/"
|
|
+ echo "py_abi=${py_abi} py_ldver=${py_ldver} py_ver=${py_ver} py_bindir=${py_bindir}" >&AS_MESSAGE_LOG_FD
|
|
+
|
|
+ py_found=false
|
|
+
|
|
+ for tryver in "${py_ldver}" "${py_ver}"; do
|
|
+ pycfg="${py_bindir}python${tryver}-config"
|
|
+ AC_MSG_CHECKING([whether ${pycfg} is available])
|
|
+ if "$pycfg" --configdir >/dev/null 2>/dev/null; then
|
|
+ AC_MSG_RESULT([yes])
|
|
+
|
|
+ PYTHON_CFLAGS="`\"$pycfg\" --includes`"
|
|
+ if test x"${py_ver}" == x"3.8" || test x"{py_ver}" == x"3.9"; then
|
|
+ PYTHON_LIBS="`\"$pycfg\" --ldflags --embed`"
|
|
+ else
|
|
+ PYTHON_LIBS="`\"$pycfg\" --ldflags`"
|
|
+ fi
|
|
+
|
|
+ AC_MSG_CHECKING([whether ${pycfg} provides a working build environment])
|
|
+ _FRR_PYTHON_DEVENV([$py_hex], [
|
|
+ py_found=true
|
|
+ break
|
|
+ ])
|
|
+ else
|
|
+ AC_MSG_RESULT([no])
|
|
+ fi
|
|
+
|
|
+ pkg_failed=no
|
|
+ AC_MSG_CHECKING([whether pkg-config python-${tryver} is available])
|
|
+ unset PYTHON_CFLAGS
|
|
+ unset PYTHON_LIBS
|
|
+ pkg="python-${tryver}"
|
|
+ pkg="${pkg%-}"
|
|
+ _PKG_CONFIG([PYTHON_CFLAGS], [cflags], [${pkg}])
|
|
+ _PKG_CONFIG([PYTHON_LIBS], [libs], [${pkg}])
|
|
+ if test $pkg_failed = no; then
|
|
+ AC_MSG_RESULT([yes])
|
|
+
|
|
+ PYTHON_CFLAGS=$pkg_cv_PYTHON_CFLAGS
|
|
+ PYTHON_LIBS=$pkg_cv_PYTHON_LIBS
|
|
+
|
|
+ AC_MSG_CHECKING([whether pkg-config python-${tryver} provides a working build environment])
|
|
+ _FRR_PYTHON_DEVENV([$py_hex], [
|
|
+ py_found=true
|
|
+ break
|
|
+ ])
|
|
+ else
|
|
+ AC_MSG_RESULT([no])
|
|
+ fi
|
|
+ done
|
|
+
|
|
+ if $py_found; then
|
|
+ m4_default([$2], [:])
|
|
+ else
|
|
+ unset PYTHON_CFLAGS
|
|
+ unset PYTHON_LIBS
|
|
+ m4_default([$3], [:])
|
|
+ fi
|
|
+])
|
|
+
|
|
+dnl just find python without checking headers/libs
|
|
+AC_DEFUN([FRR_PYTHON], [
|
|
+ dnl user override
|
|
+ if test "x$PYTHON" != "x"; then
|
|
+ _FRR_PYTHON_INTERP([], [
|
|
+ AC_MSG_ERROR([PYTHON ($PYTHON) explicitly specified but not working])
|
|
+ ])
|
|
+ else
|
|
+ for frr_pyver in _FRR_PY_VERS; do
|
|
+ PYTHON="python${frr_pyver#_}"
|
|
+ _FRR_PYTHON_INTERP([break])
|
|
+ PYTHON=":"
|
|
+ done
|
|
+ if test "$PYTHON" = ":"; then
|
|
+ AC_MSG_ERROR([no working python version found])
|
|
+ fi
|
|
+ fi
|
|
+ AC_SUBST([PYTHON])
|
|
+])
|
|
+
|
|
+dnl find python with checking headers/libs
|
|
+AC_DEFUN([FRR_PYTHON_DEV], [dnl
|
|
+AC_ARG_VAR([PYTHON_CFLAGS], [C compiler flags for Python])dnl
|
|
+AC_ARG_VAR([PYTHON_LIBS], [linker flags for Python])dnl
|
|
+
|
|
+ dnl user override
|
|
+ if test "x$PYTHON" != "x"; then
|
|
+ _FRR_PYTHON_INTERP([], [
|
|
+ AC_MSG_ERROR([PYTHON ($PYTHON) explicitly specified but not working])
|
|
+ ])
|
|
+ _FRR_PYTHON_GETDEV([$PYTHON], [], [
|
|
+ AC_MSG_ERROR([PYTHON ($PYTHON) explicitly specified but development environment not working])
|
|
+ ])
|
|
+ else
|
|
+ for frr_pyver in _FRR_PY_VERS; do
|
|
+ PYTHON="python${frr_pyver#_}"
|
|
+ _FRR_PYTHON_INTERP([
|
|
+ _FRR_PYTHON_GETDEV([$PYTHON], [
|
|
+ break
|
|
+ ])
|
|
+ ])
|
|
+ PYTHON=":"
|
|
+ done
|
|
+ if test "$PYTHON" = ":"; then
|
|
+ AC_MSG_ERROR([no working python version found])
|
|
+ fi
|
|
+ fi
|
|
+
|
|
+ AC_SUBST([PYTHON_CFLAGS])
|
|
+ AC_SUBST([PYTHON_LIBS])
|
|
+ AC_SUBST([PYTHON])
|
|
+])
|
|
diff --git a/redhat/frr.spec.in b/redhat/frr.spec.in
|
|
index ebd9ac3f47..27042e197c 100644
|
|
--- a/redhat/frr.spec.in
|
|
+++ b/redhat/frr.spec.in
|
|
@@ -44,12 +44,6 @@
|
|
# defines for configure
|
|
%define rundir %{_localstatedir}/run/%{name}
|
|
|
|
-# define for sphinx-build binary
|
|
-%if 0%{?rhel} && 0%{?rhel} < 7
|
|
- %define sphinx sphinx-build2.7
|
|
-%else
|
|
- %define sphinx sphinx-build
|
|
-%endif
|
|
############################################################################
|
|
|
|
#### Version String tweak
|
|
@@ -360,7 +354,7 @@ developing OSPF-API and frr applications.
|
|
%else
|
|
--disable-bfdd \
|
|
%endif
|
|
- SPHINXBUILD=%{sphinx}
|
|
+ # end
|
|
|
|
make %{?_smp_mflags} MAKEINFO="makeinfo --no-split"
|
|
|
|
diff --git a/tests/subdir.am b/tests/subdir.am
|
|
index ec5fea705e..10a78b98a0 100644
|
|
--- a/tests/subdir.am
|
|
+++ b/tests/subdir.am
|
|
@@ -2,8 +2,6 @@
|
|
# tests
|
|
#
|
|
|
|
-PYTHON ?= python
|
|
-
|
|
if BGPD
|
|
TESTS_BGPD = \
|
|
tests/bgpd/test_aspath \
|