| #! /bin/sh | |
| # Copyright (C) 2011-2026 Free Software Foundation, Inc. | |
| # | |
| # 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, or (at your option) | |
| # any later version. | |
| # | |
| # This program is distributed in the hope that it will be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| # GNU General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU General Public License | |
| # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| # Test rebuild rules for Java class files. | |
| required='javac' | |
| . test-init.sh | |
| cat >> configure.ac <<'END' | |
| AC_OUTPUT | |
| END | |
| cat > Makefile.am <<'END' | |
| AM_JAVACFLAGS = -verbose | |
| foodir = $(datadir)/java | |
| foo_JAVA = a.java | |
| dist_foo_JAVA = d.java | |
| nodist_foo_JAVA = n.java | |
| nobase_foo_JAVA = Nobase.java | |
| nobase_dist_foo_JAVA = NobaseDist.java | |
| nobase_nodist_foo_JAVA = NobaseNoDist.java | |
| END | |
| echo 'class _x {}' > a.java | |
| echo 'class x_ {}' > d.java | |
| echo 'class a {} class d {}' > n.java | |
| echo 'class Nobase_Foo {} class Nobase_Bar {}' > Nobase.java | |
| echo 'class NobaseDist {}' > NobaseDist.java | |
| echo 'class NobaseNoDist {}' > NobaseNoDist.java | |
| $ACLOCAL | |
| $AUTOCONF | |
| $AUTOMAKE | |
| all_classes='_x x_ a d Nobase_Foo Nobase_Bar NobaseDist NobaseNoDist' | |
| for vpath in : false; do | |
| if $vpath; then | |
| srcdir=.. | |
| mkdir build | |
| cd build | |
| else | |
| srcdir=. | |
| fi | |
| $srcdir/configure | |
| $MAKE | |
| ls -l # For debugging. | |
| # Sanity check. | |
| test -f classfoo.stamp | |
| for cls in $all_classes; do | |
| test -f $cls.class | |
| done | |
| # When the stampfile is removed, all the *.class files should | |
| # be considered out-of-date. | |
| echo timestamp > older | |
| $sleep | |
| rm -f classfoo.stamp | |
| $MAKE | |
| for cls in $all_classes; do | |
| is_newest $cls.class older | |
| done | |
| # When only a java file is modified, only the *.class files derived from | |
| # it should be updated. | |
| # The strings we loop on here have the following format: | |
| # "JAVA-FILES-TO-BE-TOUCHED -- CLASSES-THAT-SHOULD-BE-UPDATED" | |
| for args in \ | |
| 'a -- _x' \ | |
| 'd -- x_' \ | |
| 'n -- a d' \ | |
| 'a d Nobase -- _x x_ Nobase_Foo Nobase_Bar' \ | |
| 'n NobaseDist -- a d NobaseDist' \ | |
| 'd NobaseNoDist -- x_ NobaseNoDist' \ | |
| "a d n Nobase NobaseDist NobaseNoDist -- $all_classes" \ | |
| ; do | |
| set $args | |
| touched_javas= | |
| while test $# -gt 0; do | |
| if test x"$1" = x"--"; then | |
| shift | |
| break | |
| else | |
| touched_javas="$touched_javas $1" | |
| shift | |
| fi | |
| done | |
| updated_classes=$* | |
| echo timestamp > older | |
| $sleep | |
| for j in $touched_javas; do | |
| touch $srcdir/$j.java | |
| done | |
| $MAKE | |
| is_newest classfoo.stamp older | |
| for cls in $all_classes; do | |
| case " $updated_classes " in | |
| *" $cls "*) is_newest $cls.class older;; | |
| *) is_newest older $cls.class;; | |
| esac | |
| done | |
| done # $args ... | |
| cd $srcdir | |
| done # $vpath ... | |
| : |