[Win] Switch to CMake
[WebKit-https.git] / Source / cmake / 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;
38 my $WEBKIT_LIBRARIES = $ENV{'WEBKIT_LIBRARIES'};
39 if (defined $WEBKIT_LIBRARIES) {
40     $thisDirectory = File::Spec->catfile($WEBKIT_LIBRARIES, 'tools', 'scripts');
41 } else {
42     $thisDirectory = dirname(abs_path($0));
43 }
44
45 my $FALLBACK_VERSION_PATH = File::Spec->catfile($thisDirectory, 'VERSION');
46 open(FALLBACK_VERSION_FILE, '<', $FALLBACK_VERSION_PATH) or die "Unable to open $FALLBACK_VERSION_PATH: $!";
47 my $FALLBACK_VERSION = <FALLBACK_VERSION_FILE>;
48 close FALLBACK_VERSION_FILE;
49 chomp($FALLBACK_VERSION);
50
51 my $COPYRIGHT_END_YEAR_PATH = File::Spec->catfile($thisDirectory, 'COPYRIGHT-END-YEAR');
52 open(COPYRIGHT_END_YEAR_FILE, '<', $COPYRIGHT_END_YEAR_PATH) or die "Unable to open $COPYRIGHT_END_YEAR_PATH: $!";
53 my $COPYRIGHT_END_YEAR = <COPYRIGHT_END_YEAR_FILE>;
54 close COPYRIGHT_END_YEAR_FILE;
55 chomp($COPYRIGHT_END_YEAR);
56
57 # Make sure we don't have any leading or trailing quote
58 $ARGV[0] =~ s/^\"//;
59 $ARGV[0] =~ s/\"$//;
60
61 my $OUTPUT_DIR = File::Spec->catdir(File::Spec->canonpath($ARGV[0]), 'include');
62 unless (-d $OUTPUT_DIR) {
63     make_path($OUTPUT_DIR) or die "Couldn't create $OUTPUT_DIR: $!";
64 }
65
66 my $OUTPUT_FILE = File::Spec->catfile($OUTPUT_DIR, 'autoversion.h');
67
68 # Take the initial version number from RC_ProjectSourceVersion if it
69 # exists, otherwise fall back to the version number stored in the source.
70 my $ENVIRONMENT_VERSION = $ENV{'RC_ProjectSourceVersion'} || $ENV{'RC_PROJECTSOURCEVERSION'};
71 my $PROPOSED_VERSION = $ENVIRONMENT_VERSION || $FALLBACK_VERSION;
72 chomp($PROPOSED_VERSION);
73
74 my ($BUILD_MAJOR_VERSION, $BUILD_MINOR_VERSION, $BUILD_TINY_VERSION, $BUILD_VARIANT_VERSION, $ADJUSTED_PROPOSED_VERSION, $FULL_BUILD_MAJOR_VERSION) = splitVersion($PROPOSED_VERSION);
75
76 my $TINY_VERSION = $BUILD_TINY_VERSION;
77 my $VERSION_TEXT = $ADJUSTED_PROPOSED_VERSION;
78 my $VERSION_TEXT_SHORT = $VERSION_TEXT;
79
80 my $SVN_REVISION = '';
81 if (!$ENVIRONMENT_VERSION) {
82     # If we didn't pull the version number from the environment then we're doing
83     # an engineering build and we'll stamp the build with some more information.
84
85     my $BUILD_DATE = localtime(time);
86     my $SVN_REVISION = `svn info`;
87     $SVN_REVISION =~ m/Revision: (\d+)/;
88     $SVN_REVISION= $1;
89
90     chomp($BUILD_DATE);
91     chomp($SVN_REVISION);
92
93     $VERSION_TEXT_SHORT .= "+";
94     my $USER = Win32::LoginName;
95     $VERSION_TEXT = "$VERSION_TEXT_SHORT $USER - $BUILD_DATE - r$SVN_REVISION";
96 }
97
98 open(OUTPUT_FILE, '>', $OUTPUT_FILE) or die "Couldn't open $OUTPUT_FILE: $!";
99 print OUTPUT_FILE <<EOF;
100 #define __VERSION_TEXT__ "$VERSION_TEXT"
101 #define __BUILD_NUMBER__ "$VERSION_TEXT"
102 #define __BUILD_NUMBER_SHORT__ "$VERSION_TEXT_SHORT"
103 #define __VERSION_MAJOR__ $BUILD_MAJOR_VERSION
104 #define __VERSION_MINOR__ $BUILD_MINOR_VERSION
105 #define __VERSION_TINY__ $BUILD_TINY_VERSION
106 #define __VERSION_BUILD__ $BUILD_VARIANT_VERSION
107 #define __BUILD_NUMBER_MAJOR__ $BUILD_MAJOR_VERSION
108 #define __BUILD_NUMBER_MINOR__ $BUILD_MINOR_VERSION
109 #define __BUILD_NUMBER_VARIANT__ $BUILD_TINY_VERSION
110 #define __SVN_REVISION__ $SVN_REVISION
111 #define __FULL_BUILD_MAJOR_VERSION__  $FULL_BUILD_MAJOR_VERSION
112 EOF
113
114 if (defined $COPYRIGHT_END_YEAR) {
115     print OUTPUT_FILE "#define __COPYRIGHT_YEAR_END_TEXT__ \"$COPYRIGHT_END_YEAR\"\n";
116 }
117 close(OUTPUT_FILE);
118
119 sub packTwoValues($$)
120 {
121     my $first = shift;
122     my $second = shift;
123
124     die "First version component ($first) is too large. Must be between 0 and 99" if ($first > 99);
125     die "Second version component ($second) is too large. Must be between 0 and 999" if ($second > 999);
126
127     return $first * 1000 + $second;
128 }
129
130 sub splitVersion($)
131 {
132     my $PROPOSED_VERSION = shift;
133
134     $PROPOSED_VERSION =~ s/^\s+//g; # Get rid of any leading whitespace
135     $PROPOSED_VERSION =~ s/\s+$//g; # Get rid of any trailing whitespace
136
137     # Split out the components of the dotted version number.
138     my @components = split(/\./, $PROPOSED_VERSION) or die "Couldn't parse $PROPOSED_VERSION";
139     my $componentCount = scalar(@components);
140
141     my $BUILD_MAJOR_VERSION = $components[0];
142
143     # Have the minor and tiny components default to zero if not present.
144     my $BUILD_MINOR_VERSION = 0;
145     my $BUILD_TINY_VERSION = 0;
146     my $BUILD_MICRO_VERSION = 0;
147     my $BUILD_NANO_VERSION = 0;
148     if ($componentCount > 1) {
149         $BUILD_MINOR_VERSION = $components[1];
150     }
151     if ($componentCount > 2) {
152         $BUILD_TINY_VERSION = $components[2];
153     }
154     if ($componentCount > 3) {
155         $BUILD_MICRO_VERSION = $components[3];
156     }
157
158     my $RETURN_NANO_VERSION = $ENV{'RC_ProjectBuildVersion'} || $ENV{'RC_PROJECTBUILDVERSION'} || $BUILD_MICRO_VERSION;
159     if ($componentCount > 4) {
160         $BUILD_NANO_VERSION = $components[4];
161         $RETURN_NANO_VERSION = $BUILD_NANO_VERSION;
162     }
163
164     # Cut the major component down to three characters by dropping any
165     # extra leading digits, then adjust the major version portion of the
166     # version string to match.
167     my $originalLength = length($BUILD_MAJOR_VERSION);
168     my $FULL_BUILD_MAJOR_VERSION = $BUILD_MAJOR_VERSION;
169     $BUILD_MAJOR_VERSION =~ s/^.*(\d\d\d)$/$1/;
170
171     my $charactersToRemove = $originalLength - length($BUILD_MAJOR_VERSION);
172
173     $PROPOSED_VERSION = substr($PROPOSED_VERSION, $charactersToRemove);
174
175     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);
176 }