1## 2## Makefile for OpenSSL 3## 4## {- join("\n## ", @autowarntext) -} 5{- 6 our $objext = $target{obj_extension} || ".obj"; 7 our $resext = $target{res_extension} || ".res"; 8 our $depext = $target{dep_extension} || ".d"; 9 our $exeext = $target{exe_extension} || ".exe"; 10 our $libext = $target{lib_extension} || ".lib"; 11 our $shlibext = $target{shared_extension} || ".dll"; 12 our $shlibextimport = $target{shared_import_extension} || ".lib"; 13 our $dsoext = $target{dso_extension} || ".dll"; 14 15 (our $sover_dirname = $config{shlib_version_number}) =~ s|\.|_|g; 16 17 my $build_scheme = $target{build_scheme}; 18 my $install_flavour = $build_scheme->[$#$build_scheme]; # last element 19 my $win_installenv = 20 $install_flavour eq "VC-WOW" ? "ProgramFiles(x86)" 21 : "ProgramW6432"; 22 my $win_commonenv = 23 $install_flavour eq "VC-WOW" ? "CommonProgramFiles(x86)" 24 : "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 # expand variables early 31 $win_installroot = $ENV{$win_installroot}; 32 $win_commonroot = $ENV{$win_commonroot}; 33 34 sub shlib { 35 my $lib = shift; 36 return () if $disabled{shared} || $lib =~ /\.a$/; 37 return () unless defined $unified_info{sharednames}->{$lib}; 38 return $unified_info{sharednames}->{$lib} . $shlibext; 39 } 40 41 sub lib { 42 (my $lib = shift) =~ s/\.a$//; 43 $lib .= '_static' 44 if (defined $unified_info{sharednames}->{$lib}); 45 return $lib . $libext; 46 } 47 48 sub shlib_import { 49 my $lib = shift; 50 return () if $disabled{shared} || $lib =~ /\.a$/; 51 return $lib . $shlibextimport; 52 } 53 54 sub dso { 55 my $dso = shift; 56 57 return $dso . $dsoext; 58 } 59 # This makes sure things get built in the order they need 60 # to. You're welcome. 61 sub dependmagic { 62 my $target = shift; 63 64 return "$target: build_generated\n\t\$(MAKE) /\$(MAKEFLAGS) depend && \$(MAKE) /\$(MAKEFLAGS) _$target\n_$target"; 65 } 66 ''; 67-} 68 69PLATFORM={- $config{target} -} 70SRCDIR={- $config{sourcedir} -} 71BLDDIR={- $config{builddir} -} 72 73VERSION={- $config{version} -} 74MAJOR={- $config{major} -} 75MINOR={- $config{minor} -} 76 77SHLIB_VERSION_NUMBER={- $config{shlib_version_number} -} 78 79LIBS={- join(" ", map { ( shlib_import($_), lib($_) ) } @{$unified_info{libraries}}) -} 80SHLIBS={- join(" ", map { shlib($_) } @{$unified_info{libraries}}) -} 81SHLIBPDBS={- join(" ", map { local $shlibext = ".pdb"; shlib($_) } @{$unified_info{libraries}}) -} 82ENGINES={- join(" ", map { dso($_) } @{$unified_info{engines}}) -} 83ENGINEPDBS={- join(" ", map { local $dsoext = ".pdb"; dso($_) } @{$unified_info{engines}}) -} 84PROGRAMS={- our @PROGRAMS = map { $_.$exeext } @{$unified_info{programs}}; join(" ", @PROGRAMS) -} 85PROGRAMPDBS={- join(" ", map { $_.".pdb" } @{$unified_info{programs}}) -} 86SCRIPTS={- join(" ", @{$unified_info{scripts}}) -} 87{- output_off() if $disabled{makedepend}; "" -} 88DEPS={- join(" ", map { (my $x = $_) =~ s|\.o$|$depext|; $x; } 89 grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ } 90 keys %{$unified_info{sources}}); -} 91{- output_on() if $disabled{makedepend}; "" -} 92GENERATED_MANDATORY={- join(" ", @{$unified_info{depends}->{""}} ) -} 93GENERATED={- # common0.tmpl provides @generated 94 join(" ", map { (my $x = $_) =~ s|\.[sS]$|.asm|; $x } 95 @generated) -} 96 97INSTALL_LIBS={- join(" ", map { quotify1(shlib_import($_) or lib($_)) } @{$unified_info{install}->{libraries}}) -} 98INSTALL_SHLIBS={- join(" ", map { quotify_l(shlib($_)) } @{$unified_info{install}->{libraries}}) -} 99INSTALL_SHLIBPDBS={- join(" ", map { local $shlibext = ".pdb"; quotify_l(shlib($_)) } @{$unified_info{install}->{libraries}}) -} 100INSTALL_ENGINES={- join(" ", map { quotify1(dso($_)) } @{$unified_info{install}->{engines}}) -} 101INSTALL_ENGINEPDBS={- join(" ", map { local $dsoext = ".pdb"; quotify1(dso($_)) } @{$unified_info{install}->{engines}}) -} 102INSTALL_PROGRAMS={- join(" ", map { quotify1($_.$exeext) } grep { !m|^test\\| } @{$unified_info{install}->{programs}}) -} 103INSTALL_PROGRAMPDBS={- join(" ", map { quotify1($_.".pdb") } grep { !m|^test\\| } @{$unified_info{install}->{programs}}) -} 104{- output_off() if $disabled{apps}; "" -} 105BIN_SCRIPTS="$(BLDDIR)\tools\c_rehash.pl" 106MISC_SCRIPTS="$(BLDDIR)\apps\CA.pl" "$(BLDDIR)\apps\tsget.pl" 107{- output_on() if $disabled{apps}; "" -} 108 109APPS_OPENSSL={- use File::Spec::Functions; 110 "\"".catfile("apps","openssl")."\"" -} 111 112# Do not edit these manually. Use Configure with --prefix or --openssldir 113# to change this! Short explanation in the top comment in Configure 114INSTALLTOP_dev={- # $prefix is used in the OPENSSLDIR perl snippet 115 # 116 use File::Spec::Functions qw(:DEFAULT splitpath); 117 our $prefix = canonpath($config{prefix} 118 || "$win_installroot\\OpenSSL"); 119 our ($prefix_dev, $prefix_dir, $prefix_file) = 120 splitpath($prefix, 1); 121 $prefix_dev -} 122INSTALLTOP_dir={- canonpath($prefix_dir) -} 123OPENSSLDIR_dev={- # 124 # The logic here is that if no --openssldir was given, 125 # OPENSSLDIR will get the value "$win_commonroot\\SSL". 126 # If --openssldir was given and the value is an absolute 127 # path, OPENSSLDIR will get its value without change. 128 # If the value from --openssldir is a relative path, 129 # OPENSSLDIR will get $prefix with the --openssldir 130 # value appended as a subdirectory. 131 # 132 use File::Spec::Functions qw(:DEFAULT splitpath); 133 our $openssldir = 134 $config{openssldir} ? 135 (file_name_is_absolute($config{openssldir}) ? 136 canonpath($config{openssldir}) 137 : catdir($prefix, $config{openssldir})) 138 : canonpath("$win_commonroot\\SSL"); 139 our ($openssldir_dev, $openssldir_dir, $openssldir_file) = 140 splitpath($openssldir, 1); 141 $openssldir_dev -} 142OPENSSLDIR_dir={- canonpath($openssldir_dir) -} 143LIBDIR={- our $libdir = $config{libdir} || "lib"; 144 file_name_is_absolute($libdir) ? "" : $libdir -} 145ENGINESDIR_dev={- use File::Spec::Functions qw(:DEFAULT splitpath); 146 our $enginesdir = catdir($prefix,$libdir,"engines-$sover_dirname"); 147 our ($enginesdir_dev, $enginesdir_dir, $enginesdir_file) = 148 splitpath($enginesdir, 1); 149 $enginesdir_dev -} 150ENGINESDIR_dir={- canonpath($enginesdir_dir) -} 151!IF "$(DESTDIR)" != "" 152INSTALLTOP=$(DESTDIR)$(INSTALLTOP_dir) 153OPENSSLDIR=$(DESTDIR)$(OPENSSLDIR_dir) 154ENGINESDIR=$(DESTDIR)$(ENGINESDIR_dir) 155!ELSE 156INSTALLTOP=$(INSTALLTOP_dev)$(INSTALLTOP_dir) 157OPENSSLDIR=$(OPENSSLDIR_dev)$(OPENSSLDIR_dir) 158ENGINESDIR=$(ENGINESDIR_dev)$(ENGINESDIR_dir) 159!ENDIF 160 161# $(libdir) is chosen to be compatible with the GNU coding standards 162libdir={- file_name_is_absolute($libdir) 163 ? $libdir : '$(INSTALLTOP)\$(LIBDIR)' -} 164 165##### User defined commands and flags ################################ 166 167CC={- $config{CC} -} 168CPP={- $config{CPP} -} 169CPPFLAGS={- our $cppflags1 = join(" ", 170 (map { "-D".$_} @{$config{CPPDEFINES}}), 171 (map { " /I ".$_} @{$config{CPPINCLUDES}}), 172 @{$config{CPPFLAGS}}) -} 173CFLAGS={- join(' ', @{$config{CFLAGS}}) -} 174LD={- $config{LD} -} 175LDFLAGS={- join(' ', @{$config{LDFLAGS}}) -} 176EX_LIBS={- join(' ', @{$config{LDLIBS}}) -} 177 178PERL={- $config{PERL} -} 179 180AR={- $config{AR} -} 181ARFLAGS= {- join(' ', @{$config{ARFLAGS}}) -} 182 183MT={- $config{MT} -} 184MTFLAGS= {- join(' ', @{$config{MTFLAGS}}) -} 185 186AS={- $config{AS} -} 187ASFLAGS={- join(' ', @{$config{ASFLAGS}}) -} 188 189RC={- $config{RC} -} 190RCFLAGS={- join(' ', @{$config{RCFLAGS}}) -} 191 192ECHO="$(PERL)" "$(SRCDIR)\util\echo.pl" 193 194##### Special command flags ########################################## 195 196COUTFLAG={- $target{coutflag} -}$(OSSL_EMPTY) 197LDOUTFLAG={- $target{ldoutflag} -}$(OSSL_EMPTY) 198AROUTFLAG={- $target{aroutflag} -}$(OSSL_EMPTY) 199MTINFLAG={- $target{mtinflag} -}$(OSSL_EMPTY) 200MTOUTFLAG={- $target{mtoutflag} -}$(OSSL_EMPTY) 201ASOUTFLAG={- $target{asoutflag} -}$(OSSL_EMPTY) 202RCOUTFLAG={- $target{rcoutflag} -}$(OSSL_EMPTY) 203 204##### Project flags ################################################## 205 206# Variables starting with CNF_ are common variables for all product types 207 208CNF_ASFLAGS={- join(' ', $target{asflags} || (), 209 @{$config{asflags}}) -} 210CNF_CPPFLAGS={- our $cppfags2 = 211 join(' ', $target{cppflags} || (), 212 (map { '-D'.quotify1($_) } @{$target{defines}}, 213 @{$config{defines}}), 214 (map { '-I'.'"'.$_.'"' } @{$target{includes}}, 215 @{$config{includes}}), 216 @{$config{cppflags}}) -} 217CNF_CFLAGS={- join(' ', $target{cflags} || (), 218 @{$config{cflags}}) -} 219CNF_CXXFLAGS={- join(' ', $target{cxxflags} || (), 220 @{$config{cxxflags}}) -} 221CNF_LDFLAGS={- join(' ', $target{lflags} || (), 222 @{$config{lflags}}) -} 223CNF_EX_LIBS={- join(' ', $target{ex_libs} || (), 224 @{$config{ex_libs}}) -} 225 226# Variables starting with LIB_ are used to build library object files 227# and shared libraries. 228# Variables starting with DSO_ are used to build DSOs and their object files. 229# Variables starting with BIN_ are used to build programs and their object 230# files. 231 232LIB_ASFLAGS={- join(' ', $target{lib_asflags} || (), 233 @{$config{lib_asflags}}, 234 '$(CNF_ASFLAGS)', '$(ASFLAGS)') -} 235LIB_CPPFLAGS={- our $lib_cppflags = 236 join(' ', $target{lib_cppflags} || (), 237 $target{shared_cppflag} || (), 238 (map { '-D'.quotify1($_) } 239 @{$target{lib_defines}}, 240 @{$target{shared_defines}}, 241 @{$config{lib_defines}}, 242 @{$config{shared_defines}}), 243 (map { '-I'.quotify1($_) } 244 @{$target{lib_includes}}, 245 @{$target{shared_includes}}, 246 @{$config{lib_includes}}, 247 @{$config{shared_includes}}), 248 @{$config{lib_cppflags}}, 249 @{$config{shared_cppflag}}); 250 join(' ', $lib_cppflags, 251 (map { '-D'.quotify1($_) } 252 "OPENSSLDIR=\"$openssldir\"", 253 "ENGINESDIR=\"$enginesdir\""), 254 '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -} 255LIB_CFLAGS={- join(' ', $target{lib_cflags} || (), 256 $target{shared_cflag} || (), 257 @{$config{lib_cflags}}, 258 @{$config{shared_cflag}}, 259 '$(CNF_CFLAGS)', '$(CFLAGS)') -} 260LIB_LDFLAGS={- join(' ', $target{shared_ldflag} || (), 261 $config{shared_ldflag} || (), 262 '$(CNF_LDFLAGS)', '$(LDFLAGS)') -} 263LIB_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS) 264DSO_ASFLAGS={- join(' ', $target{dso_asflags} || (), 265 $target{module_asflags} || (), 266 @{$config{dso_asflags}}, 267 @{$config{module_asflags}}, 268 '$(CNF_ASFLAGS)', '$(ASFLAGS)') -} 269DSO_CPPFLAGS={- join(' ', $target{dso_cppflags} || (), 270 $target{module_cppflags} || (), 271 @{$config{dso_cppflags}}, 272 @{$config{module_cppflags}}, 273 '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -} 274DSO_CFLAGS={- join(' ', $target{dso_cflags} || (), 275 $target{module_cflags} || (), 276 @{$config{dso_cflags}}, 277 @{$config{module_cflags}}, 278 '$(CNF_CFLAGS)', '$(CFLAGS)') -} 279DSO_LDFLAGS={- join(' ', $target{dso_lflags} || (), 280 $target{module_ldflags} || (), 281 @{$config{dso_lflags}}, 282 @{$config{module_ldflags}}, 283 '$(CNF_LDFLAGS)', '$(LDFLAGS)') -} 284DSO_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS) 285BIN_ASFLAGS={- join(' ', $target{bin_asflags} || (), 286 @{$config{bin_asflags}}, 287 '$(CNF_ASFLAGS)', '$(ASFLAGS)') -} 288BIN_CPPFLAGS={- join(' ', $target{bin_cppflags} || (), 289 @{$config{bin_cppflags}}, 290 '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -} 291BIN_CFLAGS={- join(' ', $target{bin_cflags} || (), 292 @{$config{bin_cflags}}, 293 '$(CNF_CFLAGS)', '$(CFLAGS)') -} 294BIN_LDFLAGS={- join(' ', $target{bin_lflags} || (), 295 @{$config{bin_lflags}}, 296 '$(CNF_LDFLAGS)', '$(LDFLAGS)') -} 297BIN_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS) 298 299# CPPFLAGS_Q is used for one thing only: to build up buildinf.h 300CPPFLAGS_Q={- $cppflags1 =~ s|([\\"])|\\$1|g; 301 $cppflags2 =~ s|([\\"])|\\$1|g; 302 join(' ', $lib_cppflags || (), $cppflags2 || (), 303 $cppflags1 || ()) -} 304 305PERLASM_SCHEME= {- $target{perlasm_scheme} -} 306 307PROCESSOR= {- $config{processor} -} 308 309# The main targets ################################################### 310 311{- dependmagic('all'); -}: build_libs_nodep build_engines_nodep build_programs_nodep 312{- dependmagic('build_libs'); -}: build_libs_nodep 313{- dependmagic('build_engines'); -}: build_engines_nodep 314{- dependmagic('build_programs'); -}: build_programs_nodep 315 316build_generated: $(GENERATED_MANDATORY) 317build_libs_nodep: $(LIBS) {- join(" ",map { shlib_import($_) } @{$unified_info{libraries}}) -} 318build_engines_nodep: $(ENGINES) 319build_programs_nodep: $(PROGRAMS) $(SCRIPTS) 320 321# Kept around for backward compatibility 322build_apps build_tests: build_programs 323 324# Convenience target to prebuild all generated files, not just the mandatory 325# ones 326build_all_generated: $(GENERATED_MANDATORY) $(GENERATED) 327 @{- output_off() if $disabled{makedepend}; "\@rem" -} 328 @$(ECHO) "Warning: consider configuring with no-makedepend, because if" 329 @$(ECHO) " target system doesn't have $(PERL)," 330 @$(ECHO) " then make will fail..." 331 @{- output_on() if $disabled{makedepend}; "\@rem" -} 332 333test: tests 334{- dependmagic('tests'); -}: build_programs_nodep build_engines_nodep 335 @{- output_off() if $disabled{tests}; "\@rem" -} 336 -mkdir $(BLDDIR)\test\test-runs 337 set SRCTOP=$(SRCDIR) 338 set BLDTOP=$(BLDDIR) 339 set RESULT_D=$(BLDDIR)\test\test-runs 340 set PERL=$(PERL) 341 set OPENSSL_ENGINES=$(MAKEDIR)\engines 342 set OPENSSL_DEBUG_MEMORY=on 343 "$(PERL)" "$(SRCDIR)\test\run_tests.pl" $(TESTS) 344 @{- if ($disabled{tests}) { output_on(); } else { output_off(); } "\@rem" -} 345 @$(ECHO) "Tests are not supported with your chosen Configure options" 346 @{- output_on() if !$disabled{tests}; "\@rem" -} 347 348list-tests: 349 @{- output_off() if $disabled{tests}; "\@rem" -} 350 @set SRCTOP=$(SRCDIR) 351 @"$(PERL)" "$(SRCDIR)\test\run_tests.pl" list 352 @{- if ($disabled{tests}) { output_on(); } else { output_off(); } "\@rem" -} 353 @$(ECHO) "Tests are not supported with your chosen Configure options" 354 @{- output_on() if !$disabled{tests}; "\@rem" -} 355 356install: install_sw install_ssldirs install_docs 357 358uninstall: uninstall_docs uninstall_sw 359 360libclean: 361 "$(PERL)" -e "map { m/(.*)\.dll$$/; unlink glob """{.,apps,test,fuzz}/$$1.*"""; } @ARGV" $(SHLIBS) 362 -del /Q /F $(LIBS) libcrypto.* libssl.* ossl_static.pdb 363 364clean: libclean 365 {- join("\n\t", map { "-del /Q /F $_" } @PROGRAMS) || "\@rem" -} 366 -del /Q /F $(ENGINES) 367 -del /Q /F $(SCRIPTS) 368 -del /Q /F $(GENERATED_MANDATORY) 369 -del /Q /F $(GENERATED) 370 -del /Q /S /F *.d *.obj *.pdb *.ilk *.manifest 371 -del /Q /S /F engines\*.lib engines\*.exp 372 -del /Q /S /F apps\*.lib apps\*.rc apps\*.res apps\*.exp 373 -del /Q /S /F test\*.exp 374 -rmdir /Q /S test\test-runs 375 376distclean: clean 377 -del /Q /F configdata.pm 378 -del /Q /F makefile 379 380depend: 381 @ {- output_off() if $disabled{makedepend}; "\@rem" -} 382 @ "$(PERL)" "$(SRCDIR)\util\add-depends.pl" "VC" 383 @ {- output_on() if $disabled{makedepend}; "\@rem" -} 384 385# Install helper targets ############################################# 386 387install_sw: install_dev install_engines install_runtime 388 389uninstall_sw: uninstall_runtime uninstall_engines uninstall_dev 390 391install_docs: install_html_docs 392 393uninstall_docs: uninstall_html_docs 394 395install_ssldirs: 396 @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(OPENSSLDIR)\certs" 397 @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(OPENSSLDIR)\private" 398 @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(OPENSSLDIR)\misc" 399 @"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\openssl.cnf" \ 400 "$(OPENSSLDIR)\openssl.cnf.dist" 401 @IF NOT EXIST "$(OPENSSLDIR)\openssl.cnf" \ 402 "$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\openssl.cnf" \ 403 "$(OPENSSLDIR)\openssl.cnf" 404 @"$(PERL)" "$(SRCDIR)\util\copy.pl" $(MISC_SCRIPTS) \ 405 "$(OPENSSLDIR)\misc" 406 @"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\ct_log_list.cnf" \ 407 "$(OPENSSLDIR)\ct_log_list.cnf.dist" 408 @IF NOT EXIST "$(OPENSSLDIR)\ct_log_list.cnf" \ 409 "$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\apps\ct_log_list.cnf" \ 410 "$(OPENSSLDIR)\ct_log_list.cnf" 411 412install_dev: install_runtime_libs 413 @if "$(INSTALLTOP)"=="" ( $(ECHO) "INSTALLTOP should not be empty" & exit 1 ) 414 @$(ECHO) "*** Installing development files" 415 @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\include\openssl" 416 @{- output_off() unless grep { $_ eq "OPENSSL_USE_APPLINK" } (@{$target{defines}}, @{$config{defines}}); "\@rem" -} 417 @"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(SRCDIR)\ms\applink.c" \ 418 "$(INSTALLTOP)\include\openssl" 419 @{- output_on() unless grep { $_ eq "OPENSSL_USE_APPLINK" } (@{$target{defines}}, @{$config{defines}}); "\@rem" -} 420 @"$(PERL)" "$(SRCDIR)\util\copy.pl" "-exclude_re=/__DECC_" \ 421 "$(SRCDIR)\include\openssl\*.h" \ 422 "$(INSTALLTOP)\include\openssl" 423 @"$(PERL)" "$(SRCDIR)\util\copy.pl" "$(BLDDIR)\include\openssl\*.h" \ 424 "$(INSTALLTOP)\include\openssl" 425 @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(libdir)" 426 @"$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_LIBS) "$(libdir)" 427 @if "$(SHLIBS)"=="" \ 428 "$(PERL)" "$(SRCDIR)\util\copy.pl" ossl_static.pdb "$(libdir)" 429 430uninstall_dev: 431 432install_engines: install_runtime_libs build_engines 433 @if "$(INSTALLTOP)"=="" ( $(ECHO) "INSTALLTOP should not be empty" & exit 1 ) 434 @$(ECHO) "*** Installing engines" 435 @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(ENGINESDIR)" 436 @if not "$(ENGINES)"=="" \ 437 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_ENGINES) "$(ENGINESDIR)" 438 @if not "$(ENGINES)"=="" \ 439 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_ENGINEPDBS) "$(ENGINESDIR)" 440 441uninstall_engines: 442 443install_runtime: install_programs 444 445install_runtime_libs: build_libs 446 @if "$(INSTALLTOP)"=="" ( $(ECHO) "INSTALLTOP should not be empty" & exit 1 ) 447 @$(ECHO) "*** Installing runtime libraries" 448 @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\bin" 449 @if not "$(SHLIBS)"=="" \ 450 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_SHLIBS) "$(INSTALLTOP)\bin" 451 @if not "$(SHLIBS)"=="" \ 452 "$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_SHLIBPDBS) \ 453 "$(INSTALLTOP)\bin" 454 455install_programs: install_runtime_libs build_programs 456 @if "$(INSTALLTOP)"=="" ( $(ECHO) "INSTALLTOP should not be empty" & exit 1 ) 457 @$(ECHO) "*** Installing runtime programs" 458 @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\bin" 459 @"$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_PROGRAMS) \ 460 "$(INSTALLTOP)\bin" 461 @"$(PERL)" "$(SRCDIR)\util\copy.pl" $(INSTALL_PROGRAMPDBS) \ 462 "$(INSTALLTOP)\bin" 463 @"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BIN_SCRIPTS) \ 464 "$(INSTALLTOP)\bin" 465 466uninstall_runtime: 467 468install_html_docs: 469 "$(PERL)" "$(SRCDIR)\util\process_docs.pl" \ 470 "--destdir=$(INSTALLTOP)\html" --type=html 471 472uninstall_html_docs: 473 474# Building targets ################################################### 475 476configdata.pm: "$(SRCDIR)\Configure" {- join(" ", map { '"'.$_.'"' } @{$config{build_file_templates}}, @{$config{build_infos}}, @{$config{conf_files}}) -} 477 @$(ECHO) "Detected changed: $?" 478 "$(PERL)" configdata.pm -r 479 @$(ECHO) "**************************************************" 480 @$(ECHO) "*** ***" 481 @$(ECHO) "*** Please run the same make command again ***" 482 @$(ECHO) "*** ***" 483 @$(ECHO) "**************************************************" 484 @exit 1 485 486reconfigure reconf: 487 "$(PERL)" configdata.pm -r 488 489{- 490 use File::Basename; 491 use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/; 492 493 # Helper function to figure out dependencies on libraries 494 # It takes a list of library names and outputs a list of dependencies 495 sub compute_lib_depends { 496 if ($disabled{shared}) { 497 return map { lib($_) } @_; 498 } 499 return map { shlib_import($_) or lib($_) } @_; 500 } 501 502 sub generatesrc { 503 my %args = @_; 504 (my $target = $args{src}) =~ s/\.[sS]$/.asm/; 505 my ($gen0, @gens) = @{$args{generator}}; 506 my $generator = '"'.$gen0.'"'.join('', map { " $_" } @gens); 507 my $generator_incs = join("", map { " -I \"$_\"" } @{$args{generator_incs}}); 508 my $incs = join("", map { " /I \"$_\"" } @{$args{incs}}); 509 my $deps = @{$args{deps}} ? 510 '"'.join('" "', @{$args{generator_deps}}, @{$args{deps}}).'"' : ''; 511 512 if ($target !~ /\.asm$/) { 513 if ($args{generator}->[0] =~ m|^.*\.in$|) { 514 my $dofile = abs2rel(rel2abs(catfile($config{sourcedir}, 515 "util", "dofile.pl")), 516 rel2abs($config{builddir})); 517 return <<"EOF"; 518$target: "$args{generator}->[0]" $deps 519 "\$(PERL)" "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\ 520 "-o$target{build_file}" $generator > \$@ 521EOF 522 } else { 523 return <<"EOF"; 524$target: "$args{generator}->[0]" $deps 525 "\$(PERL)"$generator_incs $generator > \$@ 526EOF 527 } 528 } else { 529 if ($args{generator}->[0] =~ /\.pl$/) { 530 $generator = '"$(PERL)"'.$generator_incs.' '.$generator; 531 } elsif ($args{generator}->[0] =~ /\.S$/) { 532 $generator = undef; 533 } else { 534 die "Generator type for $src unknown: $generator\n"; 535 } 536 537 my $cppflags = $incs; 538 $cppflags .= { 539 lib => ' $(LIB_CFLAGS) $(LIB_CPPFLAGS)', 540 dso => ' $(DSO_CFLAGS) $(DSO_CPPFLAGS)', 541 bin => ' $(BIN_CFLAGS) $(BIN_CPPFLAGS)' 542 } -> {$args{intent}}; 543 if (defined($generator)) { 544 # If the target is named foo.S in build.info, we want to 545 # end up generating foo.s in two steps. 546 if ($args{src} =~ /\.S$/) { 547 return <<"EOF"; 548$target: "$args{generator}->[0]" $deps 549 set ASM=\$(AS) 550 $generator \$@.S 551 \$(CPP) $cppflags \$@.S > \$@.i && move /Y \$@.i \$@ 552 del /Q \$@.S 553EOF 554 } 555 # Otherwise.... 556 return <<"EOF"; 557$target: "$args{generator}->[0]" $deps 558 set ASM=\$(AS) 559 $generator \$@ 560EOF 561 } 562 return <<"EOF"; 563$target: "$args{generator}->[0]" $deps 564 \$(CPP) $incs $cppflags "$args{generator}->[0]" > \$@.i && move /Y \$@.i \$@ 565EOF 566 } 567 } 568 569 sub src2obj { 570 my %args = @_; 571 my @srcs = map { (my $x = $_) =~ s/\.s$/.asm/; $x 572 } ( @{$args{srcs}} ); 573 my $srcs = '"'.join('" "', @srcs).'"'; 574 my $deps = '"'.join('" "', @srcs, @{$args{deps}}).'"'; 575 my $incs = join("", map { ' /I "'.$_.'"' } @{$args{incs}}); 576 my $cflags = { lib => ' $(LIB_CFLAGS)', 577 dso => ' $(DSO_CFLAGS)', 578 bin => ' $(BIN_CFLAGS)' } -> {$args{intent}}; 579 $cflags .= $incs; 580 $cflags .= { lib => ' $(LIB_CPPFLAGS)', 581 dso => ' $(DSO_CPPFLAGS)', 582 bin => ' $(BIN_CPPFLAGS)' } -> {$args{intent}}; 583 my $asflags = { lib => ' $(LIB_ASFLAGS)', 584 dso => ' $(DSO_ASFLAGS)', 585 bin => ' $(BIN_ASFLAGS)' } -> {$args{intent}}; 586 my $makedepprog = $config{makedepprog}; 587 if ($srcs[0] =~ /\.rc$/) { 588 return <<"EOF"; 589$args{obj}: $deps 590 \$(RC) \$(RCFLAGS) \$(RCOUTFLAG)\$\@ $srcs 591EOF 592 } 593 (my $obj = $args{obj}) =~ s|\.o$||; 594 if ($srcs[0] =~ /\.asm$/) { 595 return <<"EOF"; 596$obj$objext: $deps 597 \$(AS) $asflags \$(ASOUTFLAG)\$\@ $srcs 598EOF 599 } elsif ($srcs[0] =~ /.S$/) { 600 return <<"EOF"; 601$obj$objext: $deps 602 \$(CC) /EP /D__ASSEMBLER__ $cflags $srcs > \$@.asm && \$(AS) $asflags \$(ASOUTFLAG)\$\@ \$@.asm 603EOF 604 } 605 my $recipe = <<"EOF"; 606$obj$objext: $deps 607 \$(CC) $cflags -c \$(COUTFLAG)\$\@ $srcs 608EOF 609 $recipe .= <<"EOF" unless $disabled{makedepend}; 610 \$(CC) $cflags /Zs /showIncludes $srcs 2>&1 > $obj$depext 611EOF 612 return $recipe; 613 } 614 615 # We *know* this routine is only called when we've configure 'shared'. 616 # Also, note that even though the import library built here looks like 617 # a static library, it really isn't. 618 sub libobj2shlib { 619 my %args = @_; 620 my $lib = $args{lib}; 621 my @objs = map { (my $x = $_) =~ s|\.o$|$objext|; $x } 622 grep { $_ =~ m/\.(?:o|res)$/ } 623 @{$args{objs}}; 624 my @defs = grep { $_ =~ /\.def$/ } @{$args{objs}}; 625 my @deps = compute_lib_depends(@{$args{deps}}); 626 die "More than one exported symbols list" if scalar @defs > 1; 627 my $linklibs = join("", map { "$_\n" } @deps); 628 my $objs = join("\n", @objs); 629 my $deps = join(" ", @objs, @defs, @deps); 630 my $import = shlib_import($lib); 631 my $dll = shlib($lib); 632 my $shared_def = join("", map { " /def:$_" } @defs); 633 return <<"EOF" 634# The import library may look like a static library, but it is not. 635# We MUST make the import library depend on the DLL, in case someone 636# mistakenly removes the latter. 637$import: $dll 638$dll: $deps 639 IF EXIST $full.manifest DEL /F /Q $full.manifest 640 IF EXIST \$@ DEL /F /Q \$@ 641 \$(LD) \$(LDFLAGS) \$(LIB_LDFLAGS) \\ 642 /implib:$import \$(LDOUTFLAG)$dll$shared_def @<< || (DEL /Q \$(\@B).* $import && EXIT 1) 643$objs 644$linklibs\$(LIB_EX_LIBS) 645<< 646 IF EXIST $dll.manifest \\ 647 \$(MT) \$(MTFLAGS) \$(MTINFLAG)$dll.manifest \$(MTOUTFLAG)$dll 648 IF EXIST apps\\$dll DEL /Q /F apps\\$dll 649 IF EXIST test\\$dll DEL /Q /F test\\$dll 650 IF EXIST fuzz\\$dll DEL /Q /F fuzz\\$dll 651 COPY $dll apps 652 COPY $dll test 653 COPY $dll fuzz 654EOF 655 } 656 sub obj2dso { 657 my %args = @_; 658 my $dso = $args{lib}; 659 my $dso_n = basename($dso); 660 my @objs = map { (my $x = $_) =~ s|\.o$|$objext|; $x } @{$args{objs}}; 661 my @deps = compute_lib_depends(@{$args{deps}}); 662 my $objs = join("\n", @objs); 663 my $linklibs = join("", map { "$_\n" } @deps); 664 my $deps = join(" ", @objs, @deps); 665 return <<"EOF"; 666$dso$dsoext: $deps 667 IF EXIST $dso$dsoext.manifest DEL /F /Q $dso$dsoext.manifest 668 \$(LD) \$(LDFLAGS) \$(DSO_LDFLAGS) \$(LDOUTFLAG)$dso$dsoext /def:<< @<< 669LIBRARY $dso_n 670EXPORTS 671 bind_engine @1 672 v_check @2 673<< 674$objs 675$linklibs \$(DSO_EX_LIBS) 676<< 677 IF EXIST $dso$dsoext.manifest \\ 678 \$(MT) \$(MTFLAGS) \$(MTINFLAG)$dso$dsoext.manifest \$(MTOUTFLAG)$dso$dsoext 679EOF 680 } 681 sub obj2lib { 682 my %args = @_; 683 my $lib = lib($args{lib}); 684 my @objs = map { (my $x = $_) =~ s|\.o$|$objext|; $x } @{$args{objs}}; 685 my $objs = join("\n", @objs); 686 my $deps = join(" ", @objs); 687 return <<"EOF"; 688$lib: $deps 689 \$(AR) \$(ARFLAGS) \$(AROUTFLAG)$lib @<< 690$objs 691<< 692EOF 693 } 694 sub obj2bin { 695 my %args = @_; 696 my $bin = $args{bin}; 697 my @objs = map { (my $x = $_) =~ s|\.o$|$objext|; $x } @{$args{objs}}; 698 my @deps = compute_lib_depends(@{$args{deps}}); 699 my $objs = join("\n", @objs); 700 my $linklibs = join("", map { "$_\n" } @deps); 701 my $deps = join(" ", @objs, @deps); 702 return <<"EOF"; 703$bin$exeext: $deps 704 IF EXIST $bin$exeext.manifest DEL /F /Q $bin$exeext.manifest 705 \$(LD) \$(LDFLAGS) \$(BIN_LDFLAGS) \$(LDOUTFLAG)$bin$exeext @<< 706$objs 707setargv.obj 708$linklibs\$(BIN_EX_LIBS) 709<< 710 IF EXIST $bin$exeext.manifest \\ 711 \$(MT) \$(MTFLAGS) \$(MTINFLAG)$bin$exeext.manifest \$(MTOUTFLAG)$bin$exeext 712EOF 713 } 714 sub in2script { 715 my %args = @_; 716 my $script = $args{script}; 717 my $sources = '"'.join('" "', @{$args{sources}}).'"'; 718 my $dofile = abs2rel(rel2abs(catfile($config{sourcedir}, 719 "util", "dofile.pl")), 720 rel2abs($config{builddir})); 721 return <<"EOF"; 722$script: $sources 723 "\$(PERL)" "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\ 724 "-o$target{build_file}" $sources > "$script" 725EOF 726 } 727 sub generatedir { 728 my %args = @_; 729 my $dir = $args{dir}; 730 my @deps = map { s|\.o$|$objext|; $_ } @{$args{deps}}; 731 my @actions = (); 732 my %extinfo = ( dso => $dsoext, 733 lib => $libext, 734 bin => $exeext ); 735 736 # We already have a 'test' target, and the top directory is just plain 737 # silly 738 return if $dir eq "test" || $dir eq "."; 739 740 foreach my $type (("dso", "lib", "bin", "script")) { 741 next unless defined($unified_info{dirinfo}->{$dir}->{products}->{$type}); 742 # For lib object files, we could update the library. However, 743 # LIB on Windows doesn't work that way, so we won't create any 744 # actions for it, and the dependencies are already taken care of. 745 if ($type ne "lib") { 746 foreach my $prod (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) { 747 if (dirname($prod) eq $dir) { 748 push @deps, $prod.$extinfo{$type}; 749 } 750 } 751 } 752 } 753 754 my $deps = join(" ", @deps); 755 my $actions = join("\n", "", @actions); 756 return <<"EOF"; 757$dir $dir\\ : $deps$actions 758EOF 759 } 760 "" # Important! This becomes part of the template result. 761-} 762