Fix build requirements by correctly noting that Python is required.
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 16 Dec 2021 01:11:32 +0000 (17:11 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 16 Dec 2021 01:24:48 +0000 (17:24 -0800)
Building PSPP has required Python since support for the SPV format was
added, because the SPV parser-generators use Python.

Only Python 3+ can reasonably be supported, because support for Python 2.x
ended in April 2020.

INSTALL
acinclude.m4
configure.ac
src/output/spv/automake.mk
tests/atlocal.in
tests/data/data-in.at

diff --git a/INSTALL b/INSTALL
index 5fe74b442d57a38c901b2b63df5a2ed83ce5417b..35fd4715eaf6398ae8176a95455585ea58b54eda 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -60,9 +60,8 @@ The following packages are required to install PSPP:
     * Perl (http://www.perl.org/), version 5.005_03 or later.  Perl is
       required during build but not after installation.
 
-    * Python (https://python.org/), version 2.7 or later (Python 3 is
-      fine).  Some tests require Python; if it is missing, those tests
-      will be skipped.  PSPP does not otherwise require Python.
+    * Python (https://python.org/), version 3.4 or later.  Python is
+      required during build but not after installation.
 
     * iconv, which should be installed as part of a Unix-like system.
       If you don't have a version already, you can install GNU
index e7dd390d6917babdf7743cda447829d8af8fa973..f0700099628930dbc3cfaff713913b9614edf286 100644 (file)
@@ -43,10 +43,17 @@ AC_DEFUN([PSPP_PERL],
   AC_SUBST([VERSION_FOR_PERL])
 ])
 
-dnl Check that Python 2 or 3 is available.
-AC_DEFUN([PSPP_PYTHON],
-  [AC_ARG_VAR([PYTHON], [Python 2 or 3 interpreter])
-   AC_CHECK_PROGS([PYTHON], [python python2 python3], [none])])
+dnl Check that Python 3 is available.
+AC_DEFUN([PSPP_PYTHON3],
+  [AC_ARG_VAR([PYTHON3], [Python 3 interpreter])
+   AC_CHECK_PROGS([PYTHON3], [python3 python], [none])
+   if test "$PYTHON3" != no && $PYTHON3 -c '
+import sys
+sys.exit(0 if sys.version_info >= (3,4) else 1)
+'; then :; else
+     PSPP_REQUIRED_PREREQ([Python 3.4 (or later)])
+   fi
+  ])
 
 dnl PSPP_CHECK_CC_OPTION([OPTION], [ACTION-IF-ACCEPTED], [ACTION-IF-REJECTED])
 dnl Check whether the given C compiler OPTION is accepted.
index 3aa807cee9da19bc15c71ce95b602fb37d39cd3e..c1bc5d78cb44aaeb00cde464c0695b6fe59ef7cf 100644 (file)
@@ -65,7 +65,7 @@ AM_CONDITIONAL(cc_is_gcc, test x"$GCC" = x"yes" )
 AM_CONDITIONAL(host_is_w32, [case $host_os in mingw*) true;; *) false;; esac] )
 
 PSPP_PERL
-PSPP_PYTHON
+PSPP_PYTHON3
 AC_CHECK_PROGS([TEX], [tex], [no])
 AC_SUBST([TEX])
 
index e7cb75af15db27212188ca58000055264f9aa77b..061fc03ecfcf11e9c5912aa5bb34193999fe12b0 100644 (file)
@@ -45,10 +45,10 @@ light_binary_out = \
        src/output/spv/light-binary-parser.c \
        src/output/spv/light-binary-parser.h
 src/output/spv/light-binary-parser.c: $(light_binary_in)
-       $(AM_V_GEN)$(PYTHON) $^ code spvlb '"output/spv/light-binary-parser.h"' > $@.tmp
+       $(AM_V_GEN)$(PYTHON3) $^ code spvlb '"output/spv/light-binary-parser.h"' > $@.tmp
        $(AM_V_at)mv $@.tmp $@
 src/output/spv/light-binary-parser.h: $(light_binary_in)
-       $(AM_V_GEN)$(PYTHON) $^ header spvlb > $@.tmp && mv $@.tmp $@
+       $(AM_V_GEN)$(PYTHON3) $^ header spvlb > $@.tmp && mv $@.tmp $@
 nodist_src_output_liboutput_la_SOURCES += $(light_binary_out)
 BUILT_SOURCES += $(light_binary_out)
 CLEANFILES += $(light_binary_out)
@@ -61,10 +61,10 @@ old_binary_out = \
        src/output/spv/old-binary-parser.c \
        src/output/spv/old-binary-parser.h
 src/output/spv/old-binary-parser.c: $(old_binary_in)
