Add Barrier builder

This commit is contained in:
Josh Holtrop 2026-01-16 22:54:22 -05:00
parent fc18c9f123
commit 94a86e3433
4 changed files with 41 additions and 7 deletions

View File

@ -23,6 +23,7 @@ module Rscons
# Names of the default builders which will be added to all newly created # Names of the default builders which will be added to all newly created
# {Environment} objects. # {Environment} objects.
DEFAULT_BUILDERS = [ DEFAULT_BUILDERS = [
:Barrier,
:Command, :Command,
:Copy, :Copy,
:Directory, :Directory,
@ -66,6 +67,13 @@ module Rscons
target.is_a?(Symbol) target.is_a?(Symbol)
end end
# Generate a random phony target name.
#
# @return [Symbol] Phony target name.
def gen_phony_target
("t" + sprintf("%08x", rand(1_000_000..4_000_000_000))).to_sym
end
# Return the system shell and arguments for executing a shell command. # Return the system shell and arguments for executing a shell command.
# #
# @return [Array<String>] The shell and flag. # @return [Array<String>] The shell and flag.
@ -136,6 +144,7 @@ require_relative "rscons/builders/mixins/object_deps"
require_relative "rscons/builders/mixins/program" require_relative "rscons/builders/mixins/program"
# default builders # default builders
require_relative "rscons/builders/barrier"
require_relative "rscons/builders/command" require_relative "rscons/builders/command"
require_relative "rscons/builders/copy" require_relative "rscons/builders/copy"
require_relative "rscons/builders/directory" require_relative "rscons/builders/directory"

View File

@ -37,7 +37,7 @@ module Rscons
# The number of remaining build steps. # The number of remaining build steps.
def build_steps_remaining def build_steps_remaining
self.reduce(0) do |result, (target, builders)| self.reduce(0) do |result, (target, builders)|
result + builders.size result + builders.count {|b| !b.is_a?(Rscons::Builders::Barrier)}
end end
end end

View File

@ -0,0 +1,15 @@
module Rscons
module Builders
# The Barrier builder does not perform any action. It exists as a builder
# on which to place dependencies to ensure that each of its sources are
# built before any build targets which depend on the barrier build target.
class Barrier < Builder
# Run the builder.
def run(options)
true
end
end
end
end

View File

@ -397,7 +397,11 @@ module Rscons
expand(ud) expand(ud)
end end
@user_deps[target] ||= [] @user_deps[target] ||= []
@user_deps[target] = (@user_deps[target] + user_deps).uniq (@user_deps[target] + user_deps).each do |ud|
unless Rscons.phony_target?(ud) || @user_deps[target].include?(ud)
@user_deps[target] << ud
end
end
build_after(target, user_deps) build_after(target, user_deps)
end end
@ -623,7 +627,9 @@ module Rscons
# #
# @return [void] # @return [void]
def run_builder(builder) def run_builder(builder)
builder.build_step ||= get_next_build_step unless builder.is_a?(Rscons::Builders::Barrier)
builder.build_step ||= get_next_build_step
end
case result = builder.run({}) case result = builder.run({})
when Array when Array
result.each do |waititem| result.each do |waititem|
@ -649,8 +655,10 @@ module Rscons
Cache.instance.register_build(side_effect, nil, [], self, side_effect: true) Cache.instance.register_build(side_effect, nil, [], self, side_effect: true)
@side_effects.delete(side_effect) @side_effects.delete(side_effect)
end end
@build_hooks[:post].each do |build_hook_block| unless builder.is_a?(Rscons::Builders::Barrier)
build_hook_block.call(builder) @build_hooks[:post].each do |build_hook_block|
build_hook_block.call(builder)
end
end end
process_remove_wait(builder) process_remove_wait(builder)
else else
@ -727,8 +735,10 @@ module Rscons
if @builder_sets.size > 0 if @builder_sets.size > 0
if builder = @builder_sets[0].get_next_builder_to_run(targets_still_building) if builder = @builder_sets[0].get_next_builder_to_run(targets_still_building)
builder.vars = @varset.merge(builder.vars) builder.vars = @varset.merge(builder.vars)
@build_hooks[:pre].each do |build_hook_block| unless builder.is_a?(Rscons::Builders::Barrier)
build_hook_block.call(builder) @build_hooks[:pre].each do |build_hook_block|
build_hook_block.call(builder)
end
end end
return run_builder(builder) return run_builder(builder)
end end