xref: /freebsd/contrib/lutok/admin/missing (revision 132f818ddbf457ee67d502cd89b5a18e0a34713d)
1*132f818dSEnji Cooper#! /bin/sh
2*132f818dSEnji Cooper# Common wrapper for a few potentially missing GNU and other programs.
3*132f818dSEnji Cooper
4*132f818dSEnji Cooperscriptversion=2024-06-07.14; # UTC
5*132f818dSEnji Cooper
6*132f818dSEnji Cooper# shellcheck disable=SC2006,SC2268 # we must support pre-POSIX shells
7*132f818dSEnji Cooper
8*132f818dSEnji Cooper# Copyright (C) 1996-2024 Free Software Foundation, Inc.
9*132f818dSEnji Cooper# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
10*132f818dSEnji Cooper
11*132f818dSEnji Cooper# This program is free software; you can redistribute it and/or modify
12*132f818dSEnji Cooper# it under the terms of the GNU General Public License as published by
13*132f818dSEnji Cooper# the Free Software Foundation; either version 2, or (at your option)
14*132f818dSEnji Cooper# any later version.
15*132f818dSEnji Cooper
16*132f818dSEnji Cooper# This program is distributed in the hope that it will be useful,
17*132f818dSEnji Cooper# but WITHOUT ANY WARRANTY; without even the implied warranty of
18*132f818dSEnji Cooper# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19*132f818dSEnji Cooper# GNU General Public License for more details.
20*132f818dSEnji Cooper
21*132f818dSEnji Cooper# You should have received a copy of the GNU General Public License
22*132f818dSEnji Cooper# along with this program.  If not, see <https://www.gnu.org/licenses/>.
23*132f818dSEnji Cooper
24*132f818dSEnji Cooper# As a special exception to the GNU General Public License, if you
25*132f818dSEnji Cooper# distribute this file as part of a program that contains a
26*132f818dSEnji Cooper# configuration script generated by Autoconf, you may include it under
27*132f818dSEnji Cooper# the same distribution terms that you use for the rest of that program.
28*132f818dSEnji Cooper
29*132f818dSEnji Cooperif test $# -eq 0; then
30*132f818dSEnji Cooper  echo 1>&2 "Try '$0 --help' for more information"
31*132f818dSEnji Cooper  exit 1
32*132f818dSEnji Cooperfi
33*132f818dSEnji Cooper
34*132f818dSEnji Coopercase $1 in
35*132f818dSEnji Cooper
36*132f818dSEnji Cooper  --is-lightweight)
37*132f818dSEnji Cooper    # Used by our autoconf macros to check whether the available missing
38*132f818dSEnji Cooper    # script is modern enough.
39*132f818dSEnji Cooper    exit 0
40*132f818dSEnji Cooper    ;;
41*132f818dSEnji Cooper
42*132f818dSEnji Cooper  --run)
43*132f818dSEnji Cooper    # Back-compat with the calling convention used by older automake.
44*132f818dSEnji Cooper    shift
45*132f818dSEnji Cooper    ;;
46*132f818dSEnji Cooper
47*132f818dSEnji Cooper  -h|--h|--he|--hel|--help)
48*132f818dSEnji Cooper    echo "\
49*132f818dSEnji Cooper$0 [OPTION]... PROGRAM [ARGUMENT]...
50*132f818dSEnji Cooper
51*132f818dSEnji CooperRun 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
52*132f818dSEnji Cooperto PROGRAM being missing or too old.
53*132f818dSEnji Cooper
54*132f818dSEnji CooperOptions:
55*132f818dSEnji Cooper  -h, --help      display this help and exit
56*132f818dSEnji Cooper  -v, --version   output version information and exit
57*132f818dSEnji Cooper
58*132f818dSEnji CooperSupported PROGRAM values:
59*132f818dSEnji Cooperaclocal autoconf autogen  autoheader autom4te automake autoreconf
60*132f818dSEnji Cooperbison   flex     help2man lex        makeinfo perl     yacc
61*132f818dSEnji Cooper
62*132f818dSEnji CooperVersion suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
63*132f818dSEnji Cooper'g' are ignored when checking the name.
64*132f818dSEnji Cooper
65*132f818dSEnji CooperReport bugs to <bug-automake@gnu.org>.
66*132f818dSEnji CooperGNU Automake home page: <https://www.gnu.org/software/automake/>.
67*132f818dSEnji CooperGeneral help using GNU software: <https://www.gnu.org/gethelp/>."
68*132f818dSEnji Cooper    exit $?
69*132f818dSEnji Cooper    ;;
70*132f818dSEnji Cooper
71*132f818dSEnji Cooper  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
72*132f818dSEnji Cooper    echo "missing (GNU Automake) $scriptversion"
73*132f818dSEnji Cooper    exit $?
74*132f818dSEnji Cooper    ;;
75*132f818dSEnji Cooper
76*132f818dSEnji Cooper  -*)
77*132f818dSEnji Cooper    echo 1>&2 "$0: unknown '$1' option"
78*132f818dSEnji Cooper    echo 1>&2 "Try '$0 --help' for more information"
79*132f818dSEnji Cooper    exit 1
80*132f818dSEnji Cooper    ;;
81*132f818dSEnji Cooper
82*132f818dSEnji Cooperesac
83*132f818dSEnji Cooper
84*132f818dSEnji Cooper# Run the given program, remember its exit status.
85*132f818dSEnji Cooper"$@"; st=$?
86*132f818dSEnji Cooper
87*132f818dSEnji Cooper# If it succeeded, we are done.
88*132f818dSEnji Coopertest $st -eq 0 && exit 0
89*132f818dSEnji Cooper
90*132f818dSEnji Cooper# Also exit now if we it failed (or wasn't found), and '--version' was
91*132f818dSEnji Cooper# passed; such an option is passed most likely to detect whether the
92*132f818dSEnji Cooper# program is present and works.
93*132f818dSEnji Coopercase $2 in --version|--help) exit $st;; esac
94*132f818dSEnji Cooper
95*132f818dSEnji Cooper# Exit code 63 means version mismatch.  This often happens when the user
96*132f818dSEnji Cooper# tries to use an ancient version of a tool on a file that requires a
97*132f818dSEnji Cooper# minimum version.
98*132f818dSEnji Cooperif test $st -eq 63; then
99*132f818dSEnji Cooper  msg="probably too old"
100*132f818dSEnji Cooperelif test $st -eq 127; then
101*132f818dSEnji Cooper  # Program was missing.
102*132f818dSEnji Cooper  msg="missing on your system"
103*132f818dSEnji Cooperelse
104*132f818dSEnji Cooper  # Program was found and executed, but failed.  Give up.
105*132f818dSEnji Cooper  exit $st
106*132f818dSEnji Cooperfi
107*132f818dSEnji Cooper
108*132f818dSEnji Cooperperl_URL=https://www.perl.org/
109*132f818dSEnji Cooperflex_URL=https://github.com/westes/flex
110*132f818dSEnji Coopergnu_software_URL=https://www.gnu.org/software
111*132f818dSEnji Cooper
112*132f818dSEnji Cooperprogram_details ()
113*132f818dSEnji Cooper{
114*132f818dSEnji Cooper  case $1 in
115*132f818dSEnji Cooper    aclocal|automake|autoreconf)
116*132f818dSEnji Cooper      echo "The '$1' program is part of the GNU Automake package:"
117*132f818dSEnji Cooper      echo "<$gnu_software_URL/automake>"
118*132f818dSEnji Cooper      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
119*132f818dSEnji Cooper      echo "<$gnu_software_URL/autoconf>"
120*132f818dSEnji Cooper      echo "<$gnu_software_URL/m4/>"
121*132f818dSEnji Cooper      echo "<$perl_URL>"
122*132f818dSEnji Cooper      ;;
123*132f818dSEnji Cooper    autoconf|autom4te|autoheader)
124*132f818dSEnji Cooper      echo "The '$1' program is part of the GNU Autoconf package:"
125*132f818dSEnji Cooper      echo "<$gnu_software_URL/autoconf/>"
126*132f818dSEnji Cooper      echo "It also requires GNU m4 and Perl in order to run:"
127*132f818dSEnji Cooper      echo "<$gnu_software_URL/m4/>"
128*132f818dSEnji Cooper      echo "<$perl_URL>"
129*132f818dSEnji Cooper      ;;
130*132f818dSEnji Cooper    *)
131*132f818dSEnji Cooper      :
132*132f818dSEnji Cooper      ;;
133*132f818dSEnji Cooper  esac
134*132f818dSEnji Cooper}
135*132f818dSEnji Cooper
136*132f818dSEnji Coopergive_advice ()
137*132f818dSEnji Cooper{
138*132f818dSEnji Cooper  # Normalize program name to check for.
139*132f818dSEnji Cooper  normalized_program=`echo "$1" | sed '
140*132f818dSEnji Cooper    s/^gnu-//; t
141*132f818dSEnji Cooper    s/^gnu//; t
142*132f818dSEnji Cooper    s/^g//; t'`
143*132f818dSEnji Cooper
144*132f818dSEnji Cooper  printf '%s\n' "'$1' is $msg."
145*132f818dSEnji Cooper
146*132f818dSEnji Cooper  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
147*132f818dSEnji Cooper  autoheader_deps="'acconfig.h'"
148*132f818dSEnji Cooper  automake_deps="'Makefile.am'"
149*132f818dSEnji Cooper  aclocal_deps="'acinclude.m4'"
150*132f818dSEnji Cooper  case $normalized_program in
151*132f818dSEnji Cooper    aclocal*)
152*132f818dSEnji Cooper      echo "You should only need it if you modified $aclocal_deps or"
153*132f818dSEnji Cooper      echo "$configure_deps."
154*132f818dSEnji Cooper      ;;
155*132f818dSEnji Cooper    autoconf*)
156*132f818dSEnji Cooper      echo "You should only need it if you modified $configure_deps."
157*132f818dSEnji Cooper      ;;
158*132f818dSEnji Cooper    autogen*)
159*132f818dSEnji Cooper      echo "You should only need it if you modified a '.def' or '.tpl' file."
160*132f818dSEnji Cooper      echo "You may want to install the GNU AutoGen package:"
161*132f818dSEnji Cooper      echo "<$gnu_software_URL/autogen/>"
162*132f818dSEnji Cooper      ;;
163*132f818dSEnji Cooper    autoheader*)
164*132f818dSEnji Cooper      echo "You should only need it if you modified $autoheader_deps or"
165*132f818dSEnji Cooper      echo "$configure_deps."
166*132f818dSEnji Cooper      ;;
167*132f818dSEnji Cooper    automake*)
168*132f818dSEnji Cooper      echo "You should only need it if you modified $automake_deps or"
169*132f818dSEnji Cooper      echo "$configure_deps."
170*132f818dSEnji Cooper      ;;
171*132f818dSEnji Cooper    autom4te*)
172*132f818dSEnji Cooper      echo "You might have modified some maintainer files that require"
173*132f818dSEnji Cooper      echo "the 'autom4te' program to be rebuilt."
174*132f818dSEnji Cooper      ;;
175*132f818dSEnji Cooper    autoreconf*)
176*132f818dSEnji Cooper      echo "You should only need it if you modified $aclocal_deps or"
177*132f818dSEnji Cooper      echo "$automake_deps or $autoheader_deps or $automake_deps or"
178*132f818dSEnji Cooper      echo "$configure_deps."
179*132f818dSEnji Cooper      ;;
180*132f818dSEnji Cooper    bison*|yacc*)
181*132f818dSEnji Cooper      echo "You should only need it if you modified a '.y' file."
182*132f818dSEnji Cooper      echo "You may want to install the GNU Bison package:"
183*132f818dSEnji Cooper      echo "<$gnu_software_URL/bison/>"
184*132f818dSEnji Cooper      ;;
185*132f818dSEnji Cooper    help2man*)
186*132f818dSEnji Cooper      echo "You should only need it if you modified a dependency" \
187*132f818dSEnji Cooper           "of a man page."
188*132f818dSEnji Cooper      echo "You may want to install the GNU Help2man package:"
189*132f818dSEnji Cooper      echo "<$gnu_software_URL/help2man/>"
190*132f818dSEnji Cooper    ;;
191*132f818dSEnji Cooper    lex*|flex*)
192*132f818dSEnji Cooper      echo "You should only need it if you modified a '.l' file."
193*132f818dSEnji Cooper      echo "You may want to install the Fast Lexical Analyzer package:"
194*132f818dSEnji Cooper      echo "<$flex_URL>"
195*132f818dSEnji Cooper      ;;
196*132f818dSEnji Cooper    makeinfo*)
197*132f818dSEnji Cooper      echo "You should only need it if you modified a '.texi' file, or"
198*132f818dSEnji Cooper      echo "any other file indirectly affecting the aspect of the manual."
199*132f818dSEnji Cooper      echo "You might want to install the Texinfo package:"
200*132f818dSEnji Cooper      echo "<$gnu_software_URL/texinfo/>"
201*132f818dSEnji Cooper      echo "The spurious makeinfo call might also be the consequence of"
202*132f818dSEnji Cooper      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
203*132f818dSEnji Cooper      echo "want to install GNU make:"
204*132f818dSEnji Cooper      echo "<$gnu_software_URL/make/>"
205*132f818dSEnji Cooper      ;;
206*132f818dSEnji Cooper    perl*)
207*132f818dSEnji Cooper      echo "You should only need it to run GNU Autoconf, GNU Automake, "
208*132f818dSEnji Cooper      echo "  assorted other tools, or if you modified a Perl source file."
209*132f818dSEnji Cooper      echo "You may want to install the Perl 5 language interpreter:"
210*132f818dSEnji Cooper      echo "<$perl_URL>"
211*132f818dSEnji Cooper      ;;
212*132f818dSEnji Cooper    *)
213*132f818dSEnji Cooper      echo "You might have modified some files without having the proper"
214*132f818dSEnji Cooper      echo "tools for further handling them.  Check the 'README' file, it"
215*132f818dSEnji Cooper      echo "often tells you about the needed prerequisites for installing"
216*132f818dSEnji Cooper      echo "this package.  You may also peek at any GNU archive site, in"
217*132f818dSEnji Cooper      echo "case some other package contains this missing '$1' program."
218*132f818dSEnji Cooper      ;;
219*132f818dSEnji Cooper  esac
220*132f818dSEnji Cooper  program_details "$normalized_program"
221*132f818dSEnji Cooper}
222*132f818dSEnji Cooper
223*132f818dSEnji Coopergive_advice "$1" | sed -e '1s/^/WARNING: /' \
224*132f818dSEnji Cooper                       -e '2,$s/^/         /' >&2
225*132f818dSEnji Cooper
226*132f818dSEnji Cooper# Propagate the correct exit status (expected to be 127 for a program
227*132f818dSEnji Cooper# not found, 63 for a program that failed due to version mismatch).
228*132f818dSEnji Cooperexit $st
229*132f818dSEnji Cooper
230*132f818dSEnji Cooper# Local variables:
231*132f818dSEnji Cooper# eval: (add-hook 'before-save-hook 'time-stamp)
232*132f818dSEnji Cooper# time-stamp-start: "scriptversion="
233*132f818dSEnji Cooper# time-stamp-format: "%:y-%02m-%02d.%02H"
234*132f818dSEnji Cooper# time-stamp-time-zone: "UTC0"
235*132f818dSEnji Cooper# time-stamp-end: "; # UTC"
236*132f818dSEnji Cooper# End:
237