about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--Src/Modules/termcap.c2
-rw-r--r--Src/Modules/termcap.mdd12
-rw-r--r--Src/Modules/terminfo.c2
-rw-r--r--Src/Modules/terminfo.mdd12
-rw-r--r--aczsh.m481
-rw-r--r--configure.in84
7 files changed, 139 insertions, 63 deletions
diff --git a/ChangeLog b/ChangeLog
index 4bddff7c8..023fdce7c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+
+2001-02-02  Andrej Borsenkow <Andrej.Borsenkow@mow.siemens.ru>
+
+	* 13431: aczsh.m4,configure.in,Src/Modules/termcap.c,
+	Src/Modules/termcap.mdd,Src/Modules/terminfo.c,
+	Src/Modules/terminfo.mdd,Src/mkmakemod.sh: hopefully better
+	check for shared libraries. Link in termcap/terminfo statically
+	if shared libtermcap/libcurses unavailable
+
 2001-02-13  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 13462: Src/Modules/zpty.c: try to make the -t option of zpty
diff --git a/Src/Modules/termcap.c b/Src/Modules/termcap.c
index 8f5f650f9..9c72bf27f 100644
--- a/Src/Modules/termcap.c
+++ b/Src/Modules/termcap.c
@@ -33,7 +33,7 @@
 /* echotc: output a termcap */
 
 /**/
