tests: Let 'ltorder.sh' run successfully with Guix dynamic loader
[automake.git] / t / yacc-cxx.sh
blob2edb6c51773009bc0e0172425520f4bfd6a303f0
1 #! /bin/sh
2 # Copyright (C) 2011-2018 Free Software Foundation, Inc.
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2, or (at your option)
7 # any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <https://www.gnu.org/licenses/>.
17 # Basic semantic checks on Yacc + C++ support (when yacc-generated
18 # headers are not involved).
19 # Keep in sync with sister test 'yacc-basic.sh'.
21 required='c++ yacc'
22 . test-init.sh
24 cat >> configure.ac << 'END'
25 AC_PROG_CXX
26 AC_PROG_YACC
27 AC_OUTPUT
28 END
30 cat > Makefile.am << 'END'
31 bin_PROGRAMS = foo1 foo2 foo3 foo4
32 foo1_SOURCES = parse1.yy foo.cc
33 foo2_SOURCES = parse2.y++ bar.c++
34 foo3_SOURCES = parse3.yxx foo.cc
35 foo4_SOURCES = parse4.ypp bar2.cxx
36 foo3_YFLAGS = -v
37 foo4_YFLAGS = $(foo3_YFLAGS)
39 .PHONY: echo-distcom
40 echo-distcom:
41 @echo ' ' $(DIST_COMMON) ' '
42 END
44 cat > parse1.yy << 'END'
46 // Valid C++, but deliberately invalid C.
47 #include <cstdio>
48 #include <cstdlib>
49 // "std::" qualification required by Sun C++ 5.9.
50 int yylex (void) { return std::getchar (); }
51 void yyerror (const char *s) { return; }
54 a : 'a' { exit(0); };
55 END
56 cp parse1.yy parse2.y++
57 cp parse1.yy parse3.yxx
58 cp parse1.yy parse4.ypp
60 cat > foo.cc << 'END'
61 // Valid C++, but deliberately invalid C.
62 using namespace std;
63 int main (int argc, char **argv)
65 int yyparse (void);
66 yyparse ();
67 return 1;
69 END
70 cp foo.cc bar.c++
71 cp foo.cc bar2.cxx
73 $ACLOCAL
74 $AUTOCONF
75 $AUTOMAKE -a
77 ./configure
79 $MAKE
81 # The Yacc-derived C++ sources must be created, and not removed once
82 # compiled (i.e., not treated like "intermediate files" in the GNU
83 # make sense).
84 test -f parse1.cc
85 test -f parse2.c++
86 test -f foo3-parse3.cxx
87 test -f foo4-parse4.cpp
88 # Check that per-object flags are honored.
89 test -f foo3-parse3.output
90 test -f foo4-parse4.output
92 if ! cross_compiling; then
93 for i in 1 2 3 4; do
94 echo a | ./foo$i
95 echo b | ./foo$i && exit 1
96 : For shells with busted 'set -e'.
97 done
100 # The Yacc-derived C++ sources must be shipped.
101 $MAKE echo-distcom
102 $MAKE -s echo-distcom | grep '[ /]parse1\.cc '
103 $MAKE -s echo-distcom | grep '[ /]parse2\.c++ '
104 $MAKE -s echo-distcom | grep '[ /]foo3-parse3\.cxx '
105 $MAKE -s echo-distcom | grep '[ /]foo4-parse4\.cpp '
106 $MAKE distdir
107 ls -l $distdir
108 test -f $distdir/parse1.cc
109 test -f $distdir/parse2.c++
110 test -f $distdir/foo3-parse3.cxx
111 test -f $distdir/foo4-parse4.cpp
113 # Sanity check on distribution.
114 # Note that, for this to succeed, foo3-parse3.output and foo4-parse4.output
115 # must either not be distributed, or properly cleaned by automake-generated
116 # rules. We don't want to set the exact semantics yet, but want to ensure
117 # they are are consistent.
118 yl_distcheck
120 # Make sure that the Yacc-derived C++ sources are erased by
121 # maintainer-clean, and not by distclean.
122 test -f parse1.cc
123 test -f parse2.c++
124 test -f foo3-parse3.cxx
125 test -f foo4-parse4.cpp
126 $MAKE distclean
127 ls -l
128 test -f parse1.cc
129 test -f parse2.c++
130 test -f foo3-parse3.cxx
131 test -f foo4-parse4.cpp
132 ./configure # Re-create 'Makefile'.
133 $MAKE maintainer-clean
134 ls -l
135 test ! -e parse1.cc
136 test ! -e parse2.c++
137 test ! -e foo3-parse3.cxx
138 test ! -e foo4-parse4.cpp