1Module::Build::CookbookU(s3eprm)Contributed Perl DocumenMtoadtuiloen::Build::Cookbook(3pm)
2
3
4
6 Module::Build::Cookbook - Examples of Module::Build Usage
7
9 "Module::Build" isn't conceptually very complicated, but examples are
10 always helpful. The following recipes should help developers and/or
11 installers put together the pieces from the other parts of the
12 documentation.
13
15 Installing modules that use Module::Build
16 In most cases, you can just issue the following commands:
17
18 perl Build.PL
19 ./Build
20 ./Build test
21 ./Build install
22
23 There's nothing complicated here - first you're running a script called
24 Build.PL, then you're running a (newly-generated) script called Build
25 and passing it various arguments.
26
27 The exact commands may vary a bit depending on how you invoke perl
28 scripts on your system. For instance, if you have multiple versions of
29 perl installed, you can install to one particular perl's library
30 directories like so:
31
32 /usr/bin/perl5.8.1 Build.PL
33 ./Build
34 ./Build test
35 ./Build install
36
37 If you're on Windows where the current directory is always searched
38 first for scripts, you'll probably do something like this:
39
40 perl Build.PL
41 Build
42 Build test
43 Build install
44
45 On the old Mac OS (version 9 or lower) using MacPerl, you can double-
46 click on the Build.PL script to create the Build script, then double-
47 click on the Build script to run its "build", "test", and "install"
48 actions.
49
50 The Build script knows what perl was used to run Build.PL, so you don't
51 need to re-invoke the Build script with the complete perl path each
52 time. If you invoke it with the wrong perl path, you'll get a warning
53 or a fatal error.
54
55 Modifying Config.pm values
56 "Module::Build" relies heavily on various values from perl's
57 "Config.pm" to do its work. For example, default installation paths
58 are given by "installsitelib" and "installvendorman3dir" and friends, C
59 linker & compiler settings are given by "ld", "lddlflags", "cc",
60 "ccflags", and so on. If you're pretty sure you know what you're
61 doing, you can tell "Module::Build" to pretend there are different
62 values in Config.pm than what's really there, by passing arguments for
63 the "--config" parameter on the command line:
64
65 perl Build.PL --config cc=gcc --config ld=gcc
66
67 Inside the "Build.PL" script the same thing can be accomplished by
68 passing values for the "config" parameter to new():
69
70 my $build = Module::Build->new
71 (
72 ...
73 config => { cc => 'gcc', ld => 'gcc' },
74 ...
75 );
76
77 In custom build code, the same thing can be accomplished by calling the
78 "config" in Module::Build method:
79
80 $build->config( cc => 'gcc' ); # Set
81 $build->config( ld => 'gcc' ); # Set
82 ...
83 my $linker = $build->config('ld'); # Get
84
85 Installing modules using the programmatic interface
86 If you need to build, test, and/or install modules from within some
87 other perl code (as opposed to having the user type installation
88 commands at the shell), you can use the programmatic interface. Create
89 a Module::Build object (or an object of a custom Module::Build
90 subclass) and then invoke its dispatch() method to run various actions.
91
92 my $build = Module::Build->new
93 (
94 module_name => 'Foo::Bar',
95 license => 'perl',
96 requires => { 'Some::Module' => '1.23' },
97 );
98 $build->dispatch('build');
99 $build->dispatch('test', verbose => 1);
100 $build->dispatch('install');
101
102 The first argument to dispatch() is the name of the action, and any
103 following arguments are named parameters.
104
105 This is the interface we use to test Module::Build itself in the
106 regression tests.
107
108 Installing to a temporary directory
109 To create packages for package managers like RedHat's "rpm" or Debian's
110 "deb", you may need to install to a temporary directory first and then
111 create the package from that temporary installation. To do this,
112 specify the "destdir" parameter to the "install" action:
113
114 ./Build install --destdir /tmp/my-package-1.003
115
116 This essentially just prepends all the installation paths with the
117 /tmp/my-package-1.003 directory.
118
119 Installing to a non-standard directory
120 To install to a non-standard directory (for example, if you don't have
121 permission to install in the system-wide directories), you can use the
122 "install_base" or "prefix" parameters:
123
124 ./Build install --install_base /foo/bar
125
126 See "INSTALL PATHS" in Module::Build for a much more complete
127 discussion of how installation paths are determined.
128
129 Installing in the same location as ExtUtils::MakeMaker
130 With the introduction of "--prefix" in Module::Build 0.28 and
131 "INSTALL_BASE" in "ExtUtils::MakeMaker" 6.31 its easy to get them both
132 to install to the same locations.
133
134 First, ensure you have at least version 0.28 of Module::Build installed
135 and 6.31 of "ExtUtils::MakeMaker". Prior versions have differing (and
136 in some cases quite strange) installation behaviors.
137
138 The following installation flags are equivalent between
139 "ExtUtils::MakeMaker" and "Module::Build".
140
141 MakeMaker Module::Build
142 PREFIX=... --prefix ...
143 INSTALL_BASE=... --install_base ...
144 DESTDIR=... --destdir ...
145 LIB=... --install_path lib=...
146 INSTALLDIRS=... --installdirs ...
147 INSTALLDIRS=perl --installdirs core
148 UNINST=... --uninst ...
149 INC=... --extra_compiler_flags ...
150 POLLUTE=1 --extra_compiler_flags -DPERL_POLLUTE
151
152 For example, if you are currently installing "MakeMaker" modules with
153 this command:
154
155 perl Makefile.PL PREFIX=~
156 make test
157 make install UNINST=1
158
159 You can install into the same location with Module::Build using this:
160
161 perl Build.PL --prefix ~
162 ./Build test
163 ./Build install --uninst 1
164
165 "prefix" vs "install_base"
166
167 The behavior of "prefix" is complicated and depends on how your Perl is
168 configured. The resulting installation locations will vary from
169 machine to machine and even different installations of Perl on the same
170 machine. Because of this, it's difficult to document where "prefix"
171 will place your modules.
172
173 In contrast, "install_base" has predictable, easy to explain
174 installation locations. Now that "Module::Build" and "MakeMaker" both
175 have "install_base" there is little reason to use "prefix" other than
176 to preserve your existing installation locations. If you are starting
177 a fresh Perl installation we encourage you to use "install_base". If
178 you have an existing installation installed via "prefix", consider
179 moving it to an installation structure matching "install_base" and
180 using that instead.
181
182 Running a single test file
183 "Module::Build" supports running a single test, which enables you to
184 track down errors more quickly. Use the following format:
185
186 ./Build test --test_files t/mytest.t
187
188 In addition, you may want to run the test in verbose mode to get more
189 informative output:
190
191 ./Build test --test_files t/mytest.t --verbose 1
192
193 I run this so frequently that I define the following shell alias:
194
195 alias t './Build test --verbose 1 --test_files'
196
197 So then I can just execute "t t/mytest.t" to run a single test.
198
200 Making a CPAN.pm-compatible distribution
201 New versions of CPAN.pm understand how to use a Build.PL script, but
202 old versions don't. If authors want to help users who have old
203 versions, some form of Makefile.PL should be supplied. The easiest way
204 to accomplish this is to use the "create_makefile_pl" parameter to
205 "Module::Build->new()" in the "Build.PL" script, which can create
206 various flavors of Makefile.PL during the "dist" action.
207
208 As a best practice, we recommend using the "traditional" style of
209 Makefile.PL unless your distribution has needs that can't be
210 accomplished that way.
211
212 The "Module::Build::Compat" module, which is part of "Module::Build"'s
213 distribution, is responsible for creating these Makefile.PLs. Please
214 see Module::Build::Compat for the details.
215
216 Changing the order of the build process
217 The "build_elements" property specifies the steps "Module::Build" will
218 take when building a distribution. To change the build order, change
219 the order of the entries in that property:
220
221 # Process pod files first
222 my @e = @{$build->build_elements};
223 my ($i) = grep {$e[$_] eq 'pod'} 0..$#e;
224 unshift @e, splice @e, $i, 1;
225
226 Currently, "build_elements" has the following default value:
227
228 [qw( PL support pm xs pod script )]
229
230 Do take care when altering this property, since there may be non-
231 obvious (and non-documented!) ordering dependencies in the
232 "Module::Build" code.
233
234 Adding new file types to the build process
235 Sometimes you might have extra types of files that you want to install
236 alongside the standard types like .pm and .pod files. For instance,
237 you might have a Bar.dat file containing some data related to the
238 "Foo::Bar" module and you'd like for it to end up as Foo/Bar.dat
239 somewhere in perl's @INC path so "Foo::Bar" can access it easily at
240 runtime. The following code from a sample "Build.PL" file demonstrates
241 how to accomplish this:
242
243 use Module::Build;
244 my $build = Module::Build->new
245 (
246 module_name => 'Foo::Bar',
247 ...other stuff here...
248 );
249 $build->add_build_element('dat');
250 $build->create_build_script;
251
252 This will find all .dat files in the lib/ directory, copy them to the
253 blib/lib/ directory during the "build" action, and install them during
254 the "install" action.
255
256 If your extra files aren't located in the "lib/" directory in your
257 distribution, you can explicitly say where they are, just as you'd do
258 with .pm or .pod files:
259
260 use Module::Build;
261 my $build = new Module::Build
262 (
263 module_name => 'Foo::Bar',
264 dat_files => {'some/dir/Bar.dat' => 'lib/Foo/Bar.dat'},
265 ...other stuff here...
266 );
267 $build->add_build_element('dat');
268 $build->create_build_script;
269
270 If your extra files actually need to be created on the user's machine,
271 or if they need some other kind of special processing, you'll probably
272 want to subclass "Module::Build" and create a special method to process
273 them, named "process_${kind}_files()":
274
275 use Module::Build;
276 my $class = Module::Build->subclass(code => <<'EOF');
277 sub process_dat_files {
278 my $self = shift;
279 ... locate and process *.dat files,
280 ... and create something in blib/lib/
281 }
282 EOF
283 my $build = $class->new
284 (
285 module_name => 'Foo::Bar',
286 ...other stuff here...
287 );
288 $build->add_build_element('dat');
289 $build->create_build_script;
290
291 If your extra files don't go in lib/ but in some other place, see
292 "Adding new elements to the install process" for how to actually get
293 them installed.
294
295 Please note that these examples use some capabilities of Module::Build
296 that first appeared in version 0.26. Before that it could still be
297 done, but the simple cases took a bit more work.
298
299 Adding new elements to the install process
300 By default, Module::Build creates seven subdirectories of the blib
301 directory during the build process: lib, arch, bin, script, bindoc,
302 libdoc, and html (some of these may be missing or empty if there's
303 nothing to go in them). Anything copied to these directories during
304 the build will eventually be installed during the "install" action (see
305 "INSTALL PATHS" in Module::Build.
306
307 If you need to create a new custom type of installable element, e.g.
308 "conf", then you need to tell Module::Build where things in blib/conf/
309 should be installed. To do this, use the "install_path" parameter to
310 the new() method:
311
312 my $build = Module::Build->new
313 (
314 ...other stuff here...
315 install_path => { conf => $installation_path }
316 );
317
318 Or you can call the install_path() method later:
319
320 $build->install_path(conf => $installation_path);
321
322 The user may also specify the path on the command line:
323
324 perl Build.PL --install_path conf=/foo/path/etc
325
326 The important part, though, is that somehow the install path needs to
327 be set, or else nothing in the blib/conf/ directory will get installed,
328 and a runtime error during the "install" action will result.
329
330 See also "Adding new file types to the build process" for how to create
331 the stuff in blib/conf/ in the first place.
332
334 Several distributions on CPAN are making good use of various features
335 of Module::Build. They can serve as real-world examples for others.
336
337 SVN-Notify-Mirror
338 <http://search.cpan.org/~jpeacock/SVN-Notify-Mirror/>
339
340 John Peacock, author of the "SVN-Notify-Mirror" distribution, says:
341
342 1. Using "auto_features", I check to see whether two optional modules
343 are available - SVN::Notify::Config and Net::SSH;
344 2. If the S::N::Config module is loaded, I automatically generate test
345 files for it during Build (using the "PL_files" property).
346 3. If the "ssh_feature" is available, I ask if the user wishes to
347 perform the ssh tests (since it requires a little preliminary setup);
348 4. Only if the user has "ssh_feature" and answers yes to the testing,
349 do I generate a test file.
350 I'm sure I could not have handled this complexity with EU::MM, but
351 it was very easy to do with M::B.
352
353 Modifying an action
354 Sometimes you might need an to have an action, say "./Build install",
355 do something unusual. For instance, you might need to change the
356 ownership of a file or do something else peculiar to your application.
357
358 You can subclass "Module::Build" on the fly using the subclass() method
359 and override the methods that perform the actions. You may need to
360 read through "Module::Build::Authoring" and "Module::Build::API" to
361 find the methods you want to override. All "action" methods are
362 implemented by a method called "ACTION_" followed by the action's name,
363 so here's an example of how it would work for the "install" action:
364
365 # Build.PL
366 use Module::Build;
367 my $class = Module::Build->subclass(
368 class => "Module::Build::Custom",
369 code => <<'SUBCLASS' );
370
371 sub ACTION_install {
372 my $self = shift;
373 # YOUR CODE HERE
374 $self->SUPER::ACTION_install;
375 }
376 SUBCLASS
377
378 $class->new(
379 module_name => 'Your::Module',
380 # rest of the usual Module::Build parameters
381 )->create_build_script;
382
383 Adding an action
384 You can add a new "./Build" action simply by writing the method for it
385 in your subclass. Use "depends_on" to declare that another action must
386 have been run before your action.
387
388 For example, let's say you wanted to be able to write "./Build commit"
389 to test your code and commit it to Subversion.
390
391 # Build.PL
392 use Module::Build;
393 my $class = Module::Build->subclass(
394 class => "Module::Build::Custom",
395 code => <<'SUBCLASS' );
396
397 sub ACTION_commit {
398 my $self = shift;
399
400 $self->depends_on("test");
401 $self->do_system(qw(svn commit));
402 }
403 SUBCLASS
404
405 Bundling Module::Build
406 Note: This section probably needs an update as the technology improves
407 (see contrib/bundle.pl in the distribution).
408
409 Suppose you want to use some new-ish features of Module::Build, e.g.
410 newer than the version of Module::Build your users are likely to
411 already have installed on their systems. The first thing you should do
412 is set "configure_requires" to your minimum version of Module::Build.
413 See Module::Build::Authoring.
414
415 But not every build system honors "configure_requires" yet. Here's how
416 you can ship a copy of Module::Build, but still use a newer installed
417 version to take advantage of any bug fixes and upgrades.
418
419 First, install Module::Build into Your-Project/inc/Module-Build. CPAN
420 will not index anything in the inc directory so this copy will not show
421 up in CPAN searches.
422
423 cd Module-Build
424 perl Build.PL --install_base /path/to/Your-Project/inc/Module-Build
425 ./Build test
426 ./Build install
427
428 You should now have all the Module::Build .pm files in
429 Your-Project/inc/Module-Build/lib/perl5.
430
431 Next, add this to the top of your Build.PL.
432
433 my $Bundled_MB = 0.30; # or whatever version it was.
434
435 # Find out what version of Module::Build is installed or fail quietly.
436 # This should be cross-platform.
437 my $Installed_MB =
438 `$^X -e "eval q{require Module::Build; print Module::Build->VERSION} or exit 1"`;
439
440 # some operating systems put a newline at the end of every print.
441 chomp $Installed_MB;
442
443 $Installed_MB = 0 if $?;
444
445 # Use our bundled copy of Module::Build if it's newer than the installed.
446 unshift @INC, "inc/Module-Build/lib/perl5" if $Bundled_MB > $Installed_MB;
447
448 require Module::Build;
449
450 And write the rest of your Build.PL normally. Module::Build will
451 remember your change to @INC and use it when you run ./Build.
452
453 In the future, we hope to provide a more automated solution for this
454 scenario; see "inc/latest.pm" in the Module::Build distribution for one
455 indication of the direction we're moving.
456
458 Ken Williams <kwilliams@cpan.org>
459
461 Copyright (c) 2001-2008 Ken Williams. All rights reserved.
462
463 This library is free software; you can redistribute it and/or modify it
464 under the same terms as Perl itself.
465
467 perl(1), Module::Build(3), Module::Build::Authoring(3),
468 Module::Build::API(3)
469
470
471
472perl v5.38.0 2023-07-20 Module::Build::Cookbook(3pm)