tiptop-2.3/0000755001151100706620000000000012547160067007712 500000000000000tiptop-2.3/AUTHORS0000644001151100706620000000030412547160067010677 00000000000000Authors of tiptop Erven ROHOU Main author Antoine NAUDIN Contributed the configuration file, the expression parser, and the error management mechanism. tiptop-2.3/config.h.in0000644001151100706620000001165112547160067011661 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 to enable support for debug. */ #undef ENABLE_DEBUG /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `curses' library (-lcurses). */ #undef HAVE_LIBCURSES /* Define to 1 if you have the `libxml2' library (-lxml2). */ #undef HAVE_LIBXML2 /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_PERF_COUNTER_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_PERF_EVENT_H /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #undef HAVE_REALLOC /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the `uname' function. */ #undef HAVE_UNAME /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 when no specific target is supported. */ #undef NOTARGET /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if the target is x86. */ #undef TARGET_X86 /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define to `int' if doesn't define. */ #undef gid_t /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef int64_t /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to `int' if does not define. */ #undef pid_t /* Define to rpl_realloc if the replacement function should be used. */ #undef realloc /* Define to `int' if doesn't define. */ #undef uid_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t /* Define as `fork' if `vfork' does not work. */ #undef vfork tiptop-2.3/configure.ac0000644001151100706620000000702012547160067012117 00000000000000AC_PREREQ([2.68]) AC_INIT([tiptop], [2.3], [erven.rohou@inria.fr]) AC_CONFIG_SRCDIR([src/tiptop.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC AC_PROG_LEX AC_PROG_YACC AC_PROG_INSTALL AC_ARG_ENABLE(curses, [ --disable-curses disable usage of libcurses, even if available], [disable_curses=$enableval], [disable_curses=$enableval]) AC_ARG_ENABLE(libxml2, [ --disable-libxml2 disable usage of libxml2, even if available], [disable_libxml2=$enableval], [disable_libxml2=$enableval]) # Checks for libraries. if test ! x$disable_curses = xno; then # check only if not disabled AC_CHECK_LIB([curses], [initscr], [have_curses=yes; AC_DEFINE([HAVE_LIBCURSES], [1], [Define to 1 if you have the `curses' library (-lcurses).]) LIBS="-lcurses $LIBS"], [have_curses=no]) fi if test ! x$disable_libxml2 = xno; then # check only if not disabled AC_CHECK_LIB([xml2], [xmlParseFile], [have_xml2=yes; AC_DEFINE([HAVE_LIBXML2], [1], [Define to 1 if you have the `libxml2' library (-lxml2).]) LIBS="-lxml2 $LIBS" CFLAGS="$CFLAGS -I/usr/include/libxml2"], [have_xml2=no]) fi # Checks for header files. AC_CHECK_HEADERS([inttypes.h stdint.h stdlib.h string.h sys/ioctl.h sys/time.h unistd.h]) AC_CHECK_HEADERS([linux/perf_counter.h], [have_perf_counter=yes], [have_perf_counter=no]) AC_CHECK_HEADERS([linux/perf_event.h], [have_perf_event=yes], [have_perf_event=no]) if test "x${have_perf_counter}" = xno -a "x${have_perf_event}" = xno; then os=`uname -s -r` AC_MSG_FAILURE([ ------------------------------------------------------------ Could not locate linux/perf_count.h or linux/perf_event.h. Are performance counters supported on this machine? Linux 2.6.31+ is required. uname reports: ${os} ------------------------------------------------------------]) fi # Check for hardware architecture no_target=yes AC_MSG_CHECKING([hardware]) hw=`uname -m` case $hw in x86_64 | i386 | i686 ) : AC_MSG_RESULT([x86]) AC_DEFINE([TARGET_X86], [1], [Define to 1 if the target is x86.]) no_target=no ;; unknown ) : AC_MSG_RESULT([unknown]) AC_MSG_WARN([Could not detect architecture]) ;; * ) : AC_MSG_RESULT([$hw]) ;; esac if test x$no_target = xyes; then AC_DEFINE([NOTARGET], [1], [Define to 1 when no specific target is supported.]) fi # Checks for typedefs, structures, and compiler characteristics. AC_C_INLINE AC_TYPE_INT32_T AC_TYPE_INT64_T AC_TYPE_PID_T AC_TYPE_UID_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T # Checks for library functions. AC_FUNC_FORK AC_FUNC_MALLOC AC_FUNC_REALLOC AC_CHECK_FUNCS([gettimeofday memset select strdup strerror strstr uname]) AC_CONFIG_FILES([Makefile src/Makefile]) AC_ARG_ENABLE(debug, [ --enable-debug enable support for debug], [AC_DEFINE([ENABLE_DEBUG], [1], [Define to 1 to enable support for debug.])]) if test "x${have_curses}" = xno; then AC_MSG_WARN([ ----------------------------------------------------- Library curses not found. Building without support. -----------------------------------------------------]) fi if test "x${have_xml2}" = xno; then AC_MSG_WARN([ ----------------------------------------------------- Library xml2 not found. Building without support. -----------------------------------------------------]) fi AC_OUTPUT tiptop-2.3/Makefile.in0000644001151100706620000000666512547160067011714 00000000000000# @configure_input@ package = @PACKAGE_NAME@ version = @PACKAGE_VERSION@ tarname = @PACKAGE_TARNAME@ distdir = $(tarname)-$(version) prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ datarootdir = @datarootdir@ mandir = @mandir@ man1dir = $(mandir)/man1 # VPATH-specific substitution variables srcdir = @srcdir@ VPATH = @srcdir@ export prefix export exec_prefix export bindir export datarootdir export mandir export man1dir all clean install uninstall tiptop: cd src && $(MAKE) $@ dist: $(distdir).tar.gz $(distdir).tar.gz: $(distdir) tar chof - $(distdir) | gzip -9 -c > $@ rm -rf $(distdir) distcheck: $(distdir).tar.gz gzip -cd $(distdir).tar.gz | tar xvf - cd $(distdir) && ./configure cd $(distdir) && $(MAKE) all cd $(distdir) && $(MAKE) prefix=$${PWD}/_inst install cd $(distdir) && $(MAKE) prefix=$${PWD}/_inst uninstall @remaining="`find $${PWD}/$(distdir)/_inst -type f | wc -l`"; \ if test "$${remaining}" -ne 0; then \ echo "*** $${remaining} file(s) remaining in stage directory!"; \ exit 1; \ fi cd $(distdir) && $(MAKE) clean rm -rf $(distdir) @echo "*** Package $(distdir).tar.gz is ready for distribution." Makefile: Makefile.in config.status ./config.status $@ config.status: configure ./config.status --recheck $(distdir): FORCE mkdir -p $(distdir)/src cp $(srcdir)/configure.ac $(distdir) cp $(srcdir)/configure $(distdir) cp $(srcdir)/config.h.in $(distdir) cp $(srcdir)/install-sh $(distdir) cp $(srcdir)/AUTHORS $(distdir) cp $(srcdir)/COPYING $(distdir) cp $(srcdir)/INSTALL $(distdir) cp $(srcdir)/README $(distdir) cp $(srcdir)/Makefile.in $(distdir) cp $(srcdir)/tiptoprc $(distdir) cp $(srcdir)/src/Makefile.in $(distdir)/src cp $(srcdir)/src/tiptop.1 $(distdir)/src cp $(srcdir)/src/calc.lex $(distdir)/src cp $(srcdir)/src/calc.y $(distdir)/src cp $(srcdir)/src/conf.c $(distdir)/src cp $(srcdir)/src/conf.h $(distdir)/src cp $(srcdir)/src/debug.c $(distdir)/src cp $(srcdir)/src/debug.h $(distdir)/src cp $(srcdir)/src/error.c $(distdir)/src cp $(srcdir)/src/error.h $(distdir)/src cp $(srcdir)/src/formula-parser.h $(distdir)/src cp $(srcdir)/src/hash.c $(distdir)/src cp $(srcdir)/src/hash.h $(distdir)/src cp $(srcdir)/src/helpwin.c $(distdir)/src cp $(srcdir)/src/helpwin.h $(distdir)/src cp $(srcdir)/src/options.c $(distdir)/src cp $(srcdir)/src/options.h $(distdir)/src cp $(srcdir)/src/pmc.c $(distdir)/src cp $(srcdir)/src/pmc.h $(distdir)/src cp $(srcdir)/src/priv.c $(distdir)/src cp $(srcdir)/src/priv.h $(distdir)/src cp $(srcdir)/src/process.c $(distdir)/src cp $(srcdir)/src/process.h $(distdir)/src cp $(srcdir)/src/requisite.c $(distdir)/src cp $(srcdir)/src/requisite.h $(distdir)/src cp $(srcdir)/src/screen.c $(distdir)/src cp $(srcdir)/src/screen.h $(distdir)/src cp $(srcdir)/src/spawn.c $(distdir)/src cp $(srcdir)/src/spawn.h $(distdir)/src cp $(srcdir)/src/target.c $(distdir)/src cp $(srcdir)/src/target.h $(distdir)/src cp $(srcdir)/src/target-x86.c $(distdir)/src cp $(srcdir)/src/tiptop.c $(distdir)/src cp $(srcdir)/src/utils-expression.c $(distdir)/src cp $(srcdir)/src/utils-expression.h $(distdir)/src cp $(srcdir)/src/version.c $(distdir)/src cp $(srcdir)/src/version.h $(distdir)/src cp $(srcdir)/src/xml-parser.c $(distdir)/src cp $(srcdir)/src/xml-parser.h $(distdir)/src FORCE: -rm $(distdir).tar.gz > /dev/null 2>&1 -rm -rf $(distdir) > /dev/null 2>&1 .PHONY: FORCE all clean dist distcheck install uninstall tiptop-2.3/install-sh0000755001151100706620000003253712547160067011650 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: tiptop-2.3/configure0000755001151100706620000051002412547160067011543 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for tiptop 2.3. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: erven.rohou@inria.fr about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='tiptop' PACKAGE_TARNAME='tiptop' PACKAGE_VERSION='2.3' PACKAGE_STRING='tiptop 2.3' PACKAGE_BUGREPORT='erven.rohou@inria.fr' PACKAGE_URL='' ac_unique_file="src/tiptop.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS EGREP GREP CPP INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_curses enable_libxml2 enable_debug ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures tiptop 2.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/tiptop] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of tiptop 2.3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-curses disable usage of libcurses, even if available --disable-libxml2 disable usage of libxml2, even if available --enable-debug enable support for debug Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF tiptop configure 2.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ----------------------------------- ## ## Report this to erven.rohou@inria.fr ## ## ----------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_find_intX_t LINENO BITS VAR # ----------------------------------- # Finds a signed integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by tiptop $as_me 2.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" # Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "#define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # Check whether --enable-curses was given. if test "${enable_curses+set}" = set; then : enableval=$enable_curses; disable_curses=$enableval else disable_curses=$enableval fi # Check whether --enable-libxml2 was given. if test "${enable_libxml2+set}" = set; then : enableval=$enable_libxml2; disable_libxml2=$enableval else disable_libxml2=$enableval fi # Checks for libraries. if test ! x$disable_curses = xno; then # check only if not disabled { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lcurses" >&5 $as_echo_n "checking for initscr in -lcurses... " >&6; } if ${ac_cv_lib_curses_initscr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char initscr (); int main () { return initscr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_curses_initscr=yes else ac_cv_lib_curses_initscr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_initscr" >&5 $as_echo "$ac_cv_lib_curses_initscr" >&6; } if test "x$ac_cv_lib_curses_initscr" = xyes; then : have_curses=yes; $as_echo "#define HAVE_LIBCURSES 1" >>confdefs.h LIBS="-lcurses $LIBS" else have_curses=no fi fi if test ! x$disable_libxml2 = xno; then # check only if not disabled { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlParseFile in -lxml2" >&5 $as_echo_n "checking for xmlParseFile in -lxml2... " >&6; } if ${ac_cv_lib_xml2_xmlParseFile+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lxml2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char xmlParseFile (); int main () { return xmlParseFile (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_xml2_xmlParseFile=yes else ac_cv_lib_xml2_xmlParseFile=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xml2_xmlParseFile" >&5 $as_echo "$ac_cv_lib_xml2_xmlParseFile" >&6; } if test "x$ac_cv_lib_xml2_xmlParseFile" = xyes; then : have_xml2=yes; $as_echo "#define HAVE_LIBXML2 1" >>confdefs.h LIBS="-lxml2 $LIBS" CFLAGS="$CFLAGS -I/usr/include/libxml2" else have_xml2=no fi fi # Checks for header files. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in inttypes.h stdint.h stdlib.h string.h sys/ioctl.h sys/time.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in linux/perf_counter.h do : ac_fn_c_check_header_mongrel "$LINENO" "linux/perf_counter.h" "ac_cv_header_linux_perf_counter_h" "$ac_includes_default" if test "x$ac_cv_header_linux_perf_counter_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LINUX_PERF_COUNTER_H 1 _ACEOF have_perf_counter=yes else have_perf_counter=no fi done for ac_header in linux/perf_event.h do : ac_fn_c_check_header_mongrel "$LINENO" "linux/perf_event.h" "ac_cv_header_linux_perf_event_h" "$ac_includes_default" if test "x$ac_cv_header_linux_perf_event_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LINUX_PERF_EVENT_H 1 _ACEOF have_perf_event=yes else have_perf_event=no fi done if test "x${have_perf_counter}" = xno -a "x${have_perf_event}" = xno; then os=`uname -s -r` { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? " ------------------------------------------------------------ Could not locate linux/perf_count.h or linux/perf_event.h. Are performance counters supported on this machine? Linux 2.6.31+ is required. uname reports: ${os} ------------------------------------------------------------ See \`config.log' for more details" "$LINENO" 5; } fi # Check for hardware architecture no_target=yes { $as_echo "$as_me:${as_lineno-$LINENO}: checking hardware" >&5 $as_echo_n "checking hardware... " >&6; } hw=`uname -m` case $hw in x86_64 | i386 | i686 ) : { $as_echo "$as_me:${as_lineno-$LINENO}: result: x86" >&5 $as_echo "x86" >&6; } $as_echo "#define TARGET_X86 1" >>confdefs.h no_target=no ;; unknown ) : { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 $as_echo "unknown" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not detect architecture" >&5 $as_echo "$as_me: WARNING: Could not detect architecture" >&2;} ;; * ) : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hw" >&5 $as_echo "$hw" >&6; } ;; esac if test x$no_target = xyes; then $as_echo "#define NOTARGET 1" >>confdefs.h fi # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" case $ac_cv_c_int64_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int64_t $ac_cv_c_int64_t _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if ${ac_cv_type_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then $as_echo "#define uid_t int" >>confdefs.h $as_echo "#define gid_t int" >>confdefs.h fi ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac # Checks for library functions. for ac_header in vfork.h do : ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" if test "x$ac_cv_header_vfork_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VFORK_H 1 _ACEOF fi done for ac_func in fork vfork do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 $as_echo_n "checking for working fork... " >&6; } if ${ac_cv_func_fork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_fork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_fork_works=yes else ac_cv_func_fork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 $as_echo "$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 $as_echo_n "checking for working vfork... " >&6; } if ${ac_cv_func_vfork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_vfork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_vfork_works=yes else ac_cv_func_vfork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 $as_echo "$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then $as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h else $as_echo "#define vfork fork" >>confdefs.h fi if test "x$ac_cv_func_fork_works" = xyes; then $as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if ${ac_cv_func_realloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "#define HAVE_REALLOC 1" >>confdefs.h else $as_echo "#define HAVE_REALLOC 0" >>confdefs.h case " $LIBOBJS " in *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac $as_echo "#define realloc rpl_realloc" >>confdefs.h fi for ac_func in gettimeofday memset select strdup strerror strstr uname do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_config_files="$ac_config_files Makefile src/Makefile" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; $as_echo "#define ENABLE_DEBUG 1" >>confdefs.h fi if test "x${have_curses}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ----------------------------------------------------- Library curses not found. Building without support. -----------------------------------------------------" >&5 $as_echo "$as_me: WARNING: ----------------------------------------------------- Library curses not found. Building without support. -----------------------------------------------------" >&2;} fi if test "x${have_xml2}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ----------------------------------------------------- Library xml2 not found. Building without support. -----------------------------------------------------" >&5 $as_echo "$as_me: WARNING: ----------------------------------------------------- Library xml2 not found. Building without support. -----------------------------------------------------" >&2;} fi cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by tiptop $as_me 2.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ tiptop config.status 2.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi tiptop-2.3/tiptoprc0000644001151100706620000002405112547160067011423 00000000000000 tiptop-2.3/src/0000755001151100706620000000000012547160067010501 500000000000000tiptop-2.3/src/tiptop.c0000644001151100706620000006073612547160067012120 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012, 2013, 2014, 2015 Inria * * License: GNU General Public License version 2. * */ #include #include #ifdef HAVE_LIBCURSES #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "conf.h" #include "debug.h" #include "error.h" #include "helpwin.h" #include "options.h" #include "pmc.h" #include "priv.h" #include "process.h" #include "requisite.h" #include "screen.h" #include "spawn.h" #include "utils-expression.h" struct option options; static struct timeval tv; static char* message = NULL; static char* header = NULL; static int active_col = 0; static enum sorting_order { DESCENDING, ASCENDING } sorting_order = DESCENDING; static int (*sorting_fun)(const void *, const void *); /* Utility functions used by qsort to sort processes according to active column */ static int cmp_double(const void* p1, const void* p2) { int res; struct process* proc1 = *(struct process**)p1; struct process* proc2 = *(struct process**)p2; if (proc1->u.d > proc2->u.d) res = -1; else if (proc1->u.d == proc2->u.d) res = 0; else res = 1; if (sorting_order == DESCENDING) return res; else return -res; } static int cmp_int(const void* p1, const void* p2) { int res; struct process* proc1 = *(struct process**)p1; struct process* proc2 = *(struct process**)p2; if (proc1->u.i > proc2->u.i) res = -1; else if (proc1->u.i == proc2->u.i) res = 0; else res = 1; if (sorting_order == DESCENDING) return res; else return -res; } #if 0 /* unused for now */ static int cmp_long(const void* p1, const void* p2) { struct process* proc1 = *(struct process**)p1; struct process* proc2 = *(struct process**)p2; int res; if (proc1->u.l > proc2->u.l) res = -1; else if (proc1->u.l == proc2->u.l) res = 0; else res = 1; if (sorting_order == DESCENDING) return res; else return -res; } #endif static int cmp_string(const void* p1, const void* p2) { struct process* proc1 = *(struct process**)p1; struct process* proc2 = *(struct process**)p2; int res; if (options.show_cmdline) res = strcmp(proc1->cmdline, proc2->cmdline); else res = strcmp(proc1->name, proc2->name); if (sorting_order == ASCENDING) return res; else return -res; } /* For each process/thread in the list, generate the text form, ready * to be printed. */ static void build_rows(struct process_list* proc_list, screen_t* s, int width) { int row_width; struct process* p; assert(TXT_LEN > 20); row_width = TXT_LEN; if ((width != -1) && (width < row_width)) row_width = width; /* For the time being, column -1 is the PID, columns 0 to "num_columns-1" are the columns specified in the screen, and column "num_columns" is the task name. */ /* select appropriate sorting function */ if (active_col == s->num_columns) /* proc name or command */ sorting_fun = cmp_string; else if (active_col == -1) /* PID */ sorting_fun = cmp_int; else sorting_fun = cmp_double; /* (computed) expression */ /* For all processes/threads */ for(p = proc_list->processes; p; p = p->next) { int col, written; char* row = p->txt; /* the row we are building */ int remaining = row_width; /* remaining bytes in row */ int thr = ' '; p->skip = 1; /* first, assume not ready */ /* dead, not changing anymore, the row should be up-to-date. */ if ((p->dead) && (!options.sticky)) continue; /* not active, skip */ if (!options.idle && (p->cpu_percent < options.cpu_threshold)) continue; /* only some tasks are monitored, skip those that do not qualify */ if (((options.only_pid) && (p->tid != options.only_pid) && (p->pid != options.only_pid)) || (options.only_name && options.show_cmdline && !strstr(p->cmdline, options.only_name)) || (options.only_name && !options.show_cmdline && !strstr(p->name, options.only_name))) continue; if (active_col == -1) /* column -1 is the PID */ p->u.i = p->tid; /* display a '+' or '-' sign after processes made of multiple threads */ if (p->num_threads > 1) { if (p->tid == p->pid) thr = '+'; else thr = '-'; } if (options.show_user) written = snprintf(row, remaining, "%5d%c %-10s ", p->tid, thr, p->username); else written = snprintf(row, remaining, "%5d%c ", p->tid, thr); row += written; remaining -= written; for(col = 0; col < s->num_columns; col++) { double res = 0; int error = 0; /* used to track error situations requiring an error_field (code 1) or an empty_field (code 2) */ const char* const fmt = s->columns[col].format; /* zero the sorting field. The double '.d' is the longest field. */ if (active_col == col) p->u.d = 0.0; res = evaluate_column_expression(s->columns[col].expression, s->counters, s->num_counters, p, &error); if (error == 1) written = snprintf(row, remaining, "%s", s->columns[col].error_field); else if (error == 2) written = snprintf(row, remaining, "%s", s->columns[col].empty_field); else { written = snprintf(row, remaining, fmt, res); } if (active_col == col) p->u.d = res; /* man snprintf: The functions snprintf() and vsnprintf() do not write more than size bytes (including the trailing '\0'). If the output was truncated due to this limit then the return value is the number of characters (not including the trailing '\0') which would have been written to the final string if enough space had been available. Thus, a return value of size or more means that the output was truncated. */ if (written >= remaining) { remaining = 0; break; /* line is full */ } row += written; remaining -= written; /* add space after column, if it fits */ if (remaining >= 2) { row[0] = ' '; row[1] = '\0'; row++; remaining--; } } if (options.show_cmdline) strncpy(row, p->cmdline, remaining); else strncpy(row, p->name, remaining); if (remaining) row[remaining-1] = '\0'; p->skip = 0; } } /* Main execution loop in batch mode. Builds the list of processes, * collects statistics, and prints. Repeats after some delay. */ static void batch_mode(struct process_list* proc_list, screen_t* screen) { int num_iter = 0; int num_printed; int pos; FILE* out = options.out; struct process** p; tv.tv_sec = 0; tv.tv_usec = 200000; /* 200 ms for first iteration */ /* Print various information about this run */ fprintf(out, "tiptop - "); { /* uptime */ struct sysinfo sys; int days, hours, minutes; sysinfo(&sys); days = sys.uptime / 86400; hours = (sys.uptime - days*86400) / 3600; minutes = (sys.uptime - days*86400 - hours*3600) / 60; fprintf(out, "up %d days, %d:%02d, load average: %.2f, %.2f, %.2f\n", days, hours, minutes, sys.loads[0] / (float)(1 << SI_LOAD_SHIFT), sys.loads[1] / (float)(1 << SI_LOAD_SHIFT), sys.loads[2] / (float)(1 << SI_LOAD_SHIFT)); } { /* date */ char outstr[200]; time_t t = time(NULL); struct tm *tmp = localtime(&t); if (tmp) { strftime(outstr, sizeof(outstr), "%a %b %e %H:%M:%S %Z %Y", tmp); fprintf(out, "%s\n", outstr); } } pos = screen_pos(screen); fprintf(out, "delay: %.2f idle: %d threads: %d\n", options.delay, (int)options.idle, (int)options.show_threads); if (options.watch_pid) fprintf(out, "watching pid %d\n", options.watch_pid); else if (options.watch_name) fprintf(out, "watching pid '%s'\n", options.watch_name); if (options.only_pid) fprintf(out, "only pid %d\n", options.only_pid); else if (options.only_name) fprintf(out, "only pid '%s'\n", options.only_name); if (options.watch_uid != -1) { struct passwd* passwd = getpwuid(options.watch_uid); assert(passwd); fprintf(out, "watching uid %d '%s'\n", options.watch_uid, passwd->pw_name); } header = gen_header(screen, &options, TXT_LEN - 1, active_col); fprintf(out, "Screen %d: %s\n", pos, screen->name); fprintf(out, "\n%s\n", header); for(num_iter=0; !options.max_iter || num_iterproc_ptrs; /* generate the text version of all rows */ build_rows(proc_list, screen, -1); /* sort by %CPU */ qsort(p, proc_list->num_tids, sizeof(struct process*), sorting_fun); num_printed = 0; for(i=0; i < proc_list->num_tids; i++) { if (p[i]->skip) continue; if (options.show_threads || (p[i]->pid == p[i]->tid)) { if (options.show_timestamp) fprintf(out, "%6d ", num_iter); if (options.show_epoch) fprintf(out, "%10u ", epoch); fprintf(out, "%s%s", p[i]->txt, p[i]->dead ? " DEAD" : ""); /* if the process is being watched */ if ((p[i]->tid == options.watch_pid) || (options.watch_name && options.show_cmdline && strstr(p[i]->cmdline, options.watch_name)) || (options.watch_name && !options.show_cmdline && strstr(p[i]->name, options.watch_name))) fprintf(out, " <---"); fprintf(out, "\n"); num_printed++; } } if (num_printed) fprintf(out, "\n"); fflush(out); if (options.command_done && options.sticky) break; if ((num_dead) && (!options.sticky)) compact_proc_list(proc_list); /* Wait some delay. Note that this syscall may be interrupted when we receive a signal, such as SICHLD. This is ok, it will force a refresh. */ select(0, NULL, NULL, NULL, &tv); /* prepare for next select */ tv.tv_sec = options.delay; tv.tv_usec = (options.delay - tv.tv_sec) * 1000000.0; } free(header); } #ifdef HAVE_LIBCURSES /* Handle a key press. Assumes that a key has been pressed and is * ready to read (will block otherwise). * Return 1 if 'q' (quit). */ static int handle_key() { int c; c = getch(); if (c == 'q') ; /* nothing */ else if (c == 'g') options.debug = 1 - options.debug; else if (c == 'c') options.show_cmdline = 1 - options.show_cmdline; else if ((c == 'd') || (c == 's')) { mvprintw(2, 0, "Change delay from %.2f to: ", options.delay); echo(); nocbreak(); scanw("%f", &options.delay); if (options.delay < 0.01) options.delay = 1.0; tv.tv_sec = options.delay; tv.tv_usec = (options.delay - tv.tv_sec)*1000000.0; cbreak(); noecho(); } else if (c == 'H') { options.show_threads = 1 - options.show_threads; } else if (c == 'i') options.idle = 1 - options.idle; else if (c == 'K') { if (options.show_kernel) { options.show_kernel = 0; message = "Kernel mode Off"; } else { if ((options.euid == 0) || (options.paranoia_level < 2)) { options.show_kernel = 1; message = "Kernel mode On"; } else { message = "Kernel mode not available (not root and paranoia level too high)."; c = ' '; /* do not return the 'K' to the upper level, since it was ignored. */ } } } else if (c == 'k') { /* initialize string to 0s */ char str[10] = { 0 }; int kill_pid, kill_sig, kill_res; mvprintw(2, 0, "PID to kill: "); echo(); nocbreak(); getnstr(str, sizeof(str) - 1); if (!isdigit(str[0])) message = "Not valid"; else { kill_pid = atoi(str); mvprintw(2, 0, "Kill PID %d with signal [15]: ", kill_pid); getnstr(str, sizeof(str) - 1); kill_sig = atoi(str); if (kill_sig == 0) kill_sig = 15; kill_res = kill(kill_pid, kill_sig); if (kill_res == -1) { char tmp_message[100]; snprintf(tmp_message, sizeof(tmp_message), "Kill of PID '%d' with '%d' failed: %s", kill_pid, kill_sig, strerror(errno)); message = tmp_message; } } cbreak(); noecho(); } else if (c == 'p') { char str[100] = { 0 }; /* initialize string to 0s */ mvprintw(2, 0, "Only display process: "); echo(); nocbreak(); getnstr(str, sizeof(str)-1); /* keep final '\0' as string delimiter */ options.only_pid = atoi(str); if (options.only_name) { free(options.only_name); options.only_name = NULL; } if (!options.only_pid && strcmp(str, "")) { options.only_name = strdup(str); } cbreak(); noecho(); } else if (c == 'R') sorting_order = (enum sorting_order) (1 - (int)sorting_order); else if (c == 'S') options.sticky = 1 - options.sticky; else if (c == 'U') options.show_user = 1 - options.show_user; else if (c == 'u') { char str[100] = { 0 }; /* initialize string to 0s */ mvprintw(2, 0, "Which user (blank for all): "); echo(); nocbreak(); getnstr(str, sizeof(str) - 1); /* keep final '\0' as string delimiter */ cbreak(); noecho(); if (str[0] == '\0') /* blank */ options.watch_uid = -1; else if (isdigit(str[0])) options.watch_uid = atoi(str); else { struct passwd* passwd; passwd = getpwnam(str); if (passwd) options.watch_uid = passwd->pw_uid; else message = "User name does not exist."; } } else if (c == 'w') { char str[100] = { 0 }; /* initialize string to 0s */ mvprintw(2, 0, "Watch process: "); echo(); nocbreak(); getnstr(str, sizeof(str)-1); /* keep final '\0' as string delimiter */ options.watch_pid = atoi(str); if (options.watch_name) { free(options.watch_name); options.watch_name = NULL; } if (!options.watch_pid && strcmp(str, "")) { options.watch_name = strdup(str); } cbreak(); noecho(); } else if (c == 'h') options.help = 1 - options.help; else if (c == 'W') { if (export_screens(&options) < 0) message = ".tiptoprc not written: already exists in current directory?"; else message = ".tiptoprc written"; } else if (c == KEY_UP) scroll_up(); else if (c == KEY_PPAGE) scroll_page_up(); else if (c == KEY_DOWN) scroll_down(); else if (c == KEY_NPAGE) scroll_page_down(); else if (c == KEY_HOME) scroll_home(); else if (c == KEY_END) scroll_end(); return c; } /* Main execution loop in live mode. Builds the list of processes, * collects statistics, and prints using curses. Repeats after some * delay, also catching key presses. */ static int live_mode(struct process_list* proc_list, screen_t* screen) { WINDOW* help_win = NULL; WINDOW* error_win = NULL; fd_set fds; struct process** p; int num_iter = 0; int with_colors = 0; int pos; /* start curses */ initscr(); cbreak(); noecho(); keypad(stdscr, TRUE); /* Prepare help window */ help_win = prepare_help_win(screen); if (has_colors()) { /* initialize curses colors */ with_colors = 1; start_color(); use_default_colors(); init_pair(1, COLOR_GREEN, -1); /* processes under watch */ init_pair(2, COLOR_RED, -1); /* for dead processes */ } tv.tv_sec = 0; tv.tv_usec = 200000; /* 200 ms for first iteration */ header = gen_header(screen, &options, COLS - 1, active_col); pos = screen_pos(screen); for(num_iter=0; !options.max_iter || num_iter 0) && (COLS >= 37)) mvprintw(LINES-1, 30, "[errors]"); if ((options.config_file == 1) && (COLS >= 60)) mvprintw(0, COLS-60, "[conf]"); if ((options.euid == 0) && (COLS >= 54)) mvprintw(0, COLS-54, "[root]"); if ((options.watch_uid != -1) && (COLS >= 48)) mvprintw(0, COLS-48, "[uid]"); if ((options.only_pid || options.only_name) && (COLS >= 43)) mvprintw(0, COLS-43, "[pid]"); if (options.show_kernel && (COLS >= 38)) mvprintw(0, COLS-38, "[kernel]"); if (options.sticky && (COLS >= 30)) mvprintw(0, COLS-30, "[sticky]"); if (options.show_threads && (COLS >= 22)) mvprintw(0, COLS-22, "[threads]"); if (options.idle && (COLS >= 13)) mvprintw(0, COLS-13, "[idle]"); if (options.debug && (COLS >= 7)) mvprintw(0, COLS-7, "[debug]"); if (options.show_epoch && (COLS >= 18)) mvprintw(LINES-1, COLS-18, "Epoch: %u", time(NULL)); if (options.show_timestamp) mvprintw(LINES-1, 0, "Iteration: %u", num_iter); /* print main header */ if (with_colors) attron(A_REVERSE); mvprintw(3, 0, "%s", header); for(zz=strlen(header); zz < COLS-1; zz++) printw(" "); printw("\n"); if (with_colors) attroff(A_REVERSE); /* update the list of processes/threads and accumulate info if needed */ num_dead = update_proc_list(proc_list, screen, &options); if (!options.show_threads) accumulate_stats(proc_list); p = proc_list->proc_ptrs; /* prepare for select */ FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); /* generate the text version of all rows */ build_rows(proc_list, screen, COLS - 1); /* sort by %CPU */ qsort(p, proc_list->num_tids, sizeof(struct process*), sorting_fun); printed = 0; /* Iterate over all threads */ for(i=0; i < proc_list->num_tids; i++) { if (p[i]->skip) continue; /* highlight watched process, if any */ if (with_colors) { if (p[i]->dead) { attron(COLOR_PAIR(2)); } else if ((p[i]->tid == options.watch_pid) || (options.watch_name && options.show_cmdline && strstr(p[i]->cmdline, options.watch_name)) || (options.watch_name && !options.show_cmdline && strstr(p[i]->name, options.watch_name))) attron(COLOR_PAIR(1)); } if (options.show_threads || (p[i]->pid == p[i]->tid)) { printw("%s\n", p[i]->txt); printed++; } if (with_colors) attroff(COLOR_PAIR(1)); if (printed >= LINES - 5) /* stop printing at bottom of window */ break; } mvprintw(1, 0, "Tasks: %3d total, %3d displayed", proc_list->num_tids, printed); if (options.sticky) printw(", %3d dead", num_dead); /* print the screen name, make sure it fits, or truncate */ if (35 + 20 + 11 + strlen(screen->name) < COLS) { mvprintw(1, COLS - 11 - strlen(screen->name), "screen %2d: %s\n", pos, screen->name); } else if (COLS >= 35 + 20 + 11) { char screen_str[50] = { 0 }; snprintf(screen_str, sizeof(screen_str) - 1, "%s\n", screen->name); screen_str[COLS - 35 - 20 - 11] = '\0'; /* truncate */ mvprintw(1, 35+20, "screen %2d: %s", pos, screen_str); } /* print message if any */ if (message) { if (with_colors) attron(A_REVERSE); mvprintw(2, 0, "%s", message); if (with_colors) attroff(A_REVERSE); message = NULL; /* reset message */ } refresh(); /* display everything */ if (options.error) { if (options.error == 1) { options.error = 2; show_error_win(error_win, printed); } else show_error_win(error_win, -1); } if (options.help) show_help_win(help_win, screen); if ((num_dead) && (!options.sticky)) compact_proc_list(proc_list); /* wait some delay, or until a key is pressed */ num_fd = select(1 + STDIN_FILENO, &fds, NULL, NULL, &tv); if (num_fd > 0) { int c = handle_key(); if (c == 'q') break; if (c == '>') { if (active_col < screen->num_columns) active_col++; free(header); header = gen_header(screen, &options, COLS - 1, active_col); } if (c == '<') { if (active_col > -1) active_col--; free(header); header = gen_header(screen, &options, COLS - 1, active_col); } if (c == 'H') { if (options.show_threads) { reset_values(proc_list); message = "Show threads On"; } else message = "Show threads Off"; } if (c == 'U') { free(header); header = gen_header(screen, &options, COLS - 1, active_col); } if ((c == '+') || (c == '-') || (c == KEY_LEFT) || (c == KEY_RIGHT)) return c; if ((c == 'u') || (c == 'K') || (c == 'p')) /* need to rebuild tasks list */ return c; if (c == 'e') { if (options.error > 0) { options.error = 0; delwin(error_win); error_win = NULL; } else options.error = 1; } } tv.tv_sec = options.delay; tv.tv_usec = (options.delay - tv.tv_sec) * 1000000.0; } free(header); delwin(help_win); endwin(); /* stop curses */ return 'q'; } #endif /* HAVE_LIBCURSES */ int main(int argc, char* argv[]) { char* path_to_config; char* path_to_errors; int is_batch_mode; int key = 0; int list_scr = 0; struct process_list* proc_list; screen_t* screen = NULL; int screen_num = 0; int q; int paranoia_level; uid_t euid; /* Check OS to make sure we can run. */ paranoia_level = check(); /* then, drop super powers, if any. */ euid = init_drop_privilege(); init_options(&options); options.paranoia_level = paranoia_level; options.euid = euid; path_to_config = get_path_to_config(argc, argv); path_to_errors = get_path_to_error(argc, argv); is_batch_mode = get_batch_mode(argc, argv); init_errors(is_batch_mode, path_to_errors); q = read_config(path_to_config, &options); if (q == 0) { debug_printf("Config file successfully parsed.\n"); options.config_file = 1; } else debug_printf("Could not parse config file.\n"); /* Parse command line arguments. */ parse_command_line(argc, argv, &options, &list_scr, &screen_num); /* Add default screens */ if (options.default_screen == 1) init_screen(); /* Remove unused but declared counters */ tamp_counters(); if (list_scr) { list_screens(); delete_screens(); exit(0); } if (options.spawn_pos) { /* monitor only spawned process */ int child = spawn(argv + options.spawn_pos); options.only_pid = child; options.idle = 1; } do { if (screen_num >= 0) screen = get_screen(screen_num); else screen = get_screen_by_name(argv[-screen_num]); if (!screen) { fprintf(stderr, "No such screen.\n"); exit(EXIT_FAILURE); } /* initialize the list of processes, and then run */ proc_list = init_proc_list(); if (options.spawn_pos) { options.spawn_pos = 0; /* do this only once */ new_processes(proc_list, screen, &options); start_child(); } if (options.batch) { batch_mode(proc_list, screen); key = 'q'; } #ifdef HAVE_LIBCURSES else { key = live_mode(proc_list, screen); if ((key == '+') || (key == KEY_RIGHT)) { screen_num = (screen_num + 1) % get_num_screens(); active_col = 0; done_proc_list(proc_list); free(header); } if ((key == '-') || (key == KEY_LEFT)) { int n = get_num_screens(); screen_num = (screen_num + n - 1) % n; active_col = 0; done_proc_list(proc_list); free(header); } if ((key == 'u') || (key == 'K') || (key == 'p')) { done_proc_list(proc_list); } } #endif } while (key != 'q'); /* done, free memory (makes valgrind happy) */ close_error(); delete_screens(); done_proc_list(proc_list); free_options(&options); return 0; } tiptop-2.3/src/error.h0000644001151100706620000000125012547160067011721 00000000000000/* * This file is part of tiptop. * * Author: Antoine NAUDIN * Copyright (c) 2012 Inria * * License: GNU General Public License version 2. * */ #ifndef _ERROR_H #define _ERROR_H #include #ifdef HAVE_LIBCURSES #include WINDOW* prepare_error_win(int nb_tids); void show_error_win(WINDOW* win, int nb_proc); void scroll_up(void); void scroll_down(void); void scroll_page_up(void); void scroll_page_down(void); void scroll_home(void); void scroll_end(void); #endif /* HAVE_LIBCURSES */ void init_errors(int batch_mode, const char* error_file_name); void error_printf(char* fmt, ...); void close_error(); int num_errors(); #endif /* _ERROR_H */ tiptop-2.3/src/utils-expression.h0000644001151100706620000000147512547160067014136 00000000000000/* * This file is part of tiptop. * * Author: Antoine NAUDIN * Copyright (c) 2012 Inria * * License: GNU General Public License version 2. * */ #ifndef _UTILS_EXPRESSION_H #define _UTILS_EXPRESSION_H #include #include "formula-parser.h" #include "process.h" operation* alloc_operation(); expression* alloc_expression(); unit* alloc_unit(); void free_expression (expression* e); void free_unit(unit* u); void free_operation(operation* p); void parcours_expression(expression* e); int build_expression(expression* e, FILE* fd); expression* parser_expression (char* txt); double evaluate_column_expression(expression* e, counter_t* c, int nbc, struct process* p, int* error); uint64_t evaluate_counter_expression(expression* e, int* error); #endif /* _UTILS_EXPRESSION_H */ tiptop-2.3/src/debug.h0000644001151100706620000000053612547160067011664 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012 Inria * * License: GNU General Public License version 2. * */ #ifndef _DEBUG_H #define _DEBUG_H #include #ifdef ENABLE_DEBUG void debug_printf(char* fmt, ...); #else #define debug_printf(...) #endif /* ENABLE_DEBUG */ #endif /* _DEBUG_H */ tiptop-2.3/src/version.h0000644001151100706620000000037512547160067012264 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012 Inria * * License: GNU General Public License version 2. * */ #ifndef _VERSION_H #define _VERSION_H void print_version(void); void print_legal(void); #endif tiptop-2.3/src/Makefile.in0000644001151100706620000000534612547160067012476 00000000000000# @configure_input@ package = @PACKAGE_NAME@ version = @PACKAGE_VERSION@ tarname = @PACKAGE_TARNAME@ distdir = $(tarname)-$(version) prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ datarootdir = @datarootdir@ mandir = @mandir@ man1dir = $(mandir)/man1 # VPATH-specific substitution variables srcdir= @srcdir@ VPATH = @srcdir@ CC = @CC@ LIBS = @LIBS@ CFLAGS = @CFLAGS@ -I.. CPPFLAGS = @CPPFLAGS@ INSTALL = @INSTALL@ LEX = @LEX@ YACC = @YACC@ OBJS=tiptop.o pmc.o process.o requisite.o conf.o screen.o \ debug.o version.o helpwin.o options.o hash.o spawn.o \ xml-parser.o target.o utils-expression.o priv.o \ error.o lex.yy.o y.tab.o all: tiptop tiptop: $(OBJS) $(CC) $(LDFLAGS) -o tiptop $(OBJS) $(LIBS) rm -f ptiptop ln tiptop ptiptop Makefile: Makefile.in ../config.status cd .. && ./config.status src/$@ ../config.status: ../configure cd .. && ./config.status --recheck version.o: version.c $(CC) $(CFLAGS) -DCOMPILE_HOST="\""`hostname`"\"" \ -DCOMPILE_DATE="\"`date`\"" \ -c $(srcdir)/version.c lex.yy.c: calc.lex $(LEX) $(srcdir)/calc.lex lex.yy.o: lex.yy.c $(CC) $(CFLAGS) -I$(srcdir) -c lex.yy.c y.tab.c y.tab.h: calc.y $(YACC) -d $(srcdir)/calc.y y.tab.o: y.tab.c $(CC) $(CFLAGS) -I$(srcdir) -c y.tab.c install: $(INSTALL) -d $(DESTDIR)$(bindir) $(INSTALL) -m 0755 tiptop $(DESTDIR)$(bindir) $(INSTALL) -d $(DESTDIR)$(man1dir) $(INSTALL) -m 0644 tiptop.1 $(DESTDIR)$(man1dir) ln $(DESTDIR)$(bindir)/tiptop $(DESTDIR)$(bindir)/ptiptop ln $(DESTDIR)$(man1dir)/tiptop.1 $(DESTDIR)$(man1dir)/ptiptop.1 uninstall: -rm $(DESTDIR)$(bindir)/tiptop -rm $(DESTDIR)$(bindir)/ptiptop -rm $(DESTDIR)$(man1dir)/ptiptop.1 -rm $(DESTDIR)$(man1dir)/tiptop.1 clean: /bin/rm -f $(OBJS) lex.yy.c y.tab.c y.tab.h tiptop ptiptop depend: makedepend -Y *.c .PHONY: all clean depend install uninstall # DO NOT DELETE conf.o: conf.h options.h screen.h utils-expression.h conf.o: process.h xml-parser.h error.o: error.h hash.o: hash.h process.h screen.h options.h options.o: options.h version.h pmc.o: pmc.h process.o: error.h hash.h process.h screen.h options.h pmc.h process.o: spawn.h requisite.o: pmc.h requisite.h screen.o: conf.h options.h screen.h process.h screen.o: utils-expression.h error.h spawn.o: options.h process.h screen.h spawn.h target-x86.o: screen.h options.h target.h target.o: target.h tiptop.o: conf.h options.h screen.h debug.h error.h tiptop.o: helpwin.h pmc.h process.h requisite.h spawn.h utils-expression.h utils-expression.o: process.h screen.h options.h utils-expression.o: utils-expression.h y.tab.h version.o: version.h lex.yy.o: utils-expression.h y.tab.h y.tab.o: utils-expression.h formula-parser.h tiptop-2.3/src/options.h0000644001151100706620000000271512547160067012272 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012, 2013, 2015 Inria * * License: GNU General Public License version 2. * */ #ifndef _OPTIONS_H #define _OPTIONS_H #include #include /* global state */ struct option { int spawn_pos; float delay; float cpu_threshold; /* CPU activity below which a thread is considered inactive */ int max_iter; char* only_name; int only_pid; int paranoia_level; char* watch_name; pid_t watch_pid; int watch_uid; uid_t euid; /* effective user ID of tiptop */ FILE* out; unsigned int batch : 1; unsigned int command_done : 1; unsigned int config_file : 1; unsigned int debug : 1; unsigned int default_screen : 1; unsigned int help : 1; unsigned int error : 2; unsigned int idle : 1; unsigned int no_collect : 1; unsigned int show_cmdline : 1; unsigned int show_epoch : 1; unsigned int show_kernel : 1; unsigned int show_threads : 1; unsigned int show_timestamp : 1; unsigned int show_user : 1; unsigned int sticky : 1; }; void init_options(struct option* opt); char* get_path_to_config(int argc, char* argv[]); char* get_path_to_error(int argc, char* argv[]); int get_batch_mode(int argc, char* argv[]); void parse_command_line(int argc, char* argv[], struct option* const,int*,int*); void free_options(struct option* options); #endif /* _OPTIONS_H */ tiptop-2.3/src/requisite.c0000644001151100706620000000374712547160067012612 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2013, 2014 Inria * * License: GNU General Public License version 2. * */ #include #include #include #include #include #include "pmc.h" #include "requisite.h" #define PARANOID1 "/proc/sys/kernel/perf_counter_paranoid" #define PARANOID2 "/proc/sys/kernel/perf_event_paranoid" int check() { int fd, cpu, grp, flags, pid; FILE* paranoid; int paranoia_level = 999; struct utsname os; struct STRUCT_NAME events = {0, }; int n; paranoid = fopen(PARANOID1, "r"); if (!paranoid) paranoid = fopen(PARANOID2, "r"); if (!paranoid) { fprintf(stderr, "System does not support performance events.\n"); fprintf(stderr, "File '/proc/sys/kernel/perf_*_paranoid' is missing.\n"); exit(EXIT_FAILURE); } n = fscanf(paranoid, "%d", ¶noia_level); if (n != 1) { fprintf(stderr, "Could not read '/proc/sys/kernel/perf_*_paranoid'.\n"); fprintf(stderr, "Trying to proceed anyway...\n"); } fclose(paranoid); events.disabled = 0; events.exclude_hv = 1; events.exclude_kernel = 1; /* try basic event: cycles */ events.type = PERF_TYPE_HARDWARE; events.config = PERF_COUNT_HW_CPU_CYCLES; cpu = -1; /* CPU to monitor, -1 = per thread */ grp = -1; flags = 0; pid = 0; /* self */ fd = perf_event_open(&events, pid, cpu, grp, flags); if (fd == -1) { perror("syscall"); fprintf(stderr, "Could not perform syscall.\n"); uname(&os); if (strcmp(os.sysname, "Linux") != 0) { fprintf(stderr, "Is this OS a Linux (OS identifies itself as '%s').\n", os.sysname); } else if (strcmp(os.release, "2.6.31") < 0) { /* lexicographic order */ fprintf(stderr, "Linux 2.6.31+ is required, OS reports '%s'.\n", os.release); } else { fprintf(stderr, "Don't know why...\n"); } exit(EXIT_FAILURE); } close(fd); return paranoia_level; } tiptop-2.3/src/pmc.c0000644001151100706620000000132312547160067011343 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012, 2014, 2015 Inria * * License: GNU General Public License version 2. * */ #define _GNU_SOURCE /* for syscall */ #include #include #include #include #include "pmc.h" long perf_event_open(struct STRUCT_NAME *hw_event, pid_t pid, int cpu, int group_fd, unsigned long flags) { int ret; ret = syscall(SYSCALL_NUM, hw_event, pid, cpu, group_fd, flags); #if defined(__x86_64__) || defined(__i386__) if ( ret < 0 && ret > -4096 ) { errno = -ret; ret = -1; } #endif return ret; } tiptop-2.3/src/calc.lex0000644001151100706620000000236712547160067012045 00000000000000/* * This file is part of tiptop. * * Author: Antoine NAUDIN * Copyright (c) 2012, 2014 Inria * * License: GNU General Public License version 2. * */ %{ #include #include #include "formula-parser.h" #include "y.tab.h" /* Do not read from stdin, but from a string. my_yyinput takes care of filling in the buffer */ #undef YY_INPUT int my_yyinput(char*, int); #define YY_INPUT(t,r,m) (r = my_yyinput(t,m)) %} blank [ \t\n]+ letter [A-Za-z] base16 0x[0-9A-Fa-f]+ exponent [eE][+-]?[0-9]+ word [A-Za-z]([A-Za-z0-9]|_)* constant [0-9]+("."[0-9]+)?{exponent}?|{base16} %% {blank} { /* ignored */ } "delta" return DELTA; "and" return AND; "or" return OR; "shr" return SHR; "shl" return SHL; "|" return OR; "+" return ADD; "-" return SUB; "*" return MUL; "/" return DIV; "^" return POWER; "(" return B_LEFT; ")" return B_RIGHT; {base16} { yylval.txt = strdup(yytext); return BASE16; } {constant} { yylval.txt = strdup(yytext); return NUMBER; } {word} { yylval.txt = strdup(yytext); return COUNTER; } %% int yywrap(void) { return 1; } int yyerror(char *s) { printf("error: %s at '%s'\n", s, yytext); return 0; } tiptop-2.3/src/xml-parser.c0000644001151100706620000001451612547160067012666 00000000000000/* * This file is part of tiptop. * * Author: Antoine NAUDIN * Copyright (c) 2012, 2013 Inria * * License: GNU General Public License version 2. * */ /* * This file is dedicated to parse the configuration file * */ #include "config.h" #if HAVE_LIBXML2 #include #include #include #include "error.h" #include "options.h" #include "screen.h" #include "target.h" #include "xml-parser.h" static void option_update(xmlChar* name, xmlChar* val, struct option* opt); static void parse_options(xmlNodePtr cur, struct option* opt); static void parse_screen(xmlNodePtr cur); static void parse_counters(screen_t* s, xmlNodePtr cur); static void parse_columns(screen_t* s, xmlNodePtr cur); /* * Filling structures */ static void option_update(xmlChar* name, xmlChar* val, struct option* opt) { if(!xmlStrcmp(name, (const xmlChar *) "delay")) { opt->delay = (float)atof((const char*)val); } if(!xmlStrcmp(name, (const xmlChar *) "cpu_threshold")) { opt->cpu_threshold = (float)atof((char*)val); } if(!xmlStrcmp(name, (xmlChar *) "show_cmdline")) opt->show_cmdline = (opt->show_cmdline || atoi((char*)val)); if(!xmlStrcmp(name, (xmlChar *) "show_epoch")) opt->show_epoch = (opt->show_epoch || atoi((char*)val)); if(!xmlStrcmp(name, (xmlChar *) "show_kernel")) opt->show_kernel = (opt->show_kernel || atoi((char*)val)); if(!xmlStrcmp(name, (xmlChar *) "show_user")) opt->show_user = atoi((char*)val); if(!xmlStrcmp(name, (xmlChar *) "debug")) opt->debug = (opt->debug || atoi((char*)val)); if(!xmlStrcmp(name, (xmlChar *) "watch_uid")) opt->watch_uid = (opt->watch_uid || atoi((char*)val)); if(!xmlStrcmp(name, (xmlChar *) "watch_name")) opt->watch_name = strdup((char*)val); if(!xmlStrcmp(name, (xmlChar *) "max_iter")) opt->max_iter = atoi((char*)val); if(!xmlStrcmp(name, (xmlChar *) "show_timestamp")) opt->show_timestamp = (opt->show_timestamp || atoi((char*)val)); if(!xmlStrcmp(name, (xmlChar *) "show_threads")) { opt->show_threads = atoi((char*)val); } if(!xmlStrcmp(name, (const xmlChar *) "idle")) opt->idle = atoi((const char*)val); if(!xmlStrcmp(name, (const xmlChar *) "sticky")) opt->sticky = atoi((const char*)val); } /* * Parser */ static void parse_screen(xmlNodePtr cur) { char *desc=NULL, *name=NULL; screen_t* s; name = (char*)xmlGetProp(cur,(xmlChar*) "name"); desc = (char*)xmlGetProp(cur,(xmlChar*) "desc"); if (name == NULL || strlen(name) == 0) s = new_screen( "(no name)", desc, 0); else s = new_screen(name, desc, 0); cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"column"))) parse_columns(s, cur); else if ((!xmlStrcmp(cur->name, (const xmlChar *)"counter"))) parse_counters(s, cur); cur = cur->next; } xmlFree(desc); xmlFree(name); } static void parse_columns(screen_t* s, xmlNodePtr cur) { char *header=NULL, *format=NULL, *desc=NULL, *expr=NULL; header = (char*) xmlGetProp(cur, (xmlChar*) "header"); if(!header || strlen(header) == 0){ error_printf("Need a header for a column in screen '%s'\n", s->name); goto end; } format = (char*) xmlGetProp(cur, (xmlChar*) "format"); if(!format || strlen(header) == 0){ error_printf("Need a format for column '%s' in screen '%s'\n", header, s->name); goto end; } expr = (char*) xmlGetProp(cur, (xmlChar*) "expr"); if(!expr){ error_printf("Need an expression for column '%s' in screen '%s'\n", header, s->name); goto end; } desc = (char*) xmlGetProp(cur, (xmlChar*) "desc"); /* Save column in tiptop struct "screen_t" */ add_column(s, header, format, desc, expr); end: if(header) free(header); if(format) free(format); if(desc) free(desc); if(expr) free(expr); } static void parse_counters(screen_t* s, xmlNodePtr cur) { char *alias = NULL, *config = NULL, *type = NULL, *arch = NULL, *model = NULL; alias = (char*)xmlGetProp(cur,(xmlChar*) "alias"); if (!alias) { /* no alias, cannot be referenced, hence useless */ error_printf("Need a alias for a counter in screen '%s'\n", s->name); goto end; } config = (char*)xmlGetProp(cur,(xmlChar*) "config"); if (!config) { /* cannot be a valid counter without 'config' */ error_printf("Need a config for counter '%s' in screen '%s'\n", alias, s->name); goto end; } arch = (char*)xmlGetProp(cur,(xmlChar*) "arch"); if (arch && !match_target((char*)arch)){ error_printf("Skipping counter '%s' in screen '%s' (arch mismatch)\n", alias, s->name); goto end; } model = (char*)xmlGetProp(cur,(xmlChar*) "model"); if (model && !match_model((char*)model)){ error_printf("Skipping counter '%s' in screen '%s' (model mismatch)\n", alias, s->name); goto end; } type = (char*)xmlGetProp(cur, (xmlChar*) "type"); /* Save column in tiptop struct "column_t" */ add_counter(s, alias, config, type); end: if (alias) free(alias); if (config) free(config); if (type) free(type); if (model) free(model); if (arch) free(arch); } static void parse_options(xmlNodePtr cur, struct option* opt) { xmlChar *name, *val; cur = cur->xmlChildrenNode; while (cur != NULL) { name = xmlGetProp(cur, (xmlChar*)"name"); val = xmlGetProp(cur, (xmlChar*)"value"); if (name != NULL && val != NULL) option_update(name, val, opt); xmlFree(val); xmlFree(name); cur = cur->next; } } /* Main function*/ int parse_doc(char* file, struct option* opt) { xmlDocPtr doc; xmlNodePtr cur; doc = xmlParseFile(file); if (doc == NULL) { error_printf("Could not parse config file.\n"); return -1; } cur = xmlDocGetRootElement(doc); if (cur == NULL) { error_printf("Empty document\n"); xmlFreeDoc(doc); return -1; } if (xmlStrcmp(cur->name, (const xmlChar *) "tiptop")) { error_printf("Wrong document type: root node != \n"); xmlFreeDoc(doc); return -1; } cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"options"))) parse_options (cur, opt); if ((!xmlStrcmp(cur->name, (const xmlChar *)"screen"))) parse_screen (cur); cur = cur->next; } xmlFreeDoc(doc); return 0; } #endif /* HAVE_LIBXML2 */ tiptop-2.3/src/tiptop.10000644001151100706620000003371012547160067012026 00000000000000.TH TIPTOP 1 "February 2013" "Linux" "Inria" .ds ME \fBtiptop\fR .ds PM \fBptiptop\fR .ds Me tiptop .ds Pm ptiptop .SH NAME tiptop \- display hardware performance counters for Linux tasks .SH SYNOPSIS \*(ME [OPTION] \*(ME [OPTION] -- command (EXPERIMENTAL) \*(PM PATTERN [OPTIONS] .SH DESCRIPTION The \*(ME program provides a dynamic real-time view of the tasks running in the system. \*(Me is very similar to top (1), but the information displayed comes from hardware counters. \*(Me has two running \fImodes\fR: live-mode and batch-mode. In both modes, the system is periodically queried for the values of hardware counters, and various ratios are printed for each task. In live-mode, the display is regularly updated with new values at constant time intervals. In batch-mode, the same information is emitted to stdout. Batch-mode is appropriate for saving to a file or for further processing. No interaction is possible in batch-mode. Unless \*(Me is run by root, or the executable is setuid-root, a user can only monitor the tasks it owns. The results produced by \*(Me are organized in \fIscreens\fR. A screen consists in rows representing tasks, and columns reporting various values and ratios collected from hardware counters. Many screens can be defined. Only one screen is displayed at a time. The default screen (number 0) reports target independent values as defined in the file /usr/include/linux/event_counter.h. Other screens may rely on target-dependent counters. When an expression would result in a division by zero, a '-' sign is printed. When a counter involved in an expression could not be read, a '?' sign is printed. If -- appears in the command line, \*(Me treats the rest of the line as a command. A new process is forked, and hardware counters are attached just before execvp is called. This makes it possible to trace an application from the first instruction. Only the child is traced, and idle-mode is enabled (in live mode, this can be overridden by hitting keys 'p' and 'i'). This is commonly used in combination with sticky mode to track a command from start to finish. This is experimental! \*(Pm is simply a shortcut for tiptop \-p. \*(Me requires Linux 2.6.31+. .SH COMMAND-LINE OPTIONS Command line options with a parameter override values specified in the configuration file. Toggles set the value or invert the value read in the configuration file (if any). .TP 4 \-\fBb\fR Start \*(Me in batch-mode. Output is sent to stdout, and no interactive command is accepted. \*(Me will run forever, or until the number of iterations specified by \fB-n\fR. .TP 4 \-\fBc\fR display the command line of the task instead of its name. (toggle) .TP 4 \-\-\fBcpu\-min\fR VALUE %CPU activity threshold. Below this value, a task is considered idle and is not reported (unless idle-mode is on, see flag -i). .TP 4 \-\fBd\fR VALUE Specify the delay between refreshes. VALUE can be fractional. It must be larger than 0.01. .TP 4 \-\fBE\fR FILENAME Specify file where errors are logged. By default errors are logged to stderr in batch-mode, and a temporary file in live-mode. .TP 4 \-\-\fBepoch\fR Print the Epoch at each refresh. In batch-mode, it is printed at the beginning of each row. In live-mode, it is at the bottom of the display. (toggle) .TP 4 \-\fBh \-\-help\fR Print a brief help message and exit. .TP 4 \-\fBH\fR Show threads. (toggle) .TP 4 \-\fBi\fR Show idle tasks. (toggle) .TP 4 \-\fBK \-\-kernel\fR Include kernel activity in the reported values. This is only possible is the user is root, the \*(Me executable is setuid root, or the paranoia level is low enough. (toggle) .nf See file /proc/sys/kernel/perf_event_paranoid (perf_counter_paranoid on Linux 2.6.31). .fi .TP 4 \-\-\fBlist\-screens\fR List available screens and exit. .TP 4 \-\fBn\fR VALUE Automatically exit after VALUE iterations. .TP 4 \-\-\fBno\-collect\fR By default, when the maximum number of open files is reached, and new processes appear, \*(Me searches for idle processes and closes the files in order to make room for the new ones. This flag disables this behavior: in case of file shortage, new processes will not get more chances than older ones. .TP 4 \-\fBo\fR FILENAME Specify the filename for the output of batch mode. .TP 4 \-\-\fBonly\-conf\fR Only screens defined in configuration file displayed (no default). .TP 4 \-\fBp \-\-pid\fR VALUE Filters processes according to VALUE. VALUE can be either the numeric value PID, or a string. In case of a string, all tasks whose names or command lines (depending on the display, see \-c) contain VALUE are reported. .TP 4 \-\fBS\fR VALUE Start \*(Me with screen number VALUE if VALUE is an integer. Otherwise looks for the first screen whose name contains VALUE. .TP 4 \-\-\fBsticky\fR Start in sticky mode: tasks stay in the list after they die. In live-mode, they appear in a different color (when supported). In batch-mode, the word DEAD is appended. (toggle) .TP 4 \-\-\fBtimestamp\fR Print a timestamp at the beginning of each row. The timestamp is the number of refreshes so far. In batch-mode, it is printed at the beginning of each row. In live-mode, it is at the bottom of the display. (toggle) .TP 4 \-\fBu\fR USER Only show tasks owned by USER. USER can be either a login name, or the numeric value UID. .TP 4 \-\fBU\fR Show the owner of each task. (toggle) .TP 4 \-\fBv\fR Display build information and exit. .TP 4 \-\-\fBversion\fR Display version information and disclaimer and exit. .TP 4 \-\fBw\fR VALUE Watch the task specified by VALUE. VALUE can be either the numeric value PID, or a string. In case of a string, all tasks whose names or command lines (depending on the display, see \-c) contain VALUE are reported. In live-mode, watched tasks are shown in a different color (when supported). In batch-mode, an ASCII arrow points to the watched tasks. .TP 4 \-\fBW\fR PATH Directory where the configuration file is located. .SH INTERACTIVE COMMANDS In live-mode, \*(Me accepts single-key commands. .TP 4 \fBLEFT\fR, \fBRIGHT\fR Rotate through available screens. .TP 4 \fB<\fR, \fB>\fR Change the reference column for sorting to the left or to the right. .TP 4 \fBc\fR Toggle between showing task names and command lines. .TP 4 \fBd\fR Change the refresh interval. The new value is queried. Fractional values larger than 0.01 are accepted. .TP 4 \fBe\fR Display the errors encoutered so far. Scroll with UP, DOWN, PAGE_UP, PAGE_DOWN, HOME and END. .TP 4 \fBh\fR Display a brief description of the screen and each column. .TP 4 \fBH\fR Toggle between showing individual threads and accumulating values per process. .TP 4 \fBi\fR Toggle between showing only active tasks and showing also idle tasks. .TP 4 \fBK\fR Toggle between showing kernel activity and only user activity. Kernel mode is only available to root. Switching to and from kernel mode resets all counters. .TP 4 \fBk\fR Kill a process. The user is asked for the PID, and the signal to send. .TP 4 \fBp\fR Filter tasks by name or PID. The user is asked for a PID or string. In case a string is entered, only the tasks whose name or command line contain the string are displayed. Changing the filter resets all counters. .TP 4 \fBq\fR Quit. .TP 4 \fBR\fR Change sorting order: ascending or descending. .TP 4 \fBS\fR Toggle sticky mode. .TP 4 \fBs\fR Same as d. .TP 4 \fBu\fR Filter tasks by user. The user name or PID is queried. Note that, unless \*(Me is run by root or setuid root, tasks owned by somebody else cannot be monitored. Changing the filter resets all counters. .TP 4 \fBU\fR Toggle displaying each task's owner. .TP 4 \fBw\fR Used to track a particular task. The user is asked for a PID or string. In case a string is entered, all tasks whose name or command line contain the string are highlighted. .TP 4 \fBW\fR Writes a configuration file for the current state in the current directory. .SH FILES During startup, \*(ME attempts to read a configuration file. The file must be named \fB.tiptoprc\fR. This file is first searched in the current directory, then in the directory defined by the environment variable \fBTIPTOP\fR if it exists, finally in the user's home. .SS Syntax The file is structured in XML. The syntax is as follows. .IP "Root of tree" The root of the xml tree is tiptop. ... .IP "Options" Options can be specified on an block. Recognized options listed below, with their corresponding command line option. cpu_threshold (\-\-cpu\-min), delay (\-d), idle (\-i), max_iter (\-n), show_cmdline (\-c), show_epoch (\-\-epoch), show_kernel (\-K), show_timestamp (\-\-timestamp), show_threads (\-H), show_user (\-U), watch_name (\-w), sticky (\-\-sticky), watch_uid (\-w) .IP "Screens" Screens are defined inside a block. A screen is made of counters and columns. A screen has a name and an optional description. .... Counters must provide an alias (used for further reference) and a configuration. The configuration is either a predefined value, or the actual value that must be provided to the perf_even_open system call (typically found in vendor architecture manuals). Predefined values are: CPU_CYCLES, INSTRUCTIONS, CACHE_REFERENCES, CACHE_MISSES, BRANCH_INSTRUCTIONS, BRANCH_MISSES, and BUS_CYCLES. .nf .fi For non-predefined configs, a type must be provided. Currently, only RAW and HW_CACHE are supported. Optionally, a counter may be restricted to a specific architecture (such as "x86"), and a model. The definition of the model is architecture-dependent. For x86, it is defined as DisplayFamily_DisplayModel as computed by the instruction CPUID. A counter for issued micro-ops on Sandy Bridge may look like the following: .nf .fi For the x86 architecture, a single counter can be valid for several models. .nf .fi When the type is HW_CACHE, the config is specified by shifting and ORing predefined values. The 8 least significant bits represent the cache level (possible values L1D, L1I, LL, DTLB, ITLB, BPU). The next 8 bits represent the type of access (OP_READ, OP_WRITE, OP_PREFETCH). The last 8 bits represent are one of RESULT_ACCESS or RESULT_MISS. Note that "shift left" is expressed as shl (the usual << does not fit well in xml). .nf .fi See also /usr/include/linux/perf_events.h for more on config and type. A column defines its header, the printf-like format for values, and an expression. Expressions evaluate as double precision. A description is optional. .nf .fi The syntax of expressions supports basic arithmetic (+ - * / parentheses and constants). The special notation "delta(counter)" evaluates as the variation of the counter between refreshes. Expressions can also refer to predefined variables such as CPU_TOT (CPU usage), CPU_SYS (system CPU usage), CPU_USER (user CPU usage), PROC_ID (processor where the process was last seen). .nf .fi .IP "Sample config file" .nf .fi .SH CAVEATS \*(Me does not seem to work within a virtualized environment. Attaching counters to processes may fail for various reasons, such as asking for more than available in hardware (\*(Me does not implement sampling), or reaching the maximum number of open files. In these cases, you may consider filtering the processes (see flags \-u, \-p). To mitigate the limitation of the maximum number of open files, \*(Me tries to close the events attached to idle processes. If this is a problem, see the flag --no-collect. .SH BUGS Send bug reports to: Erven Rohou .SH AUTHOR Written by Erven Rohou. .SH SEE ALSO .BR top (1), .BR ps (1) .nf /usr/include/linux/perf_counter.h (Linux 2.6.31) /usr/include/linux/event_counter.h (Linux 2.6.32+) .fi tiptop-2.3/src/xml-parser.h0000644001151100706620000000063312547160067012666 00000000000000/* * This file is part of tiptop. * * Author: Antoine NAUDIN * Copyright (c) 2012 Inria * * License: GNU General Public License version 2. * */ #ifndef _XML_PARSER_H #define _XML_PARSER_H #include "config.h" #ifdef HAVE_LIBXML2 #include #include "options.h" #include "screen.h" int parse_doc(char* file, struct option* op); #endif /* HAVE_XML2 */ #endif /* _XML_PARSER_H */ tiptop-2.3/src/helpwin.c0000644001151100706620000000366412547160067012244 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012, 2015 Inria * * License: GNU General Public License version 2. * */ #include #ifdef HAVE_LIBCURSES #include #include #include "helpwin.h" #include "screen.h" #include "target.h" /* One line for screen column, 2 lines for the borders, 1 line for the target description. */ WINDOW* prepare_help_win(screen_t* screen) { WINDOW* win; int n = screen->num_columns; /* in case we have more lines than rows on the display, limit the amount of text we print. */ if (n+4 > LINES) n = LINES - 4; win = newwin(n+4, 70, LINES - n - 4, 5); clearok(win, TRUE); return win; } void show_help_win(WINDOW* win, screen_t* screen) { int i, header_width = 0; char fmt[20] = { 0 }; char msg[100] = { 0 }; int n = screen->num_columns; /* in case we have more lines than rows on the display... */ if (n+3 > LINES) n = LINES - 3; box(win, 0, 0); mvwprintw(win, 0, 10, " Help (h to close)"); /* target-dependent message */ target_dep_string(msg, sizeof(msg)); if (has_colors()) wattron(win, A_REVERSE); mvwprintw(win, 1, 1, "%s", msg); if (has_colors()) wattroff(win, A_REVERSE); /* screen description */ mvwprintw(win, 2, 1, screen->desc); /* max size of column headers */ for(i = 0; i < n; i++) { /* strip leading spaces, display looks better this way */ char* ptr = screen->columns[i].header; while (*ptr == ' ') ptr++; if (strlen(ptr) > header_width) header_width = strlen(ptr); } /* generate sprintf format for headers */ snprintf(fmt, sizeof(fmt) - 1, "%%-%ds: %%s", header_width); for(i = 0; i < n; i++) { /* strip leading spaces */ char* ptr = screen->columns[i].header; while (*ptr == ' ') ptr++; mvwprintw(win, i+3, 1, fmt, ptr, screen->columns[i].description); } wrefresh(win); } #endif /* HAVE_LIBCURSES */ tiptop-2.3/src/requisite.h0000644001151100706620000000052612547160067012607 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2013 Inria * * License: GNU General Public License version 2. * */ #ifndef _REQUISITE_H #define _REQUISITE_H /* Try to monitor myself to see if things work. Print warning and exit if not ok. If ok, return paranoia level. */ int check(void); #endif tiptop-2.3/src/spawn.h0000644001151100706620000000056312547160067011726 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012, 2013 Inria * * License: GNU General Public License version 2. * */ #ifndef _SPAWN_H #define _SPAWN_H #include #include "options.h" int spawn(char** argv); void start_child(void); void wait_for_child(pid_t pid, struct option* options); #endif /* _SPAWN_H */ tiptop-2.3/src/error.c0000644001151100706620000000743212547160067011724 00000000000000/* * This file is part of tiptop. * * Author: Antoine NAUDIN * Copyright (c) 2012 Inria * * License: GNU General Public License version 2. * */ #include #ifdef HAVE_LIBCURSES #include #endif #include #include #include #include #include #include "error.h" static FILE* error_file = NULL; static int nb_error = 0; static int scroll_ = 0; static int win_height; int num_errors() { return nb_error; } void close_error() { if (error_file) fclose(error_file); } void init_errors(int batch_mode, const char* error_file_name) { /* if provided, use specified file name */ if (error_file_name) { error_file = fopen(error_file_name, "w+"); if (!error_file) { perror("fopen"); fprintf(stderr, "Could not open file '%s'.\n", error_file_name); } } /* if not provided, or opening failed, second best choice depends on running mode */ if (!error_file) { if (batch_mode) error_file = stderr; else { error_file = tmpfile(); if (!error_file) { perror("tmpfile"); fprintf(stderr, "Could not create tmp file for errors.\n"); } } } } void error_printf(char* fmt, ...) { va_list args; nb_error++; if (!error_file) return; va_start(args, fmt); vfprintf(error_file, fmt, args); } #ifdef HAVE_LIBCURSES void scroll_up() { if (scroll_ > 0) scroll_--; } void scroll_down() { if (scroll_ < nb_error - 1) scroll_++; } void scroll_page_up() { scroll_ -= (win_height - 4); if (scroll_ < 0) scroll_ = 0; } void scroll_page_down() { scroll_ += (win_height - 4); if (scroll_ > nb_error - 1) scroll_ = nb_error - 1; } void scroll_home() { scroll_ = 0; } void scroll_end() { scroll_ = nb_error - (win_height - 5); if (scroll_ < 0) scroll_ = 0; } WINDOW* prepare_error_win(int nb_tids) { WINDOW* we; win_height = LINES - nb_tids - 5; /* Keep most of the room on the screen to display the processes. However, in the presence of many processes are, make sure the error window is at least 10 lines. */ if (win_height <= 10) win_height = 10; /* but not more than entire screen */ if (win_height > LINES) win_height = LINES; we = newwin(win_height, COLS, LINES - win_height, 0); return we; } void show_error_win(WINDOW* win, int nb_proc) { long current_pos; int maxx , maxy , i, pos=1; char* buf; static int nbp = 0; if (!error_file) return; if (nb_proc != -1) nbp = nb_proc; if (!win) win = prepare_error_win(nbp); getmaxyx(win, maxy, maxx); buf = alloca(maxx); /* char blank[maxx-3]; */ /* for(i=0; i < maxx-3; i++) */ /* blank[i] = ' '; */ /* Save currrent position in tiptop.error */ current_pos = ftell(error_file); rewind(error_file); box(win, 0, 0); mvwprintw(win, 0, 5, " %d errors detected (e to close) ", nb_error); mvwprintw(win, maxy-1, 5, " %d %% ", 100 * scroll_ / nb_error); /* scrolling the file */ for(i=0; i < scroll_ && fgets(buf, maxx-2, error_file) != NULL && i<(nb_error-1); i++) { if (buf[strlen(buf)-1] != '\n') i--; } if (i == 0) mvwprintw(win, pos++, 1, "BEGIN"); else mvwprintw(win, pos++, 1, "....."); while (fgets(buf, maxx-2, error_file) != NULL && (pos < maxy-2)) { if (buf[strlen(buf)-1] == '\n') /* To keep box's border */ buf[strlen(buf)-1] = 0; mvwprintw(win, pos++, 1, "%s", buf); } if (pos != maxy-2) { /* To complete screen */ /* while (pos < maxy-2) */ /* mvwprintw(win, pos++, 1, "%s", blank); */ mvwprintw(win, pos, 1, "END", i); } else mvwprintw(win, pos, 1, ".....", i); /* restoring older state of tiptop.error */ fseek(error_file, current_pos, SEEK_SET); wrefresh(win); } #endif /* HAVE_LIBCURSES */ tiptop-2.3/src/screen.h0000644001151100706620000000345312547160067012056 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012 Inria * * License: GNU General Public License version 2. * */ #ifndef _SCREEN_H #define _SCREEN_H #include #include "formula-parser.h" #include "options.h" typedef struct { uint32_t type; uint64_t config; /* Constant defined in configuration */ char* alias; int used; } counter_t; typedef struct { char* header; char* format; /* as in printf */ char* empty_field; char* error_field; expression* expression; char* description; } column_t; typedef struct { char* name; char* desc; int num_counters; int num_alloc_counters; counter_t* counters; int num_columns; int num_alloc_columns; column_t* columns; } screen_t; char* get_counter_config_name(uint64_t conf); int get_counter_config(char* config, uint64_t* result); char* get_counter_type_name(uint32_t type); int screen_pos(const screen_t* s); screen_t* new_screen(char* name, char* desc, int prepend); int add_counter(screen_t* const s, char* alias, char* config, char* type); int add_counter_by_value(screen_t* const s, char* alias, uint64_t config_val, uint32_t type_val); int add_column(screen_t* const s, char* header, char* format, char* desc, char* expr); void tamp_counters(void); void init_screen(void); screen_t* get_screen(int); screen_t* get_screen_by_name(const char* name); int get_num_screens(); void list_screens(void); char* gen_header(const screen_t* const s, const struct option* const, int width, int active_col); void delete_screen(screen_t* s); void delete_screens(); void screens_hook(void); /* to be implemented by target specific files */ int export_screens(struct option* o); #endif /* _SCREEN_H */ tiptop-2.3/src/priv.c0000644001151100706620000000333512547160067011551 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2014, 2015 Inria * * License: GNU General Public License version 2. * */ #include #include #include #include #include "error.h" #include "priv.h" /* Rationale: a user can attach performance counters only to processes it owns. When the paranoia level is high, a normal user cannot observe kernel events. To overcome this, tiptop may be installed root-setuid (at your own risk). To minimize the risk, we immediately drop root privilege, and restore it only for the time of the perf_event_open system call. */ /* Initial values of the user ID values. */ static uid_t euid = -1; static uid_t uid = -1; /* Used for initial call. We check and store uid and effective uid, and drop any extra privilege we might have. */ uid_t init_drop_privilege() { euid = geteuid(); uid = getuid(); drop_privilege(); return euid; } /* This is where we drop privilege. */ void drop_privilege() { if (euid != uid) { /* only do it if needed, otherwise skip the call */ int res = seteuid(uid); if (res == -1) { /* do not proceed as somebody else */ fprintf(stderr, "Cannot change privileges. Aborting.\n"); exit(EXIT_FAILURE); } } } /* This is where we restore privilege. Original effective uid was saved when we droped privilege. It can be restored. */ void restore_privilege() { if (euid != uid) { /* only do it if needed, otherwise skip the call */ int res = seteuid(euid); if (res == -1) { /* this should really not happen */ error_printf("Cannot restore privileges. " "This will likely cause problems."); } } } tiptop-2.3/src/pmc.h0000644001151100706620000000174112547160067011354 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012, 2014 Inria * * License: GNU General Public License version 2. * */ #ifndef _PMC_H #define _PMC_H #include /* * The sys_perf_counter_open syscall and header files changed names * between Linux 2.6.31 and 2.6.32. Do the mangling here. */ #ifdef HAVE_LINUX_PERF_COUNTER_H #include #define STRUCT_NAME perf_counter_attr #define SYSCALL_NUM __NR_perf_counter_open #elif HAVE_LINUX_PERF_EVENT_H #include #define STRUCT_NAME perf_event_attr #define SYSCALL_NUM __NR_perf_event_open #else #error Sorry, performance counters not supported on this system. #endif #include /* Declare the syscall with proper naming. */ long perf_event_open(struct STRUCT_NAME *hw_event, pid_t pid, int cpu, int group_fd, unsigned long flags); #endif /* _PMC_H */ tiptop-2.3/src/utils-expression.c0000644001151100706620000001702512547160067014127 00000000000000/* * This file is part of tiptop. * * Author: Antoine NAUDIN * Copyright (c) 2012 Inria * * License: GNU General Public License version 2. * */ #include #include #include #include #include #include "formula-parser.h" #include "process.h" #include "screen.h" #include "utils-expression.h" /* copy of the expression found in XML file. To be passed to the lexer (possibly in chunks) by my_yyinput. */ static char* ptr_myinput = NULL; /* Expression built by parser, */ expression* res_expr = NULL; void yyparse(); /* generated by yacc */ /* dedicated tools to allocate expression and son */ int my_yyinput(char* buffer, int buffer_size) { int len; strncpy(buffer, ptr_myinput, buffer_size); len = strlen(buffer); ptr_myinput += len; return len; } unit* alloc_unit() { unit* u = malloc(sizeof(unit)); u->alias = NULL; u->val = -1; u->type = -1; u->delta = -1; return u; } expression* alloc_expression() { expression* e = malloc(sizeof(expression)); e->ele = NULL; e->op = NULL; e->type = -1; return e; } operation* alloc_operation() { operation* o = malloc(sizeof(operation)); o->operator = '!'; o->exp1 = NULL; o->exp2 = NULL; return o; } /* dedicated destroyer to free expressions */ void free_unit(unit* u) { if (u == NULL) return; if (u->alias != NULL) free(u->alias); free(u); } void free_expression (expression* e) { if (e == NULL) return; free_unit(e->ele); free_operation(e->op); free(e); } void free_operation(operation* p) { if (p == NULL) return; free_expression(p->exp1); free_expression(p->exp2); free(p); } #ifdef ENABLE_DEBUG /* Print an expression */ void print_expression(expression* e) { if (e->type == ERROR) { printf("ERROR"); return ; } if (e->type == ELEM){ if (e->ele->type == COUNT) { if (e->ele->delta == DELT) printf("delta(%s)", e->ele->alias); else printf("%s", e->ele->alias); } else if (e->ele->type == CONST) { printf("%2.1f", e->ele->val); } } else if (e->type == OPER && e->op != NULL) { printf("("); print_expression(e->op->exp1); printf(" %c ", e->op->operator); print_expression(e->op->exp2); printf(")"); } } #endif /* Build a representative stream of an expression */ int build_expression(expression* e, FILE* fd) { if (e->type == ELEM) { if (e->ele->type == COUNT) { if (e->ele->delta == DELT) return fprintf(fd, "delta(%s)", e->ele->alias); else return fprintf(fd, "%s", e->ele->alias); } else if (e->ele->type == CONST) return fprintf(fd, "%4.2lf", e->ele->val); } else if (e->type == OPER && e->op != NULL) { if (fprintf(fd, "(") < 0) return -1; if (build_expression(e->op->exp1, fd) < 0) return -1; if (e->op->operator == '<') { if (fprintf(fd, " shl ") < 0) return -1; } else if (e->op->operator == '>') { if (fprintf(fd, " shr ") < 0) return -1; } else if (e->op->operator == '&') { if (fprintf(fd, " and ") < 0) return -1; } else if (e->op->operator == '|') { if (fprintf(fd, " or ") < 0) return -1; } else if (fprintf(fd, " %c ", e->op->operator) < 0) return -1; if (build_expression(e->op->exp2, fd) < 0) return -1; if (fprintf(fd, ")") < 0) return -1; } return 0; } /* Parse and return a representative tree */ expression* parser_expression(char* txt) { ptr_myinput = txt; res_expr = NULL; /* will be computed by yacc-generated parser */ if (strlen(txt) > 0) { yyparse(); } return res_expr; } /* Tools to find counters' ID */ static int get_counter_id(char* alias, counter_t* tab, int nbc) { int i; for(i=0 ;ialias, "CPU_TOT") == 0) return p->cpu_percent; if (strcmp(e->alias, "CPU_SYS") == 0) return p->cpu_percent_s; if (strcmp(e->alias, "CPU_USER") == 0) return p->cpu_percent_u; if (strcmp(e->alias, "PROC_ID") == 0) { if (p->proc_id != -1) { return (double)p->proc_id; } else { *error=1; return 1; } } id = get_counter_id(e->alias, tab, nbc); if ((id == -1) || (p->values[id] == 0xffffffff)) { /* Invalid counter */ *error = 1; return 1; } if (delta == DELT) return (double) (p->values[id] - p->prev_values[id]); return (double) p->values[id]; } /* Calculous and return result of expression gived in entry * * (argument error is used for indicate and determine which kind of * error appear during evaulation: * 1 => Invalid Counter * 2 => Divide per zero (also if it is double) */ double evaluate_column_expression(expression* e, counter_t* c, int nbc, struct process* p, int* error) { /* Invalid Expression */ if (e == NULL) { *error = 1; return 0; } *error = 0; if (e->type == ELEM) { /* Return Element value */ if (e->ele->type == COUNT) return get_counter_value(e->ele, c, nbc, e->ele->delta, p, error); else if(e->ele->type == CONST) return e->ele->val; } else if ((e->type == OPER) && (e->op != NULL)) { /* Or calcul leaf value and return the result */ switch(e->op->operator) { case '+': return evaluate_column_expression(e->op->exp1, c, nbc, p, error) + evaluate_column_expression(e->op->exp2, c, nbc, p, error); break; case '-': return evaluate_column_expression(e->op->exp1, c, nbc, p, error) - evaluate_column_expression(e->op->exp2, c, nbc, p, error); break; case '*': return evaluate_column_expression(e->op->exp1, c, nbc, p, error) * evaluate_column_expression(e->op->exp2, c, nbc, p, error); break; case '/': { double tmp = evaluate_column_expression(e->op->exp2, c, nbc, p, error); if (tmp == 0) { /* Divide by 0 */ *error = 2; return 0; } return evaluate_column_expression(e->op->exp1, c, nbc, p, error) / tmp; break; } default: /* Unknown operator */ assert(0); } } return 0; } uint64_t evaluate_counter_expression(expression* e, int* error) { uint64_t val = 0; if (e == NULL || e->type == ERROR) { (*error)++; return 0; } if (e->type == ELEM) { if (e->ele->type == COUNT) { if (get_counter_config(e->ele->alias, &val) < 0) (*error)++; return val; } else return (uint64_t) e->ele->val; } else if ((e->type == OPER) && (e->op != NULL)) { switch (e->op->operator) { /* Binary operator to define a counter type */ case '<': return evaluate_counter_expression(e->op->exp1, error) << evaluate_counter_expression(e->op->exp2, error); break; case '>': return evaluate_counter_expression(e->op->exp1, error) >> evaluate_counter_expression(e->op->exp2, error); break; case '&': return evaluate_counter_expression(e->op->exp1, error) & evaluate_counter_expression(e->op->exp2, error); break; case '|': return evaluate_counter_expression(e->op->exp1, error) | evaluate_counter_expression(e->op->exp2, error); break; default: assert(0); } } return 0; } tiptop-2.3/src/formula-parser.h0000644001151100706620000000123012547160067013525 00000000000000/* * This file is part of tiptop. * * Author: Antoine NAUDIN * Copyright (c) 2012 Inria * * License: GNU General Public License version 2. * */ #ifndef _FORMULA_PARSER_H #define _FORMULA_PARSER_H typedef enum { COUNT, CONST, OPER, ELEM, DELT, ERROR } type_t; typedef struct operation operation; typedef struct expression expression; typedef struct unit unit; struct unit { int type; double val; char* alias; int delta; }; struct operation { int operator; expression* exp1; expression* exp2; }; struct expression { int type; operation* op; unit* ele; }; #endif /* _FORMULA_PARSER_H */ tiptop-2.3/src/process.c0000644001151100706620000004660612547160067012257 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012, 2014, 2015 Inria * * License: GNU General Public License version 2. * */ #include #include #include #include #include #include #include #include #include #include #include "error.h" #include "hash.h" #include "options.h" #include "pmc.h" #include "priv.h" #include "process.h" #include "screen.h" #include "spawn.h" static int num_files = 0; static int num_files_limit = 0; static int clk_tck; /* * Build the (empty) list of processes/threads. */ struct process_list* init_proc_list() { struct process_list* l; char name[100] = { 0 }; /* needs to fit the name /proc/xxxx/limits */ char line[100]; FILE* f; clk_tck = sysconf(_SC_CLK_TCK); l = malloc(sizeof(struct process_list)); l->processes = NULL; l->num_alloc = 20; l->proc_ptrs = malloc(l->num_alloc * sizeof(struct process*)); l->num_tids = 0; l->most_recent_pid = 0; hash_init(); num_files_limit = 0; snprintf(name, sizeof(name) - 1, "/proc/%d/limits", getpid()); f = fopen(name, "r"); if (f) { while (fgets(line, 100, f)) { int n; n = sscanf(line, "Max open files %d", &num_files_limit); if (n) break; } fclose(f); } num_files_limit -= 10; /* keep some slack */ if (num_files_limit == 0) /* something went wrong */ num_files_limit = 200; /* reasonable default? */ num_files = 0; return l; } /* Free memory for all fields of the process. */ static void done_proc(struct process* const p) { int val_idx; if (p->cmdline) free(p->cmdline); free(p->name); free(p->txt); if (p->username) free(p->username); for(val_idx=0; val_idx < p->num_events; val_idx++) { if (p->fd[val_idx] != -1) { close(p->fd[val_idx]); num_files--; } } } /* * Deletes the list of processes. Free memory. */ void done_proc_list(struct process_list* list) { struct process* p; assert(list && list->proc_ptrs); p = list->processes; while (p) { struct process* old = p; done_proc(p); p = p->next; free(old); } free(list->proc_ptrs); free(list); hash_fini(); } /* Retrieve the command line of the process from /proc/PID/cmdline. The subtlety comes from the fact that args are separated by '\0', the command line itself by two consecutive '\0' (see "man proc"). Some processes have no command line: first character is '\0'. */ static char* get_cmdline(int pid, char* result, int size) { FILE* f; char name[50] = { 0 }; /* needs to fit /proc/xxxx/cmdline */ char* res = NULL; snprintf(name, sizeof(name) - 1, "/proc/%d/cmdline", pid); f = fopen(name, "r"); if (f) { res = fgets(result, size, f); if (res && res[0]) { int j; for(j=0; j < size-1; j++) { if (result[j] == '\0') { if (result[j+1] == '\0') /* two zeroes in a row, stop */ break; else result[j] = ' '; /* only one, it is a separator, it becomes ' ' */ } } } fclose(f); } if (!res) { strncpy(result, "[null]", size-1); result[size-1] = '\0'; } return result; } void start_counters(struct process* ptr, const screen_t* const screen, struct STRUCT_NAME* events, const struct option* const options) { const int cpu = -1; const int grp = -1; const int flags = 0; int zz; /* Get number of counters from screen */ ptr->num_events = screen->num_counters; /* If we have reached the maximum number of open files, we try to close the events attached to some idle processes (unless forbidden to do so by command line flag). */ if ((num_files + ptr->num_events >= num_files_limit) && (!options->no_collect)) { int num_collected = 0; struct process* q = ptr->next; while (q && (num_collected < ptr->num_events)) { if (q->cpu_percent < options->cpu_threshold) { for(zz = 0; zz < q->num_events; zz++) { if (q->fd[zz] >= 0) { close(q->fd[zz]); q->fd[zz] = -1; q->values[zz] = 0xffffffff; num_collected++; } } } q = q->next; } num_files -= num_collected; } for(zz = 0; zz < ptr->num_events; zz++) ptr->prev_values[zz] = 0; /* restore super powers, if any, for the time of the system call */ restore_privilege(); for(zz = 0; zz < ptr->num_events; zz++) { int fd; events->type = screen->counters[zz].type; /* eg PERF_TYPE_HARDWARE */ events->config = screen->counters[zz].config; if (num_files < num_files_limit) { fd = perf_event_open(events, ptr->tid, cpu, grp, flags); if (fd == -1) { error_printf("Could not attach counter '%s' to PID %d (%s): %s\n", screen->counters[zz].alias, ptr->tid, ptr->name, strerror(errno)); } } else { fd = -1; error_printf("Files limit reached for PID %d (%s)\n", ptr->tid, ptr->name); } if (fd != -1) num_files++; ptr->fd[zz] = fd; ptr->values[zz] = 0; } /* drop super powers again */ drop_privilege(); } void new_processes(struct process_list* const list, const screen_t* const screen, const struct option* const options) { struct dirent* pid_dirent; DIR* pid_dir; int num_tids, val, n, num_inactive, alloc_inact, i; struct STRUCT_NAME events = {0, }; FILE* f; uid_t my_uid = -1; struct process** inactive; /* To avoid scanning the entire /proc directory, we first check if any process has been created since last time. /proc/loadavg contains the PID of the most recent process. We compare with our own most recent. */ f = fopen("/proc/loadavg", "r"); n = fscanf(f, "%*f %*f %*f %*d/%*d %d", &val); fclose(f); /* if no new process has been created since last time, just quit. */ if ((n == 1) && (val == list->most_recent_pid)) return; list->most_recent_pid = val; num_tids = list->num_tids; events.disabled = 0; events.pinned = 1; events.exclude_hv = 1; /* events.exclude_idle = 1; ?? */ if (options->show_kernel == 0) events.exclude_kernel = 1; num_inactive = 0; alloc_inact = 100; inactive = malloc(alloc_inact * sizeof(struct process*)); /* check all directories of /proc */ pid_dir = opendir("/proc"); while ((pid_dirent = readdir(pid_dir))) { int uid, pid, num_threads, req_info; char name[50] = { 0 }; /* needs to fit /proc/xxxx/{status,cmdline} */ char line[100]; /* line of /proc/xxxx/status */ char proc_name[100]; int skip_by_pid, skip_by_user; char cmdline[100]; if (pid_dirent->d_type != DT_DIR) /* not a directory */ continue; if ((pid = atoi(pid_dirent->d_name)) == 0) /* not a number */ continue; snprintf(name, sizeof(name) - 1, "/proc/%d/status", pid); f = fopen(name, "r"); if (!f) continue; /* collect basic information about process */ req_info = 3; /* need 3 pieces of information */ while (fgets(line, sizeof(line), f) && req_info) { /* read the name now, since we will encounter it before Uid anyway */ if (strncmp(line, "Name:", 5) == 0) { sscanf(line, "%*s %s", proc_name); req_info--; } if (strncmp(line, "Uid:", 4) == 0) { sscanf(line, "%*s %d", &uid); req_info--; } if (strncmp(line, "Threads:", 8) == 0) { sscanf(line, "%*s %d", &num_threads); req_info--; } } fclose(f); if (req_info != 0) { /* could not read all 3 info. Process is gone? */ error_printf("Could not read info for process %d (gone already?)\n", pid); continue; } cmdline[0] = '\0'; skip_by_pid = 0; /* if "only" filter is set */ if (options->only_pid && (pid != options->only_pid)) skip_by_pid = 1; if (options->only_name) { if (options->show_cmdline) { /* show_cmdline is on */ get_cmdline(pid, cmdline, sizeof(cmdline)); if (strstr(cmdline, options->only_name) == NULL) { skip_by_pid = 1; } } else { /* show_cmdline is off */ if (strstr(proc_name, options->only_name) == NULL) skip_by_pid = 1; } } /* my process, or somebody else's process and I am root (skip root's processes because they are too many). */ skip_by_user = 1; my_uid = options->euid; if (((my_uid != 0) && (uid == my_uid)) || /* not root, monitor mine */ ((my_uid == 0) && (uid != 0))) /* I am root, monitor all others*/ skip_by_user = 0; if ((skip_by_user == 0) && (skip_by_pid == 0)) { DIR* thr_dir; struct dirent* thr_dirent; int tid; char task_name[50] = { 0 }; snprintf(task_name, sizeof(task_name) - 1, "/proc/%d/task", pid); thr_dir = opendir(task_name); if (!thr_dir) /* died just now? Will be marked dead at next iteration. */ continue; /* Iterate over all threads in the process */ while ((thr_dirent = readdir(thr_dir))) { struct process* ptr; struct passwd* passwd; tid = atoi(thr_dirent->d_name); if (tid == 0) continue; ptr = hash_get(tid); if (ptr) /* already known */ continue; /* We have a new thread. */ /* allocate memory */ ptr = malloc(sizeof(struct process)); /* insert into list of processes */ /* Insert at the front of the list. This will later let us scan the rest of the list when looking for idle processes, closing files. */ ptr->next = list->processes; list->processes = ptr; /* update helper data structures */ if (num_tids == list->num_alloc) { list->num_alloc += 20; list->proc_ptrs = realloc(list->proc_ptrs, list->num_alloc*sizeof(struct process)); } list->proc_ptrs[num_tids] = ptr; hash_add(tid, ptr); /* fill in information for new process */ ptr->tid = tid; ptr->pid = pid; ptr->proc_id = -1; ptr->dead = 0; ptr->u.d = 0.0; passwd = getpwuid(uid); if (passwd) ptr->username = strdup(passwd->pw_name); else ptr->username = NULL; ptr->num_threads = (short)num_threads; if (cmdline[0] == '\0') get_cmdline(pid, cmdline, sizeof(cmdline)); ptr->cmdline = strdup(cmdline); ptr->name = strdup(proc_name); ptr->timestamp.tv_sec = 0; ptr->timestamp.tv_usec = 0; ptr->prev_cpu_time_s = 0; ptr->prev_cpu_time_u = 0; ptr->cpu_percent = 0.0; ptr->cpu_percent_s = 0.0; ptr->cpu_percent_u = 0.0; float uptime; f = fopen("/proc/uptime", "r"); n = fscanf(f, "%f", &uptime); fclose(f); uptime *= clk_tck; /* read utime, stime and starttime (fields 14, 15, and 22) */ snprintf(name, sizeof(name) - 1, "/proc/%d/stat", tid); f = fopen(name, "r"); if (!f) continue; long utime, stime; long long starttime; n = fscanf(f, "%*d (%*[^)]) %*c %*d %*d %*d %*d %*d %*u %*u " "%*u %*u %*u %lu %lu %*d %*d %*d %*d %*d %*d %llu", &utime, &stime, &starttime); fclose(f); /* Due to the limited number of files in a Linux process (each counter corresponds to a file), we want to start counters first for active process. Idle processes are postponed. This increases the chances to display useful information: a dash only for idle processes. */ if ((utime + stime)/(uptime - starttime) > 0.3) { /* active process: %CPU > 30% */ start_counters(ptr, screen, &events, options); } else { /* less active: postpone. Add to a list of inactive processes, to be handled later. */ inactive[num_inactive++] = ptr; if (num_inactive == alloc_inact) { alloc_inact += 100; inactive = realloc(inactive, alloc_inact * sizeof(struct process*)); } } ptr->txt = malloc(TXT_LEN * sizeof(char)); list->num_tids++; /* insert in any case */ num_tids++; } closedir(thr_dir); } } /* handle inactive processes */ for(i=0; i < num_inactive; i++) { start_counters(inactive[i], screen, &events, options); } free(inactive); closedir(pid_dir); } /* * Update all processes in the list with newly collected statistics. * Return the number of dead processes. */ int update_proc_list(struct process_list* const list, const screen_t* const screen, struct option* const options) { struct process* proc; int num_dead = 0; assert(screen); assert(list && list->proc_ptrs); /* add newly created processes/threads */ new_processes(list, screen, options); /* update statistics */ for(proc = list->processes; proc; proc = proc->next) { FILE* fstat; char sub_task_name[100] = { 0 }; double elapsed; unsigned long utime = 0, stime = 0; unsigned long prev_cpu_time, curr_cpu_time; int proc_id, zz, zombie; struct timeval now; if (proc->dead) { num_dead++; continue; } /* Compute %CPU, retrieve processor ID. */ snprintf(sub_task_name, sizeof(sub_task_name) - 1, "/proc/%d/task/%d/stat", proc->pid, proc->tid); fstat = fopen(sub_task_name, "r"); if (!fstat) { /* this task disappeared */ num_dead++; proc->dead = 1; /* mark dead */ for(zz=0; zz < proc->num_events; ++zz) { if (proc->fd[zz] != -1) { close(proc->fd[zz]); num_files--; proc->fd[zz] = -1; } } continue; } zombie = 0; if (fstat) { int n; char state; n = fscanf(fstat, "%*d (%*[^)]) %c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %lu %lu", &state, &utime, &stime); if (n != 3) utime = stime = 0; if (state == 'Z') { /* zombie */ zombie = 1; } /* get processor ID */ n = fscanf(fstat, "%*d %*d %*d %*d %*d %*d %*d %*u %*d %*u %*u %*u %*u " "%*u %*u %*u %*u %*u %*u %*u %*u %*u %*d %d", &proc_id); if (n != 1) proc_id = -1; fclose(fstat); } if (!zombie) { /* do not update these values for a zombie, they have become invalid */ gettimeofday(&now, NULL); elapsed = (now.tv_sec - proc->timestamp.tv_sec) + (now.tv_usec - proc->timestamp.tv_usec)/1000000.0; elapsed *= clk_tck; proc->timestamp = now; prev_cpu_time = proc->prev_cpu_time_s + proc->prev_cpu_time_u; curr_cpu_time = stime + utime; proc->cpu_percent = 100.0*(curr_cpu_time - prev_cpu_time)/elapsed; proc->cpu_percent_s = 100.0*(stime - proc->prev_cpu_time_s)/elapsed; proc->cpu_percent_u = 100.0*(utime - proc->prev_cpu_time_u)/elapsed; proc->prev_cpu_time_s = stime; proc->prev_cpu_time_u = utime; } proc->proc_id = (short)proc_id; /* Backup previous value of counters */ for(zz = 0; zz < proc->num_events; zz++) proc->prev_values[zz] = proc->values[zz]; /* Read performance counters */ for(zz = 0; zz < proc->num_events; zz++) { uint64_t value = 0; int r; /* When fd is -1, the syscall failed on that counter */ if (proc->fd[zz] != -1) { r = read(proc->fd[zz], &value, sizeof(value)); if (r == sizeof(value)) proc->values[zz] = value; else proc->values[zz] = 0; } else /* no fd, use marker */ proc->values[zz] = 0xffffffff; } if (zombie) { proc->dead = 1; wait_for_child(proc->tid, options); } } return num_dead; } /* Scan list of processes and deallocates the dead ones, compacting the list. */ void compact_proc_list(struct process_list* const list) { struct process* p; int i; for(p = list->processes; p; p = p->next) { if (p && p->next && p->next->dead) { struct process* to_delete = p->next; hash_del(to_delete->tid); p->next = to_delete->next; done_proc(to_delete); free(to_delete); list->num_tids--; } } /* special case for 1st element */ if (list->processes->dead) { struct process* to_delete = list->processes; hash_del(to_delete->tid); list->processes = to_delete->next; done_proc(to_delete); free(to_delete); list->num_tids--; } /* update pointers */ i = 0; for(p = list->processes; p; p = p->next) { list->proc_ptrs[i] = p; i++; } } /* * When threads are not displayed, this function accumulates * per-thread statistics in the parent process (which is also a * thread). */ void accumulate_stats(const struct process_list* const list) { int zz; struct process* p; p = list->processes; for(p = list->processes; p; p = p->next) { if (p->pid != p->tid) { struct process* owner; if (p->dead) continue; /* find the owner */ owner = hash_get(p->pid); assert(owner); /* accumulate in owner process */ owner->cpu_percent += p->cpu_percent; for(zz = 0; zz < p->num_events; zz++) { /* as soon as one thread has an invalid value, mark the owner as invalid as well (cannot compute a correct value) */ if (p->values[zz] == 0xffffffff) owner->values[zz] = 0xffffffff; else owner->values[zz] += p->values[zz]; } } } } /* * When switching back from show_threads to no_thread, we need to * reset the statistics of the parent thread, because they contain * accumulated values, much higher than per-thread value. Failing to * do so results in transient erratic displayed values. */ void reset_values(const struct process_list* const list) { struct process* p; for(p = list->processes; p; p = p->next) { if (p->dead) continue; /* only consider 'main' processes (not threads) */ if (p->pid == p->tid) { int zz; p->cpu_percent = 0; for(zz = 0; zz < p->num_events; zz++) { p->values[zz] = 0; } } } } /* This is only used when tiptop fires a command itself. Right after the fork, the process name and command line are tiptop's. They are correct after exec. update_name_cmdline is invoked a little while after exec to fix these fields. */ void update_name_cmdline(int pid, int name_only) { FILE* f; char name[50] = { 0 }; /* needs to fit /proc/xxxx/{status,cmdline} */ char line[100]; /* line of /proc/xxxx/status */ char proc_name[100]; struct process* p = hash_get(pid); if (!p) /* gone? */ return; /* update name */ snprintf(name, sizeof(name) - 1, "/proc/%d/status", pid); f = fopen(name, "r"); if (f) { while (fgets(line, sizeof(line), f)) { if (strncmp(line, "Name:", 5) == 0) { sscanf(line, "%*s %s", proc_name); if (p->name) free(p->name); p->name = strdup(proc_name); break; } } fclose(f); } if (!name_only) { /* update command line */ char buffer[100]; if (p->cmdline) free(p->cmdline); get_cmdline(pid, buffer, sizeof(buffer)); p->cmdline = strdup(buffer); } } tiptop-2.3/src/calc.y0000644001151100706620000000521212547160067011515 00000000000000/* * This file is part of tiptop. * * Author: Antoine NAUDIN * Copyright (c) 2012 Inria * * License: GNU General Public License version 2. * */ %{ #include #include #include #include #include "error.h" #include "utils-expression.h" extern expression* res_expr; expression* build_node_operation(expression* exp1, expression* exp2, int opera); expression* build_node_counter(char* alias, int delta); expression* build_node_constant(char* txt); int yylex(); int yyerror(char *s); %} %union { expression* e; char* txt ; }; %token NUMBER %token COUNTER %token EXPOSANT %token BASE16 %token ADD SUB MUL DIV %token OR AND SHR SHL %token B_LEFT B_RIGHT %token END %token DELTA %type Expression Line %left ADD SUB AND OR SHR SHL %left MUL DIV %right POWER %start Line %% Line: Expression { res_expr = $1; }; Expression: BASE16 { $$ = build_node_counter($1, 0); } | NUMBER { $$ = build_node_constant($1); } | DELTA B_LEFT COUNTER B_RIGHT { $$ = build_node_counter($3, DELT); } | COUNTER { $$ = build_node_counter($1, 0); } | Expression ADD Expression { $$ = build_node_operation($1,$3, '+'); } | Expression SUB Expression { $$ = build_node_operation($1,$3, '-'); } | Expression MUL Expression { $$ = build_node_operation($1,$3, '*'); } | Expression DIV Expression { $$ = build_node_operation($1,$3, '/'); } | Expression OR Expression { $$ = build_node_operation($1,$3, '|'); } | Expression AND Expression { $$ = build_node_operation($1,$3, '&'); } | Expression SHR Expression { $$ = build_node_operation($1,$3, '>'); } | Expression SHL Expression { $$ = build_node_operation($1,$3, '<'); } | B_LEFT Expression B_RIGHT { $$=$2; } %% expression* build_node_operation(expression* exp1, expression* exp2, int opera) { expression* tmp = alloc_expression(); tmp->type = OPER; tmp->op = alloc_operation(); tmp->op->exp1 = exp1; tmp->op->exp2 = exp2; tmp->op->operator = opera; return tmp; } expression* build_node_counter(char* alias, int delta) { expression* tmp = alloc_expression(); tmp->ele = alloc_unit(); tmp->ele->alias = alias; tmp->ele->type = COUNT; if (delta == DELT) { tmp->ele->delta = DELT; } tmp->type = ELEM; return tmp; } expression* build_node_constant(char* txt) { expression* tmp = alloc_expression(); tmp->ele = alloc_unit(); errno = 0; tmp->ele->val = strtod(txt, NULL); if (errno != 0) { error_printf("Error while reading float in '%s'.\n", txt); tmp->type = ERROR; } else { tmp->ele->type = CONST; tmp->type = ELEM; } free(txt); return tmp; } tiptop-2.3/src/target.c0000644001151100706620000000146712547160067012063 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2012 Inria * * License: GNU General Public License version 2. * */ #include #include "config.h" #include "target.h" #ifdef TARGET_X86 #include "target-x86.c" #else /* Default implementation for unknown target. */ enum targets get_target() { return UNKNOWN_TARGET; } int match_target(const char* tgt) { /* unknown target, matches nothing */ return 0; } char* get_model() { return NULL; } int match_model(const char* model) { /* unknown model, matches nothing */ return 0; } /* Generate a target-dependent string, displayed in the help window. */ void target_dep_string(char* buf, int size) { snprintf(buf, size, "Unknown processor"); } void screens_hook() { /* empty */ } #endif /* TARGET_xxx */ tiptop-2.3/src/debug.c0000644001151100706620000000151712547160067011657 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012 Inria * * License: GNU General Public License version 2. * */ #include #ifdef ENABLE_DEBUG #include #include #include #include "debug.h" #include "options.h" extern struct option options; static const char* const debug_file_name = "tiptop.debug"; static FILE* debug_file = NULL; void debug_printf(char* fmt, ...) { va_list args; if (!options.debug) return; /* open file the first time we get here. */ if (!debug_file) { debug_file = fopen(debug_file_name, "w"); if (!debug_file) { perror("fopen"); fprintf(stderr, "Cannot open debug file.\n"); exit(EXIT_FAILURE); } } va_start(args, fmt); vfprintf(debug_file, fmt, args); } #endif /* ENABLE_DEBUG */ tiptop-2.3/src/spawn.c0000644001151100706620000000653212547160067011723 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012, 2013, 2014 Inria * * License: GNU General Public License version 2. * */ #include #include #include #include #include #include #include #include #include "options.h" #include "process.h" #include "spawn.h" static int pipefd[2]; static pid_t my_child = 0; static int updated = 0; static void alarm_handler(int sig) { assert(sig == SIGALRM); if (!updated) { update_name_cmdline(my_child, 0); updated = 1; } } static void child_handler(int sig) { assert(sig == SIGCHLD); /* Short running processes may terminate before the timer expires. We attempt to update the name now. The command line is no longer available for zombies (see man proc). */ if (!updated) { update_name_cmdline(my_child, 1); updated = 1; } /* Do nothing special. We only want the signal to be delivered. It will interrupt the 'select' in the main loop (batch/live mode), and force an immediate refresh. If 'sticky' mode is on, we also quit immediately. */ } /* Fork a new process, wait for the signal, and execute the command passed in parameter. Return the PID of the child. */ int spawn(char** argv) { pid_t child; sigset_t sigs; struct sigaction alarm_action, child_action; sigemptyset(&sigs); alarm_action.sa_handler = alarm_handler; alarm_action.sa_flags = 0; alarm_action.sa_mask = sigs; sigaction(SIGALRM, &alarm_action, NULL); /* prepare to receive timer */ child_action.sa_handler = child_handler; child_action.sa_flags = 0; child_action.sa_mask = sigs; sigaction(SIGCHLD, &child_action, NULL); /* prepare to receive SIGCHLD */ if (pipe(pipefd)) { /* parent will signal through the pipe when ready */ perror("pipe"); exit(EXIT_FAILURE); } child = fork(); if (child == -1) { perror("fork"); exit(EXIT_FAILURE); } if (child == 0) { /* in the child */ int n; char buffer; close(pipefd[1]); /* useless */ /* wait for parent to signal */ n = read(pipefd[0], &buffer, 1); /* blocking read */ if (n != 1) fprintf(stderr, "Something went wrong with the command\n"); if (execvp(argv[0], argv) == -1) { perror("execvp"); exit(EXIT_FAILURE); } } /* parent */ close(pipefd[0]); my_child = child; return child; } /* After the command has been forked, we update the list of processes. The newly created process will be discovered and hardware counters attached. We then signal the child to proceed with the execvp. */ void start_child() { struct timeval tv1, tv2 = { 0 }; struct itimerval it; int n; n = write(pipefd[1], "!", 1); /* write whatever, will unblock the read */ if (n != 1) fprintf(stderr, "Something went wrong with the command...\n"); close(pipefd[1]); /* set timer, we need to update the name and command line of the new process in a little while */ tv1.tv_sec = 0; tv1.tv_usec = 200000; /* 200 ms */ it.it_value = tv1; it.it_interval = tv2; /* zero, no repeat */ setitimer(ITIMER_REAL, &it, NULL); } void wait_for_child(pid_t pid, struct option* options) { /* only wait for my child */ if (pid != my_child) return; wait(NULL); /* release system resources */ options->command_done = 1; } tiptop-2.3/src/version.c0000644001151100706620000000177712547160067012266 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012, 2013, 2014, 2015 Inria * * License: GNU General Public License version 2. * */ #include #include "config.h" #include "version.h" #if defined(PACKAGE_VERSION) static const char tiptop_version[] = PACKAGE_VERSION ; #else static const char tiptop_version[] = "unknown" ; #endif #if defined(COMPILE_DATE) static const char compile_date[] = COMPILE_DATE ; #else static const char compile_date[] = "unknown" ; #endif #if defined(COMPILE_HOST) static const char compile_host[] = COMPILE_HOST ; #else static const char compile_host[] = "unknown" ; #endif void print_version() { printf("This is tiptop version %s.\n", tiptop_version); printf("tiptop was compiled on \"%s\"\non host \"%s\".\n", compile_date, compile_host); } void print_legal() { printf("tiptop %s.\n", tiptop_version); printf("Copyright (C) 2011, 2012, 2013, 2014, 2015 Inria.\n"); printf("This is free software. No warranty.\n"); } tiptop-2.3/src/options.c0000644001151100706620000002525712547160067012273 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012, 2013, 2014, 2015 Inria * * License: GNU General Public License version 2. * */ #include #include #include #include #include #include #include #include #include #include "options.h" #include "version.h" static void usage(const char* name) { fprintf(stderr, "Usage: %s [option]\n", name); #ifdef HAVE_LIBCURSES fprintf(stderr, "\t-b run in batch mode\n"); #else fprintf(stderr, "\t-b ignored, for compatibility with batch mode\n"); #endif fprintf(stderr, "\t-c use command line instead of process name\n"); fprintf(stderr, "\t--cpu-min m minimum %%CPU to display a process\n"); fprintf(stderr, "\t-d delay delay in seconds between refreshes\n"); fprintf(stderr, "\t-E filename file where errors are logged\n"); fprintf(stderr, "\t--epoch add epoch at beginning of each line\n"); #ifdef ENABLE_DEBUG fprintf(stderr, "\t-g debug\n"); #endif fprintf(stderr, "\t-h --help print this message\n"); fprintf(stderr, "\t-H show threads\n"); fprintf(stderr, "\t-K --kernel show kernel activity\n"); fprintf(stderr, "\t-i also display idle processes\n"); fprintf(stderr, "\t--list-screens display list of available screens\n"); fprintf(stderr, "\t-n num max number of refreshes\n"); fprintf(stderr, "\t--no-collect no attempt to collect idle processes when out of files\n"); fprintf(stderr, "\t-o outfile output file in batch mode\n"); fprintf(stderr, "\t--only-conf Disable default screen, only configuration\n"); fprintf(stderr, "\t-p --pid pid|name only display task with this PID/name\n"); fprintf(stderr, "\t-S num screen number to display\n"); fprintf(stderr, "\t--sticky keep final status of dead processes\n"); fprintf(stderr, "\t--timestamp add timestamp at beginning of each line\n"); fprintf(stderr, "\t-u userid only show user's processes\n"); fprintf(stderr, "\t-U show user name\n"); fprintf(stderr, "\t-v print version and exit\n"); fprintf(stderr, "\t--version print legalese and exit\n"); fprintf(stderr, "\t-W path Used configuration file pointed by path\n"); fprintf(stderr, "\t-w pid|name watch this process (highlighted)\n"); return; } void init_options(struct option* opt) { /* default status for options */ memset(opt, 0, sizeof(*opt)); #ifndef HAVE_LIBCURSES /* make batch mode default if curses is not available */ opt->batch = 1; #endif opt->cpu_threshold = 0.00001; opt->default_screen = 1; opt->delay = 2; opt->out = stdout; opt->watch_uid = -1; opt->error = 0; } void free_options(struct option* options) { if (options->watch_name) free(options->watch_name); if (options->only_name) free(options->only_name); } /* Look for a user specified path in the command line for the configuration file (flag -W). Return it if found, otherwise return NULL. */ char* get_path_to_config(int argc, char* argv[]) { int i; for(i=1; i < argc; i++) { if (strcmp(argv[i], "-W") == 0) { if (i+1 < argc) return argv[i+1]; else { fprintf(stderr, "Missing file name after -W.\n"); exit(EXIT_FAILURE); } } } return NULL; } /* Look for a user specified path in the command line for the erorrs file (flag -E). Return it if found, otherwise return NULL. */ char* get_path_to_error(int argc, char* argv[]) { int i; for(i=1; i < argc; i++) { if (strcmp(argv[i], "-E") == 0) { if (i+1 < argc) return argv[i+1]; else { fprintf(stderr, "Missing file name after -E.\n"); exit(EXIT_FAILURE); } } } return NULL; } /* Look for flat -b to see if we will run in batch mode. */ int get_batch_mode(int argc, char* argv[]) { int i; for(i=1; i < argc; i++) { if (strcmp(argv[i], "-b") == 0) { return 1; } } return 0; } void parse_command_line(int argc, char* argv[], struct option* const options, int* list_scr, int* screen_num) { int i; /* Note: many flags are toggles. They invert what is in the configuration file. */ for(i=1; i < argc; i++) { if (strcmp(argv[i], "--") == 0) { /* command to be spawned by tiptop */ if (argc > i+1) /* at least something after -- */ options->spawn_pos = i+1; else { fprintf(stderr, "No command after --, aborting.\n"); exit(EXIT_FAILURE); } break; } if (strcmp(argv[i], "-b") == 0) { #ifdef HAVE_LIBCURSES options->batch = 1 - options->batch; #endif continue; } if (strcmp(argv[i], "-c") == 0) { options->show_cmdline = 1 - options->show_cmdline; continue; } if (strcmp(argv[i], "--cpu-min") == 0) { if (i+1 < argc) { options->cpu_threshold = (float)atof(argv[i+1]); i++; continue; } else { fprintf(stderr, "Missing value after --cpu-min.\n"); exit(EXIT_FAILURE); } } if (strcmp(argv[i], "-d") == 0) { if (i+1 < argc) { options->delay = (float)atof(argv[i+1]); if (options->delay < 0.01) options->delay = 1; i++; continue; } else { fprintf(stderr, "Missing delay after -d.\n"); exit(EXIT_FAILURE); } } /* handled separately, before args are read. Just check arg and skip. */ if (strcmp(argv[i], "-E") == 0) { if (i+1 < argc) { i++; continue; } else { fprintf(stderr, "Missing file name after -E.\n"); exit(EXIT_FAILURE); } } if (strcmp(argv[i], "--epoch") == 0) { options->show_epoch = 1 - options->show_epoch; continue; } if (strcmp(argv[i], "-g") == 0) { #ifdef ENABLE_DEBUG options->debug = 1 - options->debug; continue; #else fprintf(stderr, "Debug not supported (try configure --enable-debug)\n"); #endif } if ((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0)) { usage(argv[0]); exit(0); } if (strcmp(argv[i], "-H") == 0) { options->show_threads = 1 - options->show_threads; continue; } if (strcmp(argv[i], "-i") == 0) { options->idle = 1 - options->idle; continue; } if ((strcmp(argv[i], "-K") == 0) || (strcmp(argv[i], "--kernel") == 0)) { if (options->show_kernel) { /* can always reset */ options->show_kernel = 0; continue; } else { /* trying to set */ if ((options->euid == 0) || (options->paranoia_level < 2)) { options->show_kernel = 1; continue; } else { fprintf(stderr, "Kernel mode (-K --kernel) not available.\n"); fprintf(stderr, "You are not root, the binary is not setuid, and the paranoia level is too high.\n"); exit(EXIT_FAILURE); } } } if (strcmp(argv[i], "--list-screens") == 0) { *list_scr = 1; continue; } if (strcmp(argv[i], "-n") == 0) { if (i+1 < argc) { options->max_iter = atoi(argv[i+1]); i++; continue; } else { fprintf(stderr, "Missing number of iterations after -n.\n"); exit(EXIT_FAILURE); } } if (strcmp(argv[i], "--no-collect") == 0) { options->no_collect = 1; continue; } if (strcmp(argv[i], "-o") == 0) { if (i+1 < argc) { options->out = fopen(argv[i+1], "w"); if (!options->out) { perror("fopen"); fprintf(stderr, "Could not open '%s'\n", argv[i+1]); exit(EXIT_FAILURE); } i++; continue; } else { fprintf(stderr, "Missing filename after -o.\n"); exit(EXIT_FAILURE); } } if (strcmp(argv[i], "--only-conf") == 0) { options->default_screen = 0; continue; } if ((strcmp(argv[i], "-p") == 0) || (strcmp(argv[i], "--pid") == 0)) { if (i+1 < argc) { options->only_pid = atoi(argv[i+1]); if (options->only_pid == 0) options->only_name = strdup(argv[i+1]); i++; continue; } else { fprintf(stderr, "Missing pid/name after -p.\n"); exit(EXIT_FAILURE); } } if (strcmp(argv[i], "-S") == 0) { if (i+1 < argc) { char* endptr; errno = 0; *screen_num = strtol(argv[i+1], &endptr, 10); if (errno || (endptr == argv[i+1])) { *screen_num = -(i+1); /* position of the argv to read later */ } i++; continue; } else { fprintf(stderr, "Missing screen number after -S.\n"); exit(EXIT_FAILURE); } } if (strcmp(argv[i], "--sticky") == 0) { options->sticky = 1 - options->sticky; continue; } if (strcmp(argv[i], "--timestamp") == 0) { options->show_timestamp = 1 - options->show_timestamp; continue; } if (strcmp(argv[i], "-U") == 0) { options->show_user = 1 - options->show_user; continue; } if (strcmp(argv[i], "-u") == 0) { if (i+1 < argc) { if (isdigit(argv[i+1][0])) { options->watch_uid = atoi(argv[i+1]); } else { struct passwd* passwd = getpwnam(argv[i+1]); if (!passwd) { fprintf(stderr, "User name '%s' does not exist.\n", argv[i+1]); exit(EXIT_FAILURE); } options->watch_uid = passwd->pw_uid; } i++; continue; } else { fprintf(stderr, "Missing user name after -u.\n"); exit(EXIT_FAILURE); } } if (strcmp(argv[i], "-v") == 0) { print_version(); exit(0); } if (strcmp(argv[i], "--version") == 0) { print_legal(); exit(0); } if (strcmp(argv[i], "-w") == 0) { if (i+1 < argc) { options->watch_pid = atoi(argv[i+1]); if (options->watch_pid == 0) options->watch_name = strdup(argv[i+1]); i++; continue; } else { fprintf(stderr, "Missing pid/name after -w.\n"); exit(EXIT_FAILURE); } } if (strcmp(argv[i], "-W") == 0) { /* error case already handled by previous function */ i++; continue; } if (strstr(argv[0], "ptiptop")) { /* in case we are ptiptop, handle this argument as in tiptop's -p */ options->only_pid = atoi(argv[i]); if (options->only_pid == 0) options->only_name = strdup(argv[i]); } else { fprintf(stderr, "Unknown flag: '%s'\n", argv[i]); exit(EXIT_FAILURE); } } } tiptop-2.3/src/hash.c0000644001151100706620000000611012547160067011506 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011 Inria * * License: GNU General Public License version 2. * */ /* Minimalist hash table to keep track of 'struct process' entries. The key is the thread ID 'tid'. When the list of processes is realloc'd and the data actually moved in memory, the hash table must be completely deleted and rebuilt. This is costly, but should be rather rare. */ #include #include #include #include "config.h" #include "hash.h" #define NUM_HASH_KEYS 16 /* must be a power of 2 */ struct hash_entry { struct process* data; struct hash_entry* next; }; static struct hash_entry* hash_map[NUM_HASH_KEYS]; /* simplest possible hash function */ static inline int hash(int x) { return x & (NUM_HASH_KEYS - 1); } /* Just initialize the buckets to NULL */ void hash_init() { int i; assert((NUM_HASH_KEYS & (NUM_HASH_KEYS - 1)) == 0); /* power of 2 */ for(i=0; i < NUM_HASH_KEYS; i++) hash_map[i] = NULL; } /* Deallocate all entries, and reset the buckets to NULL. */ void hash_fini() { int i; for(i=0; i < NUM_HASH_KEYS; i++) { struct hash_entry* ptr = hash_map[i]; while (ptr) { struct hash_entry* next = ptr->next; free(ptr); ptr = next; } hash_map[i] = NULL; } } #ifdef ENABLE_DEBUG /* Dump all entries (skip NULL buckets). */ void hash_dump() { int i; printf("---------------\n"); for(i=0; i < NUM_HASH_KEYS; i++) { struct hash_entry* ptr = hash_map[i]; if (ptr) printf("[%3d] ", i); while(ptr) { printf("%d ", ptr->data->tid); ptr = ptr->next; } printf("\n"); } } #endif /* ENABLE_DEBUG */ /* Add a pair (key, process) to the table. If the key is already present in the table, nothing happens. */ void hash_add(int key, struct process* proc) { struct hash_entry* new; int h = hash(key); struct hash_entry* ptr = hash_map[h]; while (ptr) { if (ptr->data->tid == key) /* already in */ return; ptr = ptr->next; } /* not found, insert in front */ new = malloc(sizeof(struct hash_entry)); new->data = proc; new->next = hash_map[h]; /* next is current first element (from bucket) */ hash_map[h] = new; /* bucket now points to new element */ } /* Retrieve a process from the key */ struct process* hash_get(int key) { int h = hash(key); struct hash_entry* ptr = hash_map[h]; while (ptr) { if (ptr->data->tid == key) /* found */ return ptr->data; ptr = ptr->next; } return NULL; /* not found */ } /* Delete an entry from the hash table */ void hash_del(int key) { int h = hash(key); struct hash_entry* ptr = hash_map[h]; struct hash_entry* to_delete; /* special case for 1st element */ if (ptr->data->tid == key) { to_delete = ptr; hash_map[h] = ptr->next; free(to_delete); return; } while (ptr) { if (ptr && ptr->next && ptr->next->data->tid == key) { /* found */ to_delete = ptr->next; ptr->next = to_delete->next; free(to_delete); return; } ptr = ptr->next; } assert(0); } tiptop-2.3/src/conf.c0000644001151100706620000001574012547160067011521 00000000000000/* * This file is part of tiptop. * * Author: Erven ROHOU * Copyright (c) 2011, 2012 Inria * * License: GNU General Public License version 2. * */ #include #include #include #include #include #include #include #include "config.h" #include "conf.h" #include "options.h" #include "utils-expression.h" #include "xml-parser.h" static const char* const config_file = ".tiptoprc"; /* Read configuration file. * * First check the path specified on the command line (if any), then * the TIPTOP environment variable, then the local directory, finally * $HOME. */ int read_config(char* path_conf_file, struct option* options) { #ifdef HAVE_LIBXML2 char* path = NULL; char* file = NULL; int res; /* Check path with '-W' in tiptop options */ if (path_conf_file != NULL) { path = path_conf_file; } if (!path) { /* Check Env. Var. $TIPTOP */ path = getenv("TIPTOP"); } if (!path) { /* Check Current Folder */ if (access(config_file, R_OK) == 0) { path = "."; } } if (!path) { /* Check $HOME */ path = getenv("HOME"); } if (!path) return -1; file = malloc(strlen(path) + strlen(config_file) + 2); sprintf(file, "%s/%s", path, config_file); if (access(file, R_OK) == -1) { free(file); return -1; } res = parse_doc(file, options); free(file); return res; #else /* HAVE_LIBXML2 */ fprintf(stderr, "No xml support, cannot read config file.\n"); return -1; #endif /* !HAVE_LIBXML2 */ } static const char* const tok_opt_sta = "\t\t