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