Andrej: Dynamic loading on cygwin

This commit is contained in:
Peter Stephenson 2000-08-02 18:01:51 +00:00
parent de7b6730bc
commit 4f1aa826f5
11 changed files with 453 additions and 211 deletions

View file

@ -1,3 +1,10 @@
2000-08-02 Peter Stephenson <pws@csr.com>
* Andrej: 12487: configure.in, Etc/MACHINES, Src/Makefile.in,
Src/init.c, Src/main.c, Src/makepro.awk, Src/mkmakemod.sh,
Src/parse.c, Src/zsh.h, Src/Zle/zle_utils.c: Dynamic loading
on cygwin.
2000-08-02 Clint Adams <schizo@debian.org> 2000-08-02 Clint Adams <schizo@debian.org>
* 12489: Src/Modules/files.c, Src/Modules/parameter.c: check * 12489: Src/Modules/files.c, Src/Modules/parameter.c: check

View file

@ -30,14 +30,19 @@ Cygnus Solutions: Cygwin on Intel
be on a file system mounted as binary (the mount command shows be on a file system mounted as binary (the mount command shows
`binmode'). `binmode').
Dynamic loading does not work (this is automatically detected), Dynamic loading works as of cygwin-1.1.3 and binutils-20000722-1.
though libraries not compiled by default will work (see the file It was not tested for earlier versions. This does not imply
INSTALL for how to add these to the base executable). In that every module will work. New completion and in
particular zsh/zftp and zsh/mathfunc are known to work. particular zsh/zftp and zsh/mathfunc are known to work.
Some of the tests in the Test subdirectory are known to fail: Some of the tests in the Test subdirectory are known to fail:
this is because the UNIX environment is not completely implemented. this is because the UNIX environment is not completely implemented.
Cygwin allows mount without existing mount point (e.g.
"mount //server/path /usr/src" where /usr/src does not exist).
Path completion will fail inside these mounts; make sure that
every mount point really exists.
Data General: DG/UX 5.4R3.10 MU01 (various AViiONs) Data General: DG/UX 5.4R3.10 MU01 (various AViiONs)
Should build `out-of-the-box'. Should build `out-of-the-box'.

View file

@ -58,6 +58,8 @@ modules: headers
MAIN_OBJS = main.o MAIN_OBJS = main.o
L = @L@
LSTMP = LSTMP =
LLIST = LLIST =
NSTMP = stamp-modobjs NSTMP = stamp-modobjs
@ -65,6 +67,8 @@ NLIST = `cat stamp-modobjs`
LIBZSH = libzsh-$(VERSION).$(DL_EXT) LIBZSH = libzsh-$(VERSION).$(DL_EXT)
NIBZSH = NIBZSH =
INSTLIB = @INSTLIB@
UNINSTLIB = @UNINSTLIB@
ZSH_EXPORT = $(EXPOPT)zsh.export ZSH_EXPORT = $(EXPOPT)zsh.export
ZSH_NXPORT = ZSH_NXPORT =
@ -80,7 +84,7 @@ zsh$(EXEEXT): $(@L@IBZSH) $(@L@STMP) $(MAIN_OBJS) zsh.export
$(LIBZSH): $(LIBOBJS) $(NSTMP) $(LIBZSH): $(LIBOBJS) $(NSTMP)
rm -f $@ rm -f $@
$(DLLINK) $(LIBOBJS) $(NLIST) $(DLLINK) $(LIBOBJS) $(NLIST) $(LIBS)
stamp-modobjs: modobjs stamp-modobjs: modobjs
@if cmp -s stamp-modobjs.tmp stamp-modobjs; then \ @if cmp -s stamp-modobjs.tmp stamp-modobjs; then \
@ -176,7 +180,7 @@ uninstall.bin: uninstall.bin-here
.PHONY: install.bin uninstall.bin .PHONY: install.bin uninstall.bin
# install binary, creating install directory if necessary # install binary, creating install directory if necessary
install.bin-here: zsh$(EXEEXT) install.bin-@L@ install.bin-here: zsh$(EXEEXT) $(INSTLIB)
$(sdir_top)/mkinstalldirs $(DESTDIR)$(bindir) $(sdir_top)/mkinstalldirs $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) $(STRIPFLAGS) zsh$(EXEEXT) $(DESTDIR)$(bindir)/$(tzsh)-$(VERSION)$(EXEEXT) $(INSTALL_PROGRAM) $(STRIPFLAGS) zsh$(EXEEXT) $(DESTDIR)$(bindir)/$(tzsh)-$(VERSION)$(EXEEXT)
if test -f $(DESTDIR)$(bindir)/$(tzsh)$(EXEEXT); then \ if test -f $(DESTDIR)$(bindir)/$(tzsh)$(EXEEXT); then \
@ -192,17 +196,21 @@ install.bin-N:
install.bin-L: $(LIBZSH) install.bin-L: $(LIBZSH)
$(sdir_top)/mkinstalldirs $(DESTDIR)$(libdir)/$(tzsh) $(sdir_top)/mkinstalldirs $(DESTDIR)$(libdir)/$(tzsh)
$(INSTALL_PROGRAM) $(LIBZSH) $(DESTDIR)$(libdir)/$(tzsh)/$(LIBZSH) $(INSTALL_PROGRAM) $(LIBZSH) $(DESTDIR)$(libdir)/$(tzsh)/$(LIBZSH)
.PHONY: install.bin-N install.bin-L install.cygwin-lib: $(LIBZSH)
$(INSTALL_PROGRAM) $(LIBZSH) $(DESTDIR)$(bindir)/$(LIBZSH)
.PHONY: install.bin-N install.bin-L install.cygwin-lib
# uninstall binary # uninstall binary
uninstall.bin-here: uninstall.bin-@L@ uninstall.bin-here: $(UNINSTLIB)
rm -f $(DESTDIR)$(bindir)/$(tzsh)-$(VERSION) $(DESTDIR)$(bindir)/$(tzsh)$(EXEEXT) rm -f $(DESTDIR)$(bindir)/$(tzsh)-$(VERSION) $(DESTDIR)$(bindir)/$(tzsh)$(EXEEXT)
.PHONY: uninstall.bin-here uninstall.bin-@L@ .PHONY: uninstall.bin-here uninstall.bin-@L@
uninstall.bin-N: uninstall.bin-N:
uninstall.bin-L: uninstall.bin-L:
rm -f $(DESTDIR)$(libdir)/$(tzsh)/$(LIBZSH) rm -f $(DESTDIR)$(libdir)/$(tzsh)/$(LIBZSH)
.PHONY: uninstall.bin-N uninstall.bin-L uninstall.cygwin-lib:
rm -f $(DESTDIR)$(bindir)/$(LIBZSH)
.PHONY: uninstall.bin-N uninstall.bin-L uninstall.cygwin-lib
# ========== DEPENDENCIES FOR CLEANUP ========== # ========== DEPENDENCIES FOR CLEANUP ==========

View file

@ -379,7 +379,7 @@ printbind(char *str, FILE *stream)
* The message must be metafied. */ * The message must be metafied. */
/**/ /**/
void void mod_export
showmsg(char const *msg) showmsg(char const *msg)
{ {
char const *p; char const *p;

View file

@ -1123,3 +1123,97 @@ fallback_compctlread(char *name, char **args, char *ops, char *reply)
NULL, 0); NULL, 0);
return 1; return 1;
} }
/*
* This is real main entry point. This has to be mod_export'ed
* so zsh.exe can found it on Cygwin
*/
/**/
mod_export int
zsh_main(int argc, char **argv)
{
char **t;
int t0;
#ifdef USE_LOCALE
setlocale(LC_ALL, "");
#endif
init_hackzero(argv, environ);
/*
* Provisionally set up the type table to allow metafication.
* This will be done properly when we have decided if we are
* interactive
*/
typtab['\0'] |= IMETA;
typtab[STOUC(Meta) ] |= IMETA;
typtab[STOUC(Marker)] |= IMETA;
for (t0 = (int)STOUC(Pound); t0 <= (int)STOUC(Nularg); t0++)
typtab[t0] |= ITOK | IMETA;
for (t = argv; *t; *t = metafy(*t, -1, META_ALLOC), t++);
zsh_name = argv[0];
do {
char *arg0 = zsh_name;
if (!(zsh_name = strrchr(arg0, '/')))
zsh_name = arg0;
else
zsh_name++;
if (*zsh_name == '-')
zsh_name++;
if (strcmp(zsh_name, "su") == 0) {
char *sh = zgetenv("SHELL");
if (sh && *sh && arg0 != sh)
zsh_name = sh;
else
break;
} else
break;
} while (zsh_name);
fdtable_size = OPEN_MAX;
fdtable = zcalloc(fdtable_size);
createoptiontable();
emulate(zsh_name, 1); /* initialises most options */
opts[LOGINSHELL] = (**argv == '-');
opts[MONITOR] = 1; /* may be unset in init_io() */
opts[PRIVILEGED] = (getuid() != geteuid() || getgid() != getegid());
opts[USEZLE] = 1; /* may be unset in init_io() */
parseargs(argv); /* sets INTERACTIVE, SHINSTDIN and SINGLECOMMAND */
SHTTY = -1;
init_io();
setupvals();
init_signals();
init_bltinmods();
run_init_scripts();
init_misc();
for (;;) {
do
loop(1,0);
while (tok != ENDINPUT && (tok != LEXERR || isset(SHINSTDIN)));
if (tok == LEXERR) {
stopmsg = 1;
zexit(lastval, 0);
}
if (!(isset(IGNOREEOF) && interact)) {
#if 0
if (interact)
fputs(islogin ? "logout\n" : "exit\n", shout);
#endif
zexit(lastval, 0);
continue;
}
noexitct++;
if (noexitct >= 10) {
stopmsg = 1;
zexit(lastval, 0);
}
zerrnam("zsh", (!islogin) ? "use 'exit' to exit."
: "use 'logout' to logout.", NULL, 0);
}
}

