From 0ef48b5027d57246554f589d3d1901ad773b78b2 Mon Sep 17 00:00:00 2001 From: "Kevin L. Mitchell" Date: Thu, 21 Jun 2001 23:28:53 +0000 Subject: [PATCH] Author: Kev 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 | 6 + Makefile.in | 13 ++ tools/transition | 481 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 500 insertions(+) create mode 100755 tools/transition diff --git a/ChangeLog b/ChangeLog index 768b9c1..9ec07a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2001-06-21 Kevin L. Mitchell + * 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 diff --git a/Makefile.in b/Makefile.in index d324fb9..cd9497b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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 index 0000000..a2aee89 --- /dev/null +++ b/tools/transition @@ -0,0 +1,481 @@ +#!/bin/sh +# +# IRC - Internet Relay Chat, tools/transition +# Copyright (C) 2001 Kevin L. Mitchell +# +# 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 -- 2.20.1