[Win] Modify version numbering scheme to support 5-tuple versions
[WebKit-https.git] / WebKitLibraries / win / tools / scripts / version-stamp.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use File::Spec;
5
6 # Copyright (C) 2007, 2009, 2014 Apple Inc.  All rights reserved.
7 #
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions
10 # are met:
11 # 1. Redistributions of source code must retain the above copyright
12 #    notice, this list of conditions and the following disclaimer.
13 # 2. Redistributions in binary form must reproduce the above copyright
14 #    notice, this list of conditions and the following disclaimer in the
15 #    documentation and/or other materials provided with the distribution.
16 #
17 # THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
18 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
21 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
25 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 sub exitStatus($);
30
31 my $WEBKIT_LIBRARIES = $ENV{'WEBKIT_LIBRARIES'};
32
33 my $VERSION_STAMPER = File::Spec->catfile($WEBKIT_LIBRARIES, 'tools', 'VersionStamper', 'VersionStamper.exe');
34
35 unless (-e $VERSION_STAMPER) {
36     print "No $VERSION_STAMPER executable. Exiting.\n";
37     exit(0);
38 }
39
40 my ($intdir, $target);
41 if (scalar(@ARGV) > 1) {
42     $intdir = $ARGV[0];
43     $target = $ARGV[1];
44 } else {
45     my @arguments = split(/\s+/, $ARGV[0]) or die "Couldn't parse $ARGV[0]";
46     die "You must supply the build output directory and the target to be stamped with version information.\n" if (scalar(@arguments) < 2);
47     $intdir = $arguments[0];
48     $target = $arguments[1];
49 }
50
51 # Make sure we don't have any leading or trailing quote characters.
52 $intdir =~ s/^\"//;
53 $intdir =~ s/\"$//;
54
55 $target =~ s/^\"//;
56 $target =~ s/\"$//;
57
58 my %components =
59 (
60     '__VERSION_TEXT__' => undef,
61     '__VERSION_MAJOR__' => undef,
62     '__VERSION_MINOR__' => undef,
63     '__VERSION_TINY__' => undef,
64     '__VERSION_BUILD__' => undef,
65 );
66
67 my $VERSION_FILE = File::Spec->catfile(File::Spec->canonpath($intdir), 'include', 'autoversion.h');
68
69 open(VERSION_INFO, '<', $VERSION_FILE) or die "Unable to open $VERSION_FILE: $!\n";
70 while (my $line = <VERSION_INFO>) {
71     foreach my $componentKey (keys %components) {
72         if ($line !~ m/$componentKey/) {
73             next;
74         }
75
76         $line =~ s/#define $componentKey//;
77         $line =~ s/^\s*(.*)\s*$/$1/;
78         $line =~ s/^"(.*)"$/$1/;
79         chomp($line);
80
81         $components{$componentKey} = $line;
82     }
83 }
84 close(VERSION_INFO);
85
86 print "Processing version $components{'__VERSION_TEXT__'} for $target\n";
87
88 my $TARGET_PATH = File::Spec->canonpath($target);
89
90 my $rc = system($VERSION_STAMPER, '--verbose', $TARGET_PATH, '--fileMajor', $components{'__VERSION_MAJOR__'},
91     '--fileMinor', $components{'__VERSION_MINOR__'}, '--fileRevision', $components{'__VERSION_TINY__'},
92     '--fileBuild', $components{'__VERSION_BUILD__'}, '--productMajor', $components{'__VERSION_MAJOR__'},
93     '--productMinor', $components{'__VERSION_MINOR__'}, '--productRevision', $components{'__VERSION_TINY__'},
94     '--productBuild', $components{'__VERSION_BUILD__'}); 
95
96 exit(exitStatus($rc));
97
98 # This method is for portability. Return the system-appropriate exit
99 # status of a child process.
100 #
101 # Args: pass the child error status returned by the last pipe close,
102 #       for example "$?".
103 sub exitStatus($)
104 {
105     my ($returnvalue) = @_;
106     if ($^O eq "MSWin32") {
107         return $returnvalue >> 8;
108     }
109     if (!WIFEXITED($returnvalue)) {
110         return 254;
111     }
112     return WEXITSTATUS($returnvalue);
113 }