View file

@ -34,87 +34,5 @@
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
char **t; return (zsh_main(argc, argv));
int t0;
#ifdef USE_LOCALE
setlocale(LC_ALL, "");
#endif
init_hackzero(argv, environ);
/*
* Provisionally set up the type table to allow metafication.
* This will be done properly when we have decided if we are
* interactive
*/
typtab['\0'] |= IMETA;
typtab[STOUC(Meta) ] |= IMETA;
typtab[STOUC(Marker)] |= IMETA;
for (t0 = (int)STOUC(Pound); t0 <= (int)STOUC(Nularg); t0++)
typtab[t0] |= ITOK | IMETA;
for (t = argv; *t; *t = metafy(*t, -1, META_ALLOC), t++);
zsh_name = argv[0];
do {
char *arg0 = zsh_name;
if (!(zsh_name = strrchr(arg0, '/')))
zsh_name = arg0;
else
zsh_name++;
if (*zsh_name == '-')
zsh_name++;
if (strcmp(zsh_name, "su") == 0) {
char *sh = zgetenv("SHELL");
if (sh && *sh && arg0 != sh)
zsh_name = sh;
else
break;
} else
break;
} while (zsh_name);
fdtable_size = OPEN_MAX;
fdtable = zcalloc(fdtable_size);
createoptiontable();
emulate(zsh_name, 1); /* initialises most options */
opts[LOGINSHELL] = (**argv == '-');
opts[MONITOR] = 1; /* may be unset in init_io() */
opts[PRIVILEGED] = (getuid() != geteuid() || getgid() != getegid());
opts[USEZLE] = 1; /* may be unset in init_io() */
parseargs(argv); /* sets INTERACTIVE, SHINSTDIN and SINGLECOMMAND */
SHTTY = -1;
init_io();
setupvals();
init_signals();
init_bltinmods();
run_init_scripts();
init_misc();
for (;;) {
do
loop(1,0);
while (tok != ENDINPUT && (tok != LEXERR || isset(SHINSTDIN)));
if (tok == LEXERR) {
stopmsg = 1;
zexit(lastval, 0);
}
if (!(isset(IGNOREEOF) && interact)) {
#if 0
if (interact)
fputs(islogin ? "logout\n" : "exit\n", shout);
#endif
zexit(lastval, 0);
continue;
}
noexitct++;
if (noexitct >= 10) {
stopmsg = 1;
zexit(lastval, 0);
}
zerrnam("zsh", (!islogin) ? "use 'exit' to exit."
: "use 'logout' to logout.", NULL, 0);
}
} }