-int
+static int
 bin_echotc(char *name, char **argv, char *ops, int func)
 {
     char *s, buf[2048], *t, *u;
diff --git a/Src/Modules/termcap.mdd b/Src/Modules/termcap.mdd
index 5f88a9662..89f939ff8 100644
--- a/Src/Modules/termcap.mdd
+++ b/Src/Modules/termcap.mdd
@@ -1,5 +1,15 @@
 name=zsh/termcap
-link=either
+
+link='if test "x$ac_cv_func_tgetent" = xyes; then
+          if test "x$zsh_cv_shared_tgetent" = xyes; then
+	      echo either
+	  else
+	      echo static
+	  fi
+      else
+          echo no;
+      fi
+'
 load=yes
 
 autobins="echotc"
diff --git a/Src/Modules/terminfo.c b/Src/Modules/terminfo.c
index 512f4b474..7eb47bdb3 100644
--- a/Src/Modules/terminfo.c
+++ b/Src/Modules/terminfo.c
@@ -36,7 +36,7 @@ static Param terminfo_pm;
 /* echoti: output a terminfo capability */
 
 /**/
-int
+static int
 bin_echoti(char *name, char **argv, char *ops, int func)
 {
     char *s, *t;
diff --git a/Src/Modules/terminfo.mdd b/Src/Modules/terminfo.mdd
index 251281742..dd01bed3a 100644
--- a/Src/Modules/terminfo.mdd
+++ b/Src/Modules/terminfo.mdd
@@ -1,5 +1,15 @@
 name=zsh/terminfo
-link='if test "x$ac_cv_func_tigetstr" = xyes; then echo either; else echo no; fi'
+
+link='if test "x$ac_cv_func_tigetstr" = xyes; then
+          if test "x$zsh_cv_shared_tigetstr" = xyes; then
+	      echo either
+	  else
+	      echo static
+	  fi
+      else
+          echo no;
+      fi
+'
 load=yes
 
 autobins="echoti"
diff --git a/aczsh.m4 b/aczsh.m4
index b32ed9fca..83738311d 100644
--- a/aczsh.m4
+++ b/aczsh.m4
@@ -111,32 +111,59 @@ main()
 
 
 dnl
-dnl zsh_SYS_DYNAMIC_BROKEN
-dnl   Check whether static/shared library linking is broken.
+dnl zsh_SHARED_FUNCTION
+dnl
+dnl This is just a frontend to zsh_SHARED_SYMBOL
+dnl
+dnl Usage: zsh_SHARED_FUNCTION(name[,rettype[,paramtype]])
+dnl
+
+AC_DEFUN(zsh_SHARED_FUNCTION,
+[zsh_SHARED_SYMBOL($1, ifelse([$2], ,[int ],[$2]) $1 [(]ifelse([$3], ,[ ],[$3])[)], $1)])
+
+dnl
+dnl zsh_SHARED_VARIABLE
+dnl
+dnl This is just a frontend to zsh_SHARED_SYMBOL
+dnl
+dnl Usage: zsh_SHARED_VARIABLE(name[,type])
+dnl
+
+AC_DEFUN(zsh_SHARED_VARIABLE,
+[zsh_SHARED_SYMBOL($1, ifelse([$2], ,[int ],[$2]) $1, [&$1])])
+
+dnl
+dnl zsh_SHARED_SYMBOL
+dnl   Check whether symbol is available in static or shared library
 dnl
 dnl   On some systems, static modifiable library symbols (such as environ)
 dnl   may appear only in statically linked libraries.  If this is the case,
 dnl   then two shared libraries that reference the same symbol, each linked
 dnl   with the static library, could be given distinct copies of the symbol.
-dnl   If this is the case then dynamic linking is FUBAR.
+dnl
+dnl Usage: zsh_SHARED_SYMBOL(name,declaration,address)
+dnl Sets zsh_cv_shared_$1 cache variable to yes/no
 dnl
 
-AC_DEFUN(zsh_SYS_DYNAMIC_BROKEN,
-[AC_CACHE_CHECK([if static/shared library linking is broken],
-zsh_cv_sys_dynamic_broken,
+AC_DEFUN(zsh_SHARED_SYMBOL,
+[AC_CACHE_CHECK([if $1 is available in shared libraries],
+zsh_cv_shared_$1,
 [if test "$zsh_cv_func_dlsym_needs_underscore" = yes; then
     us=_
 else
     us=
 fi
 echo '
-	extern char **environ;
-	void *symlist1[[]] = {
-		(void *)&environ,
-		(void *)0
-	};
+void *zsh_getaddr1()
+{
+#ifdef __CYGWIN__
+	__attribute__((__dllimport__))	
+#endif
+	extern $2;
+	return $3;
+};
 ' > conftest1.c
-sed 's/symlist1/symlist2/' < conftest1.c > conftest2.c
+sed 's/zsh_getaddr1/zsh_getaddr2/' < conftest1.c > conftest2.c
 if $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&5 2>&5 &&
 $DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS 1>&5 2>&5 &&
 $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&5 2>&5 &&
@@ -172,25 +199,33 @@ char *zsh_gl_sym_addr ;
 main()
 {
     void *handle1, *handle2;
-    void **symlist1, **symlist2;
+    void *(*zsh_getaddr1)(), *(*zsh_getaddr2)();
+    void *sym1, *sym2;
     handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
     if(!handle1) exit(1);
     handle2 = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
     if(!handle2) exit(1);
-    symlist1 = (void **) dlsym(handle1, "${us}symlist1");
-    symlist2 = (void **) dlsym(handle2, "${us}symlist2");
-    if(!symlist1 || !symlist2) exit(1);
-    for(; *symlist1; symlist1++, symlist2++)
-	if(*symlist1 != *symlist2)
-	    exit(1);
+    zsh_getaddr1 = (void *(*)()) dlsym(handle1, "${us}zsh_getaddr1");
+    zsh_getaddr2 = (void *(*)()) dlsym(handle2, "${us}zsh_getaddr2");
+    sym1 = zsh_getaddr1();
+    sym2 = zsh_getaddr2();
+    if(!sym1 || !sym2) exit(1);
+    if(sym1 != sym2) exit(1);
+    dlclose(handle1);
+    handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
+    if(!handle1) exit(1);
+    zsh_getaddr1 = (void *(*)()) dlsym(handle1, "${us}zsh_getaddr1");
+    sym1 = zsh_getaddr1();
+    if(!sym1) exit(1);
+    if(sym1 != sym2) exit(1);
     exit(0);
 }
-], [zsh_cv_sys_dynamic_broken=no],
-[zsh_cv_sys_dynamic_broken=yes],
-[zsh_cv_sys_dynamic_broken=yes]
+], [zsh_cv_shared_$1=yes],
+[zsh_cv_shared_$1=no],
+[zsh_cv_shared_$1=no]
 )
 else
-    zsh_cv_sys_dynamic_broken=yes
+    zsh_cv_shared_$1=no
 fi
 ])
 ])
diff --git a/configure.in b/configure.in
index da5fb5e90..c31190af1 100644
--- a/configure.in
+++ b/configure.in
@@ -493,7 +493,9 @@ dnl -------------------
 dnl On some systems, modules need to be linked against libc explicitly,
 dnl in case they require objects that exist only in the static version
 dnl and might not be compiled into the zsh executable.
-AC_CHECK_LIB(c, printf)
+dnl On ReliantUNIX -lc better be the last library, else funny things
+dnl may happen.
+AC_CHECK_LIB(c, printf, [LIBS="$LIBS -lc"])
 
 AC_CHECK_LIB(m, pow)
 
@@ -557,37 +559,6 @@ elif test $zsh_cv_decl_ospeed_must_define = yes; then
   AC_DEFINE(MUST_DEFINE_OSPEED)
 fi
 
-dnl  Check if tgetent accepts NULL (and will allocate its own termcap buffer)
-dnl  Some termcaps reportedly accept a zero buffer, but then dump core
-dnl  in tgetstr().
-dnl  Under Cygwin test program crashes but exit code is still 0. So,
-dnl  we test for a file that porgram should create
-AC_CACHE_CHECK(if tgetent accepts NULL,
-zsh_cv_func_tgetent_accepts_null,
-[AC_TRY_RUN([
-main()
-{
-    int i = tgetent((char*)0,"vt100");
-    if (i > 0) {
-	char tbuf[1024], *u;
-    	u = tbuf;
-    	tgetstr("cl", &u);
-	creat("conftest.tgetent", 0640);
-    }
-    exit(!i || i == -1);
-}
-],
-  if test -f conftest.tgetent; then
-    zsh_cv_func_tgetent_accepts_null=yes
-  else
-    zsh_cv_func_tgetent_accepts_null=no
-  fi,
-  zsh_cv_func_tgetent_accepts_null=no,
-  zsh_cv_func_tgetent_accepts_null=no)])
-if test $zsh_cv_func_tgetent_accepts_null = yes; then
-  AC_DEFINE(TGETENT_ACCEPTS_NULL)
-fi
-
 dnl --------------
 dnl CHECK TYPEDEFS
 dnl --------------
@@ -845,9 +816,40 @@ AC_CHECK_FUNCS(strftime difftime gettimeofday \
 	       putenv getenv \
 	       brk sbrk \
 	       pathconf sysconf \
-	       tigetflag tigetnum tigetstr)
+	       tgetent tigetflag tigetnum tigetstr)
 AC_FUNC_STRCOLL
 
+dnl  Check if tgetent accepts NULL (and will allocate its own termcap buffer)
+dnl  Some termcaps reportedly accept a zero buffer, but then dump core
+dnl  in tgetstr().
+dnl  Under Cygwin test program crashes but exit code is still 0. So,
+dnl  we test for a file that porgram should create
+AC_CACHE_CHECK(if tgetent accepts NULL,
+zsh_cv_func_tgetent_accepts_null,
+[AC_TRY_RUN([
+main()
+{
+    int i = tgetent((char*)0,"vt100");
+    if (i > 0) {
+	char tbuf[1024], *u;
+    	u = tbuf;
+    	tgetstr("cl", &u);
+	creat("conftest.tgetent", 0640);
+    }
+    exit(!i || i == -1);
+}
+],
+  if test -f conftest.tgetent; then
+    zsh_cv_func_tgetent_accepts_null=yes
+  else
+    zsh_cv_func_tgetent_accepts_null=no
+  fi,
+  zsh_cv_func_tgetent_accepts_null=no,
+  zsh_cv_func_tgetent_accepts_null=no)])
+if test $zsh_cv_func_tgetent_accepts_null = yes; then
+  AC_DEFINE(TGETENT_ACCEPTS_NULL)
+fi
+
 AC_FUNC_MMAP
 if test x$ac_cv_func_mmap_fixed_mapped = xyes; then
   AC_CHECK_FUNCS(munmap msync)
@@ -1471,7 +1473,10 @@ elif test "x$ac_cv_cygwin" = xyes; then
   zsh_cv_sys_dynamic_execsyms="${zsh_cv_sys_dynamic_execsyms=no}"
   zsh_cv_sys_dynamic_strip_exe="${zsh_cv_sys_dynamic_strip_exe=yes}"
   zsh_cv_sys_dynamic_strip_lib="${zsh_cv_sys_dynamic_strip_lib=yes}"
-  zsh_cv_sys_dynamic_broken="${zsh_cv_sys_dynamic_broken=no}"
+  #
+  # THAT SUCKS! and must be changed
+  #
+  zsh_cv_shared_environ="${zsh_cv_shared_environ=yes}"
   LINKMODS=LINKMODS
   MOD_EXPORT="__attribute__((__dllexport__))"
   MOD_IMPORT_VARIABLE="__attribute__((__dllimport__))"
@@ -1616,8 +1621,15 @@ main()
 fi
 
 if test "x$dynamic" = xyes; then
-  zsh_SYS_DYNAMIC_BROKEN
-  test "$zsh_cv_sys_dynamic_broken" = no || dynamic=no
+  zsh_SHARED_VARIABLE([environ], [char **])
+  test "$zsh_cv_shared_environ" = yes || dynamic=no
+dnl  test "$zsh_cv_sys_dynamic_broken" = no || dynamic=no
+  if test "$ac_cv_func_tgetent" = yes; then
+    zsh_SHARED_FUNCTION([tgetent])
+  fi
+  if test "$ac_cv_func_tigetstr" = yes; then
+    zsh_SHARED_FUNCTION([tigetstr])
+  fi
 fi
 
 if test "x$dynamic" = xyes; then