##
## Makefile for OpenSSL
##
## {- join("\n## ", @autowarntext) -}
{-
     use OpenSSL::Util;

     our $makedep_scheme = $config{makedep_scheme};
     our $makedepcmd = platform->makedepcmd();

     sub windowsdll { $config{target} =~ /^(?:Cygwin|mingw)/ }

     # Shared AIX support is special. We put libcrypto[64].so.ver into
     # libcrypto.a and use libcrypto_a.a as static one.
     sub sharedaix  { !$disabled{shared} && $config{target} =~ /^aix/ }

     our $sover_dirname = platform->shlib_version_as_filename();

     # This makes sure things get built in the order they need
     # to. You're welcome.
     sub dependmagic {
         my $target = shift;

         return "$target: build_generated\n\t\$(MAKE) depend && \$(MAKE) _$target\n_$target";
     }

     our $COLUMNS = $ENV{COLUMNS};
     if ($COLUMNS =~ /^\d+$/) {
         $COLUMNS = int($COLUMNS) - 2; # 2 to leave space for ending ' \'
     } else {
         $COLUMNS = 76;
     }

     sub fill_lines {
         my $item_sep = shift;                  # string
         my $line_length = shift;               # number of chars

         my @result = ();
         my $resultpos = 0;

         foreach (@_) {
             my $fill_line = $result[$resultpos] // '';
             my $newline =
                 ($fill_line eq '' ? '' : $fill_line . $item_sep) . $_;

             if (length($newline) > $line_length) {
                 # If this is a single item and the intended result line
                 # is empty, we put it there anyway
                 if ($fill_line eq '') {
                     $result[$resultpos++] = $newline;
                 } else {
                     $result[++$resultpos] = $_;
                 }
             } else {
                 $result[$resultpos] = $newline;
             }
         }
         return @result;
     }
     '';
-}
PLATFORM={- $config{target} -}
OPTIONS={- $config{options} -}
CONFIGURE_ARGS=({- join(", ",quotify_l(@{$config{perlargv}})) -})
SRCDIR={- $config{sourcedir} -}
BLDDIR={- $config{builddir} -}
FIPSKEY={- $config{FIPSKEY} -}

VERSION={- "$config{full_version}" -}
VERSION_NUMBER={- "$config{version}" -}
MAJOR={- $config{major} -}
MINOR={- $config{minor} -}
SHLIB_VERSION_NUMBER={- $config{shlib_version} -}
SHLIB_TARGET={- $target{shared_target} -}

LIBS={- join(" \\\n" . ' ' x 5,
             fill_lines(" ", $COLUMNS - 5,
                        map { platform->staticlib($_) // () }
                        @{$unified_info{libraries}})) -}
SHLIBS={- join(" \\\n" . ' ' x 7,
               fill_lines(" ", $COLUMNS - 7,
                          map { platform->sharedlib($_) // () }
                          @{$unified_info{libraries}})) -}
SHLIB_INFO={- join(" \\\n" . ' ' x 11,
                   fill_lines(" ", $COLUMNS - 11,
                          map { my $x = platform->sharedlib($_);
                                my $y = platform->sharedlib_simple($_) // '';
                                my $z = platform->sharedlib_import($_) // '';
                                $x ? "\"$x;$y;$z\"" : () }
                          @{$unified_info{libraries}})) -}
MODULES={- join(" \\\n" . ' ' x 8,
                fill_lines(" ", $COLUMNS - 8,
                           map { platform->dso($_) }
                           # Drop all modules that are dependencies, they will
                           # be processed through their dependents
                           grep { my $x = $_;
                                  !grep { grep { $_ eq $x } @$_ }
                                        values %{$unified_info{depends}} }
                           @{$unified_info{modules}})) -}
FIPSMODULE={- # We do some extra checking here, as there should be only one
              use File::Basename;
              our @fipsmodules =
                  grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
                         && $unified_info{attributes}->{modules}->{$_}->{fips} }
                  @{$unified_info{modules}};
              die "More that one FIPS module" if scalar @fipsmodules > 1;
              join(" ", map { platform->dso($_) } @fipsmodules) -}
FIPSMODULENAME={- die "More that one FIPS module" if scalar @fipsmodules > 1;
                  join(" ", map { basename(platform->dso($_)) } @fipsmodules) -}

PROGRAMS={- join(" \\\n" . ' ' x 9,
                 fill_lines(" ", $COLUMNS - 9,
                            map { platform->bin($_) }
                            @{$unified_info{programs}})) -}
SCRIPTS={- join(" \\\n" . ' ' x 8,
                fill_lines(" ", $COLUMNS - 8, @{$unified_info{scripts}})) -}
{- output_off() if $disabled{makedepend}; "" -}
DEPS={- join(" \\\n" . ' ' x 5,
             fill_lines(" ", $COLUMNS - 5,
                        map { platform->isobj($_) ? platform->dep($_) : () }
                        grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
                        keys %{$unified_info{sources}})); -}
{- output_on() if $disabled{makedepend}; "" -}
GENERATED_MANDATORY={- join(" \\\n" . ' ' x 20,
                            fill_lines(" ", $COLUMNS - 20,
                                       @{$unified_info{depends}->{""}})) -}
GENERATED_PODS={- # common0.tmpl provides @generated
                  join(" \\\n" . ' ' x 15,
                       fill_lines(" ", $COLUMNS - 15,
                                  map { my $x = $_;
                                        (
                                          grep { 
                                                 $unified_info{attributes}->{depends}
                                                 ->{$x}->{$_}->{pod} // 0
                                               }
                                              keys %{$unified_info{attributes}->{depends}->{$x}}
                                        ) ? $x : ();
                                      }
                                      @generated)) -}
GENERATED={- # common0.tmpl provides @generated
             join(" \\\n" . ' ' x 5,
                  fill_lines(" ", $COLUMNS - 5,
                             map { platform->convertext($_) } @generated )) -}

INSTALL_LIBS={-
        join(" \\\n" . ' ' x 13,
             fill_lines(" ", $COLUMNS - 13,
                        map { platform->staticlib($_) // () }
                        grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
                        @{$unified_info{libraries}}))
-}
INSTALL_SHLIBS={-
        join(" \\\n" . ' ' x 15,
             fill_lines(" ", $COLUMNS - 15,
                        map { platform->sharedlib($_) // () }
                        grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
                        @{$unified_info{libraries}}))
-}
INSTALL_SHLIB_INFO={-
        join(" \\\n" . ' ' x 19,
             fill_lines(" ", $COLUMNS - 19,
                        map { my $x = platform->sharedlib($_);
                              my $y = platform->sharedlib_simple($_) // '';
                              my $z = platform->sharedlib_import($_) // '';
                              $x ? "\"$x;$y;$z\"" : () }
                        grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
                        @{$unified_info{libraries}}))
-}
INSTALL_ENGINES={-
        join(" \\\n" . ' ' x 16,
             fill_lines(" ", $COLUMNS - 16,
                        map { platform->dso($_) }
                        grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
                               && $unified_info{attributes}->{modules}->{$_}->{engine} }
                        @{$unified_info{modules}}))
-}
INSTALL_MODULES={-
        join(" \\\n" . ' ' x 16,
             fill_lines(" ", $COLUMNS - 16,
                        map { platform->dso($_) }
                        grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
                               && !$unified_info{attributes}->{modules}->{$_}->{engine}
                               && !$unified_info{attributes}->{modules}->{$_}->{fips} }
                        @{$unified_info{modules}}))
-}
INSTALL_FIPSMODULE={-
        join(" \\\n" . ' ' x 16,
             fill_lines(" ", $COLUMNS - 16,
                        map { platform->dso($_) }
                        grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
                               && $unified_info{attributes}->{modules}->{$_}->{fips} }
                        @{$unified_info{modules}}))
-}
INSTALL_FIPSMODULECONF=providers/fipsmodule.cnf
INSTALL_PROGRAMS={-
        join(" \\\n" . ' ' x 16,
             fill_lines(" ", $COLUMNS - 16, map { platform->bin($_) }
                        grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} }
                        @{$unified_info{programs}}))
-}
BIN_SCRIPTS={-
        join(" \\\n" . ' ' x 12,
             fill_lines(" ", $COLUMNS - 12,
                        map { my $x = $unified_info{attributes}->{scripts}->{$_}->{linkname};
                              $x ? "$_:$x" : $_ }
                        grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
                               && !$unified_info{attributes}->{scripts}->{$_}->{misc} }
                        @{$unified_info{scripts}}))
-}
MISC_SCRIPTS={-
        join(" \\\n" . ' ' x 13,
             fill_lines(" ", $COLUMNS - 13,
                        map { my $x = $unified_info{attributes}->{scripts}->{$_}->{linkname};
                              $x ? "$_:$x" : $_ }
                        grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
                               && $unified_info{attributes}->{scripts}->{$_}->{misc} }
                        @{$unified_info{scripts}}))
-}
IMAGEDOCS1={-
        join(" \\\n" . ' ' x 10,
             fill_lines(" ", $COLUMNS - 10,
                        @{$unified_info{imagedocs}->{man1}})) -}
IMAGEDOCS3={-
        join(" \\\n" . ' ' x 10,
             fill_lines(" ", $COLUMNS - 10,
                        @{$unified_info{imagedocs}->{man3}})) -}
IMAGEDOCS5={-
        join(" \\\n" . ' ' x 10,
             fill_lines(" ", $COLUMNS - 10,
                        @{$unified_info{imagedocs}->{man5}})) -}
IMAGEDOCS7={-
        join(" \\\n" . ' ' x 10,
             fill_lines(" ", $COLUMNS - 10,
                        @{$unified_info{imagedocs}->{man7}})) -}
HTMLDOCS1={-
        join(" \\\n" . ' ' x 10,
             fill_lines(" ", $COLUMNS - 10,
                        @{$unified_info{htmldocs}->{man1}})) -}
HTMLDOCS3={-
        join(" \\\n" . ' ' x 10,
             fill_lines(" ", $COLUMNS - 10,
                        @{$unified_info{htmldocs}->{man3}})) -}
HTMLDOCS5={-
        join(" \\\n" . ' ' x 10,
             fill_lines(" ", $COLUMNS - 10,
                        @{$unified_info{htmldocs}->{man5}})) -}
HTMLDOCS7={-
        join(" \\\n" . ' ' x 10,
             fill_lines(" ", $COLUMNS - 10,
                        @{$unified_info{htmldocs}->{man7}})) -}