View file

@ -18,13 +18,9 @@ BEGIN {
gsub(/\//, "_", name) gsub(/\//, "_", name)
ARGC-- ARGC--
# `locals' is a list of local declarations, built up while global printf "E#ifndef have_%s_globals\n", name
# declarations are output. printf "E#define have_%s_globals\n", name
locals = "" printf "E\n"
printf "#ifndef have_%s_globals\n", name
printf "#define have_%s_globals\n", name
printf "\n"
} }
# all relevant declarations are preceded by "/**/" on a line by itself # all relevant declarations are preceded by "/**/" on a line by itself
@ -40,6 +36,13 @@ BEGIN {
aborting = 1 aborting = 1
exit 1 exit 1
} }
if (line == "" && $0 ~ /^[ \t]*#/) {
# Directly after the /**/ was a preprocessor line.
# Spit it out and re-start the outer loop.
printf "E%s\n", $0
printf "L%s\n", $0
next
}
gsub(/\t/, " ") gsub(/\t/, " ")
line = line " " $0 line = line " " $0
gsub(/\/\*([^*]|\*+[^*\/])*\*+\//, " ", line) gsub(/\/\*([^*]|\*+[^*\/])*\*+\//, " ", line)
@ -74,13 +77,16 @@ BEGIN {
break break
} }
sub(/^ */, "", line) sub(/^ */, "", line)
match(line, /^((const|enum|static|struct|union) +)*([_0-9A-Za-z]+ +|((char|double|float|int|long|short|unsigned|void) +)+)((const|static) +)*/) match(line, /^((const|enum|mod_export|static|struct|union) +)*([_0-9A-Za-z]+ +|((char|double|float|int|long|short|unsigned|void) +)+)((const|static) +)*/)
dtype = substr(line, 1, RLENGTH) dtype = substr(line, 1, RLENGTH)
sub(/ *$/, "", dtype) sub(/ *$/, "", dtype)
islocal = " " dtype " " ~ / static / if(" " dtype " " ~ / static /)
locality = "L"
else
locality = "E"
exported = " " dtype " " ~ / mod_export /
line = substr(line, RLENGTH+1) "," line = substr(line, RLENGTH+1) ","
# Handle each declarator. # Handle each declarator.
output = ""
while(match(line, /^[^,]*,/)) { while(match(line, /^[^,]*,/)) {
# Separate out the name from the declarator. Use "@+" and "@-" # Separate out the name from the declarator. Use "@+" and "@-"
# to bracket the name within the declarator. Strip off any # to bracket the name within the declarator. Strip off any
@ -103,44 +109,29 @@ BEGIN {
gsub(/@>/, ")", dcltor) gsub(/@>/, ")", dcltor)
gsub(/@!/, ",", dcltor) gsub(/@!/, ",", dcltor)
# If this is a module boot/cleanup function, conditionally rename it. # If this is exported, add it to the exported symbol list.
if(" " dtype " " ~ / int / && dcltor ~ / *@\+(boot|cleanup)_[_0-9A-Za-z]+@- *_\(\( *Module +[_0-9A-Za-z]+ *\)\) */) { if(exported)
modtype = dnam printf "X%s\n", dnam
sub(/_.*$/, "", modtype)
output = output "# if defined(DYNAMIC_NAME_CLASH_OK) && defined(MODULE)\n"
output = output "# define " dnam " " modtype "_\n"
output = output "# endif\n"
}
# Format the declaration for output # Format the declaration for output
dcl = dtype " " dcltor ";" dcl = dtype " " dcltor ";"
if(!islocal) if(locality ~ /E/)
dcl = "extern " dcl dcl = "extern " dcl
if(isfunc)
gsub(/ mod_export /, " mod_import_function ", dcl)
else
gsub(/ mod_export /, " mod_import_variable ", dcl)
gsub(/@[+-]/, "", dcl) gsub(/@[+-]/, "", dcl)
gsub(/ +/, " ", dcl) gsub(/ +/, " ", dcl)
while(match(dcl, /[^_0-9A-Za-z] ./) || match(dcl, /. [^_0-9A-Za-z]/)) while(match(dcl, /[^_0-9A-Za-z] ./) || match(dcl, /. [^_0-9A-Za-z]/))
dcl = substr(dcl, 1, RSTART) substr(dcl, RSTART+2) dcl = substr(dcl, 1, RSTART) substr(dcl, RSTART+2)
output = output dcl "\n" printf "%s%s\n", locality, dcl
} }
# Output global declarations now, but save up locals until the end.
if(islocal)
locals = locals output
else
printf "%s", output
} }
END { END {
if(aborting) if(aborting)
exit 1 exit 1
printf "\n" printf "E\n"
printf "#endif /* !have_%s_globals */\n", name printf "E#endif /* !have_%s_globals */\n", name
if(locals != "") {
printf "\n"
printf "#ifndef GLOBAL_PROTOTYPES\n"
printf "\n"
printf locals
printf "\n"
printf "#endif /* !GLOBAL_PROTOTYPES */\n"
}
} }

