Author: Kev <klmitch@mit.edu>
authorKevin L. Mitchell <klmitch@mit.edu>
Thu, 21 Jun 2001 23:28:53 +0000 (23:28 +0000)
committerKevin L. Mitchell <klmitch@mit.edu>
Thu, 21 Jun 2001 23:28:53 +0000 (23:28 +0000)
Log message:

Changing the way configuration is done has its problems--no one pays
attention to anything you say about it.  I've added a notice warning users
that "make config" is deprecated.  I've also added a script to help
migrate an existing tree to the new way of doing things.  I've done a lot
of testing of this script, but it could still get some things wrong; it's
pretty complicated.  Enjoy!

git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@510 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ChangeLog
Makefile.in
tools/transition [new file with mode: 0755]

index 768b9c18ad0c7c3a4116220a6e1e0f6ce4c69d6d..9ec07a1ddb6c09030ce434093a87abfe955e83e8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2001-06-21  Kevin L. Mitchell  <klmitch@mit.edu>
 
+       * Makefile.in (config): add a deprecation notice with a pointer to
+       tools/transition
+
+       * tools/transition: shell script to convert old compile-time
+       options into new compile-time options and appropriate F-lines
+
        * tools/mkchroot: shell-script to prepare the chroot area by
        copying over all the necessary libraries so they can be found
 
index d324fb943fe61cce662e3f831088a37fb1fd6810..cd9497b46e9ec73e49a597d70a65e6f9611add37 100644 (file)
@@ -41,6 +41,19 @@ build:
                cd $$i; ${MAKE} build; cd ..; \
        done
 
+config:
+       @echo "*************************************************************"
+       @echo "* The \"make config\" step is now DEPRECATED.  Most           *"
+       @echo "* server options are now configurable via the configuration *"
+       @echo "* file using F-lines; the rest are specified on the command *"
+       @echo "* line to \"./configure\".  To aid the transition, a shell    *"
+       @echo "* script has been provided to generate the necessary        *"
+       @echo "* configuration lines for you.  You may run this script by  *"
+       @echo "* typing \"tools/transition\"; please pay attention to its    *"
+       @echo "* output.  This message will be removed for the next major  *"
+       @echo "* release of ircu.                                          *"
+       @echo "*************************************************************"
+
 root-clean:
        @for i in '*.orig' '.*.orig' '\#*' '*~' '.*~' '*.bak' '.*.bak' core; do\
                echo "Removing $$i"; \