MANDOCS1={-
        join(" \\\n" . ' ' x 9,
             fill_lines(" ", $COLUMNS - 9,
                        @{$unified_info{mandocs}->{man1}})) -}
MANDOCS3={-
        join(" \\\n" . ' ' x 9,
             fill_lines(" ", $COLUMNS - 9,
                        @{$unified_info{mandocs}->{man3}})) -}
MANDOCS5={-
        join(" \\\n" . ' ' x 9,
             fill_lines(" ", $COLUMNS - 9,
                        @{$unified_info{mandocs}->{man5}})) -}
MANDOCS7={-
        join(" \\\n" . ' ' x 9,
             fill_lines(" ", $COLUMNS - 9,
                        @{$unified_info{mandocs}->{man7}})) -}

APPS_OPENSSL="{- use File::Spec::Functions;
                 catfile("apps","openssl") -}"

# DESTDIR is for package builders so that they can configure for, say,
# /usr/ and yet have everything installed to /tmp/somedir/usr/.
# Normally it is left empty.
DESTDIR=

# 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} || "/usr/local";
              $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}))
                      : catdir($prefix, "ssl");
              $openssldir -}
LIBDIR={- our $libdir = $config{libdir};
          unless ($libdir) {
              $libdir = "lib$target{multilib}";
          }
          file_name_is_absolute($libdir) ? "" : $libdir -}
# $(libdir) is chosen to be compatible with the GNU coding standards
libdir={- file_name_is_absolute($libdir)
          ? $libdir : '$(INSTALLTOP)/$(LIBDIR)' -}
ENGINESDIR=$(libdir)/engines-{- $sover_dirname -}
MODULESDIR=$(libdir)/ossl-modules

# Convenience variable for those who want to set the rpath in shared
# libraries and applications
LIBRPATH=$(libdir)

MANDIR=$(INSTALLTOP)/share/man
DOCDIR=$(INSTALLTOP)/share/doc/$(BASENAME)
HTMLDIR=$(DOCDIR)/html

# MANSUFFIX is for the benefit of anyone who may want to have a suffix
# appended after the manpage file section number.  "ssl" is popular,
# resulting in files such as config.5ssl rather than config.5.
MANSUFFIX=ossl
HTMLSUFFIX=html

# For "optional" echo messages, to get "real" silence
ECHO = echo

##### User defined commands and flags ################################

# We let the C compiler driver to take care of .s files. This is done in
# order to be excused from maintaining a separate set of architecture
# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC
# gcc, then the driver will automatically translate it to -xarch=v8plus
# and pass it down to assembler.  In any case, we do not define AS or
# ASFLAGS for this reason.

CROSS_COMPILE={- $config{CROSS_COMPILE} -}
CC=$(CROSS_COMPILE){- $config{CC} -}
CXX={- $config{CXX} ? "\$(CROSS_COMPILE)$config{CXX}" : '' -}
CPPFLAGS={- our $cppflags1 = join(" ",
                                  (map { "-D".$_} @{$config{CPPDEFINES}}),
                                  (map { "-I".$_} @{$config{CPPINCLUDES}}),
                                  @{$config{CPPFLAGS}}) -}
CFLAGS={- join(' ', @{$config{CFLAGS}}) -}
CXXFLAGS={- join(' ', @{$config{CXXFLAGS}}) -}
LDFLAGS= {- join(' ', @{$config{LDFLAGS}}) -}
EX_LIBS= {- join(' ', @{$config{LDLIBS}}) -}

MAKEDEPEND={- $config{makedepcmd} -}

PERL={- $config{PERL} -}

AR=$(CROSS_COMPILE){- $config{AR} -}
ARFLAGS= {- join(' ', @{$config{ARFLAGS}}) -}
RANLIB={- $config{RANLIB} ? "\$(CROSS_COMPILE)$config{RANLIB}" : "true"; -}
RC= $(CROSS_COMPILE){- $config{RC} -}
RCFLAGS={- join(' ', @{$config{RCFLAGS}}) -} {- $target{shared_rcflag} -}

RM= rm -f
RMDIR= rmdir
TAR= {- $target{TAR} || "tar" -}
TARFLAGS= {- $target{TARFLAGS} -}

BASENAME=       openssl
NAME=           $(BASENAME)-$(VERSION)
# Relative to $(SRCDIR)
TARFILE=        ../$(NAME).tar

##### Project flags ##################################################

# Variables starting with CNF_ are common variables for all product types

CNF_CPPFLAGS={- our $cppflags2 =
                    join(' ', $target{cppflags} || (),
                              (map { "-D".$_} @{$target{defines}},
                                              @{$config{defines}}),
                              (map { "-I".$_} @{$target{includes}},
                                              @{$config{includes}}),
                              @{$config{cppflags}}) -}
CNF_CFLAGS={- join(' ', $target{cflags} || (),
                        @{$config{cflags}}) -}
CNF_CXXFLAGS={- join(' ', $target{cxxflags} || (),
                          @{$config{cxxflags}}) -}
CNF_LDFLAGS={- join(' ', $target{lflags} || (),
                         @{$config{lflags}}) -}
CNF_EX_LIBS={- join(' ', $target{ex_libs} || (),
                         @{$config{ex_libs}}) -}

# Variables starting with LIB_ are used to build library object files
# and shared libraries.
# Variables starting with DSO_ are used to build DSOs and their object files.
# Variables starting with BIN_ are used to build programs and their object
# files.