View file

@ -17,15 +17,21 @@
# defines one module. The .mdd file is actually a shell script, which will # defines one module. The .mdd file is actually a shell script, which will
# be sourced. It may define the following shell variables: # be sourced. It may define the following shell variables:
# #
# moddeps modules on which this module depends (default none) # name name of this module
# nozshdep non-empty indicates no dependence on the `zsh' pseudo-module # moddeps modules on which this module depends (default none)
# alwayslink if non-empty, always link the module into the executable # nozshdep non-empty indicates no dependence on the `zsh/main' pseudo-module
# autobins builtins defined by the module, for autoloading # alwayslink if non-empty, always link the module into the executable
# objects .o files making up this module (*must* be defined) # autobins builtins defined by the module, for autoloading
# proto .pro files for this module (default generated from $objects) # autoinfixconds infix condition codes defined by the module, for
# headers extra headers for this module (default none) # autoloading (without the leading `-')
# hdrdeps extra headers on which the .mdh depends (default none) # autoprefixconds like autoinfixconds, but for prefix condition codes
# otherincs extra headers that are included indirectly (default none) # autoparams parameters defined by the module, for autoloading
# automathfuncs math functions defined by the module, for autoloading
# objects .o files making up this module (*must* be defined)
# proto .syms files for this module (default generated from $objects)
# headers extra headers for this module (default none)
# hdrdeps extra headers on which the .mdh depends (default none)
# otherincs extra headers that are included indirectly (default none)
# #
# The .mdd file may also include a Makefile.in fragment between lines # The .mdd file may also include a Makefile.in fragment between lines
# `:<<\Make' and `Make' -- this will be copied into Makemod.in. # `:<<\Make' and `Make' -- this will be copied into Makemod.in.
@ -34,9 +40,9 @@
# For each module in also knows how to build a .mdh file. Each source file # For each module in also knows how to build a .mdh file. Each source file
# should #include the .mdh file for the module it is a part of. The .mdh # should #include the .mdh file for the module it is a part of. The .mdh
# file #includes the .mdh files for any module dependencies, then each of # file #includes the .mdh files for any module dependencies, then each of
# $headers, and then each of $proto (for global declarations). It will # $headers, and then each .epro (for global declarations). It will
# be recreated if any of the dependency .mdh files changes, or if any of # be recreated if any of the dependency .mdh files changes, or if any of
# $headers or $hdrdeps changes. When anything depends on it, all of $proto # $headers or $hdrdeps changes. When anything depends on it, all the .epros
# and $otherincs will be made up to date, but the .mdh file won't actually # and $otherincs will be made up to date, but the .mdh file won't actually
# be rebuilt if those files change. # be rebuilt if those files change.
# #
@ -67,6 +73,15 @@ sed_normalise='
s,\(.\)/$,\1, s,\(.\)/$,\1,
' '
CYGWIN=no
if uname -s > /dev/null 2>&1; then
case `uname -s` in
CYGWIN* )
CYGWIN=yes
;;
esac
fi
# decide which stages to process # decide which stages to process
first_stage=true first_stage=true
second_stage=true second_stage=true
@ -98,14 +113,14 @@ if $first_stage; then
echo echo
. Src/modules.index . Src/modules.index
bin_mods=" zsh "`sed 's/^/ /;s/$/ /' Src/modules-bltin` bin_mods=" zsh/main "`sed 's/^/ /;s/$/ /' Src/modules-bltin`
if grep '%@D@%D%' config.status >/dev/null; then if grep '%@D@%D%' config.status >/dev/null; then
is_dynamic=true is_dynamic=true
else else
is_dynamic=false is_dynamic=false
fi fi
here_modules= here_mddnames=
all_subdirs= all_subdirs=
all_modobjs= all_modobjs=
all_modules= all_modules=
@ -114,30 +129,31 @@ if $first_stage; then
all_proto= all_proto=
lastsub=// lastsub=//
for module in $module_list; do for module in $module_list; do
eval "loc=\$loc_$module" q_module=`echo $module | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`
case $loc in eval "modfile=\$modfile_$q_module"
$the_subdir) case $modfile in
here_modules="$here_modules $module" $the_subdir/$lastsub/*) ;;
$the_subdir/*/*)
lastsub=`echo $modfile | sed 's,^'$the_subdir'/,,;s,/[^/]*$,,'`
all_subdirs="$all_subdirs $lastsub"
;;
$the_subdir/*)
mddname=`echo $modfile | sed 's,^.*/,,;s,\.mdd$,,'`
here_mddnames="$here_mddnames $mddname"
build=$is_dynamic build=$is_dynamic
case $is_dynamic@$bin_mods in case $is_dynamic@$bin_mods in
*" $module "*) *" $module "*)
build=true build=true
all_modobjs="$all_modobjs modobjs.${module}" ;; all_modobjs="$all_modobjs modobjs.${mddname}" ;;
true@*) true@*)
all_modules="$all_modules ${module}.\$(DL_EXT)" ;; all_modules="$all_modules ${mddname}.\$(DL_EXT)" ;;
esac esac
all_mdds="$all_mdds ${module}.mdd" all_mdds="$all_mdds ${mddname}.mdd"
$build && all_mdhs="$all_mdhs ${module}.mdh" $build && all_mdhs="$all_mdhs ${mddname}.mdh"
$build && all_proto="$all_proto proto.${module}" $build && all_proto="$all_proto proto.${mddname}"
;;
$lastsub | $lastsub/*) ;;
$the_subdir/*)
all_subdirs="$all_subdirs $loc"
lastsub=$loc
;; ;;
esac esac
done done
all_subdirs=`echo "$all_subdirs" | sed "s' $the_subdir/' 'g"`
echo "MODOBJS =$all_modobjs" echo "MODOBJS =$all_modobjs"
echo "MODULES =$all_modules" echo "MODULES =$all_modules"
echo "MDDS =$all_mdds" echo "MDDS =$all_mdds"
@ -145,6 +161,11 @@ if $first_stage; then
echo "PROTOS =$all_proto" echo "PROTOS =$all_proto"
echo "SUBDIRS =$all_subdirs" echo "SUBDIRS =$all_subdirs"
echo echo
echo "ENTRYOBJ = \$(dir_src)/modentry..o"
echo "NNTRYOBJ ="
echo "ENTRYOPT = -emodentry"
echo "NNTRYOPT ="
echo
echo "##### ===== INCLUDING Makemod.in.in ===== #####" echo "##### ===== INCLUDING Makemod.in.in ===== #####"
echo echo
@ -159,95 +180,230 @@ if $first_stage; then
other_mdhs= other_mdhs=
remote_mdhs= remote_mdhs=
for module in $here_modules; do other_exports=
remote_exports=
other_modules=
remote_modules=
for mddname in $here_mddnames; do
unset moddeps nozshdep alwayslink unset name moddeps nozshdep alwayslink hasexport
unset autobins unset autobins autoinfixconds autoprefixconds autoparams automathfuncs
unset objects proto headers hdrdeps otherincs unset objects proto headers hdrdeps otherincs
. $top_srcdir/$the_subdir/${module}.mdd . $top_srcdir/$the_subdir/${mddname}.mdd
q_name=`echo $name | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`
test -n "${moddeps+set}" || moddeps= test -n "${moddeps+set}" || moddeps=
test -n "$nozshdep" || moddeps="$moddeps zsh" test -n "$nozshdep" || moddeps="$moddeps zsh/main"
test -n "${proto+set}" || test -n "${proto+set}" ||
proto=`echo $objects '' | sed 's,\.o ,.pro ,g'` proto=`echo $objects '' | sed 's,\.o ,.syms ,g'`
dobjects=`echo $objects '' | sed 's,\.o ,..o ,g'` dobjects=`echo $objects '' | sed 's,\.o ,..o ,g'`
modhdeps= modhdeps=
mododeps=
exportdeps=
imports=
q_moddeps=
dllname=
for dep in $moddeps; do for dep in $moddeps; do
eval "loc=\$loc_$dep" q_dep=`echo $dep | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`
q_moddeps="$q_moddeps $q_dep"
eval "depfile=\$modfile_$q_dep"
eval `echo $depfile | sed 's,/\([^/]*\)\.mdd$,;depbase=\1,;s,^,loc=,'`
case "$binmod" in
*" $dep "* )
dep=zsh/main
;;
esac
case $the_subdir in case $the_subdir in
$loc) $loc)
mdh="${dep}.mdh" mdh="${depbase}.mdh"
export="${depbase}.export"
case "$dep" in
zsh/main )
mdll="\$(dir_top)/Src/libzsh-\$(VERSION).\$(DL_EXT) "
;;
zsh/$mddname )
mdll=
;;
* )
mdll="${depbase}.\$(DL_EXT) "
;;
esac
;; ;;
$loc/*) $loc/*)
mdh="\$(dir_top)/$loc/${dep}.mdh" mdh="\$(dir_top)/$loc/${depbase}.mdh"
case "$other_mdhs " in case "$other_mdhs " in
*" $mdh "*) ;; *" $mdh "*) ;;
*) other_mdhs="$other_mdhs $mdh" ;; *) other_mdhs="$other_mdhs $mdh" ;;
esac esac
export="\$(dir_top)/$loc/${depbase}.export"
case "$other_exports " in
*" $export "*) ;;
*) other_exports="$other_exports $export" ;;
esac
case "$dep" in
zsh/main )
mdll="\$(dir_top)/Src/libzsh-\$(VERSION).\$(DL_EXT) "
;;
zsh/$mddname )
mdll=
;;
* )
mdll="\$(dir_top)/$loc/${depbase}.\$(DL_EXT) "
;;
esac
case "$other_modules " in
*" $mdll "*) ;;
*) other_modules="$other_modules $mdll" ;;
esac
;; ;;
*) *)
mdh="\$(dir_top)/$loc/${dep}.mdh" mdh="\$(dir_top)/$loc/${depbase}.mdh"
case "$remote_mdhs " in case "$remote_mdhs " in
*" $mdh "*) ;; *" $mdh "*) ;;
*) remote_mdhs="$remote_mdhs $mdh" ;; *) remote_mdhs="$remote_mdhs $mdh" ;;
esac esac
export="\$(dir_top)/$loc/${depbase}.export"
case "$remote_exports " in
*" $export "*) ;;
*) remote_exports="$remote_exports $export" ;;
esac
case "$dep" in
zsh/main )
mdll="\$(dir_top)/Src/libzsh-\$(VERSION).\$(DL_EXT) "
;;
zsh/$mddname )
mdll=
;;
* )
mdll="\$(dir_top)/$loc/${depbase}.\$(DL_EXT) "
;;
esac
case "$remote_modules " in
*" $mdll "*) ;;
*) remote_modules="$remote_modules $mdll" ;;
esac
;; ;;
esac esac
modhdeps="$modhdeps $mdh" modhdeps="$modhdeps $mdh"
exportdeps="$exportdeps $export"
imports="$imports \$(IMPOPT)$export"
if test $CYGWIN = yes -a -n "$mdll"; then
case "$mododeps" in
*" $mdll "* )
:
;;
* )
mododeps="$mododeps $mdll"
;;
esac
fi
done done
if test $CYGWIN = yes; then
dllname="--dllname $q_name"
fi
echo "##### ===== DEPENDENCIES GENERATED FROM ${module}.mdd ===== #####" echo "##### ===== DEPENDENCIES GENERATED FROM ${mddname}.mdd ===== #####"
echo echo
echo "MODOBJS_${module} = $objects" echo "MODOBJS_${mddname} = $objects"
echo "MODDOBJS_${module} = $dobjects" echo "MODDOBJS_${mddname} = $dobjects \$(@E@NTRYOBJ)"
echo "PROTO_${module} = $proto" echo "SYMS_${mddname} = $proto"
echo "INCS_${module} = \$(PROTO_${module}) $otherincs" echo "EPRO_${mddname} = "`echo $proto '' | sed 's,\.syms ,.epro ,g'`
echo "INCS_${mddname} = \$(EPRO_${mddname}) $otherincs"
echo "EXPIMP_${mddname} = $imports \$(EXPOPT)$mddname.export"
echo "NXPIMP_${mddname} ="
echo "DEPMODS_${mddname} = $mododeps"
echo "DLLNAME_${mddname} = $dllname"
echo echo
echo "proto.${module}: \$(PROTO_${module})" echo "proto.${mddname}: \$(EPRO_${mddname})"
echo "\$(PROTO_${module}): \$(PROTODEPS)" echo "\$(SYMS_${mddname}): \$(PROTODEPS)"
echo echo
echo "modobjs.${module}: \$(MODOBJS_${module})" echo "${mddname}.export: \$(SYMS_${mddname})"
echo " echo '' \$(MODOBJS_${module}) $modobjs_sed>> \$(dir_src)/stamp-modobjs.tmp" echo " ( echo '#!'; cat \$(SYMS_${mddname}) | sed -n '/^X/{s/^X//;p;}' | sort -u ) > \$@"
echo
echo "modobjs.${mddname}: \$(MODOBJS_${mddname})"
echo " echo '' \$(MODOBJS_${mddname}) $modobjs_sed>> \$(dir_src)/stamp-modobjs.tmp"
echo echo
if test -z "$alwayslink"; then if test -z "$alwayslink"; then
echo "${module}.\$(DL_EXT): \$(MODDOBJS_${module})" case " $all_modules" in *" ${mddname}."*)
echo "install.modules-here: install.modules.${mddname}"
echo "uninstall.modules-here: uninstall.modules.${mddname}"
echo
;; esac
instsubdir=`echo $name | sed 's,^,/,;s,/[^/]*$,,'`
echo "install.modules.${mddname}: ${mddname}.\$(DL_EXT)"
echo " \$(sdir_top)/mkinstalldirs \$(DESTDIR)\$(MODDIR)${instsubdir}"
echo " \$(INSTALL_PROGRAM) ${mddname}.\$(DL_EXT) \$(DESTDIR)\$(MODDIR)/${name}.\$(DL_EXT)"
echo
echo "uninstall.modules.${mddname}:"
echo " rm -f \$(DESTDIR)\$(MODDIR)/${name}.\$(DL_EXT)"
echo
echo "${mddname}.\$(DL_EXT): \$(MODDOBJS_${mddname}) ${mddname}.export $exportdeps \$(DEPMODS_${mddname})"
echo ' rm -f $@' echo ' rm -f $@'
echo " \$(DLLINK) \$(MODDOBJS_${module}) \$(LIBS)" echo " \$(DLLINK) \$(@E@XPIMP_$mddname) \$(@E@NTRYOPT) \$(DLLNAME_${mddname}) \$(MODDOBJS_${mddname}) \$(DEPMODS_${mddname}) \$(LIBS) "
echo echo
fi fi
echo "${module}.mdhi: ${module}.mdhs \$(INCS_${module})" echo "${mddname}.mdhi: ${mddname}.mdhs \$(INCS_${mddname})"
echo " @test -f \$@ || echo 'do not delete this file' > \$@" echo " @test -f \$@ || echo 'do not delete this file' > \$@"
echo echo
echo "${module}.mdhs: ${module}.mdd" echo "${mddname}.mdhs: ${mddname}.mdd"
echo " @\$(MAKE) -f \$(makefile) \$(MAKEDEFS) ${module}.mdh.tmp" echo " @\$(MAKE) -f \$(makefile) \$(MAKEDEFS) ${mddname}.mdh.tmp"
echo " @if cmp -s ${module}.mdh ${module}.mdh.tmp; then \\" echo " @if cmp -s ${mddname}.mdh ${mddname}.mdh.tmp; then \\"
echo " rm -f ${module}.mdh.tmp; \\" echo " rm -f ${mddname}.mdh.tmp; \\"
echo " echo \"\\\`${module}.mdh' is up to date.\"; \\" echo " echo \"\\\`${mddname}.mdh' is up to date.\"; \\"
echo " else \\" echo " else \\"
echo " mv -f ${module}.mdh.tmp ${module}.mdh; \\" echo " mv -f ${mddname}.mdh.tmp ${mddname}.mdh; \\"
echo " echo \"Updated \\\`${module}.mdh'.\"; \\" echo " echo \"Updated \\\`${mddname}.mdh'.\"; \\"
echo " fi" echo " fi"
echo " echo 'timestamp for ${module}.mdh against ${module}.mdd' > \$@" echo " echo 'timestamp for ${mddname}.mdh against ${mddname}.mdd' > \$@"
echo echo
echo "${module}.mdh: ${modhdeps} ${headers} ${hdrdeps} ${module}.mdhi" echo "${mddname}.mdh: ${modhdeps} ${headers} ${hdrdeps} ${mddname}.mdhi"
echo " @\$(MAKE) -f \$(makefile) \$(MAKEDEFS) ${module}.mdh.tmp" echo " @\$(MAKE) -f \$(makefile) \$(MAKEDEFS) ${mddname}.mdh.tmp"
echo " @mv -f ${module}.mdh.tmp ${module}.mdh" echo " @mv -f ${mddname}.mdh.tmp ${mddname}.mdh"
echo " @echo \"Updated \\\`${module}.mdh'.\"" echo " @echo \"Updated \\\`${mddname}.mdh'.\""
echo echo
echo "${module}.mdh.tmp:" echo "${mddname}.mdh.tmp:"
echo " @( \\" echo " @( \\"
echo " echo '#ifndef have_${module}_module'; \\" echo " echo '#ifndef have_${q_name}_module'; \\"
echo " echo '#define have_${module}_module'; \\" echo " echo '#define have_${q_name}_module'; \\"
echo " echo; \\" echo " echo; \\"
if test -n "$moddeps"; then echo " echo '# ifndef IMPORTING_MODULE_${q_name}'; \\"
echo " echo '/* Module dependencies */'; \\" if test $CYGWIN = yes; then
echo " for mod in $modhdeps; do \\" echo " echo '# ifdef MODULE'; \\"
echo " echo '# define USING_MODULE'; \\" echo " echo '# define boot_ __attribute__((__dllexport__)) boot_${q_name}'; \\"
echo " echo '# include \"'\$\$mod'\"'; \\" echo " echo '# define cleanup_ __attribute__((__dllexport__)) cleanup_${q_name}'; \\"
echo " done; \\" echo " echo '# define setup_ __attribute__((__dllexport__)) setup_${q_name}'; \\"
echo " echo '# undef USING_MODULE'; \\" echo " echo '# define finish_ __attribute__((__dllexport__)) finish_${q_name}'; \\"
echo " echo; \\" echo " echo '# else /* MODULE */'; \\"
echo " echo '# define boot_ boot_${q_name}'; \\"
echo " echo '# define cleanup_ cleanup_${q_name}'; \\"
echo " echo '# define setup_ setup_${q_name}'; \\"
echo " echo '# define finish_ finish_${q_name}'; \\"
echo " echo '# endif /* MODULE */'; \\"
else
echo " if test @SHORTBOOTNAMES@ = yes; then \\"
echo " echo '# ifndef MODULE'; \\"
echo " fi; \\"
echo " echo '# define boot_ boot_${q_name}'; \\"
echo " echo '# define cleanup_ cleanup_${q_name}'; \\"
echo " echo '# define setup_ setup_${q_name}'; \\"
echo " echo '# define finish_ finish_${q_name}'; \\"
echo " if test @SHORTBOOTNAMES@ = yes; then \\"
echo " echo '# endif /* !MODULE */'; \\"
echo " fi; \\"
fi fi
echo " echo '# endif /* !IMPORTING_MODULE_${q_name} */'; \\"
echo " echo; \\"
if test -n "$moddeps"; then (
set x $q_moddeps
echo " echo '/* Module dependencies */'; \\"
for hdep in $modhdeps; do
shift
echo " echo '# define IMPORTING_MODULE_${1} 1'; \\"
echo " echo '# include \"${hdep}\"'; \\"
done
echo " echo; \\"
) fi
if test -n "$headers"; then if test -n "$headers"; then
echo " echo '/* Extra headers for this module */'; \\" echo " echo '/* Extra headers for this module */'; \\"
echo " for hdr in $headers; do \\" echo " for hdr in $headers; do \\"
@ -260,25 +416,35 @@ if $first_stage; then
echo " echo; \\" echo " echo; \\"
fi fi
if test -n "$proto"; then if test -n "$proto"; then
echo " echo '# define GLOBAL_PROTOTYPES'; \\" if test "$CYGWIN" = yes; then
echo " for pro in \$(PROTO_${module}); do \\" echo " echo '# ifndef IMPORTING_MODULE_${q_name} '; \\"
echo " echo '# include \"'\$\$pro'\"'; \\" echo " echo '# undef mod_import_variable'; \\"
echo " echo '# define mod_import_variable'; \\"
echo " echo '# endif /* IMPORTING_MODULE_${q_name} */'; \\"
fi
echo " for epro in \$(EPRO_${mddname}); do \\"
echo " echo '# include \"'\$\$epro'\"'; \\"
echo " done; \\" echo " done; \\"
echo " echo '# undef GLOBAL_PROTOTYPES'; \\" if test "$CYGWIN" = yes; then
echo " echo '# ifndef IMPORTING_MODULE_${q_name} '; \\"
echo " echo '# undef mod_import_variable'; \\"
echo " echo '# define mod_import_variable __attribute__((__dllimport__))'; \\"
echo " echo '# endif /* IMPORTING_MODULE_${q_name} */'; \\"
fi
echo " echo; \\" echo " echo; \\"
fi fi
echo " echo '#endif /* !have_${module}_module */'; \\" echo " echo '#endif /* !have_${q_name}_module */'; \\"
echo " ) > \$@" echo " ) > \$@"
echo echo
echo "\$(MODOBJS_${module}) \$(MODDOBJS_${module}): ${module}.mdh" echo "\$(MODOBJS_${mddname}) \$(MODDOBJS_${mddname}): ${mddname}.mdh"
sed -e '/^ *: *<< *\\Make *$/,/^Make$/!d' \ sed -e '/^ *: *<< *\\Make *$/,/^Make$/!d' \
-e 's/^ *: *<< *\\Make *$//; /^Make$/d' \ -e 's/^ *: *<< *\\Make *$//; /^Make$/d' \
< $top_srcdir/$the_subdir/${module}.mdd < $top_srcdir/$the_subdir/${mddname}.mdd
echo echo
done done
if test -n "$remote_mdhs$other_mdhs"; then if test -n "$remote_mdhs$other_mdhs$remote_exports$other_exports$remote_modules$other_modules"; then
echo "##### ===== DEPENDENCIES FOR REMOTE MODULES ===== #####" echo "##### ===== DEPENDENCIES FOR REMOTE MODULES ===== #####"
echo echo
for mdh in $remote_mdhs; do for mdh in $remote_mdhs; do
@ -287,10 +453,32 @@ if $first_stage; then
echo echo
done | sed 's,^\(.*\)@%@\(.*\)@%@\(.*\)/\([^/]*\)$,\1\3\2\4,' done | sed 's,^\(.*\)@%@\(.*\)@%@\(.*\)/\([^/]*\)$,\1\3\2\4,'
if test -n "$other_mdhs"; then if test -n "$other_mdhs"; then
echo "${other_mdhs}:" echo "${other_mdhs}:" | sed 's,^ ,,'
echo " false # should only happen with make -n" echo " false # should only happen with make -n"
echo echo
fi fi
for export in $remote_exports; do
echo "$export: FORCE"
echo " @cd @%@ && \$(MAKE) \$(MAKEDEFS) @%@$export"
echo
done | sed 's,^\(.*\)@%@\(.*\)@%@\(.*\)/\([^/]*\)$,\1\3\2\4,'
if test -n "$other_exports"; then
echo "${other_exports}:" | sed 's,^ ,,'
echo " false # should only happen with make -n"
echo
fi
if test "$CYGWIN" = yes; then
for mdll in $remote_modules; do
echo "$mdll: FORCE"
echo " @cd @%@ && \$(MAKE) \$(MAKEDEFS) @%@$mdll"
echo
done | sed 's,^\(.*\)@%@\(.*\)@%@\(.*\)/\([^/]*\)$,\1\3\2\4,'
if test -n "$other_modules"; then
echo "${other_modules}:" | sed 's,^ ,,'
echo " false # should only happen with make -n"
echo
fi
fi
fi fi
echo "##### End of ${the_makefile}.in" echo "##### End of ${the_makefile}.in"

