Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: Add `--enable-additional-fpath' configure option



We (as in the debian zsh maintainer team) got a request for adding
additional directories to `$fpath' for people's packages to drop
function files into. We do have "/usr/local/share/zsh/site-functions",
but "/usr/local" should not be touched by debian packages.

We were first contemplated to add something reasonable to the global
zshenv file. That would work in almost all cases, except for when zsh is
started in sh-mode.

With this, we can do:

 % ./configure --enable-additional-fpath=/usr/share/zsh/vendor-functions

...and have every shell get the right initial fpath.

`setupvals()' is a little crowded with #ifdefs, but I think I got it
right... It adds the added paths right after the site-functions entry,
so a local admin could still supersede any function file if he'd chose
to do so.

Documentation update in INSTALL included.

Comments?  I won't be committing this before I get ACKs. :)

Regards, Frank
---
 Config/defs.mk.in |    3 +++
 INSTALL           |    7 +++++++
 Src/init.c        |   21 +++++++++++++++++++--
 Src/zsh.mdd       |    4 ++++
 configure.ac      |   13 +++++++++++++
 5 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/Config/defs.mk.in b/Config/defs.mk.in
index cd3afa6..58ef110 100644
--- a/Config/defs.mk.in
+++ b/Config/defs.mk.in
@@ -86,6 +86,9 @@ INSTALL_DATA    = @INSTALL_DATA@
 # variables used in determining what to install
 FUNCTIONS_SUBDIRS = @FUNCTIONS_SUBDIRS@
 
+# Additional fpath entries (eg. for vendor specific directories).
+additionalfpath = @additionalfpath@
+
 # flags passed to recursive makes in subdirectories
 MAKEDEFS = \
 prefix='$(prefix)' exec_prefix='$(exec_prefix)' bindir='$(bindir)' \
diff --git a/INSTALL b/INSTALL
index 9829ea3..fe03c8d 100644
--- a/INSTALL
+++ b/INSTALL
@@ -472,6 +472,12 @@ $fpath array on shell startup.  This directory will not be affected by
 `make uninstall' or `make uninstall.fns', although the version-specific
 directory and its contents will be deleted.
 
+The --enable-additional-fpath option may be used to add arbitrary
+directories to the shell's default $fpath array.  This may be useful to
+have vendor specific function directories available for vendor specific
+addons.  You may add more than one directory this way by listing them with
+the option separated by commas.
+
 Function depth
 --------------
 
@@ -593,6 +599,7 @@ fndir=directory      # the directory where shell functions will go
                      # [DATADIR/zsh/VERSION/functions]
 site-fndir=directory # the directory where site-specific functions can go
                      # [DATADIR/zsh/site-functions]
+additional-path      # add directories to default function path [<none>]
 function-subdirs     # if functions will be installed into subdirectories [no]
 dynamic              # allow dynamically loaded binary modules [yes]
 largefile            # allow configure check for large files [yes]
diff --git a/Src/init.c b/Src/init.c
index aa052d8..0fcecef 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -676,11 +676,15 @@ setupvals(void)
     struct timezone dummy_tz;
     char *ptr;
     int i, j;
-#if defined(SITEFPATH_DIR) || defined(FPATH_DIR)
+#if defined(SITEFPATH_DIR) || defined(FPATH_DIR) || defined (ADDITIONAL_FPATH)
     char **fpathptr;
 # if defined(FPATH_DIR) && defined(FPATH_SUBDIRS)
     char *fpath_subdirs[] = FPATH_SUBDIRS;
 # endif
+# if defined(ADDITIONAL_FPATH)
+    char *more_fndirs[] = ADDITIONAL_FPATH;
+    int more_fndirs_len;
+# endif
 # ifdef SITEFPATH_DIR
     int fpathlen = 1;
 # else
@@ -764,7 +768,7 @@ setupvals(void)
     manpath  = mkarray(NULL);
     fignore  = mkarray(NULL);
 
