[CMake] CMake does not support the dep files for implicit dependency
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Oct 2016 14:34:24 +0000 (14:34 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Oct 2016 14:34:24 +0000 (14:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=161433

Patch by Fujii Hironori <Hironori.Fujii@sony.com> on 2016-10-20
Reviewed by Brent Fulgham.

Created a Perl script to generate all IDL bindings for CMake.
This script can regenerate outdated bindings by based on the
supplemental dependency and dep files created by
'--write-dependencies' switch of generate-bindings.pl.

add_custom_target is used to invoke the script instead of
add_custom_command because Ninja deletes all output files before
executing the command in case of add_custom_command.

USES_TERMINAL option of add_custom_target has two effects:
1) Not buffering output of the command
2) Invoking the command in the special Ninja pool which inhibits parallel build
One needs to use CMake 3.2 or later to enable this feature.

.:

* Source/cmake/WebKitMacros.cmake (GENERATE_BINDINGS): Included
ProcessorCount.  Added a new argument 'target'.  Use
add_custom_target instead of add_custom_command.  Invoke the new
script.

Source/WebCore:

* CMakeLists.txt: Specified target names for
GENERATE_BINDINGS. Added dependency for the targets.
* bindings/scripts/generate-bindings-all.pl: Added.

Tools:

* DumpRenderTree/CMakeLists.txt: Specified a target name for
GENERATE_BINDINGS. Added dependency for the target.
* WebKitTestRunner/CMakeLists.txt: Ditto.

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

ChangeLog
Source/WebCore/CMakeLists.txt
Source/WebCore/ChangeLog
Source/WebCore/bindings/scripts/generate-bindings-all.pl [new file with mode: 0755]
Source/cmake/WebKitMacros.cmake
Tools/ChangeLog
Tools/DumpRenderTree/CMakeLists.txt
Tools/WebKitTestRunner/CMakeLists.txt

index a958f92..1817e48 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2016-10-20  Fujii Hironori  <Hironori.Fujii@sony.com>
+
+        [CMake] CMake does not support the dep files for implicit dependency
+        https://bugs.webkit.org/show_bug.cgi?id=161433
+
+        Reviewed by Brent Fulgham.
+
+        Created a Perl script to generate all IDL bindings for CMake.
+        This script can regenerate outdated bindings by based on the
+        supplemental dependency and dep files created by
+        '--write-dependencies' switch of generate-bindings.pl.
+
+        add_custom_target is used to invoke the script instead of
+        add_custom_command because Ninja deletes all output files before
+        executing the command in case of add_custom_command.
+
+        USES_TERMINAL option of add_custom_target has two effects:
+        1) Not buffering output of the command
+        2) Invoking the command in the special Ninja pool which inhibits parallel build
+        One needs to use CMake 3.2 or later to enable this feature.
+
+        * Source/cmake/WebKitMacros.cmake (GENERATE_BINDINGS): Included
+        ProcessorCount.  Added a new argument 'target'.  Use
+        add_custom_target instead of add_custom_command.  Invoke the new
+        script.
+
 2016-10-19  Alex Christensen  <achristensen@webkit.org>
 
         Revert r207151