View file

@ -3070,7 +3070,8 @@ decrdumpcount(FuncDump f)
{ {
} }
void /**/
mod_export void
closedumps(void) closedumps(void)
{ {
} }

View file

@ -1681,7 +1681,15 @@ typedef unsigned char * (*ZleReadFn) _((char *, char *, int));
/* Pseudo-keyword to mark exportedness */ /* Pseudo-keyword to mark exportedness */
/***************************************/ /***************************************/
#ifdef __CYGWIN__
#define mod_export __attribute__((__dllexport__))
#define mod_import_variable __attribute__((__dllimport__))
#define mod_import_function
#else
#define mod_export #define mod_export
#define mod_import_variable
#define mod_import_function
#endif
/***************************************/ /***************************************/
/* Hooks in core. */ /* Hooks in core. */

View file

@ -1467,6 +1467,18 @@ if test "x$aixdynamic" = xyes; then
zsh_cv_sys_dynamic_strip_exe="${zsh_cv_sys_dynamic_strip_exe=yes}" 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_strip_lib="${zsh_cv_sys_dynamic_strip_lib=yes}"
zsh_cv_sys_dynamic_broken="${zsh_cv_sys_dynamic_broken=no}" zsh_cv_sys_dynamic_broken="${zsh_cv_sys_dynamic_broken=no}"
elif test "x$ac_cv_cygwin" = xyes; then
DL_EXT="${DL_EXT=dll}"
DLLD="${DLLD=dllwrap}"
zsh_cv_func_dlsym_needs_underscore=no
DLLDFLAGS=${DLLDFLAGS=}
EXTRA_LDFLAGS=${EXTRA_LDFLAGS=}
zsh_cv_sys_dynamic_clash_ok="${zsh_cv_sys_dynamic_clash_ok=no}"
zsh_cv_sys_dynamic_rtld_global="${zsh_cv_sys_dynamic_rtld_global=yes}"
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}"
elif test "x$dynamic" = xyes; then elif test "x$dynamic" = xyes; then
AC_CACHE_CHECK(if your system use ELF binaries, AC_CACHE_CHECK(if your system use ELF binaries,
zsh_cv_sys_elf, zsh_cv_sys_elf,
@ -1654,6 +1666,16 @@ else
fi fi
AC_SUBST(SHORTBOOTNAMES) AC_SUBST(SHORTBOOTNAMES)
if test "x$ac_cv_cygwin" = xyes; then
INSTLIB="install.cygwin-lib"
UNINSTLIB="uninstall.cygwin-lib"
else
INSTLIB="install.bin-\$(L)"
UNINSTLIB="uninstall.bin-\$(L)"
fi
AC_SUBST(INSTLIB)dnl
AC_SUBST(UNINSTLIB)dnl
AC_DEFINE_UNQUOTED(DL_EXT, "$DL_EXT")dnl AC_DEFINE_UNQUOTED(DL_EXT, "$DL_EXT")dnl
AC_SUBST(D)dnl AC_SUBST(D)dnl
AC_SUBST(DL_EXT)dnl AC_SUBST(DL_EXT)dnl