-       $(AM_V_GEN)$(PYTHON) $^ code spvob '"output/spv/old-binary-parser.h"' > $@.tmp
+       $(AM_V_GEN)$(PYTHON3) $^ code spvob '"output/spv/old-binary-parser.h"' > $@.tmp
        $(AM_V_at)mv $@.tmp $@
 src/output/spv/old-binary-parser.h: $(old_binary_in)
-       $(AM_V_GEN)$(PYTHON) $^ header spvob > $@.tmp && mv $@.tmp $@
+       $(AM_V_GEN)$(PYTHON3) $^ header spvob > $@.tmp && mv $@.tmp $@
 nodist_src_output_liboutput_la_SOURCES += $(old_binary_out)
 BUILT_SOURCES += $(old_binary_out)
 CLEANFILES += $(old_binary_out)
@@ -77,10 +77,10 @@ detail_xml_out = \
        src/output/spv/detail-xml-parser.c \
        src/output/spv/detail-xml-parser.h
 src/output/spv/detail-xml-parser.c: $(detail_xml_in)
-       $(AM_V_GEN)$(PYTHON) $^ code spvdx '"output/spv/detail-xml-parser.h"' > $@.tmp
+       $(AM_V_GEN)$(PYTHON3) $^ code spvdx '"output/spv/detail-xml-parser.h"' > $@.tmp
        $(AM_V_at)mv $@.tmp $@
 src/output/spv/detail-xml-parser.h: $(detail_xml_in)
-       $(AM_V_GEN)$(PYTHON) $^ header spvdx > $@.tmp && mv $@.tmp $@
+       $(AM_V_GEN)$(PYTHON3) $^ header spvdx > $@.tmp && mv $@.tmp $@
 nodist_src_output_liboutput_la_SOURCES += $(detail_xml_out)
 BUILT_SOURCES += $(detail_xml_out)
 CLEANFILES += $(detail_xml_out)
@@ -93,10 +93,10 @@ structure_xml_out = \
        src/output/spv/structure-xml-parser.c \
        src/output/spv/structure-xml-parser.h
 src/output/spv/structure-xml-parser.c: $(structure_xml_in)
-       $(AM_V_GEN)$(PYTHON) $^ code spvsx '"output/spv/structure-xml-parser.h"' > $@.tmp
+       $(AM_V_GEN)$(PYTHON3) $^ code spvsx '"output/spv/structure-xml-parser.h"' > $@.tmp
        $(AM_V_at)mv $@.tmp $@
 src/output/spv/structure-xml-parser.h: $(structure_xml_in)
-       $(AM_V_GEN)$(PYTHON) $^ header spvsx > $@.tmp && mv $@.tmp $@
+       $(AM_V_GEN)$(PYTHON3) $^ header spvsx > $@.tmp && mv $@.tmp $@
 nodist_src_output_liboutput_la_SOURCES += $(structure_xml_out)
 BUILT_SOURCES += $(structure_xml_out)
 CLEANFILES += $(structure_xml_out)
@@ -109,10 +109,10 @@ tlo_out = \
        src/output/spv/tlo-parser.c \
        src/output/spv/tlo-parser.h
 src/output/spv/tlo-parser.c: $(tlo_in)
-       $(AM_V_GEN)$(PYTHON) $^ code tlo '"output/spv/tlo-parser.h"' > $@.tmp
+       $(AM_V_GEN)$(PYTHON3) $^ code tlo '"output/spv/tlo-parser.h"' > $@.tmp
        $(AM_V_at)mv $@.tmp $@
 src/output/spv/tlo-parser.h: $(tlo_in)
-       $(AM_V_GEN)$(PYTHON) $^ header tlo > $@.tmp && mv $@.tmp $@
+       $(AM_V_GEN)$(PYTHON3) $^ header tlo > $@.tmp && mv $@.tmp $@
 nodist_src_output_liboutput_la_SOURCES += $(tlo_out)
 BUILT_SOURCES += $(tlo_out)
 CLEANFILES += $(tlo_out)
index 66292efe04821be02cf831fd2b7f99610d609c75..42119f32494740d1d5c480ba41277b9b94dc3141 100644 (file)
@@ -21,7 +21,7 @@
 # Variables used internally by the testsuite.
 EXEEXT='@EXEEXT@'
 PERL='@PERL@'
-PYTHON='@PYTHON@'
+PYTHON3='@PYTHON3@'
 TEX='@TEX@'
 GWC='@GWC@'
 WITH_PERL_MODULE='@WITH_PERL_MODULE@'
index a5285b0b6e35669f068b9ac06f25ea417f683601..77a39db0103305ac7e22262438aef7cabfa01ce5 100644 (file)
@@ -255,8 +255,7 @@ AT_CLEANUP
 
 AT_SETUP([DATE input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py date d-m-y])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py date d-m-y])
 AT_FAIL_IF([test ! -s date.sps || test ! -s date.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv date.sps])
 AT_CHECK([cat date.output], [0], [expout])