-#if defined(SITEFPATH_DIR) || defined(FPATH_DIR)
+#if defined(SITEFPATH_DIR) || defined(FPATH_DIR) || defined(ADDITIONAL_FPATH)
 # ifdef FPATH_DIR
 #  ifdef FPATH_SUBDIRS
     fpathlen += sizeof(fpath_subdirs)/sizeof(char *);
@@ -772,15 +776,28 @@ setupvals(void)
     fpathlen++;
 #  endif
 # endif
+# if defined(ADDITIONAL_FPATH)
+    more_fndirs_len = sizeof(more_fndirs)/sizeof(char *);
+    fpathlen += more_fndirs_len;
+# endif
     fpath = fpathptr = (char **)zalloc((fpathlen+1)*sizeof(char *));
 # ifdef SITEFPATH_DIR
     *fpathptr++ = ztrdup(SITEFPATH_DIR);
     fpathlen--;
 # endif
+# if defined(ADDITIONAL_FPATH)
+    for (j = 0; j < more_fndirs_len; j++)
+	*fpathptr++ = ztrdup(more_fndirs[j]);
+# endif
 # ifdef FPATH_DIR
 #  ifdef FPATH_SUBDIRS
+#   ifdef ADDITIONAL_FPATH
+    for (j = more_fndirs_len; j < fpathlen; j++)
+	*fpathptr++ = tricat(FPATH_DIR, "/", fpath_subdirs[j - more_fndirs_len]);
+#   else
     for (j = 0; j < fpathlen; j++)
 	*fpathptr++ = tricat(FPATH_DIR, "/", fpath_subdirs[j]);
+#endif
 #  else
     *fpathptr++ = ztrdup(FPATH_DIR);
 #  endif
diff --git a/Src/zsh.mdd b/Src/zsh.mdd
index 537aa4d..c420bcc 100644
--- a/Src/zsh.mdd
+++ b/Src/zsh.mdd
@@ -86,6 +86,10 @@ zshpaths.h: Makemod $(CONFIG_INCS)
 	    >>zshpaths.h.tmp; \
 	  fi; \
 	fi
+	@if test x$(additionalfpath) != x; then \
+	  fpath_tmp="`echo $(additionalfpath) | sed -e 's:,:\", \":'`"; \
+	  echo "#define ADDITIONAL_FPATH { \"$$fpath_tmp\" }" >> zshpaths.h.tmp; \
+	fi
 	@if cmp -s zshpaths.h zshpaths.h.tmp; then \
 	    rm -f zshpaths.h.tmp; \
 	    echo "\`zshpaths.h' is up to date." ; \
diff --git a/configure.ac b/configure.ac
index fca1dd6..116de2e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -276,6 +276,16 @@ else
   FUNCTIONS_SUBDIRS=no
 fi
 
+ifdef([additionalfpath],[undefine([additionalfpath])])dnl
+AC_ARG_ENABLE(additional-fpath,
+AC_HELP_STRING([--enable-additional-fpath=DIR], [add directories to default function path]),
+[if test x$enableval = xyes; then
+  additionalfpath=""
+else
+  additionalfpath="${enableval}"
+fi], [additionalfpath=""])
+
+AC_SUBST(additionalfpath)dnl
 AC_SUBST(fndir)dnl
 AC_SUBST(sitefndir)dnl
 AC_SUBST(FUNCTIONS_SUBDIRS)dnl
@@ -3088,6 +3098,9 @@ info install path         : ${zshinfo}"
 if test "$zshfndir" != no; then
   echo "functions install path    : ${zshfndir}"
 fi
+if test "x$additionalfpath" != x; then
+  echo "additional fpath entries  : ${additionalfpath}"
+fi
 echo "See config.modules for installed modules and functions.
 "
 
-- 
1.7.4.1.140.g89781



Messages sorted by: Reverse Date, Date, Thread, Author