diff --git a/tools/transition b/tools/transition
new file mode 100755 (executable)
index 0000000..a2aee89
--- /dev/null
@@ -0,0 +1,481 @@
+#!/bin/sh
+#
+# IRC - Internet Relay Chat, tools/transition
+# Copyright (C) 2001 Kevin L. Mitchell <klmitch@mit.edu>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 1, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# $Id: transition,v 1.1 2001-06-21 23:28:53 kev Exp $
+
+# Better than having evals all over the place
+setvar () {
+    eval $1=\$2
+}
+getvar () {
+    eval echo \$$1
+}
+
+# Set up an echo that doesn't newline-terminate
+if test x`echo -n` = x-n; then
+    echo_n () {
+       echo "$@"'\c'
+    }
+else
+    echo_n () {
+       echo -n "$@"
+    }
+fi
+
+# Debugging notices, enabled only if $DEBUG has something in it
+if test x"$DEBUG" = x; then
+    deb () {
+       :
+    }
+    deb_n () {
+       :
+    }
+else
+    deb () {
+       echo "$@"
+    }
+    deb_n () {
+       echo_n "$@"
+    }
+fi
+
+# Get base directory; first step, how were we called?
+case $0 in
+*/*)
+    basedir=`echo $0 | sed -e 's@/[^/]*@@g'`
+    ;;
+
+*)
+    basedir=`pwd`
+    ;;
+esac
+
+# Now locate the ircd subdirectory
+if test -d $basedir/ircd; then
+    :
+elif test -d $basedir/../ircd; then
+    basedir=$basedir/..
+elif test -d ./ircd; then
+    basedir=`pwd`
+else
+    echo "Cannot find base ircd directory!" >&2
+    exit 1
+fi
+
+# Finally, canonicalize it
+cwd=`pwd`
+cd $basedir
+basedir=`pwd`
+cd $cwd
+
+deb "Base directory: $basedir"
+
+# This is where our ./configure-parsable results will go
+cache_file=$basedir/config.cache
+
+# Now locate .config and config.cache
+config_in=
+config_cache_in=
+
+# If the config subdirectory isn't there anymore, don't bother checking there
+if test -d $basedir/config; then
+    if test -r $basedir/config/.config; then
+       config_in=$basedir/config/.config
+    fi
+
+    if test -r $basedir/config/config.cache; then
+       config_cache_in=$basedir/config/config.cache
+    fi
+fi
+
+# Last ditch effort...try ../.config
+if test x"$config_in" = x; then
+    if test -r $basedir/../.config; then
+       config_in=$basedir/../.config
+    else
+       echo "Cannot find original .config file!" >&2
+       exit 2
+    fi
+fi
+
+# Last ditch effort...try ../.config.cache
+if test x"$config_cache_in" = x; then
+    if test -r $basedir/../.config.cache; then
+       config_cache_in=$basedir/../.config.cache
+    else
+       echo "Cannot find original config.cache file!" >&2
+       exit 3
+    fi
+fi
+
+# Now load the two data files
+echo "Loading old config.cache file $config_cache_in"
+. $config_cache_in
+echo "Loading old .config file $config_in"
+. $config_in
+
+# Now we have to track down the defaults so we will know what to generate
+# F-lines for
+if test ! -r $basedir/ircd/ircd_features.c; then
+    echo "Cannot find default features!" >&2
+    exit 4
+fi
+
+echo_n "Loading feature default values; please be patient... "
+deb ""
+features=
+exec 4<$basedir/ircd/ircd_features.c
+while read line <&4; do
+    # if a line has '(' but not ')', then we hang them until we find the
+    # matching ')'; this is not robust!
+    if test x"$hangline" != x; then
+       line="$hangline $line"
+       hangline=
+    fi
+
+    if test x"`echo "$line" | grep '(' 2>/dev/null`" != x -a \
+           x"`echo "$line" | grep ')' 2>/dev/null`" = x; then
+       hangline=$line
+       continue
+    fi
+
+    # Now we process the line we read...
+    case $line in
+    \#*) # We want to ignore the #define, since it's a false positive
+       ;;
+
+    F_[NIBS]*) # Found one of the feature define macros
+       type=`echo "$line" | sed -e 's/^F_\([NIBS]\).*$/\1/g'`
+       arglist=`echo "$line" | sed -e 's/^F_[NIBS](\(.*\)),.*/\1/g' \
+                -e 's/ | /|/g'`
+
+       # Now we must parse the arguments
+       tIFS=$IFS
+       IFS=,$IFS
+       name=
+       value=
+       argnum=0
+       for arg in $arglist; do
+           case $type$argnum in
+               [NIBS]0) # First argument is always the name of the feature
+                   name=$arg
+                   ;;
+
+               I2) # Second argument of F_I() is the numerical value
+                   value=$arg
+                   ;;
+
+               B2) # Second argument of F_B() is a numerical value
+                   # We must convert this numerical value to "y" or "n"
+                   if test x"$arg" = x0; then
+                       value=n
+                   else
+                       value=y
+                   fi
+                   ;;
+
+               [ST]2) # Second argument of F_S() is a string value; must
+                      # take into account unquoted possibilities, though
+                   dequote=`echo "$arg" | sed -e 's/^"\(.*\)"$/\1/g'`
+                   if test x"$dequote" = x"$arg"; then
+                       type=T
+                       value=$arg
+                   else
+                       value=$dequote
+                   fi
+                   ;;
+           esac
+
+           # Next time through, we'll be testing the next argument
+           argnum=`expr $argnum + 1`
+       done
+       IFS=$tIFS
+
+       deb "Loaded feature \"$name\" of type \"$type\"; default: \"$value\""
+
+       # Store the information we extracted
+       setvar type_$name $type
+       setvar def_$name "$value"
+
+       # Keep a list of features we've checked
+       features="$features $name"
+       ;;
+    esac
+done
+exec 4<&-
+echo "done"
+
+echo "Converting some options that are still compile-time"
+
+unet_cv_prefix=`echo $SPATH | sed -e 's@/bin/ircd@@g'`
+deb "Installation directory (derived from SPATH)... $unet_cv_prefix"
+
+deb_n "Enable debugging (DEBUGMODE)... "
+if test x"$DEBUGMODE" = xy; then
+    unet_cv_enable_debug=yes
+else
+    unet_cv_enable_debug=no
+fi
+deb "$unet_cv_enable_debug"
+
+deb_n "Enable assertion checking (CONFIG_NDEBUG)... "
+if test x"$CONFIG_NDEBUG" = xy; then
+    unet_cv_enable_asserts=yes
+else
+    unet_cv_enable_asserts=no
+fi
+deb "$unet_cv_enable_asserts"
+
+deb_n "Force inlining of some critical functions (FORCEINLINE)... "
+if test x"$FORCEINLINE" = xy; then
+    unet_cv_enable_inlines=yes
+else
+    unet_cv_enable_inlines=no
+fi
+deb "$unet_cv_enable_inlines"
+
+unet_cv_with_symlink=$SYMLINK
+deb "Symlink name (SYMLINK)... $unet_cv_with_symlink"
+
+unet_cv_with_mode=$IRCDMODE
+deb "Binary permissions (IRCDMODE)... $unet_cv_with_mode"
+
+unet_cv_with_owner=$IRCDOWN
+deb "Binary owner (IRCDOWN)... $unet_cv_with_owner"
+
+unet_cv_with_group=$IRCDGRP
+deb "Binary group owner (IRCDGRP)... $unet_cv_with_group"
+
+unet_cv_with_domain=$DOMAINNAME
+deb "Local domain name (DOMAINNAME)... $unet_cv_with_domain"
+
+deb_n "Enable CHROOT operation (CHROOTDIR)... "
+if test x"$CHROOTDIR" = xy; then
+    deb_n "yes, path "
+    unet_cv_with_chroot=$DPATH
+else
+    unet_cv_with_chroot=no
+fi
+deb "$unet_cv_with_chroot"
+
+unet_cv_with_dpath=$DPATH
+deb "Data path (DPATH)... $unet_cv_with_dpath"
+
+unet_cv_with_cpath=$CPATH
+deb "Configuration file (CPATH)... $unet_cv_with_cpath"
+
+# LPATH may not be set; if it's not, we'll just ignore it here and let
+# ./configure fill it in appropriately
+if test x"$LPATH" != x; then
+    unet_cv_with_lpath=$LPATH
+    deb "Debug log file (LPATH)... $unet_cv_with_lpath"
+fi
+
+unet_cv_with_maxcon=$MAXCONNECTIONS
+deb "Maximum number of connections (MAXCONNECTIONS)... $unet_cv_with_maxcon"
+
+# Shouldn't run ./configure before the transition script, but we can deal
+if test -r "$cache_file"; then
+    echo "WARNING: Destroying new config.cache file $cache_file" >&2
+    rm $cache_file
+fi
+
+# Create the cache file...
+echo "Creating new config.cache file $cache_file"
+> $cache_file
+
+# This section is copied from a GNU autoconf-generated configure script
+###############################################################################
+cat > confcache <<\EOF
+# 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.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# 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.
+(set) 2>&1 |
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+  *ac_space=\ *)
+    # `set' does not quote correctly, so add quotes (double-quote substitution
+    # turns \\\\ into \\, and sed turns \\ into \).
+    sed -n \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+###############################################################################
+
+# If they ran ./configure before, there'll be a config.status hanging around;
+# if so, we can run that to integrate the config.cache we just generated.
+if test -x $basedir/config.status; then
+    echo "Running $basedir/config.status to update configuration"
+    cwd=`pwd`
+    cd $basedir
+    # Have to run it twice to get the Makefile recreated
+    ./config.status --recheck
+    ./config.status
+    cd $cwd
+fi
+
+# Now we need to track down ircd.conf so we can add the F-lines.
+echo_n "Locating IRCD configuration file... "
+case $unet_cv_with_cpath in
+/*) # CPATH is absolute
+    conf_file=$unet_cv_with_cpath
+    ;;
+
+*) # CPATH is relative to DPATH
+    conf_file=$unet_cv_with_dpath/$unet_cv_with_cpath
+    ;;
+esac
+# suppress duplicate '/'
+conf_file=`echo "$conf_file" | sed -e 's@//*@/@g'`
+echo "$conf_file"
+
+# if we can't find the .conf, use "flines.conf" in the base directory (so
+# they'll be easy to find).
+if test ! -r $conf_file; then
+    fline_conf=yes
+    conf_file=$basedir/flines.conf
+    if test ! -r $conf_file; then
+       > $conf_file
+    fi
+    echo "WARNING: Unable to read ircd.conf; you will need to add the" >&2
+    echo "         F-lines manually.  For your convenience, they will be" >&2
+    echo "         placed in $conf_file." >&2
+fi
+
+# here's where we take the old .config and compare it to the feature defaults
+echo_n "Building feature table... "
+for feature in $features; do
+    defval=`getvar def_$feature`
+    value=`getvar $feature`
+
+    if test x"$value" = x -o x"$value" = x"$defval"; then
+       setvar FEAT_$feature $defval
+    else
+       setvar FEAT_$feature $value
+    fi
+done
+
+# We won't add an F-line for DOMAINNAME, since (hopefully) the right one is
+# already compiled in
+FEAT_DOMAINNAME=DOMAINNAME
+
+# Have to make sure we have a RANDOM_SEED to enhance randomness...
+FEAT_RANDOM_SEED=$RANDOM_SEED
+
+# This feature changed names to be consistent...
+FEAT_OPER_LBADCHAN=$LOCAL_BADCHAN
+
+# DEFAULT_LIST_PARAM is perhaps the most complicated to transition, but
+# this'll do the trick...
+if test x"$CONFIG_LIST" = xy; then
+    FEAT_DEFAULT_LIST_PARAM=$DEFAULT_LIST_PARAM
+else
+    FEAT_DEFAULT_LIST_PARAM=0
+fi
+
+echo "done"
+
+# Now we just generate the F-lines
+echo_n "Generating F-lines... "
+exec 4>>$conf_file
+
+# The various log files are set up first--these are all that were defined
+# in u2.10.10.pl15
+if test x"$CONFIG_LOG_WHOX" = xy; then
+    echo "F:LOG:WHO:FILE:$WPATH" >&4
+fi
+if test x"$CONFIG_LOG_GLINES" = xy; then
+    echo "F:LOG:GLINE:FILE:$GPATH" >&4
+fi
+if test x"$CONFIG_LOG_USERS" = xy; then
+    echo "F:LOG:USER:FILE:$FNAME_USERLOG" >&4
+fi
+if test x"$CONFIG_LOG_OPERS" = xy; then
+    echo "F:LOG:OPER:FILE:$FNAME_OPERLOG" >&4
+fi
+
+# Now we traverse the entire feature table and compare values with their
+# defaults
+for feature in $features; do
+    type=`getvar type_$feature`
+    defval=`getvar def_$feature`
+    value=`getvar FEAT_$feature`
+
+    if test x"$defval" != x"$value"; then
+       if test x"$type" = xB; then
+           # Must map booleans yet again; I prefer TRUE/FALSE
+           if test x"$value" = xy; then
+               value=TRUE
+           else
+               value=FALSE
+           fi
+       fi
+
+       # Write the F-line
+       echo "F:$feature:$value" >&4
+    fi
+done
+exec 4>&-
+echo "done"
+
+echo_n "Transition is complete."
+if test ! -r $basedir/config.status; then
+    echo_n "  You should now run ./configure."
+fi
+
+echo ""
+
+if test x"$fline_conf" = xyes; then
+    echo "Don't forget to add the F-lines to your ircd.conf.  They can be"
+    echo "found in $conf_file."
+else
+    echo "Don't forget to verify the F-lines in your ircd.conf!"
+fi