Files
libgphoto2/autogen.sh
2005-05-12 13:11:00 +00:00

509 lines
13 KiB
Bash
Executable File

#!/bin/sh
# autogen.sh - initialize and clean automake&co based build trees
#
# For more detailed info, run "autogen.sh --help" or scroll down to the
# print_help() function.
if test "$(pwd)" != "`pwd`"
then
echo "Urgh. Dinosaur shell, eh?"
exit 1
fi
########################################################################
# Constant and initial values
debug="false"
recursive="false"
dryrun="false"
self="$(basename "$0")"
autogen_version="0.4.5"
########################################################################
# Print help message
print_help() {
cat<<__HELP_EOF__
${self} - initialize automake/autoconf/gettext/libtool based build system
Usage:
${self} [<command>|<flag>|...] [<directory>...]
Runs given command sequence on all given directories, in sequence.
If there is no command given, --init is assumed.
If there is no directory given, the location of ${self} is assumed.
Commands:
--help
Print this help text
--version
Print the tool versions
--clean
Clean all files and directories generated by "$self --init"
--init
Converts untouched CVS checkout into a build tree which
can be processed further by running the classic
./configure && make && make install
Flags:
--verbose
Verbose output
--dry-run
Only print the commands to be run, not actually execute
them.
--recursive
Used internally. Do everything which doesn't recurse on
its own.
${self} depends on automake, autoconf, libtool and gettext.
You may want to set AUTOCONF, AUTOHEADER, AUTOMAKE, AUTORECONF, ACLOCAL,
AUTOPOINT, LIBTOOLIZE to use specific version of these tools, and
AUTORECONF_OPTS to add options to the call to autoreconf.
If none of these variables are set, ${self} tries to find the most
adequate version in \$PATH.
__HELP_EOF__
}
########################################################################
# Print software versions
print_versions() {
echo "${self} (ndim's autogen) ${autogen_version}"
for tool in \
"${AUTOCONF-autoconf}" \
"${AUTOMAKE-automake}" \
"${AUTOPOINT-autopoint}" \
"${LIBTOOLIZE-libtoolize}"
do
"$tool" --version 2>&1 | sed '1q'
done
}
########################################################################
# Initialize variables for configure.{in,ac} in $1
init_vars() {
dir="$1"
echo -n "Looking for \`${dir}/configure.{ac,in}'..."
# There are shells which don't understand {,} wildcards
CONFIGURE_AC=""
for tmp in "${dir}/configure.ac" "${dir}/configure.in"; do
if test -f "$tmp"; then
CONFIGURE_AC="$tmp"
echo " $tmp"
break
fi
done
if test "x$CONFIGURE_AC" = "x"; then
echo " no."
exit 1
fi
if "$debug"; then
if test "$(uname -o)" = "Cygwin"; then
# Cygwin autoreconf doesn't understand -Wall
AUTORECONF_OPTS="$AUTORECONF_OPTS --verbose"
else
AUTORECONF_OPTS="$AUTORECONF_OPTS --verbose -Wall"
fi
fi
"$debug" && echo -n "Initializing variables for \`${dir}'..."
# FIXME: Just getting those directories and cleaning them isn't enough.
# OK, the "init" part is done recursively by autopoint, so that is easy.
# But the cleaning should also work recursively, but that is difficult
# with the current structure of the script.
AG_SUBDIRS="$(for k in $(sed -n 's/^[[:space:]]*GP_AUTOGEN_SUBDIR(\[\{0,1\}\([^])]*\).*/\1/p' "$CONFIGURE_AC"); do echo "${k}"; done)"
AG_LIBLTDL_DIR="$(sed -n 's/^[[:space:]]*AC_LIBLTDL_\(INSTALLABLE\|CONVENIENCE\)(\[\{0,1\}\([^])]*\).*/\2/p' < "$CONFIGURE_AC")"
if test "x$AG_LIBLTDL_DIR" = "x"; then
tmp="$(sed -n 's/^[[:space:]]*\(AC_LIBLTDL_\)\(INSTALLABLE\|CONVENIENCE\)(\[\{0,1\}\([^])]*\).*/\1/p' < "$CONFIGURE_AC")"
if test "x$tmp" = "xAC_LIBLTDL_"; then
AG_LIBLTDL_DIR="libltdl"
else
AG_LIBLTDL_DIR=""
fi
fi
AG_AUX="$(sed -n 's/^AC_CONFIG_AUX_DIR(\[\{0,1\}\([^])]*\).*/\1/p' < "$CONFIGURE_AC")"
if test "x$AG_AUX" = "x"; then
AG_AUX="."
fi
AG_CONFIG_H="$(sed -n 's/^\(A[CM]_CONFIG_HEADERS\?\)(\[\{0,1\}\([^]),]*\).*/\2/p' < "$CONFIGURE_AC")"
AG_CONFIG_K="$(sed -n 's/^\(A[CM]_CONFIG_HEADERS\?\)(\[\{0,1\}\([^]),]*\).*/\1/p' < "$CONFIGURE_AC")"
if echo "x$AG_CONFIG_H" | grep -q ':'; then
echo "$AG_CONFIG_K contains unsupported \`:' character: \`$AG_CONFIG_H'"
exit 13
fi
if test "x$AG_CONFIG_H" != "x"; then
AG_CONFIG_DIR="$(dirname "${AG_CONFIG_H}")"
AG_GEN_CONFIG_H="${AG_CONFIG_H} ${AG_CONFIG_H}.in ${AG_CONFIG_DIR}/stamp-h1 ${AG_CONFIG_DIR}/stamp-h2"
else
AG_CONFIG_DIR=""
AG_GEN_CONFIG_H=""
fi
for d in "$AG_AUX" "$AG_CONFIG_DIR"; do
if test -n "$d" && test ! -d "$d"; then
mkdir "$d"
fi
done
AG_GEN_ACAM="aclocal.m4 configure $AG_AUX/config.guess $AG_AUX/config.sub $AG_AUX/compile"
AG_GEN_RECONF="$AG_AUX/install-sh $AG_AUX/missing $AG_AUX/depcomp"
AG_GEN_LIBTOOL="$AG_AUX/ltmain.sh libtool"
while read file; do
AG_GEN_LIBTOOL="${AG_GEN_LIBTOOL} ${AG_LIBLTDL_DIR}/${file}"
done <<EOF
aclocal.m4
config.guess
config-h.in
config.sub
configure
configure.ac
COPYING.LIB
install-sh
ltdl.c
ltdl.h
ltmain.sh
Makefile.am
Makefile.in
missing
README
EOF
AG_GEN_GETTEXT="$AG_AUX/mkinstalldirs $AG_AUX/config.rpath ABOUT-NLS"
while read file; do
AG_GEN_GETTEXT="${AG_GEN_GETTEXT} m4/${file} m4m/${file}"
done <<EOF
codeset.m4
gettext.m4
glibc21.m4
iconv.m4
intdiv0.m4
intmax.m4
inttypes-pri.m4
inttypes.m4
inttypes_h.m4
isc-posix.m4
lcmessage.m4
lib-ld.m4
lib-link.m4
lib-prefix.m4
longdouble.m4
longlong.m4
nls.m4
po.m4
printf-posix.m4
progtest.m4
signed.m4
size_max.m4
stdint_h.m4
uintmax_t.m4
ulonglong.m4
wchar_t.m4
wint_t.m4
xsize.m4
EOF
while read file; do
AG_GEN_GETTEXT="${AG_GEN_GETTEXT} po/${file}"
done <<EOF
Makefile.in.in
Makevars.template
Rules-quot
boldquot.sed
en@boldquot.header
en@quot.header
insert-header.sin
quot.sed
remove-potcdate.sin
stamp-po
EOF
AG_GEN_CONF="config.status config.log"
AG_GEN_FILES="$AG_GEN_ACAM $AG_GEN_RECONF $AG_GEN_GETTEXT"
AG_GEN_FILES="$AG_GEN_FILES $AG_GEN_CONFIG_H $AG_GEN_CONF $AG_GEN_LIBTOOL"
AG_GEN_DIRS="autom4te.cache ${AG_LIBLTDL_DIR}/autom4te.cache ${AG_LIBLTDL_DIR}"
"$debug" && echo " done."
if "$debug"; then set | grep '^AG_'; fi
dryrun_param=""
if "$dryrun"; then dryrun_param="--dry-run"; fi
}
########################################################################
# Print command to be executed and, if not dryrun, actually execute it.
execute_command() {
if "$dryrun" || "$debug"; then
echo "Running <<" "$@" ">>"
fi
if "$dryrun"; then :; else
"$@"
fi
}
########################################################################
# Clean generated files from $* directories
command_clean() {
if test "x$AG_GEN_FILES" = "x"; then echo "Internal error"; exit 2; fi
dir="$1"
#while test "$dir"; do
echo "$self:clean: Entering directory \`${dir}'"
(
if cd "$dir"; then
echo -n "Cleaning autogen generated files..."
execute_command rm -rf ${AG_GEN_DIRS}
execute_command rm -f ${AG_GEN_FILES}
echo " done."
if test -h INSTALL; then execute_command rm -f INSTALL; fi
echo -n "Cleaning generated Makefile, Makefile.in files..."
if "$debug"; then echo; fi
find . -type f -name 'Makefile.am' -print | \
while read file; do
echo "$file" | grep -q '/{arch}' && continue
echo "$file" | grep -q '/\.svn' && continue
echo "$file" | grep -q '/CVS' && continue
base="$(dirname "$file")/$(basename "$file" .am)"
if "$debug"; then
echo -e " Removing files created from ${file}"
fi
execute_command rm -f "${base}" "${base}.in"
done
if "$debug"; then :; else echo " done."; fi
echo -n "Removing *~ backup files..."
find . -type f -name '*~' -print | while read fname; do
execute_command rm -f "$fname"
done
echo " done."
if test -n "${AG_SUBDIRS}"; then
"$0" --clean ${dryrun_param} --recursive ${AG_SUBDIRS}
fi
fi
)
echo "$self:clean: Left directory \`${dir}'"
#shift
#dir="$1"
#done
}
########################################################################
# Initialize build system in $1 directory
command_init() {
dir="$1"
if test "x$AG_GEN_FILES" = "x"; then echo "Internal error"; exit 2; fi
echo "$self:init: Entering directory \`${dir}'"
(
if cd "${dir}"; then
if test "x$AG_LIBLTDL_DIR" != "x"; then
# We have to run libtoolize --ltdl ourselves because
# - autoreconf doesn't run it at all
execute_command "${LIBTOOLIZE-"libtoolize"}" --ltdl
# And we have to clean up the generated files after libtoolize because
# - we still want symlinks for the files
# - but we want to (implicitly) AC_CONFIG_SUBDIR and that writes to
# these files.
if test ! -d "${AG_LIBLTDL_DIR}" || test ! -f "${AG_LIBLTDL_DIR}/Makefile.am"; then
echo "Could not create libltdl directory \`${AG_LIBLTDL_DIR}'."
echo "Leaving \`$(pwd)' and aborting."
exit 2
fi
(cd "${AG_LIBLTDL_DIR}" && execute_command rm -f aclocal.m4 config.guess config.sub configure install-sh ltmain.sh Makefile.in missing)
fi
if test -n "${AG_SUBDIRS}"; then
"$0" --init ${dryrun_param} --recursive ${AG_SUBDIRS}
status="$?"
if test "$status" -ne 0; then exit "$status"; fi
fi
if "$recursive"; then :; else
if execute_command ${AUTORECONF-"autoreconf"} --install --symlink ${AUTORECONF_OPTS}; then
:; else
status="$?"
echo "autoreconf quit with exit code $status, aborting."
exit "$status"
fi
echo "You may run ./configure now in \`${dir}'."
echo "Run as \"./configure --help\" to find out about config options."
fi
else
exit "$?"
fi
)
# Just error propagation
status="$?"
echo "$self:init: Left directory \`${dir}'"
if "$recursive"; then
:
elif test "$status" -ne "0"; then
exit "$status"
fi
}
########################################################################
# Parse command line.
# This still accepts more than the help text says it does, but that
# isn't supported.
commands="init" # default command in case none is given
pcommands=""
check_versions=false
dirs="$(dirname "$0")"
#dirs="$(cd "$dirs" && pwd)"
pdirs=""
# Yes, unquoted $@ isn't space safe, but it works with simple shells.
for param in $@; do
case "$param" in
--clean)
pcommands="$pcommands clean"
;;
--init)
pcommands="$pcommands init"
check_versions=:
;;
--verbose)
debug=:
;;
--dry-run)
dryrun=:
;;
--recursive)
recursive=:
;;
--version)
print_versions
exit 0
;;
-h|--help)
print_help
exit 0
;;
-*)
echo "Unhandled $self option: $param"
exit 1
;;
*)
pdirs="${pdirs} ${param}"
;;
esac
done
if test "x$pcommands" != "x"; then
# commands given on command line? use them!
commands="$pcommands"
else
check_versions=:
fi
if test "x$pdirs" != "x"; then
# dirs given on command line? use them!
dirs="$pdirs"
fi
########################################################################
# If not explicitly given, try to find most convenient tools in $PATH
#
# This method only works for tools made for parallel installation with
# a version suffix, i.e. autoconf and automake.
#
# libtool and gettext do not support that, so you'll still have to
# manually set the respective variables if the default does not work
# for you.
skip="false"
oldversion="oldversion"
while read flag variable binary version restofline; do
case "$flag" in
+)
if "$skip"; then skip=false; fi
if test -n "`eval echo \$\{$variable+"set"\}`"; then
skip=:
else
if test -x "`which ${binary}${version}`"; then
export "$variable"="${binary}${version}"
oldversion="${version}"
else
skip=:
fi
fi
;;
-)
if "$skip"; then :; else
export "$variable"="${binary}${oldversion}"
fi
;;
esac
done<<EOF
+ AUTOMAKE automake -1.9
- ACLOCAL aclocal
+ AUTOMAKE automake -1.8
- ACLOCAL aclocal
+ AUTOCONF autoconf 2.59
- AUTOHEADER autoheader
- AUTORECONF autoreconf
+ AUTOCONF autoconf 2.50
- AUTOHEADER autoheader
- AUTORECONF autoreconf
EOF
########################################################################
# Check that tool versions satisfy our needs
if "$check_versions"; then
# check tool versions
errors=false
lf="
"
while read tool minversion; do
version="$("$tool" --version | sed 's/^.*(.*) *\(.*\)$/\1/g;1q')"
# compare version and minversion
first="$(echo "$version$lf$minversion" | sort -n | sed '1q')"
if test "x$minversion" != "x$first" && test "x$version" = "x$first"; then
echo "Version \`$version' of \`$tool' not sufficient. At least \`$minversion' required."
errors=:
fi
done <<EOF
${ACLOCAL-"aclocal"} 1.8
${AUTOMAKE-"automake"} 1.8
${AUTOCONF-"autoconf"} 2.59
${AUTOHEADER-"autoheader"} 2.59
${AUTOPOINT-"autopoint"} 0.14.1
${LIBTOOLIZE-"libtoolize"} 1.4
EOF
if "$errors"; then
echo "Please update your toolset."
echo "If you want to continue regardless of your old toolset, press ENTER."
read
fi
fi
########################################################################
# Actually run the commands
for dir in ${dirs}; do
"$debug" && echo "Running commands on directory \`${dir}'"
if test ! -d "$dir"; then
echo "Could not find directory \`${dir}'"
else
init_vars "$dir"
for command in ${commands}; do
"command_$command" "$dir"
done
fi
done
exit 0
# Please do not remove this:
# filetype: 89b1e88e-4cf2-44f1-980d-730067367775
# I use this to find all the different instances of this file which
# are supposed to be synchronized.