[Win] Implement auto-version as a Perl program
[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 my $OUTPUT_DIR = File::Spec->catdir($ARGV[0], 'include');
51 my $OUTPUT_FILE = File::Spec->catfile($OUTPUT_DIR, 'autoversion.h');
52
53 unless (-d $OUTPUT_DIR) {
54     make_path($OUTPUT_DIR) or die "Couldn't create $OUTPUT_DIR: $!";
55 }
56
57 # Take the initial version number from RC_ProjectSourceVersion if it
58 # exists, otherwise fall back to the version number stored in the source.
59 my $ENVIRONMENT_VERSION = $ENV{'RC_ProjectSourceVersion'};
60 if (!defined $ENVIRONMENT_VERSION) {
61     $ENVIRONMENT_VERSION = $ENV{'RC_PROJECTSOURCEVERSION'};
62 }
63
64 my $PROPOSED_VERSION = (defined $ENVIRONMENT_VERSION) ? $ENVIRONMENT_VERSION : $FALLBACK_VERSION;
65 chomp($PROPOSED_VERSION);
66
67 # Split out the three components of the dotted version number.  We pad
68 # the input with trailing dots to handle the case where the input version
69 # has fewer components than we expect.
70 $PROPOSED_VERSION =~ m/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/ or die "Couldn't parse $PROPOSED_VERSION";
71 my $BUILD_MAJOR_VERSION = $1;
72 my $BUILD_MINOR_VERSION = $2;
73 my $BUILD_TINY_VERSION = $3;
74
75 # Cut the major component down to three characters by dropping any
76 # extra leading digits, then adjust the major version portion of the
77 # version string to match.
78 $BUILD_MAJOR_VERSION =~ s/^.*(\d\d\d+)$/$1/;
79
80 # Have the minor and tiny components default to zero if not present.
81 if (!defined $BUILD_MINOR_VERSION) {
82     $BUILD_MINOR_VERSION = 0;
83 }
84 if (!defined $BUILD_TINY_VERSION) {
85     $BUILD_TINY_VERSION = 0;
86 }
87
88 $PROPOSED_VERSION = "$BUILD_MAJOR_VERSION.$BUILD_MINOR_VERSION.$BUILD_TINY_VERSION";
89
90 # Split the first component further by using the first digit for the
91 # major version and the remaining two characters as the minor version.
92 # The minor version is shifted down to the tiny version, with the tiny
93 # version becoming the variant version.
94 $BUILD_MAJOR_VERSION =~ m/^.*(\d)(\d\d)/;
95 my $MAJOR_VERSION = $1;
96 my $MINOR_VERSION = $2;
97 my $TINY_VERSION = $BUILD_MINOR_VERSION;
98 my $VARIANT_VERSION = $BUILD_TINY_VERSION;
99
100 my $VERSION_TEXT = $PROPOSED_VERSION;
101 my $VERSION_TEXT_SHORT = $VERSION_TEXT;
102
103 my $SVN_REVISION = '';
104 if (!$ENVIRONMENT_VERSION) {
105     # If we didn't pull the version number from the environment then we're doing
106     # an engineering build and we'll stamp the build with some more information.
107
108     my $BUILD_DATE = localtime(time);
109     my $SVN_REVISION = `svn info`;
110     $SVN_REVISION =~ m/Revision: (\d+)/;
111     $SVN_REVISION= $1;
112
113     chomp($BUILD_DATE);
114     chomp($SVN_REVISION);
115
116     $VERSION_TEXT_SHORT .= "+";
117     my $USER = Win32::LoginName;
118     $VERSION_TEXT = "$VERSION_TEXT_SHORT $USER - $BUILD_DATE - r$SVN_REVISION";
119 }
120
121 open(OUTPUT_FILE, '>', $OUTPUT_FILE) or die "Couldn't open $OUTPUT_FILE: $!";
122 print OUTPUT_FILE <<EOF;
123 #define __VERSION_TEXT__ "$VERSION_TEXT"
124 #define __BUILD_NUMBER__ "$VERSION_TEXT"
125 #define __BUILD_NUMBER_SHORT__ "$VERSION_TEXT_SHORT"
126 #define __VERSION_MAJOR__ $MAJOR_VERSION
127 #define __VERSION_MINOR__ $MINOR_VERSION
128 #define __VERSION_TINY__ $TINY_VERSION
129 #define __VERSION_BUILD__ $VARIANT_VERSION
130 #define __BUILD_NUMBER_MAJOR__ $BUILD_MAJOR_VERSION
131 #define __BUILD_NUMBER_MINOR__ $BUILD_MINOR_VERSION
132 #define __BUILD_NUMBER_VARIANT__ $BUILD_TINY_VERSION
133 #define __SVN_REVISION__ $SVN_REVISION
134 EOF
135
136 if (defined $COPYRIGHT_END_YEAR) {
137     print OUTPUT_FILE "#define __COPYRIGHT_YEAR_END_TEXT__ \"$COPYRIGHT_END_YEAR\"\n";
138 }
139 close(OUTPUT_FILE);