Daiku - Make for Perl
#! perl use Daiku; use autodie ':all'; desc 'do all tasks'; task 'all' => 'foo'; file 'foo' => 'foo.o' => sub { system "gcc -c foo foo.o"; }; rule '.o' => '.c' => sub { system "gcc -c foo.o foo.c"; }; build shift @ARGV || 'all';
Daiku is yet another build system for Perl5.
By declaring use Daiku in your own Perl script, you can use Daiku DSL to write your build procedure.
use Daiku
See "SYNOPSIS" for example of this usage.
Daiku comes with daiku command-line tool. Just like make reads Makefile, daiku reads Daikufile and runs the build procedure.
make
Makefile
Daikufile
See daiku for detail.
The following functions are exported by default.
desc
desc $desc:Str
Description of the following task.
task
task $dst:Str, \@deps:ArrayRef[Str]
task $dst:Str, \@deps:ArrayRef[Str], \&code:CodeRef
task $dst:Str, $deps:Str
task $dst:Str, $deps:Str, \&code:CodeRef
task $dst:Str, \&code:CodeRef
Register a .PHONY task.
If \&code is passed, it is executed when Daiku builds this task.
\&code
$code->($task, @args)
where $task is a Daiku::Task object, and @args is the arguments for the task.
$task
@args
You can access attributes of the task via $task object.
$dst = $task->dst; $array_ref_of_deps = $task->deps;
You can pass arguments to a task via build() function. For example,
build()
task "all", sub { my ($task, @args) = @_; ... }; build("all[xxx yyy]");
then, @args is ("xxx", "yyy").
("xxx", "yyy")
As you see in the above example, arguments are specified inside brackets, and they are parsed as if they were command-line arguments (i.e., arguments are separated by spaces).
You can also specify task arguments via daiku command.
file $dst, $deps:Str, \&code:CodeRef
file $dst, \@deps:ArrayRef[Str], \&code:CodeRef
Register a file creation rule.
The \&code is executed when Daiku builds the file. It is supposed to create the file named $dst.
$dst
$code->($file)
where $file is a Daiku::File object.
$file
You can access attributes of the file task via $file object.
$dst = $file->dst; $array_ref_of_deps = $file->deps;
rule $dst:Str, $src:Str, \&code:CodeRef
rule $dst:Str, \@srcs:ArrayRef[Str], \&code:CodeRef
rule $dst:Str, \&srcs:CodeRef, \&code:CodeRef
Register a suffix rule. It's the same as following code in Make.
.c.o: cc -c $<
The \&code is executed when Daiku builds this task.
$code->($rule, $dst_filename, @src_filenames)
where $rule is a Daiku::SuffixRule object, $dst_filename is the destination filename and @src_filenames are the source filenames. The $code is supposed to create the file named $dst_filename.
$rule
$dst_filename
@src_filenames
$code
If you pass a CodeRef as \&srcs, it is executed to derive source filenames.
\&srcs
@src_filenames = $srcs->($dst_filename)
For example,
rule '.o' => sub { my ($file) = @_; $file =~ s/\.o$//; ("$file.h", "$file.c"); } => sub { my ($task, $dst, $src_h, $src_c) = @_; compile($src_c, $dst); };
You can also return an ArrayRef from \&srcs instead of a list. In that case, the ArrayRef is just flattened.
build $task : Str
Build one object named $task.
Return Value: The number of built jobs.
namespace $namespace:Str, \&codeblock:CodeRef
Declare a namespace of tasks. Namespaces can be nested.
With namespaces, you can organize your tasks in a hierarchical way. For example,
namespace n1 => sub { desc 't1'; task task1 => sub { }; namespace n2 => sub { desc 't2'; task task2 => sub { }; }; };
The full task name includes all containing namespaces joined with colons (:).
:
$ daiku n1:task1 $ daiku n1:n2:task2
sh @command:List[Str]
Executes the @command.
@command
This is similar to system() built-in function, but it throws an exception when the command returns a non-zero exit value.
system()
This module doesn't detect recursion, but Perl5 can detect it.
Tokuhiro Matsuno <tokuhirom AAJKLFJEF GMAIL COM>
Rake, make(1)
Copyright (C) Tokuhiro Matsuno
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Daiku, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Daiku
CPAN shell
perl -MCPAN -e shell install Daiku
For more information on module installation, please visit the detailed CPAN module installation guide.