Matisse Enzer wrote:
What's the standard (if any) for how to configure a build script to
install specific files (e.g. httpd.conf) in someplace other than the
standard Perl library/script/man locations?
For example, if my distro contains a bunch of .pm files and .pl files,
which go in the "normal" place, and my distro also contains:
app_startup.pl
httpd.conf
and I want those installed as:
app_startup.pl => "$some_dir/app-startup.pl", # mode 555
httpd.conf => "$some_other_dir/conf", # mode 444
is there a good standardized way to do this?
There are a number of ways to do this. The most simple is:
use strict;
use warnings;
use File::HomeDir;
my $conf_dir = File::Spec->catdir( File::HomeDir->my_home, '.Foo' );
use Module::Build;
my $builder = Module::Build->new(
module_name => 'Foo',
license => 'perl',
conf_files => {
'etc/httpd.conf' => 'conf/httpd.conf',
},
install_path => {
'conf' => $conf_dir,
},
);
$builder->add_build_element( 'conf' );
$builder->create_build_script();
__END__
The add_build_element() method is the key to the process. It lets M::B
know it should look for a 'conf_files' property that describes files to
be copied from somewhere in your distribution to a directory in 'blib'.
In the above example, 'etc/httpd.conf' in your distribution root to
'blib/conf/httpd.conf'.
Note that it's a current limitation that the first element of the
directory name in blib must be the same as the name of the build
element, in this case 'conf'.
Next the 'install_path' is looked at for a path to install build
elements of that type. The build elements will be copied from the
directory in 'blib' to the directory given. It is not necessary to
specify the 'install_path' here; it can be specified on the command line
by the user when invoking the install action:
./Build install --install-path conf=/etc/
If specified on the command line it will override the constructor arg.
If it is not specified in either place, those files will not be
installed, so it can be used as a flag.
Since we use ExtUtils::Install to install there is currently no way to
specifiy the file mode.
This has turned out to be one of the most FAQ with Module::Build. There
are plans to greatly simplify the process in the next version of M::B,
including removing the above mentioned limitations.
There are also several other more advanced ways to accomplish the above
by creating a subclass and providing methods to enumerate the files you
want to install or to create the files to be installed. There are
examples of these in Module::Build::Cookbook.
Also, there is a list dedicated to Module::Build which I've CC'd.
Regards,
Randy.