Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 1 | #!/usr/bin/env perl |
| 2 | #*************************************************************************** |
| 3 | # _ _ ____ _ |
| 4 | # Project ___| | | | _ \| | |
| 5 | # / __| | | | |_) | | |
| 6 | # | (__| |_| | _ <| |___ |
| 7 | # \___|\___/|_| \_\_____| |
| 8 | # |
Elliott Hughes | 82be86d | 2017-09-20 17:00:17 -0700 | [diff] [blame] | 9 | # Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al. |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 |
Alex Deymo | 8f1a214 | 2016-06-28 14:49:26 -0700 | [diff] [blame] | 13 | # are also available at https://curl.haxx.se/docs/copyright.html. |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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@haxx.se to be dealt with automatically (make sure the |
| 33 | # subject includes the word "autobuild" as the mail gets silently discarded |
Elliott Hughes | 1ef06ba | 2018-05-30 15:43:58 -0700 | [diff] [blame] | 34 | # otherwise). The most current build status (with a reasonable backlog) will |
Alex Deymo | 8f1a214 | 2016-06-28 14:49:26 -0700 | [diff] [blame] | 35 | # be published on the curl site, at https://curl.haxx.se/auto/ |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 49 | # --notes=[notes] More human-readable information about this configuration |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 53 | # --noconfigure Don't run configure |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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; |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 64 | use File::Spec; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 75 | $timestamp $notes); |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 76 | |
| 77 | # version of this script |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 78 | $version='2014-11-25'; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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'; |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 90 | $configurebuild = 1; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 91 | while ($ARGV[0]) { |
| 92 | if ($ARGV[0] =~ /--target=/) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 93 | $targetos = (split(/=/, shift @ARGV, 2))[1]; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 94 | } |
| 95 | elsif ($ARGV[0] =~ /--setup=/) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 96 | $setupfile = (split(/=/, shift @ARGV, 2))[1]; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 97 | } |
| 98 | elsif ($ARGV[0] =~ /--extvercmd=/) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 99 | $extvercmd = (split(/=/, shift @ARGV, 2))[1]; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 100 | } |
| 101 | elsif ($ARGV[0] =~ /--mktarball=/) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 102 | $mktarball = (split(/=/, shift @ARGV, 2))[1]; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 103 | } |
| 104 | elsif ($ARGV[0] =~ /--name=/) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 105 | $name = (split(/=/, shift @ARGV, 2))[1]; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 106 | } |
| 107 | elsif ($ARGV[0] =~ /--email=/) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 108 | $email = (split(/=/, shift @ARGV, 2))[1]; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 109 | } |
| 110 | elsif ($ARGV[0] =~ /--desc=/) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 111 | $desc = (split(/=/, shift @ARGV, 2))[1]; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 112 | } |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 113 | elsif ($ARGV[0] =~ /--notes=/) { |
| 114 | $notes = (split(/=/, shift @ARGV, 2))[1]; |
| 115 | } |
| 116 | elsif ($ARGV[0] =~ /--configure=(.*)/) { |
| 117 | $confopts = $1; |
| 118 | shift @ARGV; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 | } |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 128 | elsif ($ARGV[0] =~ /--noconfigure/) { |
| 129 | $configurebuild=0; |
| 130 | shift @ARGV; |
| 131 | } |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 | |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 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")) { |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 273 | while (<F>) { |
| 274 | if (/(\w+)=(.*)/) { |
| 275 | eval "\$$1=$2;"; |
| 276 | } |
| 277 | } |
| 278 | close(F); |
| 279 | $infixed=$fixed; |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 280 | } |
| 281 | else { |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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"; |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 323 | print F "notes='$notes'\n"; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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"; |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 346 | logit "NOTES = $notes"; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 347 | logit "CONFOPTS = $confopts"; |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 348 | logit "RUNTESTOPTS = ".$runtestopts; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 349 | logit "CPPFLAGS = ".$ENV{CPPFLAGS}; |
| 350 | logit "CFLAGS = ".$ENV{CFLAGS}; |
| 351 | logit "LDFLAGS = ".$ENV{LDFLAGS}; |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 352 | logit "LIBS = ".$ENV{LIBS}; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 353 | logit "CC = ".$ENV{CC}; |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 354 | logit "TMPDIR = ".$ENV{TMPDIR}; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 355 | logit "MAKEFLAGS = ".$ENV{MAKEFLAGS}; |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 356 | logit "ACLOCAL_FLAGS = ".$ENV{ACLOCAL_FLAGS}; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 357 | logit "PKG_CONFIG_PATH = ".$ENV{PKG_CONFIG_PATH}; |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 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}; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 | |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 373 | my $have_embedded_ares = 0; |
| 374 | |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 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"); |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 383 | } elsif (!$git && -f "$CURLDIR/tests/testcurl.pl") { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 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"); |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 387 | } else { |
| 388 | mydie "$CURLDIR is not a daily source dir or checked out from git!" |
| 389 | } |
| 390 | } |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 391 | |
| 392 | # make the path absolute so we can use it everywhere |
| 393 | $CURLDIR = File::Spec->rel2abs("$CURLDIR"); |
| 394 | |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 420 | my $gitstat = 0; |
| 421 | my @commits; |
| 422 | |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 423 | # update quietly to the latest git |
| 424 | if($nogitpull) { |
| 425 | logit "skipping git pull (--nogitpull)"; |
| 426 | } else { |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 ($?); |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 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 { |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 ($?); |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 454 | |
| 455 | # Set timestamp to the UTC the git update took place. |
| 456 | $timestamp = scalar(gmtime)." UTC" if (!$gitstat); |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 457 | } |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 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"; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 479 | logit "invoke buildconf"; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 480 | open(F, "./buildconf 2>&1 |") or die; |
| 481 | open(LOG, ">$buildlog") or die; |
| 482 | while (<F>) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 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; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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 |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 566 | print `$CURLDIR/configure $confopts 2>&1`; |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 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/)) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 576 | system("xcopy /s /q \"$CURLDIR\" ."); |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 577 | system("buildconf.bat"); |
| 578 | } |
| 579 | elsif ($targetos =~ /netware/) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 580 | system("cp -afr $CURLDIR/* ."); |
| 581 | system("cp -af $CURLDIR/Makefile.dist Makefile"); |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 582 | system("$make -i -C lib -f Makefile.netware prebuild"); |
| 583 | system("$make -i -C src -f Makefile.netware prebuild"); |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 584 | if (-d "$CURLDIR/ares") { |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 585 | system("$make -i -C ares -f Makefile.netware prebuild"); |
| 586 | } |
| 587 | } |
| 588 | elsif ($^O eq 'linux') { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 589 | system("cp -afr $CURLDIR/* ."); |
| 590 | system("cp -af $CURLDIR/Makefile.dist Makefile"); |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 591 | system("$make -i -C lib -f Makefile.$targetos prebuild"); |
| 592 | system("$make -i -C src -f Makefile.$targetos prebuild"); |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 593 | if (-d "$CURLDIR/ares") { |
| 594 | system("cp -af $CURLDIR/ares/ares_build.h.dist ./ares/ares_build.h"); |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 595 | system("$make -i -C ares -f Makefile.$targetos prebuild"); |
| 596 | } |
| 597 | } |
| 598 | } |
| 599 | |
| 600 | if(-f "./libcurl.pc") { |
| 601 | logit_spaced "display libcurl.pc"; |
| 602 | if(open(F, "<./libcurl.pc")) { |
| 603 | while(<F>) { |
| 604 | my $ll = $_; |
| 605 | print $ll if(($ll !~ /^ *#/) && ($ll !~ /^ *$/)); |
| 606 | } |
| 607 | close(F); |
| 608 | } |
| 609 | } |
| 610 | |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 611 | logit_spaced "display lib/$confheader"; |
| 612 | open(F, "lib/$confheader") or die "lib/$confheader: $!"; |
| 613 | while (<F>) { |
| 614 | print if /^ *#/; |
| 615 | } |
| 616 | close(F); |
| 617 | |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 618 | if (($have_embedded_ares) && |
| 619 | (grepfile("^#define USE_ARES", "lib/$confheader"))) { |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 620 | print "\n"; |
| 621 | logit "setup to build ares"; |
| 622 | |
| 623 | if(-f "./ares/libcares.pc") { |
| 624 | logit_spaced "display ares/libcares.pc"; |
| 625 | if(open(F, "<./ares/libcares.pc")) { |
| 626 | while(<F>) { |
| 627 | my $ll = $_; |
| 628 | print $ll if(($ll !~ /^ *#/) && ($ll !~ /^ *$/)); |
| 629 | } |
| 630 | close(F); |
| 631 | } |
| 632 | } |
| 633 | |
| 634 | if(-f "./ares/ares_build.h") { |
| 635 | logit_spaced "display ares/ares_build.h"; |
| 636 | if(open(F, "<./ares/ares_build.h")) { |
| 637 | while(<F>) { |
| 638 | my $ll = $_; |
| 639 | print $ll if(($ll =~ /^ *# *define *CARES_/) && ($ll !~ /__CARES_BUILD_H/)); |
| 640 | } |
| 641 | close(F); |
| 642 | } |
| 643 | } |
| 644 | else { |
| 645 | mydie "no ares_build.h created/found"; |
| 646 | } |
| 647 | |
| 648 | $confheader =~ s/curl/ares/; |
| 649 | logit_spaced "display ares/$confheader"; |
| 650 | if(open(F, "ares/$confheader")) { |
| 651 | while (<F>) { |
| 652 | print if /^ *#/; |
| 653 | } |
| 654 | close(F); |
| 655 | } |
| 656 | |
| 657 | print "\n"; |
| 658 | logit "build ares"; |
| 659 | chdir "ares"; |
| 660 | |
| 661 | if ($targetos && !$configurebuild) { |
| 662 | logit "$make -f Makefile.$targetos"; |
| 663 | open(F, "$make -f Makefile.$targetos 2>&1 |") or die; |
| 664 | } |
| 665 | else { |
| 666 | logit "$make"; |
| 667 | open(F, "$make 2>&1 |") or die; |
| 668 | } |
| 669 | while (<F>) { |
| 670 | s/$pwd//g; |
| 671 | print; |
| 672 | } |
| 673 | close(F); |
| 674 | |
| 675 | if (-f "libcares$libext") { |
| 676 | logit "ares is now built successfully (libcares$libext)"; |
| 677 | } else { |
| 678 | mydie "ares build failed (libcares$libext)"; |
| 679 | } |
| 680 | |
| 681 | # cd back to the curl build dir |
| 682 | chdir "$pwd/$build"; |
| 683 | } |
| 684 | |
| 685 | my $mkcmd = "$make -i" . ($targetos && !$configurebuild ? " $targetos" : ""); |
| 686 | logit "$mkcmd"; |
| 687 | open(F, "$mkcmd 2>&1 |") or die; |
| 688 | while (<F>) { |
| 689 | s/$pwd//g; |
| 690 | print; |
| 691 | } |
| 692 | close(F); |
| 693 | |
| 694 | if (-f "lib/libcurl$libext") { |
| 695 | logit "libcurl was created fine (libcurl$libext)"; |
| 696 | } |
| 697 | else { |
| 698 | mydie "libcurl was not created (libcurl$libext)"; |
| 699 | } |
| 700 | |
| 701 | if (-f "src/curl$binext") { |
| 702 | logit "curl was created fine (curl$binext)"; |
| 703 | } |
| 704 | else { |
| 705 | mydie "curl was not created (curl$binext)"; |
| 706 | } |
| 707 | |
| 708 | if (!$crosscompile || (($extvercmd ne '') && (-x $extvercmd))) { |
| 709 | logit "display curl${binext} --version output"; |
| 710 | my $cmd = ($extvercmd ne '' ? $extvercmd.' ' : '')."./src/curl${binext} --version|"; |
| 711 | open(F, $cmd); |
| 712 | while(<F>) { |
| 713 | # strip CR from output on non-win32 platforms (wine on Linux) |
| 714 | s/\r// if ($^O ne 'MSWin32'); |
| 715 | print; |
| 716 | } |
| 717 | close(F); |
| 718 | } |
| 719 | |
| 720 | if ($configurebuild && !$crosscompile) { |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 721 | my $host_triplet = get_host_triplet(); |
| 722 | # build example programs for selected build targets |
| 723 | if(($host_triplet =~ /([^-]+)-([^-]+)-irix(.*)/) || |
| 724 | ($host_triplet =~ /([^-]+)-([^-]+)-aix(.*)/) || |
| 725 | ($host_triplet =~ /([^-]+)-([^-]+)-osf(.*)/) || |
| 726 | ($host_triplet =~ /([^-]+)-([^-]+)-solaris2(.*)/)) { |
| 727 | chdir "$pwd/$build/docs/examples"; |
| 728 | logit_spaced "build examples"; |
| 729 | open(F, "$make -i 2>&1 |") or die; |
| 730 | open(LOG, ">$buildlog") or die; |
| 731 | while (<F>) { |
| 732 | s/$pwd//g; |
| 733 | print; |
| 734 | print LOG; |
| 735 | } |
| 736 | close(F); |
| 737 | close(LOG); |
| 738 | chdir "$pwd/$build"; |
| 739 | } |
| 740 | # build and run full test suite |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 741 | my $o; |
| 742 | if($runtestopts) { |
| 743 | $o = "TEST_F=\"$runtestopts\" "; |
| 744 | } |
| 745 | logit "$make -k ${o}test-full"; |
| 746 | open(F, "$make -k ${o}test-full 2>&1 |") or die; |
| 747 | open(LOG, ">$buildlog") or die; |
| 748 | while (<F>) { |
| 749 | s/$pwd//g; |
| 750 | print; |
| 751 | print LOG; |
| 752 | } |
| 753 | close(F); |
| 754 | close(LOG); |
| 755 | |
| 756 | if (grepfile("^TEST", $buildlog)) { |
| 757 | logit "tests were run"; |
| 758 | } else { |
| 759 | mydie "test suite failure"; |
| 760 | } |
| 761 | |
| 762 | if (grepfile("^TESTFAIL:", $buildlog)) { |
| 763 | logit "the tests were not successful"; |
| 764 | } else { |
| 765 | logit "the tests were successful!"; |
| 766 | } |
| 767 | } |
| 768 | else { |
| 769 | if($crosscompile) { |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 770 | my $host_triplet = get_host_triplet(); |
Bertrand SIMONNET | e6cd738 | 2015-07-01 15:39:44 -0700 | [diff] [blame] | 771 | # build example programs for selected cross-compiles |
| 772 | if(($host_triplet =~ /([^-]+)-([^-]+)-mingw(.*)/) || |
| 773 | ($host_triplet =~ /([^-]+)-([^-]+)-android(.*)/)) { |
| 774 | chdir "$pwd/$build/docs/examples"; |
| 775 | logit_spaced "build examples"; |
| 776 | open(F, "$make -i 2>&1 |") or die; |
| 777 | open(LOG, ">$buildlog") or die; |
| 778 | while (<F>) { |
| 779 | s/$pwd//g; |
| 780 | print; |
| 781 | print LOG; |
| 782 | } |
| 783 | close(F); |
| 784 | close(LOG); |
| 785 | chdir "$pwd/$build"; |
| 786 | } |
| 787 | # build test harness programs for selected cross-compiles |
Lucas Eckels | 9bd90e6 | 2012-08-06 15:07:02 -0700 | [diff] [blame] | 788 | if($host_triplet =~ /([^-]+)-([^-]+)-mingw(.*)/) { |
| 789 | chdir "$pwd/$build/tests"; |
| 790 | logit_spaced "build test harness"; |
| 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 | logit_spaced "cross-compiling, can't run tests"; |
| 803 | } |
| 804 | # dummy message to feign success |
| 805 | print "TESTDONE: 1 tests out of 0 (dummy message)\n"; |
| 806 | } |
| 807 | |
| 808 | # create a tarball if we got that option. |
| 809 | if (($mktarball ne '') && (-x $mktarball)) { |
| 810 | system($mktarball); |
| 811 | } |
| 812 | |
| 813 | # mydie to cleanup |
| 814 | mydie "ending nicely"; |