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