[GTK] Feature enabling/disabling should be possible through build-webkit
authorzandobersek@gmail.com <zandobersek@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Dec 2012 09:37:28 +0000 (09:37 +0000)
committerzandobersek@gmail.com <zandobersek@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Dec 2012 09:37:28 +0000 (09:37 +0000)
https://bugs.webkit.org/show_bug.cgi?id=99271

Reviewed by Gustavo Noronha Silva.

.:

The autogen.sh script now calls the Tools/gtk/override-feature-defines script
before calling autoreconf. This ensures that Source/WebCore/GNUmakefile.features.am
is present and properly modified if the build-webkit script intends to override
any feature.

The Source/WebCore/GNUmakefile.features.am file is added to the ignored files list
so it doesn't pop out as a new, untracked file.

* .gitignore:
* autogen.sh:

Source/WebCore:

Move the contents of GNUmakefile.features.am into GNUmakefile.features.am.in.
The former is then copied from the latter but then appropriately modified if
the build-webkit script overrides any of the default feature defines.

No new tests - no new testable functionality.

* GNUmakefile.features.am.in: Renamed from Source/WebCore/GNUmakefile.features.am.

Tools:

Refactor the code in webkitdirs.pm that builds an autotools project to generate
autogen.sh arguments, make arguments and installation prefix from the passed-in
parameters rather than generating all of that in build-webkit. The autogen.sh
arguments now contain only enable/disable flags for options that are actually
configurable in configure.ac, the flag value actually reflecting whether the feature
is enabled or disabled in the feature list.

Other features are overridable through modifying the GNUmakefile.features.am file.
All these features are now stored in the build directory and upon change trigger
a rerun of the autogen.sh script, pretty much like the autogen.sh arguments do.

The override-feature-defines script is called by autogen.sh, before GNUmakefile.in is
generated when calling autoreconf. Its task is to copy the GNUmakefile.features.am.in
into GNUmakefile.features.am and modify it if there's a text file in the build directory
that contains all the feature defines the build-webkit script has written. If the build
is not done through build-webkit (and there's no file in build directory listing all the
feature defines) the script does not advance further from copying.

This approach is taken to overcome the rigidness of the automake system as it's impossible
to effectively generate and use GNUmakefile.features.am or even GNUmakefile.features file
after the autoreconf command execution in autogen.sh.

* Scripts/build-jsc:
(buildMyProject):
* Scripts/build-webkit:
* Scripts/webkitdirs.pm:
(runAutogenForAutotoolsProjectIfNecessary):
(mustReRunAutogen):
(buildAutotoolsProject):
(buildGtkProject):
* Scripts/webkitperl/FeatureList.pm: Update the features that are currently enabled in
Source/WebCore/GNUmakefile.features.am.in but aren't in the feature list.
* Scripts/webkitpy/style/checker.py: Source/WebCore/GNUmakefile.features.am.in is recognized
as a text file and tabulation errors are reported. Skip the file to suppress them.
* gtk/override-feature-defines: Added.
(copy_feature_defines_makefile):
(adjust_feature_defines_makefile):
(adjust_feature_defines_makefile.override_feature_define):
(override_feature_defines):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@137270 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
.gitignore
ChangeLog
Source/WebCore/ChangeLog
Source/WebCore/GNUmakefile.features.am.in [moved from Source/WebCore/GNUmakefile.features.am with 100% similarity]
Tools/ChangeLog
Tools/Scripts/build-jsc
Tools/Scripts/build-webkit
Tools/Scripts/webkitdirs.pm
Tools/Scripts/webkitperl/FeatureList.pm
Tools/Scripts/webkitpy/style/checker.py
Tools/gtk/override-feature-defines [new file with mode: 0755]
autogen.sh

index 38dff01b4603dc475eb8b94c039db5b958cd93ea..349c1357f07cd8e585576e117910cafec1aca6a6 100644 (file)
@@ -47,6 +47,7 @@ tags
 /Source/autotools/ltversion.m4
 /Source/autotools/lt~obsolete.m4
 /Source/autotools/missing
