The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
sub SingleRunBuilder
{
# this can be used when a single command builds multiple nodes and
# we don't want the command to be run multiple times
# an example is generating a swig wrapper and swig perl module

my ($package, $file_name, $line) = caller() ;

my $builder ;

if(@_ == 1)
	{
	if('CODE' eq ref $_[0])
		{
		$builder = $_[0] ;
		}
	elsif('' eq ref $_[0])
		{
		my $command = $_[0] ;
		
		$builder = 
			sub
			{
			my ($config, $file_to_build, $dependencies, $triggering_dependencies, $file_tree) = @_ ;
			my ($package, $file_name, $line) = caller() ;
			
			use PBS::Rules::Builders ;
			RunShellCommands
				(
				PBS::Rules::Builders::EvaluateShellCommandForNode
					(
					  $command
					, "SingleRunBuilder called at '$file_name:$line'"
					, $file_tree
					, $dependencies
					, $triggering_dependencies
					)
				) ;
			}
		}
	else
		{
		die ERROR "Error: SingleRunBuilder only accepts a single sub ref or string argument at '$file_name:$line'." ;
		}
	}
else
	{
	die ERROR "Error: SingleRunBuilder only accepts a single argument at '$file_name:$line'." ;
	}

my @already_built ;

return
	(
	sub
		{
		my ($config, $file_to_build, $dependencies) = @_ ;
		
		unless(@already_built)
			{
			push @already_built, $file_to_build ;
			return($builder->(@_)) ;
			}
		else
			{
			push @already_built, $file_to_build ;
			return(1, "SingleRunBuilder @ '$file_name:$line' was already run") ;
			}
		}
	) ;
}

#----------------------------------------------------------------------------------------------------------

1;