[JHBuild] Do not try to update the dependencies if jhbuild configuration hasn't changed
[WebKit-https.git] / Tools / Scripts / update-webkit-libs-jhbuild
1 #!/usr/bin/perl -w
2 # Copyright (C) 2011 Igalia S.L.
3 # Copyright (C) 2012 Intel Corporation
4 # Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
5 #
6 # This library is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU Lesser General Public
8 # License as published by the Free Software Foundation; either
9 # version 2 of the License, or (at your option) any later version.
10 #
11 # This library is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # Lesser General Public License for more details.
15 #
16 # You should have received a copy of the GNU Lesser General Public
17 # License along with this library; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19
20 use FindBin;
21 use lib $FindBin::Bin;
22 use webkitdirs;
23 use Getopt::Long qw(:config pass_through);
24
25 my $platform = "";
26 $platform = "efl" if isEfl();
27 $platform = "gtk" if isGtk();
28
29 if (!$platform) {
30     die "No platform specified for " . basename($0) .". Use --gtk or --efl.\n";
31 }
32
33 my $wipeOnChange = $ENV{JHBUILD_WIPE_ON_CHANGE} // 1;
34 my $force = 0;
35
36 GetOptions(
37     'wipe-on-change!' => \$wipeOnChange,
38     'force' => \$force
39 );
40
41 sub getMD5HashForFile($)
42 {
43     my $file = shift;
44
45     open(FILE_CONTENTS, $file);
46
47     my $contents = "";
48     while (<FILE_CONTENTS>) {
49         $contents .= $_;
50     }
51
52     close(FILE_CONTENTS);
53
54     return md5_hex($contents);
55 }
56
57 sub jhbuildConfigurationChanged()
58 {
59     foreach my $file (qw(jhbuildrc jhbuild.modules)) {
60         my $path = join('/', getJhbuildPath(), $file . '.md5sum');
61         if (! -e $path) {
62             return 1;
63         }
64
65         # Get the md5 sum of the file we're testing, look in the right platform directory.
66         my $actualFile = join('/', sourceDir(), 'Tools', $platform, $file);
67         my $currentSum = getMD5HashForFile($actualFile);
68
69         # Get our previous record.
70         open(PREVIOUS_MD5, $path);
71         chomp(my $previousSum = <PREVIOUS_MD5>);
72         close(PREVIOUS_MD5);
73
74         if ($previousSum ne $currentSum) {
75             return 1;
76         }
77     }
78 }
79
80 sub saveJhbuildMd5() {
81     # Save md5sum for jhbuild-related files.saveJhbuildMd5();
82     my $jhbuildPath = getJhbuildPath();
83     (-d $jhbuildPath) || mkpath $jhbuildPath;
84     foreach my $file (qw(jhbuildrc jhbuild.modules)) {
85         my $source = join('/', sourceDir(), "Tools", $platform, $file);
86         my $destination = join('/', $jhbuildPath, $file);
87         open(SUM, ">$destination" . ".md5sum");
88         print SUM getMD5HashForFile($source);
89         close(SUM);
90     }
91 }
92
93 sub deleteJhbuildMd5() {
94     my $jhbuildPath = getJhbuildPath();
95     if (!-d $jhbuildPath) {
96         return;
97     }
98     foreach my $file (qw(jhbuildrc jhbuild.modules)) {
99         my $md5File = join('/', $jhbuildPath, $file) . ".md5sum";
100         unlink($md5File) if -e $md5File;
101     }
102 }
103
104 sub runJhbuild
105 {
106     my $command = shift;
107     my @jhbuildArgs = ("./jhbuild-wrapper", "--".$platform, $command);
108     push(@jhbuildArgs, @ARGV[0..$#ARGV]);
109     return system(@jhbuildArgs);
110 }
111
112 sub cleanJhbuild()
113 {
114     # If the configuration changed, dependencies may have been removed.
115     # Since we lack a granular way of uninstalling those we wipe out the
116     # jhbuild root and start from scratch.
117     my $jhbuildPath = getJhbuildPath();
118     if (system("rm -rf $jhbuildPath/Root") ne 0) {
119         die "Cleaning jhbuild root failed!";
120     }
121
122     if (system("rm -rf $jhbuildPath/Source") ne 0) {
123         die "Cleaning jhbuild sources failed!";
124     }
125 }
126
127 delete $ENV{AR_FLAGS} if exists $ENV{AR_FLAGS};
128
129 chdir(relativeScriptsDir() . "/../jhbuild") or die $!;
130
131 my %prettyPlatform = ( "efl" => "EFL", "gtk" => "GTK+" );
132
133 if (!$force && !jhbuildConfigurationChanged()) {
134     print $prettyPlatform{$platform} . " port dependencies are already up to date\n";
135     exit 0;
136 }
137
138 if ($wipeOnChange && -e getJhbuildPath()) {
139     cleanJhbuild();
140 }
141
142 print "Updating " . $prettyPlatform{$platform} . " port dependencies using jhbuild...\n";
143 if (runJhbuild("build") == 0) {
144     saveJhbuildMd5();
145 } else {
146     deleteJhbuildMd5();
147     die "Failed to build " . $prettyPlatform{$platform} . " port dependencies with jhbuild\n";
148 }