index c4a7031..5ce3277 100644 (file)
@@ -3641,7 +3641,7 @@ list(APPEND WebCore_DERIVED_SOURCES ${DERIVED_SOURCES_WEBCORE_DIR}/XPathGrammar.
 set(FEATURE_DEFINES_JAVASCRIPT "LANGUAGE_JAVASCRIPT ${FEATURE_DEFINES_WITH_SPACE_SEPARATOR}")
 list(APPEND WebCoreTestSupport_IDL_FILES ${DERIVED_SOURCES_WEBCORE_DIR}/InternalSettingsGenerated.idl)
 
-GENERATE_BINDINGS(
+GENERATE_BINDINGS(WebCoreBindings
     OUTPUT_SOURCE WebCore_DERIVED_SOURCES
     INPUT_FILES ${WebCore_IDL_FILES}
     BASE_DIR ${WEBCORE_DIR}
@@ -3657,7 +3657,7 @@ GENERATE_BINDINGS(
         --workerGlobalScopeConstructorsFile ${WORKERGLOBALSCOPE_CONSTRUCTORS_FILE}
         --dedicatedWorkerGlobalScopeConstructorsFile ${DEDICATEDWORKERGLOBALSCOPE_CONSTRUCTORS_FILE})
 
-GENERATE_BINDINGS(
+GENERATE_BINDINGS(WebCoreTestSupportBindings
     OUTPUT_SOURCE WebCoreTestSupport_SOURCES
     INPUT_FILES ${WebCoreTestSupport_IDL_FILES}
     BASE_DIR ${WEBCORE_DIR}
@@ -3666,6 +3666,9 @@ GENERATE_BINDINGS(
     DESTINATION ${DERIVED_SOURCES_WEBCORE_DIR}
     GENERATOR JS)
 
+# WebCoreTestSupportBindings needs InternalSettingsGenerated.idl
+add_dependencies(WebCoreTestSupportBindings WebCoreDerivedSources)
+
 # WebCore JS Builtins
 
 set(WebCore_BUILTINS_SOURCES
@@ -3811,7 +3814,7 @@ endif ()
 # files on OS X.
 add_library(WebCoreDerivedSources STATIC ${WebCore_DERIVED_SOURCES})
 set_target_properties(WebCoreDerivedSources PROPERTIES OUTPUT_NAME WebCoreDerivedSources${DEBUG_SUFFIX})
-add_dependencies(WebCoreDerivedSources JavaScriptCore)
+add_dependencies(WebCoreDerivedSources JavaScriptCore WebCoreBindings)
 if (NOT WIN32)
     list(APPEND WebCore_LIBRARIES WebCoreDerivedSources)
 endif ()
@@ -3842,7 +3845,7 @@ endif ()
 
 include_directories(${WebCoreTestSupport_INCLUDE_DIRECTORIES})
 add_library(WebCoreTestSupport ${WebCoreTestSupport_LIBRARY_TYPE} ${WebCoreTestSupport_SOURCES})
-add_dependencies(WebCoreTestSupport WebCore)
+add_dependencies(WebCoreTestSupport WebCore WebCoreTestSupportBindings)
 target_link_libraries(WebCoreTestSupport ${WebCoreTestSupport_LIBRARIES})
 
 if (WebCoreTestSupport_OUTPUT_NAME)
index 84dfa15..ce82066 100644 (file)
@@ -1,3 +1,28 @@
+2016-10-20  Fujii Hironori  <Hironori.Fujii@sony.com>
+
+        [CMake] CMake does not support the dep files for implicit dependency
+        https://bugs.webkit.org/show_bug.cgi?id=161433
+
+        Reviewed by Brent Fulgham.
+
+        Created a Perl script to generate all IDL bindings for CMake.
+        This script can regenerate outdated bindings by based on the
+        supplemental dependency and dep files created by
+        '--write-dependencies' switch of generate-bindings.pl.
+
+        add_custom_target is used to invoke the script instead of
+        add_custom_command because Ninja deletes all output files before
+        executing the command in case of add_custom_command.
+
+        USES_TERMINAL option of add_custom_target has two effects:
+        1) Not buffering output of the command
+        2) Invoking the command in the special Ninja pool which inhibits parallel build
+        One needs to use CMake 3.2 or later to enable this feature.
+
+        * CMakeLists.txt: Specified target names for
+        GENERATE_BINDINGS. Added dependency for the targets.
+        * bindings/scripts/generate-bindings-all.pl: Added.
+
 2016-10-20  Adam Jackson  <ajax@redhat.com>
 
         Prefer eglGetPlatformDisplay to eglGetDisplay
diff --git a/Source/WebCore/bindings/scripts/generate-bindings-all.pl b/Source/WebCore/bindings/scripts/generate-bindings-all.pl
new file mode 100755 (executable)
index 0000000..9788972
--- /dev/null
@@ -0,0 +1,236 @@
+#!/usr/bin/perl
+#
+# Copyright (C) 2016 Sony Interactive Entertainment Inc.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+use strict;
+use warnings;
+use FindBin;
+use lib $FindBin::Bin;
+
+use File::Basename;
+use File::Spec;
+use File::Find;
+use Getopt::Long;
+use threads;
+use threads::shared;
+use Thread::Queue;
+
+my $perl = $^X;
+my $scriptDir = $FindBin::Bin;
+my @idlDirectories;
+my $outputDirectory;
+my $idlFilesList;
+my $generator;
+my @generatorDependency;
+my $defines;
+my $preprocessor;
+my $supplementalDependencyFile;
+my @ppExtraOutput;
+my @ppExtraArgs;
+my $numOfJobs = 1;
+my $idlAttributesFile;
+
+GetOptions('include=s@' => \@idlDirectories,
+           'outputDir=s' => \$outputDirectory,
+           'idlFilesList=s' => \$idlFilesList,
+           'generator=s' => \$generator,
+           'generatorDependency=s@' => \@generatorDependency,
+           'defines=s' => \$defines,
+           'preprocessor=s' => \$preprocessor,
+           'supplementalDependencyFile=s' => \$supplementalDependencyFile,
+           'ppExtraOutput=s@' => \@ppExtraOutput,
+           'ppExtraArgs=s@' => \@ppExtraArgs,
+           'idlAttributesFile=s' => \$idlAttributesFile,
+           'numOfJobs=i' => \$numOfJobs);
+
+$| = 1;
+my @idlFiles;
+open(my $fh, '<', $idlFilesList) or die "Cannot open $idlFilesList";
+@idlFiles = map { CygwinPathIfNeeded(s/\r?\n?$//r) } <$fh>;
+close($fh) or die;
+
+my %supplementedIdlFiles;
+if ($supplementalDependencyFile) {
+    my @output = ($supplementalDependencyFile, @ppExtraOutput);
+    my @deps = (@idlFiles, @generatorDependency);
+    if (needsUpdate(\@output, \@deps)) {
+        my @args = (File::Spec->catfile($scriptDir, 'preprocess-idls.pl'),
+                    '--defines', $defines,
+                    '--idlFilesList', $idlFilesList,
+                    '--supplementalDependencyFile', $supplementalDependencyFile,
+                    @ppExtraArgs);
+        print("Preprocess IDL\n");
+        executeCommand($perl, @args) == 0 or die;
+    }
+    open(my $fh, '<', $supplementalDependencyFile) or die "Cannot open $supplementalDependencyFile";
+    while (<$fh>) {
+        my ($idlFile, @followingIdlFiles) = split(/\s+/);
+        $supplementedIdlFiles{$idlFile} = \@followingIdlFiles;
+    }
+    close($fh) or die;
+}
+
+my @args = (File::Spec->catfile($scriptDir, 'generate-bindings.pl'),
+            '--defines', $defines,
+            '--generator', $generator,
+            '--outputDir', $outputDirectory,
+            '--preprocessor', $preprocessor,
+            '--idlAttributesFile', $idlAttributesFile,
+            '--write-dependencies');
+push @args, map { ('--include', $_) } @idlDirectories;
+push @args, '--supplementalDependencyFile', $supplementalDependencyFile if $supplementalDependencyFile;
+
+my %directoryCache;
+buildDirectoryCache();
+
+my @idlFilesToUpdate = grep {
+    my ($filename, $dirs, $suffix) = fileparse($_, '.idl');
+    my $sourceFile = File::Spec->catfile($outputDirectory, "JS$filename.cpp");
+    my $headerFile = File::Spec->catfile($outputDirectory, "JS$filename.h");
+    my $depFile = File::Spec->catfile($outputDirectory, "JS$filename.dep");
+    my @output = ($sourceFile, $headerFile);
+    my @deps = ($_,
+                $idlAttributesFile,
+                @generatorDependency,
+                @{$supplementedIdlFiles{$_} or []},
+                implicitDependencies($depFile));
+    needsUpdate(\@output, \@deps);
+} @idlFiles;
+my $queue = Thread::Queue->new(@idlFilesToUpdate);
+my $abort :shared = 0;
+my $terminalWidth = getTerminalWidth();
+my $totalCount = @idlFilesToUpdate;
+my $currentCount :shared = 0;
+
+my @threadPool = map { threads->create(\&worker) } (1 .. $numOfJobs);
+$_->join for @threadPool;
+exit $abort;
+
+sub needsUpdate
+{
+    my ($objects, $depends) = @_;
+    my $oldestObjectTime;
+    for (@$objects) {
+        return 1 if !-f;
+        my $m = mtime($_);
+        if (!defined $oldestObjectTime || $m < $oldestObjectTime) {
+            $oldestObjectTime = $m;
+        }
+    }
+    for (@$depends) {
+        die "Missing required dependency: $_" if !-f;
+        my $m = mtime($_);
+        if ($oldestObjectTime < $m) {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+sub mtime
+{
+    my ($file) = @_;
+    return (stat $file)[9];
+}
+
+sub worker {
+    while (my $file = $queue->dequeue_nb()) {
+        last if $abort;
+        eval {
+            $currentCount++;
+            my $basename = basename($file);
+            if ($terminalWidth) {
+                my $w = $terminalWidth - 1;
+                print sprintf("%-*.*s\r", $w, $w, "[$currentCount/$totalCount] $basename");
+            } else {
+                print "[$currentCount/$totalCount] $basename\n";
+            }
+            executeCommand($perl, @args, $file) == 0 or die;
+        };
+        if ($@) {
+            $abort = 1;
+            die;
+        }
+    }
+}
+
+sub buildDirectoryCache
+{
+    my $wanted = sub {
+        $directoryCache{$_} = $File::Find::name;
+        $File::Find::prune = 1 unless ~/\./;
+    };
+    find($wanted, @idlDirectories);
+}
+
+sub implicitDependencies
+{
+    my ($depFile) = @_;
+    return () unless -f $depFile;
+    open(my $fh, '<', $depFile) or die "Cannot open $depFile";
+    my $firstLine = <$fh>;
+    close($fh) or die;
+    my (undef, $deps) = split(/ : /, $firstLine);
+    my @deps = split(/\s+/, $deps);
+    return map { $directoryCache{$_} or () } @deps;
+}
+
+sub executeCommand
+{
+    if ($^O eq 'cygwin') {
+        # 'system' of Cygwin Perl doesn't seem thread-safe
+        my $pid = fork();
+        defined($pid) or die;
+        if ($pid == 0) {
+            exec(@_) or die;
+        }
+        waitpid($pid, 0);
+        return $?;
+    }
+    if ($^O eq 'MSWin32') {
+        return system(quoteCommand(@_));
+    }
+    return system(@_);
+}
+
+sub quoteCommand
+{
+    return map {
+        '"' . s/([\\\"])/\\$1/gr . '"';
+    } @_;
+}
+
+sub CygwinPathIfNeeded
+{
+    my $path = shift;
+    return Cygwin::win_to_posix_path($path) if ($^O eq 'cygwin');
+    return $path;
+}
+
+sub getTerminalWidth
+{
+    return 0 unless -t STDOUT;
+    return 80 if $^O eq 'MSWin32';
+    return `stty size` =~ /\d+\s+(\d+)/ ? $1 : 80;
+}
index 62d34df..2c36ee3 100644 (file)
@@ -1,4 +1,6 @@
 include(CMakeParseArguments)
+include(ProcessorCount)
+ProcessorCount(PROCESSOR_COUNT)
 
 macro(WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS)
     set(_file ${CMAKE_CURRENT_SOURCE_DIR}/Platform${PORT}.cmake)
@@ -43,7 +45,8 @@ macro(ADD_PRECOMPILED_HEADER _header _cpp _source)
     #FIXME: Add support for Xcode.
 endmacro()
 
-# Helper macro which wraps preprocess-idls.pl and generate-bindings.pl scripts.
+# Helper macro which wraps generate-bindings-all.pl script.
+#   target is a new target name to be added
 #   OUTPUT_SOURCE is a list name which will contain generated sources.(eg. WebCore_SOURCES)
 #   INPUT_FILES are IDL files to generate.
 #   BASE_DIR is base directory where script is called.
@@ -54,15 +57,14 @@ endmacro()
 #   SUPPLEMENTAL_DEPFILE is a value of --supplementalDependencyFile. (optional)
 #   PP_EXTRA_OUTPUT is extra outputs of preprocess-idls.pl. (optional)
 #   PP_EXTRA_ARGS is extra arguments for preprocess-idls.pl. (optional)
-function(GENERATE_BINDINGS)
+function(GENERATE_BINDINGS target)
     set(options)
     set(oneValueArgs OUTPUT_SOURCE BASE_DIR FEATURES DESTINATION GENERATOR SUPPLEMENTAL_DEPFILE)
     set(multiValueArgs INPUT_FILES IDL_INCLUDES PP_EXTRA_OUTPUT PP_EXTRA_ARGS)
     cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
-    set(binding_generator ${WEBCORE_DIR}/bindings/scripts/generate-bindings.pl)
+    set(binding_generator ${WEBCORE_DIR}/bindings/scripts/generate-bindings-all.pl)
     set(idl_attributes_file ${WEBCORE_DIR}/bindings/scripts/IDLAttributes.txt)
-    set(id ${arg_OUTPUT_SOURCE})
-    set(idl_files_list ${CMAKE_CURRENT_BINARY_DIR}/idl_files_${id}.tmp)
+    set(idl_files_list ${CMAKE_CURRENT_BINARY_DIR}/idl_files_${target}.tmp)
     set(_supplemental_dependency)
 
     set(content)
@@ -74,55 +76,69 @@ function(GENERATE_BINDINGS)
     endforeach ()
     file(WRITE ${idl_files_list} ${content})
 
+    set(args
+        --defines ${arg_FEATURES}
+        --generator ${arg_GENERATOR}
+        --outputDir ${arg_DESTINATION}
+        --idlFilesList ${idl_files_list}
+        --preprocessor "${CODE_GENERATOR_PREPROCESSOR}"
+        --idlAttributesFile ${idl_attributes_file})
     if (arg_SUPPLEMENTAL_DEPFILE)
-        set(_supplemental_dependency --supplementalDependencyFile ${arg_SUPPLEMENTAL_DEPFILE})
-
-        add_custom_command(
-            OUTPUT ${arg_SUPPLEMENTAL_DEPFILE} ${arg_PP_EXTRA_OUTPUT}
-            DEPENDS ${WEBCORE_DIR}/bindings/scripts/preprocess-idls.pl ${arg_INPUT_FILES}
-            COMMAND ${PERL_EXECUTABLE} ${WEBCORE_DIR}/bindings/scripts/preprocess-idls.pl --defines ${arg_FEATURES} --idlFilesList ${idl_files_list} --supplementalDependencyFile ${arg_SUPPLEMENTAL_DEPFILE} ${arg_PP_EXTRA_ARGS}
-            VERBATIM)
+        list(APPEND args --supplementalDependencyFile ${arg_SUPPLEMENTAL_DEPFILE})
     endif ()
-
-    set(idl_includes)
-    foreach (dir ${arg_IDL_INCLUDES})
-        if (IS_ABSOLUTE ${dir})
-            list(APPEND idl_includes --include=${dir})
+    if (PROCESSOR_COUNT)
+        list(APPEND args --numOfJobs ${PROCESSOR_COUNT})
+    endif ()
+    foreach (i IN LISTS arg_IDL_INCLUDES)
+        if (IS_ABSOLUTE ${i})
+            list(APPEND args --include ${i})
         else ()
-            list(APPEND idl_includes --include=${CMAKE_CURRENT_SOURCE_DIR}/${dir})
+            list(APPEND args --include ${CMAKE_CURRENT_SOURCE_DIR}/${i})
         endif ()
     endforeach ()
+    foreach (i IN LISTS arg_PP_EXTRA_OUTPUT)
+        list(APPEND args --ppExtraOutput ${i})
+    endforeach ()
+    foreach (i IN LISTS arg_PP_EXTRA_ARGS)
+        list(APPEND args --ppExtraArgs ${i})
+    endforeach ()
 
     set(common_generator_dependencies
-        ${binding_generator}
-        ${WEBCORE_DIR}/bindings/scripts/CodeGenerator.pm
+        ${WEBCORE_DIR}/bindings/scripts/generate-bindings.pl
         ${SCRIPTS_BINDINGS}
-        ${arg_SUPPLEMENTAL_DEPFILE}
-        ${idl_attributes_file}
     )
-    list(APPEND common_generator_dependencies ${arg_PP_EXTRA_OUTPUT})
-
     if (EXISTS ${WEBCORE_DIR}/bindings/scripts/CodeGenerator${arg_GENERATOR}.pm)
         list(APPEND common_generator_dependencies ${WEBCORE_DIR}/bindings/scripts/CodeGenerator${arg_GENERATOR}.pm)
     endif ()
     if (EXISTS ${arg_BASE_DIR}/CodeGenerator${arg_GENERATOR}.pm)
         list(APPEND common_generator_dependencies ${arg_BASE_DIR}/CodeGenerator${arg_GENERATOR}.pm)
     endif ()
+    foreach (i IN LISTS common_generator_dependencies)
+        list(APPEND args --generatorDependency ${i})
+    endforeach ()
 
     set(gen_sources)
+    set(gen_headers)
     foreach (_file ${arg_INPUT_FILES})
         get_filename_component(_name ${_file} NAME_WE)
-
-        add_custom_command(
-            OUTPUT ${arg_DESTINATION}/JS${_name}.cpp ${arg_DESTINATION}/JS${_name}.h
-            MAIN_DEPENDENCY ${_file}
-            DEPENDS ${common_generator_dependencies}
-            COMMAND ${PERL_EXECUTABLE} ${binding_generator} --defines ${arg_FEATURES} --generator ${arg_GENERATOR} ${idl_includes} --outputDir ${arg_DESTINATION} --preprocessor "${CODE_GENERATOR_PREPROCESSOR}" --idlAttributesFile ${idl_attributes_file} ${_supplemental_dependency} ${_file}
-            WORKING_DIRECTORY ${arg_BASE_DIR}
-            VERBATIM)
         list(APPEND gen_sources ${arg_DESTINATION}/JS${_name}.cpp)
+        list(APPEND gen_headers ${arg_DESTINATION}/JS${_name}.h)
     endforeach ()
     set(${arg_OUTPUT_SOURCE} ${${arg_OUTPUT_SOURCE}} ${gen_sources} PARENT_SCOPE)
+    set(act_args)
+    if (${CMAKE_VERSION} VERSION_LESS 3.2)
+        set_source_files_properties(${gen_sources} ${gen_headers} PROPERTIES GENERATED 1)
+    else ()
+        list(APPEND act_args
+            BYPRODUCTS ${gen_sources} ${gen_headers}
+            USES_TERMINAL
+        )
+    endif ()
+    add_custom_target(${target}
+        COMMAND ${PERL_EXECUTABLE} ${binding_generator} ${args}
+        WORKING_DIRECTORY ${arg_BASE_DIR}
+        COMMENT "Generate bindings (${target})"
+        VERBATIM ${act_args})
 endfunction()
 
 macro(GENERATE_FONT_NAMES _infile)
index c0a5451..a27565c 100644 (file)
@@ -1,3 +1,28 @@
+2016-10-20  Fujii Hironori  <Hironori.Fujii@sony.com>
+
+        [CMake] CMake does not support the dep files for implicit dependency
+        https://bugs.webkit.org/show_bug.cgi?id=161433
+
+        Reviewed by Brent Fulgham.
+
+        Created a Perl script to generate all IDL bindings for CMake.
+        This script can regenerate outdated bindings by based on the
+        supplemental dependency and dep files created by
+        '--write-dependencies' switch of generate-bindings.pl.
+
+        add_custom_target is used to invoke the script instead of
+        add_custom_command because Ninja deletes all output files before
+        executing the command in case of add_custom_command.
+
+        USES_TERMINAL option of add_custom_target has two effects:
+        1) Not buffering output of the command
+        2) Invoking the command in the special Ninja pool which inhibits parallel build
+        One needs to use CMake 3.2 or later to enable this feature.
+
+        * DumpRenderTree/CMakeLists.txt: Specified a target name for
+        GENERATE_BINDINGS. Added dependency for the target.
+        * WebKitTestRunner/CMakeLists.txt: Ditto.
+
 2016-10-20  Manuel Rego Casasnovas  <rego@igalia.com>
 
         [GTK] Cannot build GTK+ with CUPS 2.* versions
index baf7c13..dc8420d 100644 (file)
@@ -120,7 +120,7 @@ set(DumpRenderTree_IDL_FILES
     "${WEBKIT_TESTRUNNER_UISCRIPTCONTEXT_DIR}/Bindings/UIScriptController.idl"
 )
 
-GENERATE_BINDINGS(
+GENERATE_BINDINGS(DumpRenderTreeBindings
     OUTPUT_SOURCE DumpRenderTree_SOURCES
     INPUT_FILES ${DumpRenderTree_IDL_FILES}
     BASE_DIR ${DUMP_RENDER_TREE_BINDINGS_DIR}
@@ -135,6 +135,7 @@ include_directories(${DumpRenderTree_INCLUDE_DIRECTORIES})
 
 add_executable(DumpRenderTree ${DumpRenderTree_SOURCES})
 target_link_libraries(DumpRenderTree ${DumpRenderTree_LIBRARIES})
+add_dependencies(DumpRenderTree DumpRenderTreeBindings)
 
 if (ENABLE_NETSCAPE_PLUGIN_API)
     add_library(TestNetscapePlugin SHARED ${TestNetscapePlugin_SOURCES})
index 27ea36c..8c98768 100644 (file)
@@ -97,7 +97,7 @@ set(WebKitTestRunner_IDL_FILES
     "${WEBKIT_TESTRUNNER_UISCRIPTCONTEXT_DIR}/Bindings/UIScriptController.idl"
 )
 
-GENERATE_BINDINGS(
+GENERATE_BINDINGS(WebKitTestRunnerInjectedBundleBindings
     OUTPUT_SOURCE WebKitTestRunnerInjectedBundle_SOURCES
     INPUT_FILES ${WebKitTestRunnerInjectedBundle_IDL_FILES}
     BASE_DIR ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings
@@ -106,7 +106,7 @@ GENERATE_BINDINGS(
     DESTINATION ${DERIVED_SOURCES_DIR}/InjectedBundle
     GENERATOR TestRunner)
 
-GENERATE_BINDINGS(
+GENERATE_BINDINGS(WebKitTestRunnerBindings
     OUTPUT_SOURCE WebKitTestRunner_SOURCES
     INPUT_FILES ${WebKitTestRunner_IDL_FILES}
     BASE_DIR ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings
@@ -122,9 +122,11 @@ include_directories(SYSTEM ${WebKitTestRunner_SYSTEM_INCLUDE_DIRECTORIES})
 
 add_library(TestRunnerInjectedBundle SHARED ${WebKitTestRunnerInjectedBundle_SOURCES})
 target_link_libraries(TestRunnerInjectedBundle ${WebKitTestRunner_LIBRARIES})
+add_dependencies(TestRunnerInjectedBundle WebKitTestRunnerInjectedBundleBindings)
 
 add_executable(WebKitTestRunner ${WebKitTestRunner_SOURCES})
 target_link_libraries(WebKitTestRunner ${WebKitTestRunner_LIBRARIES})
+add_dependencies(WebKitTestRunner WebKitTestRunnerBindings)
 
 if (NOT APPLE)
     add_dependencies(WebKit2 ${ForwardingHeadersForWebKitTestRunner_NAME})