Migrated from GPL version 2 to GPL version 3
[findutils.git] / import-gnulib.sh
blob3d640596b4e2e782856ff07c8d9f88b7c0b919f3
1 #! /bin/sh
3 # import-gnulib.sh -- imports a copy of gnulib into findutils
4 # Copyright (C) 2003,2004,2005,2006,2007 Free Software Foundation, Inc.
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 ##########################################################################
21 # This script is intended to populate the "gnulib" directory
22 # with a subset of the gnulib code, as provided by "gnulib-tool".
24 # To use it, just run this script with the top-level sourec directory
25 # as your working directory.
27 # If CDPATH is set, it will sometimes print the name of the directory
28 # to which you have moved. Unsetting CDPATH prevents this, as does
29 # prefixing it with ".".
30 unset CDPATH
32 ## Defaults
33 # cvsdir=/doesnotexist
34 configfile="./import-gnulib.config"
35 need_checkout=yes
38 # Remember arguments for comments we inject into output files
39 original_cmd_line_args="$@"
41 usage() {
42 cat >&2 <<EOF
43 usage: $0 [-d gnulib-directory]
45 The default behaviour is to check out the Gnulib code via anonymous
46 CVS (or update it if there is a version already checked out). The
47 checkout or update is performed to the gnulib version indicated in
48 the configuration file $configfile.
50 If you wish to work with a different version of gnulib, use the -d option
51 to specify the directory containing the gnulib code.
52 EOF
56 do_checkout () {
57 local cvsdir="$1"
58 echo checking out gnulib from CVS in $cvsdir
60 if [ -z "$gnulib_version" ] ; then
61 echo "Error: There should be a gnulib_version setting in $configfile, but there is not." >&2
62 exit 1
66 if ! [ -d "$cvsdir" ] ; then
67 if mkdir "$cvsdir" ; then
68 echo "Created $cvsdir"
69 else
70 echo "Failed to create $cvsdir" >&2
71 exit 1
75 # Decide if gnulib_version is probably a date or probably a tag.
76 if date -d yesterday >/dev/null ; then
77 # It looks like GNU date is available
78 if date -d "$gnulib_version" >/dev/null ; then
79 # Looks like a date.
80 cvs_sticky_option="-D"
81 else
82 echo "Warning: assuming $gnulib_version is a CVS tag rather than a date" >&2
83 cvs_sticky_option="-r"
85 else
86 # GNU date unavailable, assume the version is a date
87 cvs_sticky_option="-D"
93 # Change directory unconditionally (rater than using checkout
94 # -d) so that cvs does not pick up defaults from ./CVS. Those
95 # defaults refer to our own CVS repository for our code, not
96 # to gnulib.
97 cd $cvsdir
98 if test -d gnulib/CVS ; then
99 cd gnulib
100 cmd=update
101 root="" # use previous
102 else
103 root="-d :pserver:anonymous@cvs.sv.gnu.org:/sources/gnulib"
104 cmd=checkout
105 args=gnulib
107 set -x
108 cvs -q -z3 $root $cmd $cvs_sticky_option "$gnulib_version" $args
109 set +x
113 run_gnulib_tool() {
114 local tool="$1"
115 if test -f "$tool"
116 then
117 true
118 else
119 echo "$tool does not exist, did you specify the right directory?" >&2
120 exit 1
123 if test -x "$tool"
124 then
125 true
126 else
127 echo "$tool is not executable" >&2
128 exit 1
132 if [ -d gnulib ]
133 then
134 echo "Warning: directory gnulib already exists." >&2
135 else
136 mkdir gnulib
139 set -x
140 if "$tool" --import --symlink --with-tests --dir=. --lib=libgnulib --source-base=gnulib/lib --m4-base=gnulib/m4 --gpl3 $modules
141 then
142 set +x
143 else
144 set +x
145 echo "$tool failed, exiting." >&2
146 exit 1
149 # gnulib-tool does not remove broken symlinks leftover from previous runs;
150 # this assumes GNU find, but should be a safe no-op if it is not
151 find -L gnulib -lname '*' -delete 2>/dev/null || :
154 rehack() {
155 echo "Updating the license of $1"
156 # Use cp to get the permissions right first
157 cp -fp "$1" "$1".new
158 sed -e \
159 's/Free Software Foundation\([;,]\) either version [2]/Free Software Foundation\1 either version 3/' < "$1" > "$1".new
160 if cmp "$1" "$1".new >/dev/null
161 then
162 rm -f "$1".new
163 else
164 rm -f "$1" && mv "$1".new "$1"
170 copyhack() {
171 src="$1"
172 dst="$2"
173 shift 2
174 if test -d "$dst"
175 then
176 dst="$dst"/"$(basename $src)"
178 cp -fp "$src" "$dst" && rehack "$dst"
183 update_licenses() {
184 for f in $gpl3_update_files
186 rehack "$f" || exit
187 done
192 hack_gnulib_tool_output() {
193 local gnulibdir="${1}"
194 for file in $extra_files; do
195 case $file in
196 */mdate-sh | */texinfo.tex) dest=doc;;
197 *) dest=build-aux;;
198 esac
199 copyhack "${gnulibdir}"/"$file" "$dest" || exit
200 done
205 cat > gnulib/Makefile.am <<EOF
206 # Copyright (C) 2004 Free Software Foundation, Inc.
208 # This file is free software, distributed under the terms of the GNU
209 # General Public License. As a special exception to the GNU General
210 # Public License, this file may be distributed as part of a program
211 # that contains a configuration script generated by Automake, under
212 # the same distribution terms as the rest of that program.
214 # This file was generated by $0 $original_cmd_line_args.
216 SUBDIRS = lib
221 refresh_output_files() {
222 aclocal -I m4 -I gnulib/m4 &&
223 autoheader &&
224 autoconf &&
225 automake --add-missing --copy
229 update_version_file() {
230 local ver
231 outfile="lib/gnulib-version.c"
232 if [ -z "$gnulib_version" ] ; then
233 ver="unknown (locally modified code; no version number available)"
234 else
235 ver="$gnulib_version"
239 cat > "${outfile}".new <<EOF
240 /* This file is automatically generated by $0 and simply records which version of gnulib we used. */
241 const char * const gnulib_version = "$ver";
243 if test -f "$outfile" ; then
244 if diff "${outfile}".new "${outfile}" > /dev/null ; then
245 rm "${outfile}".new
246 return 0
249 mv "${outfile}".new "${outfile}"
253 main() {
254 ## Option parsing
255 local gnulibdir=/doesnotexist
256 while getopts "d:a" opt
258 case "$opt" in
259 d) gnulibdir="$OPTARG" ; need_checkout=no ;;
260 a) refresh_output_files && update_licenses ; exit $? ;;
261 **) usage; exit 1;;
262 esac
263 done
265 # We need the config file to tell us which modules
266 # to use, even if we don't want to know the CVS version.
267 . $configfile || exit 1
269 ## If -d was not given, do CVS checkout/update
270 if [ $need_checkout = yes ] ; then
271 do_checkout gnulib-cvs
272 gnulibdir=gnulib-cvs/gnulib
273 else
274 echo "Warning: using gnulib code which already exists in $gnulibdir" >&2
277 ## Invoke gnulib-tool to import the code.
278 local tool="${gnulibdir}"/gnulib-tool
280 if run_gnulib_tool "${tool}" &&
281 hack_gnulib_tool_output "${gnulibdir}" &&
282 refresh_output_files &&
283 update_licenses &&
284 update_version_file ; then
285 echo Done.
286 else
287 echo FAILED >&2
288 exit 1
292 main "$@"