+/Source/WebCore/GNUmakefile.features.am
 /Source/WebKit/gtk/docs/GNUmakefile.in
 /Source/WebKit/gtk/po/*.pot
 /autotoolsconfig.h.in
index 5e374ac22117f7d1e6b7b90f321d1b4c9fbd0ed0..d7d76e93771796ae6313b62108fbb1e9182e14f4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2012-12-11  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Feature enabling/disabling should be possible through build-webkit
+        https://bugs.webkit.org/show_bug.cgi?id=99271
+
+        Reviewed by Gustavo Noronha Silva.
+
+        The autogen.sh script now calls the Tools/gtk/override-feature-defines script
+        before calling autoreconf. This ensures that Source/WebCore/GNUmakefile.features.am
+        is present and properly modified if the build-webkit script intends to override
+        any feature.
+
+        The Source/WebCore/GNUmakefile.features.am file is added to the ignored files list
+        so it doesn't pop out as a new, untracked file.
+
+        * .gitignore:
+        * autogen.sh:
+
 2012-12-10  Martin Robinson  <mrobinson@igalia.com>
 
         [GTK] Remove the Pango backend
index d3bc1540536d7a459ab1afa57b0b081171001a50..13245e42fb6abf4e78a05343b731b5df9d926592 100644 (file)
@@ -1,3 +1,18 @@
+2012-12-11  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Feature enabling/disabling should be possible through build-webkit
+        https://bugs.webkit.org/show_bug.cgi?id=99271
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Move the contents of GNUmakefile.features.am into GNUmakefile.features.am.in.
+        The former is then copied from the latter but then appropriately modified if
+        the build-webkit script overrides any of the default feature defines.
+
+        No new tests - no new testable functionality.
+
+        * GNUmakefile.features.am.in: Renamed from Source/WebCore/GNUmakefile.features.am.
+
 2012-12-11  Jinwoo Song  <jinwoo7.song@samsung.com>
 
         [QT][EFL][WK2] Move the GraphicsSurfaceGLX.cpp to common place
index 9e2ca09956d637568e7ea928617b796accf2b86a..8b3ee42f93dd1485a982be2cda53f35c7d87b7f5 100644 (file)
@@ -1,3 +1,50 @@
+2012-12-11  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Feature enabling/disabling should be possible through build-webkit
+        https://bugs.webkit.org/show_bug.cgi?id=99271
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Refactor the code in webkitdirs.pm that builds an autotools project to generate
+        autogen.sh arguments, make arguments and installation prefix from the passed-in
+        parameters rather than generating all of that in build-webkit. The autogen.sh
+        arguments now contain only enable/disable flags for options that are actually
+        configurable in configure.ac, the flag value actually reflecting whether the feature
+        is enabled or disabled in the feature list.
+
+        Other features are overridable through modifying the GNUmakefile.features.am file.
+        All these features are now stored in the build directory and upon change trigger
+        a rerun of the autogen.sh script, pretty much like the autogen.sh arguments do.
+
+        The override-feature-defines script is called by autogen.sh, before GNUmakefile.in is
+        generated when calling autoreconf. Its task is to copy the GNUmakefile.features.am.in
+        into GNUmakefile.features.am and modify it if there's a text file in the build directory
+        that contains all the feature defines the build-webkit script has written. If the build
+        is not done through build-webkit (and there's no file in build directory listing all the
+        feature defines) the script does not advance further from copying.
+
+        This approach is taken to overcome the rigidness of the automake system as it's impossible
+        to effectively generate and use GNUmakefile.features.am or even GNUmakefile.features file
+        after the autoreconf command execution in autogen.sh.
+
+        * Scripts/build-jsc:
+        (buildMyProject):
+        * Scripts/build-webkit:
+        * Scripts/webkitdirs.pm:
+        (runAutogenForAutotoolsProjectIfNecessary):
+        (mustReRunAutogen):
+        (buildAutotoolsProject):
+        (buildGtkProject):
+        * Scripts/webkitperl/FeatureList.pm: Update the features that are currently enabled in
+        Source/WebCore/GNUmakefile.features.am.in but aren't in the feature list.
+        * Scripts/webkitpy/style/checker.py: Source/WebCore/GNUmakefile.features.am.in is recognized
+        as a text file and tabulation errors are reported. Skip the file to suppress them.
+        * gtk/override-feature-defines: Added.
+        (copy_feature_defines_makefile):
+        (adjust_feature_defines_makefile):
+        (adjust_feature_defines_makefile.override_feature_define):
+        (override_feature_defines):
+
 2012-12-10  Yury Semikhatsky  <yurys@chromium.org>
 
         Memory instrumentation: make sure each edge is reported only once
index 3fbf43fe13758f1d680ae7a5eaa407b3450dca66..ca056f8d7ed1b5478f92b911bc4fabd1f4c3bbe9 100755 (executable)
@@ -85,7 +85,7 @@ sub buildMyProject
         $result = buildVisualStudioProject("$projectName.vcproj/$projectName.sln");
     } elsif (isGtk()) {
         checkForArgumentAndRemoveFromARGV("--gtk");
-        $result = buildGtkProject($projectName, 0, @ARGV);
+        $result = buildGtkProject($projectName, 0);
     } elsif (isWx()) {
         # Builds everything in one-shot. No need to build anything here.
         $result = 0;
index 317534602e29f8057030af34c9dc76fec6e7cf9c..2a9e47d24edffca1e343e06791d8eda9850a2d4d 100755 (executable)
@@ -209,16 +209,7 @@ if ($useGYP) {
 
 my @options = ();
 
-# enable autotool options accordingly
-if (isGtk()) {
-    @options = @ARGV;
-    foreach (@features) {
-        push @options, autotoolsFlag(${$_->{value}}, $_->{option});
-    }
-
-    push @options, "--prefix=" . $prefixPath if defined($prefixPath);
-    push @options, "--makeargs=" . $makeArgs if $makeArgs;
-} elsif (isAppleMacWebKit()) {
+if (isAppleMacWebKit()) {
     push @options, XcodeOptions();
 
     sub option($$$)
@@ -363,10 +354,7 @@ for my $dir (@projects) {
 
     my $project = basename($dir);
     if (isGtk()) {
-        if ($noWebKit2) {
-            unshift(@options, "--disable-webkit2");
-        }
-        $result = buildGtkProject($project, $clean, @options);
+        $result = buildGtkProject($project, $clean, $prefixPath, $makeArgs, $noWebKit2, @features);
     } elsif (isAppleMacWebKit()) {
         my @local_options = @options;
         push @local_options, XcodeCoverageSupportOptions() if $coverageSupport && $project ne "ANGLE";
index 9abd238b5200eb66941f289718fd065620486968..0f9abe747dee496649b08f494fb0b9436a014b50 100755 (executable)
@@ -1906,9 +1906,10 @@ sub autotoolsFlag($$)
 
 sub runAutogenForAutotoolsProjectIfNecessary($@)
 {
-    my ($dir, $prefix, $sourceDir, $project, @buildArgs) = @_;
+    my ($dir, $prefix, $sourceDir, $project, $joinedOverridableFeatures, @buildArgs) = @_;
+
+    my $joinedBuildArgs = join(" ", @buildArgs);
 
-    my $argumentsFile = "previous-autogen-arguments.txt";
     if (-e "GNUmakefile") {
         # Just assume that build-jsc will never be used to reconfigure JSC. Later
         # we can go back and make this more complicated if the demand is there.
@@ -1916,8 +1917,9 @@ sub runAutogenForAutotoolsProjectIfNecessary($@)
             return;
         }
 
-        # We only run autogen.sh again if the arguments passed have changed.
-        if (!mustReRunAutogen($sourceDir, $argumentsFile, @buildArgs)) {
+        # Run autogen.sh again if either the features overrided by build-webkit or build arguments have changed.
+        if (!mustReRunAutogen($sourceDir, "feature-defines-overriding.txt", $joinedOverridableFeatures)
+            && !mustReRunAutogen($sourceDir, "previous-autogen-arguments.txt", $joinedBuildArgs)) {
             return;
         }
     }
@@ -1928,8 +1930,12 @@ sub runAutogenForAutotoolsProjectIfNecessary($@)
     # Only for WebKit, write the autogen.sh arguments to a file so that we can detect
     # when they change and automatically re-run it.
     if ($project eq 'WebKit') {
-        open(AUTOTOOLS_ARGUMENTS, ">$argumentsFile");
-        print AUTOTOOLS_ARGUMENTS join(" ", @buildArgs);
+        open(OVERRIDABLE_FEATURES, ">feature-defines-overriding.txt");
+        print OVERRIDABLE_FEATURES $joinedOverridableFeatures;
+        close(OVERRIDABLE_FEATURES);
+
+        open(AUTOTOOLS_ARGUMENTS, ">previous-autogen-arguments.txt");
+        print AUTOTOOLS_ARGUMENTS $joinedBuildArgs;
         close(AUTOTOOLS_ARGUMENTS);
     }
 
@@ -1963,24 +1969,24 @@ sub getJhbuildPath()
 
 sub mustReRunAutogen($@)
 {
-    my ($sourceDir, $filename, @currentArguments) = @_;
+    my ($sourceDir, $filename, $currentContents) = @_;
 
     if (! -e $filename) {
         return 1;
     }
 
-    open(AUTOTOOLS_ARGUMENTS, $filename);
-    chomp(my $previousArguments = <AUTOTOOLS_ARGUMENTS>);
-    close(AUTOTOOLS_ARGUMENTS);
+    open(CONTENTS_FILE, $filename);
+    chomp(my $previousContents = <CONTENTS_FILE>);
+    close(CONTENTS_FILE);
 
     # We only care about the WebKit2 argument when we are building WebKit itself.
     # build-jsc never passes --enable-webkit2, so if we didn't do this, autogen.sh
     # would run for every single build on the bots, since it runs both build-webkit
     # and build-jsc.
-    my $joinedCurrentArguments = join(" ", @currentArguments);
-    if ($previousArguments ne $joinedCurrentArguments) {
-        print "Previous autogen arguments were: $previousArguments\n\n";
-        print "New autogen arguments are: $joinedCurrentArguments\n";
+    if ($previousContents ne $currentContents) {
+        print "Contents for file $filename have changed.\n";
+        print "Previous contents were: $previousContents\n\n";
+        print "New contents are: $currentContents\n";
         return 1;
     }
 
@@ -1989,12 +1995,11 @@ sub mustReRunAutogen($@)
 
 sub buildAutotoolsProject($@)
 {
-    my ($project, $clean, @buildParams) = @_;
+    my ($project, $clean, $prefix, $makeArgs, $noWebKit2, @features) = @_;
 
     my $make = 'make';
     my $dir = productDir();
     my $config = passedConfiguration() || configuration();
-    my $prefix;
 
     # Use rm to clean the build directory since distclean may miss files
     if ($clean && -d $dir) {
@@ -2010,19 +2015,38 @@ sub buildAutotoolsProject($@)
         return 0;
     }
 
-    my @buildArgs = ();
-    my $makeArgs = $ENV{"WebKitMakeArguments"} || "";
-    for my $i (0 .. $#buildParams) {
-        my $opt = $buildParams[$i];
-        if ($opt =~ /^--makeargs=(.*)/i ) {
-            $makeArgs = $makeArgs . " " . $1;
-        } elsif ($opt =~ /^--prefix=(.*)/i ) {
-            $prefix = $1;
+    my @buildArgs = @ARGV;
+    if ($noWebKit2) {
+        unshift(@buildArgs, "--disable-webkit2");
+    }
+
+    # Configurable features listed here should be kept in sync with the
+    # features for which there exists a configuration option in configure.ac.
+    my %configurableFeatures = (
+        "filters" => 1,
+        "gamepad" => 1,
+        "geolocation" => 1,
+        "indexed-database" => 1,
+        "media-stream" => 1,
+        "svg" => 1,
+        "svg-fonts" => 1,
+        "video" => 1,
+        "webgl" => 1,
+        "web-audio" => 1,
+        "xslt" => 1,
+    );
+    my @overridableFeatures = ();
+    foreach (@features) {
+        if ($configurableFeatures{$_->{option}}) {
+            push @buildArgs, autotoolsFlag(${$_->{value}}, $_->{option});;
         } else {
-            push @buildArgs, $opt;
+            push @overridableFeatures, $_->{define} . "=" . (${$_->{value}} ? "1" : "0");
         }
     }
 
+    $makeArgs = $makeArgs || "";
+    $makeArgs = $makeArgs . " " . $ENV{"WebKitMakeArguments"} if $ENV{"WebKitMakeArguments"};
+
     # Automatically determine the number of CPUs for make only
     # if make arguments haven't already been specified.
     if ($makeArgs eq "") {
@@ -2060,7 +2084,8 @@ sub buildAutotoolsProject($@)
     # If GNUmakefile exists, don't run autogen.sh unless its arguments
     # have changed. The makefile should be smart enough to track autotools
     # dependencies and re-run autogen.sh when build files change.
-    runAutogenForAutotoolsProjectIfNecessary($dir, $prefix, $sourceDir, $project, @buildArgs);
+    my $joinedOverridableFeatures = join(" ", @overridableFeatures);
+    runAutogenForAutotoolsProjectIfNecessary($dir, $prefix, $sourceDir, $project, $joinedOverridableFeatures, @buildArgs);
 
     my $runWithJhbuild = jhbuildWrapperPrefixIfNeeded();
     if (system("$runWithJhbuild $make $makeArgs") ne 0) {
@@ -2406,13 +2431,13 @@ EOF
 
 sub buildGtkProject
 {
-    my ($project, $clean, @buildArgs) = @_;
+    my ($project, $clean, $prefix, $makeArgs, $noWebKit2, @features) = @_;
 
     if ($project ne "WebKit" and $project ne "JavaScriptCore" and $project ne "WTF") {
         die "Unsupported project: $project. Supported projects: WebKit, JavaScriptCore, WTF\n";
     }
 
-    return buildAutotoolsProject($project, $clean, @buildArgs);
+    return buildAutotoolsProject($project, $clean, $prefix, $makeArgs, $noWebKit2, @features);
 }
 
 sub buildChromiumMakefile($$@)
index 9beb5e8f6028d13fb1ed49afbc64097a944a0ef4..35df79419080dc29b748547e4abe6987029e9f91 100644 (file)
@@ -183,7 +183,7 @@ my @features = (
       define => "ENABLE_CSS3_CONDITIONAL_RULES", default => 0, value => \$css3ConditionalRulesSupport },
 
     { option => "css3-text", desc => "Toggle CSS3 Text support",
-      define => "ENABLE_CSS3_TEXT", default => isEfl(), value => \$css3TextSupport },
+      define => "ENABLE_CSS3_TEXT", default => (isEfl() || isGtk()), value => \$css3TextSupport },
 
     { option => "css-box-decoration-break", desc => "Toggle CSS box-decoration-break support",
       define => "ENABLE_CSS_BOX_DECORATION_BREAK", default => 1, value => \$cssBoxDecorationBreakSupport },
@@ -318,7 +318,7 @@ my @features = (
       define => "ENABLE_MEDIA_STATISTICS", default => 0, value => \$mediaStatisticsSupport },
 
     { option => "media-stream", desc => "Toggle Media Stream support",
-      define => "ENABLE_MEDIA_STREAM", default => (isChromium() || isGtk() || isBlackBerry()), value => \$mediaStreamSupport },
+      define => "ENABLE_MEDIA_STREAM", default => (isChromium() || isBlackBerry()), value => \$mediaStreamSupport },
 
     { option => "meter-tag", desc => "Toggle Meter Tag support",
       define => "ENABLE_METER_ELEMENT", default => !isAppleWinWebKit(), value => \$meterTagSupport },
@@ -381,7 +381,7 @@ my @features = (
       define => "ENABLE_SQL_DATABASE", default => 1, value => \$sqlDatabaseSupport },
 
     { option => "style-scoped", desc => "Toggle Style Scoped support",
-      define => "ENABLE_STYLE_SCOPED", default => isBlackBerry(), value => \$styleScopedSupport },
+      define => "ENABLE_STYLE_SCOPED", default => (isBlackBerry() || isGtk()), value => \$styleScopedSupport },
 
     { option => "svg", desc => "Toggle SVG support",
       define => "ENABLE_SVG", default => 1, value => \$svgSupport },
index 93959471ff62246d2c29ac121b86c1f54db65743..bee66888a9e5b5ad22e2b7270157cc0d824e683c 100644 (file)
@@ -328,6 +328,8 @@ _SKIPPED_FILES_WITH_WARNING = [
 # with FileType.NONE are automatically skipped without warning.
 _SKIPPED_FILES_WITHOUT_WARNING = [
     "LayoutTests" + os.path.sep,
+    # Prevents this being recognized as a text file.
+    "Source/WebCore/GNUmakefile.features.am.in",
     ]
 
 # Extensions of files which are allowed to contain carriage returns.
diff --git a/Tools/gtk/override-feature-defines b/Tools/gtk/override-feature-defines
new file mode 100755 (executable)
index 0000000..9b93f6a
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+
+import os
+import re
+import shutil
+import sys
+
+def copy_feature_defines_makefile():
+    src_path = os.path.join('Source', 'WebCore', 'GNUmakefile.features.am.in')
+    dest_path = os.path.join('Source', 'WebCore', 'GNUmakefile.features.am')
+    shutil.copy(src_path, dest_path)
+
+def adjust_feature_defines_makefile(build_dir, feature_defines_overriding):
+    feature_defines_makefile_file = os.path.join('Source', 'WebCore', 'GNUmakefile.features.am')
+    with open(feature_defines_makefile_file) as f:
+        feature_defines_makefile = f.read()
+
+    overriden_feature_defines = []
+    def override_feature_define(match):
+        matched_feature_define = match.group('feature')
+        if matched_feature_define not in feature_defines_overriding:
+            return match.string[match.start():match.end()]
+
+        if int(match.group('default_value')) is not feature_defines_overriding[matched_feature_define]:
+            overriden_feature_defines.append(matched_feature_define)
+        return "%s=%d" % (matched_feature_define, feature_defines_overriding[matched_feature_define])
+
+    feature_defines_makefile = re.sub(r"(?P<feature>(?:ENABLE_)\w+)=(?P<default_value>0|1)", override_feature_define, feature_defines_makefile)
+    with open(feature_defines_makefile_file, 'w') as f:
+        f.write(feature_defines_makefile)
+
+    if overriden_feature_defines:
+        print "The following feature defines were overriden:\n%s" % ', '.join(overriden_feature_defines)
+
+def override_feature_defines(build_dir):
+    copy_feature_defines_makefile()
+
+    feature_defines_overriding_file = os.path.join(build_dir, 'feature-defines-overriding.txt')
+    if not os.path.exists(feature_defines_overriding_file):
+        return
+
+    with open(feature_defines_overriding_file) as f:
+        match_iter = re.findall(r"((?:ENABLE_)\w+)=(0|1)", f.read())
+
+    feature_defines_overriding = {}
+    for match in match_iter:
+        feature_defines_overriding[match[0]] = int(match[1])
+
+    adjust_feature_defines_makefile(build_dir, feature_defines_overriding)
+
+if __name__=='__main__':
+    override_feature_defines(sys.argv[1])
index 12c6a4c7e97b4a1c48b92bdad4afeff1a9349ccd..1ae619a74defd558186ff0ea322c0968b0bb5b5f 100755 (executable)
@@ -12,6 +12,8 @@ rm -f $top_srcdir/autom4te.cache
 
 touch README INSTALL
 
+Tools/gtk/override-feature-defines $ORIGDIR
+
 if test -z `which autoreconf`; then
     echo "Error: autoreconf not found, please install it."
     exit 1