Home | History | Annotate | Line # | Download | only in Configurations
windows-makefile.tmpl revision 1.1.1.10
      1 ##
      2 ## Makefile for OpenSSL
      3 ##
      4 ## {- join("\n## ", @autowarntext) -}
      5 {-
      6  use File::Basename;
      7  use OpenSSL::Util;
      8 
      9  our $sover_dirname = platform->shlib_version_as_filename();
     10 
     11  my $build_scheme = $target{build_scheme};
     12  my $install_flavour = $build_scheme->[$#$build_scheme]; # last element
     13  my $win_installenv =
     14      $install_flavour eq "VC-WOW" ? "ProgramFiles(x86)"
     15                                   : "ProgramW6432";
     16  my $win_commonenv =
     17      $install_flavour eq "VC-WOW" ? "CommonProgramFiles(x86)"
     18                                   : "CommonProgramW6432";
     19  our $win_installroot =
     20      defined($ENV{$win_installenv}) ? $win_installenv : 'ProgramFiles';
     21  our $win_commonroot =
     22      defined($ENV{$win_commonenv}) ? $win_commonenv : 'CommonProgramFiles';
     23 
     24  # expand variables early
     25  $win_installroot = $ENV{$win_installroot};
     26  $win_commonroot = $ENV{$win_commonroot};
     27 
     28  # This makes sure things get built in the order they need
     29  # to. You're welcome.
     30  sub dependmagic {
     31      my $target = shift;
     32 
     33      return "$target: build_generated\n\t\$(MAKE) /\$(MAKEFLAGS) depend\n\t\$(MAKE) /\$(MAKEFLAGS) _$target\n_$target";
     34  }
     35  '';
     36 -}
     37 
     38 PLATFORM={- $config{target} -}
     39 SRCDIR={- $config{sourcedir} -}
     40 BLDDIR={- $config{builddir} -}
     41 FIPSKEY={- $config{FIPSKEY} -}
     42 
     43 VERSION={- "$config{full_version}" -}
     44 VERSION_NUMBER={- "$config{version}" -}
     45 MAJOR={- $config{major} -}
     46 MINOR={- $config{minor} -}
     47 
     48 SHLIB_VERSION_NUMBER={- $config{shlib_version} -}
     49 
     50 LIBS={- join(" ", map { ( platform->sharedlib_import($_), platform->staticlib($_) ) } @{$unified_info{libraries}}) -}
     51 SHLIBS={- join(" ", map { platform->sharedlib($_) // () } @{$unified_info{libraries}}) -}
     52 SHLIBPDBS={- join(" ", map { platform->sharedlibpdb($_) // () } @{$unified_info{libraries}}) -}
     53 MODULES={- our @MODULES = map { platform->dso($_) }
     54                           # Drop all modules that are dependencies, they will
     55                           # be processed through their dependents
     56                           grep { my $x = $_;
     57                                  !grep { grep { $_ eq $x } @$_ }
     58                                        values %{$unified_info{depends}} }
     59                           @{$unified_info{modules}};
     60            join(" ", @MODULES) -}
     61 MODULEPDBS={- join(" ", map { platform->dsopdb($_) } @{$unified_info{modules}}) -}
     62 FIPSMODULE={- # We do some extra checking here, as there should be only one
     63               use File::Basename;
     64               our @fipsmodules =
     65                   grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
     66                          && $unified_info{attributes}->{modules}->{$_}->{fips} }
     67                   @{$unified_info{modules}};
     68               die "More that one FIPS module" if scalar @fipsmodules > 1;
     69               join(" ", map { platform->dso($_) } @fipsmodules) -}
     70 FIPSMODULENAME={- die "More that one FIPS module" if scalar @fipsmodules > 1;
     71                   join(", ", map { basename(platform->dso($_)) } @fipsmodules) -}
     72 PROGRAMS={- our @PROGRAMS = map { platform->bin($_) } @{$unified_info{programs}}; join(" ", @PROGRAMS) -}
     73 PROGRAMPDBS={- join(" ", map { $_.".pdb" } @{$unified_info{programs}}) -}
     74 SCRIPTS={- our @SCRIPTS = @{$unified_info{scripts}}; join(" ", @SCRIPTS) -}
     75 {- output_off() if $disabled{makedepend}; "" -}
     76 DEPS={- join(" ", map { platform->isobj($_) ? platform->dep($_) : () }
     77                   grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
     78                   keys %{$unified_info{sources}}); -}
     79 {- output_on() if $disabled{makedepend}; "" -}
     80 GENERATED_MANDATORY={- our @GENERATED_MANDATORY = @{$unified_info{depends}->{""}};
     81                        join(" ", @GENERATED_MANDATORY) -}
     82 GENERATED={- # common0.tmpl provides @generated
     83              our @GENERATED = map { platform->convertext($_) } @generated;
     84              join(" ", @GENERATED) -}
     85 
     86 INSTALL_LIBS={-
     87         join(" ", map { quotify1(platform->sharedlib_import($_)
     88                                  // platform->staticlib($_)) }
     89                   grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
     90                   @{$unified_info{libraries}})
     91 -}
     92 INSTALL_SHLIBS={-
     93         join(" ", map { my $x = platform->sharedlib($_);
     94                         $x ? quotify_l($x) : () }
     95                   grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
     96                   @{$unified_info{libraries}})
     97 -}
     98 INSTALL_SHLIBPDBS={-
     99         join(" ", map { my $x = platform->sharedlibpdb($_);
    100                         $x ? quotify_l($x) : () }
    101                   grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
    102                   @{$unified_info{libraries}})
    103 -}
    104 INSTALL_ENGINES={-
    105         join(" ", map { quotify1(platform->dso($_)) }
    106                   grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
    107                          && $unified_info{attributes}->{modules}->{$_}->{engine} }
    108                   @{$unified_info{modules}})
    109 -}
    110 INSTALL_ENGINEPDBS={-
    111         join(" ", map { quotify1(platform->dsopdb($_)) }
    112                   grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
    113                          && $unified_info{attributes}->{modules}->{$_}->{engine} }
    114                   @{$unified_info{modules}})
    115 -}
    116 INSTALL_MODULES={-
    117         join(" ", map { quotify1(platform->dso($_)) }
    118                   grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
    119                           && !$unified_info{attributes}->{modules}->{$_}->{engine}
    120                           && !$unified_info{attributes}->{modules}->{$_}->{fips} }
    121                   @{$unified_info{modules}})
    122 -}
    123 INSTALL_MODULEPDBS={-
    124         join(" ", map { quotify1(platform->dsopdb($_)) }
    125                   grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
    126                          && !$unified_info{attributes}->{modules}->{$_}->{engine} }
    127                   @{$unified_info{modules}})
    128 -}
    129 INSTALL_FIPSMODULE={-
    130         join(" ", map { quotify1(platform->dso($_)) }
    131                   grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
    132                           && $unified_info{attributes}->{modules}->{$_}->{fips} }
    133                   @{$unified_info{modules}})
    134 -}
    135 INSTALL_FIPSMODULECONF=providers\fipsmodule.cnf
    136 INSTALL_PROGRAMS={-
    137         join(" ", map { quotify1(platform->bin($_)) }
    138                   grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} }
    139                   @{$unified_info{programs}})
    140 -}
    141 INSTALL_PROGRAMPDBS={-
    142         join(" ", map { quotify1(platform->binpdb($_)) }
    143                   grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} }
    144                   @{$unified_info{programs}})
    145 -}
    146 BIN_SCRIPTS={-
    147         join(" ", map { quotify1($_) }
    148                   grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
    149                          && !$unified_info{attributes}->{scripts}->{$_}->{misc} }
    150                   @{$unified_info{scripts}})
    151 -}
    152 MISC_SCRIPTS={-
    153         join(" ", map { quotify1($_) }
    154                   grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
    155                          && $unified_info{attributes}->{scripts}->{$_}->{misc} }
    156                   @{$unified_info{scripts}})
    157 -}
    158 IMAGEDOCS1={- our @IMAGEDOCS1 = @{$unified_info{imagedocs}->{man1}};
    159              join(" ", @IMAGEDOCS1) -}
    160 IMAGEDOCS3={- our @IMAGEDOCS3 = @{$unified_info{imagedocs}->{man3}};
    161              join(" ", @IMAGEDOCS3) -}
    162 IMAGEDOCS5={- our @IMAGEDOCS5 = @{$unified_info{imagedocs}->{man5}};
    163              join(" ", @IMAGEDOCS5) -}
    164 IMAGEDOCS7={- our @IMAGEDOCS7 = @{$unified_info{imagedocs}->{man7}};
    165              join(" ", @IMAGEDOCS7) -}
    166 HTMLDOCS1={- our @HTMLDOCS1 = @{$unified_info{htmldocs}->{man1}};
    167              join(" ", @HTMLDOCS1) -}
    168 HTMLDOCS3={- our @HTMLDOCS3 = @{$unified_info{htmldocs}->{man3}};
    169              join(" ", @HTMLDOCS3) -}
    170 HTMLDOCS5={- our @HTMLDOCS5 = @{$unified_info{htmldocs}->{man5}};
    171              join(" ", @HTMLDOCS5) -}
    172 HTMLDOCS7={- our @HTMLDOCS7 = @{$unified_info{htmldocs}->{man7}};
    173              join(" ", @HTMLDOCS7) -}
    174 HTMLDOCS1_BLDDIRS={- my %dirs = map { dirname($_) => 1 } @HTMLDOCS1;
    175                      join(' ', sort keys %dirs) -}
    176 HTMLDOCS3_BLDDIRS={- my %dirs = map { dirname($_) => 1 } @HTMLDOCS3;
    177                      join(' ', sort keys %dirs) -}
    178 HTMLDOCS5_BLDDIRS={- my %dirs = map { dirname($_) => 1 } @HTMLDOCS5;
    179                      join(' ', sort keys %dirs) -}
    180 HTMLDOCS7_BLDDIRS={- my %dirs = map { dirname($_) => 1 } @HTMLDOCS7;
    181                      join(' ', sort keys %dirs) -}
    182 
    183 APPS_OPENSSL="{- use File::Spec::Functions;
    184                  catfile("apps","openssl") -}"
    185 
    186 # Do not edit these manually. Use Configure with --prefix or --openssldir
    187 # to change this!  Short explanation in the top comment in Configure
    188 INSTALLTOP_dev={- # $prefix is used in the OPENSSLDIR perl snippet
    189                   #
    190                   use File::Spec::Functions qw(:DEFAULT splitpath);
    191                   our $prefix = canonpath($config{prefix}
    192                                           || "$win_installroot\\OpenSSL");
    193                   our ($prefix_dev, $prefix_dir, $prefix_file) =
    194                       splitpath($prefix, 1);
    195                   $prefix_dev -}
    196 INSTALLTOP_dir={- canonpath($prefix_dir) -}
    197 OPENSSLDIR_dev={- #
    198                   # The logic here is that if no --openssldir was given,
    199                   # OPENSSLDIR will get the value "$win_commonroot\\SSL".
    200                   # If --openssldir was given and the value is an absolute
    201                   # path, OPENSSLDIR will get its value without change.
    202                   # If the value from --openssldir is a relative path,
    203                   # OPENSSLDIR will get $prefix with the --openssldir
    204                   # value appended as a subdirectory.
    205                   #
    206                   use File::Spec::Functions qw(:DEFAULT splitpath);
    207                   our $openssldir =
    208                       $config{openssldir} ?
    209                           (file_name_is_absolute($config{openssldir}) ?
    210                                canonpath($config{openssldir})
    211                                : catdir($prefix, $config{openssldir}))
    212                           : canonpath("$win_commonroot\\SSL");
    213                   our ($openssldir_dev, $openssldir_dir, $openssldir_file) =
    214                       splitpath($openssldir, 1);
    215                   $openssldir_dev -}
    216 OPENSSLDIR_dir={- canonpath($openssldir_dir) -}
    217 LIBDIR={- our $libdir = $config{libdir} || "lib";
    218           file_name_is_absolute($libdir) ? "" : $libdir -}
    219 MODULESDIR_dev={- use File::Spec::Functions qw(:DEFAULT splitpath catpath);
    220                   our $modulesprefix = catdir($prefix,$libdir);
    221                   our ($modulesprefix_dev, $modulesprefix_dir,
    222                        $modulesprefix_file) =
    223                       splitpath($modulesprefix, 1);
    224                   our $modulesdir_dev = $modulesprefix_dev;
    225                   our $modulesdir_dir =
    226                       catdir($modulesprefix_dir, "ossl-modules");
    227                   our $modulesdir = catpath($modulesdir_dev, $modulesdir_dir);
    228                   our $enginesdir_dev = $modulesprefix_dev;
    229                   our $enginesdir_dir =
    230                       catdir($modulesprefix_dir, "engines-$sover_dirname");
    231                   our $enginesdir = catpath($enginesdir_dev, $enginesdir_dir);
    232                   $modulesdir_dev -}
    233 MODULESDIR_dir={- canonpath($modulesdir_dir) -}
    234 ENGINESDIR_dev={- $enginesdir_dev -}
    235 ENGINESDIR_dir={- canonpath($enginesdir_dir) -}
    236 !IF "$(DESTDIR)" != ""
    237 INSTALLTOP=$(DESTDIR)$(INSTALLTOP_dir)
    238 OPENSSLDIR=$(DESTDIR)$(OPENSSLDIR_dir)
    239 ENGINESDIR=$(DESTDIR)$(ENGINESDIR_dir)
    240 MODULESDIR=$(DESTDIR)$(MODULESDIR_dir)
    241 !ELSE
    242 INSTALLTOP=$(INSTALLTOP_dev)$(INSTALLTOP_dir)
    243 OPENSSLDIR=$(OPENSSLDIR_dev)$(OPENSSLDIR_dir)
    244 ENGINESDIR=$(ENGINESDIR_dev)$(ENGINESDIR_dir)
    245 MODULESDIR=$(MODULESDIR_dev)$(MODULESDIR_dir)
    246 !ENDIF
    247 
    248 # $(libdir) is chosen to be compatible with the GNU coding standards
    249 libdir={- file_name_is_absolute($libdir)
    250           ? $libdir : '$(INSTALLTOP)\$(LIBDIR)' -}
    251 
    252 ##### User defined commands and flags ################################
    253 
    254 CC="{- $config{CC} -}"
    255 CPP={- $config{CPP} -}
    256 CPPFLAGS={- our $cppflags1 = join(" ",
    257                                   (map { "-D".$_} @{$config{CPPDEFINES}}),
    258                                   (map { " -I".$_} @{$config{CPPINCLUDES}}),
    259                                   @{$config{CPPFLAGS}}) -}
    260 CFLAGS={- join(' ', @{$config{CFLAGS}}) -}
    261 LD="{- $config{LD} -}"
    262 LDFLAGS={- join(' ', @{$config{LDFLAGS}}) -}
    263 EX_LIBS={- join(' ', @{$config{LDLIBS}}) -}
    264 
    265 PERL={- $config{PERL} -}
    266 
    267 AR="{- $config{AR} -}"
    268 ARFLAGS= {- join(' ', @{$config{ARFLAGS}}) -}
    269 
    270 MT="{- $config{MT} -}"
    271 MTFLAGS= {- join(' ', @{$config{MTFLAGS}}) -}
    272 
    273 AS="{- $config{AS} -}"
    274 ASFLAGS={- join(' ', @{$config{ASFLAGS}}) -}
    275 
    276 RC="{- $config{RC} -}"
    277 RCFLAGS={- join(' ', @{$config{RCFLAGS}}) -}
    278 
    279 ECHO="$(PERL)" "$(SRCDIR)\util\echo.pl"
    280 
    281 ##### Special command flags ##########################################
    282 
    283 COUTFLAG={- $target{coutflag} -}$(OSSL_EMPTY)
    284 LDOUTFLAG={- $target{ldoutflag} -}$(OSSL_EMPTY)
    285 AROUTFLAG={- $target{aroutflag} -}$(OSSL_EMPTY)
    286 MTINFLAG={- $target{mtinflag} -}$(OSSL_EMPTY)
    287 MTOUTFLAG={- $target{mtoutflag} -}$(OSSL_EMPTY)
    288 ASOUTFLAG={- $target{asoutflag} -}$(OSSL_EMPTY)
    289 RCOUTFLAG={- $target{rcoutflag} -}$(OSSL_EMPTY)
    290 
    291 ##### Project flags ##################################################
    292 
    293 # Variables starting with CNF_ are common variables for all product types
    294 
    295 CNF_ASFLAGS={- join(' ', $target{asflags} || (),
    296                          @{$config{asflags}}) -}
    297 CNF_CPPFLAGS={- our $cppfags2 =
    298                     join(' ', $target{cppflags} || (),
    299                               (map { '-D'.quotify1($_) } @{$target{defines}},
    300                                                          @{$config{defines}}),
    301                               (map { '-I'.'"'.$_.'"' } @{$target{includes}},
    302                                                        @{$config{includes}}),
    303                               @{$config{cppflags}}) -}
    304 CNF_CFLAGS={- join(' ', $target{cflags} || (),
    305                         @{$config{cflags}}) -}
    306 CNF_CXXFLAGS={- join(' ', $target{cxxflags} || (),
    307                           @{$config{cxxflags}}) -}
    308 CNF_LDFLAGS={- join(' ', $target{lflags} || (),
    309                          @{$config{lflags}}) -}
    310 CNF_EX_LIBS={- join(' ', $target{ex_libs} || (),
    311                          @{$config{ex_libs}}) -}
    312 
    313 # Variables starting with LIB_ are used to build library object files
    314 # and shared libraries.
    315 # Variables starting with DSO_ are used to build DSOs and their object files.
    316 # Variables starting with BIN_ are used to build programs and their object
    317 # files.
    318 
    319 LIB_ASFLAGS={- join(' ', $target{lib_asflags} || (),
    320                          @{$config{lib_asflags}},
    321                          '$(CNF_ASFLAGS)', '$(ASFLAGS)') -}
    322 LIB_CPPFLAGS={- our $lib_cppflags =
    323                 join(' ', $target{lib_cppflags} || (),
    324                           $target{shared_cppflag} || (),
    325                           (map { '-D'.quotify1($_) }
    326                                @{$target{lib_defines}},
    327                                @{$target{shared_defines}},
    328                                @{$config{lib_defines}},
    329                                @{$config{shared_defines}}),
    330                           (map { '-I'.quotify1($_) }
    331                                @{$target{lib_includes}},
    332                                @{$target{shared_includes}},
    333                                @{$config{lib_includes}},
    334                                @{$config{shared_includes}}),
    335                           @{$config{lib_cppflags}},
    336                           @{$config{shared_cppflag}});
    337                 join(' ', $lib_cppflags,
    338                           (map { '-D'.quotify1($_) }
    339                                "OPENSSLDIR=\"$openssldir\"",
    340                                "ENGINESDIR=\"$enginesdir\"",
    341                                "MODULESDIR=\"$modulesdir\""),
    342                           '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
    343 LIB_CFLAGS={- join(' ', $target{lib_cflags} || (),
    344                         $target{shared_cflag} || (),
    345                         @{$config{lib_cflags}},
    346                         @{$config{shared_cflag}},
    347                         '$(CNF_CFLAGS)', '$(CFLAGS)') -}
    348 LIB_LDFLAGS={- join(' ', $target{shared_ldflag} || (),
    349                          $config{shared_ldflag} || (),
    350                          '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
    351 LIB_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS)
    352 DSO_ASFLAGS={- join(' ', $target{dso_asflags} || (),
    353                          $target{module_asflags} || (),
    354                          @{$config{dso_asflags}},
    355                          @{$config{module_asflags}},
    356                          '$(CNF_ASFLAGS)', '$(ASFLAGS)') -}
    357 DSO_CPPFLAGS={- join(' ', $target{dso_cppflags} || (),
    358                           $target{module_cppflag} || (),
    359                           (map { '-D'.quotify1($_) }
    360                                @{$target{dso_defines}},
    361                                @{$target{module_defines}},
    362                                @{$config{dso_defines}},
    363                                @{$config{module_defines}}),
    364                           (map { '-I'.quotify1($_) }
    365                                @{$target{dso_includes}},
    366                                @{$target{module_includes}},
    367                                @{$config{dso_includes}},
    368                                @{$config{module_includes}}),
    369                           @{$config{dso_cppflags}},
    370                           @{$config{module_cppflags}},
    371                           '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
    372 DSO_CFLAGS={- join(' ', $target{dso_cflags} || (),
    373                         $target{module_cflags} || (),
    374                         @{$config{dso_cflags}},
    375                         @{$config{module_cflags}},
    376                         '$(CNF_CFLAGS)', '$(CFLAGS)') -}
    377 DSO_LDFLAGS={- join(' ', $target{dso_lflags} || (),
    378                          $target{module_ldflags} || (),
    379                          @{$config{dso_lflags}},
    380                          @{$config{module_ldflags}},
    381                          '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
    382 DSO_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS)
    383 BIN_ASFLAGS={- join(' ', $target{bin_asflags} || (),
    384                          @{$config{bin_asflags}},
    385                          '$(CNF_ASFLAGS)', '$(ASFLAGS)') -}
    386 BIN_CPPFLAGS={- join(' ', $target{bin_cppflags} || (),
    387                           (map { '-D'.$_ } @{$config{bin_defines} || ()}),
    388                           @{$config{bin_cppflags}},
    389                           '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
    390 BIN_CFLAGS={- join(' ', $target{bin_cflags} || (),
    391                         @{$config{bin_cflags}},
    392                         '$(CNF_CFLAGS)', '$(CFLAGS)') -}
    393 BIN_LDFLAGS={- join(' ', $target{bin_lflags} || (),
    394                          @{$config{bin_lflags}},
    395                          '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
    396 BIN_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS)
    397 
    398 # CPPFLAGS_Q is used for one thing only: to build up buildinf.h
    399 CPPFLAGS_Q={- $cppflags1 =~ s|([\\"])|\\$1|g;
    400               $cppflags2 =~ s|([\\"])|\\$1|g;
    401               join(' ', $lib_cppflags || (), $cppflags2 || (),
    402                         $cppflags1 || ()) -}
    403 
    404 PERLASM_SCHEME= {- $target{perlasm_scheme} -}
    405 
    406 PROCESSOR= {- $config{processor} -}
    407 
    408 # The main targets ###################################################
    409 
    410 {- dependmagic('build_sw'); -}: build_libs_nodep build_modules_nodep build_programs_nodep copy-utils
    411 {- dependmagic('build_libs'); -}: build_libs_nodep
    412 {- dependmagic('build_modules'); -}: build_modules_nodep
    413 {- dependmagic('build_programs'); -}: build_programs_nodep
    414 
    415 build_docs: build_html_docs
    416 build_html_docs: $(HTMLDOCS1) $(HTMLDOCS3) $(HTMLDOCS5) $(HTMLDOCS7)
    417 	@
    418 build_generated: $(GENERATED_MANDATORY)
    419 	@
    420 build_libs_nodep: $(LIBS) {- join(" ",map { platform->sharedlib_import($_) // () } @{$unified_info{libraries}}) -}
    421 	@
    422 build_modules_nodep: $(MODULES)
    423 	@
    424 build_programs_nodep: $(PROGRAMS) $(SCRIPTS)
    425 	@
    426 
    427 # Kept around for backward compatibility
    428 build_apps build_tests: build_programs
    429 
    430 # Convenience target to prebuild all generated files, not just the mandatory
    431 # ones
    432 build_all_generated: $(GENERATED_MANDATORY) $(GENERATED) build_docs
    433 	@{- output_off() if $disabled{makedepend}; "\@rem" -}
    434 	@$(ECHO) "Warning: consider configuring with no-makedepend, because if"
    435 	@$(ECHO) "         target system doesn't have $(PERL),"
    436 	@$(ECHO) "         then make will fail..."
    437 	@{- output_on() if $disabled{makedepend}; "\@rem" -}
    438 
    439 all: build_sw build_docs
    440 
    441 test: tests
    442 {- dependmagic('tests'); -}: build_programs_nodep build_modules_nodep copy-utils
    443 	@{- output_off() if $disabled{tests}; "\@rem" -}
    444 	cmd /C "set "SRCTOP=$(SRCDIR)" & set "BLDTOP=$(BLDDIR)" & set "PERL=$(PERL)" & set "FIPSKEY=$(FIPSKEY)" & "$(PERL)" "$(SRCDIR)\test\run_tests.pl" $(TESTS)"
    445 	@{- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -}
    446 	@$(ECHO) "Tests are not supported with your chosen Configure options"
    447 	@{- output_on() if !$disabled{tests}; "\@rem" -}
    448 
    449 list-tests:
    450 	@{- output_off() if $disabled{tests}; "\@rem" -}
    451 	@cmd /C "set "SRCTOP=$(SRCDIR)" & "$(PERL)" "$(SRCDIR)\test\run_tests.pl" list"
    452 	@{- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -}
    453 	@$(ECHO) "Tests are not supported with your chosen Configure options"
    454 	@{- output_on() if !$disabled{tests}; "\@rem" -}
    455 
    456 install: install_sw install_ssldirs install_docs {- $disabled{fips} ? "" : "install_fips" -}
    457 
    458 uninstall: uninstall_docs uninstall_sw {- $disabled{fips} ? "" : "uninstall_fips" -}
    459 
    460 libclean:
    461 	"$(PERL)" -e "map { m/(.*)\.dll$$/; unlink glob """{.,apps,test,fuzz}/$$1.*"""; } @ARGV" $(SHLIBS)
    462 	-del /Q /F $(LIBS) libcrypto.* libssl.* ossl_static.pdb
    463 
    464 clean: libclean
    465 	{- join("\n\t", map { "-del /Q /F $_" } @HTMLDOCS1) || "\@rem" -}
    466 	{- join("\n\t", map { "-del /Q /F $_" } @HTMLDOCS3) || "\@rem" -}
    467 	{- join("\n\t", map { "-del /Q /F $_" } @HTMLDOCS5) || "\@rem" -}
    468 	{- join("\n\t", map { "-del /Q /F $_" } @HTMLDOCS7) || "\@rem" -}
    469 	{- join("\n\t", map { "-del /Q /F $_" } @PROGRAMS) || "\@rem" -}
    470 	{- join("\n\t", map { "-del /Q /F $_" } @MODULES) || "\@rem" -}
    471 	{- join("\n\t", map { "-del /Q /F $_" } @SCRIPTS) || "\@rem" -}
    472 	{- join("\n\t", map { "-del /Q /F $_" } @GENERATED_MANDATORY) || "\@rem" -}
    473 	{- join("\n\t", map { "-del /Q /F $_" } @GENERATED) || "\@rem" -}
    474 	-del /Q /S /F *.d *.obj *.pdb *.ilk *.manifest
    475 	-del /Q /S /F engines\*.lib engines\*.exp
    476 	-del /Q /S /F apps\*.lib apps\*.rc apps\*.res apps\*.exp
    477 	-del /Q /S /F test\*.exp
    478 	-rd /Q /S test\test-runs
    479 
    480 distclean: clean
    481 	-del /Q /F include\openssl\configuration.h
    482 	-del /Q /F configdata.pm
    483 	-del /Q /F makefile
    484 
    485 depend: makefile
    486 	@ {- output_off() if $disabled{makedepend}; "\@rem" -}
    487 	@ "$(PERL)" "$(SRCDIR)\util\add-depends.pl" "{- $target{makedep_scheme} -}"
    488 	@ {- output_on() if $disabled{makedepend}; "\@rem" -}
    489 
    490 # Install helper targets #############################################
    491 
    492 install_sw: install_dev install_engines install_modules install_runtime
    493 
    494 uninstall_sw: uninstall_runtime uninstall_modules uninstall_engines uninstall_dev
    495 
    496 install_docs: install_html_docs
    497 
    498 uninstall_docs: uninstall_html_docs
    499 
    500 {- output_off() if $disabled{fips}; "" -}
    501 install_fips: build_sw $(INSTALL_FIPSMODULECONF)
    502 #	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
    503 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(MODULESDIR)"
    504 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(OPENSSLDIR)"
    505 	@$(ECHO) "*** Installing FIPS module"
    506 	@$(ECHO) "install $(INSTALL_FIPSMODULE) -> $(MODULESDIR)\$(FIPSMODULENAME)"
    507 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(INSTALL_FIPSMODULE)" "$(MODULESDIR)"
    508 	@$(ECHO) "*** Installing FIPS module configuration"
    509 	@$(ECHO) "install $(INSTALL_FIPSMODULECONF) -> $(OPENSSLDIR)\fipsmodule.cnf"
    510 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(INSTALL_FIPSMODULECONF)" "$(OPENSSLDIR)"
    511 
    512 uninstall_fips:
    513 	@$(ECHO) "*** Uninstalling FIPS module configuration"
    514 	$(RM) "$(OPENSSLDIR)\fipsmodule.cnf"
    515 	@$(ECHO) "*** Uninstalling FIPS module"
    516 	$(RM) "$(MODULESDIR)\$(FIPSMODULENAME)"
    517 {- if ($disabled{fips}) { output_on(); } else { output_off(); } "" -}
    518 install_fips:
    519 	@$(ECHO) "The 'install_fips' target requires the 'enable-fips' option"
    520 
    521 uninstall_fips:
    522 	@$(ECHO) "The 'uninstall_fips' target requires the 'enable-fips' option"
    523 {- output_on() if !$disabled{fips}; "" -}
    524 
    525 install_ssldirs:
    526 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(OPENSSLDIR)\certs"
    527 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(OPENSSLDIR)\private"
    528 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(OPENSSLDIR)\misc"
    529 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\openssl.cnf" \
    530                                         "$(OPENSSLDIR)\openssl.cnf.dist"
    531 	@IF NOT EXIST "$(OPENSSLDIR)\openssl.cnf" \
    532          "$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\openssl.cnf" \
    533                                         "$(OPENSSLDIR)\openssl.cnf"
    534 	@if not "$(MISC_SCRIPTS)"=="" \
    535 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(MISC_SCRIPTS) \
    536                                         "$(OPENSSLDIR)\misc"
    537 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\ct_log_list.cnf" \
    538                                         "$(OPENSSLDIR)\ct_log_list.cnf.dist"
    539 	@IF NOT EXIST "$(OPENSSLDIR)\ct_log_list.cnf" \
    540          "$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\ct_log_list.cnf" \
    541                                         "$(OPENSSLDIR)\ct_log_list.cnf"
    542 
    543 install_dev: install_runtime_libs
    544 	@if "$(INSTALLTOP)"=="" ( $(ECHO) "INSTALLTOP should not be empty" & exit 1 )
    545 	@$(ECHO) "*** Installing development files"
    546 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\include\openssl"
    547 	@{- output_off() if $disabled{uplink}; "" -}
    548 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\ms\applink.c" \
    549 				       "$(INSTALLTOP)\include\openssl"
    550 	@{- output_on() if $disabled{uplink}; "" -}
    551 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "-exclude_re=/__DECC_" \
    552 				       "$(SRCDIR)\include\openssl\*.h" \
    553 				       "$(INSTALLTOP)\include\openssl"
    554 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(BLDDIR)\include\openssl\*.h" \
    555 				       "$(INSTALLTOP)\include\openssl"
    556 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(libdir)"
    557 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_LIBS) "$(libdir)"
    558 	@if "$(SHLIBS)"=="" \
    559 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" ossl_static.pdb "$(libdir)"
    560 
    561 uninstall_dev:
    562 
    563 _install_modules_deps: install_runtime_libs build_modules
    564 
    565 install_engines: _install_modules_deps
    566 	@if "$(INSTALLTOP)"=="" ( $(ECHO) "INSTALLTOP should not be empty" & exit 1 )
    567 	@$(ECHO) "*** Installing engines"
    568 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(ENGINESDIR)"
    569 	@if not "$(INSTALL_ENGINES)"=="" \
    570 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_ENGINES) "$(ENGINESDIR)"
    571 	@if not "$(INSTALL_ENGINES)"=="" \
    572 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_ENGINEPDBS) "$(ENGINESDIR)"
    573 
    574 uninstall_engines:
    575 
    576 install_modules: _install_modules_deps
    577 	@if "$(INSTALLTOP)"=="" ( $(ECHO) "INSTALLTOP should not be empty" & exit 1 )
    578 	@$(ECHO) "*** Installing modules"
    579 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(MODULESDIR)"
    580 	@if not "$(INSTALL_MODULES)"=="" \
    581 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_MODULES) "$(MODULESDIR)"
    582 	@if not "$(INSTALL_MODULES)"=="" \
    583 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_MODULEPDBS) "$(MODULESDIR)"
    584 
    585 uninstall_modules:
    586 
    587 install_runtime: install_programs
    588 
    589 install_runtime_libs: build_libs
    590 	@if "$(INSTALLTOP)"=="" ( $(ECHO) "INSTALLTOP should not be empty" & exit 1 )
    591 	@$(ECHO) "*** Installing runtime libraries"
    592 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\bin"
    593 	@if not "$(SHLIBS)"=="" \
    594 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_SHLIBS) "$(INSTALLTOP)\bin"
    595 	@if not "$(SHLIBS)"=="" \
    596 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_SHLIBPDBS) \
    597                                         "$(INSTALLTOP)\bin"
    598 
    599 install_programs: install_runtime_libs build_programs
    600 	@if "$(INSTALLTOP)"=="" ( $(ECHO) "INSTALLTOP should not be empty" & exit 1 )
    601 	@$(ECHO) "*** Installing runtime programs"
    602 	@if not "$(INSTALL_PROGRAMS)"=="" \
    603 	 "$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\bin"
    604 	@if not "$(INSTALL_PROGRAMS)"=="" \
    605 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_PROGRAMS) \
    606                                         "$(INSTALLTOP)\bin"
    607 	@if not "$(INSTALL_PROGRAMS)"=="" \
    608 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_PROGRAMPDBS) \
    609                                         "$(INSTALLTOP)\bin"
    610 	@if not "$(INSTALL_PROGRAMS)"=="" \
    611 	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(BIN_SCRIPTS) \
    612                                         "$(INSTALLTOP)\bin"
    613 
    614 uninstall_runtime:
    615 
    616 install_html_docs: install_image_docs build_html_docs
    617 	@if "$(INSTALLTOP)"=="" ( echo INSTALLTOP should not be empty & exit 1 )
    618 	@echo *** Installing HTML docs
    619 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\html\man1"
    620 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\html\man3"
    621 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\html\man5"
    622 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\html\man7"
    623 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BLDDIR)\doc\html\man1\*.html \
    624                                         "$(INSTALLTOP)\html\man1"
    625 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BLDDIR)\doc\html\man3\*.html \
    626                                         "$(INSTALLTOP)\html\man3"
    627 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BLDDIR)\doc\html\man5\*.html \
    628                                         "$(INSTALLTOP)\html\man5"
    629 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BLDDIR)\doc\html\man7\*.html \
    630                                         "$(INSTALLTOP)\html\man7"
    631 
    632 uninstall_html_docs: uninstall_image_docs
    633 
    634 install_image_docs:
    635 	@if "$(INSTALLTOP)"=="" ( echo INSTALLTOP should not be empty & exit 1 )
    636 	@echo *** Installing HTML images
    637 	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\html\man7\img"
    638 	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(SRCDIR)\doc\man7\img\*.png \
    639                                         "$(INSTALLTOP)\html\man7\img"
    640 
    641 uninstall_image_docs:
    642 
    643 # Helper targets #####################################################
    644 
    645 copy-utils: $(BLDDIR)\apps\openssl.cnf
    646 
    647 $(BLDDIR)\apps\openssl.cnf: makefile
    648 	@if NOT EXIST "$(BLDDIR)\apps" mkdir "$(BLDDIR)\apps"
    649 	@if NOT "$(SRCDIR)"=="$(BLDDIR)" copy "$(SRCDIR)\apps\$(@F)" "$(BLDDIR)\apps"
    650 
    651 # Building targets ###################################################
    652 
    653 makefile: configdata.pm {- join(" ", map { '"'.$_.'"' } @{$config{build_file_templates}}) -}
    654 	@$(ECHO) "Detected changed: $?"
    655 	"$(PERL)" configdata.pm
    656 	@$(ECHO) "**************************************************"
    657 	@$(ECHO) "***                                            ***"
    658 	@$(ECHO) "***   Please run the same make command again   ***"
    659 	@$(ECHO) "***                                            ***"
    660 	@$(ECHO) "**************************************************"
    661 	@exit 1
    662 
    663 configdata.pm: "$(SRCDIR)\Configure" {- join(" ", map { '"'.$_.'"' } @{$config{build_infos}}, @{$config{conf_files}}) -}
    664 	@$(ECHO) "Detected changed: $?"
    665 	"$(PERL)" configdata.pm -r
    666 	@$(ECHO) "**************************************************"
    667 	@$(ECHO) "***                                            ***"
    668 	@$(ECHO) "***   Please run the same make command again   ***"
    669 	@$(ECHO) "***                                            ***"
    670 	@$(ECHO) "**************************************************"
    671 	@exit 1
    672 
    673 reconfigure reconf:
    674 	"$(PERL)" configdata.pm -r
    675 
    676 {-
    677  use File::Basename;
    678  use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs file_name_is_absolute/;
    679 
    680   # Helper function to convert dependencies in platform agnostic form to
    681   # dependencies in platform form.
    682   sub compute_platform_depends {
    683       map { my $x = $_;
    684 
    685             grep { $x eq $_ } @{$unified_info{programs}} and platform->bin($x)
    686             or grep { $x eq $_ } @{$unified_info{modules}} and platform->dso($x)
    687             or grep { $x eq $_ } @{$unified_info{libraries}} and platform->lib($x)
    688             or platform->convertext($x); } @_;
    689   }
    690 
    691  # Helper function to figure out dependencies on libraries
    692  # It takes a list of library names and outputs a list of dependencies
    693  sub compute_lib_depends {
    694      if ($disabled{shared}) {
    695 	 return map { platform->staticlib($_) } @_;
    696      }
    697      return map { platform->sharedlib_import($_) // platform->staticlib($_) } @_;
    698  }
    699 
    700   sub generatetarget {
    701       my %args = @_;
    702       my $deps = join(" ", compute_platform_depends(@{$args{deps}}));
    703       return <<"EOF";
    704 $args{target}: $deps
    705 EOF
    706   }
    707 
    708   # This function (and the next) avoids quoting paths of generated dependencies
    709   # (in the build tree), but quotes paths of non-generated dependencies (in the
    710   # source tree). This is a workaround for a limitation of C++Builder's make.exe
    711   # in handling quoted paths: https://quality.embarcadero.com/browse/RSP-31756
    712   sub generatesrc {
    713       my %args = @_;
    714       my $gen0 = $args{generator}->[0];
    715       my $gen_args = join('', map { " $_" }
    716                               @{$args{generator}}[1..$#{$args{generator}}]);
    717       my $gen_incs = join("", map { " -I\"$_\"" } @{$args{generator_incs}});
    718       my $incs = join("", map { " -I\"$_\"" } @{$args{incs}});
    719       my $defs = join("", map { " -D".$_ } @{$args{defs}});
    720       my $deps = join(' ',
    721                       map { file_name_is_absolute($_) || ($_ =~ m|^../|) ? "\"$_\"" : $_ }
    722                       compute_platform_depends(@{$args{generator_deps}},
    723                                                @{$args{deps}}));
    724 
    725       if ($args{src} =~ /\.html$/) {
    726           #
    727           # HTML generator
    728           #
    729           my $title = basename($args{src}, ".html");
    730           my $pod = $gen0;
    731           return <<"EOF";
    732 $args{src}: "$pod"
    733 	"\$(PERL)" "\$(SRCDIR)/util/mkpod2html.pl" -i "$pod" -o \$\@ -t "$title" -r "\$(SRCDIR)/doc"
    734 EOF
    735       } elsif (platform->isdef($args{src})) {
    736           #
    737           # Linker script-ish generator
    738           #
    739           my $target = platform->def($args{src});
    740           my $mkdef = abs2rel(rel2abs(catfile($config{sourcedir},
    741                                               "util", "mkdef.pl")),
    742                               rel2abs($config{builddir}));
    743           my $ord_ver = $args{intent} eq 'lib' ? ' --version $(VERSION_NUMBER)' : '';
    744           my $ord_name =
    745               $args{generator}->[1] || basename(platform->dsoname($args{product}));
    746           return <<"EOF";
    747 $target: $gen0 $deps $mkdef
    748 	"\$(PERL)" "$mkdef"$ord_ver --type $args{intent} --ordinals $gen0 --name $ord_name --OS windows > $target
    749 EOF
    750       } elsif (platform->isasm($args{src})
    751                || platform->iscppasm($args{src})) {
    752           #
    753           # Assembler generator
    754           #
    755           my $cppflags = {
    756               shlib => '$(LIB_CFLAGS) $(LIB_CPPFLAGS)',
    757               lib => '$(LIB_CFLAGS) $(LIB_CPPFLAGS)',
    758               dso => '$(DSO_CFLAGS) $(DSO_CPPFLAGS)',
    759               bin => '$(BIN_CFLAGS) $(BIN_CPPFLAGS)'
    760           } -> {$args{intent}};
    761           my $target = platform->isasm($args{src})
    762                        ? platform->asm($args{src})
    763                        : $args{src};
    764 
    765           my $generator;
    766           if ($gen0 =~ /\.pl$/) {
    767               $generator = '"$(PERL)"'.$gen_incs.' "'.$gen0.'"'.$gen_args
    768                   .' "$(PERLASM_SCHEME)"'.$incs.' '.$cppflags.$defs.' $(PROCESSOR)';
    769           } elsif ($gen0 =~ /\.S$/) {
    770               $generator = undef;
    771           } else {
    772               die "Generator type for $src unknown: $gen0\n";
    773           }
    774 
    775           if (defined($generator)) {
    776               return <<"EOF";
    777 $target: "$gen0" $deps
    778 	cmd /C "set "ASM=\$(AS)" & $generator \$@"
    779 EOF
    780           }
    781           return <<"EOF";
    782 $target: "$gen0" $deps
    783 	\$(CPP) $incs $cppflags $defs "$gen0" > \$@.i
    784 	move /Y \$@.i \$@
    785 EOF
    786       } elsif ($gen0 =~ m|^.*\.in$|) {
    787           #
    788           # "dofile" generator (file.in -> file)
    789           #
    790           my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
    791                                                "util", "dofile.pl")),
    792                                rel2abs($config{builddir}));
    793           my @perlmodules = ( 'configdata.pm',
    794                               grep { $_ =~ m|\.pm$| } @{$args{deps}} );
    795           my %perlmoduleincs = map { '"-I'.dirname($_).'"' => 1 } @perlmodules;
    796           $deps = join(' ', $deps, compute_platform_depends(@perlmodules));
    797           @perlmodules = map { "-M".basename($_, '.pm') } @perlmodules;
    798           my $perlmodules = join(' ', '', sort keys %perlmoduleincs, @perlmodules);
    799           return <<"EOF";
    800 $args{src}: "$gen0" $deps
    801 	"\$(PERL)"$perlmodules "$dofile" "-o$target{build_file}" "$gen0"$gen_args > \$@
    802 EOF
    803       } elsif (grep { $_ eq $gen0 } @{$unified_info{programs}}) {
    804           #
    805           # Generic generator using OpenSSL programs
    806           #
    807 
    808           # Redo $gen0, to ensure that we have the proper extension.
    809           $gen0 = platform->bin($gen0);
    810           return <<"EOF";
    811 $args{src}: $gen0 $deps "\$(BLDDIR)\\util\\wrap.pl"
    812 	"\$(PERL)" "\$(BLDDIR)\\util\\wrap.pl" "$gen0"$gen_args > \$@
    813 EOF
    814       } else {
    815           #
    816           # Generic generator using Perl
    817           #
    818           return <<"EOF";
    819 $args{src}: "$gen0" $deps
    820 	"\$(PERL)"$gen_incs "$gen0"$gen_args > \$@
    821 EOF
    822       }
    823   }
    824 
    825  sub src2obj {
    826      my $asmext = platform->asmext();
    827      my %args = @_;
    828      my @srcs =
    829          map { my $x = $_;
    830                (platform->isasm($x) && grep { $x eq $_ } @generated)
    831                ? platform->asm($x) : $x }
    832          ( @{$args{srcs}} );
    833      my $srcs = '"'.join('" "',  @srcs).'"';
    834      my $deps = join(' ',
    835                      map { file_name_is_absolute($_) || ($_ =~ m|^../|) ? "\"$_\"" : $_ }
    836                      (@srcs, @{$args{deps}}));
    837      my $incs = join("", map { ' -I"'.$_.'"' } @{$args{incs}});
    838      my $defs = join("", map { " -D".$_ } @{$args{defs}});
    839      my $cflags = { shlib => ' $(LIB_CFLAGS)',
    840 		    lib => ' $(LIB_CFLAGS)',
    841 		    dso => ' $(DSO_CFLAGS)',
    842 		    bin => ' $(BIN_CFLAGS)' } -> {$args{intent}};
    843      $cflags .= $incs;
    844      $cflags .= { shlib => ' $(LIB_CPPFLAGS)',
    845 		  lib => ' $(LIB_CPPFLAGS)',
    846 		  dso => ' $(DSO_CPPFLAGS)',
    847 		  bin => ' $(BIN_CPPFLAGS)' } -> {$args{intent}};
    848      my $asflags = { shlib => ' $(LIB_ASFLAGS)',
    849 		     lib => ' $(LIB_ASFLAGS)',
    850 		     dso => ' $(DSO_ASFLAGS)',
    851 		     bin => ' $(BIN_ASFLAGS)' } -> {$args{intent}};
    852      my $makedepcmd = $config{makedepcmd} unless $disabled{makedepend};
    853      if ($srcs[0] =~ /\.rc$/) {
    854          my $res = platform->res($args{obj});
    855          return <<"EOF";
    856 $res: $deps
    857 	\$(RC) \$(RCFLAGS) \$(RCOUTFLAG)\$\@ $srcs
    858 EOF
    859      }
    860      my $obj = platform->obj($args{obj});
    861      my $dep = platform->dep($args{obj});
    862      if ($srcs[0] =~ /\Q${asmext}\E$/) {
    863          return <<"EOF";
    864 $obj: $deps
    865 	\$(AS) $asflags \$(ASOUTFLAG)\$\@ $srcs
    866 EOF
    867      } elsif ($srcs[0] =~ /.S$/) {
    868          return <<"EOF";
    869 $obj: $deps
    870 	\$(CC) /EP -D__ASSEMBLER__ $cflags $defs $srcs > \$@.asm
    871 	\$(AS) $asflags \$(ASOUTFLAG)\$\@ \$@.asm
    872 EOF
    873      }
    874      my $recipe = <<"EOF";
    875 $obj: $deps
    876 	\$(CC) $cflags $defs -c \$(COUTFLAG)\$\@ $srcs
    877 EOF
    878      $recipe .= <<"EOF"	unless $disabled{makedepend};
    879 	cmd /C "$makedepcmd $cflags $defs $srcs > $dep 2>&1"
    880 EOF
    881      return $recipe;
    882  }
    883 
    884  # We *know* this routine is only called when we've configure 'shared'.
    885  # Also, note that even though the import library built here looks like
    886  # a static library, it really isn't.
    887  sub obj2shlib {
    888      my %args = @_;
    889      my $lib = $args{lib};
    890      my @objs = map { platform->convertext($_) }
    891                 grep { platform->isobj($_) }
    892                 @{$args{objs}};
    893      my @ress = map { platform->convertext($_) }
    894                 grep { platform->isres($_) }
    895                 @{$args{objs}};
    896      my @defs = map { platform->def($_) }
    897                 grep { platform->isdef($_) }
    898                 @{$args{objs}};
    899      my @deps = compute_lib_depends(@{$args{deps}});
    900      die "More than one exported symbols list" if scalar @defs > 1;
    901      my $linklibs = join("", map { "$_$target{ld_resp_delim}" } @deps);
    902      my $objs = join($target{ld_resp_delim}, @objs);
    903      my $ress = join($target{ld_resp_delim}, @ress);
    904      my $deps = join(" ", @objs, @ress, @defs, @deps);
    905      my $import = platform->sharedlib_import($lib);
    906      my $dll =  platform->sharedlib($lib);
    907      my $shared_def = $target{lddefflag} . join("", @defs);
    908      my $implib_rule = $target{ld_implib_rule} || "";
    909      my $implib_flag = $target{ld_implib_flag}
    910                        ? "$target{ld_implib_flag}$import"
    911                        : "";
    912      return <<"EOF"
    913 # The import library may look like a static library, but it is not.
    914 # We MUST make the import library depend on the DLL, in case someone
    915 # mistakenly removes the latter.
    916 $import: $dll
    917 	$implib_rule
    918 $dll: $deps
    919 	IF EXIST $full.manifest DEL /F /Q $full.manifest
    920 	IF EXIST \$@ DEL /F /Q \$@
    921 	cmd /C "\$(LD) \$(LDFLAGS) \$(LIB_LDFLAGS) @<< $implib_flag || (DEL /Q \$(\@B).* $import & EXIT 1)"
    922 $objs$target{ld_resp_delim}\$(LDOUTFLAG)$dll$target{ldpostoutflag}$target{ld_resp_delim}$linklibs\$(LIB_EX_LIBS)$target{ld_resp_delim}$shared_def$target{ldresflag}$ress
    923 <<
    924 	IF EXIST $dll.manifest \\
    925 	   \$(MT) \$(MTFLAGS) \$(MTINFLAG)$dll.manifest \$(MTOUTFLAG)$dll
    926 	IF EXIST apps\\$dll DEL /Q /F apps\\$dll
    927 	IF EXIST test\\$dll DEL /Q /F test\\$dll
    928 	IF EXIST fuzz\\$dll DEL /Q /F fuzz\\$dll
    929 	COPY $dll apps
    930 	COPY $dll test
    931 	COPY $dll fuzz
    932 EOF
    933  }
    934  sub obj2dso {
    935      my %args = @_;
    936      my $dso = platform->dso($args{module});
    937      my $dso_n = platform->dsoname($args{module});
    938      my @objs = map { platform->convertext($_) }
    939                 grep { platform->isobj($_) }
    940                 @{$args{objs}};
    941      my @ress = map { platform->convertext($_) }
    942                 grep { platform->isres($_) }
    943                 @{$args{objs}};
    944      my @defs = map { platform->def($_) }
    945                 grep { platform->isdef($_) }
    946                 @{$args{objs}};
    947      my @deps = compute_lib_depends(@{$args{deps}});
    948      die "More than one exported symbols list" if scalar @defs > 1;
    949      my $objs = join($target{ld_resp_delim}, @objs);
    950      my $ress = join($target{ld_resp_delim}, @ress);
    951      my $linklibs = join("", map { "$_$target{ld_resp_delim}" } @deps);
    952      my $deps = join(" ", @objs, @ress, @defs, @deps);
    953      my $shared_def = $target{lddefflag} . join("", @defs);
    954      return <<"EOF";
    955 $dso: $deps
    956 	IF EXIST $dso.manifest DEL /F /Q $dso.manifest
    957 	cmd /C "\$(LD) \$(LDFLAGS) \$(DSO_LDFLAGS) @<< || (DEL /Q \$(\@B).* $dso_n.* & EXIT 1)"
    958 $objs$target{ld_resp_delim}\$(LDOUTFLAG)$dso$target{ldpostoutflag}$target{ld_resp_delim}$linklibs \$(DSO_EX_LIBS)$target{ld_resp_delim}$shared_def$target{ldresflag}$ress
    959 <<
    960 	IF EXIST $dso.manifest \\
    961 	   \$(MT) \$(MTFLAGS) \$(MTINFLAG)$dso.manifest \$(MTOUTFLAG)$dso
    962 EOF
    963  }
    964  sub obj2lib {
    965      my %args = @_;
    966      my $lib = platform->staticlib($args{lib});
    967      my @objs = map { platform->obj($_) } @{$args{objs}};
    968      my $objs = join($target{ar_resp_delim}, @objs);
    969      my $deps = join(" ", @objs);
    970      return <<"EOF";
    971 $lib: $deps
    972 	\$(AR) \$(ARFLAGS) \$(AROUTFLAG)$lib @<<
    973 $objs
    974 <<
    975 EOF
    976  }
    977  sub obj2bin {
    978      my %args = @_;
    979      my $bin = platform->bin($args{bin});
    980      my @objs = map { platform->convertext($_) }
    981                 grep { platform->isobj($_) }
    982                 @{$args{objs}};
    983      my @ress = map { platform->convertext($_) }
    984                 grep { platform->isres($_) }
    985                 @{$args{objs}};
    986      my @deps = compute_lib_depends(@{$args{deps}});
    987      my $objs = join($target{ld_resp_delim}, @objs);
    988      my $ress = join($target{ld_resp_delim}, @ress);
    989      my $linklibs = join("", map { "$_$target{ld_resp_delim}" } @deps);
    990      my $deps = join(" ", @objs, @ress, @deps);
    991      return <<"EOF";
    992 $bin: $deps
    993 	IF EXIST $bin.manifest DEL /F /Q $bin.manifest
    994 	\$(LD) \$(LDFLAGS) \$(BIN_LDFLAGS) @<<
    995 $objs$target{ld_resp_delim}\$(LDOUTFLAG)$bin$target{ldpostoutflag}$target{ld_resp_delim}$linklibs\$(BIN_EX_LIBS)$target{ldresflag}$target{ldresflag}$ress
    996 <<
    997 	IF EXIST $bin.manifest \\
    998 	   \$(MT) \$(MTFLAGS) \$(MTINFLAG)$bin.manifest \$(MTOUTFLAG)$bin
    999 EOF
   1000   }
   1001   sub in2script {
   1002       my %args = @_;
   1003       my $script = $args{script};
   1004       my $sources = '"'.join('" "', @{$args{sources}}).'"';
   1005       my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
   1006                                            "util", "dofile.pl")),
   1007                            rel2abs($config{builddir}));
   1008       return <<"EOF";
   1009 $script: $sources configdata.pm
   1010 	"\$(PERL)" "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\
   1011 	    "-o$target{build_file}" $sources > \$@
   1012 EOF
   1013   }
   1014   sub generatedir {
   1015       my %args = @_;
   1016       my $dir = $args{dir};
   1017       my @deps = map { platform->convertext($_) } @{$args{deps}};
   1018       my @actions = ();
   1019       my %extinfo = ( dso => platform->dsoext(),
   1020                       lib => platform->libext(),
   1021                       bin => platform->binext() );
   1022 
   1023       # We already have a 'test' target, and the top directory is just plain
   1024       # silly
   1025       return if $dir eq "test" || $dir eq ".";
   1026 
   1027       foreach my $type (("dso", "lib", "bin", "script")) {
   1028           next unless defined($unified_info{dirinfo}->{$dir}->{products}->{$type});
   1029           # For lib object files, we could update the library.  However,
   1030           # LIB on Windows doesn't work that way, so we won't create any
   1031           # actions for it, and the dependencies are already taken care of.
   1032           if ($type ne "lib") {
   1033               foreach my $prod (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) {
   1034                   if (dirname($prod) eq $dir) {
   1035                       push @deps, $prod.$extinfo{$type};
   1036                   }
   1037               }
   1038           }
   1039       }
   1040 
   1041       my $deps = join(" ", @deps);
   1042       my $actions = join("\n", "", @actions);
   1043       return <<"EOF";
   1044 $dir $dir\\ : $deps$actions
   1045 EOF
   1046   }
   1047   ""    # Important!  This becomes part of the template result.
   1048 -}
   1049