summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Configurations/unix-Makefile.tmpl32
-rw-r--r--Configurations/windows-makefile.tmpl36
2 files changed, 32 insertions, 36 deletions
diff --git a/Configurations/unix-Makefile.tmpl b/Configurations/unix-Makefile.tmpl
index 590f18d6c8..9b563d8971 100644
--- a/Configurations/unix-Makefile.tmpl
+++ b/Configurations/unix-Makefile.tmpl
@@ -1134,9 +1134,7 @@ EOF
}
return $recipe;
}
- # On Unix, we build shlibs from static libs, so we're ignoring the
- # object file array. We *know* this routine is only called when we've
- # configure 'shared'.
+ # We *know* this routine is only called when we've configure 'shared'.
sub obj2shlib {
my %args = @_;
my $lib = $args{lib};
@@ -1163,26 +1161,20 @@ EOF
die "More than one exported symbol map" if scalar @defs > 1;
my $objs = join(" ", @objs);
my $deps = join(" ", @objs, @defs, @deps);
- my $target = shlib_simple($lib);
- my $target_full = shlib($lib);
+ my $simple = shlib_simple($lib);
+ my $full = shlib($lib);
+ my $target = "$simple $full";
my $shared_soname = "";
- $shared_soname .= ' '.$target{shared_sonameflag}.basename($target_full)
+ $shared_soname .= ' '.$target{shared_sonameflag}.basename($full)
if defined $target{shared_sonameflag};
my $shared_imp = "";
- $shared_imp .= ' '.$target{shared_impflag}.basename($target)
+ $shared_imp .= ' '.$target{shared_impflag}.basename($simple)
if defined $target{shared_impflag};
my $shared_def = join("", map { ' '.$target{shared_defflag}.$_ } @defs);
my $recipe = <<"EOF";
-# When building on a Windows POSIX layer (Cygwin or Mingw), we know for a fact
-# that two files get produced, {shlibname}.dll and {libname}.dll.a.
-# With all other Unix platforms, we often build a shared library with the
-# SO version built into the file name and a symlink without the SO version
-# It's not necessary to have both as targets. The choice falls on the
-# simplest, {libname}\$(SHLIB_EXT_IMPORT) for Windows POSIX layers and
-# {libname}\$(SHLIB_EXT_SIMPLE) for the Unix platforms.
$target: $deps
\$(CC) \$(LIB_CFLAGS) $linkflags\$(LIB_LDFLAGS)$shared_soname$shared_imp \\
- -o $target_full$shared_def $objs \\
+ -o $full$shared_def $objs \\
$linklibs \$(LIB_EX_LIBS)
EOF
if (windowsdll()) {
@@ -1196,14 +1188,14 @@ EOF
EOF
} elsif (sharedaix()) {
$recipe .= <<"EOF";
- rm -f $target && \\
- \$(AR) r $target $target_full
+ rm -f $simple && \\
+ \$(AR) r $simple $full
EOF
} else {
$recipe .= <<"EOF";
- if [ '$target' != '$target_full' ]; then \\
- rm -f $target; \\
- ln -s $target_full $target; \\
+ if [ '$simple' != '$full' ]; then \\
+ rm -f $simple; \\
+ ln -s $full $simple; \\
fi
EOF
}
diff --git a/Configurations/windows-makefile.tmpl b/Configurations/windows-makefile.tmpl
index 9d23ec2f4a..663aefc9fd 100644
--- a/Configurations/windows-makefile.tmpl
+++ b/Configurations/windows-makefile.tmpl
@@ -630,13 +630,12 @@ $obj$objext: $deps
EOF
}
- # On Unix, we build shlibs from static libs, so we're ignoring the
- # object file array. We *know* this routine is only called when we've
- # configure 'shared'.
+ # We *know* this routine is only called when we've configure 'shared'.
+ # Also, note that even though the import library built here looks like
+ # a static library, it really isn't.
sub obj2shlib {
my %args = @_;
my $lib = $args{lib};
- my $shlib = $args{shlib};
my @objs = map { (my $x = $_) =~ s|\.o$|$objext|; $x }
grep { $_ =~ m/\.(?:o|res)$/ }
@{$args{objs}};
@@ -648,25 +647,30 @@ EOF
my $linklibs = join("", map { "$_\n" } @deps);
my $objs = join("\n", @objs);
my $deps = join(" ", @objs, @defs, @deps);
- my $target = shlib_import($lib);
+ my $import = shlib_import($lib);
+ my $dll = shlib($lib);
my $shared_def = join("", map { " /def:$_" } @defs);
return <<"EOF"
-$target: $deps
- IF EXIST $shlib$shlibext.manifest DEL /F /Q $shlib$shlibext.manifest
+# The import library may look like a static library, but it is not.
+# We MUST make the import library depend on the DLL, in case someone
+# mistakenly removes the latter.
+$import: $dll
+$dll: $deps
+ IF EXIST $full.manifest DEL /F /Q $full.manifest
IF EXIST \$@ DEL /F /Q \$@
\$(LD) \$(LDFLAGS) \$(LIB_LDFLAGS) \\
- /implib:\$@ \$(LDOUTFLAG)$shlib$shlibext$shared_def @<< || (DEL /Q \$(\@B).* $shlib.* && EXIT 1)
+ /implib:$import \$(LDOUTFLAG)$dll$shared_def @<< || (DEL /Q \$(\@B).* $import && EXIT 1)
$objs
$linklibs\$(LIB_EX_LIBS)
<<
- IF EXIST $shlib$shlibext.manifest \\
- \$(MT) \$(MTFLAGS) \$(MTINFLAG)$shlib$shlibext.manifest \$(MTOUTFLAG)$shlib$shlibext
- IF EXIST apps\\$shlib$shlibext DEL /Q /F apps\\$shlib$shlibext
- IF EXIST test\\$shlib$shlibext DEL /Q /F test\\$shlib$shlibext
- IF EXIST fuzz\\$shlib$shlibext DEL /Q /F fuzz\\$shlib$shlibext
- COPY $shlib$shlibext apps
- COPY $shlib$shlibext test
- COPY $shlib$shlibext fuzz
+ IF EXIST $dll.manifest \\
+ \$(MT) \$(MTFLAGS) \$(MTINFLAG)$dll.manifest \$(MTOUTFLAG)$dll
+ IF EXIST apps\\$dll DEL /Q /F apps\\$dll
+ IF EXIST test\\$dll DEL /Q /F test\\$dll
+ IF EXIST fuzz\\$dll DEL /Q /F fuzz\\$dll
+ COPY $dll apps
+ COPY $dll test
+ COPY $dll fuzz
EOF
}
sub obj2dso {