LIB_CPPFLAGS={- our $lib_cppflags =
                join(' ', $target{lib_cppflags} || (),
                          $target{shared_cppflag} || (),
                          (map { '-D'.$_ }
                               @{$target{lib_defines} || ()},
                               @{$target{shared_defines} || ()},
                               @{$config{lib_defines} || ()},
                               @{$config{shared_defines} || ()}),
                          (map { '-I'.quotify1($_) }
                               @{$target{lib_includes}},
                               @{$target{shared_includes}},
                               @{$config{lib_includes}},
                               @{$config{shared_includes}}),
                          @{$config{lib_cppflags}},
                          @{$config{shared_cppflag}});
                join(' ', $lib_cppflags,
                          (map { '-D'.$_ }
                               'OPENSSLDIR="\"$(OPENSSLDIR)\""',
                               'ENGINESDIR="\"$(ENGINESDIR)\""',
                               'MODULESDIR="\"$(MODULESDIR)\""'),
                          '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
LIB_CFLAGS={- join(' ', $target{lib_cflags} || (),
                        $target{shared_cflag} || (),
                        @{$config{lib_cflags}},
                        @{$config{shared_cflag}},
                        '$(CNF_CFLAGS)', '$(CFLAGS)') -}
LIB_CXXFLAGS={- join(' ', $target{lib_cxxflags} || (),
                          $target{shared_cxxflag} || (),
                          @{$config{lib_cxxflags}},
                          @{$config{shared_cxxflag}},
                          '$(CNF_CXXFLAGS)', '$(CXXFLAGS)') -}
LIB_LDFLAGS={- join(' ', $target{shared_ldflag} || (),
                         $config{shared_ldflag} || (),
                         '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
LIB_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS)
DSO_CPPFLAGS={- join(' ', $target{dso_cppflags} || (),
                          $target{module_cppflags} || (),
                          (map { '-D'.$_ }
                               @{$target{dso_defines}},
                               @{$target{module_defines}},
                               @{$config{dso_defines} || ()},
                               @{$config{module_defines} || ()}),
                          (map { '-I'.quotify1($_) }
                               @{$target{dso_includes}},
                               @{$target{module_includes}},
                               @{$config{dso_includes}},
                               @{$config{module_includes}}),
                          @{$config{dso_cppflags}},
                          @{$config{module_cppflags}},
                          '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
DSO_CFLAGS={- join(' ', $target{dso_cflags} || (),
                        $target{module_cflags} || (),
                        @{$config{dso_cflags}},
                        @{$config{module_cflags}},
                        '$(CNF_CFLAGS)', '$(CFLAGS)') -}
DSO_CXXFLAGS={- join(' ', $target{dso_cxxflags} || (),
                          $target{module_cxxflags} || (),
                          @{$config{dso_cxxflags}},
                          @{$config{module_cxxflag}},
                          '$(CNF_CXXFLAGS)', '$(CXXFLAGS)') -}
DSO_LDFLAGS={- join(' ', $target{dso_ldflags} || (),
                         $target{module_ldflags} || (),
                         @{$config{dso_ldflags}},
                         @{$config{module_ldflags}},
                         '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
DSO_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS)
BIN_CPPFLAGS={- join(' ', $target{bin_cppflags} || (),
                          (map { '-D'.$_ } @{$config{bin_defines} || ()}),
                          @{$config{bin_cppflags}},
                          '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
BIN_CFLAGS={- join(' ', $target{bin_cflags} || (),
                        @{$config{bin_cflags}},
                        '$(CNF_CFLAGS)', '$(CFLAGS)') -}
BIN_CXXFLAGS={- join(' ', $target{bin_cxxflags} || (),
                          @{$config{bin_cxxflags}},
                          '$(CNF_CXXFLAGS)', '$(CXXFLAGS)') -}
BIN_LDFLAGS={- join(' ', $target{bin_lflags} || (),
                         @{$config{bin_lflags}},
                         '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
BIN_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS)

# CPPFLAGS_Q is used for one thing only: to build up buildinf.h
CPPFLAGS_Q={- $cppflags1 =~ s|([\\"])|\\$1|g;
              $cppflags2 =~ s|([\\"])|\\$1|g;
              $lib_cppflags =~ s|([\\"])|\\$1|g;
              join(' ', $lib_cppflags || (), $cppflags2 || (),
                        $cppflags1 || ()) -}

PERLASM_SCHEME= {- $target{perlasm_scheme} -}

# For x86 assembler: Set PROCESSOR to 386 if you want to support
# the 80386.
PROCESSOR= {- $config{processor} -}

# We want error [and other] messages in English. Trouble is that make(1)
# doesn't pass macros down as environment variables unless there already
# was corresponding variable originally set. In other words we can only
# reassign environment variables, but not set new ones, not in portable
# manner that is. That's why we reassign several, just to be sure...
LC_ALL=C
LC_MESSAGES=C
LANG=C

# The main targets ###################################################

{- dependmagic('build_sw'); -}: build_libs_nodep build_modules_nodep build_programs_nodep link-utils
{- dependmagic('build_libs'); -}: build_libs_nodep
{- dependmagic('build_modules'); -}: build_modules_nodep
{- dependmagic('build_programs'); -}: build_programs_nodep

build_generated_pods: $(GENERATED_PODS)
build_docs: build_man_docs build_html_docs
build_man_docs: $(MANDOCS1) $(MANDOCS3) $(MANDOCS5) $(MANDOCS7)
build_html_docs: $(HTMLDOCS1) $(HTMLDOCS3) $(HTMLDOCS5) $(HTMLDOCS7)

build_generated: $(GENERATED_MANDATORY)
build_libs_nodep: libcrypto.pc libssl.pc openssl.pc
build_modules_nodep: $(MODULES)
build_programs_nodep: $(PROGRAMS) $(SCRIPTS)

# Kept around for backward compatibility
build_apps build_tests: build_programs

# Convenience target to prebuild all generated files, not just the mandatory
# ones
build_all_generated: $(GENERATED_MANDATORY) $(GENERATED) build_docs
	@ : {- output_off() if $disabled{makedepend}; "" -}
	@echo "Warning: consider configuring with no-makedepend, because if"
	@echo "         target system doesn't have $(PERL),"
	@echo "         then make will fail..."
	@ : {- output_on() if $disabled{makedepend}; "" -}

all: build_sw build_docs

test: tests
{- dependmagic('tests'); -}: build_programs_nodep build_modules_nodep link-utils run_tests
run_tests:
	@ : {- output_off() if $disabled{tests}; "" -}
	( SRCTOP=$(SRCDIR) \
	  BLDTOP=$(BLDDIR) \
	  PERL="$(PERL)" \
	  FIPSKEY="$(FIPSKEY)" \
	  EXE_EXT={- platform->binext() -} \
	  $(PERL) $(SRCDIR)/test/run_tests.pl $(TESTS) )
	@ : {- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -}
	@echo "Tests are not supported with your chosen Configure options"
	@ : {- output_on() if !$disabled{tests}; "" -}

list-tests:
	@ : {- output_off() if $disabled{tests}; "" -}
	$(MAKE) run_tests TESTS=list
	@ : {- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -}
	@echo "Tests are not supported with your chosen Configure options"
	@ : {- output_on() if !$disabled{tests}; "" -}

install: install_sw install_ssldirs install_docs {- $disabled{fips} ? "" : "install_fips" -}

uninstall: uninstall_docs uninstall_sw {- $disabled{fips} ? "" : "uninstall_fips" -}

libclean:
	@set -e; for s in $(SHLIB_INFO); do \
		if [ "$$s" = ";" ]; then continue; fi; \
		s1=`echo "$$s" | cut -f1 -d";"`; \
		s2=`echo "$$s" | cut -f2 -d";"`; \
		s3=`echo "$$s" | cut -f3 -d";"`; \
		$(ECHO) $(RM) $$s1; {- output_off() unless windowsdll(); "" -}\
		$(RM) apps/$$s1; \
		$(RM) test/$$s1; \
		$(RM) fuzz/$$s1; {- output_on() unless windowsdll(); "" -}\
		$(RM) $$s1; \
		if [ "$$s2" != "" ]; then \
			$(ECHO) $(RM) $$s2; \
			$(RM) $$s2; \
		fi; \
		if [ "$$s3" != "" ]; then \
			$(ECHO) $(RM) $$s3; \
			$(RM) $$s3; \
		fi; \
	done
	$(RM) $(LIBS)
	$(RM) *{- platform->defext() -}

clean: libclean
	$(RM) $(HTMLDOCS1)
	$(RM) $(HTMLDOCS3)
	$(RM) $(HTMLDOCS5)
	$(RM) $(HTMLDOCS7)
	$(RM) $(MANDOCS1)
	$(RM) $(MANDOCS3)
	$(RM) $(MANDOCS5)
	$(RM) $(MANDOCS7)
	$(RM) $(PROGRAMS) $(TESTPROGS) $(MODULES) $(FIPSMODULE) $(SCRIPTS)
	$(RM) $(GENERATED_MANDATORY) $(GENERATED)
	-find . -name '*{- platform->depext() -}' \! -name '.*' \! -type d -exec $(RM) {} \;
	-find . -name '*{- platform->objext() -}' \! -name '.*' \! -type d -exec $(RM) {} \;
	$(RM) core
	$(RM) tags TAGS doc-nits md-nits
	$(RM) -r test/test-runs
	$(RM) providers/fips*.new
	$(RM) openssl.pc libcrypto.pc libssl.pc
	-find . -type l \! -name '.*' -exec $(RM) {} \;

distclean: clean
	$(RM) configdata.pm
	$(RM) Makefile

# We check if any depfile is newer than Makefile and decide to
# concatenate only if that is true.
depend:
	@: {- output_off() if $disabled{makedepend}; "" -}
	@$(PERL) $(SRCDIR)/util/add-depends.pl "{- $makedep_scheme -}"
	@: {- output_on() if $disabled{makedepend}; "" -}

# Install helper targets #############################################

install_sw: install_dev install_engines install_modules install_runtime

uninstall_sw: uninstall_runtime uninstall_modules uninstall_engines uninstall_dev

install_docs: install_man_docs install_html_docs

uninstall_docs: uninstall_man_docs uninstall_html_docs
	$(RM) -r $(DESTDIR)$(DOCDIR)

{- output_off() if $disabled{fips}; "" -}
install_fips: build_sw $(INSTALL_FIPSMODULECONF)
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MODULESDIR)
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)
	@$(ECHO) "*** Installing FIPS module"
	@$(ECHO) "install $(INSTALL_FIPSMODULE) -> $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME)"
	@cp "$(INSTALL_FIPSMODULE)" $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME).new
	@chmod 755 $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME).new
	@mv -f $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME).new \
	       $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME)
	@$(ECHO) "*** Installing FIPS module configuration"
	@$(ECHO) "install $(INSTALL_FIPSMODULECONF) -> $(DESTDIR)$(OPENSSLDIR)/fipsmodule.cnf"
	@cp $(INSTALL_FIPSMODULECONF) $(DESTDIR)$(OPENSSLDIR)/fipsmodule.cnf

uninstall_fips:
	@$(ECHO) "*** Uninstalling FIPS module configuration"
	$(RM) $(DESTDIR)$(OPENSSLDIR)/fipsmodule.cnf
	@$(ECHO) "*** Uninstalling FIPS module"
	$(RM) $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME)
{- if ($disabled{fips}) { output_on(); } else { output_off(); } "" -}
install_fips:
	@$(ECHO) "The 'install_fips' target requires the 'enable-fips' option"

uninstall_fips:
	@$(ECHO) "The 'uninstall_fips' target requires the 'enable-fips' option"
{- output_on() if !$disabled{fips}; "" -}


install_ssldirs:
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/certs
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/private
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/misc
	@set -e; for x in dummy $(MISC_SCRIPTS); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		x1=`echo "$$x" | cut -f1 -d:`; \
		x2=`echo "$$x" | cut -f2 -d:`; \
		fn=`basename $$x1`; \
		$(ECHO) "install $$x1 -> $(DESTDIR)$(OPENSSLDIR)/misc/$$fn"; \
		cp $$x1 $(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new; \
		chmod 755 $(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new; \
		mv -f $(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new \
		      $(DESTDIR)$(OPENSSLDIR)/misc/$$fn; \
		if [ "$$x1" != "$$x2" ]; then \
			ln=`basename "$$x2"`; \
			: {- output_off() unless windowsdll(); "" -}; \
			$(ECHO) "copy $(DESTDIR)$(OPENSSLDIR)/misc/$$ln -> $(DESTDIR)$(OPENSSLDIR)/misc/$$fn"; \
			cp $(DESTDIR)$(OPENSSLDIR)/misc/$$fn $(DESTDIR)$(OPENSSLDIR)/misc/$$ln; \
			: {- output_on() unless windowsdll();
			     output_off() if windowsdll(); "" -}; \
			$(ECHO) "link $(DESTDIR)$(OPENSSLDIR)/misc/$$ln -> $(DESTDIR)$(OPENSSLDIR)/misc/$$fn"; \
			ln -sf $$fn $(DESTDIR)$(OPENSSLDIR)/misc/$$ln; \
			: {- output_on() if windowsdll(); "" -}; \
		fi; \
	done
	@$(ECHO) "install $(SRCDIR)/apps/openssl.cnf -> $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.dist"
	@cp $(SRCDIR)/apps/openssl.cnf $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new
	@chmod 644 $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new
	@mv -f  $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.dist
	@if [ ! -f "$(DESTDIR)$(OPENSSLDIR)/openssl.cnf" ]; then \
		$(ECHO) "install $(SRCDIR)/apps/openssl.cnf -> $(DESTDIR)$(OPENSSLDIR)/openssl.cnf"; \
		cp $(SRCDIR)/apps/openssl.cnf $(DESTDIR)$(OPENSSLDIR)/openssl.cnf; \
		chmod 644 $(DESTDIR)$(OPENSSLDIR)/openssl.cnf; \
	fi
	@$(ECHO) "install $(SRCDIR)/apps/ct_log_list.cnf -> $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.dist"
	@cp $(SRCDIR)/apps/ct_log_list.cnf $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.new
	@chmod 644 $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.new
	@mv -f  $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.new $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.dist
	@if [ ! -f "$(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf" ]; then \
		$(ECHO) "install $(SRCDIR)/apps/ct_log_list.cnf -> $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf"; \
		cp $(SRCDIR)/apps/ct_log_list.cnf $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf; \
		chmod 644 $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf; \
	fi

install_dev: install_runtime_libs
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@$(ECHO) "*** Installing development files"
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/include/openssl
	@ : {- output_off() if $disabled{uplink}; "" -}
	@$(ECHO) "install $(SRCDIR)/ms/applink.c -> $(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c"
	@cp $(SRCDIR)/ms/applink.c $(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c
	@chmod 644 $(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c
	@ : {- output_on() if $disabled{uplink}; "" -}
	@set -e; for i in $(SRCDIR)/include/openssl/*.h \
			  $(BLDDIR)/include/openssl/*.h; do \
		fn=`basename $$i`; \
		$(ECHO) "install $$i -> $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
		cp $$i $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
		chmod 644 $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
	done
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(libdir)
	@set -e; for l in $(INSTALL_LIBS); do \
		fn=`basename $$l`; \
		$(ECHO) "install $$l -> $(DESTDIR)$(libdir)/$$fn"; \
		cp $$l $(DESTDIR)$(libdir)/$$fn.new; \
		$(RANLIB) $(DESTDIR)$(libdir)/$$fn.new; \
		chmod 644 $(DESTDIR)$(libdir)/$$fn.new; \
		mv -f $(DESTDIR)$(libdir)/$$fn.new \
		      $(DESTDIR)$(libdir)/$$fn; \
	done
	@ : {- output_off() if $disabled{shared}; "" -}
	@set -e; for s in $(INSTALL_SHLIB_INFO); do \
		s1=`echo "$$s" | cut -f1 -d";"`; \
		s2=`echo "$$s" | cut -f2 -d";"`; \
		s3=`echo "$$s" | cut -f3 -d";"`; \
		fn1=`basename "$$s1"`; \
		fn2=`basename "$$s2"`; \
		fn3=`basename "$$s3"`; \
		: {- output_off(); output_on() unless windowsdll() or sharedaix(); "" -}; \
		if [ "$$fn2" != "" ]; then \
			$(ECHO) "link $(DESTDIR)$(libdir)/$$fn2 -> $(DESTDIR)$(libdir)/$$fn1"; \
			ln -sf $$fn1 $(DESTDIR)$(libdir)/$$fn2; \
		fi; \
		: {- output_off() unless windowsdll() or sharedaix(); output_on() if windowsdll(); "" -}; \
		if [ "$$fn3" != "" ]; then \
			$(ECHO) "install $$s3 -> $(DESTDIR)$(libdir)/$$fn3"; \
			cp $$s3 $(DESTDIR)$(libdir)/$$fn3.new; \
			chmod 755 $(DESTDIR)$(libdir)/$$fn3.new; \
			mv -f $(DESTDIR)$(libdir)/$$fn3.new \
			      $(DESTDIR)$(libdir)/$$fn3; \
		fi; \
		: {- output_off() if windowsdll(); output_on() if sharedaix(); "" -}; \
		a=$(DESTDIR)$(libdir)/$$fn2; \
		$(ECHO) "install $$s1 -> $$a"; \
		if [ -f $$a ]; then ( trap "rm -rf /tmp/ar.$$$$" INT 0; \
			mkdir /tmp/ar.$$$$; ( cd /tmp/ar.$$$$; \
			cp -f $$a $$a.new; \
			for so in `$(AR) t $$a`; do \
				$(AR) x $$a $$so; \
				chmod u+w $$so; \
				strip -X32_64 -e $$so; \
				$(AR) r $$a.new $$so; \
			done; \
		)); fi; \
		$(AR) r $$a.new $$s1; \
		mv -f $$a.new $$a; \
		: {- output_off() if sharedaix(); output_on(); "" -}; \
	done
	@ : {- output_on() if $disabled{shared}; "" -}
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(libdir)/pkgconfig
	@$(ECHO) "install libcrypto.pc -> $(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc"
	@cp libcrypto.pc $(DESTDIR)$(libdir)/pkgconfig
	@chmod 644 $(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc
	@$(ECHO) "install libssl.pc -> $(DESTDIR)$(libdir)/pkgconfig/libssl.pc"
	@cp libssl.pc $(DESTDIR)$(libdir)/pkgconfig
	@chmod 644 $(DESTDIR)$(libdir)/pkgconfig/libssl.pc
	@$(ECHO) "install openssl.pc -> $(DESTDIR)$(libdir)/pkgconfig/openssl.pc"
	@cp openssl.pc $(DESTDIR)$(libdir)/pkgconfig
	@chmod 644 $(DESTDIR)$(libdir)/pkgconfig/openssl.pc

uninstall_dev: uninstall_runtime_libs
	@$(ECHO) "*** Uninstalling development files"
	@ : {- output_off() if $disabled{uplink}; "" -}
	@$(ECHO) "$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c"
	@$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c
	@ : {- output_on() if $disabled{uplink}; "" -}
	@set -e; for i in $(SRCDIR)/include/openssl/*.h \
			  $(BLDDIR)/include/openssl/*.h; do \
		fn=`basename $$i`; \
		$(ECHO) "$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
	done
	-$(RMDIR) $(DESTDIR)$(INSTALLTOP)/include/openssl
	-$(RMDIR) $(DESTDIR)$(INSTALLTOP)/include
	@set -e; for l in $(INSTALL_LIBS); do \
		fn=`basename $$l`; \
		$(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn"; \
		$(RM) $(DESTDIR)$(libdir)/$$fn; \
	done
	@ : {- output_off() if $disabled{shared}; "" -}
	@set -e; for s in $(INSTALL_SHLIB_INFO); do \
		s1=`echo "$$s" | cut -f1 -d";"`; \
		s2=`echo "$$s" | cut -f2 -d";"`; \
		s3=`echo "$$s" | cut -f3 -d";"`; \
		fn1=`basename "$$s1"`; \
		fn2=`basename "$$s2"`; \
		fn3=`basename "$$s3"`; \
		: {- output_off() if windowsdll(); "" -}; \
		$(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn1"; \
		$(RM) $(DESTDIR)$(libdir)/$$fn1; \
		if [ -n "$$fn2" ]; then \
			$(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn2"; \
			$(RM) $(DESTDIR)$(libdir)/$$fn2; \
		fi; \
		: {- output_on() if windowsdll(); "" -}{- output_off() unless windowsdll(); "" -}; \
		if [ -n "$$fn3" ]; then \
			$(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn3"; \
			$(RM) $(DESTDIR)$(libdir)/$$fn3; \
		fi; \
		: {- output_on() unless windowsdll(); "" -}; \
	done
	@ : {- output_on() if $disabled{shared}; "" -}
	$(RM) $(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc
	$(RM) $(DESTDIR)$(libdir)/pkgconfig/libssl.pc
	$(RM) $(DESTDIR)$(libdir)/pkgconfig/openssl.pc
	-$(RMDIR) $(DESTDIR)$(libdir)/pkgconfig
	-$(RMDIR) $(DESTDIR)$(libdir)

_install_modules_deps: install_runtime_libs build_modules

install_engines: _install_modules_deps
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(ENGINESDIR)/
	@$(ECHO) "*** Installing engines"
	@set -e; for e in dummy $(INSTALL_ENGINES); do \
		if [ "$$e" = "dummy" ]; then continue; fi; \
		fn=`basename $$e`; \
		$(ECHO) "install $$e -> $(DESTDIR)$(ENGINESDIR)/$$fn"; \
		cp $$e $(DESTDIR)$(ENGINESDIR)/$$fn.new; \
		chmod 755 $(DESTDIR)$(ENGINESDIR)/$$fn.new; \
		mv -f $(DESTDIR)$(ENGINESDIR)/$$fn.new \
		      $(DESTDIR)$(ENGINESDIR)/$$fn; \
	done

uninstall_engines:
	@$(ECHO) "*** Uninstalling engines"
	@set -e; for e in dummy $(INSTALL_ENGINES); do \
		if [ "$$e" = "dummy" ]; then continue; fi; \
		fn=`basename $$e`; \
		$(ECHO) "$(RM) $(DESTDIR)$(ENGINESDIR)/$$fn"; \
		$(RM) $(DESTDIR)$(ENGINESDIR)/$$fn; \
	done
	-$(RMDIR) $(DESTDIR)$(ENGINESDIR)

install_modules: _install_modules_deps
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MODULESDIR)/
	@$(ECHO) "*** Installing modules"
	@set -e; for e in dummy $(INSTALL_MODULES); do \
		if [ "$$e" = "dummy" ]; then continue; fi; \
		fn=`basename $$e`; \
		$(ECHO) "install $$e -> $(DESTDIR)$(MODULESDIR)/$$fn"; \
		cp $$e $(DESTDIR)$(MODULESDIR)/$$fn.new; \
		chmod 755 $(DESTDIR)$(MODULESDIR)/$$fn.new; \
		mv -f $(DESTDIR)$(MODULESDIR)/$$fn.new \
		      $(DESTDIR)$(MODULESDIR)/$$fn; \
	done

uninstall_modules:
	@$(ECHO) "*** Uninstalling modules"
	@set -e; for e in dummy $(INSTALL_MODULES); do \
		if [ "$$e" = "dummy" ]; then continue; fi; \
		fn=`basename $$e`; \
		$(ECHO) "$(RM) $(DESTDIR)$(MODULESDIR)/$$fn"; \
		$(RM) $(DESTDIR)$(MODULESDIR)/$$fn; \
	done
	-$(RMDIR) $(DESTDIR)$(MODULESDIR)

install_runtime: install_programs

install_runtime_libs: build_libs
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@ : {- output_off() if windowsdll(); "" -}
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(libdir)
	@ : {- output_on() if windowsdll(); output_off() unless windowsdll(); "" -}
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/bin
	@ : {- output_on() unless windowsdll(); "" -}
	@$(ECHO) "*** Installing runtime libraries"
	@set -e; for s in dummy $(INSTALL_SHLIBS); do \
		if [ "$$s" = "dummy" ]; then continue; fi; \
		fn=`basename $$s`; \
		: {- output_off() unless windowsdll(); "" -}; \
		$(ECHO) "install $$s -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		cp $$s $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		chmod 755 $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		mv -f $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new \
		      $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
		: {- output_on() unless windowsdll(); "" -}{- output_off() if windowsdll(); "" -}; \
		$(ECHO) "install $$s -> $(DESTDIR)$(libdir)/$$fn"; \
		cp $$s $(DESTDIR)$(libdir)/$$fn.new; \
		chmod 755 $(DESTDIR)$(libdir)/$$fn.new; \
		mv -f $(DESTDIR)$(libdir)/$$fn.new \
		      $(DESTDIR)$(libdir)/$$fn; \
		: {- output_on() if windowsdll(); "" -}; \
	done

install_programs: install_runtime_libs build_programs
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/bin
	@$(ECHO) "*** Installing runtime programs"
	@set -e; for x in dummy $(INSTALL_PROGRAMS); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		cp $$x $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		chmod 755 $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		mv -f $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new \
		      $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
	done
	@set -e; for x in dummy $(BIN_SCRIPTS); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		cp $$x $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		chmod 755 $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		mv -f $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new \
		      $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
	done

uninstall_runtime: uninstall_programs uninstall_runtime_libs

uninstall_programs:
	@$(ECHO) "*** Uninstalling runtime programs"
	@set -e; for x in dummy $(INSTALL_PROGRAMS); \
	do  \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
	done;
	@set -e; for x in dummy $(BIN_SCRIPTS); \
	do  \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
	done
	-$(RMDIR) $(DESTDIR)$(INSTALLTOP)/bin

uninstall_runtime_libs:
	@$(ECHO) "*** Uninstalling runtime libraries"
	@ : {- output_off() unless windowsdll(); "" -}
	@set -e; for s in dummy $(INSTALL_SHLIBS); do \
		if [ "$$s" = "dummy" ]; then continue; fi; \
		fn=`basename $$s`; \
		$(ECHO) "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
	done
	@ : {- output_on() unless windowsdll(); "" -}


install_man_docs: build_man_docs
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man1
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man3
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man5
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man7
	@$(ECHO) "*** Installing manpages"
	@set -e; for x in dummy $(MANDOCS1); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX)"; \
		cp $$x $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX); \
		chmod 644 $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX); \
		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man1 $(BLDDIR)/doc/man1 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man1; \
	done
	@set -e; for x in dummy $(MANDOCS3); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX)"; \
		cp $$x $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX); \
		chmod 644 $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX); \
		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man3 $(BLDDIR)/doc/man3 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man3; \
	done
	@set -e; for x in dummy $(MANDOCS5); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX)"; \
		cp $$x $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX); \
		chmod 644 $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX); \
		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man5 $(BLDDIR)/doc/man5 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man5; \
	done
	@set -e; for x in dummy $(MANDOCS7); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX)"; \
		cp $$x $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX); \
		chmod 644 $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX); \
		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man7 $(BLDDIR)/doc/man7 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man7; \
	done

uninstall_man_docs: build_man_docs
	@$(ECHO) "*** Uninstalling manpages"
	@set -e; for x in dummy $(MANDOCS1); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX)"; \
		$(RM) $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX); \
		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man1 $(BLDDIR)/doc/man1 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man1; \
	done
	@set -e; for x in dummy $(MANDOCS3); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX)"; \
		$(RM) $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX); \
		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man3 $(BLDDIR)/doc/man3 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man3; \
	done
	@set -e; for x in dummy $(MANDOCS5); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX)"; \
		$(RM) $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX); \
		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man5 $(BLDDIR)/doc/man5 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man5; \
	done
	@set -e; for x in dummy $(MANDOCS7); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX)"; \
		$(RM) $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX); \
		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man7 $(BLDDIR)/doc/man7 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man7; \
	done

install_html_docs: install_image_docs build_html_docs
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man1
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man3
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man5
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man7
	@$(ECHO) "*** Installing HTML manpages"
	@set -e; for x in dummy $(HTMLDOCS1); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man1/$$fn"; \
		cp $$x $(DESTDIR)$(HTMLDIR)/man1/$$fn; \
		chmod 644 $(DESTDIR)$(HTMLDIR)/man1/$$fn; \
	done
	@set -e; for x in dummy $(HTMLDOCS3); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man3/$$fn"; \
		cp $$x $(DESTDIR)$(HTMLDIR)/man3/$$fn; \
		chmod 644 $(DESTDIR)$(HTMLDIR)/man3/$$fn; \
	done
	@set -e; for x in dummy $(HTMLDOCS5); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man5/$$fn"; \
		cp $$x $(DESTDIR)$(HTMLDIR)/man5/$$fn; \
		chmod 644 $(DESTDIR)$(HTMLDIR)/man5/$$fn; \
	done
	@set -e; for x in dummy $(HTMLDOCS7); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man7/$$fn"; \
		cp $$x $(DESTDIR)$(HTMLDIR)/man7/$$fn; \
		chmod 644 $(DESTDIR)$(HTMLDIR)/man7/$$fn; \
	done

uninstall_html_docs: uninstall_image_docs
	@$(ECHO) "*** Uninstalling HTML manpages"
	@set -e; for x in dummy $(HTMLDOCS1); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man1/$$fn"; \
		$(RM) $(DESTDIR)$(HTMLDIR)/man1/$$fn; \
	done
	@set -e; for x in dummy $(HTMLDOCS3); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man3/$$fn"; \
		$(RM) $(DESTDIR)$(HTMLDIR)/man3/$$fn; \
	done
	@set -e; for x in dummy $(HTMLDOCS5); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man5/$$fn"; \
		$(RM) $(DESTDIR)$(HTMLDIR)/man5/$$fn; \
	done
	@set -e; for x in dummy $(HTMLDOCS7); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man7/$$fn"; \
		$(RM) $(DESTDIR)$(HTMLDIR)/man7/$$fn; \
	done

install_image_docs:
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man7/img
	@set -e; for x in dummy $(IMAGEDOCS7); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man7/img/$$fn"; \
		cp $(SRCDIR)/$$x $(DESTDIR)$(HTMLDIR)/man7/img/$$fn; \
		chmod 644 $(DESTDIR)$(HTMLDIR)/man7/img/$$fn; \
	done

uninstall_image_docs:
	@set -e; for x in dummy $(IMAGEDOCS7); do \
		if [ "$$x" = "dummy" ]; then continue; fi; \
		fn=`basename $$x`; \
		$(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man7/img/$$fn"; \
		$(RM) $(DESTDIR)$(HTMLDIR)/man7/img/$$fn; \
	done

# Developer targets (note: these are only available on Unix) #########

# It's important that generate_buildinfo comes after ordinals, as ordinals
# is sensitive to build.info changes.
update: generate errors ordinals generate_buildinfo

generate: generate_apps generate_crypto_bn generate_crypto_objects \
          generate_crypto_conf generate_crypto_asn1 generate_fuzz_oids

generate_buildinfo: generate_doc_buildinfo

.PHONY: doc-nits md-nits
doc-nits: build_generated_pods
	$(PERL) $(SRCDIR)/util/find-doc-nits -c -n -l -e

# This uses "mdl", the markdownlint application, which is written in ruby.
# The source is at https://github.com/markdownlint/markdownlint
# If you have ruby installed, "gem install mdl" should work.
# Another option is at https://snapcraft.io/install/mdl/debian
# Finally, there's a Node.js version, which we haven't tried, that
# can be found at https://github.com/DavidAnson/markdownlint
md-nits:
	mdl -s util/markdownlint.rb .

# Test coverage is a good idea for the future
#coverage: $(PROGRAMS) $(TESTPROGRAMS)
#	...

lint:
	lint -DLINT $(INCLUDES) $(SRCS)

generate_apps:
	( cd $(SRCDIR); $(PERL) VMS/VMSify-conf.pl \
				< apps/openssl.cnf > apps/openssl-vms.cnf )

generate_crypto_bn:
	( cd $(SRCDIR); $(PERL) crypto/bn/bn_prime.pl > crypto/bn/bn_prime.h )

generate_crypto_objects:
	( cd $(SRCDIR); $(PERL) crypto/objects/objects.pl -n \
				crypto/objects/objects.txt \
				crypto/objects/obj_mac.num \
				> crypto/objects/obj_mac.new && \
	    mv crypto/objects/obj_mac.new crypto/objects/obj_mac.num )
	( cd $(SRCDIR); $(PERL) crypto/objects/objects.pl \
				crypto/objects/objects.txt \
				crypto/objects/obj_mac.num \
				> include/openssl/obj_mac.h )
	( cd $(SRCDIR); $(PERL) crypto/objects/obj_dat.pl \
				include/openssl/obj_mac.h \
				> crypto/objects/obj_dat.h )
	( cd $(SRCDIR); $(PERL) crypto/objects/objxref.pl \
				crypto/objects/obj_mac.num \
				crypto/objects/obj_xref.txt \
				> crypto/objects/obj_xref.h )
	( cd $(SRCDIR);	sed -e '1,8d' crypto/objects/obj_compat.h >> include/openssl/obj_mac.h )

generate_crypto_conf:
	( cd $(SRCDIR); $(PERL) crypto/conf/keysets.pl \
			        > crypto/conf/conf_def.h )

generate_crypto_asn1:
	( cd $(SRCDIR); $(PERL) crypto/asn1/charmap.pl \
			        > crypto/asn1/charmap.h )

generate_fuzz_oids:
	( cd $(SRCDIR); $(PERL) fuzz/mkfuzzoids.pl \
				crypto/objects/obj_dat.h \
				> fuzz/oids.txt )

generate_doc_buildinfo:
	( $(PERL) -I$(BLDDIR) -Mconfigdata \
                $(SRCDIR)/util/dofile.pl -o Makefile \
                        $(SRCDIR)/doc/build.info.in \
                        > $(SRCDIR)/doc/build.info.new; \
          if ( test -e $(SRCDIR)/doc/build.info \
               && cmp $(SRCDIR)/doc/build.info.new $(SRCDIR)/doc/build.info \
                  > /dev/null ); \
          then \
                rm $(SRCDIR)/doc/build.info.new; \
          else \
                mv $(SRCDIR)/doc/build.info.new $(SRCDIR)/doc/build.info; \
          fi )

generate_fips_sources: providers/fips.module.sources.new
providers/fips.module.sources.new: configdata.pm
	rm -rf sources-tmp
	mkdir sources-tmp
	( \
	  srcdir=`cd $(SRCDIR); pwd`; \
	  cd sources-tmp \
	  && $$srcdir/Configure --banner=Configured enable-fips -O0 \
	  && ./configdata.pm --query 'get_sources("providers/fips")' > sources1 \
	  && $(MAKE) -sj 4 build_generated providers/fips.so \
	  && find . -name '*.d' | xargs cat > dep1 \
          && $(MAKE) distclean \
	  && $$srcdir/Configure --banner=Configured enable-fips no-asm -O0 \
	  && ./configdata.pm --query 'get_sources("providers/fips")' > sources2 \
	  && $(MAKE) -sj 4 build_generated providers/fips.so \
	  && find . -name '*.d' | xargs cat > dep2 \
	  && cat sources1 sources2 \
	     | grep -v ' : \\$$' | grep -v util/providers.num \
	     | sed -e 's/^ *//' -e 's/ *\\$$//' \
	     | sort | uniq > sources \
	  && cat dep1 dep2 \
	     | $(PERL) -p -e 's/\\\n//' \
	     | sed -e 's/^.*: *//' -e 's/  */ /g' \
	     | fgrep -f sources \
	     | tr ' ' '\n' \
	     | sort | uniq > deps.raw \
	  && cat deps.raw \
	     | xargs ./configdata.pm --query 'get_sources(@ARGV)' \
	     | $(PERL) -p -e 's/\\\n//' \
	     | sed -e 's/\./\\\./g' -e 's/ : */:/' -e 's/^/s:/' -e 's/$$/:/' \
	     > deps.sed \
	  && cat deps.raw | sed -f deps.sed > deps \
	)
	( \
	  cat sources-tmp/sources sources-tmp/deps \
	     | $(PERL) -p -e 's:^ *\Q../\E:: ;' \
			  -e 's:^\Q$(SRCDIR)/\E:: if "$(SRCDIR)" ne "." ;' \
			  -e 'my $$x; do { $$x = $$_; s:(^|/)((?!\Q../\E)[^/]*/)\Q..\E($$|/):$$1: } while ($$x ne $$_) ;' ; \
	  cd $(SRCDIR); \
	  for x in crypto/bn/asm/*.pl crypto/bn/asm/*.S \
		   crypto/aes/asm/*.pl crypto/aes/asm/*.S \
		   crypto/ec/asm/*.pl \
		   crypto/modes/asm/*.pl \
		   crypto/sha/asm/*.pl \
		   crypto/x86_64cpuid.pl; do \
	    echo "$$x"; \
	  done \
	) | sort | uniq > providers/fips.module.sources.new
	rm -rf sources-tmp

# Set to -force to force a rebuild
ERROR_REBUILD=
errors:
	( b=`pwd`; set -e; cd $(SRCDIR); \
          $(PERL) util/ck_errf.pl -strict -internal; \
          $(PERL) -I$$b util/mkerr.pl $(ERROR_REBUILD) -internal )
	( b=`pwd`; set -e; cd $(SRCDIR)/engines; \
          for E in *.ec ; do \
              $(PERL) ../util/ck_errf.pl -strict \
                -conf $$E `basename $$E .ec`.c; \
              $(PERL) -I$$b ../util/mkerr.pl $(ERROR_REBUILD) -static \
                -conf $$E `basename $$E .ec`.c ; \
          done )

{- use File::Basename;

   my @sslheaders_tmpl =
       qw( include/openssl/ssl.h
           include/openssl/ssl2.h
           include/openssl/ssl3.h
           include/openssl/sslerr.h
           include/openssl/tls1.h
           include/openssl/dtls1.h
           include/openssl/srtp.h
           include/openssl/sslerr_legacy.h );
   my @cryptoheaders_tmpl =
       qw( include/internal/dso.h
           include/internal/o_dir.h
           include/internal/err.h
           include/internal/evp.h
           include/internal/pem.h
           include/internal/asn1.h
           include/internal/sslconf.h );
   my @cryptoskipheaders = ( @sslheaders_tmpl,
       qw( include/openssl/conf_api.h
           include/openssl/ebcdic.h
           include/openssl/opensslconf.h
           include/openssl/symhacks.h ) );
   our %cryptoheaders = ();
   our %sslheaders = ();
   foreach my $d ( qw( include/openssl include/internal ) ) {
       my @header_patterns =
           map { catfile($config{sourcedir}, $d, $_) } ( '*.h', '*.h.in' );
       foreach my $f ( map { glob($_) } @header_patterns ) {
           my $base = basename($f);
           my $base_in = basename($f, '.in');
           my $dir = catfile($config{sourcedir}, $d);
           if ($base ne $base_in) {
               # We have a .h.in file, which means the header file is in the
               # build tree.
               $base = $base_in;
               $dir = catfile($config{builddir}, $d);
           }
           my $new_f = catfile($dir, $base);
           my $fn = "$d/$base";
           # The logic to add files to @cryptoheaders is a bit complex.  The
           # file to be added must be either in the public header directory
           # or one of the pre-declared internal headers, and must under no
           # circumstances be one of those that must be skipped.
           $cryptoheaders{$new_f} = 1
               if (($d eq 'include/openssl'
                    || ( grep { $_ eq $fn } @cryptoheaders_tmpl ))
                   && !( grep { $_ eq $fn } @cryptoskipheaders ));
           # The logic to add files to @sslheaders is much simpler...
           $sslheaders{$new_f} = 1 if grep { $_ eq $fn } @sslheaders_tmpl;
       }
   }
   "";
-}
CRYPTOHEADERS={- join(" \\\n" . ' ' x 14,
                      fill_lines(" ", $COLUMNS - 14, sort keys %cryptoheaders)) -}
SSLHEADERS={- join(" \\\n" . ' ' x 11,
                   fill_lines(" ", $COLUMNS - 11, sort keys %sslheaders)) -}

renumber: build_generated
	$(PERL) $(SRCDIR)/util/mknum.pl --version $(VERSION_NUMBER) --no-warnings \
                --ordinals $(SRCDIR)/util/libcrypto.num \
                --symhacks $(SRCDIR)/include/openssl/symhacks.h \
                --renumber \
                $(CRYPTOHEADERS)
	$(PERL) $(SRCDIR)/util/mknum.pl --version $(VERSION_NUMBER) --no-warnings \
                --ordinals $(SRCDIR)/util/libssl.num \
                --symhacks $(SRCDIR)/include/openssl/symhacks.h \
                --renumber \
                $(SSLHEADERS)

ordinals: build_generated
	$(PERL) $(SRCDIR)/util/mknum.pl --version $(VERSION_NUMBER) --no-warnings \
                --ordinals $(SRCDIR)/util/libcrypto.num \
                --symhacks $(SRCDIR)/include/openssl/symhacks.h \
                $(CRYPTOHEADERS)
	$(PERL) $(SRCDIR)/util/mknum.pl --version $(VERSION_NUMBER) --no-warnings \
                --ordinals $(SRCDIR)/util/libssl.num \
                --symhacks $(SRCDIR)/include/openssl/symhacks.h \
                $(SSLHEADERS)

test_ordinals:
	$(MAKE) run_tests TESTS=test_ordinals

tags TAGS: FORCE
	rm -f TAGS tags
	-ctags -R .
	-etags `find . -name '*.[ch]' -o -name '*.pm'`

providers/fips.checksum.new: providers/fips.module.sources.new
	@which unifdef > /dev/null || \
	( echo >&2 "ERROR: unifdef not in your \$$PATH, FIPS checksums not calculated"; \
	  false )
	( sources=`pwd`/providers/fips.module.sources.new; \
	  cd $(SRCDIR) \
	  && cat $$sources \
	         | xargs ./util/fips-checksums.sh ) \
	         > providers/fips-sources.checksums.new \
	&& sha256sum providers/fips-sources.checksums.new \
	     | sed -e 's|\.new||' > providers/fips.checksum.new

fips-checksums: providers/fips.checksum.new

$(SRCDIR)/providers/fips.checksum: providers/fips.checksum.new
	cp -p providers/fips.module.sources.new $(SRCDIR)/providers/fips.module.sources
	cp -p providers/fips-sources.checksums.new $(SRCDIR)/providers/fips-sources.checksums
	cp -p providers/fips.checksum.new $(SRCDIR)/providers/fips.checksum

update-fips-checksums: $(SRCDIR)/providers/fips.checksum

diff-fips-checksums: fips-checksums
	diff -u $(SRCDIR)/providers/fips.module.sources providers/fips.module.sources.new
	diff -u $(SRCDIR)/providers/fips-sources.checksums providers/fips-sources.checksums.new
	diff -u $(SRCDIR)/providers/fips.checksum providers/fips.checksum.new

# Release targets (note: only available on Unix) #####################

tar:
	(cd $(SRCDIR); ./util/mktar.sh --name='$(NAME)' --tarfile='$(TARFILE)')

# Helper targets #####################################################

link-utils: $(BLDDIR)/util/opensslwrap.sh $(BLDDIR)/apps/openssl.cnf

$(BLDDIR)/util/opensslwrap.sh: configdata.pm
	@if [ "$(SRCDIR)" != "$(BLDDIR)" ]; then \
	    mkdir -p "$(BLDDIR)/util"; \
	    ln -sf "../$(SRCDIR)/util/`basename "$@"`" "$(BLDDIR)/util"; \
	fi

$(BLDDIR)/apps/openssl.cnf: configdata.pm
	@if [ "$(SRCDIR)" != "$(BLDDIR)" ]; then \
	    mkdir -p "$(BLDDIR)/apps"; \
	    ln -sf "../$(SRCDIR)/apps/`basename "$@"`" "$(BLDDIR)/apps"; \
	fi

FORCE:

# Building targets ###################################################

libcrypto.pc libssl.pc openssl.pc: configdata.pm $(LIBS) {- join(" ",map { platform->sharedlib_simple($_) // platform->sharedlib_import($_) // platform->sharedlib($_) // () } @{$unified_info{libraries}}) -}
libcrypto.pc:
	@ ( echo 'prefix=$(INSTALLTOP)'; \
	    echo 'exec_prefix=$${prefix}'; \
	    if [ -n "$(LIBDIR)" ]; then \
	        echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
	    else \
	        echo 'libdir=$(libdir)'; \
	    fi; \
	    echo 'includedir=$${prefix}/include'; \
	    echo 'enginesdir=$${libdir}/engines-{- $sover_dirname -}'; \
	    echo 'modulesdir=$${libdir}/ossl-modules'; \
	    echo ''; \
	    echo 'Name: OpenSSL-libcrypto'; \
	    echo 'Description: OpenSSL cryptography library'; \
	    echo 'Version: '$(VERSION); \
	    echo 'Libs: -L$${libdir} -lcrypto'; \
	    echo 'Libs.private: $(LIB_EX_LIBS)'; \
	    echo 'Cflags: -I$${includedir}' ) > libcrypto.pc

libssl.pc:
	@ ( echo 'prefix=$(INSTALLTOP)'; \
	    echo 'exec_prefix=$${prefix}'; \
	    if [ -n "$(LIBDIR)" ]; then \
	        echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
	    else \
	        echo 'libdir=$(libdir)'; \
	    fi; \
	    echo 'includedir=$${prefix}/include'; \
	    echo ''; \
	    echo 'Name: OpenSSL-libssl'; \
	    echo 'Description: Secure Sockets Layer and cryptography libraries'; \
	    echo 'Version: '$(VERSION); \
	    echo 'Requires.private: libcrypto'; \
	    echo 'Libs: -L$${libdir} -lssl'; \
	    echo 'Cflags: -I$${includedir}' ) > libssl.pc

openssl.pc:
	@ ( echo 'prefix=$(INSTALLTOP)'; \
	    echo 'exec_prefix=$${prefix}'; \
	    if [ -n "$(LIBDIR)" ]; then \
	        echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
	    else \
	        echo 'libdir=$(libdir)'; \
	    fi; \
	    echo 'includedir=$${prefix}/include'; \
	    echo ''; \
	    echo 'Name: OpenSSL'; \
	    echo 'Description: Secure Sockets Layer and cryptography libraries and tools'; \
	    echo 'Version: '$(VERSION); \
	    echo 'Requires: libssl libcrypto' ) > openssl.pc

configdata.pm: $(SRCDIR)/Configure $(SRCDIR)/config \
               {- join(" \\\n" . ' ' x 15,
                       fill_lines(" ", $COLUMNS - 15,
                                  @{$config{build_file_templates}},
                                  @{$config{build_infos}},
                                  @{$config{conf_files}})) -}
	@echo "Detected changed: $?"
	$(PERL) configdata.pm -r
	@echo "**************************************************"
	@echo "***                                            ***"
	@echo "***   Please run the same make command again   ***"
	@echo "***                                            ***"
	@echo "**************************************************"
	@false

reconfigure reconf:
	$(PERL) configdata.pm -r

{-
  use File::Basename;
  use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;

  # Helper function to convert dependencies in platform agnostic form to
  # dependencies in platform form.
  sub compute_platform_depends {
      map { my $x = $_;

            grep { $x eq $_ } @{$unified_info{programs}} and platform->bin($x)
            or grep { $x eq $_ } @{$unified_info{modules}} and platform->dso($x)
            or grep { $x eq $_ } @{$unified_info{libraries}} and platform->lib($x)
            or platform->convertext($x); } @_;
  }

  # 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 {
      # Depending on shared libraries:
      # On Windows POSIX layers, we depend on {libname}.dll.a
      # On Unix platforms, we depend on {shlibname}.so
      return map { platform->sharedlib_simple($_)
                   // platform->sharedlib_import($_)
                   // platform->sharedlib($_)
                   // platform->staticlib($_)
                 } @_;
  }

  sub generatetarget {
      my %args = @_;
      my $deps = join(" ", compute_platform_depends(@{$args{deps}}));
      return <<"EOF";
$args{target}: $deps
EOF
  }

  sub generatesrc {
      my %args = @_;
      my $gen0 = $args{generator}->[0];
      my $gen_args = join('', map { " $_" }
                              @{$args{generator}}[1..$#{$args{generator}}]);
      my $gen_incs = join("", map { " -I".$_ } @{$args{generator_incs}});
      my $incs = join("", map { " -I".$_ } @{$args{incs}});
      my $defs = join("", map { " -D".$_ } @{$args{defs}});
      my $deps = join(" ", compute_platform_depends(@{$args{generator_deps}},
                                                    @{$args{deps}}));

      if ($args{src} =~ /\.html$/) {
          #
          # HTML generator
          #
          my $title = basename($args{src}, ".html");
          my $pod = $gen0;
          return <<"EOF";
$args{src}: $pod
	\$(PERL) \$(SRCDIR)/util/mkpod2html.pl -i "$pod" -o \$\@ -t "$title" -r "\$(SRCDIR)/doc"
EOF
      } elsif ($args{src} =~ /\.(\d)$/) {
          #
          # Man-page generator
          #
          my $section = $1;
          my $name = uc basename($args{src}, ".$section");
          my $pod = $gen0;
          return <<"EOF";
$args{src}: $pod
	pod2man --name=$name --section=$section\$(MANSUFFIX) --center=OpenSSL \\
		--release=\$(VERSION) $pod >\$\@
EOF
      } elsif (platform->isdef($args{src})) {
          #
          # Linker script-ish generator
          #
          my $target = platform->def($args{src});
          (my $mkdef_os = $target{shared_target}) =~ s|-shared$||;
          my $ord_ver = $args{intent} eq 'lib' ? ' --version $(VERSION_NUMBER)' : '';
          my $ord_name = $args{generator}->[1] || $args{product};
          return <<"EOF";
$target: $gen0 $deps \$(SRCDIR)/util/mkdef.pl
	\$(PERL) \$(SRCDIR)/util/mkdef.pl$ord_ver --ordinals $gen0  --name $ord_name --OS $mkdef_os > $target
EOF
      } elsif (platform->isasm($args{src})) {
          #
          # Assembler generator
          #
          my $cppflags = {
              shlib => '$(LIB_CFLAGS) $(LIB_CPPFLAGS)',
              lib => '$(LIB_CFLAGS) $(LIB_CPPFLAGS)',
              dso => '$(DSO_CFLAGS) $(DSO_CPPFLAGS)',
              bin => '$(BIN_CFLAGS) $(BIN_CPPFLAGS)'
          } -> {$args{intent}};

          my $generator;
          if ($gen0 =~ /\.pl$/) {
              $generator = 'CC="$(CC)" $(PERL)'.$gen_incs.' '.$gen0.$gen_args
                  .' "$(PERLASM_SCHEME)"'.$incs.' '.$cppflags.$defs.' $(PROCESSOR)';
          } elsif ($gen0 =~ /\.m4$/) {
              $generator = 'm4 -B 8192'.$gen_incs.' '.$gen0.$gen_args.' >'
          } elsif ($gen0 =~ /\.S$/) {
              $generator = undef;
          } else {
              die "Generator type for $args{src} unknown: $gen0\n";
          }

          if (defined($generator)) {
              return <<"EOF";
$args{src}: $gen0 $deps
	$generator \$@
EOF
          }
          return <<"EOF";
$args{src}: $gen0 $deps
	\$(CC) $incs $cppflags $defs -E $gen0 | \\
	\$(PERL) -ne '/^#(line)?\\s*[0-9]+/ or print' > \$@
EOF
      } elsif ($gen0 =~ m|^.*\.in$|) {
          #
          # "dofile" generator (file.in -> file)
          #
          my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
                                               "util", "dofile.pl")),
                               rel2abs($config{builddir}));
          my @perlmodules = ( 'configdata.pm',
                              grep { $_ =~ m|\.pm$| } @{$args{deps}} );
          my %perlmoduleincs = map { '"-I'.dirname($_).'"' => 1 } @perlmodules;
          $deps = join(' ', $deps, compute_platform_depends(@perlmodules));
          @perlmodules = map { "-M".basename($_, '.pm') } @perlmodules;
          my $perlmodules = join(' ', '', sort keys %perlmoduleincs, @perlmodules);
          return <<"EOF";
$args{src}: $gen0 $deps
	\$(PERL)$perlmodules "$dofile" "-o$target{build_file}" $gen0$gen_args > \$@
EOF
      } elsif (grep { $_ eq $gen0 } @{$unified_info{programs}}) {
          #
          # Generic generator using OpenSSL programs
          #

          # Redo $gen0, to ensure that we have the proper extension where
          # necessary.
          $gen0 = platform->bin($gen0);
          # Use $(PERL) to execute wrap.pl directly to avoid calling env
          return <<"EOF";
$args{src}: $gen0 $deps \$(BLDDIR)/util/wrap.pl
	\$(PERL) \$(BLDDIR)/util/wrap.pl $gen0$gen_args > \$@
EOF
      } else {
          #
          # Generic generator using Perl
          #
          return <<"EOF";
$args{src}: $gen0 $deps
	\$(PERL)$gen_incs $gen0$gen_args > \$@
EOF
      }
  }

  # Should one wonder about the end of the Perl snippet, it's because this
  # second regexp eats up line endings as well, if the removed path is the
  # last in the line.  We may therefore need to put back a line ending.
  sub src2obj {
      my %args = @_;
      my $obj = platform->convertext($args{obj});
      my $dep = platform->dep($args{obj});
      my @srcs = @{$args{srcs}};
      my $srcs = join(" ",  @srcs);
      my $deps = join(" ", @srcs, @{$args{deps}});
      my $incs = join("", map { " -I".$_ } @{$args{incs}});
      my $defs = join("", map { " -D".$_ } @{$args{defs}});
      my $cmd;
      my $cmdflags;
      my $cmdcompile;
      if (grep /\.rc$/, @srcs) {
          $cmd = '$(RC)';
          $cmdflags = '$(RCFLAGS)';
          $cmdcompile = '';
      } elsif (grep /\.(cc|cpp)$/, @srcs) {
          $cmd = '$(CXX)';
          $cmdcompile = ' -c';
          $cmdflags = {
              shlib => '$(LIB_CXXFLAGS) $(LIB_CPPFLAGS)',
              lib => '$(LIB_CXXFLAGS) $(LIB_CPPFLAGS)',
              dso => '$(DSO_CXXFLAGS) $(DSO_CPPFLAGS)',
              bin => '$(BIN_CXXFLAGS) $(BIN_CPPFLAGS)'
          } -> {$args{intent}};
      } else {
          $cmd = '$(CC)';
          $cmdcompile = ' -c';
          $cmdflags = {
              shlib => '$(LIB_CFLAGS) $(LIB_CPPFLAGS)',
              lib => '$(LIB_CFLAGS) $(LIB_CPPFLAGS)',
              dso => '$(DSO_CFLAGS) $(DSO_CPPFLAGS)',
              bin => '$(BIN_CFLAGS) $(BIN_CPPFLAGS)'
          } -> {$args{intent}};
      }
      my $recipe;
      # extension-specific rules
      if (grep /\.s$/, @srcs) {
          $recipe .= <<"EOF";
$obj: $deps
	$cmd $cmdflags -c -o \$\@ $srcs
EOF
      } elsif (grep /\.S$/, @srcs) {
          # Originally there was multi-step rule with $(CC) -E file.S
          # followed by $(CC) -c file.s. It compensated for one of
          # legacy platform compiler's inability to handle .S files.
          # The platform is long discontinued by vendor so there is
          # hardly a point to drag it along...
          $recipe .= <<"EOF";
$obj: $deps
	$cmd $incs $defs $cmdflags -c -o \$\@ $srcs
EOF
      } elsif ($makedep_scheme eq 'gcc' && !grep /\.rc$/, @srcs) {
          $recipe .= <<"EOF";
$obj: $deps
	$cmd $incs $defs $cmdflags -MMD -MF $dep.tmp -MT \$\@ -c -o \$\@ $srcs
	\@touch $dep.tmp
	\@if cmp $dep.tmp $dep > /dev/null 2> /dev/null; then \\
		rm -f $dep.tmp; \\
	else \\
		mv $dep.tmp $dep; \\
	fi
EOF
      } else {
          $recipe .= <<"EOF";
$obj: $deps
	$cmd $incs $defs $cmdflags $cmdcompile -o \$\@ $srcs
EOF
          if ($makedep_scheme eq 'makedepend') {
              $recipe .= <<"EOF";
	\$(MAKEDEPEND) -f- -Y -- $incs $cmdflags -- $srcs 2>/dev/null \\
	    > $dep
EOF
          }
      }
      return $recipe;
  }
  # We *know* this routine is only called when we've configure 'shared'.
  sub obj2shlib {
      my %args = @_;
      my @linkdirs = ();
      my @linklibs = ();
      foreach (@{$args{deps}}) {
          if (platform->isstaticlib($_)) {
              push @linklibs, platform->convertext($_);
          } else {
              my $d = "-L" . dirname($_);
              my $l = basename($_);
              $l =~ s/^lib//;
              $l = "-l" . $l;
              push @linklibs, $l;
              push @linkdirs, $d unless grep { $d eq $_ } @linkdirs;
          }
      }
      my $linkflags = join("", map { $_." " } @linkdirs);
      my $linklibs = join("", map { $_." " } @linklibs);
      my @objs = map { platform->convertext($_) }
                 grep { !platform->isdef($_) }
                 @{$args{objs}};
      my @defs = map { platform->def($_) }
                 grep { platform->isdef($_) }
                 @{$args{objs}};
      my @deps = compute_lib_depends(@{$args{deps}});
      die "More than one exported symbol map" if scalar @defs > 1;

      my $full = platform->sharedlib($args{lib});
      # $import is for Windows and subsystems thereof, where static import
      # libraries for DLLs are a thing.  On platforms that have this mechanism,
      # $import has the name of this import library.  On platforms that don't
      # have this mechanism, $import will be |undef|.
      my $import = platform->sharedlib_import($args{lib});
      # $simple is for platforms where full shared library names include the
      # shared library version, and there's a simpler name that doesn't include
      # that version.  On such platforms, $simple has the simpler name.  On
      # other platforms, it will be |undef|.
      my $simple = platform->sharedlib_simple($args{lib});

      my $argfile = defined $target{shared_argfileflag} ? $full.".args" : undef;
      my $shared_soname = "";
      $shared_soname .= ' '.$target{shared_sonameflag}.basename($full)
          if defined $target{shared_sonameflag};
      my $shared_imp = "";
      $shared_imp .= ' '.$target{shared_impflag}.basename($import)
          if defined $target{shared_impflag} && defined $import;
      my $shared_def = join("", map { ' '.$target{shared_defflag}.$_ } @defs);

      # There is at least one platform where the compiler-as-linker needs to
      # have one object file directly on the command line.  That won't hurt
      # any other platform, so we do that for everyone when there's an argfile
      # to be had.  This depends heavily on splice, which removes elements from
      # the given array, and returns them so they can be captured.
      my @argfileobjs = $argfile
          ? splice(@objs, 1)
          : ();
      my $argfilecmds = $argfile
          ? join("\n\t", map { "echo $_ >> $argfile" } @argfileobjs)
          : undef;
      my $argfiledeps = $argfile
          ? join(" \\\n" . ' ' x (length($argfile) + 2),
                 fill_lines(' ', $COLUMNS - length($full) - 2, @argfileobjs))
          : undef;
      my @fulldeps = (@objs, ($argfile ? $argfile : ()), @defs, @deps);
      my @fullobjs = (
          @objs,
          ($argfile ? $target{shared_argfileflag}.$argfile : ())
      );
      my $fulldeps =
          join(" \\\n" . ' ' x (length($full) + 2),
               fill_lines(' ', $COLUMNS - length($full) - 2, @fulldeps));
      my $fullobjs =
          join(" \\\n\t\t", fill_lines(' ', $COLUMNS - 16, @fullobjs));

      my $recipe = '';

      if (defined $simple && $simple ne $full) {
          if (sharedaix()) {
              $recipe .= <<"EOF";
$simple: $full
	rm -f $simple && \\
	\$(AR) r $simple $full
EOF
          } else {
              $recipe .= <<"EOF";
$simple: $full
	rm -f $simple && \\
	ln -s $full $simple
EOF
          }
      }
      if (defined $import) {
      $recipe .= <<"EOF";
$import: $full
EOF
      }
      $recipe .= <<"EOF";
$full: $fulldeps
	\$(CC) \$(LIB_CFLAGS) $linkflags\$(LIB_LDFLAGS)$shared_soname$shared_imp \\
		-o $full$shared_def \\
		$fullobjs \\
		$linklibs \$(LIB_EX_LIBS)
EOF
      if (windowsdll()) {
          $recipe .= <<"EOF";
	rm -f apps/$full
	rm -f fuzz/$full
	cp -p $full apps/
	cp -p $full fuzz/
EOF
          if (!$disabled{tests}) {
            $recipe .= <<"EOF";
	rm -f test/$full
	cp -p $full test/
EOF
          }
      }
      $recipe .= <<"EOF" if defined $argfile;
$argfile: $argfiledeps
	\$(RM) $argfile
	$argfilecmds
EOF
      return $recipe;
  }
  sub obj2dso {
      my %args = @_;
      my $dso = platform->dso($args{module});
      my @linkdirs = ();
      my @linklibs = ();
      foreach (@{$args{deps}}) {
          next unless defined $_;
          if (platform->isstaticlib($_)) {
              push @linklibs, platform->convertext($_);
          } else {
              my $d = "-L" . dirname($_);
              my $l = basename($_);
              $l =~ s/^lib//;
              $l = "-l" . $l;
              push @linklibs, $l;
              push @linkdirs, $d unless grep { $d eq $_ } @linkdirs;
          }
      }
      my $linkflags = join("", map { $_." " } @linkdirs);
      my $linklibs = join("", map { $_." " } @linklibs);
      my @objs = map { platform->convertext($_) }
                 grep { !platform->isdef($_) }
                 @{$args{objs}};
      my @defs = map { platform->def($_) }
                 grep { platform->isdef($_) }
                 @{$args{objs}};
      my @deps = compute_lib_depends(@{$args{deps}});
      my $shared_def = join("", map { ' '.$target{shared_defflag}.$_ } @defs);
      # Next line needs to become "less magic" (see PR #11950)
      $shared_def .= ' '.$target{shared_fipsflag} if (defined $target{shared_fipsflag} && $shared_def =~ m/providers\/fips/);
      my $objs = join(" \\\n\t\t", fill_lines(' ', $COLUMNS - 16, @objs));
      my $deps = join(" \\\n" . ' ' x (length($dso) + 2),
                      fill_lines(' ', $COLUMNS - length($dso) - 2,
                                 @objs, @defs, @deps));

      return <<"EOF";
$dso: $deps
	\$(CC) \$(DSO_CFLAGS) $linkflags\$(DSO_LDFLAGS) \\
		-o $dso$shared_def \\
		$objs \\
		$linklibs\$(DSO_EX_LIBS)
EOF
  }
  sub obj2lib {
      my %args = @_;
      my $lib = platform->staticlib($args{lib});
      my @objs = map { platform->obj($_) } @{$args{objs}};
      my $deps = join(" \\\n" . ' ' x (length($lib) + 2),
                      fill_lines(' ', $COLUMNS - length($lib) - 2, @objs));
      my $max_per_call = 500;
      my @objs_grouped;
      push @objs_grouped, join(" ", splice @objs, 0, $max_per_call) while @objs;
      my $fill_lib =
          join("\n\t", (map { "\$(AR) \$(ARFLAGS) $lib $_" } @objs_grouped));
      return <<"EOF";
$lib: $deps
	\$(RM) $lib
	$fill_lib
	\$(RANLIB) \$\@ || echo Never mind.
EOF
  }
  sub obj2bin {
      my %args = @_;
      my $bin = platform->bin($args{bin});
      my @objs = map { platform->obj($_) } @{$args{objs}};
      my @deps = compute_lib_depends(@{$args{deps}});
      my $objs = join(" \\\n" . ' ' x (length($bin) + 2),
                      fill_lines(' ', $COLUMNS - length($bin) - 2, @objs));
      my @linkdirs = ();
      my @linklibs = ();
      foreach (@{$args{deps}}) {
          next unless defined $_;
          if (platform->isstaticlib($_)) {
              push @linklibs, platform->convertext($_);
          } else {
              my $d = "-L" . dirname($_);
              my $l = basename($_);
              $l =~ s/^lib//;
              $l = "-l" . $l;
              push @linklibs, $l;
              push @linkdirs, $d unless grep { $d eq $_ } @linkdirs;
          }
      }
      my $linkflags = join("", map { $_." " } @linkdirs);
      my $linklibs = join("", map { $_." " } @linklibs);
      my $cmd = '$(CC)';
      my $cmdflags = '$(BIN_CFLAGS)';
      if (grep /_cc\.o$/, @{$args{objs}}) {
          $cmd = '$(CXX)';
          $cmdflags = '$(BIN_CXXFLAGS)';
      }

      my $objs = join(" \\\n\t\t", fill_lines(' ', $COLUMNS - 16, @objs));
      my $deps = join(" \\\n" . ' ' x (length($bin) + 2),
                      fill_lines(' ', $COLUMNS - length($bin) - 2,
                                 @objs, @deps));

      return <<"EOF";
$bin: $deps
	rm -f $bin
	\$\${LDCMD:-$cmd} $cmdflags $linkflags\$(BIN_LDFLAGS) \\
		-o $bin \\
		$objs \\
		$linklibs\$(BIN_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 configdata.pm
	\$(RM) "$script"
	\$(PERL) "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\
	    "-o$target{build_file}" $sources > "$script"
	chmod a+x $script
EOF
  }
  sub generatedir {
      my %args = @_;
      my $dir = $args{dir};
      my @deps = compute_platform_depends(@{$args{deps}});
      my @comments = ();

      # We already have a 'test' target, and the top directory is just plain
      # silly
      return if $dir eq "test" || $dir eq ".";

      foreach my $type (("dso", "lib", "bin", "script")) {
          next unless defined($unified_info{dirinfo}->{$dir}->{products}->{$type});
          # For lib object files, we could update the library.  However, it
          # was decided that it's enough to build the directory local object
          # files, so we don't need to add any actions, and the dependencies
          # are already taken care of.
          if ($type ne "lib") {
              foreach my $prod (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) {
                  if (dirname($prod) eq $dir) {
                      push @deps, compute_platform_depends($prod);
                  } else {
                      push @comments, "# No support to produce $type ".join(", ", @{$unified_info{dirinfo}->{$dir}->{products}->{$type}});
                  }
              }
          }
      }

      my $target = "$dir $dir/";
      my $deps = join(" \\\n\t",
                      fill_lines(' ', $COLUMNS - 8, @deps));
      my $comments = join("\n", "", @comments);
      return <<"EOF";
$target: \\
	$deps$comments
EOF
  }
  ""    # Important!  This becomes part of the template result.
-}
