windows-makefile.tmpl 29.0 KB
Newer Older
1 2 3 4 5 6
##
## Makefile for OpenSSL
##
## {- join("\n## ", @autowarntext) -}
{-
 our $objext = $target{obj_extension} || ".obj";
7
 our $resext = $target{res_extension} || ".res";
8 9 10 11 12 13 14
 our $depext = $target{dep_extension} || ".d";
 our $exeext = $target{exe_extension} || ".exe";
 our $libext = $target{lib_extension} || ".lib";
 our $shlibext = $target{shared_extension} || ".dll";
 our $shlibextimport = $target{shared_import_extension} || ".lib";
 our $dsoext = $target{dso_extension} || ".dll";

15
 (our $sover_dirname = $config{shlib_version_number}) =~ s|\.|_|g;
16

17 18
 my $build_scheme = $target{build_scheme};
 my $install_flavour = $build_scheme->[$#$build_scheme]; # last element
19
 my $win_installenv =
20 21
     $install_flavour eq "VC-WOW" ? "ProgramFiles(x86)"
                                  : "ProgramW6432";
22
 my $win_commonenv =
23 24
     $install_flavour eq "VC-WOW" ? "CommonProgramFiles(x86)"
                                  : "CommonProgramW6432";
25
 our $win_installroot =
26
     defined($ENV{$win_installenv}) ? $win_installenv : 'ProgramFiles';
27
 our $win_commonroot =
28
     defined($ENV{$win_commonenv}) ? $win_commonenv : 'CommonProgramFiles';
29 30 31 32

 # expand variables early
 $win_installroot = $ENV{$win_installroot};
 $win_commonroot = $ENV{$win_commonroot};
33

34 35
 sub shlib {
     my $lib = shift;
36 37
     return () if $disabled{shared} || $lib =~ /\.a$/;
     return () unless defined $unified_info{sharednames}->{$lib};
38 39 40
     return $unified_info{sharednames}->{$lib} . $shlibext;
 }

41 42 43 44 45
 sub lib {
     (my $lib = shift) =~ s/\.a$//;
     return $lib . $libext;
 }

46 47
 sub shlib_import {
     my $lib = shift;
48
     return () if $disabled{shared} || $lib =~ /\.a$/;
49 50 51 52 53 54 55 56
     return $lib . $shlibextimport;
 }

 sub dso {
     my $dso = shift;

     return $dso . $dsoext;
 }
57 58 59 60 61
 # This makes sure things get built in the order they need
 # to. You're welcome.
 sub dependmagic {
     my $target = shift;

62
     return "$target: build_generated\n\t\$(MAKE) /\$(MAKEFLAGS) depend && \$(MAKE) /\$(MAKEFLAGS) _$target\n_$target";
63
 }
64 65 66 67 68 69 70 71 72 73 74 75 76
 '';
-}

PLATFORM={- $config{target} -}
SRCDIR={- $config{sourcedir} -}
BLDDIR={- $config{builddir} -}

VERSION={- $config{version} -}
MAJOR={- $config{major} -}
MINOR={- $config{minor} -}

SHLIB_VERSION_NUMBER={- $config{shlib_version_number} -}

77
LIBS={- join(" ", map { lib($_) } @{$unified_info{libraries}}) -}
78
SHLIBS={- join(" ", map { shlib($_) } @{$unified_info{libraries}}) -}
79
SHLIBPDBS={- join(" ", map { local $shlibext = ".pdb"; shlib($_) } @{$unified_info{libraries}}) -}
80
ENGINES={- join(" ", map { dso($_) } @{$unified_info{engines}}) -}
81
ENGINEPDBS={- join(" ", map { local $dsoext = ".pdb"; dso($_) } @{$unified_info{engines}}) -}
82
PROGRAMS={- our @PROGRAMS = map { $_.$exeext } @{$unified_info{programs}}; join(" ", @PROGRAMS) -}
83
PROGRAMPDBS={- join(" ", map { $_.".pdb" } @{$unified_info{programs}}) -}
84
SCRIPTS={- join(" ", @{$unified_info{scripts}}) -}
85
{- output_off() if $disabled{makedepend}; "" -}
86 87 88
DEPS={- join(" ", map { (my $x = $_) =~ s|\.o$|$depext|; $x; }
                  grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
                  keys %{$unified_info{sources}}); -}
89
{- output_on() if $disabled{makedepend}; "" -}
90
GENERATED_MANDATORY={- join(" ", @{$unified_info{depends}->{""}} ) -}
91 92 93
GENERATED={- # common0.tmpl provides @generated
             join(" ", map { (my $x = $_) =~ s|\.[sS]$|.asm|; $x }
                       @generated) -}
94

95
INSTALL_LIBS={- join(" ", map { lib($_) } @{$unified_info{install}->{libraries}}) -}
96 97 98 99 100 101 102 103 104 105 106
INSTALL_SHLIBS={- join(" ", map { shlib($_) } @{$unified_info{install}->{libraries}}) -}
INSTALL_SHLIBPDBS={- join(" ", map { local $shlibext = ".pdb"; shlib($_) } @{$unified_info{install}->{libraries}}) -}
INSTALL_ENGINES={- join(" ", map { dso($_) } @{$unified_info{install}->{engines}}) -}
INSTALL_ENGINEPDBS={- join(" ", map { local $dsoext = ".pdb"; dso($_) } @{$unified_info{install}->{engines}}) -}
INSTALL_PROGRAMS={- join(" ", map { $_.$exeext } grep { !m|^test\\| } @{$unified_info{install}->{programs}}) -}
INSTALL_PROGRAMPDBS={- join(" ", map { $_.".pdb" } grep { !m|^test\\| } @{$unified_info{install}->{programs}}) -}
{- output_off() if $disabled{apps}; "" -}
BIN_SCRIPTS=$(BLDDIR)\tools\c_rehash.pl
MISC_SCRIPTS=$(BLDDIR)\apps\CA.pl $(BLDDIR)\apps\tsget.pl
{- output_on() if $disabled{apps}; "" -}

R
Richard Levitte 已提交
107 108 109
APPS_OPENSSL={- use File::Spec::Functions;
                catfile("apps","openssl") -}

110 111
# Do not edit these manually. Use Configure with --prefix or --openssldir
# to change this!  Short explanation in the top comment in Configure
R
Richard Levitte 已提交
112 113 114
INSTALLTOP_dev={- # $prefix is used in the OPENSSLDIR perl snippet
                  #
                  use File::Spec::Functions qw(:DEFAULT splitpath);
115 116
                  our $prefix = canonpath($config{prefix}
                                          || "$win_installroot\\OpenSSL");
R
Richard Levitte 已提交
117
                  our ($prefix_dev, $prefix_dir, $prefix_file) =
118
                      splitpath($prefix, 1);
R
Richard Levitte 已提交
119
                  $prefix_dev -}
120
INSTALLTOP_dir={- canonpath($prefix_dir) -}
R
Richard Levitte 已提交
121 122
OPENSSLDIR_dev={- #
                  # The logic here is that if no --openssldir was given,
123
                  # OPENSSLDIR will get the value "$win_commonroot\\SSL".
R
Richard Levitte 已提交
124 125 126 127 128 129 130
                  # 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 qw(:DEFAULT splitpath);
131
                  our $openssldir =
R
Richard Levitte 已提交
132 133
                      $config{openssldir} ?
                          (file_name_is_absolute($config{openssldir}) ?
134
                               canonpath($config{openssldir})
R
Richard Levitte 已提交
135
                               : catdir($prefix, $config{openssldir}))
136
                          : canonpath("$win_commonroot\\SSL");
R
Richard Levitte 已提交
137 138 139
                  our ($openssldir_dev, $openssldir_dir, $openssldir_file) =
                      splitpath($openssldir, 1);
                  $openssldir_dev -}
140
OPENSSLDIR_dir={- canonpath($openssldir_dir) -}
141
LIBDIR={- our $libdir = $config{libdir} || "lib";
142
          file_name_is_absolute($libdir) ? "" : $libdir -}
R
Richard Levitte 已提交
143
ENGINESDIR_dev={- use File::Spec::Functions qw(:DEFAULT splitpath);
144
                  our $enginesdir = catdir($prefix,$libdir,"engines-$sover_dirname");
R
Richard Levitte 已提交
145 146 147
                  our ($enginesdir_dev, $enginesdir_dir, $enginesdir_file) =
                      splitpath($enginesdir, 1);
                  $enginesdir_dev -}
148
ENGINESDIR_dir={- canonpath($enginesdir_dir) -}
R
Richard Levitte 已提交
149 150 151 152 153 154 155 156 157
!IF "$(DESTDIR)" != ""
INSTALLTOP=$(DESTDIR)$(INSTALLTOP_dir)
OPENSSLDIR=$(DESTDIR)$(OPENSSLDIR_dir)
ENGINESDIR=$(DESTDIR)$(ENGINESDIR_dir)
!ELSE
INSTALLTOP=$(INSTALLTOP_dev)$(INSTALLTOP_dir)
OPENSSLDIR=$(OPENSSLDIR_dev)$(OPENSSLDIR_dir)
ENGINESDIR=$(ENGINESDIR_dev)$(ENGINESDIR_dir)
!ENDIF
158

159 160 161 162
# $(libdir) is chosen to be compatible with the GNU coding standards
libdir={- file_name_is_absolute($libdir)
          ? $libdir : '$(INSTALLTOP)\$(LIBDIR)' -}

163 164 165 166 167 168 169 170 171 172 173 174
##### User defined commands and flags ################################

CC={- $config{CC} -}
CPP={- $config{CPP} -}
CPPFLAGS={- our $cppflags1 = join(" ",
                                  (map { "-D".$_} @{$config{CPPDEFINES}}),
                                  (map { " /I ".$_} @{$config{CPPINCLUDES}}),
                                  @{$config{CPPFLAGS}}) -}
CFLAGS={- join(' ', @{$config{CFLAGS}}) -}
LD={- $config{LD} -}
LDFLAGS={- join(' ', @{$config{LDFLAGS}}) -}
EX_LIBS={- join(' ', @{$config{LDLIBS}}) -}
175 176 177

PERL={- $config{perl} -}

178 179 180 181 182 183 184 185
AR={- $config{AR} -}
ARFLAGS= {- join(' ', @{$config{ARFLAGS}}) -}

MT={- $config{MT} -}
MTFLAGS= {- join(' ', @{$config{MTFLAGS}}) -}

AS={- $config{AS} -}
ASFLAGS={- join(' ', @{$config{ASFLAGS}}) -}
186

187
RC={- $config{RC} -}
188

189 190 191 192 193 194 195
##### Special command flags ##########################################

COUTFLAG={- $target{coutflag} -}$(OSSL_EMPTY)
LDOUTFLAG={- $target{ldoutflag} -}$(OSSL_EMPTY)
AROUTFLAG={- $target{aroutflag} -}$(OSSL_EMPTY)
MTINFLAG={- $target{mtinflag} -}$(OSSL_EMPTY)
MTOUTFLAG={- $target{mtoutflag} -}$(OSSL_EMPTY)
196
ASOUTFLAG={- $target{asoutflag} -}$(OSSL_EMPTY)
197 198 199 200 201 202 203 204 205 206
RCOUTFLAG={- $target{rcoutflag} -}$(OSSL_EMPTY)

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

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

CNF_ASFLAGS={- join(' ', $target{asflags} || (),
                         @{$config{asflags}}) -}
CNF_CPPFLAGS={- our $cppfags2 =
                    join(' ', $target{cppflags} || (),
207 208 209 210
                              (map { '-D'.quotify1($_) } @{$target{defines}},
                                                         @{$config{defines}}),
                              (map { '-I'.quotify1($_) } @{$target{includes}},
                                                         @{$config{includes}}),
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
                              @{$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_ASFLAGS={- join(' ', $target{lib_asflags} || (),
                         @{$config{lib_asflags}},
                         '$(CNF_ASFLAGS)', '$(ASFLAGS)') -}
230 231
LIB_CPPFLAGS={- our $lib_cppflags =
                join(' ', $target{lib_cppflags} || (),
232
                          $target{shared_cppflag} || (),
233
                          (map { '-D'.quotify1($_) }
234 235 236
                               @{$target{lib_defines}},
                               @{$target{shared_defines}},
                               @{$config{lib_defines}},
237
                               @{$config{shared_defines}}),
238
                          (map { '-I'.quotify1($_) }
239 240 241 242 243
                               @{$target{lib_includes}},
                               @{$target{shared_includes}},
                               @{$config{lib_includes}},
                               @{$config{shared_includes}}),
                          @{$config{lib_cppflags}},
244 245
                          @{$config{shared_cppflag}});
                join(' ', $lib_cppflags,
246
                          (map { '-D'.quotify1($_) }
247 248
                               "OPENSSLDIR=\"$openssldir\"",
                               "ENGINESDIR=\"$enginesdir\""),
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
                          '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
LIB_CFLAGS={- join(' ', $target{lib_cflags} || (),
                        $target{shared_cflag} || (),
                        @{$config{lib_cflags}},
                        @{$config{shared_cflag}},
                        '$(CNF_CFLAGS)', '$(CFLAGS)') -}
LIB_LDFLAGS={- join(' ', $target{shared_ldflag} || (),
                         $config{shared_ldflag} || (),
                         '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
LIB_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS)
DSO_ASFLAGS={- join(' ', $target{dso_asflags} || (),
                         $target{module_asflags} || (),
                         @{$config{dso_asflags}},
                         @{$config{module_asflags}},
                         '$(CNF_ASFLAGS)', '$(ASFLAGS)') -}
DSO_CPPFLAGS={- join(' ', $target{dso_cppflags} || (),
                          $target{module_cppflags} || (),
                          @{$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_LDFLAGS={- join(' ', $target{dso_lflags} || (),
                         $target{module_ldflags} || (),
                         @{$config{dso_lflags}},
                         @{$config{module_ldflags}},
                         '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
DSO_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS)
BIN_ASFLAGS={- join(' ', $target{bin_asflags} || (),
                         @{$config{bin_asflags}},
                         '$(CNF_ASFLAGS)', '$(ASFLAGS)') -}
BIN_CPPFLAGS={- join(' ', $target{bin_cppflags} || (),
                          @{$config{bin_cppflags}},
                          '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
BIN_CFLAGS={- join(' ', $target{bin_cflags} || (),
                        @{$config{bin_cflags}},
                        '$(CNF_CFLAGS)', '$(CFLAGS)') -}
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;
297 298
              join(' ', $lib_cppflags || (), $cppflags2 || (),
                        $cppflags1 || ()) -}
299

300 301 302 303 304 305
PERLASM_SCHEME= {- $target{perlasm_scheme} -}

PROCESSOR= {- $config{processor} -}

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

306 307 308 309
{- dependmagic('all'); -}: build_libs_nodep build_engines_nodep build_programs_nodep
{- dependmagic('build_libs'); -}: build_libs_nodep
{- dependmagic('build_engines'); -}: build_engines_nodep
{- dependmagic('build_programs'); -}: build_programs_nodep
310

311
build_generated: $(GENERATED_MANDATORY)
312
build_libs_nodep: $(LIBS) {- join(" ",map { shlib_import($_) } @{$unified_info{libraries}}) -}
313
build_engines_nodep: $(ENGINES)
314
build_programs_nodep: $(PROGRAMS) $(SCRIPTS)
315

316 317 318
# Kept around for backward compatibility
build_apps build_tests: build_programs

319 320 321 322
# Convenience target to prebuild all generated files, not just the mandatory
# ones
build_all_generated: $(GENERATED_MANDATORY) $(GENERATED)

323
test: tests
324
{- dependmagic('tests'); -}: build_programs_nodep build_engines_nodep
M
Matt Caswell 已提交
325
	@rem {- output_off() if $disabled{tests}; "" -}
326
	-mkdir $(BLDDIR)\test\test-runs
327 328
	set SRCTOP=$(SRCDIR)
	set BLDTOP=$(BLDDIR)
329
	set RESULT_D=$(BLDDIR)\test\test-runs
330
	set PERL=$(PERL)
B
Bernd Edlinger 已提交
331
	set OPENSSL_ENGINES=$(MAKEDIR)\engines
332
	set OPENSSL_DEBUG_MEMORY=on
333
	"$(PERL)" "$(SRCDIR)\test\run_tests.pl" $(TESTS)
M
Matt Caswell 已提交
334 335 336
	@rem {- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -}
	@echo "Tests are not supported with your chosen Configure options"
	@rem {- output_on() if !$disabled{tests}; "" -}
337 338

list-tests:
339 340
	@rem {- output_off() if $disabled{tests}; "" -}
	@set SRCTOP=$(SRCDIR)
341
	@"$(PERL)" "$(SRCDIR)\test\run_tests.pl" list
342 343 344
	@rem {- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -}
	@echo "Tests are not supported with your chosen Configure options"
	@rem {- output_on() if !$disabled{tests}; "" -}
345

346 347 348 349
install: install_sw install_ssldirs install_docs

uninstall: uninstall_docs uninstall_sw

350
libclean:
351 352
	"$(PERL)" -e "map { m/(.*)\.dll$$/; unlink glob """{.,apps,test,fuzz}/$$1.*"""; } @ARGV" $(SHLIBS)
	-del /Q /F $(LIBS) libcrypto.* libssl.* ossl_static.pdb
353 354

clean: libclean
355 356 357
	{- join("\n\t", map { "-del /Q /F $_" } @PROGRAMS) -}
	-del /Q /F $(ENGINES)
	-del /Q /F $(SCRIPTS)
358
	-del /Q /F $(GENERATED)
359
	-del /Q /S /F *.d *.obj *.pdb *.exp *.ilk *.manifest
360
	-del /Q /S /F engines\*.lib
361
	-del /Q /S /F apps\*.lib apps\*.rc apps\*.res
362

363 364 365 366
distclean: clean
	-del /Q /F configdata.pm
	-del /Q /F makefile

367
depend:
R
Richard Levitte 已提交
368
	@ rem {- output_off() if $disabled{makedepend}; "" -}
369
	@ "$(PERL)" "$(SRCDIR)\util\add-depends.pl" "VC"
R
Richard Levitte 已提交
370
	@ rem {- output_on() if $disabled{makedepend}; "" -}
371

372 373 374 375 376 377
# Install helper targets #############################################

install_sw: all install_dev install_engines install_runtime

uninstall_sw: uninstall_runtime uninstall_engines uninstall_dev

378
install_docs: install_html_docs
379

380
uninstall_docs: uninstall_html_docs
381 382

install_ssldirs:
R
Richard Levitte 已提交
383 384 385
	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(OPENSSLDIR)\certs"
	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(OPENSSLDIR)\private"
	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(OPENSSLDIR)\misc"
386
	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\openssl.cnf" \
387 388 389 390
                                        "$(OPENSSLDIR)\openssl.cnf.dist"
	@IF NOT EXIST "$(OPENSSLDIR)\openssl.cnf" \
         "$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\openssl.cnf" \
                                        "$(OPENSSLDIR)\openssl.cnf"
391
	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(MISC_SCRIPTS) \
R
Richard Levitte 已提交
392
                                        "$(OPENSSLDIR)\misc"
R
Rich Salz 已提交
393 394 395 396 397
	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\ct_log_list.cnf" \
                                        "$(OPENSSLDIR)\ct_log_list.cnf.dist"
	@IF NOT EXIST "$(OPENSSLDIR)\ct_log_list.cnf" \
         "$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\ct_log_list.cnf" \
                                        "$(OPENSSLDIR)\ct_log_list.cnf"
398 399 400 401

install_dev:
	@if "$(INSTALLTOP)"=="" ( echo INSTALLTOP should not be empty & exit 1 )
	@echo *** Installing development files
R
Richard Levitte 已提交
402
	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\include\openssl"
403
	@rem {- output_off() unless grep { $_ eq "OPENSSL_USE_APPLINK" } @{$config{defines}}; "" -}
404 405
	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\ms\applink.c" \
				       "$(INSTALLTOP)\include\openssl"
406
	@rem {- output_on() unless grep { $_ eq "OPENSSL_USE_APPLINK" } @{$config{defines}}; "" -}
407
	@"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\include\openssl\*.h" \
R
Richard Levitte 已提交
408
				       "$(INSTALLTOP)\include\openssl"
409
	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BLDDIR)\include\openssl\*.h \
R
Richard Levitte 已提交
410
				       "$(INSTALLTOP)\include\openssl"
411 412
	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(libdir)"
	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_LIBS) "$(libdir)"
413
	@if "$(SHLIBS)"=="" \
414
	 "$(PERL)" "$(SRCDIR)\util\copy.pl" ossl_static.pdb "$(libdir)"
415 416 417 418 419 420

uninstall_dev:

install_engines:
	@if "$(INSTALLTOP)"=="" ( echo INSTALLTOP should not be empty & exit 1 )
	@echo *** Installing engines
R
Richard Levitte 已提交
421
	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(ENGINESDIR)"
422
	@if not "$(ENGINES)"=="" \
423
	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_ENGINES) "$(ENGINESDIR)"
424
	@if not "$(ENGINES)"=="" \
425
	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_ENGINEPDBS) "$(ENGINESDIR)"
426 427 428 429 430 431

uninstall_engines:

install_runtime:
	@if "$(INSTALLTOP)"=="" ( echo INSTALLTOP should not be empty & exit 1 )
	@echo *** Installing runtime files
R
Richard Levitte 已提交
432
	@"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\bin"
433
	@if not "$(SHLIBS)"=="" \
434
	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_SHLIBS) "$(INSTALLTOP)\bin"
435
	@if not "$(SHLIBS)"=="" \
436
	 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_SHLIBPDBS) \
R
Richard Levitte 已提交
437
                                        "$(INSTALLTOP)\bin"
438
	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_PROGRAMS) \
R
Richard Levitte 已提交
439
                                        "$(INSTALLTOP)\bin"
440
	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_PROGRAMPDBS) \
R
Richard Levitte 已提交
441
                                        "$(INSTALLTOP)\bin"
442
	@"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BIN_SCRIPTS) \
R
Richard Levitte 已提交
443
                                        "$(INSTALLTOP)\bin"
444 445 446

uninstall_runtime:

447 448
install_html_docs:
        "$(PERL)" "$(SRCDIR)\util\process_docs.pl" \
R
Richard Levitte 已提交
449
                "--destdir=$(INSTALLTOP)\html" --type=html
450 451 452

uninstall_html_docs:

453 454
# Building targets ###################################################

455
configdata.pm: "$(SRCDIR)\Configure" {- join(" ", map { '"'.$_.'"' } @{$config{build_file_templates}}, @{$config{build_infos}}, @{$config{conf_files}}) -}
456
	@echo "Detected changed: $?"
457
	"$(PERL)" configdata.pm -r
458 459 460 461 462
	@echo "**************************************************"
	@echo "***                                            ***"
	@echo "***   Please run the same make command again   ***"
	@echo "***                                            ***"
	@echo "**************************************************"
A
Andy Polyakov 已提交
463
	@exit 1
464

465
reconfigure reconf:
466
	"$(PERL)" configdata.pm -r
467

468 469 470 471 472 473 474 475
{-
 use File::Basename;
 use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;

 # Helper function to figure out dependencies on libraries
 # It takes a list of library names and outputs a list of dependencies
 sub compute_lib_depends {
     if ($disabled{shared}) {
476
	 return map { lib($_) } @_;
477
     }
478 479 480 481 482 483
     foreach (@_) {
         (my $l = $_) =~ s/\.a$//;
         die "Linking with static variants of shared libraries is not supported in this configuration\n"
             if $l ne $_ && shlib($l);
     }
     return map { shlib_import($_) or lib($_) } @_;
484 485
 }

486 487 488
  sub generatesrc {
      my %args = @_;
      (my $target = $args{src}) =~ s/\.[sS]$/.asm/;
489 490
      my ($gen0, @gens) = @{$args{generator}};
      my $generator = '"'.$gen0.'"'.join('', map { " $_" } @gens);
491 492 493 494
      my $generator_incs = join("", map { " -I \"$_\"" } @{$args{generator_incs}});
      my $incs = join("", map { " /I \"$_\"" } @{$args{incs}});
      my $deps = @{$args{deps}} ?
          '"'.join('" "', @{$args{generator_deps}}, @{$args{deps}}).'"' : '';
495 496

      if ($target !~ /\.asm$/) {
497 498 499 500 501 502 503 504 505 506 507
          if ($args{generator}->[0] =~ m|^.*\.in$|) {
              my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
                                                   "util", "dofile.pl")),
                                   rel2abs($config{builddir}));
              return <<"EOF";
$target: "$args{generator}->[0]" $deps
	"\$(PERL)" "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\
	    "-o$target{build_file}" $generator > \$@
EOF
	  } else {
              return <<"EOF";
508 509
$target: "$args{generator}->[0]" $deps
	"\$(PERL)"$generator_incs $generator > \$@
510
EOF
511
	  }
512 513
      } else {
          if ($args{generator}->[0] =~ /\.pl$/) {
514
              $generator = '"$(PERL)"'.$generator_incs.' '.$generator;
515 516 517 518 519 520
          } elsif ($args{generator}->[0] =~ /\.S$/) {
              $generator = undef;
          } else {
              die "Generator type for $src unknown: $generator\n";
          }

521
          my $cppflags = $incs;
522 523 524 525 526
          $cppflags .= {
              lib => ' $(LIB_CFLAGS) $(LIB_CPPFLAGS)',
              dso => ' $(DSO_CFLAGS) $(DSO_CPPFLAGS)',
              bin => ' $(BIN_CFLAGS) $(BIN_CPPFLAGS)'
          } -> {$args{intent}};
527 528 529 530 531
          if (defined($generator)) {
              # If the target is named foo.S in build.info, we want to
              # end up generating foo.s in two steps.
              if ($args{src} =~ /\.S$/) {
                   return <<"EOF";
532
$target: "$args{generator}->[0]" $deps
533 534
	set ASM=\$(AS)
	$generator \$@.S
R
Richard Levitte 已提交
535
	\$(CPP) $cppflags \$@.S > \$@.i && move /Y \$@.i \$@
536 537 538 539 540
        del /Q \$@.S
EOF
              }
              # Otherwise....
              return <<"EOF";
541
$target: "$args{generator}->[0]" $deps
542 543 544 545 546
	set ASM=\$(AS)
	$generator \$@
EOF
          }
          return <<"EOF";
547
$target: "$args{generator}->[0]" $deps
R
Richard Levitte 已提交
548
	\$(CPP) $incs $cppflags "$args{generator}->[0]" > \$@.i && move /Y \$@.i \$@
549 550 551 552
EOF
      }
  }

553 554
 sub src2obj {
     my %args = @_;
A
Andy Polyakov 已提交
555 556
     my @srcs = map { (my $x = $_) =~ s/\.s$/.asm/; $x
                    } ( @{$args{srcs}} );
557 558 559
     my $srcs = '"'.join('" "',  @srcs).'"';
     my $deps = '"'.join('" "', @srcs, @{$args{deps}}).'"';
     my $incs = join("", map { ' /I "'.$_.'"' } @{$args{incs}});
560 561 562
     my $cflags = { lib => ' $(LIB_CFLAGS)',
		    dso => ' $(DSO_CFLAGS)',
		    bin => ' $(BIN_CFLAGS)' } -> {$args{intent}};
563 564 565 566
     $cflags .= $incs;
     $cflags .= { lib => ' $(LIB_CPPFLAGS)',
		  dso => ' $(DSO_CPPFLAGS)',
		  bin => ' $(BIN_CPPFLAGS)' } -> {$args{intent}};
567 568 569
     my $asflags = { lib => ' $(LIB_ASFLAGS)',
		     dso => ' $(DSO_ASFLAGS)',
		     bin => ' $(BIN_ASFLAGS)' } -> {$args{intent}};
570
     my $makedepprog = $config{makedepprog};
571 572 573 574 575 576 577
     if ($srcs[0] =~ /\.rc$/) {
         return <<"EOF";
$args{obj}: $deps
	\$(RC) \$(RCOUTFLAG)\$\@ $srcs
EOF
     }
     (my $obj = $args{obj}) =~ s|\.o$||;
578 579 580
     if ($srcs[0] =~ /\.asm$/) {
         return <<"EOF";
$obj$objext: $deps
581
	\$(AS) $asflags \$(ASOUTFLAG)\$\@ $srcs
582 583
EOF
     }
584
     return <<"EOF"	if (!$disabled{makedepend});
585
$obj$depext: $deps
586
	\$(CC) $cflags /Zs /showIncludes $srcs 2>&1 > $obj$depext
587
$obj$objext: $obj$depext
588
	\$(CC) $cflags -c \$(COUTFLAG)\$\@ $srcs
589 590 591
EOF
    return <<"EOF"	if ($disabled{makedepend});
$obj$objext: $deps
592
	\$(CC) $cflags -c \$(COUTFLAG)\$\@ $srcs
593 594 595 596 597 598 599 600 601 602
EOF
 }

 # On Unix, we build shlibs from static libs, so we're ignoring the
 # object file array.  We *know* this routine is only called when we've
 # configure 'shared'.
 sub libobj2shlib {
     my %args = @_;
     my $lib = $args{lib};
     my $shlib = $args{shlib};
603
     my @objs = map { (my $x = $_) =~ s|\.o$|$objext|; $x }
604
                grep { $_ =~ m/\.(?:o|res)$/ }
605 606 607 608 609 610 611
                @{$args{objs}};
     my @defs = grep { $_ =~ /\.def$/ } @{$args{objs}};
     my @deps = compute_lib_depends(@{$args{deps}});
     die "More than one exported symbols list" if scalar @defs > 1;
     my $linklibs = join("", map { "$_\n" } @deps);
     my $objs = join("\n", @objs);
     my $deps = join(" ", @objs, @defs, @deps);
612
     my $target = shlib_import($lib);
613
     my $shared_def = join("", map { " /def:$_" } @defs);
614
     return <<"EOF"
615
$target: $deps
616
	IF EXIST $shlib$shlibext.manifest DEL /F /Q $shlib$shlibext.manifest
617
	\$(LD) \$(LDFLAGS) \$(LIB_LDFLAGS) \\
618 619
		/implib:\$@ \$(LDOUTFLAG)$shlib$shlibext$shared_def @<< || (DEL /Q \$(\@B).* $shlib.* && EXIT 1)
$objs
620
$linklibs\$(LIB_EX_LIBS)
621
<<
622
	IF EXIST $shlib$shlibext.manifest \\
623
	   \$(MT) \$(MTFLAGS) \$(MTINFLAG)$shlib$shlibext.manifest \$(MTOUTFLAG)$shlib$shlibext
R
Richard Levitte 已提交
624 625
	IF EXIST apps\\$shlib$shlibext DEL /Q /F apps\\$shlib$shlibext
	IF EXIST test\\$shlib$shlibext DEL /Q /F test\\$shlib$shlibext
M
Matt Caswell 已提交
626
	IF EXIST fuzz\\$shlib$shlibext DEL /Q /F fuzz\\$shlib$shlibext
627 628
	COPY $shlib$shlibext apps
	COPY $shlib$shlibext test
M
Matt Caswell 已提交
629
	COPY $shlib$shlibext fuzz
630 631 632 633 634
EOF
 }
 sub obj2dso {
     my %args = @_;
     my $dso = $args{lib};
635
     my $dso_n = basename($dso);
636 637 638 639 640
     my @objs = map { (my $x = $_) =~ s|\.o$|$objext|; $x } @{$args{objs}};
     my @deps = compute_lib_depends(@{$args{deps}});
     my $objs = join("\n", @objs);
     my $linklibs = join("", map { "$_\n" } @deps);
     my $deps = join(" ", @objs, @deps);
641 642
     return <<"EOF";
$dso$dsoext: $deps
643
	IF EXIST $dso$dsoext.manifest DEL /F /Q $dso$dsoext.manifest
644 645
	\$(LD) \$(LDFLAGS) \$(DSO_LDFLAGS) \$(LDOUTFLAG)$dso$dsoext /def:<< @<<
LIBRARY         $dso_n
646 647 648 649
EXPORTS
    bind_engine		@1
    v_check		@2
<<
650
$objs
651
$linklibs \$(DSO_EX_LIBS)
652
<<
653
	IF EXIST $dso$dsoext.manifest \\
654
	   \$(MT) \$(MTFLAGS) \$(MTINFLAG)$dso$dsoext.manifest \$(MTOUTFLAG)$dso$dsoext
655 656 657
EOF
 }
 sub obj2lib {
658 659 660
     my %args = @_;
     my $lib = $args{lib};

661 662 663
     # Because static libs and import libs are both named the same in native
     # Windows, we can't have both.  We skip the static lib in that case,
     # as the shared libs are what we use anyway.
664
     return "" unless $disabled{"shared"} || $lib =~ /\.a$/;
665

666
     $lib =~ s/\.a$//;
667 668 669
     my @objs = map { (my $x = $_) =~ s|\.o$|$objext|; $x } @{$args{objs}};
     my $objs = join("\n", @objs);
     my $deps = join(" ", @objs);
670 671 672
     return <<"EOF";
$lib$libext: $deps
	\$(AR) \$(ARFLAGS) \$(AROUTFLAG)$lib$libext @<<
673
$objs
674 675 676 677 678 679
<<
EOF
 }
 sub obj2bin {
     my %args = @_;
     my $bin = $args{bin};
680 681 682 683 684
     my @objs = map { (my $x = $_) =~ s|\.o$|$objext|; $x } @{$args{objs}};
     my @deps = compute_lib_depends(@{$args{deps}});
     my $objs = join("\n", @objs);
     my $linklibs = join("", map { "$_\n" } @deps);
     my $deps = join(" ", @objs, @deps);
685 686
     return <<"EOF";
$bin$exeext: $deps
687
	IF EXIST $bin$exeext.manifest DEL /F /Q $bin$exeext.manifest
688
	\$(LD) \$(LDFLAGS) \$(BIN_LDFLAGS) \$(LDOUTFLAG)$bin$exeext @<<
689 690
$objs
setargv.obj
691
$linklibs\$(BIN_EX_LIBS)
692
<<
693
	IF EXIST $bin$exeext.manifest \\
694
	   \$(MT) \$(MTFLAGS) \$(MTINFLAG)$bin$exeext.manifest \$(MTOUTFLAG)$bin$exeext
695 696 697 698 699
EOF
  }
  sub in2script {
      my %args = @_;
      my $script = $args{script};
700
      my $sources = '"'.join('" "', @{$args{sources}}).'"';
701 702 703 704 705
      my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
                                           "util", "dofile.pl")),
                           rel2abs($config{builddir}));
      return <<"EOF";
$script: $sources
706
	"\$(PERL)" "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\
707
	    "-o$target{build_file}" $sources > "$script"
708 709 710 711 712 713 714 715 716 717 718 719 720
EOF
  }
  sub generatedir {
      my %args = @_;
      my $dir = $args{dir};
      my @deps = map { s|\.o$|$objext|; $_ } @{$args{deps}};
      my @actions = ();
      my %extinfo = ( dso => $dsoext,
                      lib => $libext,
                      bin => $exeext );

      foreach my $type (("dso", "lib", "bin", "script")) {
          next unless defined($unified_info{dirinfo}->{$dir}->{products}->{$type});
721 722 723 724
          # For lib object files, we could update the library.  However,
          # LIB on Windows doesn't work that way, so we won't create any
          # actions for it, and the dependencies are already taken care of.
          if ($type ne "lib") {
725 726 727 728
              foreach my $prod (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) {
                  if (dirname($prod) eq $dir) {
                      push @deps, $prod.$extinfo{$type};
                  } else {
729
                      push @actions, "\t@rem No support to produce $type ".join(", ", @{$unified_info{dirinfo}->{$dir}->{products}->{$type}});
730 731 732 733 734 735 736 737 738
                  }
              }
          }
      }

      my $deps = join(" ", @deps);
      my $actions = join("\n", "", @actions);
      return <<"EOF";
$args{dir} $args{dir}\\ : $deps$actions
739 740 741 742
EOF
  }
  ""    # Important!  This becomes part of the template result.
-}