5f7c9808e46e26f19868314879575c8f67dabafe
[WebKit.git] / WebKitLibraries / win / tools / scripts / auto-version.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use File::Path qw(make_path);
5 use File::Spec;
6 use Win32;
7
8 # Copyright (C) 2007, 2009, 2014 Apple Inc.  All rights reserved.
9 #
10 # Redistribution and use in source and binary forms, with or without
11 # modification, are permitted provided that the following conditions
12 # are met:
13 # 1. Redistributions of source code must retain the above copyright
14 #    notice, this list of conditions and the following disclaimer.
15 # 2. Redistributions in binary form must reproduce the above copyright
16 #    notice, this list of conditions and the following disclaimer in the
17 #    documentation and/or other materials provided with the distribution.
18 #
19 # THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
20 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
23 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
27 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
30
31 sub splitVersion($);
32
33 die "You must supply an output path as the argument.\n" if ($#ARGV < 0);
34
35 my $WEBKIT_LIBRARIES = $ENV{'WEBKIT_LIBRARIES'};
36
37 my ($COPYRIGHT_END_YEAR, $FALLBACK_VERSION);
38 if (defined $WEBKIT_LIBRARIES) {
39     my $FALLBACK_VERSION_PATH = File::Spec->catfile($WEBKIT_LIBRARIES, 'tools', 'scripts', 'VERSION');
40     open(FALLBACK_VERSION_FILE, '<', $FALLBACK_VERSION_PATH) or die "Unable to open $FALLBACK_VERSION_PATH: $!";
41     $FALLBACK_VERSION = <FALLBACK_VERSION_FILE>;
42     close FALLBACK_VERSION_FILE;
43     chomp($FALLBACK_VERSION);
44
45     my $COPYRIGHT_END_YEAR_PATH = File::Spec->catfile($WEBKIT_LIBRARIES, 'tools', 'scripts', 'COPYRIGHT-END-YEAR');
46     open(COPYRIGHT_END_YEAR_FILE, '<', $COPYRIGHT_END_YEAR_PATH) or die "Unable to open $COPYRIGHT_END_YEAR_PATH: $!";
47     $COPYRIGHT_END_YEAR = <COPYRIGHT_END_YEAR_FILE>;
48     close COPYRIGHT_END_YEAR_FILE;
49     chomp($COPYRIGHT_END_YEAR);
50 }
51
52 # Make sure we don't have any leading or trailing quote
53 $ARGV[0] =~ s/^\"//;
54 $ARGV[0] =~ s/\"$//;
55
56 my $OUTPUT_DIR = File::Spec->catdir(File::Spec->canonpath($ARGV[0]), 'include');
57 unless (-d $OUTPUT_DIR) {
58     make_path($OUTPUT_DIR) or die "Couldn't create $OUTPUT_DIR: $!";
59 }
60
61 my $OUTPUT_FILE = File::Spec->catfile($OUTPUT_DIR, 'autoversion.h');
62
63 # Take the initial version number from RC_ProjectSourceVersion if it
64 # exists, otherwise fall back to the version number stored in the source.
65 my $ENVIRONMENT_VERSION = $ENV{'RC_ProjectSourceVersion'} || $ENV{'RC_PROJECTSOURCEVERSION'};
66 my $PROPOSED_VERSION = $ENVIRONMENT_VERSION || $FALLBACK_VERSION;
67 chomp($PROPOSED_VERSION);
68
69 my ($BUILD_MAJOR_VERSION, $BUILD_MINOR_VERSION, $BUILD_TINY_VERSION, $BUILD_VARIANT_VERSION, $ADJUSTED_PROPOSED_VERSION, $FULL_BUILD_MAJOR_VERSION) = splitVersion($PROPOSED_VERSION);
70
71 my $TINY_VERSION = $BUILD_TINY_VERSION;
72 my $VERSION_TEXT = $ADJUSTED_PROPOSED_VERSION;
73 my $VERSION_TEXT_SHORT = $VERSION_TEXT;
74
75 my $SVN_REVISION = '';
76 if (!$ENVIRONMENT_VERSION) {
77     # If we didn't pull the version number from the environment then we're doing
78     # an engineering build and we'll stamp the build with some more information.
79
80     my $BUILD_DATE = localtime(time);
81     my $SVN_REVISION = `svn info`;
82     $SVN_REVISION =~ m/Revision: (\d+)/;
83     $SVN_REVISION= $1;
84
85     chomp($BUILD_DATE);
86     chomp($SVN_REVISION);
87
88     $VERSION_TEXT_SHORT .= "+";
89     my $USER = Win32::LoginName;
90     $VERSION_TEXT = "$VERSION_TEXT_SHORT $USER - $BUILD_DATE - r$SVN_REVISION";
91 }
92
93 open(OUTPUT_FILE, '>', $OUTPUT_FILE) or die "Couldn't open $OUTPUT_FILE: $!";
94 print OUTPUT_FILE <<EOF;
95 #define __VERSION_TEXT__ "$VERSION_TEXT"
96 #define __BUILD_NUMBER__ "$VERSION_TEXT"
97 #define __BUILD_NUMBER_SHORT__ "$VERSION_TEXT_SHORT"
98 #define __VERSION_MAJOR__ $BUILD_MAJOR_VERSION
99 #define __VERSION_MINOR__ $BUILD_MINOR_VERSION
100 #define __VERSION_TINY__ $BUILD_TINY_VERSION
101 #define __VERSION_BUILD__ $BUILD_VARIANT_VERSION
102 #define __BUILD_NUMBER_MAJOR__ $BUILD_MAJOR_VERSION
103 #define __BUILD_NUMBER_MINOR__ $BUILD_MINOR_VERSION
104 #define __BUILD_NUMBER_VARIANT__ $BUILD_TINY_VERSION
105 #define __SVN_REVISION__ $SVN_REVISION
106 #define __FULL_BUILD_MAJOR_VERSION__  $FULL_BUILD_MAJOR_VERSION
107 EOF
108
109 if (defined $COPYRIGHT_END_YEAR) {
110     print OUTPUT_FILE "#define __COPYRIGHT_YEAR_END_TEXT__ \"$COPYRIGHT_END_YEAR\"\n";
111 }
112 close(OUTPUT_FILE);
113
114 sub packTwoValues($$)
115 {
116     my $first = shift;
117     my $second = shift;
118
119     die "First version component ($first) is too large. Must be between 0 and 99" if ($first > 99);
120     die "Second version component ($second) is too large. Must be between 0 and 999" if ($second > 999);
121
122     return $first * 1000 + $second;
123 }
124
125 sub splitVersion($)
126 {
127     my $PROPOSED_VERSION = shift;
128
129     $PROPOSED_VERSION =~ s/^\s+//g; # Get rid of any leading whitespace
130     $PROPOSED_VERSION =~ s/\s+$//g; # Get rid of any trailing whitespace
131
132     # Split out the components of the dotted version number.
133     my @components = split(/\./, $PROPOSED_VERSION) or die "Couldn't parse $PROPOSED_VERSION";
134     my $componentCount = scalar(@components);
135
136     my $BUILD_MAJOR_VERSION = $components[0];
137
138     # Have the minor and tiny components default to zero if not present.
139     my $BUILD_MINOR_VERSION = 0;
140     my $BUILD_TINY_VERSION = 0;
141     my $BUILD_MICRO_VERSION = 0;
142     my $BUILD_NANO_VERSION = 0;
143     if ($componentCount > 1) {
144         $BUILD_MINOR_VERSION = $components[1];
145     }
146     if ($componentCount > 2) {
147         $BUILD_TINY_VERSION = $components[2];
148     }
149     if ($componentCount > 3) {
150         $BUILD_MICRO_VERSION = $components[3];
151     }
152
153     my $RETURN_NANO_VERSION = $ENV{'RC_ProjectBuildVersion'} || $ENV{'RC_PROJECTBUILDVERSION'} || $BUILD_MICRO_VERSION;
154     if ($componentCount > 4) {
155         $BUILD_NANO_VERSION = $components[4];
156         $RETURN_NANO_VERSION = $BUILD_NANO_VERSION;
157     }
158
159     # Cut the major component down to three characters by dropping any
160     # extra leading digits, then adjust the major version portion of the
161     # version string to match.
162     my $originalLength = length($BUILD_MAJOR_VERSION);
163     my $FULL_BUILD_MAJOR_VERSION = $BUILD_MAJOR_VERSION;
164     $BUILD_MAJOR_VERSION =~ s/^.*(\d\d\d)$/$1/;
165
166     my $charactersToRemove = $originalLength - length($BUILD_MAJOR_VERSION);
167
168     $PROPOSED_VERSION = substr($PROPOSED_VERSION, $charactersToRemove);
169
170     return ($BUILD_MAJOR_VERSION, packTwoValues($BUILD_MINOR_VERSION, $BUILD_TINY_VERSION), packTwoValues($BUILD_MICRO_VERSION, $BUILD_NANO_VERSION), $RETURN_NANO_VERSION, $PROPOSED_VERSION, $FULL_BUILD_MAJOR_VERSION);
171 }