1 #!/usr/bin/env perl 2 #*************************************************************************** 3 # _ _ ____ _ 4 # Project ___| | | | _ \| | 5 # / __| | | | |_) | | 6 # | (__| |_| | _ <| |___ 7 # \___|\___/|_| \_\_____| 8 # 9 # Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel (at] haxx.se>, et al. 10 # 11 # This software is licensed as described in the file COPYING, which 12 # you should have received as part of this distribution. The terms 13 # are also available at https://curl.haxx.se/docs/copyright.html. 14 # 15 # You may opt to use, copy, modify, merge, publish, distribute and/or sell 16 # copies of the Software, and permit persons to whom the Software is 17 # furnished to do so, under the terms of the COPYING file. 18 # 19 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20 # KIND, either express or implied. 21 # 22 ########################################################################### 23 24 ########################### 25 # What is This Script? 26 ########################### 27 28 # testcurl.pl is the master script to use for automatic testing of curl 29 # directly off its source repository. 30 # This is written for the purpose of being run from a crontab job or similar 31 # at a regular interval. The output is suitable to be mailed to 32 # curl-autocompile (at] haxx.se to be dealt with automatically (make sure the 33 # subject includes the word "autobuild" as the mail gets silently discarded 34 # otherwise). The most current build status (with a resonable backlog) will 35 # be published on the curl site, at https://curl.haxx.se/auto/ 36 37 # USAGE: 38 # testcurl.pl [options] [curl-daily-name] > output 39 40 # Options: 41 # 42 # --configure=[options] Configure options 43 # --crosscompile This is a crosscompile 44 # --desc=[desc] Description of your test system 45 # --email=[email] Set email address to report as 46 # --extvercmd=[command] Command to use for displaying version with cross compiles. 47 # --mktarball=[command] Command to run after completed test 48 # --name=[name] Set name to report as 49 # --notes=[notes] More human-readable information about this configuration 50 # --nocvsup Don't pull from git even though it is a git tree 51 # --nogitpull Don't pull from git even though it is a git tree 52 # --nobuildconf Don't run buildconf 53 # --noconfigure Don't run configure 54 # --runtestopts=[options] Options to pass to runtests.pl 55 # --setup=[file name] File name to read setup from (deprecated) 56 # --target=[your os] Specify your target environment. 57 # 58 # if [curl-daily-name] is omitted, a 'curl' git directory is assumed. 59 # 60 61 use strict; 62 63 use Cwd; 64 use File::Spec; 65 66 # Turn on warnings (equivalent to -w, which can't be used with /usr/bin/env) 67 #BEGIN { $^W = 1; } 68 69 use vars qw($version $fixed $infixed $CURLDIR $git $pwd $build $buildlog 70 $buildlogname $configurebuild $targetos $confheader $binext 71 $libext); 72 73 use vars qw($name $email $desc $confopts $runtestopts $setupfile $mktarball 74 $extvercmd $nogitpull $nobuildconf $crosscompile 75 $timestamp $notes); 76 77 # version of this script 78 $version='2014-11-25'; 79 $fixed=0; 80 81 # Determine if we're running from git or a canned copy of curl, 82 # or if we got a specific target option or setup file option. 83 $CURLDIR="curl"; 84 if (-f ".git/config") { 85 $CURLDIR = "./"; 86 } 87 88 $git=1; 89 $setupfile = 'setup'; 90 $configurebuild = 1; 91 while ($ARGV[0]) { 92 if ($ARGV[0] =~ /--target=/) { 93 $targetos = (split(/=/, shift @ARGV, 2))[1]; 94 } 95 elsif ($ARGV[0] =~ /--setup=/) { 96 $setupfile = (split(/=/, shift @ARGV, 2))[1]; 97 } 98 elsif ($ARGV[0] =~ /--extvercmd=/) { 99 $extvercmd = (split(/=/, shift @ARGV, 2))[1]; 100 } 101 elsif ($ARGV[0] =~ /--mktarball=/) { 102 $mktarball = (split(/=/, shift @ARGV, 2))[1]; 103 } 104 elsif ($ARGV[0] =~ /--name=/) { 105 $name = (split(/=/, shift @ARGV, 2))[1]; 106 } 107 elsif ($ARGV[0] =~ /--email=/) { 108 $email = (split(/=/, shift @ARGV, 2))[1]; 109 } 110 elsif ($ARGV[0] =~ /--desc=/) { 111 $desc = (split(/=/, shift @ARGV, 2))[1]; 112 } 113 elsif ($ARGV[0] =~ /--notes=/) { 114 $notes = (split(/=/, shift @ARGV, 2))[1]; 115 } 116 elsif ($ARGV[0] =~ /--configure=(.*)/) { 117 $confopts = $1; 118 shift @ARGV; 119 } 120 elsif (($ARGV[0] eq "--nocvsup") || ($ARGV[0] eq "--nogitpull")) { 121 $nogitpull=1; 122 shift @ARGV; 123 } 124 elsif ($ARGV[0] =~ /--nobuildconf/) { 125 $nobuildconf=1; 126 shift @ARGV; 127 } 128 elsif ($ARGV[0] =~ /--noconfigure/) { 129 $configurebuild=0; 130 shift @ARGV; 131 } 132 elsif ($ARGV[0] =~ /--crosscompile/) { 133 $crosscompile=1; 134 shift @ARGV; 135 } 136 elsif ($ARGV[0] =~ /--runtestopts=/) { 137 $runtestopts = (split(/=/, shift @ARGV, 2))[1]; 138 } 139 else { 140 $CURLDIR=shift @ARGV; 141 $git=0; # a given dir, assume not using git 142 } 143 } 144 145 # Do the platform-specific stuff here 146 $confheader = 'curl_config.h'; 147 $binext = ''; 148 $libext = '.la'; # .la since both libcurl and libcares are made with libtool 149 if ($^O eq 'MSWin32' || $targetos) { 150 if (!$targetos) { 151 # If no target defined on Win32 lets assume vc 152 $targetos = 'vc'; 153 } 154 if ($targetos =~ /vc/ || $targetos =~ /borland/ || $targetos =~ /watcom/) { 155 $binext = '.exe'; 156 $libext = '.lib'; 157 } 158 elsif ($targetos =~ /mingw/) { 159 $binext = '.exe'; 160 if ($^O eq 'MSWin32') { 161 $libext = '.a'; 162 } 163 } 164 elsif ($targetos =~ /netware/) { 165 $configurebuild = 0; 166 $binext = '.nlm'; 167 if ($^O eq 'MSWin32') { 168 $libext = '.lib'; 169 } 170 else { 171 $libext = '.a'; 172 } 173 } 174 } 175 176 if (($^O eq 'MSWin32' || $^O eq 'msys') && 177 ($targetos =~ /vc/ || $targetos =~ /mingw32/ || 178 $targetos =~ /borland/ || $targetos =~ /watcom/)) { 179 180 # Set these things only when building ON Windows and for Win32 platform. 181 # FOR Windows since we might be cross-compiling on another system. Non- 182 # Windows builds still default to configure-style builds with curl_config.h. 183 184 $configurebuild = 0; 185 $confheader = 'config-win32.h'; 186 } 187 188 $ENV{LC_ALL}="C" if (($ENV{LC_ALL}) && ($ENV{LC_ALL} !~ /^C$/)); 189 $ENV{LC_CTYPE}="C" if (($ENV{LC_CTYPE}) && ($ENV{LC_CTYPE} !~ /^C$/)); 190 $ENV{LANG}="C"; 191 192 sub rmtree($) { 193 my $target = $_[0]; 194 if ($^O eq 'MSWin32') { 195 foreach (glob($target)) { 196 s:/:\\:g; 197 system("rd /s /q $_"); 198 } 199 } else { 200 system("rm -rf $target"); 201 } 202 } 203 204 sub grepfile($$) { 205 my ($target, $fn) = @_; 206 open(F, $fn) or die; 207 while (<F>) { 208 if (/$target/) { 209 close(F); 210 return 1; 211 } 212 } 213 close(F); 214 return 0; 215 } 216 217 sub logit($) { 218 my $text=$_[0]; 219 if ($text) { 220 print "testcurl: $text\n"; 221 } 222 } 223 224 sub logit_spaced($) { 225 my $text=$_[0]; 226 if ($text) { 227 print "\ntestcurl: $text\n\n"; 228 } 229 } 230 231 sub mydie($){ 232 my $text=$_[0]; 233 logit "$text"; 234 chdir $pwd; # cd back to the original root dir 235 236 if ($pwd && $build) { 237 # we have a build directory name, remove the dir 238 logit "removing the $build dir"; 239 rmtree "$pwd/$build"; 240 } 241 if (-r $buildlog) { 242 # we have a build log output file left, remove it 243 logit "removing the $buildlogname file"; 244 unlink "$buildlog"; 245 } 246 logit "ENDING HERE"; # last line logged! 247 exit 1; 248 } 249 250 sub get_host_triplet { 251 my $triplet; 252 my $configfile = "$pwd/$build/lib/curl_config.h"; 253 254 if(-f $configfile && -s $configfile && open(LIBCONFIGH, "<$configfile")) { 255 while(<LIBCONFIGH>) { 256 if($_ =~ /^\#define\s+OS\s+"*([^"][^"]*)"*\s*/) { 257 $triplet = $1; 258 last; 259 } 260 } 261 close(LIBCONFIGH); 262 } 263 return $triplet; 264 } 265 266 if($name && $email && $desc) { 267 # having these fields set are enough to continue, skip reading the setup 268 # file 269 $infixed=4; 270 $fixed=4; 271 } 272 elsif (open(F, "$setupfile")) { 273 while (<F>) { 274 if (/(\w+)=(.*)/) { 275 eval "\$$1=$2;"; 276 } 277 } 278 close(F); 279 $infixed=$fixed; 280 } 281 else { 282 $infixed=0; # so that "additional args to configure" works properly first time... 283 } 284 285 if (!$name) { 286 print "please enter your name\n"; 287 $name = <>; 288 chomp $name; 289 $fixed=1; 290 } 291 292 if (!$email) { 293 print "please enter your contact email address\n"; 294 $email = <>; 295 chomp $email; 296 $fixed=2; 297 } 298 299 if (!$desc) { 300 print "please enter a one line system description\n"; 301 $desc = <>; 302 chomp $desc; 303 $fixed=3; 304 } 305 306 if (!$confopts) { 307 if ($infixed < 4) { 308 print "please enter your additional arguments to configure\n"; 309 print "examples: --with-ssl --enable-debug --enable-ipv6 --with-krb4\n"; 310 $confopts = <>; 311 chomp $confopts; 312 } 313 } 314 315 316 if ($fixed < 4) { 317 $fixed=4; 318 open(F, ">$setupfile") or die; 319 print F "name='$name'\n"; 320 print F "email='$email'\n"; 321 print F "desc='$desc'\n"; 322 print F "confopts='$confopts'\n"; 323 print F "notes='$notes'\n"; 324 print F "fixed='$fixed'\n"; 325 close(F); 326 } 327 328 # Enable picky compiler warnings unless explicitly disabled 329 if (($confopts !~ /--enable-debug/) && 330 ($confopts !~ /--enable-warnings/) && 331 ($confopts !~ /--disable-warnings/)) { 332 $confopts .= " --enable-warnings"; 333 } 334 335 my $str1066os = 'o' x 1066; 336 337 # Set timestamp to the UTC this script is running. Its value might 338 # be changed later in the script to the value present in curlver.h 339 $timestamp = scalar(gmtime)." UTC"; 340 341 logit "STARTING HERE"; # first line logged, for scripts to trigger on 342 logit 'TRANSFER CONTROL ==== 1120 CHAR LINE' . $str1066os . 'LINE_END'; 343 logit "NAME = $name"; 344 logit "EMAIL = $email"; 345 logit "DESC = $desc"; 346 logit "NOTES = $notes"; 347 logit "CONFOPTS = $confopts"; 348 logit "RUNTESTOPTS = ".$runtestopts; 349 logit "CPPFLAGS = ".$ENV{CPPFLAGS}; 350 logit "CFLAGS = ".$ENV{CFLAGS}; 351 logit "LDFLAGS = ".$ENV{LDFLAGS}; 352 logit "LIBS = ".$ENV{LIBS}; 353 logit "CC = ".$ENV{CC}; 354 logit "TMPDIR = ".$ENV{TMPDIR}; 355 logit "MAKEFLAGS = ".$ENV{MAKEFLAGS}; 356 logit "ACLOCAL_FLAGS = ".$ENV{ACLOCAL_FLAGS}; 357 logit "PKG_CONFIG_PATH = ".$ENV{PKG_CONFIG_PATH}; 358 logit "DYLD_LIBRARY_PATH = ".$ENV{DYLD_LIBRARY_PATH}; 359 logit "LD_LIBRARY_PATH = ".$ENV{LD_LIBRARY_PATH}; 360 logit "LIBRARY_PATH = ".$ENV{LIBRARY_PATH}; 361 logit "SHLIB_PATH = ".$ENV{SHLIB_PATH}; 362 logit "LIBPATH = ".$ENV{LIBPATH}; 363 logit "target = ".$targetos; 364 logit "version = $version"; # script version 365 logit "date = $timestamp"; # When the test build starts 366 367 $str1066os = undef; 368 369 # Make $pwd to become the path without newline. We'll use that in order to cut 370 # off that path from all possible logs and error messages etc. 371 $pwd = getcwd(); 372 373 my $have_embedded_ares = 0; 374 375 if (-d $CURLDIR) { 376 if ($git && -d "$CURLDIR/.git") { 377 logit "$CURLDIR is verified to be a fine git source dir"; 378 # remove the generated sources to force them to be re-generated each 379 # time we run this test 380 unlink "$CURLDIR/src/tool_hugehelp.c"; 381 # find out if curl source dir has an in-tree c-ares repo 382 $have_embedded_ares = 1 if (-f "$CURLDIR/ares/GIT-INFO"); 383 } elsif (!$git && -f "$CURLDIR/tests/testcurl.pl") { 384 logit "$CURLDIR is verified to be a fine daily source dir"; 385 # find out if curl source dir has an in-tree c-ares extracted tarball 386 $have_embedded_ares = 1 if (-f "$CURLDIR/ares/ares_build.h"); 387 } else { 388 mydie "$CURLDIR is not a daily source dir or checked out from git!" 389 } 390 } 391 392 # make the path absolute so we can use it everywhere 393 $CURLDIR = File::Spec->rel2abs("$CURLDIR"); 394 395 $build="build-$$"; 396 $buildlogname="buildlog-$$"; 397 $buildlog="$pwd/$buildlogname"; 398 399 # remove any previous left-overs 400 rmtree "build-*"; 401 rmtree "buildlog-*"; 402 403 # this is to remove old build logs that ended up in the wrong dir 404 foreach (glob("$CURLDIR/buildlog-*")) { unlink $_; } 405 406 # create a dir to build in 407 mkdir $build, 0777; 408 409 if (-d $build) { 410 logit "build dir $build was created fine"; 411 } else { 412 mydie "failed to create dir $build"; 413 } 414 415 # get in the curl source tree root 416 chdir $CURLDIR; 417 418 # Do the git thing, or not... 419 if ($git) { 420 my $gitstat = 0; 421 my @commits; 422 423 # update quietly to the latest git 424 if($nogitpull) { 425 logit "skipping git pull (--nogitpull)"; 426 } else { 427 logit "run git pull in curl"; 428 system("git pull 2>&1"); 429 $gitstat += $?; 430 logit "failed to update from curl git ($?), continue anyway" if ($?); 431 432 # Set timestamp to the UTC the git update took place. 433 $timestamp = scalar(gmtime)." UTC" if (!$gitstat); 434 } 435 436 # get the last 5 commits for show (even if no pull was made) 437 @commits=`git log --pretty=oneline --abbrev-commit -5`; 438 logit "The most recent curl git commits:"; 439 for (@commits) { 440 chomp ($_); 441 logit " $_"; 442 } 443 444 if (-d "ares/.git") { 445 chdir "ares"; 446 447 if($nogitpull) { 448 logit "skipping git pull (--nogitpull) in ares"; 449 } else { 450 logit "run git pull in ares"; 451 system("git pull 2>&1"); 452 $gitstat += $?; 453 logit "failed to update from ares git ($?), continue anyway" if ($?); 454 455 # Set timestamp to the UTC the git update took place. 456 $timestamp = scalar(gmtime)." UTC" if (!$gitstat); 457 } 458 459 # get the last 5 commits for show (even if no pull was made) 460 @commits=`git log --pretty=oneline --abbrev-commit -5`; 461 logit "The most recent ares git commits:"; 462 for (@commits) { 463 chomp ($_); 464 logit " $_"; 465 } 466 467 chdir "$CURLDIR"; 468 } 469 470 if($nobuildconf) { 471 logit "told to not run buildconf"; 472 } 473 elsif ($configurebuild) { 474 # remove possible left-overs from the past 475 unlink "configure"; 476 unlink "autom4te.cache"; 477 478 # generate the build files 479 logit "invoke buildconf"; 480 open(F, "./buildconf 2>&1 |") or die; 481 open(LOG, ">$buildlog") or die; 482 while (<F>) { 483 my $ll = $_; 484 # ignore messages pertaining to third party m4 files we don't care 485 next if ($ll =~ /aclocal\/gtk\.m4/); 486 next if ($ll =~ /aclocal\/gtkextra\.m4/); 487 print $ll; 488 print LOG $ll; 489 } 490 close(F); 491 close(LOG); 492 493 if (grepfile("^buildconf: OK", $buildlog)) { 494 logit "buildconf was successful"; 495 } 496 else { 497 mydie "buildconf was NOT successful"; 498 } 499 } 500 else { 501 logit "buildconf was successful (dummy message)"; 502 } 503 } 504 505 # Set timestamp to the one in curlver.h if this isn't a git test build. 506 if ((-f "include/curl/curlver.h") && 507 (open(F, "<include/curl/curlver.h"))) { 508 while (<F>) { 509 chomp; 510 if ($_ =~ /^\#define\s+LIBCURL_TIMESTAMP\s+\"(.+)\".*$/) { 511 my $stampstring = $1; 512 if ($stampstring !~ /DEV/) { 513 $stampstring =~ s/\s+UTC//; 514 $timestamp = $stampstring." UTC"; 515 } 516 last; 517 } 518 } 519 close(F); 520 } 521 522 # Show timestamp we are using for this test build. 523 logit "timestamp = $timestamp"; 524 525 if ($configurebuild) { 526 if (-f "configure") { 527 logit "configure created (at least it exists)"; 528 } else { 529 mydie "no configure created/found"; 530 } 531 } else { 532 logit "configure created (dummy message)"; # dummy message to feign success 533 } 534 535 sub findinpath { 536 my $c; 537 my $e; 538 my $x = ($^O eq 'MSWin32') ? '.exe' : ''; 539 my $s = ($^O eq 'MSWin32') ? ';' : ':'; 540 my $p=$ENV{'PATH'}; 541 my @pa = split($s, $p); 542 for $c (@_) { 543 for $e (@pa) { 544 if( -x "$e/$c$x") { 545 return $c; 546 } 547 } 548 } 549 } 550 551 my $make = findinpath("gmake", "make", "nmake"); 552 if(!$make) { 553 mydie "Couldn't find make in the PATH"; 554 } 555 # force to 'nmake' for VC builds 556 $make = "nmake" if ($targetos =~ /vc/); 557 # force to 'wmake' for Watcom builds 558 $make = "wmake" if ($targetos =~ /watcom/); 559 logit "going with $make as make"; 560 561 # change to build dir 562 chdir "$pwd/$build"; 563 564 if ($configurebuild) { 565 # run configure script 566 print `$CURLDIR/configure $confopts 2>&1`; 567 568 if (-f "lib/Makefile") { 569 logit "configure seems to have finished fine"; 570 } else { 571 mydie "configure didn't work"; 572 } 573 } else { 574 logit "copying files to build dir ..."; 575 if (($^O eq 'MSWin32') && ($targetos !~ /netware/)) { 576 system("xcopy /s /q \"$CURLDIR\" ."); 577 system("buildconf.bat"); 578 } 579 elsif ($targetos =~ /netware/) { 580 system("cp -afr $CURLDIR/* ."); 581 system("cp -af $CURLDIR/Makefile.dist Makefile"); 582 system("$make -i -C lib -f Makefile.netware prebuild"); 583 system("$make -i -C src -f Makefile.netware prebuild"); 584 if (-d "$CURLDIR/ares") { 585 system("$make -i -C ares -f Makefile.netware prebuild"); 586 } 587 } 588 elsif ($^O eq 'linux') { 589 system("cp -afr $CURLDIR/* ."); 590 system("cp -af $CURLDIR/Makefile.dist Makefile"); 591 system("cp -af $CURLDIR/include/curl/curlbuild.h.dist ./include/curl/curlbuild.h"); 592 system("$make -i -C lib -f Makefile.$targetos prebuild"); 593 system("$make -i -C src -f Makefile.$targetos prebuild"); 594 if (-d "$CURLDIR/ares") { 595 system("cp -af $CURLDIR/ares/ares_build.h.dist ./ares/ares_build.h"); 596 system("$make -i -C ares -f Makefile.$targetos prebuild"); 597 } 598 } 599 } 600 601 if(-f "./libcurl.pc") { 602 logit_spaced "display libcurl.pc"; 603 if(open(F, "<./libcurl.pc")) { 604 while(<F>) { 605 my $ll = $_; 606 print $ll if(($ll !~ /^ *#/) && ($ll !~ /^ *$/)); 607 } 608 close(F); 609 } 610 } 611 612 if(-f "./include/curl/curlbuild.h") { 613 logit_spaced "display include/curl/curlbuild.h"; 614 if(open(F, "<./include/curl/curlbuild.h")) { 615 while(<F>) { 616 my $ll = $_; 617 print $ll if(($ll =~ /^ *# *define *CURL_/) && ($ll !~ /__CURL_CURLBUILD_H/)); 618 } 619 close(F); 620 } 621 } 622 else { 623 mydie "no curlbuild.h created/found"; 624 } 625 626 logit_spaced "display lib/$confheader"; 627 open(F, "lib/$confheader") or die "lib/$confheader: $!"; 628 while (<F>) { 629 print if /^ *#/; 630 } 631 close(F); 632 633 if (($have_embedded_ares) && 634 (grepfile("^#define USE_ARES", "lib/$confheader"))) { 635 print "\n"; 636 logit "setup to build ares"; 637 638 if(-f "./ares/libcares.pc") { 639 logit_spaced "display ares/libcares.pc"; 640 if(open(F, "<./ares/libcares.pc")) { 641 while(<F>) { 642 my $ll = $_; 643 print $ll if(($ll !~ /^ *#/) && ($ll !~ /^ *$/)); 644 } 645 close(F); 646 } 647 } 648 649 if(-f "./ares/ares_build.h") { 650 logit_spaced "display ares/ares_build.h"; 651 if(open(F, "<./ares/ares_build.h")) { 652 while(<F>) { 653 my $ll = $_; 654 print $ll if(($ll =~ /^ *# *define *CARES_/) && ($ll !~ /__CARES_BUILD_H/)); 655 } 656 close(F); 657 } 658 } 659 else { 660 mydie "no ares_build.h created/found"; 661 } 662 663 $confheader =~ s/curl/ares/; 664 logit_spaced "display ares/$confheader"; 665 if(open(F, "ares/$confheader")) { 666 while (<F>) { 667 print if /^ *#/; 668 } 669 close(F); 670 } 671 672 print "\n"; 673 logit "build ares"; 674 chdir "ares"; 675 676 if ($targetos && !$configurebuild) { 677 logit "$make -f Makefile.$targetos"; 678 open(F, "$make -f Makefile.$targetos 2>&1 |") or die; 679 } 680 else { 681 logit "$make"; 682 open(F, "$make 2>&1 |") or die; 683 } 684 while (<F>) { 685 s/$pwd//g; 686 print; 687 } 688 close(F); 689 690 if (-f "libcares$libext") { 691 logit "ares is now built successfully (libcares$libext)"; 692 } else { 693 mydie "ares build failed (libcares$libext)"; 694 } 695 696 # cd back to the curl build dir 697 chdir "$pwd/$build"; 698 } 699 700 my $mkcmd = "$make -i" . ($targetos && !$configurebuild ? " $targetos" : ""); 701 logit "$mkcmd"; 702 open(F, "$mkcmd 2>&1 |") or die; 703 while (<F>) { 704 s/$pwd//g; 705 print; 706 } 707 close(F); 708 709 if (-f "lib/libcurl$libext") { 710 logit "libcurl was created fine (libcurl$libext)"; 711 } 712 else { 713 mydie "libcurl was not created (libcurl$libext)"; 714 } 715 716 if (-f "src/curl$binext") { 717 logit "curl was created fine (curl$binext)"; 718 } 719 else { 720 mydie "curl was not created (curl$binext)"; 721 } 722 723 if (!$crosscompile || (($extvercmd ne '') && (-x $extvercmd))) { 724 logit "display curl${binext} --version output"; 725 my $cmd = ($extvercmd ne '' ? $extvercmd.' ' : '')."./src/curl${binext} --version|"; 726 open(F, $cmd); 727 while(<F>) { 728 # strip CR from output on non-win32 platforms (wine on Linux) 729 s/\r// if ($^O ne 'MSWin32'); 730 print; 731 } 732 close(F); 733 } 734 735 if ($configurebuild && !$crosscompile) { 736 my $host_triplet = get_host_triplet(); 737 # build example programs for selected build targets 738 if(($host_triplet =~ /([^-]+)-([^-]+)-irix(.*)/) || 739 ($host_triplet =~ /([^-]+)-([^-]+)-aix(.*)/) || 740 ($host_triplet =~ /([^-]+)-([^-]+)-osf(.*)/) || 741 ($host_triplet =~ /([^-]+)-([^-]+)-solaris2(.*)/)) { 742 chdir "$pwd/$build/docs/examples"; 743 logit_spaced "build examples"; 744 open(F, "$make -i 2>&1 |") or die; 745 open(LOG, ">$buildlog") or die; 746 while (<F>) { 747 s/$pwd//g; 748 print; 749 print LOG; 750 } 751 close(F); 752 close(LOG); 753 chdir "$pwd/$build"; 754 } 755 # build and run full test suite 756 my $o; 757 if($runtestopts) { 758 $o = "TEST_F=\"$runtestopts\" "; 759 } 760 logit "$make -k ${o}test-full"; 761 open(F, "$make -k ${o}test-full 2>&1 |") or die; 762 open(LOG, ">$buildlog") or die; 763 while (<F>) { 764 s/$pwd//g; 765 print; 766 print LOG; 767 } 768 close(F); 769 close(LOG); 770 771 if (grepfile("^TEST", $buildlog)) { 772 logit "tests were run"; 773 } else { 774 mydie "test suite failure"; 775 } 776 777 if (grepfile("^TESTFAIL:", $buildlog)) { 778 logit "the tests were not successful"; 779 } else { 780 logit "the tests were successful!"; 781 } 782 } 783 else { 784 if($crosscompile) { 785 my $host_triplet = get_host_triplet(); 786 # build example programs for selected cross-compiles 787 if(($host_triplet =~ /([^-]+)-([^-]+)-mingw(.*)/) || 788 ($host_triplet =~ /([^-]+)-([^-]+)-android(.*)/)) { 789 chdir "$pwd/$build/docs/examples"; 790 logit_spaced "build examples"; 791 open(F, "$make -i 2>&1 |") or die; 792 open(LOG, ">$buildlog") or die; 793 while (<F>) { 794 s/$pwd//g; 795 print; 796 print LOG; 797 } 798 close(F); 799 close(LOG); 800 chdir "$pwd/$build"; 801 } 802 # build test harness programs for selected cross-compiles 803 if($host_triplet =~ /([^-]+)-([^-]+)-mingw(.*)/) { 804 chdir "$pwd/$build/tests"; 805 logit_spaced "build test harness"; 806 open(F, "$make -i 2>&1 |") or die; 807 open(LOG, ">$buildlog") or die; 808 while (<F>) { 809 s/$pwd//g; 810 print; 811 print LOG; 812 } 813 close(F); 814 close(LOG); 815 chdir "$pwd/$build"; 816 } 817 logit_spaced "cross-compiling, can't run tests"; 818 } 819 # dummy message to feign success 820 print "TESTDONE: 1 tests out of 0 (dummy message)\n"; 821 } 822 823 # create a tarball if we got that option. 824 if (($mktarball ne '') && (-x $mktarball)) { 825 system($mktarball); 826 } 827 828 # mydie to cleanup 829 mydie "ending nicely"; 830