1#! /bin/sh
2
3# Output the contents of a shell script with sourced files inlined.
4# Written by Gary V. Vaughan, 2012
5
6# This is free software.  There is NO warranty; not even for
7# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8#
9# Copyright (C) 2012-2019 Bootstrap Authors
10#
11# This file is dual licensed under the terms of the MIT license
12# <https://opensource.org/license/MIT>, and GPL version 3 or later
13# <http://www.gnu.org/licenses/gpl-2.0.html>.  You must apply one of
14# these licenses when using or redistributing this software or any of
15# the files within it.  See the URLs above, or the file `LICENSE`
16# included in the Bootstrap distribution for the full license texts.
17
18# Please report bugs or propose patches to:
19# <https://github.com/gnulib-modules/bootstrap/issues>
20
21# Source required external libraries:
22. `echo "$0" |${SED-sed} 's|[^/]*$||'`"funclib.sh"
23. `echo "$0" |${SED-sed} 's|[^/]*$||'`"options-parser"
24
25# Set a version string for *this* script.
26scriptversion=2019-02-19.15; # UTC
27
28
29## ------ ##
30## Usage. ##
31## ------ ##
32
33# Run 'build-aux/inline-source --help' for help with using this script
34# from the command line.
35
36# Recursively scan through a FILE passed on the command line, replacing
37# either of the following:
38#   . "relative/file"
39#   . `echo "$0" |edit`"relative/file"
40# with the contents of the referenced files.
41
42
43## ---------------- ##
44## Options parsing. ##
45## ---------------- ##
46
47usage='$progpath [OPTION]... FILE'
48
49# Short help message in response to '-h'.
50usage_message='Options:
51       --debug        enable verbose shell tracing
52       --version      print version information and exit
53   -h, --help         print help message and exit
54'
55
56long_help_message="\
57Report bugs to <bug-libtool@gnu.org>
58General help using GNU software: <http://www.gnu.org/gethelp/>."
59
60func_options ${1+"$@"}
61eval set dummy "$func_options_result"; shift
62
63
64## -------------------- ##
65## Resource management. ##
66## -------------------- ##
67
68# require_AWK
69# -----------
70# Search for a "not hopeless" awk.
71require_AWK=func_require_AWK
72func_require_AWK ()
73{
74    $debug_cmd
75
76    test -n "$AWK" || {
77      # Find the first executable in the list.
78      for _G_prog in gawk mawk nawk awk
79      do
80        require_AWK_IFS=$IFS
81	IFS=${PATH_SEPARATOR-:}
82	for _G_dir in $PATH
83        do
84	  IFS=$require_AWK_IFS
85          if test -f "$_G_dir/$_G_prog" && test -x "$_G_dir/$_G_prog"
86	  then
87	    AWK=$_G_dir/$_G_prog
88            break 2
89          fi
90        done
91	IFS=$require_AWK_IFS
92      done
93    }
94
95    test -n "$AWK" || func_fatal_error "\
96Please install GNU Awk, or 'export AWK=/path/to/gnu/awk'."
97
98    func_verbose "found '$AWK'."
99
100    require_AWK=:
101}
102
103
104## --------------- ##
105## Core functions. ##
106## --------------- ##
107
108# func_include LINE
109# -----------------
110# Output the contents of file included by LINE.
111func_include ()
112{
113    $require_AWK
114
115    test -f "$1" \
116        || func_fatal_error "file '$1' not found"
117
118    _G_scriptdir=`echo "$1" |$SED 's|[^/]*$||'`
119    test -n "$_G_scriptdir" || _G_scriptdir="./"
120
121    $AWK '
122        BEGIN { magic = '${_RECURSE_MAGIC-0}'; }
123
124        /^#!/ && magic == 0 {
125            print $0;
126            print "## DO NOT EDIT - This file generated from '$1'";
127            print "##               by '$progname' v'$scriptversion'";
128            magic++;
129            next;
130        }
131
132        /^\. ['\''"].*['\''"]$/ {
133            file = substr ($2, 2, length ($2) -2);
134	    system (sprintf ("env _RECURSE_MAGIC=%d '$progpath' %s", magic, file));
135            next;
136        }
137
138        /^\. `echo [^`]*`['\''"][^'\''"]*['\''"]$/ {
139            tail = substr ($0, match ($0, /`['\''"]/));
140	    file = substr (tail, 3, length (tail) -3);
141	    system (sprintf ("env _RECURSE_MAGIC=%d '$progpath' '"$_G_scriptdir"'%s", magic, file));
142            next;
143        }
144
145        { print; }
146    ' < "$1"
147}
148
149func_include "$1"
150
151exit 0
152
153# Local variables:
154# mode: shell-script
155# sh-indentation: 2
156# eval: (add-hook 'before-save-hook 'time-stamp)
157# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC"
158# time-stamp-time-zone: "UTC"
159# End:
160