You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by "Ralf S. Engelschall" <rs...@engelschall.com> on 1998/10/22 16:12:59 UTC
[PATCH] APACI: --permute-module=foo:bar
People often want to permute the order of modules. Sure, for the default
modules we provide a reasonable order, but when you want to add third-party
modules, you want to add it not always at the end of the module list.
For the good old edit-src/Configuration-manually approach of configuring this
is trivial: Permute the AddModule lines in the editor. But APACI (especially
--add-module) didn't provide this functionality in batch because when I wrote
APACI initially I though this functionality cannot be done in a portable way
with /bin/sh, awk and sed. Recently people mailed me again that they would
appreciate this functionality, so I thought about the implementation again and
discovered that it can be done in a portable way. Not really an easy way and
short (oneliner!) way, but at least in a portable way (which is more important
for us than a few code lines more).
So, here it is: --permute-module=foo:bar plus support for two special
variants: --permute-module=^:foo (moves module to start) and
--permute-module=foo:$ (moves module to end). The complete stuff stays inside
an if-clause which is only triggered when the option is actually used. So
don't worry about the large Awk part.
Greetings,
Ralf S. Engelschall
rse@engelschall.com
www.engelschall.com
Index: src/CHANGES
===================================================================
RCS file: /e/apache/REPOS/apache-1.3/src/CHANGES,v
retrieving revision 1.1115
diff -u -r1.1115 CHANGES
--- CHANGES 1998/10/22 11:54:56 1.1115
+++ CHANGES 1998/10/22 14:03:58
@@ -1,5 +1,15 @@
Changes with Apache 1.3.4
+ *) Add a new powerful APACI option --permute-module=foo:bar which can be
+ used to on-the-fly/batch permute the order of the two modules (mod_foo
+ and mod_bar) in the Configuration file. Two special and important
+ variants are supported for the option argument: first ^:foo which
+ permutes module mod_foo with the start of the module list, i.e. it
+ "moves" the module to the begin of the list (gives it lowest priority).
+ And second foo:$ which permutes mod_foo with the end of the module list,
+ i.e. it "moves" the module to the end of the list (gives it highest
+ priority). [Ralf S. Engelschall]
+
*) PORT: DSO/ELF support for FreeBSD 3.0.
[Ralf S. Engelschall, Dirk Froemberg <ib...@physik.TU-Berlin.DE>]
Index: configure
===================================================================
RCS file: /e/apache/REPOS/apache-1.3/configure,v
retrieving revision 1.48
diff -u -r1.48 configure
--- configure 1998/09/17 08:07:53 1.48
+++ configure 1998/10/22 13:58:01
@@ -75,6 +75,7 @@
aux=src/helpers
sedsubst=src/.apaci.sedsubst
addconf=src/.apaci.addconf
+tplconf=src/.apaci.tplconf
configstatus=config.status
##
@@ -203,6 +204,9 @@
# with adjustments
confadjust=1
+# module ordering
+permute=''
+
# determine rules
rules=""
rulelist=""
@@ -357,6 +361,7 @@
shadowaux="src.$gnutriple/helpers"
shadowsedsubst="src.$gnutriple/.apaci.sedsubst"
shadowaddconf="src.$gnutriple/.apaci.addconf"
+ shadowtplconf="src.$gnutriple/.apaci.tplconf"
# (re)create shadow tree
if [ .$quiet = .no ]; then
echo " + create shadow tree ($shadowsrc)"
@@ -372,6 +377,7 @@
addconf=$shadowaddconf
rm -f $addconf 2>/dev/null
touch $addconf
+ tplconf=$shadowtplconf
;;
--help | -h | -help )
echo "Usage: configure [options]"
@@ -409,6 +415,7 @@
echo " --activate-module=FILE on-the-fly activate existing third-party Module source"
echo " --enable-module=NAME enable a particular Module named 'NAME'"
echo " --disable-module=NAME disable a particular Module named 'NAME'"
+ echo " --permute-module=N1:N2 permute module 'N1' with module 'N2' in the configuration"
$aux/ppl.sh $modulelist
echo " --enable-shared=NAME enable build of Module named 'NAME' as a shared object"
echo " --disable-shared=NAME disable build of Module named 'NAME' as a shared object"
@@ -693,6 +700,29 @@
;;
esac
;;
+ --permute-module=*:*)
+ mod1=`echo $apc_optarg | sed -e 's/:.*//'`
+ mod2=`echo $apc_optarg | sed -e 's/.*://'`
+ for mod in $mod1 $mod2; do
+ case $mod in
+ "^"|"\$")
+ ;;
+ *) eval "exists=\$module_${mod}"
+ if [ ".$exists" = . ]; then
+ echo "configure:Error: No such module named '${mod}'" 1>&2
+ exit 1
+ fi
+ ;;
+ esac
+ done
+ case $mod1:$mod2 in
+ ^:\$|*:^|\$:*)
+ echo "configure:Error: Invalid combination of pseudo module identifiers" 1>&2
+ exit 1
+ ;;
+ esac
+ permute="${permute},${mod1}:${mod2}"
+ ;;
--with-perl=*)
PERL="$apc_optarg"
;;
@@ -1008,6 +1038,77 @@
exit 1
fi
+# module permutation support
+if [ ".$permute" != . ]; then
+ sed -e '/## mod_mmap_static/,$d' <src/Configuration.tmpl >$tplconf
+ OIFS="$IFS" IFS='
+'
+ for line in `egrep '^[# ]*(Add|Shared)Module' src/Configuration.tmpl $addconf`; do
+ name=`echo "$line" |\
+ sed -e 's%^.*/\(.*\)$%\1%' \
+ -e 's/\.[oa]$//' \
+ -e 's/^mod_//' \
+ -e 's/^lib//'`
+ echo "${name}::${line}"
+ done |\
+ awk '
+ BEGIN {
+ FS="::";
+ n = 0;
+ }
+ {
+ mod_pos[$1] = n;
+ mod_list[n] = $1;
+ mod_line[$1] = $2;
+ n++;
+ }
+ END {
+ pn = split(permute, perm, ",");
+ for (p = 1; p <= pn; p++) {
+ split(perm[p], mod, ":")
+ m1 = mod[1];
+ m2 = mod[2];
+ if (m1 == "^") {
+ for (i = mod_pos[m2]-1; i >= 0; i--) {
+ n1 = mod_list[i];
+ n2 = mod_list[i+1];
+ mod_list[i] = n2;
+ mod_list[i+1] = n1;
+ mod_pos[n1] = i+1;
+ mod_pos[n2] = i;
+ }
+ }
+ else if (m2 == "$") {
+ for (i = mod_pos[m1]; i < n-1; i++) {
+ n1 = mod_list[i];
+ n2 = mod_list[i+1];
+ mod_list[i] = n2;
+ mod_list[i+1] = n1;
+ mod_pos[n1] = i+1;
+ mod_pos[n2] = i;
+ }
+ }
+ else {
+ p1 = mod_pos[m1];
+ p2 = mod_pos[m2];
+ n1 = mod_list[p1];
+ n2 = mod_list[p2];
+ mod_list[p1] = n2;
+ mod_list[p2] = n1;
+ mod_pos[m1] = p2;
+ mod_pos[m2] = p1;
+ }
+ }
+ for (i = 0; i < n; i++) {
+ printf("%s\n", mod_line[mod_list[i]]);
+ }
+ }
+ ' "permute=$permute" >>$tplconf
+ IFS="$OIFS"
+else
+ cat $src/Configuration.tmpl $addconf >$tplconf
+fi
+
# generate module directives
OIFS="$IFS" IFS=':'
for module in $modules; do
@@ -1056,11 +1157,12 @@
# and finally translate the config template
# according to our defined configuration
-eval "cat $src/Configuration.tmpl $addconf | $substcmd >$src/Configuration.apaci"
+eval "cat $tplconf | $substcmd >$src/Configuration.apaci"
# cleanup
rm -f $sedsubst $sedsubst.[0-9] 2>/dev/null
rm -f $addconf 2>/dev/null
+rm -f $tplconf 2>/dev/null
##
## create all other Makefiles by running the proprietary
Index: INSTALL
===================================================================
RCS file: /e/apache/REPOS/apache-1.3/INSTALL,v
retrieving revision 1.44
diff -u -r1.44 INSTALL
--- INSTALL 1998/10/03 13:26:02 1.44
+++ INSTALL 1998/10/22 14:05:12
@@ -149,18 +149,19 @@
[--mandir=DIR] [--disable-module=NAME]
[--sysconfdir=DIR] [--enable-shared=NAME]
[--datadir=DIR] [--disable-shared=NAME]
- [--includedir=DIR]
- [--localstatedir=DIR] [--enable-suexec]
- [--runtimedir=DIR] [--suexec-caller=UID]
- [--logfiledir=DIR] [--suexec-userdir=DIR]
- [--proxycachedir=DIR] [--suexec-uidmin=UID]
- [--compat] [--suexec-gidmin=GID]
+ [--includedir=DIR] [--permute-module=N1:N2]
+ [--localstatedir=DIR]
+ [--runtimedir=DIR] [--enable-suexec]
+ [--logfiledir=DIR] [--suexec-caller=UID]
+ [--proxycachedir=DIR] [--suexec-userdir=DIR]
+ [--compat] [--suexec-uidmin=UID]
+ [--suexec-gidmin=GID]
[--suexec-safepath=PATH]
+
+ [--with-perl=FILE]
+ [--without-support]
+ [--without-confadjust]
- [--with-perl=FILE]
- [--without-support]
- [--without-confadjust]
-
Use the CC, OPTIM, CFLAGS, INCLUDES, LDFLAGS, LIBS, CFLAGS_SHLIB,
LD_SHLIB, LDFLAGS_SHLIB, LDFLAGS_SHLIB_EXPORT and RANLIB environment
variables to override the corresponding default entries in the
@@ -339,6 +340,15 @@
--enable-shared for some modules on these platforms you also
have to enable the SHARED_CORE rule. For more details please
read the document `htdocs/manual/dso.html'.
+
+ Use the --permute-module=N1:N2 option to permutate the AddModule lines of
+ modules mod_N1 and mod_N2 in the Configuration file. This way one can
+ give modules different priorities. Two special and important variants
+ are supported for the option argument: first ^:N which permutes module
+ mod_N with the start of the module list, i.e. it `moves' the module to
+ the begin of the list (gives it lowest priority). And second N:$ which
+ permutes mod_N with the end of the module list, i.e. it `moves' the
+ module to the end of the list (gives it highest priority).
Use the --with-perl=FILE option to select a particular Perl interpreter
executable to be used with Apache. Per default APACI tries to find it
Re: [PATCH] APACI: --permute-module=foo:bar
Posted by Ben Laurie <be...@algroup.co.uk>.
Ralf S. Engelschall wrote:
>
> People often want to permute the order of modules. Sure, for the default
> modules we provide a reasonable order, but when you want to add third-party
> modules, you want to add it not always at the end of the module list.
>
> For the good old edit-src/Configuration-manually approach of configuring this
> is trivial: Permute the AddModule lines in the editor. But APACI (especially
> --add-module) didn't provide this functionality in batch because when I wrote
> APACI initially I though this functionality cannot be done in a portable way
> with /bin/sh, awk and sed. Recently people mailed me again that they would
> appreciate this functionality, so I thought about the implementation again and
> discovered that it can be done in a portable way. Not really an easy way and
> short (oneliner!) way, but at least in a portable way (which is more important
> for us than a few code lines more).
I'd've thought this would be a relatively straightforward application of
tsort.
Another advantage of using tsort would be that it could diagnose
misordering of modules for us.
Cheers,
Ben.
--
Ben Laurie |Phone: +44 (181) 735 0686| Apache Group member
Freelance Consultant |Fax: +44 (181) 735 0689|http://www.apache.org/
and Technical Director|Email: ben@algroup.co.uk |
A.L. Digital Ltd, |Apache-SSL author http://www.apache-ssl.org/
London, England. |"Apache: TDG" http://www.ora.com/catalog/apache/
WE'RE RECRUITING! http://www.aldigital.co.uk/