From a655d04541aa76c6e57e528a2eac13d3fbea768c Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 9 Apr 2019 18:41:02 -0400 Subject: [PATCH] Add Depfile builder mixin - #94 --- lib/rscons.rb | 1 + lib/rscons/builders/mixins/depfile.rb | 21 +++++++++++++++++++++ lib/rscons/builders/mixins/object.rb | 9 +++------ lib/rscons/builders/preprocess.rb | 9 +++------ 4 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 lib/rscons/builders/mixins/depfile.rb diff --git a/lib/rscons.rb b/lib/rscons.rb index d8927bb..46132d2 100644 --- a/lib/rscons.rb +++ b/lib/rscons.rb @@ -166,6 +166,7 @@ module Rscons end # builder mixins +require_relative "rscons/builders/mixins/depfile" require_relative "rscons/builders/mixins/object" require_relative "rscons/builders/mixins/object_deps" diff --git a/lib/rscons/builders/mixins/depfile.rb b/lib/rscons/builders/mixins/depfile.rb new file mode 100644 index 0000000..9b5ce49 --- /dev/null +++ b/lib/rscons/builders/mixins/depfile.rb @@ -0,0 +1,21 @@ +module Rscons + module Builders + module Mixins + # Mixin for builders that make use of generated dependency files. + module Depfile + + # Finalize a build operation including dependencies from a generated + # dependency file. + def finalize_command_with_depfile + deps = @sources + if File.exists?(@vars["_DEPFILE"]) + deps += Util.parse_makefile_deps(@vars["_DEPFILE"]) + end + @cache.register_build(@target, @command, deps.uniq, @env) + true + end + + end + end + end +end diff --git a/lib/rscons/builders/mixins/object.rb b/lib/rscons/builders/mixins/object.rb index b5b3ed4..5ed553b 100644 --- a/lib/rscons/builders/mixins/object.rb +++ b/lib/rscons/builders/mixins/object.rb @@ -3,6 +3,8 @@ module Rscons module Mixins module Object + include Depfile + class << self # Hook called by Ruby when this module is included by a class (klass). def included(klass) @@ -50,12 +52,7 @@ module Rscons # Run the builder to produce a build target. def run(params) if @command - deps = @sources - if File.exists?(@vars["_DEPFILE"]) - deps += Util.parse_makefile_deps(@vars["_DEPFILE"]) - end - @cache.register_build(@target, @command, deps.uniq, @env) - true + finalize_command_with_depfile else @vars["_TARGET"] = @target @vars["_SOURCES"] = @sources diff --git a/lib/rscons/builders/preprocess.rb b/lib/rscons/builders/preprocess.rb index 4fa8b5c..5510b95 100644 --- a/lib/rscons/builders/preprocess.rb +++ b/lib/rscons/builders/preprocess.rb @@ -5,15 +5,12 @@ module Rscons # The Preprocess builder invokes the C preprocessor class Preprocess < Builder + include Mixins::Depfile + # Run the builder to produce a build target. def run(options) if @command - deps = @sources - if File.exists?(@vars["_DEPFILE"]) - deps += Util.parse_makefile_deps(@vars["_DEPFILE"]) - end - @cache.register_build(@target, @command, deps.uniq, @env) - true + finalize_command_with_depfile else if @sources.find {|s| s.end_with?(*@env.expand_varref("${CXXSUFFIX}", @vars))} pp_cc = "${CXX}"