1NAME
2
3 Alien::Build - Build external dependencies for use in CPAN
4
5VERSION
6
7 version 2.45
8
9SYNOPSIS
10
11 my $build = Alien::Build->load('./alienfile');
12 $build->load_requires('configure');
13 $build->set_prefix('/usr/local');
14 $build->set_stage('/foo/mystage'); # needs to be absolute
15 $build->load_requires($build->install_type);
16 $build->download;
17 $build->build;
18 # files are now in /foo/mystage, it is your job (or
19 # ExtUtils::MakeMaker, Module::Build, etc) to copy
20 # those files into /usr/local
21
22DESCRIPTION
23
24 This module provides tools for building external (non-CPAN)
25 dependencies for CPAN. It is mainly designed to be used at install time
26 of a CPAN client, and work closely with Alien::Base which is used at
27 runtime.
28
29 This is the detailed documentation for the Alien::Build class. If you
30 are starting out you probably want to do so from one of these
31 documents:
32
33 Alien::Build::Manual::Alien
34
35 A broad overview of Alien-Build and its ecosystem.
36
37 Alien::Build::Manual::AlienUser
38
39 For users of an Alien::libfoo that is implemented using Alien::Base.
40 (The developer of Alien::libfoo should provide the documentation
41 necessary, but if not, this is the place to start).
42
43 Alien::Build::Manual::AlienAuthor
44
45 If you are writing your own Alien based on Alien::Build and
46 Alien::Base.
47
48 Alien::Build::Manual::FAQ
49
50 If you have a common question that has already been answered, like
51 "How do I use alienfile with some build system".
52
53 Alien::Build::Manual::PluginAuthor
54
55 This is for the brave souls who want to write plugins that will work
56 with Alien::Build + alienfile.
57
58 Note that you will not usually create a Alien::Build instance directly,
59 but rather be using a thin installer layer, such as Alien::Build::MM
60 (for use with ExtUtils::MakeMaker) or Alien::Build::MB (for use with
61 Module::Build). One of the goals of this project is to remain installer
62 agnostic.
63
64CONSTRUCTORS
65
66 new
67
68 my $build = Alien::Build->new;
69
70 This creates a new empty instance of Alien::Build. Normally you will
71 want to use load below to create an instance of Alien::Build from an
72 alienfile recipe.
73
74 load
75
76 my $build = Alien::Build->load($alienfile);
77
78 This creates an Alien::Build instance with the given alienfile recipe.
79
80 resume
81
82 my $build = Alien::Build->resume($alienfile, $root);
83
84 Load a checkpointed Alien::Build instance. You will need the original
85 alienfile and the build root (usually _alien), and a build that had
86 been properly checkpointed using the checkpoint method below.
87
88PROPERTIES
89
90 There are three main properties for Alien::Build. There are a number of
91 properties documented here with a specific usage. Note that these
92 properties may need to be serialized into something primitive like JSON
93 that does not support: regular expressions, code references of blessed
94 objects.
95
96 If you are writing a plugin (Alien::Build::Plugin) you should use a
97 prefix like "plugin_name" (where name is the name of your plugin) so
98 that it does not interfere with other plugin or future versions of
99 Alien::Build. For example, if you were writing
100 Alien::Build::Plugin::Fetch::NewProtocol, please use the prefix
101 plugin_fetch_newprotocol:
102
103 sub init
104 {
105 my($self, $meta) = @_;
106
107 $meta->prop( plugin_fetch_newprotocol_foo => 'some value' );
108
109 $meta->register_hook(
110 some_hook => sub {
111 my($build) = @_;
112 $build->install_prop->{plugin_fetch_newprotocol_bar} = 'some other value';
113 $build->runtime_prop->{plugin_fetch_newprotocol_baz} = 'and another value';
114 }
115 );
116 }
117
118 If you are writing a alienfile recipe please use the prefix my_:
119
120 use alienfile;
121
122 meta_prop->{my_foo} = 'some value';
123
124 probe sub {
125 my($build) = @_;
126 $build->install_prop->{my_bar} = 'some other value';
127 $build->install_prop->{my_baz} = 'and another value';
128 };
129
130 Any property may be used from a command:
131
132 probe [ 'some command %{.meta.plugin_fetch_newprotocol_foo}' ];
133 probe [ 'some command %{.install.plugin_fetch_newprotocol_bar}' ];
134 probe [ 'some command %{.runtime.plugin_fetch_newprotocol_baz}' ];
135 probe [ 'some command %{.meta.my_foo}' ];
136 probe [ 'some command %{.install.my_bar}' ];
137 probe [ 'some command %{.runtime.my_baz}' ];
138
139 meta_prop
140
141 my $href = $build->meta_prop;
142 my $href = Alien::Build->meta_prop;
143
144 Meta properties have to do with the recipe itself, and not any
145 particular instance that probes or builds that recipe. Meta properties
146 can be changed from within an alienfile using the meta_prop directive,
147 or from a plugin from its init method (though should NOT be modified
148 from any hooks registered within that init method). This is not
149 strictly enforced, but if you do not follow this rule your recipe will
150 likely be broken.
151
152 arch
153
154 This is a hint to an installer like Alien::Build::MM or
155 Alien::Build::MB, that the library or tool contains architecture
156 dependent files and so should be stored in an architecture dependent
157 location. If not specified by your alienfile then it will be set to
158 true.
159
160 destdir
161
162 Use the DESTDIR environment variable to stage your install before
163 copying the files into blib. This is the preferred method of
164 installing libraries because it improves reliability. This technique
165 is supported by autoconf and others.
166
167 destdir_filter
168
169 Regular expression for the files that should be copied from the
170 DESTDIR into the stage directory. If not defined, then all files will
171 be copied.
172
173 destdir_ffi_filter
174
175 Same as destdir_filter except applies to build_ffi instead of build.
176
177 env
178
179 Environment variables to override during the build stage.
180
181 env_interpolate
182
183 Environment variable values will be interpolated with helpers.
184 Example:
185
186 meta->prop->{env_interpolate} = 1;
187 meta->prop->{env}->{PERL} = '%{perl}';
188
189 local_source
190
191 Set to true if source code package is available locally. (that is not
192 fetched over the internet). This is computed by default based on the
193 start_url property. Can be set by an alienfile or plugin.
194
195 platform
196
197 Hash reference. Contains information about the platform beyond just
198 $^O.
199
200 compiler_type
201
202 Refers to the type of flags that the compiler accepts. May be
203 expanded in the future, but for now, will be one of:
204
205 microsoft
206
207 On Windows when using Microsoft Visual C++
208
209 unix
210
211 Virtually everything else, including gcc on windows.
212
213 The main difference is that with Visual C++ -LIBPATH should be used
214 instead of -L, and static libraries should have the .LIB suffix
215 instead of .a.
216
217 system_type
218
219 $^O is frequently good enough to make platform specific logic in
220 your alienfile, this handles the case when $^O can cover platforms
221 that provide multiple environments that Perl might run under. The
222 main example is windows, but others may be added in the future.
223
224 unix
225
226 vms
227
228 windows-activestate
229
230 windows-microsoft
231
232 windows-mingw
233
234 windows-strawberry
235
236 windows-unknown
237
238 Note that cygwin and msys are considered unix even though they run
239 on windows!
240
241 out_of_source
242
243 Build in a different directory from the where the source code is
244 stored. In autoconf this is referred to as a "VPATH" build. Everyone
245 else calls this an "out-of-source" build. When this property is true,
246 instead of extracting to the source build root, the downloaded source
247 will be extracted to an source extraction directory and the source
248 build root will be empty. You can use the extract install property to
249 get the location of the extracted source.
250
251 network
252
253 True if a network fetch is available. This should NOT be set by an
254 alienfile or plugin. This is computed based on the
255 ALIEN_INSTALL_NETWORK environment variables.
256
257 start_url
258
259 The default or start URL used by fetch plugins.
260
261 install_prop
262
263 my $href = $build->install_prop;
264
265 Install properties are used during the install phase (either under
266 share or system install). They are remembered for the entire install
267 phase, but not kept around during the runtime phase. Thus they cannot
268 be accessed from your Alien::Base based module.
269
270 autoconf_prefix
271
272 The prefix as understood by autoconf. This is only different on
273 Windows Where MSYS is used and paths like C:/foo are represented as
274 /C/foo which are understood by the MSYS tools, but not by Perl. You
275 should only use this if you are using Alien::Build::Plugin::Autoconf
276 in your alienfile.
277
278 download
279
280 The location of the downloaded archive (tar.gz, or similar) or
281 directory.
282
283 env
284
285 Environment variables to override during the build stage.
286
287 extract
288
289 The location of the last source extraction. For a "out-of-source"
290 build (see the out_of_source meta property above), this will only be
291 set once. For other types of builds, the source code may be extracted
292 multiple times, and thus this property may change.
293
294 old
295
296 Hash containing information on a previously installed Alien of the
297 same name, if available. This may be useful in cases where you want
298 to reuse the previous install if it is still sufficient.
299
300 prefix
301
302 The prefix for the previous install. Versions prior to 1.42
303 unfortunately had this in typo form of preifx.
304
305 runtime
306
307 The runtime properties from the previous install.
308
309 patch
310
311 Directory with patches.
312
313 prefix
314
315 The install time prefix. Under a destdir install this is the same as
316 the runtime or final install location. Under a non-destdir install
317 this is the stage directory (usually the appropriate share directory
318 under blib).
319
320 root
321
322 The build root directory. This will be an absolute path. It is the
323 absolute form of ./_alien by default.
324
325 stage
326
327 The stage directory where files will be copied. This is usually the
328 root of the blib share directory.
329
330 system_probe_class
331
332 After the probe step this property may contain the plugin class that
333 performed the system probe. It shouldn't be filled in directly by the
334 plugin (instead if should use the hook property probe_class, see
335 below). This is optional, and not all probe plugins will provide this
336 information.
337
338 system_probe_instance_id
339
340 After the probe step this property may contain the plugin instance id
341 that performed the system probe. It shouldn't be filled in directly
342 by the plugin (instead if should use the hook property
343 probe_instance_id, see below). This is optional, and not all probe
344 plugins will provide this information.
345
346 plugin_instance_prop
347
348 my $href = $build->plugin_instance_prop($plugin);
349
350 This returns the private plugin instance properties for a given plugin.
351 This method should usually only be called internally by plugins
352 themselves to keep track of internal state. Because the content can be
353 used arbitrarily by the owning plugin because it is private to the
354 plugin, and thus is not part of the Alien::Build spec.
355
356 runtime_prop
357
358 my $href = $build->runtime_prop;
359
360 Runtime properties are used during the install and runtime phases
361 (either under share or system install). This should include anything
362 that you will need to know to use the library or tool during runtime,
363 and shouldn't include anything that is no longer relevant once the
364 install process is complete.
365
366 alien_build_version
367
368 The version of Alien::Build used to install the library or tool.
369
370 alt
371
372 Alternate configurations. If the alienized package has multiple
373 libraries this could be used to store the different compiler or
374 linker flags for each library.
375
376 cflags
377
378 The compiler flags
379
380 cflags_static
381
382 The static compiler flags
383
384 command
385
386 The command name for tools where the name my differ from platform to
387 platform. For example, the GNU version of make is usually make in
388 Linux and gmake on FreeBSD.
389
390 ffi_name
391
392 The name DLL or shared object "name" to use when searching for
393 dynamic libraries at runtime. This is passed into FFI::CheckLib, so
394 if your library is something like libarchive.so or archive.dll you
395 would set this to archive. This may be a string or an array of
396 strings.
397
398 ffi_checklib
399
400 This property contains two sub properties:
401
402 share
403
404 $build->runtime_prop->{ffi_checklib}->{share} = [ ... ];
405
406 Array of additional FFI::CheckLib flags to pass in to find_lib for
407 a share install.
408
409 system
410
411 Array of additional FFI::CheckLib flags to pass in to find_lib for
412 a system install.
413
414 Among other things, useful for specifying the try_linker_script
415 flag:
416
417 $build->runtime_prop->{ffi_checklib}->{system} = [ try_linker_script => 1 ];
418
419 install_type
420
421 The install type. Is one of:
422
423 system
424
425 For when the library or tool is provided by the operating system,
426 can be detected by Alien::Build, and is considered satisfactory by
427 the alienfile recipe.
428
429 share
430
431 For when a system install is not possible, the library source will
432 be downloaded from the internet or retrieved in another appropriate
433 fashion and built.
434
435 libs
436
437 The library flags
438
439 libs_static
440
441 The static library flags
442
443 perl_module_version
444
445 The version of the Perl module used to install the alien (if
446 available). For example if Alien::curl is installing libcurl this
447 would be the version of Alien::curl used during the install step.
448
449 prefix
450
451 The final install root. This is usually they share directory.
452
453 version
454
455 The version of the library or tool
456
457 hook_prop
458
459 my $href = $build->hook_prop;
460
461 Hook properties are for the currently running (if any) hook. They are
462 used only during the execution of each hook and are discarded after. If
463 no hook is currently running then hook_prop will return undef.
464
465 name
466
467 The name of the currently running hook.
468
469 version (probe)
470
471 Probe and PkgConfig plugins may set this property indicating the
472 version of the alienized package. Not all plugins and configurations
473 may be able to provide this.
474
475 probe_class (probe)
476
477 Probe and PkgConfig plugins may set this property indicating the
478 plugin class that made the probe. If the probe results in a system
479 install this will be propagated to system_probe_class for later use.
480
481 probe_instance_id (probe)
482
483 Probe and PkgConfig plugins may set this property indicating the
484 plugin instance id that made the probe. If the probe results in a
485 system install this will be propagated to system_probe_instance_id
486 for later use.
487
488METHODS
489
490 checkpoint
491
492 $build->checkpoint;
493
494 Save any install or runtime properties so that they can be reloaded on
495 a subsequent run in a separate process. This is useful if your build
496 needs to be done in multiple stages from a Makefile, such as with
497 ExtUtils::MakeMaker. Once checkpointed you can use the resume
498 constructor (documented above) to resume the probe/build/install]
499 process.
500
501 root
502
503 my $dir = $build->root;
504
505 This is just a shortcut for:
506
507 my $root = $build->install_prop->{root};
508
509 Except that it will be created if it does not already exist.
510
511 install_type
512
513 my $type = $build->install_type;
514
515 This will return the install type. (See the like named install property
516 above for details). This method will call probe if it has not already
517 been called.
518
519 set_prefix
520
521 $build->set_prefix($prefix);
522
523 Set the final (unstaged) prefix. This is normally only called by
524 Alien::Build::MM and similar modules. It is not intended for use from
525 plugins or from an alienfile.
526
527 set_stage
528
529 $build->set_stage($dir);
530
531 Sets the stage directory. This is normally only called by
532 Alien::Build::MM and similar modules. It is not intended for use from
533 plugins or from an alienfile.
534
535 requires
536
537 my $hash = $build->requires($phase);
538
539 Returns a hash reference of the modules required for the given phase.
540 Phases include:
541
542 configure
543
544 These modules must already be available when the alienfile is read.
545
546 any
547
548 These modules are used during either a system or share install.
549
550 share
551
552 These modules are used during the build phase of a share install.
553
554 system
555
556 These modules are used during the build phase of a system install.
557
558 load_requires
559
560 $build->load_requires($phase);
561
562 This loads the appropriate modules for the given phase (see requires
563 above for a description of the phases).
564
565 probe
566
567 my $install_type = $build->probe;
568
569 Attempts to determine if the operating system has the library or tool
570 already installed. If so, then the string system will be returned and a
571 system install will be performed. If not, then the string share will be
572 installed and the tool or library will be downloaded and built from
573 source.
574
575 If the environment variable ALIEN_INSTALL_TYPE is set, then that will
576 force a specific type of install. If the detection logic cannot
577 accommodate the install type requested then it will fail with an
578 exception.
579
580 download
581
582 $build->download;
583
584 Download the source, usually as a tarball, usually from the internet.
585
586 Under a system install this does not do anything.
587
588 fetch
589
590 my $res = $build->fetch;
591 my $res = $build->fetch($url, %options);
592
593 Fetch a resource using the fetch hook. Returns the same hash structure
594 described below in the hook documentation.
595
596 [version 2.39]
597
598 As of Alien::Build 2.39, these options are supported:
599
600 http_headers
601
602 my $res = $build->fetch($url, http_headers => [ $key1 => $value1, $key2 => $value 2, ... ]);
603
604 Set the HTTP request headers on all outgoing HTTP requests. Note that
605 not all protocols or fetch plugins support setting request headers,
606 but the ones that do not should issue a warning if you try to set
607 request headers and they are not supported.
608
609 decode
610
611 my $decoded_res = $build->decode($res);
612
613 Decode the HTML or file listing returned by fetch. Returns the same
614 hash structure described below in the hook documentation.
615
616 prefer
617
618 my $sorted_res = $build->prefer($res);
619
620 Filter and sort candidates. The preferred candidate will be returned
621 first in the list. The worst candidate will be returned last. Returns
622 the same hash structure described below in the hook documentation.
623
624 extract
625
626 my $dir = $build->extract;
627 my $dir = $build->extract($archive);
628
629 Extracts the given archive into a fresh directory. This is normally
630 called internally to Alien::Build, and for normal usage is not needed
631 from a plugin or alienfile.
632
633 build
634
635 $build->build;
636
637 Run the build step. It is expected that probe and download have already
638 been performed. What it actually does depends on the type of install:
639
640 share
641
642 The source is extracted, and built as determined by the alienfile
643 recipe. If there is a gather_share that will be executed last.
644
645 system
646
647 The gather_system hook will be executed.
648
649 test
650
651 $build->test;
652
653 Run the test phase
654
655 clean_install
656
657 $build->clean_install
658
659 Clean files from the final install location. The default implementation
660 removes all files recursively except for the _alien directory. This is
661 helpful when you have an old install with files that may break the new
662 build.
663
664 For a non-share install this doesn't do anything.
665
666 system
667
668 $build->system($command);
669 $build->system($command, @args);
670
671 Interpolates the command and arguments and run the results using the
672 Perl system command.
673
674 log
675
676 $build->log($message);
677
678 Send a message to the log. By default this prints to STDOUT.
679
680 meta
681
682 my $meta = Alien::Build->meta;
683 my $meta = $build->meta;
684
685 Returns the meta object for your Alien::Build class or instance. The
686 meta object is a way to manipulate the recipe, and so any changes to
687 the meta object should be made before the probe, download or build
688 steps.
689
690META METHODS
691
692 prop
693
694 my $href = $build->meta->prop;
695
696 Meta properties. This is the same as calling meta_prop on the class or
697 Alien::Build instance.
698
699 add_requires
700
701 Alien::Build->meta->add_requires($phase, $module => $version, ...);
702
703 Add the requirement to the given phase. Phase should be one of:
704
705 configure
706
707 any
708
709 share
710
711 system
712
713 interpolator
714
715 my $interpolator = $build->meta->interpolator;
716 my $interpolator = Alien::Build->interpolator;
717
718 Returns the Alien::Build::Interpolate instance for the Alien::Build
719 class.
720
721 has_hook
722
723 my $bool = $build->meta->has_hook($name);
724 my $bool = Alien::Build->has_hook($name);
725
726 Returns if there is a usable hook registered with the given name.
727
728 register_hook
729
730 $build->meta->register_hook($name, $instructions);
731 Alien::Build->meta->register_hook($name, $instructions);
732
733 Register a hook with the given name. $instruction should be either a
734 code reference, or a command sequence, which is an array reference.
735
736 default_hook
737
738 $build->meta->default_hook($name, $instructions);
739 Alien::Build->meta->default_hook($name, $instructions);
740
741 Register a default hook, which will be used if the alienfile does not
742 register its own hook with that name.
743
744 around_hook
745
746 $build->meta->around_hook($hook, $code);
747 Alien::Build->meta->around_hook($name, $code);
748
749 Wrap the given hook with a code reference. This is similar to a Moose
750 method modifier, except that it wraps around the given hook instead of
751 a method. For example, this will add a probe system requirement:
752
753 $build->meta->around_hook(
754 probe => sub {
755 my $orig = shift;
756 my $build = shift;
757 my $type = $orig->($build, @_);
758 return $type unless $type eq 'system';
759 # also require a configuration file
760 if(-f '/etc/foo.conf')
761 {
762 return 'system';
763 }
764 else
765 {
766 return 'share';
767 }
768 },
769 );
770
771 apply_plugin
772
773 Alien::Build->meta->apply_plugin($name);
774 Alien::Build->meta->apply_plugin($name, @args);
775
776 Apply the given plugin with the given arguments.
777
778ENVIRONMENT
779
780 Alien::Build responds to these environment variables:
781
782 ALIEN_INSTALL_NETWORK
783
784 If set to true (the default), then network fetch will be allowed. If
785 set to false, then network fetch will not be allowed.
786
787 What constitutes a local vs. network fetch is determined based on the
788 start_url and local_source meta properties. An alienfile or plugin
789 could override this detection (possibly inappropriately), so this
790 variable is not a substitute for properly auditing of Perl modules
791 for environments that require that.
792
793 ALIEN_INSTALL_TYPE
794
795 If set to share or system, it will override the system detection
796 logic. If set to default, it will use the default setting for the
797 alienfile. The behavior of other values is undefined.
798
799 Although the recommended way for a consumer to use an Alien::Base
800 based Alien is to declare it as a static configure and build-time
801 dependency, some consumers may prefer to fallback on using an Alien
802 only when the consumer itself cannot detect the necessary package. In
803 some cases the consumer may want the user to opt-in to using an Alien
804 before requiring it.
805
806 To keep the interface consistent among Aliens, the consumer of the
807 fallback opt-in Alien may fallback on the Alien if the environment
808 variable ALIEN_INSTALL_TYPE is set to any value. The rationale is
809 that by setting this environment variable the user is aware that
810 Alien modules may be installed and have indicated consent. The actual
811 implementation of this, by its nature would have to be in the
812 consuming CPAN module.
813
814 ALIEN_BUILD_LOG
815
816 The default log class used. See Alien::Build::Log and
817 Alien::Build::Log::Default.
818
819 ALIEN_BUILD_RC
820
821 Perl source file which can override some global defaults for
822 Alien::Build, by, for example, setting preload and postload plugins.
823
824 ALIEN_BUILD_PKG_CONFIG
825
826 Override the logic in Alien::Build::Plugin::PkgConfig::Negotiate
827 which chooses the best pkg-config plugin.
828
829 ALIEN_BUILD_PRELOAD
830
831 semicolon separated list of plugins to automatically load before
832 parsing your alienfile.
833
834 ALIEN_BUILD_POSTLOAD
835
836 semicolon separated list of plugins to automatically load after
837 parsing your alienfile.
838
839 DESTDIR
840
841 This environment variable will be manipulated during a destdir
842 install.
843
844 PKG_CONFIG
845
846 This environment variable can be used to override the program name
847 for pkg-config when using the command line plugin:
848 Alien::Build::Plugin::PkgConfig::CommandLine.
849
850 ftp_proxy, all_proxy
851
852 If these environment variables are set, it may influence the Download
853 negotiation plugin Alien::Build::Plugin::Downaload::Negotiate. Other
854 proxy variables may be used by some Fetch plugins, if they support
855 it.
856
857SUPPORT
858
859 The intent of the Alien-Build team is to support as best as possible
860 all Perls from 5.8.4 to the latest production version. So long as they
861 are also supported by the Perl toolchain.
862
863 Please feel encouraged to report issues that you encounter to the
864 project GitHub Issue tracker:
865
866 https://github.com/PerlAlien/Alien-Build/issues
867
868 Better if you can fix the issue yourself, please feel encouraged to
869 open pull-request on the project GitHub:
870
871 https://github.com/PerlAlien/Alien-Build/pulls
872
873 If you are confounded and have questions, join us on the #native
874 channel on irc.perl.org. The Alien-Build developers frequent this
875 channel and can probably help point you in the right direction. If you
876 don't have an IRC client handy, you can use this web interface:
877
878 https://chat.mibbit.com/?channel=%23native&server=irc.perl.org
879
880SEE ALSO
881
882 Alien::Build::Manual::AlienAuthor, Alien::Build::Manual::AlienUser,
883 Alien::Build::Manual::Contributing, Alien::Build::Manual::FAQ,
884 Alien::Build::Manual::PluginAuthor
885
886 alienfile, Alien::Build::MM, Alien::Build::Plugin, Alien::Base, Alien
887
888THANKS
889
890 Alien::Base was originally written by Joel Berger, the rest of this
891 project would not have been possible without him getting the project
892 started. Thanks to his support I have been able to augment the original
893 Alien::Base system with a reliable set of tools (Alien::Build,
894 alienfile, Test::Alien), which make up this toolset.
895
896 The original Alien::Base is still copyright (c) 2012-2020 Joel Berger.
897 It has the same license as the rest of the Alien::Build and related
898 tools distributed as Alien-Build. Joel Berger thanked a number of
899 people who helped in in the development of Alien::Base, in the
900 documentation for that module.
901
902 I would also like to acknowledge the other members of the PerlAlien
903 github organization, Zakariyya Mughal (sivoais, ZMUGHAL) and mohawk
904 (ETJ). Also important in the early development of Alien::Build were the
905 early adopters Chase Whitener (genio, CAPOEIRAB, author of
906 Alien::libuv), William N. Braswell, Jr (willthechill, WBRASWELL, author
907 of Alien::JPCRE2 and Alien::PCRE2) and Ahmad Fatoum (a3f, ATHREEF,
908 author of Alien::libudev and Alien::LibUSB).
909
910 The Alien ecosystem owes a debt to Dan Book, who goes by Grinnz on IRC,
911 for answering question about how to use Alien::Build and friends.
912
913AUTHOR
914
915 Author: Graham Ollis <plicease@cpan.org>
916
917 Contributors:
918
919 Diab Jerius (DJERIUS)
920
921 Roy Storey (KIWIROY)
922
923 Ilya Pavlov
924
925 David Mertens (run4flat)
926
927 Mark Nunberg (mordy, mnunberg)
928
929 Christian Walde (Mithaldu)
930
931 Brian Wightman (MidLifeXis)
932
933 Zaki Mughal (zmughal)
934
935 mohawk (mohawk2, ETJ)
936
937 Vikas N Kumar (vikasnkumar)
938
939 Flavio Poletti (polettix)
940
941 Salvador Fandiño (salva)
942
943 Gianni Ceccarelli (dakkar)
944
945 Pavel Shaydo (zwon, trinitum)
946
947 Kang-min Liu (劉康民, gugod)
948
949 Nicholas Shipp (nshp)
950
951 Juan Julián Merelo Guervós (JJ)
952
953 Joel Berger (JBERGER)
954
955 Petr Písař (ppisar)
956
957 Lance Wicks (LANCEW)
958
959 Ahmad Fatoum (a3f, ATHREEF)
960
961 José Joaquín Atria (JJATRIA)
962
963 Duke Leto (LETO)
964
965 Shoichi Kaji (SKAJI)
966
967 Shawn Laffan (SLAFFAN)
968
969 Paul Evans (leonerd, PEVANS)
970
971 Håkon Hægland (hakonhagland, HAKONH)
972
973 nick nauwelaerts (INPHOBIA)
974
975COPYRIGHT AND LICENSE
976
977 This software is copyright (c) 2011-2020 by Graham Ollis.
978
979 This is free software; you can redistribute it and/or modify it under
980 the same terms as the Perl 5 programming language system itself.
981
982