Commit 15ac6847 authored by Alexandre Julliard's avatar Alexandre Julliard

Build and load import libraries directly from the dll directory where

possible, and only create symlinks for directories that don't have the correct name.
parent 1c5671df
...@@ -23,6 +23,7 @@ ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LDFLAGS) $(LIBS) ...@@ -23,6 +23,7 @@ ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LDFLAGS) $(LIBS)
ALL_IMPORTS = $(DELAYIMPORTS) $(IMPORTS) ALL_IMPORTS = $(DELAYIMPORTS) $(IMPORTS)
IMPLIB_OBJS = $(IMPLIB_SRCS:.c=.o) IMPLIB_OBJS = $(IMPLIB_SRCS:.c=.o)
STATICIMPLIB= $(IMPORTLIB:.def=.def.a) STATICIMPLIB= $(IMPORTLIB:.def=.def.a)
DLL_LDPATH = -L$(DLLDIR) $(ALL_IMPORTS:%=-L$(DLLDIR)/%)
all: $(MODULE)$(DLLEXT) $(SUBDIRS) all: $(MODULE)$(DLLEXT) $(SUBDIRS)
...@@ -31,12 +32,12 @@ all: $(MODULE)$(DLLEXT) $(SUBDIRS) ...@@ -31,12 +32,12 @@ all: $(MODULE)$(DLLEXT) $(SUBDIRS)
# Rules for .so files # Rules for .so files
$(MODULE).so: $(MAINSPEC) $(ALL_OBJS) Makefile.in $(MODULE).so: $(MAINSPEC) $(ALL_OBJS) Makefile.in
$(WINEGCC) -B$(TOOLSDIR)/tools/winebuild -shared $(SRCDIR)/$(MAINSPEC) $(ALL_OBJS) $(SUBSYSTEM:%=-Wb,--subsystem,%) -o $@ -L$(DLLDIR) $(ALL_IMPORTS:%=-l%) $(DELAYIMPORTS:%=-Wb,-d%) $(ALL_LIBS) $(WINEGCC) -B$(TOOLSDIR)/tools/winebuild -shared $(SRCDIR)/$(MAINSPEC) $(ALL_OBJS) $(SUBSYSTEM:%=-Wb,--subsystem,%) -o $@ $(DLL_LDPATH) $(ALL_IMPORTS:%=-l%) $(DELAYIMPORTS:%=-Wb,-d%) $(ALL_LIBS)
# Rules for .dll files # Rules for .dll files
$(MODULE): $(RCOBJS) $(OBJS) $(MODULE).dbg.o $(SPEC_DEF) Makefile.in $(MODULE): $(RCOBJS) $(OBJS) $(MODULE).dbg.o $(SPEC_DEF) Makefile.in
$(DLLWRAP) -k --def $(SPEC_DEF) -o $@ $(RCOBJS) $(OBJS) $(MODULE).dbg.o -L$(DLLDIR) $(ALL_IMPORTS:%=-l%) $(ALL_LIBS) $(DLLWRAP) -k --def $(SPEC_DEF) -o $@ $(RCOBJS) $(OBJS) $(MODULE).dbg.o $(DLL_LDPATH) $(ALL_IMPORTS:%=-l%) $(ALL_LIBS)
# Rules for import libraries # Rules for import libraries
...@@ -79,7 +80,7 @@ crosstest:: $(SUBDIRS:%=%/__crosstest__) ...@@ -79,7 +80,7 @@ crosstest:: $(SUBDIRS:%=%/__crosstest__)
# Rule to explicitly generate the .spec.c for debugging # Rule to explicitly generate the .spec.c for debugging
$(MAINSPEC).c: $(MAINSPEC) $(ALL_OBJS) $(MAINSPEC).c: $(MAINSPEC) $(ALL_OBJS)
$(WINEBUILD) $(DEFS) $(DLLFLAGS) --dll -o $@ --export $(SRCDIR)/$(MAINSPEC) $(SUBSYSTEM:%=--subsystem %) $(ALL_OBJS) -L$(DLLDIR) $(ALL_IMPORTS:%=-l%) $(DELAYIMPORTS:%=-d%) $(WINEBUILD) $(DEFS) $(DLLFLAGS) --dll -o $@ --export $(SRCDIR)/$(MAINSPEC) $(SUBSYSTEM:%=--subsystem %) $(ALL_OBJS) $(DLL_LDPATH) $(ALL_IMPORTS:%=-l%) $(DELAYIMPORTS:%=-d%)
# Rules for auto documentation # Rules for auto documentation
......
...@@ -23,6 +23,7 @@ C_SRCS = $(CTESTS) ...@@ -23,6 +23,7 @@ C_SRCS = $(CTESTS)
EXTRA_SRCS = $(TESTLIST) EXTRA_SRCS = $(TESTLIST)
EXTRA_OBJS = $(TESTLIST:.c=.o) EXTRA_OBJS = $(TESTLIST:.c=.o)
ALL_LIBS = $(IMPORTS:%=-l%) $(EXTRALIBS) $(LDFLAGS) $(LIBS) ALL_LIBS = $(IMPORTS:%=-l%) $(EXTRALIBS) $(LDFLAGS) $(LIBS)
DLL_LDPATH = -L$(DLLDIR) $(IMPORTS:%=-L$(DLLDIR)/%)
CROSSTEST = $(TESTDLL:%.dll=%)_crosstest.exe CROSSTEST = $(TESTDLL:%.dll=%)_crosstest.exe
CROSSOBJS = $(C_SRCS:.c=.cross.o) $(RC_SRCS:.rc=.res.cross.o) $(TESTLIST:.c=.cross.o) CROSSOBJS = $(C_SRCS:.c=.cross.o) $(RC_SRCS:.rc=.res.cross.o) $(TESTLIST:.c=.cross.o)
...@@ -36,7 +37,7 @@ all: $(TESTPROGRAM) ...@@ -36,7 +37,7 @@ all: $(TESTPROGRAM)
# Rules for .so main module # Rules for .so main module
$(MODULE).so: $(OBJS) $(RC_SRCS:.rc=.res) Makefile.in $(MODULE).so: $(OBJS) $(RC_SRCS:.rc=.res) Makefile.in
$(WINEGCC) -B$(TOOLSDIR)/tools/winebuild -mconsole $(OBJS) $(RC_SRCS:.rc=.res) -o $@ $(LIBPORT) -L$(DLLDIR) -L$(LIBDIR) $(ALL_LIBS) $(WINEGCC) -B$(TOOLSDIR)/tools/winebuild -mconsole $(OBJS) $(RC_SRCS:.rc=.res) -o $@ $(LIBPORT) $(DLL_LDPATH) -L$(LIBDIR) $(ALL_LIBS)
# Rules for .exe main module # Rules for .exe main module
......
...@@ -25,7 +25,9 @@ use strict; ...@@ -25,7 +25,9 @@ use strict;
my $makefiles = `find . -name Makefile.in -print`; my $makefiles = `find . -name Makefile.in -print`;
my %directories = (); my %directories = ();
my %implib_dirs = (); my %importlibs = ();
my %static_implibs = ();
my %staticlib_dirs = ();
my %altnames = (); my %altnames = ();
# list of special dlls that can be switched on or off by configure # list of special dlls that can be switched on or off by configure
...@@ -63,7 +65,7 @@ foreach my $i (split(/\s/,$makefiles)) ...@@ -63,7 +65,7 @@ foreach my $i (split(/\s/,$makefiles))
$module = $1; $module = $1;
if ($module =~ /^lib.*\.a$/) if ($module =~ /^lib.*\.a$/)
{ {
($implib_dirs{$module} = $i) =~ s/^\.\/(.*)\/[^\/]+$/$1/; ($staticlib_dirs{$module} = $i) =~ s/^\.\/(.*)\/[^\/]+$/$1/;
} }
else else
{ {
...@@ -71,6 +73,16 @@ foreach my $i (split(/\s/,$makefiles)) ...@@ -71,6 +73,16 @@ foreach my $i (split(/\s/,$makefiles))
} }
next; next;
} }
if (/^IMPORTLIB\s*=\s*([a-zA-Z0-9_.]+)\.\$\(IMPLIBEXT\)/)
{
$importlibs{$module} = $1;
next;
}
if (/^IMPLIB_SRCS\s*=/)
{
$static_implibs{$module} = 1;
next;
}
if (/^SPEC_SRCS16\s*=\s*(.*)/) if (/^SPEC_SRCS16\s*=\s*(.*)/)
{ {
my $specs = $1; my $specs = $1;
...@@ -128,7 +140,7 @@ foreach my $dir (sort values %directories) ...@@ -128,7 +140,7 @@ foreach my $dir (sort values %directories)
} }
printf NEWMAKE "\n\nSUBDIRS = \\\n\t\$(BASEDIRS)"; printf NEWMAKE "\n\nSUBDIRS = \\\n\t\$(BASEDIRS)";
foreach my $dir (sort (keys %special_dlls, values %implib_dirs)) foreach my $dir (sort (keys %special_dlls, values %staticlib_dirs))
{ {
printf NEWMAKE " \\\n\t%s", $dir; printf NEWMAKE " \\\n\t%s", $dir;
} }
...@@ -155,7 +167,7 @@ foreach my $mod (sort keys %directories) ...@@ -155,7 +167,7 @@ foreach my $mod (sort keys %directories)
$targets16{sprintf("%s.so",$i)} = 1; $targets16{sprintf("%s.so",$i)} = 1;
} }
} }
foreach my $mod (sort keys %implib_dirs) { $targets{$mod} = 1; } foreach my $mod (sort keys %staticlib_dirs) { $targets{$mod} = 1; }
print NEWMAKE <<EOF; print NEWMAKE <<EOF;
...@@ -218,51 +230,68 @@ foreach my $mod (sort keys %directories) ...@@ -218,51 +230,68 @@ foreach my $mod (sort keys %directories)
printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s.so \$@\n\n", $mod; printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s.so \$@\n\n", $mod;
} }
} }
foreach my $mod (sort keys %implib_dirs) foreach my $mod (sort keys %staticlib_dirs)
{ {
printf NEWMAKE "%s: %s/%s\n", $mod, $implib_dirs{$mod}, $mod; printf NEWMAKE "%s: %s/%s\n", $mod, $staticlib_dirs{$mod}, $mod;
printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s/%s \$@\n\n", $implib_dirs{$mod}, $mod; printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s/%s \$@\n\n", $staticlib_dirs{$mod}, $mod;
} }
################################################################ ################################################################
# output the import libraries rules # output the import libraries rules
my @implibs = grep /\.dll$/, keys %directories; print NEWMAKE "\n# Import libraries\n\n";
push @implibs, "winspool.drv"; print NEWMAKE "STATIC_IMPLIBEXT = \$(IMPLIBEXT:def=def.a)\n\n";
print NEWMAKE "\n# Import libraries\n\nIMPORT_LIBS ="; my @lib_symlinks = ("ntdll.dll");
foreach my $mod (sort @implibs) foreach my $mod (sort keys %importlibs)
{ {
my $def = $mod; my $dir = $directories{$mod};
$def =~ s/\.(dll|drv)$//; my $lib = $importlibs{$mod};
printf NEWMAKE " \\\n\tlib%s.\$(IMPLIBEXT)", $def; if ($lib ne "lib" . $dir) { push @lib_symlinks, $mod; }
} }
foreach my $mod (sort keys %implib_dirs) print NEWMAKE "IMPORT_SYMLINKS =";
foreach my $mod (sort @lib_symlinks)
{
printf NEWMAKE " \\\n\t%s.\$(IMPLIBEXT)", $importlibs{$mod};
}
foreach my $mod (sort keys %staticlib_dirs)
{ {
printf NEWMAKE " \\\n\t%s", $mod; printf NEWMAKE " \\\n\t%s", $mod;
} }
print NEWMAKE "\n\nIMPORT_LIBS = \\\n\t\$(IMPORT_SYMLINKS)";
foreach my $mod (sort keys %importlibs)
{
my $dir = $directories{$mod};
my $def = $mod;
$def =~ s/\.(dll|drv)$//;
printf NEWMAKE " \\\n\t%s/lib%s.\$(IMPLIBEXT)", $dir, $def;
printf NEWMAKE " \\\n\t%s/lib%s.\$(STATIC_IMPLIBEXT)", $dir, $def if $static_implibs{$mod};
}
print NEWMAKE "\n\n"; print NEWMAKE "\n\n";
print NEWMAKE "implib: \$(IMPORT_LIBS)\n\n"; print NEWMAKE "implib: \$(IMPORT_LIBS)\n\n";
foreach my $mod (sort @implibs) foreach my $mod (sort keys %importlibs)
{ {
my $dir = $directories{$mod}; my $dir = $directories{$mod};
my $def = $mod; my $lib = $importlibs{$mod};
my $spec = $mod; my $spec = $mod;
$spec =~ s/\.dll$//; $spec =~ s/\.dll$//;
$def =~ s/\.(dll|drv)$//; printf NEWMAKE "%s/%s.\$(IMPLIBEXT): %s/%s.spec \$(WINEBUILD)\n", $dir, $lib, $dir, $spec;
printf NEWMAKE "lib%s.def: %s/lib%s.def\n", $def, $dir, $spec; printf NEWMAKE "\t\@cd %s && \$(MAKE) %s.\$(IMPLIBEXT)\n\n", $dir, $lib;
printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s/lib%s.def \$@\n", $dir, $spec; next unless $static_implibs{$mod};
printf NEWMAKE "lib%s.a: %s/lib%s.a\n", $def, $dir, $spec; printf NEWMAKE "%s/%s.\$(STATIC_IMPLIBEXT): dummy\n", $dir, $lib, $dir, $spec;
printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s/lib%s.a \$@\n", $dir, $spec; printf NEWMAKE "\t\@cd %s && \$(MAKE) %s.\$(STATIC_IMPLIBEXT)\n\n", $dir, $lib;
printf NEWMAKE "%s/lib%s.def: %s/%s.spec \$(WINEBUILD)\n", $dir, $spec, $dir, $spec; }
printf NEWMAKE "\t\$(WINEBUILD) -w --def -o \$@ --export \$(SRCDIR)/%s/%s.spec\n", $dir, $spec; foreach my $mod (sort @lib_symlinks)
printf NEWMAKE "%s/lib%s.a: %s/lib%s.def\n", $dir, $spec, $dir, $spec; {
printf NEWMAKE "\t\$(DLLTOOL) -k -l \$@ -d %s/lib%s.def\n\n", $dir, $spec; my $dir = $directories{$mod};
my $lib = $importlibs{$mod} . ".\$(IMPLIBEXT)";
printf NEWMAKE "%s: %s/%s\n", $lib, $dir, $lib;
printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s/%s \$@\n\n", $dir, $lib;
} }
print NEWMAKE <<EOF; print NEWMAKE <<EOF;
\$(BUILDSUBDIRS): \$(IMPORT_LIBS) \$(BUILDSUBDIRS): \$(IMPORT_LIBS)
\$(INSTALLSUBDIRS:%=%/__install__): \$(IMPORT_LIBS) \$(INSTALLSUBDIRS:%=%/__install__): \$(IMPORT_LIBS)
...@@ -277,9 +306,9 @@ foreach my $mod (sort keys %directories) ...@@ -277,9 +306,9 @@ foreach my $mod (sort keys %directories)
{ {
printf NEWMAKE "%s/%s.so: %s\n", $directories{$mod}, $mod, $directories{$mod}; printf NEWMAKE "%s/%s.so: %s\n", $directories{$mod}, $mod, $directories{$mod};
} }
foreach my $mod (sort keys %implib_dirs) foreach my $mod (sort keys %staticlib_dirs)
{ {
printf NEWMAKE "%s/%s: %s\n", $implib_dirs{$mod}, $mod, $implib_dirs{$mod}; printf NEWMAKE "%s/%s: %s\n", $staticlib_dirs{$mod}, $mod, $staticlib_dirs{$mod};
} }
################################################################ ################################################################
...@@ -316,7 +345,7 @@ uninstall:: ...@@ -316,7 +345,7 @@ uninstall::
-rmdir \$(dlldir) -rmdir \$(dlldir)
clean:: clean::
\$(RM) \$(IMPORT_LIBS) \$(RM) \$(IMPORT_SYMLINKS)
check test:: \$(BUILDSUBDIRS:%=%/__test__) check test:: \$(BUILDSUBDIRS:%=%/__test__)
......
...@@ -15,6 +15,7 @@ DEFS = $(DLLDEFS) $(EXTRADEFS) ...@@ -15,6 +15,7 @@ DEFS = $(DLLDEFS) $(EXTRADEFS)
ALL_OBJS = $(OBJS) $(MODULE).dbg.o ALL_OBJS = $(OBJS) $(MODULE).dbg.o
ALL_IMPORTS = $(DELAYIMPORTS) $(IMPORTS) ALL_IMPORTS = $(DELAYIMPORTS) $(IMPORTS)
ALL_LIBS = $(ALL_IMPORTS:%=-l%) $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LDFLAGS) $(LIBS) ALL_LIBS = $(ALL_IMPORTS:%=-l%) $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LDFLAGS) $(LIBS)
DLL_LDPATH = -L$(DLLDIR) $(ALL_IMPORTS:%=-L$(DLLDIR)/%)
BASEMODULE = $(MODULE:.exe=) BASEMODULE = $(MODULE:.exe=)
RUNTESTFLAGS= -q -P wine -T $(TOPOBJDIR) RUNTESTFLAGS= -q -P wine -T $(TOPOBJDIR)
...@@ -25,7 +26,7 @@ all: $(MODULE)$(DLLEXT) $(BASEMODULE)$(EXEEXT) ...@@ -25,7 +26,7 @@ all: $(MODULE)$(DLLEXT) $(BASEMODULE)$(EXEEXT)
# Rules for .so main module # Rules for .so main module
$(MODULE).so: $(ALL_OBJS) $(RC_SRCS:.rc=.res) Makefile.in $(MODULE).so: $(ALL_OBJS) $(RC_SRCS:.rc=.res) Makefile.in
$(WINEGCC) -B$(TOOLSDIR)/tools/winebuild $(APPMODE) $(ALL_OBJS) $(RC_SRCS:.rc=.res) -o $@ -L$(DLLDIR) $(ALL_LIBS) $(DELAYIMPORTS:%=-Wb,-d%) $(WINEGCC) -B$(TOOLSDIR)/tools/winebuild $(APPMODE) $(ALL_OBJS) $(RC_SRCS:.rc=.res) -o $@ $(DLL_LDPATH) $(ALL_LIBS) $(DELAYIMPORTS:%=-Wb,-d%)
$(BASEMODULE): $(WINEWRAPPER) $(BASEMODULE): $(WINEWRAPPER)
$(RM) $@ && $(LN_S) $(WINEWRAPPER) $@ $(RM) $@ && $(LN_S) $(WINEWRAPPER) $@
......
...@@ -19,10 +19,10 @@ C_SRCS = \ ...@@ -19,10 +19,10 @@ C_SRCS = \
all: aviinfo.exe$(DLLEXT) aviplay.exe$(DLLEXT) icinfo.exe$(DLLEXT) aviinfo$(EXEEXT) aviplay$(EXEEXT) icinfo$(EXEEXT) all: aviinfo.exe$(DLLEXT) aviplay.exe$(DLLEXT) icinfo.exe$(DLLEXT) aviinfo$(EXEEXT) aviplay$(EXEEXT) icinfo$(EXEEXT)
aviinfo.exe.so: aviinfo.o aviinfo.exe.so: aviinfo.o
$(WINEGCC) -B$(TOOLSDIR)/tools/winebuild -mwindows -o $@ aviinfo.o -L$(DLLDIR) -lavifil32 -lkernel32 $(ALL_LIBS) $(WINEGCC) -B$(TOOLSDIR)/tools/winebuild -mwindows -o $@ aviinfo.o -L$(DLLDIR)/avifil32 -L$(DLLDIR) -lavifil32 -lkernel32 $(ALL_LIBS)
aviplay.exe.so: aviplay.o aviplay.exe.so: aviplay.o
$(WINEGCC) -B$(TOOLSDIR)/tools/winebuild -mwindows -o $@ aviplay.o -L$(DLLDIR) -lavifil32 -lddraw -lkernel32 $(ALL_LIBS) $(WINEGCC) -B$(TOOLSDIR)/tools/winebuild -mwindows -o $@ aviplay.o -L$(DLLDIR)/avifil32 -L$(DLLDIR)/ddraw -L$(DLLDIR) -lavifil32 -lddraw -lkernel32 $(ALL_LIBS)
icinfo.exe.so: icinfo.o icinfo.exe.so: icinfo.o
$(WINEGCC) -B$(TOOLSDIR)/tools/winebuild -mwindows -o $@ icinfo.o -L$(DLLDIR) -lmsvfw32 -lkernel32 $(ALL_LIBS) $(WINEGCC) -B$(TOOLSDIR)/tools/winebuild -mwindows -o $@ icinfo.o -L$(DLLDIR) -lmsvfw32 -lkernel32 $(ALL_LIBS)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment