Enable same features on all Windows ports.
[WebKit-https.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 die "You must supply an output path as the argument.\n" if ($#ARGV < 0);
32
33 my $WEBKIT_LIBRARIES = $ENV{'WEBKIT_LIBRARIES'};
34
35 my ($COPYRIGHT_END_YEAR, $FALLBACK_VERSION);
36 if (defined $WEBKIT_LIBRARIES) {
37     my $FALLBACK_VERSION_PATH = File::Spec->catfile($WEBKIT_LIBRARIES, 'tools', 'scripts', 'VERSION');
38     open(FALLBACK_VERSION_FILE, '<', $FALLBACK_VERSION_PATH) or die "Unable to open $FALLBACK_VERSION_PATH: $!";
39     $FALLBACK_VERSION = <FALLBACK_VERSION_FILE>;
40     close FALLBACK_VERSION_FILE;
41     chomp($FALLBACK_VERSION);
42
43     my $COPYRIGHT_END_YEAR_PATH = File::Spec->catfile($WEBKIT_LIBRARIES, 'tools', 'scripts', 'COPYRIGHT-END-YEAR');
44     open(COPYRIGHT_END_YEAR_FILE, '<', $COPYRIGHT_END_YEAR_PATH) or die "Unable to open $COPYRIGHT_END_YEAR_PATH: $!";
45     $COPYRIGHT_END_YEAR = <COPYRIGHT_END_YEAR_FILE>;
46     close COPYRIGHT_END_YEAR_FILE;
47     chomp($COPYRIGHT_END_YEAR);
48 }
49
50 # Make sure we don't have any leading or trailing quote
51 $ARGV[0] =~ s/^\"//;
52 $ARGV[0] =~ s/\"$//;
53
54 my $OUTPUT_DIR = File::Spec->catdir(File::Spec->canonpath($ARGV[0]), 'include');
55 unless (-d $OUTPUT_DIR) {
56     make_path($OUTPUT_DIR) or die "Couldn't create $OUTPUT_DIR: $!";
57 }
58
59 my $OUTPUT_FILE = File::Spec->catfile($OUTPUT_DIR, 'autoversion.h');
60
61 # Take the initial version number from RC_ProjectSourceVersion if it
62 # exists, otherwise fall back to the version number stored in the source.
63 my $ENVIRONMENT_VERSION = $ENV{'RC_ProjectSourceVersion'};
64 if (!defined $ENVIRONMENT_VERSION) {
65     $ENVIRONMENT_VERSION = $ENV{'RC_PROJECTSOURCEVERSION'};
66 }
67
68 my $PROPOSED_VERSION = (defined $ENVIRONMENT_VERSION) ? $ENVIRONMENT_VERSION : $FALLBACK_VERSION;
69 chomp($PROPOSED_VERSION);
70
71 # Split out the three components of the dotted version number.  We pad
72 # the input with trailing dots to handle the case where the input version
73 # has fewer components than we expect.
74 $PROPOSED_VERSION =~ m/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/ or die "Couldn't parse $PROPOSED_VERSION";
75 my $BUILD_MAJOR_VERSION = $1;
76 my $BUILD_MINOR_VERSION = $2;
77 my $BUILD_TINY_VERSION = $3;
78
79 # The default version (with no decimals) will be matched by the regexp
80 # to $BUILD_TINY_VERSION. If that happens, we need to move it to
81 # $BUILD_MAJOR_VERSION.
82 if (!defined $BUILD_MAJOR_VERSION && !defined $BUILD_MINOR_VERSION) {
83     $BUILD_MAJOR_VERSION = $BUILD_TINY_VERSION;
84     $BUILD_TINY_VERSION = 0;
85 }
86
87 # Cut the major component down to three characters by dropping any
88 # extra leading digits, then adjust the major version portion of the
89 # version string to match.
90 $BUILD_MAJOR_VERSION =~ s/^.*(\d\d\d+)$/$1/;
91
92 # Have the minor and tiny components default to zero if not present.
93 if (!defined $BUILD_MINOR_VERSION) {
94     $BUILD_MINOR_VERSION = 0;
95 }
96 if (!defined $BUILD_TINY_VERSION) {
97     $BUILD_TINY_VERSION = 0;
98 }
99
100 $PROPOSED_VERSION = "$BUILD_MAJOR_VERSION.$BUILD_MINOR_VERSION.$BUILD_TINY_VERSION";
101
102 # Split the first component further by using the first digit for the
103 # major version and the remaining two characters as the minor version.
104 # The minor version is shifted down to the tiny version, with the tiny
105 # version becoming the variant version.
106 $BUILD_MAJOR_VERSION =~ m/^.*(\d)(\d\d)/;
107 my $MAJOR_VERSION = $1;
108 my $MINOR_VERSION = $2;
109 my $TINY_VERSION = $BUILD_MINOR_VERSION;
110 my $VARIANT_VERSION = $BUILD_TINY_VERSION;
111
112 my $VERSION_TEXT = $PROPOSED_VERSION;
113 my $VERSION_TEXT_SHORT = $VERSION_TEXT;
114
115 my $SVN_REVISION = '';
116 if (!$ENVIRONMENT_VERSION) {
117     # If we didn't pull the version number from the environment then we're doing
118     # an engineering build and we'll stamp the build with some more information.
119
120     my $BUILD_DATE = localtime(time);
121     my $SVN_REVISION = `svn info`;
122     $SVN_REVISION =~ m/Revision: (\d+)/;
123     $SVN_REVISION= $1;
124
125     chomp($BUILD_DATE);
126     chomp($SVN_REVISION);
127
128     $VERSION_TEXT_SHORT .= "+";
129     my $USER = Win32::LoginName;
130     $VERSION_TEXT = "$VERSION_TEXT_SHORT $USER - $BUILD_DATE - r$SVN_REVISION";
131 }
132
133 open(OUTPUT_FILE, '>', $OUTPUT_FILE) or die "Couldn't open $OUTPUT_FILE: $!";
134 print OUTPUT_FILE <<EOF;
135 #define __VERSION_TEXT__ "$VERSION_TEXT"
136 #define __BUILD_NUMBER__ "$VERSION_TEXT"
137 #define __BUILD_NUMBER_SHORT__ "$VERSION_TEXT_SHORT"
138 #define __VERSION_MAJOR__ $MAJOR_VERSION
139 #define __VERSION_MINOR__ $MINOR_VERSION
140 #define __VERSION_TINY__ $TINY_VERSION
141 #define __VERSION_BUILD__ $VARIANT_VERSION
142 #define __BUILD_NUMBER_MAJOR__ $BUILD_MAJOR_VERSION
143 #define __BUILD_NUMBER_MINOR__ $BUILD_MINOR_VERSION
144 #define __BUILD_NUMBER_VARIANT__ $BUILD_TINY_VERSION
145 #define __SVN_REVISION__ $SVN_REVISION
146 EOF
147
148 if (defined $COPYRIGHT_END_YEAR) {
149     print OUTPUT_FILE "#define __COPYRIGHT_YEAR_END_TEXT__ \"$COPYRIGHT_END_YEAR\"\n";
150 }
151 close(OUTPUT_FILE);