@@ -264,8 +263,7 @@ AT_CLEANUP
 
 AT_SETUP([ADATE input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py adate m-d-y])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py adate m-d-y])
 AT_FAIL_IF([test ! -s adate.sps || test ! -s adate.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv adate.sps])
 AT_CHECK([cat adate.output], [0], [expout])
@@ -273,8 +271,7 @@ AT_CLEANUP
 
 AT_SETUP([EDATE input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py edate d-m-y])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py edate d-m-y])
 AT_FAIL_IF([test ! -s edate.sps || test ! -s edate.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv edate.sps])
 AT_CHECK([cat edate.output], [0], [expout])
@@ -282,8 +279,7 @@ AT_CLEANUP
 
 AT_SETUP([JDATE input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py jdate j])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py jdate j])
 AT_FAIL_IF([test ! -s jdate.sps || test ! -s jdate.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv jdate.sps])
 AT_CHECK([cat jdate.output], [0], [expout])
@@ -291,8 +287,7 @@ AT_CLEANUP
 
 AT_SETUP([SDATE input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py sdate y-m-d])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py sdate y-m-d])
 AT_FAIL_IF([test ! -s sdate.sps || test ! -s sdate.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv sdate.sps])
 AT_CHECK([cat sdate.output], [0], [expout])
@@ -300,8 +295,7 @@ AT_CLEANUP
 
 AT_SETUP([QYR input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py qyr qQy])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py qyr qQy])
 AT_FAIL_IF([test ! -s qyr.sps || test ! -s qyr.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv qyr.sps])
 AT_CHECK([cat qyr.output], [0], [expout])
@@ -309,8 +303,7 @@ AT_CLEANUP
 
 AT_SETUP([MOYR input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py moyr m-y])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py moyr m-y])
 AT_FAIL_IF([test ! -s moyr.sps || test ! -s moyr.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv moyr.sps])
 AT_CHECK([cat moyr.output], [0], [expout])
@@ -318,8 +311,7 @@ AT_CLEANUP
 
 AT_SETUP([WKYR input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py wkyr wWy])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py wkyr wWy])
 AT_FAIL_IF([test ! -s wkyr.sps || test ! -s wkyr.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv wkyr.sps])
 AT_CHECK([cat wkyr.output], [0], [expout])
@@ -327,8 +319,7 @@ AT_CLEANUP
 
 AT_SETUP([DATETIME input format])
 AT_KEYWORDS([data-in slow])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py datetime "d-m-y +H:M" "d-m-y +H:M:S"])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py datetime "d-m-y +H:M" "d-m-y +H:M:S"])
 AT_FAIL_IF([test ! -s datetime.sps || test ! -s datetime.input || \
             test ! -s expout])
 AT_CHECK([pspp -O format=csv datetime.sps])
@@ -337,8 +328,7 @@ AT_CLEANUP
 
 AT_SETUP([YMDHMS input format])
 AT_KEYWORDS([data-in slow])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py ymdhms "y-m-d +H:M" "y-m-d +H:M:S"])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py ymdhms "y-m-d +H:M" "y-m-d +H:M:S"])
 AT_FAIL_IF([test ! -s ymdhms.sps || test ! -s ymdhms.input || \
             test ! -s expout])
 AT_CHECK([pspp -O format=csv ymdhms.sps])
@@ -347,8 +337,7 @@ AT_CLEANUP
 
 AT_SETUP([MTIME input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-time-input.py mtime +M:S])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-time-input.py mtime +M:S])
 AT_FAIL_IF([test ! -s mtime.sps || test ! -s mtime.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv mtime.sps])
 AT_CHECK([cat mtime.output], [0], [expout])
@@ -356,8 +345,7 @@ AT_CLEANUP
 
 AT_SETUP([TIME input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-time-input.py time +H:M +H:M:S])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-time-input.py time +H:M +H:M:S])
 AT_FAIL_IF([test ! -s time.sps || test ! -s time.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv time.sps])
 AT_CHECK([cat time.output], [0], [expout])
@@ -365,8 +353,7 @@ AT_CLEANUP
 
 AT_SETUP([DTIME input format])
 AT_KEYWORDS([data-in])
-AT_SKIP_IF([test "$PYTHON" = none])
-AT_CHECK([$PYTHON $top_srcdir/tests/data/test-time-input.py dtime  '+D H:M' '+D H:M:S'])
+AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-time-input.py dtime  '+D H:M' '+D H:M:S'])
 AT_FAIL_IF([test ! -s dtime.sps || test ! -s dtime.input || test ! -s expout])
 AT_CHECK([pspp -O format=csv dtime.sps])
 AT_CHECK([cat dtime.output], [0], [expout])