X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/6d8e724de2f64116a2d2684fe2f84e4d02b5809b..4654b0c0a8a355e7a8fcdf51b1a5eb6c485126f1:/bootstrap diff --git a/bootstrap b/bootstrap index 295e92a3..f92d1ccd 100755 --- a/bootstrap +++ b/bootstrap @@ -2,7 +2,8 @@ # Bootstrap this package from checked-out sources. -# Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 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 @@ -41,16 +42,16 @@ Bootstrap this package from the checked-out sources. Options: --gnulib-srcdir=DIRNAME Specify the local directory where gnulib - sources reside. Use this if you already - have gnulib sources on your machine, and - do not want to waste your bandwidth downloading - them again. + sources reside. Use this if you already + have gnulib sources on your machine, and + do not want to waste your bandwidth downloading + them again. --copy Copy files instead of creating symbolic links. --force Attempt to bootstrap even if the sources seem - not to have been checked out. + not to have been checked out. --skip-po Do not download po files. --cvs-user=USERNAME Set the username to use when checking out - sources from the gnulib repository. + sources from the gnulib repository. If the file bootstrap.conf exists in the current working directory, its contents are read as shell variables to configure the bootstrap. @@ -139,6 +140,37 @@ copy=false # on which version control system (if any) is used in the source directory. vc_ignore=auto +# find_tool ENVVAR NAMES... +# ------------------------- +find_tool () +{ + # Find sha1sum, named gsha1sum on MacPorts. + find_tool_envvar=$1 + shift + if eval test x"\$$find_tool_envvar" = x; then + for i + do + if ($i --version /dev/null 2>&1; then + find_tool_res=$i + break + fi + done + fi + if test x"$find_tool_res" = x; then + echo >&2 "$0: $find_tool_name is required" + exit 1 + fi + ($find_tool_res --version /dev/null 2>&1 || { + echo >&2 "$0: cannot run $find_tool_res --version" + exit 1 + } + eval "$find_tool_envvar=\"$find_tool_res\"" + eval "export $find_tool_envvar" +} + +# Find sha1sum, named gsha1sum on MacPorts. +find_tool SHA1SUM sha1sum gsha1sum + # Override the default configuration, if necessary. test -r bootstrap.conf && . ./bootstrap.conf @@ -179,7 +211,7 @@ if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then exit 1 fi -# If $STR is not already on a line by itself in $FILE, insert it, +# If each line in $STR is not already on a line by itself in $FILE, insert it, # sorting the new contents of the file and replacing $FILE with the result. insert_sorted_if_absent() { file=$1 @@ -190,6 +222,21 @@ insert_sorted_if_absent() { || exit 1 } +# Adjust $PATTERN for $VC_IGNORE_FILE and insert it with +# insert_sorted_if_absent. +insert_vc_ignore() { + vc_ignore_file="$1" + case $vc_ignore_file in + *.gitignore) + # A .gitignore entry that does not start with `/' applies recursively to + # subdirectories, so prepend `/' to every .gitignore entry. + pattern=`echo "$2" | sed s,^,/,`;; + *) + pattern="$2";; + esac + insert_sorted_if_absent "$vc_ignore_file" "$pattern" +} + # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac. found_aux_dir=no grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \ @@ -208,7 +255,7 @@ if test ! -d $build_aux; then mkdir $build_aux for dot_ig in x $vc_ignore; do test $dot_ig = x && continue - insert_sorted_if_absent $dot_ig $build_aux + insert_vc_ignore $dot_ig $build_aux done fi @@ -220,6 +267,20 @@ cleanup_gnulib() { exit $status } +# See if we can use gnulib's git-merge-changelog merge driver. + +if test -d .git && (git --version) >/dev/null 2>/dev/null ; then + if git config merge.merge-changelog.driver >/dev/null ; then + : + elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then + echo "initializing git-merge-changelog driver" + git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver' + git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B' + else + echo "consider installing git-merge-changelog from gnulib" + fi +fi + # Get gnulib files. case ${GNULIB_SRCDIR--} in @@ -243,7 +304,7 @@ case ${GNULIB_SRCDIR--} in trap cleanup_gnulib 1 2 13 15 - cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib || + cvs -z3 -q -d ${CVS_PREFIX}pserver.git.sv.gnu.org:/gnulib.git co -d gnulib HEAD || cleanup_gnulib trap - 1 2 13 15 @@ -284,9 +345,9 @@ update_po_files() { for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do new_po="$ref_po_dir/$po.po" cksum_file="$ref_po_dir/$po.s1" - if ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then + if ! "$SHA1SUM" -c --status "$cksum_file" < "$new_po" > /dev/null; then echo "updated $po_dir/$po.po..." - cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file" + cp "$new_po" "$po_dir/$po.po" && "$SHA1SUM" < "$new_po" > "$cksum_file" fi done } @@ -302,6 +363,27 @@ case $SKIP_PO in fi;; esac +check_dst_dir() +{ + dst=$1 + # If the destination directory doesn't exist, create it. + # This is required at least for "lib/uniwidth/cjk.h". + dst_dir=`dirname "$dst"` + if ! test -d "$dst_dir"; then + mkdir -p "$dst_dir" + + # If we've just created a directory like lib/uniwidth, + # tell version control system(s) it's ignorable. + # FIXME: for now, this does only one level + parent=`dirname "$dst_dir"` + for dot_ig in x $vc_ignore; do + test $dot_ig = x && continue + ig=$parent/$dot_ig + insert_vc_ignore $ig `echo "$dst_dir"|sed 's,.*/,,'` + done + fi +} + symlink_to_dir() { src=$1/$2 @@ -309,22 +391,7 @@ symlink_to_dir() test -f "$src" && { - # If the destination directory doesn't exist, create it. - # This is required at least for "lib/uniwidth/cjk.h". - dst_dir=`dirname "$dst"` - if ! test -d "$dst_dir"; then - mkdir -p "$dst_dir" - - # If we've just created a directory like lib/uniwidth, - # tell version control system(s) it's ignorable. - # FIXME: for now, this does only one level - parent=`dirname "$dst_dir"` - for dot_ig in x $vc_ignore; do - test $dot_ig = x && continue - ig=$parent/$dot_ig - insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'` - done - fi + check_dst_dir "$dst" if $copy; then { @@ -388,6 +455,7 @@ cp_mark_as_generated() sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst" } else + check_dst_dir "$cp_dst" # Copy the file first to get proper permissions if it # doesn't already exist. Then overwrite the copy. cp "$cp_src" "$cp_dst-t" && @@ -435,9 +503,9 @@ slurp() { test "$dir/$file" = "$excluded_file" && continue 2 done if test $file = Makefile.am; then - copied=$copied${sep}$gnulib_mk; sep=$nl + copied=$copied${sep}$gnulib_mk; sep=$nl remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g" - sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || { + sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || { echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." && rm -f $dir/$gnulib_mk && sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk @@ -468,18 +536,18 @@ slurp() { test $dot_ig = x && continue ig=$dir/$dot_ig if test -n "$copied"; then - insert_sorted_if_absent $ig "$copied" + insert_vc_ignore $ig "$copied" # If an ignored file name ends with _.h, then also add # the name with just ".h". Many gnulib headers are generated, # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc. # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed f=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'` - insert_sorted_if_absent $ig "$f" + insert_vc_ignore $ig "$f" # For files like sys_stat_.h and sys_time_.h, record as # ignorable the directory we might eventually create: sys/. f=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'` - insert_sorted_if_absent $ig "$f" + insert_vc_ignore $ig "$f" fi done done