mirror of
https://github.com/openssl/openssl.git
synced 2024-12-15 06:01:37 +08:00
d237d69914
Without proper cleanup after DLL link failure second attempt to run nmake would actually proceed and failure will be "shifted" to run time. This is because libcrypto.lib import library is generated even if DLL link fails. Reviewed-by: Richard Levitte <levitte@openssl.org>
442 lines
14 KiB
Cheetah
442 lines
14 KiB
Cheetah
##
|
|
## Makefile for OpenSSL
|
|
##
|
|
## {- join("\n## ", @autowarntext) -}
|
|
{-
|
|
our $objext = $target{obj_extension} || ".obj";
|
|
our $depext = $target{dep_extension} || ".d";
|
|
our $exeext = $target{exe_extension} || ".exe";
|
|
our $libext = $target{lib_extension} || ".lib";
|
|
our $shlibext = $target{shared_extension} || ".dll";
|
|
our $shlibextimport = $target{shared_import_extension} || ".lib";
|
|
our $dsoext = $target{dso_extension} || ".dll";
|
|
|
|
my $win_installenv =
|
|
$target{build_scheme}->[2] eq "VC-W32" ?
|
|
"ProgramFiles(x86)" : "ProgramW6432";
|
|
my $win_commonenv =
|
|
$target{build_scheme}->[2] eq "VC-W32"
|
|
? "CommonProgramFiles(x86)" : "CommonProgramW6432";
|
|
our $win_installroot =
|
|
defined($ENV{$win_installenv})
|
|
? '%'.$win_installenv.'%' : '%ProgramFiles%';
|
|
our $win_commonroot =
|
|
defined($ENV{$win_commonenv})
|
|
? '%'.$win_commonenv.'%' : '%CommonProgramFiles%';
|
|
|
|
sub shlib {
|
|
return () if $disabled{shared};
|
|
my $lib = shift;
|
|
return $unified_info{sharednames}->{$lib} . $shlibext;
|
|
}
|
|
|
|
sub shlib_import {
|
|
return () if $disabled{shared};
|
|
my $lib = shift;
|
|
return $lib . $shlibextimport;
|
|
}
|
|
|
|
sub dso {
|
|
my $dso = shift;
|
|
|
|
return $dso . $dsoext;
|
|
}
|
|
'';
|
|
-}
|
|
|
|
PLATFORM={- $config{target} -}
|
|
SRCDIR={- $config{sourcedir} -}
|
|
BLDDIR={- $config{builddir} -}
|
|
|
|
VERSION={- $config{version} -}
|
|
MAJOR={- $config{major} -}
|
|
MINOR={- $config{minor} -}
|
|
|
|
SHLIB_VERSION_NUMBER={- $config{shlib_version_number} -}
|
|
|
|
LIBS={- join(" ", map { $_.$libext } @{$unified_info{libraries}}) -}
|
|
SHLIBS={- join(" ", map { shlib($_) } @{$unified_info{libraries}}) -}
|
|
ENGINES={- join(" ", map { dso($_) } @{$unified_info{engines}}) -}
|
|
PROGRAMS={- join(" ", map { $_.$exeext } grep { !m|^test\\| } @{$unified_info{programs}}) -}
|
|
TESTPROGS={- join(" ", map { $_.$exeext } grep { m|^test\\| } @{$unified_info{programs}}) -}
|
|
SCRIPTS={- join(" ", @{$unified_info{scripts}}) -}
|
|
|
|
{- output_off() if $disabled{makedepend}; "" -}
|
|
DEPS={- join(" ", map { (my $x = $_) =~ s|\.o$|$depext|; $x; }
|
|
grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
|
|
keys %{$unified_info{sources}}); -}
|
|
{- output_on() if $disabled{makedepend}; "" -}
|
|
|
|
# Do not edit these manually. Use Configure with --prefix or --openssldir
|
|
# to change this! Short explanation in the top comment in Configure
|
|
INSTALLTOP={- # $prefix is used in the OPENSSLDIR perl snippet
|
|
#
|
|
our $prefix = $config{prefix} || "$win_installroot\\OpenSSL";
|
|
$prefix -}
|
|
OPENSSLDIR={- #
|
|
# The logic here is that if no --openssldir was given,
|
|
# OPENSSLDIR will get the value from $prefix plus "/ssl".
|
|
# If --openssldir was given and the value is an absolute
|
|
# path, OPENSSLDIR will get its value without change.
|
|
# If the value from --openssldir is a relative path,
|
|
# OPENSSLDIR will get $prefix with the --openssldir
|
|
# value appended as a subdirectory.
|
|
#
|
|
use File::Spec::Functions;
|
|
our $openssldir =
|
|
$config{openssldir} ?
|
|
(file_name_is_absolute($config{openssldir}) ?
|
|
$config{openssldir}
|
|
: catdir($prefix, $config{openssldir}))
|
|
: "$win_commonroot\\SSL";
|
|
$openssldir -}
|
|
LIBDIR={- our $libdir = $config{libdir} || "lib";
|
|
$libdir -}
|
|
ENGINESDIR={- use File::Spec::Functions;
|
|
our $enginesdir = catdir($prefix,$libdir,"engines");
|
|
$enginesdir -}
|
|
|
|
CC={- $target{cc} -}
|
|
CFLAGS={- join(" ",(map { "-D".$_} @{$target{defines}}, @{$config{defines}})) -} {- join(" ", quotify_l("-DENGINESDIR=\"$enginesdir\"", "-DOPENSSLDIR=\"$openssldir\"")) -} {- $target{cflags} -} {- $config{cflags} -}
|
|
COUTFLAG={- $target{coutflag} || "/Fo" -}
|
|
RC={- $target{rc} || "rc" -}
|
|
RCOUTFLAG={- $target{rcoutflag} || "/fo" -}
|
|
LD={- $target{ld} || "link" -}
|
|
LDFLAGS={- $target{lflags} -}
|
|
LDOUTFLAG={- $target{loutflag} || "/out:" -}
|
|
EX_LIBS={- $target{ex_libs} -}
|
|
LIB_CFLAGS={- join(" ", $target{lib_cflags}, $target{shared_cflag}) || "" -}
|
|
LIB_LDFLAGS={- $target{shared_ldflag} || "" -}
|
|
DSO_CFLAGS={- join(" ", $target{dso_cflags}, $target{shared_cflag}) || "" -}
|
|
DSO_LDFLAGS={- join(" ", $target{dso_lflags}, $target{shared_ldflag}) || "" -}
|
|
BIN_CFLAGS={- $target{bin_cflags} -}
|
|
BIN_LDFLAGS={- $target{bin_lflags} -}
|
|
|
|
PERL={- $config{perl} -}
|
|
|
|
AR={- $target{ar} -}
|
|
ARFLAGS= {- $target{arflags} -}
|
|
AROUTFLAG={- $target{aroutflag} || "/out:" -}
|
|
|
|
AS={- $target{as} -}
|
|
ASFLAGS={- $target{asflags} -}
|
|
ASOUTFLAG={- $target{asoutflag} -}
|
|
PERLASM_SCHEME= {- $target{perlasm_scheme} -}
|
|
|
|
PROCESSOR= {- $config{processor} -}
|
|
|
|
# The main targets ###################################################
|
|
|
|
all: configdata.pm build_libs_nodep build_engines_nodep build_apps_nodep depend
|
|
|
|
build_libs: configdata.pm build_libs_nodep depend
|
|
build_libs_nodep: $(LIBS)
|
|
build_engines: configdata.pm build_engines_nodep depend
|
|
build_engines_nodep: $(ENGINES)
|
|
build_apps: configdata.pm build_apps_nodep depend
|
|
build_apps_nodep: $(PROGRAMS) $(SCRIPTS)
|
|
build_tests: configdata.pm build_tests_nodep depend
|
|
build_tests_nodep: $(TESTPROGS)
|
|
|
|
test tests: build_tests_nodep build_apps_nodep build_engines_nodep depend
|
|
set SRCTOP=$(SRCDIR)
|
|
set BLDTOP=$(BLDDIR)
|
|
set PERL=$(PERL)
|
|
$(PERL) $(SRCDIR)\test\run_tests.pl $(TESTS)
|
|
|
|
list-tests:
|
|
@set TOP=$(SRCDIR)
|
|
@set PERL=$(PERL)
|
|
@$(PERL) $(SRCDIR)\test\run_tests.pl list
|
|
|
|
install: install_sw install_ssldirs install_docs
|
|
|
|
uninstall: uninstall_docs uninstall_sw
|
|
|
|
libclean:
|
|
$(PERL) -e "map { m/(.*)\.dll$$/; unlink glob """$$1.*""" } @ARGV" $(SHLIBS)
|
|
del /Q /F $(LIBS)
|
|
del lib.pdb
|
|
|
|
clean: libclean
|
|
del /Q /F $(PROGRAMS) $(TESTPROGS) $(ENGINES) $(SCRIPTS)
|
|
del /Q /S /F *.asm
|
|
del /Q /S /F *.d
|
|
del /Q /S /F *.obj
|
|
del /Q /S /F *.pdb
|
|
del /Q /S /F *.exp
|
|
del /Q /S /F engines\*.ilk
|
|
del /Q /S /F engines\*.lib
|
|
|
|
depend:
|
|
|
|
# Install helper targets #############################################
|
|
|
|
install_sw: all install_dev install_engines install_runtime
|
|
|
|
uninstall_sw: uninstall_runtime uninstall_engines uninstall_dev
|
|
|
|
install_docs:
|
|
|
|
uninstall_docs:
|
|
|
|
install_ssldirs:
|
|
@$(PERL) $(SRCDIR)\util\mkdir-p.pl "$(DESTDIR)$(OPENSSLDIR)\certs"
|
|
@$(PERL) $(SRCDIR)\util\mkdir-p.pl "$(DESTDIR)$(OPENSSLDIR)\private"
|
|
|
|
install_dev:
|
|
@if "$(INSTALLTOP)"=="" ( echo INSTALLTOP should not be empty & exit 1 )
|
|
@echo *** Installing development files
|
|
@$(PERL) $(SRCDIR)\util\mkdir-p.pl "$(DESTDIR)$(INSTALLTOP)\include\openssl"
|
|
@$(PERL) $(SRCDIR)\util\copy.pl $(SRCDIR)\include\openssl\*.h \
|
|
"$(DESTDIR)$(INSTALLTOP)\include\openssl"
|
|
@$(PERL) $(SRCDIR)\util\copy.pl $(BLDDIR)\include\openssl\*.h \
|
|
"$(DESTDIR)$(INSTALLTOP)\include\openssl"
|
|
@$(PERL) $(SRCDIR)\util\mkdir-p.pl "$(DESTDIR)$(INSTALLTOP)\$(LIBDIR)"
|
|
@$(PERL) $(SRCDIR)\util\copy.pl $(LIBS) \
|
|
"$(DESTDIR)$(INSTALLTOP)\$(LIBDIR)"
|
|
|
|
uninstall_dev:
|
|
|
|
install_engines:
|
|
@if "$(INSTALLTOP)"=="" ( echo INSTALLTOP should not be empty & exit 1 )
|
|
@echo *** Installing engines
|
|
@$(PERL) $(SRCDIR)\util\mkdir-p.pl "$(DESTDIR)$(ENGINESDIR)"
|
|
@if not "$(ENGINES)"=="" \
|
|
$(PERL) $(SRCDIR)\util\copy.pl $(ENGINES) "$(DESTDIR)$(ENGINESDIR)"
|
|
|
|
uninstall_engines:
|
|
|
|
install_runtime:
|
|
@if "$(INSTALLTOP)"=="" ( echo INSTALLTOP should not be empty & exit 1 )
|
|
@echo *** Installing runtime files
|
|
@$(PERL) $(SRCDIR)\util\mkdir-p.pl "$(DESTDIR)$(INSTALLTOP)\bin"
|
|
@if not "$(SHLIBS)"=="" \
|
|
$(PERL) $(SRCDIR)\util\copy.pl $(SHLIBS) "$(DESTDIR)$(INSTALLTOP)\bin"
|
|
@$(PERL) $(SRCDIR)\util\copy.pl $(PROGRAMS) "$(DESTDIR)$(INSTALLTOP)\bin"
|
|
|
|
uninstall_runtime:
|
|
|
|
# Building targets ###################################################
|
|
|
|
configdata.pm: {- $config{build_file_template} -} $(SRCDIR)\Configure
|
|
@echo "Detected changed: $?"
|
|
@echo "Reconfiguring..."
|
|
$(PERL) $(SRCDIR)\Configure reconf
|
|
@echo "**************************************************"
|
|
@echo "*** ***"
|
|
@echo "*** Please run the same make command again ***"
|
|
@echo "*** ***"
|
|
@echo "**************************************************"
|
|
@exit 1
|
|
|
|
{-
|
|
use File::Basename;
|
|
use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;
|
|
|
|
# Helper function to figure out dependencies on libraries
|
|
# It takes a list of library names and outputs a list of dependencies
|
|
sub compute_lib_depends {
|
|
if ($disabled{shared}) {
|
|
return map { $_.$libext } @_;
|
|
}
|
|
return map { shlib_import($_) } @_;
|
|
}
|
|
|
|
sub generatesrc {
|
|
my %args = @_;
|
|
(my $target = $args{src}) =~ s/\.[sS]$/.asm/;
|
|
my $generator = join(" ", @{$args{generator}});
|
|
my $incs = join("", map { " /I ".$_ } @{$args{incs}});
|
|
my $deps = join(" ", @{$args{deps}});
|
|
|
|
if ($target !~ /\.asm$/) {
|
|
return <<"EOF";
|
|
$target: $args{generator}->[0] $deps
|
|
\$(PERL) $generator > \$@
|
|
EOF
|
|
} else {
|
|
if ($args{generator}->[0] =~ /\.pl$/) {
|
|
$generator = '$(PERL) '.$generator;
|
|
} elsif ($args{generator}->[0] =~ /\.S$/) {
|
|
$generator = undef;
|
|
} else {
|
|
die "Generator type for $src unknown: $generator\n";
|
|
}
|
|
|
|
if (defined($generator)) {
|
|
# If the target is named foo.S in build.info, we want to
|
|
# end up generating foo.s in two steps.
|
|
if ($args{src} =~ /\.S$/) {
|
|
return <<"EOF";
|
|
$target: $args{generator}->[0] $deps
|
|
set ASM=\$(AS)
|
|
set CC=\$(CC)
|
|
$generator \$@.S
|
|
\$(CC) \$(CFLAGS) $incs /EP /C \$@.S > \$@.i && move /Y \$@.i \$@
|
|
del /Q \$@.S
|
|
EOF
|
|
}
|
|
# Otherwise....
|
|
return <<"EOF";
|
|
$target: $args{generator}->[0] $deps
|
|
set ASM=\$(AS)
|
|
set CC=\$(CC)
|
|
$generator \$@
|
|
EOF
|
|
}
|
|
return <<"EOF";
|
|
$target: $args{generator}->[0] $deps
|
|
\$(CC) \$(CFLAGS) $incs /EP /C $args{generator}->[0] > \$@.i && move /Y \$@.i \$@
|
|
EOF
|
|
}
|
|
}
|
|
|
|
sub src2obj {
|
|
my %args = @_;
|
|
my $obj = $args{obj};
|
|
my @srcs = map { (my $x = $_) =~ s/\.s$/.asm/; $x
|
|
} ( @{$args{srcs}} );
|
|
my $srcs = join(" ", @srcs);
|
|
my $deps = join(" ", @srcs, @{$args{deps}});
|
|
my $incs = join("", map { " /I ".$_ } @{$args{incs}});
|
|
my $ecflags = { lib => '$(LIB_CFLAGS)',
|
|
dso => '$(DSO_CFLAGS)',
|
|
bin => '$(BIN_CFLAGS)' } -> {$args{intent}};
|
|
my $makedepprog = $config{makedepprog};
|
|
if ($srcs[0] =~ /\.asm$/) {
|
|
return <<"EOF";
|
|
$obj$objext: $deps
|
|
\$(AS) \$(ASFLAGS) \$(ASOUTFLAG)\$\@ $srcs
|
|
EOF
|
|
}
|
|
return <<"EOF" if (!$disabled{makedepend});
|
|
$obj$depext: $deps
|
|
\$(CC) \$(CFLAGS) $ecflags$inc /Zs /showIncludes $srcs 2>&1 | \\
|
|
\$(PERL) -n << > $obj$depext
|
|
chomp;
|
|
s/^Note: including file: *//;
|
|
\$\$collect{\$\$_} = 1;
|
|
END { print '$obj$objext: ',join(" ", sort keys \%collect),"\\n" }
|
|
<<
|
|
$obj$objext: $obj$depext
|
|
\$(CC) \$(CFLAGS) $ecflags$incs -c \$(COUTFLAG)\$\@ @<<
|
|
$srcs
|
|
<<
|
|
EOF
|
|
return <<"EOF" if ($disabled{makedepend});
|
|
$obj$objext: $deps
|
|
\$(CC) \$(CFLAGS) $ecflags$incs -c \$(COUTFLAG)\$\@ $srcs
|
|
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'.
|
|
sub libobj2shlib {
|
|
my %args = @_;
|
|
my $lib = $args{lib};
|
|
my $shlib = $args{shlib};
|
|
(my $mkdef_key = $lib) =~ s/^lib//i;
|
|
my $objs = join("\n", map { $_.$objext } @{$args{objs}});
|
|
my $linklibs = join("",
|
|
map { "\n$_" } compute_lib_depends(@{$args{deps}}));
|
|
my $deps = join(" ",
|
|
(map { $_.$objext } @{$args{objs}}),
|
|
compute_lib_depends(@{$args{deps}}));
|
|
my $ordinalsfile = defined($args{ordinals}) ? $args{ordinals}->[1] : "";
|
|
my $mkdef_pl = abs2rel(rel2abs(catfile($config{sourcedir},
|
|
"util", "mkdef.pl")),
|
|
rel2abs($config{builddir}));
|
|
my $mkrc_pl = abs2rel(rel2abs(catfile($config{sourcedir},
|
|
"util", "mkrc.pl")),
|
|
rel2abs($config{builddir}));
|
|
my $target = shlib_import($lib);
|
|
return <<"EOF"
|
|
$target: $deps $ordinalsfile $mkdef_pl
|
|
\$(PERL) $mkdef_pl "$mkdef_key" 32 > $shlib.def
|
|
\$(PERL) -i.tmp -pe "s|^LIBRARY\\s+${mkdef_key}32|LIBRARY $shlib|;" $shlib.def
|
|
DEL $shlib.def.tmp
|
|
\$(PERL) $mkrc_pl $shlib$shlibext > $shlib.rc
|
|
\$(RC) \$(RCOUTFLAG)$shlib.res $shlib.rc
|
|
\$(LD) \$(LDFLAGS) \$(LIB_LDFLAGS) \\
|
|
/implib:\$@ \$(LDOUTFLAG)$shlib$shlibext /def:$shlib.def @<< || (DEL /Q \$(\@B).* $shlib.* && EXIT 1)
|
|
$objs $shlib.res$linklibs \$(EX_LIBS)
|
|
<<
|
|
DEL /F apps\\$shlib$shlibext
|
|
DEL /F test\\$shlib$shlibext
|
|
COPY $shlib$shlibext apps
|
|
COPY $shlib$shlibext test
|
|
EOF
|
|
}
|
|
sub obj2dso {
|
|
my %args = @_;
|
|
my $dso = $args{lib};
|
|
my $dso_n = basename($dso);
|
|
my $objs = join("\n", map { $_.$objext } @{$args{objs}});
|
|
my $linklibs = join("",
|
|
map { "\n$_" } compute_lib_depends(@{$args{deps}}));
|
|
my $deps = join(" ",
|
|
(map { $_.$objext } @{$args{objs}}),
|
|
compute_lib_depends(@{$args{deps}}));
|
|
return <<"EOF";
|
|
$dso$dsoext: $deps
|
|
\$(LD) \$(LDFLAGS) \$(DSO_LDFLAGS) \$(LDOUTFLAG)$dso$dsoext /def:<< @<<
|
|
LIBRARY $dso_n
|
|
EXPORTS
|
|
bind_engine @1
|
|
v_check @2
|
|
<<
|
|
$objs$linklibs \$(EX_LIBS)
|
|
<<
|
|
EOF
|
|
}
|
|
sub obj2lib {
|
|
# Because static libs and import libs are both named the same in native
|
|
# Windows, we can't have both. We skip the static lib in that case,
|
|
# as the shared libs are what we use anyway.
|
|
return "" unless $disabled{"shared"};
|
|
|
|
my %args = @_;
|
|
my $lib = $args{lib};
|
|
my $objs = join("\n", map { $_.$objext } @{$args{objs}});
|
|
my $deps = join(" ", map { $_.$objext } @{$args{objs}});
|
|
return <<"EOF";
|
|
$lib$libext: $deps
|
|
\$(AR) \$(ARFLAGS) \$(AROUTFLAG)$lib$libext @<<
|
|
\$\?
|
|
<<
|
|
EOF
|
|
}
|
|
sub obj2bin {
|
|
my %args = @_;
|
|
my $bin = $args{bin};
|
|
my $objs = join("\n", map { $_.$objext } @{$args{objs}});
|
|
my $linklibs = join("",
|
|
map { "\n$_" } compute_lib_depends(@{$args{deps}}));
|
|
my $deps = join(" ",
|
|
(map { $_.$objext } @{$args{objs}}),
|
|
compute_lib_depends(@{$args{deps}}));
|
|
return <<"EOF";
|
|
$bin$exeext: $deps
|
|
\$(LD) \$(LDFLAGS) \$(BIN_LDFLAGS) \$(LDOUTFLAG)$bin$exeext @<<
|
|
$objs setargv.obj$linklibs \$(EX_LIBS)
|
|
<<
|
|
EOF
|
|
}
|
|
sub in2script {
|
|
my %args = @_;
|
|
my $script = $args{script};
|
|
my $sources = join(" ", @{$args{sources}});
|
|
my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
|
|
"util", "dofile.pl")),
|
|
rel2abs($config{builddir}));
|
|
return <<"EOF";
|
|
$script: $sources
|
|
\$(PERL) "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\
|
|
"-o$target{build_file}" $sources > "$script"
|
|
EOF
|
|
}
|
|
"" # Important! This becomes part of the template result.
|
|
-}
|