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.
* Perl (http://www.perl.org/), version 5.005_03 or later. Perl is
required during build but not after installation.
* 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
* iconv, which should be installed as part of a Unix-like system.
If you don't have a version already, you can install GNU
AC_SUBST([VERSION_FOR_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.
dnl PSPP_CHECK_CC_OPTION([OPTION], [ACTION-IF-ACCEPTED], [ACTION-IF-REJECTED])
dnl Check whether the given C compiler OPTION is accepted.
AM_CONDITIONAL(host_is_w32, [case $host_os in mingw*) true;; *) false;; esac] )
PSPP_PERL
AM_CONDITIONAL(host_is_w32, [case $host_os in mingw*) true;; *) false;; esac] )
PSPP_PERL
AC_CHECK_PROGS([TEX], [tex], [no])
AC_SUBST([TEX])
AC_CHECK_PROGS([TEX], [tex], [no])
AC_SUBST([TEX])
src/output/spv/light-binary-parser.c \
src/output/spv/light-binary-parser.h
src/output/spv/light-binary-parser.c: $(light_binary_in)
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_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)
nodist_src_output_liboutput_la_SOURCES += $(light_binary_out)
BUILT_SOURCES += $(light_binary_out)
CLEANFILES += $(light_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)
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_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)
nodist_src_output_liboutput_la_SOURCES += $(old_binary_out)
BUILT_SOURCES += $(old_binary_out)
CLEANFILES += $(old_binary_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)
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_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)
nodist_src_output_liboutput_la_SOURCES += $(detail_xml_out)
BUILT_SOURCES += $(detail_xml_out)
CLEANFILES += $(detail_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)
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_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)
nodist_src_output_liboutput_la_SOURCES += $(structure_xml_out)
BUILT_SOURCES += $(structure_xml_out)
CLEANFILES += $(structure_xml_out)
src/output/spv/tlo-parser.c \
src/output/spv/tlo-parser.h
src/output/spv/tlo-parser.c: $(tlo_in)
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_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)
nodist_src_output_liboutput_la_SOURCES += $(tlo_out)
BUILT_SOURCES += $(tlo_out)
CLEANFILES += $(tlo_out)
# Variables used internally by the testsuite.
EXEEXT='@EXEEXT@'
PERL='@PERL@'
# Variables used internally by the testsuite.
EXEEXT='@EXEEXT@'
PERL='@PERL@'
TEX='@TEX@'
GWC='@GWC@'
WITH_PERL_MODULE='@WITH_PERL_MODULE@'
TEX='@TEX@'
GWC='@GWC@'
WITH_PERL_MODULE='@WITH_PERL_MODULE@'
AT_SETUP([DATE input format])
AT_KEYWORDS([data-in])
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])
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])
AT_SETUP([ADATE input format])
AT_KEYWORDS([data-in])
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])
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])
AT_SETUP([EDATE input format])
AT_KEYWORDS([data-in])
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])
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])
AT_SETUP([JDATE input format])
AT_KEYWORDS([data-in])
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])
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])
AT_SETUP([SDATE input format])
AT_KEYWORDS([data-in])
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])
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])
AT_SETUP([QYR input format])
AT_KEYWORDS([data-in])
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])
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])
AT_SETUP([MOYR input format])
AT_KEYWORDS([data-in])
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])
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])
AT_SETUP([WKYR input format])
AT_KEYWORDS([data-in])
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])
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])
AT_SETUP([DATETIME input format])
AT_KEYWORDS([data-in slow])
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])
AT_FAIL_IF([test ! -s datetime.sps || test ! -s datetime.input || \
test ! -s expout])
AT_CHECK([pspp -O format=csv datetime.sps])
AT_SETUP([YMDHMS input format])
AT_KEYWORDS([data-in slow])
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])
AT_FAIL_IF([test ! -s ymdhms.sps || test ! -s ymdhms.input || \
test ! -s expout])
AT_CHECK([pspp -O format=csv ymdhms.sps])
AT_SETUP([MTIME input format])
AT_KEYWORDS([data-in])
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])
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])
AT_SETUP([TIME input format])
AT_KEYWORDS([data-in])
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])
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])
AT_SETUP([DTIME input format])
AT_KEYWORDS([data-in])
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])
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])