[CMake] Use target oriented design for bmalloc
[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 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 = '';
87     if (-d File::Spec->catfile($thisDirectory, '.svn')) {
88         $SVN_REVISION = `svn info`;
89         $SVN_REVISION =~ m/Revision: (\d+)/;
90         $SVN_REVISION= $1;
91     }
92
93     chomp($BUILD_DATE);
94     chomp($SVN_REVISION);
95
96     $VERSION_TEXT_SHORT .= "+";
97     my $USER = Win32::LoginName;
98     $VERSION_TEXT = "$VERSION_TEXT_SHORT $USER - $BUILD_DATE - r$SVN_REVISION";
99 }
100
101 open(OUTPUT_FILE, '>', $OUTPUT_FILE) or die "Couldn't open $OUTPUT_FILE: $!";
102 print OUTPUT_FILE <<EOF;
103 #define __VERSION_TEXT__ "$VERSION_TEXT"
104 #define __BUILD_NUMBER__ "$VERSION_TEXT"
105 #define __BUILD_NUMBER_SHORT__ "$VERSION_TEXT_SHORT"
106 #define __VERSION_MAJOR__ $BUILD_MAJOR_VERSION
107 #define __VERSION_MINOR__ $BUILD_MINOR_VERSION
108 #define __VERSION_TINY__ $BUILD_TINY_VERSION
109 #define __VERSION_BUILD__ $BUILD_VARIANT_VERSION
110 #define __BUILD_NUMBER_MAJOR__ $BUILD_MAJOR_VERSION
111 #define __BUILD_NUMBER_MINOR__ $BUILD_MINOR_VERSION
112 #define __BUILD_NUMBER_VARIANT__ $BUILD_TINY_VERSION
113 #define __SVN_REVISION__ $SVN_REVISION
114 #define __FULL_BUILD_MAJOR_VERSION__  $FULL_BUILD_MAJOR_VERSION
115 EOF
116
117 if (defined $COPYRIGHT_END_YEAR) {
118     print OUTPUT_FILE "#define __COPYRIGHT_YEAR_END_TEXT__ \"$COPYRIGHT_END_YEAR\"\n";
119 }
120 close(OUTPUT_FILE);
121
122 sub packTwoValues($$)
123 {
124     my $first = shift;
125     my $second = shift;
126
127     die "First version component ($first) is too large. Must be between 0 and 99" if ($first > 99);
128     die "Second version component ($second) is too large. Must be between 0 and 999" if ($second > 999);
129
130     return $first * 1000 + $second;
131 }
132
133 sub splitVersion($)
134 {
135     my $PROPOSED_VERSION = shift;
136
137     $PROPOSED_VERSION =~ s/^\s+//g; # Get rid of any leading whitespace
138     $PROPOSED_VERSION =~ s/\s+$//g; # Get rid of any trailing whitespace
139
140     # Split out the components of the dotted version number.
141     my @components = split(/\./, $PROPOSED_VERSION) or die "Couldn't parse $PROPOSED_VERSION";
142     my $componentCount = scalar(@components);
143
144     my $BUILD_MAJOR_VERSION = $components[0];
145
146     # Have the minor and tiny components default to zero if not present.
147     my $BUILD_MINOR_VERSION = 0;
148     my $BUILD_TINY_VERSION = 0;
149     my $BUILD_MICRO_VERSION = 0;
150     my $BUILD_NANO_VERSION = 0;
151     if ($componentCount > 1) {
152         $BUILD_MINOR_VERSION = $components[1];
153     }
154     if ($componentCount > 2) {
155         $BUILD_TINY_VERSION = $components[2];
156     }
157     if ($componentCount > 3) {
158         $BUILD_MICRO_VERSION = $components[3];
159     }
160
161     my $RETURN_NANO_VERSION = $ENV{'RC_ProjectBuildVersion'} || $ENV{'RC_PROJECTBUILDVERSION'} || $BUILD_MICRO_VERSION;
162     if ($componentCount > 4) {
163         $BUILD_NANO_VERSION = $components[4];
164         $RETURN_NANO_VERSION = $BUILD_NANO_VERSION;
165     }
166
167     # Cut the major component down to three characters by dropping any
168     # extra leading digits, then adjust the major version portion of the
169     # version string to match.
170     my $originalLength = length($BUILD_MAJOR_VERSION);
171     my $FULL_BUILD_MAJOR_VERSION = $BUILD_MAJOR_VERSION;
172     $BUILD_MAJOR_VERSION =~ s/^.*(\d\d\d)$/$1/;
173
174     my $charactersToRemove = $originalLength - length($BUILD_MAJOR_VERSION);
175
176     $PROPOSED_VERSION = substr($PROPOSED_VERSION, $charactersToRemove);
177
178     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);
179 }