clean up gl/modules/selinux-at
[coreutils/bo.git] / bootstrap
blob0895eb73081a7c6944b5cc29e5c9ebee878bede2
1 #! /bin/sh
3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003-2008 Free Software Foundation, Inc.
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 # Written by Paul Eggert.
22 nl='
25 # Ensure file names are sorted consistently across platforms.
26 LC_ALL=C
27 export LC_ALL
29 local_gl_dir=gl
31 # Temporary directory names.
32 bt='._bootmp'
33 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
34 bt2=${bt}2
36 usage() {
37 echo >&2 "\
38 Usage: $0 [OPTION]...
39 Bootstrap this package from the checked-out sources.
41 Options:
42 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
43 sources reside. Use this if you already
44 have gnulib sources on your machine, and
45 do not want to waste your bandwidth downloading
46 them again.
47 --copy Copy files instead of creating symbolic links.
48 --force Attempt to bootstrap even if the sources seem
49 not to have been checked out.
50 --skip-po Do not download po files.
52 If the file $0.conf exists in the same directory as this script, its
53 contents are read as shell variables to configure the bootstrap.
55 Running without arguments will suffice in most cases.
59 # Configuration.
61 # Name of the Makefile.am
62 gnulib_mk=gnulib.mk
64 # List of gnulib modules needed.
65 gnulib_modules=
67 # Any gnulib files needed that are not in modules.
68 gnulib_files=
70 # The command to download all .po files for a specified domain into
71 # a specified directory. Fill in the first %s is the domain name, and
72 # the second with the destination directory. Use rsync's -L and -r
73 # options because the latest/%s directory and the .po files within are
74 # all symlinks.
75 po_download_command_format=\
76 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
78 extract_package_name='
79 /^AC_INIT(/{
80 /.*,.*,.*, */{
81 s///
82 s/[][]//g
83 s/)$//
87 s/AC_INIT(\[*//
88 s/]*,.*//
89 s/^GNU //
90 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
91 s/[^A-Za-z0-9_]/-/g
95 package=`sed -n "$extract_package_name" configure.ac` || exit
96 gnulib_name=lib$package
98 build_aux=build-aux
99 source_base=lib
100 m4_base=m4
101 doc_base=doc
102 tests_base=tests
104 # Extra files from gnulib, which override files from other sources.
105 gnulib_extra_files="
106 $build_aux/install-sh
107 $build_aux/missing
108 $build_aux/mdate-sh
109 $build_aux/texinfo.tex
110 $build_aux/depcomp
111 $build_aux/config.guess
112 $build_aux/config.sub
113 doc/INSTALL
116 # Additional gnulib-tool options to use. Use "\newline" to break lines.
117 gnulib_tool_option_extras=
119 # Other locale categories that need message catalogs.
120 EXTRA_LOCALE_CATEGORIES=
122 # Additional xgettext options to use. Use "\\\newline" to break lines.
123 XGETTEXT_OPTIONS='\\\
124 --flag=_:1:pass-c-format\\\
125 --flag=N_:1:pass-c-format\\\
126 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
129 # Package bug report address for gettext files
130 MSGID_BUGS_ADDRESS=bug-$package@gnu.org
132 # Files we don't want to import.
133 excluded_files=
135 # File that should exist in the top directory of a checked out hierarchy,
136 # but not in a distribution tarball.
137 checkout_only_file=README-hacking
139 # Whether to use copies instead of symlinks.
140 copy=false
142 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
143 # those files to be generated in directories like lib/, m4/, and po/.
144 # Or set it to 'auto' to make this script select which to use based
145 # on which version control system (if any) is used in the source directory.
146 vc_ignore=auto
148 # Override the default configuration, if necessary.
149 # Make sure that bootstrap.conf is sourced from the current directory
150 # if we were invoked as "sh bootstrap".
151 case "$0" in
152 */*) test -r "$0.conf" && . "$0.conf" ;;
153 *) test -r "$0.conf" && . ./"$0.conf" ;;
154 esac
157 if test "$vc_ignore" = auto; then
158 vc_ignore=
159 test -d .git && vc_ignore=.gitignore
160 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
163 # Translate configuration into internal form.
165 # Parse options.
167 for option
169 case $option in
170 --help)
171 usage
172 exit;;
173 --gnulib-srcdir=*)
174 GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
175 --skip-po)
176 SKIP_PO=t;;
177 --force)
178 checkout_only_file=;;
179 --copy)
180 copy=true;;
182 echo >&2 "$0: $option: unknown option"
183 exit 1;;
184 esac
185 done
187 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
188 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
189 exit 1
192 # If $STR is not already on a line by itself in $FILE, insert it,
193 # sorting the new contents of the file and replacing $FILE with the result.
194 insert_sorted_if_absent() {
195 file=$1
196 str=$2
197 test -f $file || touch $file
198 echo "$str" | sort -u - $file | cmp -s - $file \
199 || echo "$str" | sort -u - $file -o $file \
200 || exit 1
203 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
204 found_aux_dir=no
205 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
206 >/dev/null && found_aux_dir=yes
207 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
208 >/dev/null && found_aux_dir=yes
209 if test $found_aux_dir = no; then
210 echo "$0: expected line not found in configure.ac. Add the following:" >&2
211 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
212 exit 1
215 # If $build_aux doesn't exist, create it now, otherwise some bits
216 # below will malfunction. If creating it, also mark it as ignored.
217 if test ! -d $build_aux; then
218 mkdir $build_aux
219 for dot_ig in x $vc_ignore; do
220 test $dot_ig = x && continue
221 insert_sorted_if_absent $dot_ig $build_aux
222 done
225 echo "$0: Bootstrapping from checked-out $package sources..."
227 # See if we can use gnulib's git-merge-changelog merge driver.
228 if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
229 if git config merge.merge-changelog.driver >/dev/null ; then
231 elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
232 echo "initializing git-merge-changelog driver"
233 git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
234 git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
235 else
236 echo "consider installing git-merge-changelog from gnulib"
241 cleanup_gnulib() {
242 status=$?
243 rm -fr gnulib
244 exit $status
247 git_modules_config () {
248 GIT_CONFIG_LOCAL=.gitmodules git config "$@"
251 # Get gnulib files.
253 case ${GNULIB_SRCDIR--} in
255 if git_modules_config submodule.gnulib.url >/dev/null; then
256 echo "$0: getting gnulib files..."
257 git submodule init || exit $?
258 git submodule update || exit $?
260 elif [ ! -d gnulib ]; then
261 echo "$0: getting gnulib files..."
263 trap cleanup_gnulib 1 2 13 15
265 git clone --help|grep depth > /dev/null && depth='--depth 2' || depth=
266 git clone $depth git://git.sv.gnu.org/gnulib ||
267 cleanup_gnulib
269 trap - 1 2 13 15
271 GNULIB_SRCDIR=gnulib
274 # Redirect the gnulib submodule to the directory on the command line
275 # if possible.
276 if test -d "$GNULIB_SRCDIR"/.git && \
277 git_modules_config submodule.gnulib.url >/dev/null; then
278 git submodule init
279 GNULIB_SRCDIR=`cd $GNULIB_SRCDIR && pwd`
280 git config --replace-all submodule.gnulib.url $GNULIB_SRCDIR
281 echo "$0: getting gnulib files..."
282 git submodule update || exit $?
283 GNULIB_SRCDIR=gnulib
286 esac
288 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
289 <$gnulib_tool || exit
291 # Get translations.
293 download_po_files() {
294 subdir=$1
295 domain=$2
296 echo "$0: getting translations into $subdir for $domain..."
297 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
298 eval "$cmd"
301 # Download .po files to $po_dir/.reference and copy only the new
302 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
303 update_po_files() {
304 # Directory containing primary .po files.
305 # Overwrite them only when we're sure a .po file is new.
306 po_dir=$1
307 domain=$2
309 # Download *.po files into this dir.
310 # Usually contains *.s1 checksum files.
311 ref_po_dir="$po_dir/.reference"
313 test -d $ref_po_dir || mkdir $ref_po_dir || return
314 download_po_files $ref_po_dir $domain \
315 && ls "$ref_po_dir"/*.po 2>/dev/null |
316 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
318 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
319 test "$langs" = '*' && langs=x
320 for po in $langs; do
321 case $po in x) continue;; esac
322 new_po="$ref_po_dir/$po.po"
323 cksum_file="$ref_po_dir/$po.s1"
324 if ! test -f "$cksum_file" ||
325 ! test -f "$po_dir/$po.po" ||
326 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
327 echo "updated $po_dir/$po.po..."
328 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
330 done
333 case $SKIP_PO in
335 if test -d po; then
336 update_po_files po $package || exit
339 if test -d runtime-po; then
340 update_po_files runtime-po $package-runtime || exit
341 fi;;
342 esac
344 symlink_to_dir()
346 src=$1/$2
347 dst=${3-$2}
349 test -f "$src" && {
351 # If the destination directory doesn't exist, create it.
352 # This is required at least for "lib/uniwidth/cjk.h".
353 dst_dir=`dirname "$dst"`
354 if ! test -d "$dst_dir"; then
355 mkdir -p "$dst_dir"
357 # If we've just created a directory like lib/uniwidth,
358 # tell version control system(s) it's ignorable.
359 # FIXME: for now, this does only one level
360 parent=`dirname "$dst_dir"`
361 for dot_ig in x $vc_ignore; do
362 test $dot_ig = x && continue
363 ig=$parent/$dot_ig
364 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
365 done
368 if $copy; then
370 test ! -h "$dst" || {
371 echo "$0: rm -f $dst" &&
372 rm -f "$dst"
374 } &&
375 test -f "$dst" &&
376 cmp -s "$src" "$dst" || {
377 echo "$0: cp -fp $src $dst" &&
378 cp -fp "$src" "$dst"
380 else
381 test -h "$dst" &&
382 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
383 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
384 test "$src_i" = "$dst_i" || {
385 dot_dots=
386 case $src in
387 /*) ;;
389 case /$dst/ in
390 *//* | */../* | */./* | /*/*/*/*/*/)
391 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
392 exit 1;;
393 /*/*/*/*/) dot_dots=../../../;;
394 /*/*/*/) dot_dots=../../;;
395 /*/*/) dot_dots=../;;
396 esac;;
397 esac
399 echo "$0: ln -fs $dot_dots$src $dst" &&
400 ln -fs "$dot_dots$src" "$dst"
406 cp_mark_as_generated()
408 cp_src=$1
409 cp_dst=$2
411 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
412 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
413 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
414 symlink_to_dir $local_gl_dir "$cp_dst"
415 else
416 case $cp_dst in
417 *.[ch]) c1='/* '; c2=' */';;
418 *.texi) c1='@c '; c2= ;;
419 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
420 *) c1= ; c2= ;;
421 esac
423 # If the destination directory doesn't exist, create it.
424 # This is required at least for "lib/uniwidth/cjk.h".
425 dst_dir=`dirname "$cp_dst"`
426 test -d "$dst_dir" || mkdir -p "$dst_dir"
428 if test -z "$c1"; then
429 cmp -s "$cp_src" "$cp_dst" || {
430 # Copy the file first to get proper permissions if it
431 # doesn't already exist. Then overwrite the copy.
432 echo "$0: cp -f $cp_src $cp_dst" &&
433 rm -f "$cp_dst" &&
434 cp "$cp_src" "$cp_dst-t" &&
435 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
436 mv -f "$cp_dst-t" "$cp_dst"
438 else
439 # Copy the file first to get proper permissions if it
440 # doesn't already exist. Then overwrite the copy.
441 cp "$cp_src" "$cp_dst-t" &&
443 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
444 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
445 echo '#line 1' &&
446 sed "s!$bt_regex/!!g" "$cp_src"
447 ) > $cp_dst-t &&
448 if cmp -s "$cp_dst-t" "$cp_dst"; then
449 rm -f "$cp_dst-t"
450 else
451 echo "$0: cp $cp_src $cp_dst # with edits" &&
452 mv -f "$cp_dst-t" "$cp_dst"
458 version_controlled_file() {
459 dir=$1
460 file=$2
461 found=no
462 if test -d CVS; then
463 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
464 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
465 elif test -d .git; then
466 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
467 elif test -d .svn; then
468 svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
469 else
470 echo "$0: no version control for $dir/$file?" >&2
472 test $found = yes
475 slurp() {
476 for dir in . `(cd $1 && find * -type d -print)`; do
477 copied=
478 sep=
479 for file in `ls -a $1/$dir`; do
480 case $file in
481 .|..) continue;;
482 .*) continue;; # FIXME: should all file names starting with "." be ignored?
483 esac
484 test -d $1/$dir/$file && continue
485 for excluded_file in $excluded_files; do
486 test "$dir/$file" = "$excluded_file" && continue 2
487 done
488 if test $file = Makefile.am; then
489 copied=$copied${sep}$gnulib_mk; sep=$nl
490 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
491 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
492 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
493 rm -f $dir/$gnulib_mk &&
494 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
496 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
497 version_controlled_file $dir $file; then
498 echo "$0: $dir/$file overrides $1/$dir/$file"
499 else
500 copied=$copied$sep$file; sep=$nl
501 if test $file = gettext.m4; then
502 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
503 rm -f $dir/$file
504 sed '
505 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
506 AC_DEFUN([AM_INTL_SUBDIR], [
507 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
508 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
510 AC_DEFUN([gl_LOCK_EARLY], [])
511 ' $1/$dir/$file >$dir/$file
512 else
513 cp_mark_as_generated $1/$dir/$file $dir/$file
515 fi || exit
516 done
518 for dot_ig in x $vc_ignore; do
519 test $dot_ig = x && continue
520 ig=$dir/$dot_ig
521 if test -n "$copied"; then
522 insert_sorted_if_absent $ig "$copied"
523 # If an ignored file name ends with .in.h, then also add
524 # the name with just ".h". Many gnulib headers are generated,
525 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
526 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
527 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
528 insert_sorted_if_absent $ig "$f"
530 # For files like sys_stat.in.h and sys_time.in.h, record as
531 # ignorable the directory we might eventually create: sys/.
532 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
533 insert_sorted_if_absent $ig "$f"
535 done
536 done
540 # Create boot temporary directories to import from gnulib and gettext.
541 rm -fr $bt $bt2 &&
542 mkdir $bt $bt2 || exit
544 # Import from gnulib.
546 gnulib_tool_options="\
547 --import\
548 --no-changelog\
549 --aux-dir $bt/$build_aux\
550 --doc-base $bt/$doc_base\
551 --lib $gnulib_name\
552 --m4-base $bt/$m4_base/\
553 --source-base $bt/$source_base/\
554 --tests-base $bt/$tests_base\
555 --local-dir $local_gl_dir\
556 $gnulib_tool_option_extras\
558 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
559 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
560 slurp $bt || exit
562 for file in $gnulib_files; do
563 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
564 done
567 # Import from gettext.
568 with_gettext=yes
569 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
570 with_gettext=no
572 if test $with_gettext = yes; then
573 echo "$0: (cd $bt2; autopoint) ..."
574 cp configure.ac $bt2 &&
575 (cd $bt2 && autopoint && rm configure.ac) &&
576 slurp $bt2 $bt || exit
578 rm -fr $bt $bt2 || exit
580 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
581 # gnulib-populated directories. Such .m4 files would cause aclocal to fail.
582 # The following requires GNU find 4.2.3 or newer. Considering the usual
583 # portability constraints of this script, that may seem a very demanding
584 # requirement, but it should be ok. Ignore any failure, which is fine,
585 # since this is only a convenience to help developers avoid the relatively
586 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
587 # between successive runs of this script.
588 find "$m4_base" "$source_base" \
589 -depth \( -name '*.m4' -o -name '*.[ch]' \) \
590 -type l -xtype l -delete > /dev/null 2>&1
592 # Reconfigure, getting other files.
594 for command in \
595 libtool \
596 'aclocal --force -I m4' \
597 'autoconf --force' \
598 'autoheader --force' \
599 'automake --add-missing --copy --force-missing';
601 if test "$command" = libtool; then
602 use_libtool=0
603 # We'd like to use grep -E, to see if any of LT_INIT,
604 # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
605 # but that's not portable enough (e.g., for Solaris).
606 grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
607 && use_libtool=1
608 grep '^[ ]*LT_INIT' configure.ac >/dev/null \
609 && use_libtool=1
610 test $use_libtool = 0 \
611 && continue
612 command='libtoolize -c -f'
614 echo "$0: $command ..."
615 $command || exit
616 done
619 # Get some extra files from gnulib, overriding existing files.
620 for file in $gnulib_extra_files; do
621 case $file in
622 */INSTALL) dst=INSTALL;;
623 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
624 *) dst=$file;;
625 esac
626 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
627 done
629 if test $with_gettext = yes; then
630 # Create gettext configuration.
631 echo "$0: Creating po/Makevars from po/Makevars.template ..."
632 rm -f po/Makevars
633 sed '
634 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
635 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
636 /^XGETTEXT_OPTIONS *=/{
637 s/$/ \\/
639 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
641 ' po/Makevars.template >po/Makevars
643 if test -d runtime-po; then
644 # Similarly for runtime-po/Makevars, but not quite the same.
645 rm -f runtime-po/Makevars
646 sed '
647 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
648 /^subdir *=.*/s/=.*/= runtime-po/
649 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
650 /^XGETTEXT_OPTIONS *=/{
651 s/$/ \\/
653 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
655 ' <po/Makevars.template >runtime-po/Makevars
657 # Copy identical files from po to runtime-po.
658 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
662 # Horrible, coreutils-specific kludges.
663 # Change paths in gnulib-tests/gnulib.mk from "../.." to "..".
664 m=gnulib-tests/gnulib.mk
665 sed 's,\.\./\.\.,..,g' $m > $m-t
666 mv -f $m-t $m
668 echo "$0: done. Now you can run './configure'."