Alien-Build-2.84/000755 000000 000000 00000000000 14710030646 013513 5ustar00rootroot000000 000000 Alien-Build-2.84/Changes000644 000000 000000 00000136314 14710030646 015016 0ustar00rootroot000000 000000 Revision history for Alien-Build 2.84 2024-10-28 18:51:39 -0600 - Added is_system_install and is_share_install methods to Alien::Build (gh#418, gh#420, shawnlaffan++) - Some comment and documentation spelling fixes (gh#250) 2.83 2024-06-05 15:06:15 -0600 - Production release identical to 2.82_01 2.82_01 2024-05-25 01:49:23 -0600 - CPU detection with archname arm64- prefix (gh#411, gh#412) 2.81_01 2023-06-24 09:54:28 -0600 - Added support for xz compression with Alien::Build::Plugin::Extract::ArchiveTar (gh#404) - Extract negotiator (Alien::Build::Plugin::Extract::Negotiate) now prefers the Extract::ArchiveTar plugin for tar.xz files. On Windows Extract::ArchiveTar is now always used for tar.xz files because the BSD tar that comes with Windows can hang on tar.xz if xz is in the PATH (gh#403, gh#404) 2.80 2023-05-11 16:31:46 -0600 - Documentation improvements (gh#399, gh#400, gh#401, gh#402) - Do not generate .../Install/Files.pm if one is provided by the Alien (gh#393, gh#397) 2.79 2023-05-05 15:08:46 -0600 - Updated non-binding support for Perls to match the policy of the Perl toolchain (Perls older than 10 years old are unsupported, with a one-time exception of Perl 5.16). The intent is not to suddenly drop support for older Perls, but the Alien-Build team may take advantage of features in supported Perls that will effectively remove compatability with unsupported Perls. 2.78 2023-03-07 11:49:27 -0700 - Test fix to handle Perls with space in the path (gh#391, mohawk++) 2.77 2023-01-20 14:59:14 +1100 - Documentation improvements (gh#389, #gh#390) - Additional noisy diagnostic when trying to use the regular download negotiator plugin with a GitHub releases page (gh#388, gh#390) 2.76 2022-12-28 18:30:39 -0700 - Fix inline_auto_include so that it gives priority to the .runtime.inline_auto_include property 2.75 2022-12-21 21:03:27 -0700 - The Download::Negotiate plugin will no longer pick the Fetch::CurlCommand plugin (unless bootstrap_ssl option is chosen), because it relies on the -J option which is unfortunately not reliable. When a more reliable method can be used by Fetch::CurlCommand we will likely go back to preferring it (gh#384, gh#385) 2.74 2022-11-27 08:26:06 -0700 - Patches to Test::Alien to make it safe for C99 (gh#383, Florian Weimer++) 2.73 2022-11-20 07:23:46 -0700 - Fix Extract::ArchiveZip test when ALIEN_DOWNLOAD_RULE set to digest_or_encrypt (gh#382) 2.72 2022-10-26 06:28:00 -0600 - Improved diagnostic when all links are excluded by the filter stage (gh#380) 2.71 2022-10-04 11:18:14 -0600 - Added Alien::Build::Plugin::Extract::File (gh#375) 2.70 2022-09-23 06:27:39 -0600 - Production release identical to 2.69_01 2.69_01 2022-09-20 18:00:17 -0600 - Documentation improvements (gh#370) - Added meta.platform.cpu.count and meta.platform.cpu.arch.name properties (gh#371 zmughal++) 2.68 2022-09-05 09:05:18 -0600 - Documentation improvements (gh#367) - alien_diag from Test::Alien::Diag now can optionaly take a hash reference as its last argument (gh#365, gh#366) - alien_diag supports two new options properties and list_properties (gh#365, gh#366) - Document that alien_diag may take more than one alien as an argument (this has always been the case, but never documented (gh#366) 2.67 2022-09-03 17:07:40 -0600 - Test::Alien::Diag should now handle undef fields more gracefully (gh#363, gh#364) 2.66 2022-09-01 13:29:15 -0600 - Validate SSL certificates for Fetch::HTTPTiny plugin if ALIEN_DOWNLOAD_RULE is one of encrypt, digest_or_encrypt or digest_and_encrypt (gh#362) 2.65 2022-08-30 11:17:41 -0600 - Fix POD name for Alien::Build::Manual::Security (gh#360) 2.64 2022-08-30 10:09:42 -0600 - Production release identical to 2.63.01 - !!! Notice of Change of Behavior !!! In the near future, AB will require by default one of: 1. Secure https connection 2. Bundled pacakge (ie file:// URL) 3. Cryptographic signature before extracting archives fetched off the internet. You can test the new behavior yourself by setting ALIEN_DOWNLOAD_RULE to `digest_or_encrypt`. More details can be found in the Alien::Build::Manual::Security POD !!! Notice of Change of Behavior !!! 2.63_01 2022-08-30 00:44:54 -0600 - New documentation Alien::Build::Manual::Security (gh#357) - Compute $build->donwload_rule as soon as possible (gh#190, gh#358) - ALIEN_DOWNLOAD_RULE=default is now a legal value. It is currently the same as 'warn' but will probably become 'digest_or_encrypt' in the future (gh#356) - Added notice in change of behavior (gh#190, gh#359) 2.62_01 2022-08-29 15:03:53 -0600 - Fixed bug introduced in 2.60_01 where file URLs were not considered safe (gh#351, gh#355) 2.61_01 2022-08-28 15:49:06 -0600 - Added preload_plugin and postload_plugin to Alien::Build::rc (gh#348, gh#349) 2.60_01 2022-08-28 10:37:01 -0600 - Documentation improvements (gh#333, gh#334, gh#342, gh#343, gh#344) - Fixed a number of broken links in POD (gh#344) - Added download_detail install property (gh#190, gh#344) - Added download_rule method (gh#190, gh#344) - The fetch hook and other plugins that use the same file hash can and now should include a protocol field (gh#190, gh#344) 2.59 2022-08-16 09:38:14 -0600 - Documentation improvements (gh#337, gh#341) - Do not allow downgrading from SSL if start_url is https. This is done by filtering non-SSL URLs from the candidate listif the start_url uses https (gh#190, gh#339) 2.58_01 2022-08-15 12:55:07 -0600 - Fix bug where properties could not be interpolated in environment variables if meta.env_interpolate is on (gh#333) - Can now pass an Alien::Build instance into Alien::Build::Interpolator's interpolate method to use meta, install, runtime, etc. prroperites in the template (gh#312, gh#333) 2.57_01 2022-08-15 11:09:52 -0600 - Added experimental plugin Digest::SHA and Digest::SHAPP for checking signatures (gh#332) - Added experimental check_digest method on Alien::Build (gh#332) - Added experimental digest keyword for alienfile (gh#332) - Removed long deprecated subplugin method from Alien::Build::Plugin (gh#331) 2.56 2022-08-13 15:33:18 -0600 - Production release identical to 2.55.01 2.55_01 2022-08-13 15:28:00 -0600 - Documentation improvements (gh#313, gh#330) 2.54_01 2022-08-13 11:29:15 -0600 - Documentation improvements (gh#48, gh#313, gh#329) 2.53 2022-08-12 14:02:31 -0600 - Documentation improvements (gh#241, gh#254, gh#283, gh#298, gh#312, gh#327) - Added .runtime.inline_auto_include property (gh#226, gh#328) - xs_ok in Test::Alien will now keep temporary generated files on failure by default. You can override this behavior using TEST_ALIEN_ALWAYS_KEEP (gh#315, gh#326) - Added TEST_ALIEN_ALIENS_MISSING environment variable to remove warning in Test::Alien when you use some tools without first calling alien_ok (gh#326) 2.52 2022-08-11 15:18:46 -0600 - Improved documentation (gh#317, gh#318) - Fixed bug for run_ok in Test::Alien where passing a command in scalar context would not work for commands with arguments (gh#320) - Added interpolate_run_ok and plugin_ok to Test::Alien (gh#319, gh#321, gh#322) - Better support for Alien::MSYS + Test::Alien (gh#323) - Better handle it when flags are undef by not passing into Text::ParseWords::shellwords(gh#314, gh#324) 2.51 2022-08-03 09:57:08 -0600 - Remove use of duplicate lddlfalgs in Test::Alien which could cause failures on AIX (gh#217, gh#316) 2.50 2022-06-23 11:53:00 -0500 - Documentation updates (gh#308, gh#310) 2.49 2022-06-23 11:19:08 -0500 - Fix tests to pass on systems that do not have a compiler (gh#309) 2.48 2022-03-13 11:20:19 -0600 - Added atleast_version to Probe::CommandLine and Probe::CBuilder plugins (gh#299, gh#300, shawnlaffan++) - Added Alien::Util module (gh#301) 2.47 2022-03-07 07:03:52 -0700 - Fixed bug where Probe::CBuilder plugin could report the wrong diagnostic when throwing an exception (gh#296, gh#297, shawnlaffan++) 2.46 2021-11-30 15:17:58 -0700 - Fix bug where the Build::Copy plugin could fail when spaces are in the target path (gh#290, gh#292 kiwiroy++) 2.45 2021-10-28 04:55:28 -0600 - On macOS / OS X the Build::Copy plugin now uses cp -pPR instead of cp -aR; on modern macOS this does the same thing, on very old versions of OS X the -a option is not recognized (gh#288) 2.44 2021-10-20 17:51:21 -0600 - Fix bug in Alien::Build::Log::Abbreviate (gh#287 kiwiroy++) 2.43_01 2021-09-30 10:10:07 -0600 - Fix test for Decode::DirListingFtpCopy which was incorrectly testing Decode::DirListing (gh#285, gh#286) 2.42 2021-09-29 09:54:26 -0600 - Improved documentation relating to the Alien::Base alt methods and the PkgConfig plugins use of pkg_name property (gh#234, gh#284) 2.41 2021-06-21 22:50:57 -0600 - Documentation fixes (gh#266, gh#267) - Use parent instead of base in code and documentation (gh#268) 2.40 2021-05-13 06:44:37 -0600 - Test::Alien tests will issue a diagnostic if you call them without alien_ok which is probably a mistake (gh#262, gh#263) 2.39_01 2021-05-12 04:14:06 -0600 - Add support for HTTP request headers on all appropriate core fetch plugins (gh#256, gh#259) - The fetch method on Alien::Build now has a http_headers option (gh#256, gh#259) - Fix bug where symlinks to directories were incorrectly being skipped (gh#255, gh#260) 2.38 2021-01-11 14:35:54 -0700 - Fixed a bug the can cause an array dereference error in pkg-config command line plugin on MSYS2 / MinGW environment (gh#243) - Changed the auto-generated module name for Test::Alien, in a way that works around a probable bug / issue with ExtUtils::CBuilder (gh#243) 2.37 2020-11-02 09:09:13 -0700 - Tests that rely on its behavior unset ALIEN_BUILD_PKG_CONFIG (gh#239) 2.36_01 2020-10-31 03:33:21 -0600 - Fixed a bug where Probe and PkgConfig plugins could provide compiler / linker flags when the PkgConfig probe fails, but another probe succeed. (gh#238) 2.35_01 2020-10-28 02:06:21 -0600 - Added install properties: system_probe_class and system_probe_instance_id (gh#237) - Added hook properties: probe_class and probe_instance_id (gh#237) 2.34_01 2020-10-27 04:23:24 -0600 - Added instance_id property to Alien::Build::Plugin class (gh#235) - Added plugin_instance_prop method to Alien::Build class (gh#235) 2.33 2020-09-21 03:21:40 -0600 - Skip problematic test on cygwin (gh#232) 2.32 2020-09-11 10:42:41 -0600 - Production release identical to 2.27_01 2.31_01 2020-09-09 06:26:25 -0600 - Diagnostic release 2.30_01 2020-09-08 14:48:12 -0600 - Documentation fixes (gh#223, #224, #225, shawnlaffan++) - Use shorter filename paths for test files to keep older versions of tar happy (gh#228, gh#229, gh#230) 2.29 2020-08-10 09:16:59 -0600 - Move to new GitHub org: https://github.com/PerlAlien - Fixed meta which was incorrectly requiring 5.8.1 instead of 5.8.4 2.28 2020-08-04 21:33:19 -0600 - Production release identical to 2.27_01 2.27_01 2020-08-03 13:47:02 -0600 - Some fixes for the unofficial `msys` fork of Perl (gh#211, gh#212) - Honour user supplied `config.site` for autoconf (gh#215, gh#218, hakonhagland++) - Hard drop of support for Perl 5.8.1, 5.8.2 and 5.8.3. AB will refuse to install on these elder Perls. Please upgrade to at least 5.8.4. (gh#200, gh#201, gh#219) 2.26 2020-06-16 07:11:13 -0600 - Diagnostic release 2.25 2020-06-10 09:18:25 -0600 - Fixed bug where alien library directory flags could be used in the wrong order by Test::Alien, mostly a problem on NetBSD and similar platforms (gh#203) 2.24_01 2020-06-07 18:13:55 -0600 - Disable parallel build when clean install is enabled (gh#197, gh#198, shawnlaffan++) - Dropping support for Perl 5.8.1, 5.8.2 and 5.8.3. For now AB will install on these versions of Perl, but a warning will be issued, along with a 3 minute sleep at configure time. Please upgrade to 5.8.4 (or preferrably 5.32). Starting July 1st, AB will refuse to install on these elderly Perls. (gh#200, gh#201) 2.23 2020-05-15 18:36:59 -0400 - Workaround apparent bug in pkgconf + arm64 (gh#196) 2.22 2020-05-05 07:02:49 -0600 - Added dynamic_dir method to Alien::Base (gh#191, shawnlaffan++) 2.21 2020-04-11 08:27:21 -0600 - Fix the handling of version regular expression for the Prefer::SortVersions plugin to handle regular expressions with multiple capture groups (gh#189) 2.20 2020-04-10 06:21:54 -0600 - xs_ok does a better workaround for faux fork on cygwin (gh#153, gh#187, gh#188) 2.19 2020-04-09 02:56:14 -0600 - Production release identical to 2.18_01 2.18_01 2020-04-03 10:06:45 -0600 - Add Build::Copy plugin (gh#186) 2.17 2020-03-19 21:03:39 -0600 - Production release identical to 2.16_01 2.16_01 2020-03-17 13:56:13 -0600 - Probe::Vcpkg adds include property (gh#184) - Build::Autoconf will now copy .dll files from bin to dynamic directory on MSWin32 (gh#183) 2.15 2020-03-16 06:53:31 -0600 - Tests on Windows will use the system temp directory rather than a temp directory under the install directory. A temp directory under the install directory was used to work around typically Linux systems that have noexec set on /tmp. Since this is less normal on Windows, and can cause mkpath errors if the install directory is too deep we will use the windows system temp directory. (gh#181, gh#182) 2.14 2020-03-15 12:49:17 -0600 - Added ffi_name property to Probe::Vcpkg plugin (gh#179) - Documentation fixes (gh#180) 2.12 2020-03-09 10:02:37 -0600 - Fixed bug where Probe::Vcpkg plugin doesn't set version probe hook property (gh#178) 2.11 2020-03-09 03:04:49 -0600 - Production release identical to 2.10 2.10_01 2020-03-08 17:13:05 -0600 - Probe::Vcpkg plugin defaults to name property (gh#177) 2.09_01 2020-03-08 09:58:17 -0600 - Added Alien::Build::Plugin::Probe::Vcpkg (gh#3, gh#175) 2.08 2020-02-15 17:16:30 -0700 - Production release identical to 2.07_01 2.07_01 2020-02-14 19:00:22 -0700 - Fix Alien::Build::Interpolate bug introduced in 2.06_01 (gh#171) 2.06_01 2020-02-14 12:23:02 -0700 - Several helpers for Alien::Build::Interpolate::Default no longer require Aliens if the tools are already found in the PATH (gh#168) - Better document dynamic vs. static libraries in AlienAuthor and FAQ documents (gh#110, gh#169) - Prefer nmake or gmake over dmake on Windows, even if Perl is configured to use dmake (gh#95, gh#170) 2.05_01 2020-02-11 15:19:01 -0700 - Fix bug where the autoconf plugin could use the wrong configure if there is another "configure" script somewhere in the PATH on Windows (gh#166, gh#167) 2.04 2020-02-05 19:05:32 -0700 - Production release identical to 2.03_01 2.03_01 2020-02-04 21:29:35 -0700 - Add use strict to generated ::Installl::Files modules (gh#162, gh#163) 2.02 2020-02-04 13:12:49 -0700 - Production release identical to 2.01_01 2.01_01 2020-02-03 10:51:43 -0700 - Prefer Decode::HTML if HTML::Parser is already installed and Mojolicious or Mojo::DOM58 are not (gh#160) 2.00 2020-02-02 06:25:13 -0700 - Production release identical to 1.99_01 1.99_01 2020-01-30 12:57:33 -0700 - Decode::Mojo plugin remembers which version of Mojo::DOM it is using (gh#159) 1.98 2020-01-30 07:53:10 -0700 - Production release identical to 1.97_01 1.97_01 2020-01-29 09:22:14 -0700 - Added OO interface to Alien::Base::Wrapper (gh#157, gh#158) - Added mm_args2 method to Alien::Base::Wrapper (gh#157, gh#158) - Added WriteMakefile function to Alien::Base::Wrapper (gh#157, gh#158) 1.96 2020-01-27 09:05:36 -0700 - Production release identical to 1.95_01 1.95_01 2020-01-25 19:57:31 -0700 - Reduced prereqs to Alien::Base::Wrapper down to Perl 5.6 (the rest of Alien-Build still requires 5.8) (gh#156) - Remove dep on Module::Load (gh#155) 1.94 2019-12-16 12:17:26 -0700 - Prefer tar.exe on Windows if it is bsdtar (gh#150) - Prefer tar.exe on Windows for unzip if it is bsdtar (gh#151, gh#152) 1.93 2019-12-09 02:22:44 -0700 - curl plugin not used unless required -J option is supported. (gh#147, gh#148) 1.92 2019-11-04 04:33:57 -0700 - Require Test2::API 1.302096 for features used in test suite. 1.91 2019-11-01 20:19:19 -0600 - Fix bug where Test::Alien::Diag could crash for Aliens without dynamic libraries. 1.90 2019-11-01 16:15:32 -0700 - Added Test::Alien::Diag (gh#142) - Test::Alien ffi_ok add api option. (gh#143) 1.89 2019-09-25 07:58:39 -0600 - Production release identical to 1.88_01 1.88_01 2019-09-24 11:53:18 -0600 - Add options cbuilder_check amd cbuilder_config to Test::Alien xs_ok function (gh#140, Test-Alien-CPP#3, Test-Alien-CPP#4) 1.87_01 2019-09-24 07:38:31 -0600 - Test::Alien directive with_subtest will attempt to catch SEGV and bail on on test file with a helpful diagnostic. The prove util frequently does not provide a useful diagnostic for SEGV on its own (gh#138, gh#139). 1.86 2019-09-13 06:27:21 -0600 - PAUSE permission fix 1.85 2019-08-30 14:19:16 -0400 - Production release identical to 1.84_01 1.84_01 2019-08-26 10:59:58 -0400 - Delay removal of temp files for Test::Alien till `make clean` instead of test termination on Windows (only) to avoid warning on test termination. (gh#130, gh#136) 1.83 2019-08-19 18:31:19 -0400 - Production release identical to 1.81_01 1.82_01 2019-08-18 19:47:10 -0400 - Stricter Perl::Critic policies (gh#135) 1.81_01 2019-08-16 19:16:33 -0400 - Fix log class inheritence bug. 1.80_01 2019-08-15 20:52:50 -0400 - Use Perl::Critic Freenode policies for development (gh#128) - Add new configurable log class (gh#123) 1.79 2019-07-15 14:26:16 -0400 - Fix CBuilder probe plugin on platforms where /tmp is mounted noexec (gh#133, gh#134) 1.78 2019-06-30 21:31:23 -0400 - Production release identical to 1.77_01 1.77_01 2019-06-28 12:08:12 -0400 - _alien/alien.json file is generated using ->canonical(1) for reproducibility (gh#132 Grinnz++ for the suggestion) - _alien/alien.json file is generated using ->ascii to avoid warnings / errors when unicode is included in install/runtime properties. (gh#132 Grinnz++ for the suggestion) 1.76 2019-06-23 11:01:08 -0400 - Production release identical to 1.75_01 1.75_01 2019-06-07 15:06:30 -0400 - Download::Negotiate defaults to Deocde::Mojo instead of Decode::HTML for share installs that require parsing an HTML index (gh#127, gh#115). 1.74 2019-05-22 08:43:10 -0400 - Check if share directory exists before clean_install (gh#114, gh#126 zmughal++ for the report) 1.73 2019-05-20 14:49:10 -0400 - Production release identical to 1.72_01 1.72_01 2019-05-11 04:12:13 -0600 - Merged Alien-Build-Plugin-Decode-Mojo into this dist (gh#18) - Put Alien -l flags first in xs_ok (gh#121 kiwiroy++) 1.71_01 2019-04-30 05:41:40 -0400 - Add clean_install hook (gh#111, gh#114) - EXPERIMENTAL Add mm_install method to Alien::Build::MM (gh#111, gh#114) - EXPERIMENTAL CAUTION Add alien_clean_install target to Makefile generated by Alien::Build::MM (gh#111, gh#114) 1.70_01 2019-04-29 18:57:53 -0400 - Add alien_clean target for Alien::Build::MM (gh#118, gh#119) 1.69 2019-04-27 10:59:10 -0400 - Add runtime property ffi_checklib (gh#117) Related to https://github.com/Perl5-FFI/FFI-CheckLib/issues/13 1.68 2019-04-23 04:57:49 -0400 - Add decoder property to Download::Negotiate plugin (gh#115, gh#116) 1.67 2019-04-22 07:55:59 -0400 - Production release identical to 1.66_01 1.66_01 2019-04-21 13:46:14 -0400 - Fix to Fetch::CurlCommand plugin. It's handling of URLs with trailing slash (/) wasn't quite right. (gh#112, gh#113) 1.65 2019-04-11 09:15:37 -0400 - Further improvements with ExtUtils::Depends compatability (gh#107, gh#109). - Improved documentation (gh#106). - Updated spec for ALIEN_INSTALL_TYPE. When set, Alien consumers that require an opt-in for using an Alien may use the fact that this environment variable is set as an opt-in (gh#104, gh#106). 1.64_01 2019-04-10 13:06:45 -0400 - Improved compatability with ExtUtils::Depends (gh#107, gh#108). 1.63 2019-04-08 17:19:03 -0400 - Documentation improvements - Fixed bug in Test::Alien::Build alienfile_skip_if_missing_prereqs where subtest / test was always skipped regardless of requirements. It now (correctly) only skips if there are missing requirements. 1.62 2019-03-27 11:34:00 -0400 - Production release identical to 1.61_01 1.61_01 2019-03-25 15:35:06 -0400 - Add hook property `version` for probe hook (gh#99, gh#100). - Improvements for Fetch CurlCommand plugin (gh#101). 1.60 2019-03-01 03:16:23 -0500 - Documentation improvemens. (gh#50, gh#84). 1.59_01 2019-02-27 21:40:24 -0500 - Fix test fail for download negotiation plugin introduced in 1.58_01 which was expressed on systems without curl installed. 1.58_01 2019-02-27 12:50:20 -0500 - Prefer Fetch::CurlCommand over Fetch::HTTPTiny for https when: * Net::SSLeay and IO::Socket::SSL are not installed * AND curl is installed * AND curl supports https This makes AB more reliable on platforms like OS X when openssl is broken without a third party package system like homebrew, and on older Perls like 5.8.x where Net::SSLeay frequently does not install or pass tests. The existing behavior of prefer Fetch::HTTPTiny when: * Net::SSLeay and IO::Socket::SSL are already installed * OR the URL is http * OR curl is not already installed is still in effect. (gh#93, gh#94) 1.57_01 2019-02-26 08:52:34 -0500 - Test unzip command before blindly using it (tests were already being made for tarballs) (gh#90) 1.56_01 2019-02-24 14:09:23 -0500 - Prefer Alien::unzip over Archive::Zip. The latter turns out to be broken on one platform or another for much of the time. (gh#74, gh#89). 1.55 2019-02-24 11:35:29 -0500 - Production release identical to 1.54_01 1.54_01 2019-02-21 15:49:28 -0500 - Add atleast_version, exact_version, max_version and version_cmp methods to Alien::Base (leonerd++ gh#75, gh#77) 1.53_01 2019-02-21 11:35:47 -0500 - Prefer PkgConfig::PP on MSWin32 where it is more reliable. (gh#82, gh#85) - Test tar command before blindly using it (tests were already being made for compressed tars "tar.gz", "tar.xz", etc) (gh#86, gh#87) - Tweaks to test suite to hopefully accommodate a haiku install (gh#81) - Add atleast_version, exact_version and max_version properties for pkg-config plugins (gh#78, gh#79) 1.52 2019-02-09 05:45:12 -0500 - Use $alien->libs -L flags to help find system dynamic libs. 1.51 2019-01-19 14:23:23 -0500 - cmake plugin sets CMAKE_INSTALL_LIBDIR:PATH to lib for share installs for cmake projects using GNUInstallDirs on platforms that default to something other than lib. 1.50 2019-01-16 12:55:08 -0500 - Removed temp testing files unintentionally included in the previous release. - Require ExtUtils::MakeMaker 6.64, for Alien::Build::MM, which can sometimes have its BUILD_REQUIRES or TEST_REQUIRES overridden by Dist::Zilla otherwise. 1.49 2018-11-04 15:22:40 -0500 - Added Alien::Build::Plugin::Test::Mock - Added alienfile_skip_if_missing_prereqs function to Test::Alien::Build - Remove run-time dependency on Test2::Suite Test2::API is still a run-time dependency, but that has been in-core since 5.26. 1.48 2018-07-04 20:33:29 -0400 - Production release identical to 1.47_01 1.47_01 2018-07-03 23:17:09 -0400 - Fixed bug where Alien::Base was capturing stderr and stdout from pkg-config, instead of just stdout which is what it should be doing. - Additional diagnostics for xz fail 1.46 2018-06-25 03:08:25 +0000 - Production release identical to 1.45_01 1.45_01 2018-06-24 08:13:08 -0400 - Add alt method to Alien::Base. This merges the capabilities from Alien::Role::Alt into core, making that role now obsolete. - Add alt_names and alt_exists methods to Alien::Base. This was a capability missing from Alien::Role::Alt - Fix bug in Alien::Build::MM where 'make alien_prop_runtime' printed install instead of runtime properties 1.44_01 2018-06-20 06:36:57 -0600 - Added Alien::Build::Plugin::Prefer::GoodVersion 1.43 2018-06-03 06:41:28 -0400 - Documentation fixes - Use a custom site.config to ensure libraries are installed in lib and not lib64 or lib/64 for share installs 1.42 2018-05-09 08:19:18 -0400 - Corrected typo for install_prop->{old}->{prefix} (had been preifx) 1.41 2018-04-24 06:19:18 -0400 - before and after directives in alienfile triggers requirement on Alien::Build 1.40 1.40_01 2018-04-12 09:21:05 -0400 - Add before and after directives to alienfile syntax 1.39 2018-03-09 05:51:47 -0500 - Production release identical to 1.38_01 1.38_01 2018-03-01 03:27:29 -0500 - Additional testing diagnostics 1.37 2018-02-23 10:13:44 -0500 - Fixed cmake test which would fail without a C++ compiler (gh#53 ppisar++) 1.36 2018-02-05 10:51:59 -0500 - Production release identical to 1.35_01 1.35_01 2017-12-28 12:42:56 -0500 - Improve diagnostic in command line extraction test 1.34_01 2017-12-27 10:30:10 -0500 - Add env_interpolate meta property. - PkgConfig plugins now attempt to set PKG_CONFIG environment variable during build 1.33_01 2017-11-08 11:54:19 -0500 - Improve diagnostic for partially installed Alien error 1.32 2017-11-03 13:15:35 -0400 - Add ALIEN_INSTALL_NETWORK environment variable. Set to false if you don't want to allow network fetch. 1.31_01 2017-10-31 16:50:52 -0400 - Fix testing prereq bug introduced in 1.30_01. 1.30_01 2017-10-31 14:24:15 -0400 - Add prefer property to Download::Negotiate plugin 1.29_01 2017-10-30 09:54:22 -0400 - Fix bug in Alien::Base::Wrapper where -l flags were being ignored by EUMM - MSYS plugin works with ffi build - Windows specific fixes for Alien::Base::Wrapper - Removed optional dependency on Test::Exec 1.28 2017-10-29 19:39:19 -0400 - Production release identical to 1.27_01 1.27_01 2017-10-27 10:26:18 -0400 - Fix incompatibility with older versions of ExtUtils::MakeMaker where test directive in alienfile was ignored. 1.26_01 2017-10-25 12:28:58 -0400 - Fix Test::Alien bug where -L could be placed after directories specified in %Config (this was already handled correctly by Alien::Base::Wrapper). - Remove cpp and C++ options for xs_ok (I don't believe these were used in practice and were issuing deprecation warnings for a while). - A number of documentation errors have been fixed (jjatria++ leto++) 1.25 2017-10-09 08:57:34 -0400 - Production release identical to 1.24_01 1.24_01 2017-10-08 10:40:11 -0400 - Build process now considers share/pkgconfig in addition to lib/pkgconfig for all things pkg-config related (gh#39, gh#40 a3f++) 1.23_01 2017-10-07 20:58:52 -0400 - Improve SSL diagnostics for Download::Negotiate and Fetch::HTTPTiny plugins. 1.22 2017-10-05 11:43:25 -0400 - Improved bootstrap_ssl to allow use of Net::SSLeay, if it is already installed. - Windows path fix in test suite 1.21 2017-10-02 15:36:33 -0400 - Fix bug in Test::Alien where extra_compiler_flags or extra_linker_flags could override (instead of augment) the alien cflags or libs. This is most commonly a problem when using Test::Alien::CPP. 1.20 2017-10-01 06:52:36 -0400 - Remove dependency on Alien::Base::ModuleBuild - Add access to environment via %{env.VARNAME} - Move Alien::Base::PkgConfig from ABMB 1.19_01 2017-09-28 13:06:28 -0400 - Add Alien::Build::Version::Basic - Add Alien::Build::Plugin::Fetch::CurlCommand - Add Alien::Build::Plugin::Fetch::Wget - Workaround for old tar on Solaris - Fix test for Solaris 64 bit - Add start_url directive to alienfile - Add bootstrap_ssl property to Alien::Build::Plugin::Download::Negotiate 1.18 2017-09-22 06:40:51 -0400 - Fixed bug where Probe::CBuilder plugin might not play nice with other probes. 1.17_01 2017-09-20 14:36:41 -0400 - Add apply_plugin to Alien::Build::Meta - Deprecated Alien::Build::Plugin subplugin method (use apply_plugin instead) 1.16 2017-09-17 16:30:02 -0400 - Removed unused internal module Alien::Build::Util::Win32::RegistryDump 1.15_01 2017-09-15 03:24:43 -0400 - Fix for race condition introduced in 1.14_01 1.14_01 2017-09-14 16:35:29 -0400 - Add alien_subtest, alien_checkpoint_ok and alien_resume_ok to Test::Alien::Build - add test directive to alienfile - add test method to Alien::Build - add alien_test target to Alien::Build::MM 1.12 2017-09-11 10:11:14 -0400 - Production release identical to 1.11_01 1.11_01 2017-09-08 18:19:46 -0400 - Require Readonly 1.60 for tests that use it (it is an optional dependency) to avoid test failure on Perl 5.8.x - Fix infrequent test failure on t/alien_base__system_installed.t triggered by random system configuration. 1.10 2017-09-07 20:57:25 -0400 - Production release identical to 1.09_01 1.09_01 2017-09-07 07:34:40 -0400 - Fix test regression introduced in 1.08_01 1.08_01 2017-09-05 22:26:36 -0400 - Add support for out-of-source builds - The Build::CMake plugin now supports out-of-source builds - The Build::Autoconf plugin now supports out-of-source builds - Add extract install property - Add out_of_source meta property - Starting with this release, Alien::Base::ModuleBuild is no longer a prereq on _development_ releases. It will remain a prereq on production releases until at least October 1st. This is to help flush out any issues on cpantesters for this upcoming transition. 1.07_01 2017-09-05 09:21:13 -0400 - Fix windows test bug introduced in 1.06_01 - Add alien_rc to Test::Alien::Build 1.06_01 2017-09-04 12:07:38 -0400 - Add Alien::Build::Plugin::Prefer::BadVersion - Support for cd in a command sequence - Added support for ALIEN_INSTALL_TYPE=default - Added override hook (see Alien::Build::Manual::PluginAuthor) 1.05 2017-08-28 20:08:29 -0400 - add %{make_path} helper to Alien::Build::Interpolate::Default. - Fixed bug with read-only $_ triggered by Dist::Zilla::Plugin::AlienBuild (zmughal++) 1.04 2017-08-25 06:41:44 -0400 - add %{mkdir_deep} helper to Alien::Build::Interpolate::Default. 1.03_02 2017-08-24 13:16:04 -0400 - add ffi_name runtime property 1.02 2017-08-24 06:56:46 -0400 - Fix !export tag for Alien::Base::Wrapper - Alien::Build::MM: Include meta about share and system requirements in x_alienfile 1.01 2017-08-22 07:28:54 -0400 - Fix bug in Extract::Negotiate plugin - Fixes for running with perl installed in path with spaces. 1.00 2017-08-21 16:09:37 -0400 - Documentation improvements - Fixes for running from directories with spaces. 0.99 2017-08-17 12:53:55 -0400 - Fix bug in Test::Alien xs_ok would crash with multiple alines with xs_load methods. 0.98_01 2017-08-16 17:50:17 -0400 - Added Alien::Build::Plugin::Build::CMake (which was briefly in its own distribution). 0.97 2017-08-16 17:36:36 -0400 - Production release identical to 0.96_01 0.96_01 2017-08-16 11:30:50 -0400 - Added Alien::Build::Plugin::Build::Make (which was briefly in its own distribution). - Removing accidental dependency on Archive::Tar (it should be optional, though it is available as part of the Perl core on 5.10+) - Fixed bug where Test::Alien xs_ok could throw an exception instead of failing gracefully. - Test::Alien alien_ok does not crash when undef is passed to it - C++ support in Test::Alien xs_ok is deprecated and will be removed on or after 31 August 2017. This feature was experimental. This capability will be developed in the separate distribution Test-Alien-CPP - remove Test::Alien::CanCompileCpp. This module will come bundled with Test-Alien-CPP instead. 0.95 2017-08-11 09:47:57 -0400 - Improve extractor logic for zip files 0.94_01 2017-08-10 13:27:59 -0400 - Diagnostic release 0.93_01 2017-08-09 08:05:13 -0400 - Development release otherwise identical to 0.92 0.92 2017-08-09 08:03:00 -0400 - Extract::ArchiveTar plugin now probes for bz2 support rather than trusting Archive::Tar which can sometimes report incorrectly that it supports bz2. 0.91 2017-08-08 05:24:27 -0400 - Production release identical to 0.90_01 0.90_01 2017-08-07 15:30:27 -0400 - Add alien_download_ok to Test::Alien::Build - Add alien_extract_ok to Test::Alien::Build - Extract now ignores pax_global_header, produced by extracting some tarballs using older tars (including older versions of Archive::Tar). - Fix detection logic for supported compression by tar in Extract::CommandLine 0.89_01 2017-08-07 08:57:48 -0400 - Extract negotiator plugin checks for .gz and .bz2 support in Archive::Tar before using ArchiveTar plugin, and will fallback on Extract::CommandLine if it is not available. - Extract::ArchiveTar skips appropriate tests if compression support is not available 0.88_01 2017-08-07 04:50:06 -0400 - Diagnostic release 0.87_01 2017-08-05 11:59:43 -0400 - Diagnostic release 0.86_01 2017-08-05 11:51:23 -0400 - Add alien_build_clean to Test::Alien::Build - Additional MSYS2 fixes 0.85_01 2017-08-04 15:17:52 -0400 - Diagnostic release 0.84_01 2017-08-04 15:15:48 -0400 - Fix testing failure on msys2/mingw32/64 which has a pkg-config that defaults to rewriting prefix. - Fix skip in test which could cause failure in PkgConfig::PP test - Add msys_version property to Build::Autoconf and Build::MSYS plugins - Add platform.system_type meta property 0.83_01 2017-08-03 19:24:30 -0400 - Development release otherwise identical to 0.82 0.82 2017-08-03 16:51:26 -0400 - Require ExtUtils::ParseXS 3.30 (gh#28) - Revert regression where PkgConfig.pm would not loaded before use 0.81_01 2017-08-01 15:03:22 -0400 - Development release otherwise identical to 0.80 0.80 2017-08-01 14:49:14 -0400 - Prefer non-legacy version - Fix PkgConfig::CommandLine bug introduced in 0.79_01 - Added Alien::Role documentation 0.79_01 2017-08-01 12:22:15 -0400 - Added alien_install_type_is to Test::Alien::Build - PkgConfig::CommandLine plugin supports multiple pkg_names - PkgConfig::PP plugin supports multiple pkg_names - PkgConfig::LibPkgConf is a candidate for removing from core - PkgConfig::LibPkgConf plugin supports multiple pkg_names - PkgConfig::Negotiate plugin supports multiple pkg_names 0.78_01 2017-07-30 12:55:31 -0400 - Development release otherwise identical to 0.77 0.77 2017-07-30 12:54:13 -0400 - Add options to Probe::CommandLine plugin: match_stderr, version_stderr 0.76_01 2017-07-26 11:31:44 -0400 - Development release otherwise identical to 0.75 0.75 2017-07-26 11:30:11 -0400 - Disable C++ Test::Alien test on production releases C++ in Test::Alien is considered experimental and the test has been intermitently causing a hard fail. Until the issue is resolved the test will only run on development releases 0.74 2017-07-25 06:52:43 -0400 - Add alien_build_ok to Test::Alien::Build - Enable Alien::Base::Dino compatibility in Test::Alien 0.73 2017-07-24 07:19:49 -0400 - Fetch::FTP plugin will not attempt FTP transfer with non-FTP URLs - Otherwise production release mostly identical with 0.72_01 release 0.72_01 2017-07-22 07:36:35 -0400 - Marking C++ support in Test::Alien as EXPERIMENTAL (it seems to be unreliable on MSWin32, possibly others) - Fixed Extract::CommandLine probe of tar command to see if it can handle tar.gz, tar.bz2, tar.xz (feature introduced in 0.69_01). - Extract::CommandLine fallback on ptar if bsdtar or tar are not available. - Add Fetch::LocalDir plugin - Add tmp flag for local files to avoid copies 0.71_01 2017-07-21 15:07:32 -0400 - Improve Alien::Autotools support by updating ACLOCAL_PATH when you requires 'Alien::Autotools'; - Add cbuilder_compile option to Test::Alien xs_ok function - Add cbuilder_link option to Test::Alien xs_ok function - Add cpp option to Test::Alien xs_ok function - Add C++ option to Test::Alien xs_ok function 0.70_01 2017-07-21 07:23:04 -0400 - (Alien::Build::MM) Fix race condition with parallel make (GH#24) 0.69_01 2017-07-20 12:17:12 -0400 - Allow Alien::Build or Alien::Base as requires in alienfile. - Fix warnings that sometimes come from Build::SearchDep plugin - Extract::CommandLine tests to see if tar can handle tar.gz, tar.bz2, tar.xz to avoid needing Alien::gzip, Alien::bzip2 or Alien::xz 0.68_01 2017-07-19 08:54:58 -0400 - ALIEN_BUILD_PKG_CONFIG can be used to override the PkgConfig::Negotiate logic. - Extra diagnostics for PkgConfig::PP failure in gather stage 0.67_01 2017-07-18 13:52:56 -0400 - Merged Alien-Base and Alien-Build. For the old Alien-Base change log see Changes.Alien-Base 0.66 2017-07-17 02:46:11 -0400 - Fix cmake helper. 0.65_01 2017-07-16 12:29:36 -0400 - Fixed bug in Core::Download plugin which would fail if download was a directory tree instead of a tarball 0.64_01 2017-07-15 15:41:49 -0400 - Merged Alien-Base-Wrapper and Alien-Build. For the old Alien-Base-Wrapper change log see Changes.Alien-Base-Wrapper 0.63 2017-07-15 14:38:40 -0400 - Extract::CommandLine plugin to use Alien::Gzip, Alien::Libbz2 and Alien::xz when gzip, bzip2 or xz is not provided by operating system 0.62 2017-07-13 21:27:31 +0000 - Add support for rc file ~/.alienfile/rc.pl - Add start_url meta property - Fetch plugins use start_url property by default - Turn off Test2::Plugin::SRand, which seemed to be triggering an error in File::Temp see fd3208bfe8613aae63e4439aa1f4c78d01be086e 0.61 2017-07-13 11:10:46 +0000 - Add passive property to Download::Negotiate plugin - Add passive property to Fetch::NetFTP plugin - Add log directive to alienfile 0.60 2017-07-12 22:26:22 -0400 - Fix broken test t/01_use.t 0.59 2017-07-12 21:10:14 -0400 - ACTUALLY removed Alien::Build::Plugin::Probe::GnuWin32, which I promised to remove two releases ago :/ 0.58 2017-07-12 20:19:13 -0400 - If PkgConfig.pm is needed, version 0.14026 will be required (PkgConfig.pm is a dynamic prereq on environments that do not have pkg-config or pkgconf). 0.57 2017-07-12 16:45:54 -0400 - Add alienfile_ok to Test::Alien::Build - Fixed bug with preload and postload environment variables - Removed Alien::Build::Plugin::Fetch::PromptBeforeDownload which is now a separate distribution - Removed Alien::Build::Plugin::Probe::GnuWin32 which is now a separate distribution 0.56_01 2017-07-11 16:39:38 -0400 - Merged Test-Alien and Alien-Build. For the old Test-Alien change log see Changes.Test-Alien - Import helpers from Aliens that are required using requires. (this was always the intent, but for some reason was not implemented until now). - Add helper_ok test to Test::Alien - Add interpolate_template_is test to Test::Alien - Add Test::Alien::Build - Add has_helper method to Alien::Build::Interpolate 0.55 2017-07-09 12:25:06 -0400 - Use lib/pkgconfig and share/aclocal from any Alien::Base requires. Previously only Alien::Base modules build with alienfile + Alien::Build were used. 0.54 2017-07-07 01:28:54 -0400 - Alien::Build::MM add alien_prop target 0.53 2017-07-06 13:04:34 -0400 - Build::SearchDep sets CXXFLAGS (in addition to CFLAGS) for C++ projects - Probe::CBuilder adds aliens property - Probe::CBuilder adds lang property - Build::SearchDep adds public_I property - Build::SearchDep adds public_l property 0.52 2017-06-28 17:26:24 -0400 - Enhanced Fetch::NetFTP plugin to try passive mode if active fails. 0.51 2017-06-27 15:04:19 -0400 - Fixup ACLOCAL_PATH on Windows 0.50 2017-06-27 12:50:12 -0400 - Update ACLOCAL_PATH for any required Alien that has a share/aclocal directory. 0.49 2017-06-26 17:18:25 -0400 - Fix: set runtime_prop version instead of runtime_prop based on archive version number 0.48 2017-06-26 16:09:29 -0400 - Gather::IsolateDynamic skip directories that do not exist 0.47 2017-06-24 17:21:57 -0400 - Fixed windows + autoconf regression 0.46 2017-06-22 13:02:52 -0400 - Added Alien::Build::Plugin::Fetch::PromptBeforeDownload - Fixed typo in Alien::Build::Plugin::GnuWin32 0.45 2017-06-16 13:36:36 -0400 - Documentation improvements 0.44 2017-06-12 10:52:08 -0400 - Decode::HTML plugin unescapes URI encoded filenames, as it should (kiwiroy++ gh#17) 0.43 2017-06-11 21:23:55 -0400 - Fix documentaton coverage for Alien::*::Install::Files - Additional fixes for Alien::*::Install::Files support 0.42 2017-06-11 09:09:55 -0400 - Added Gather::IsolateDynamic plugin - This version includes The Answer to Life, the Universe and Everything. 0.41 2017-06-10 19:03:49 -0400 - Added (undocumented so far) ffi option to Build::Autoconf plugin 0.40 2017-06-10 13:15:33 -0400 - Added ffi block for alienfile. - Deprecate patch_ffi, build_ffi and gather_ffi directives. 0.39 2017-06-10 06:40:45 -0400 - Added patch_ffi keyword for alienfile missing in previous release 0.38 2017-06-10 06:28:21 -0400 - Added build_ffi and gather_ffi stages 0.37 2017-06-09 17:04:21 -0400 - Generate ::Install::Files module for use with Inline, if cflags or libs are detected. 0.36 2017-04-13 04:05:45 -0400 - Add runtime property: alien_build_version 0.35 2017-03-30 18:02:45 -0400 - Add Build::SearchDep plugin - Add PkgConfig::MakeStatic plugin 0.34 2017-03-30 11:19:48 -0400 - Add install property: old.prefix - Add install property: old.runtime 0.33 2017-03-29 20:38:56 -0400 - Add runtime property: perl_module_version - Fix important typos 0.32 2017-03-28 14:14:52 -0400 - Add documentation Alien::Build::Manual::AlienUser - Fixup compiler and linker flags when not doing a double staged install 0.31 2017-03-24 15:27:19 -0400 - Better negotiation between pkg-config and cbuilder plugins (again) 0.30 2017-03-24 14:04:27 -0400 - Better negotiation between pkg-config and cbuilder plugins 0.29 2017-03-24 12:57:13 -0400 - Improved diagnostics - Fixed libpkgconf cache'ing bug 0.28 2017-03-21 17:10:43 -0400 - Removed Alien::Build::Wrapper. The same interface now exists as Alien::Base::Wrapper in a separate dist. 0.27 2017-03-16 21:00:02 -0400 - %{cwd} helper uses / on windows instead of \ 0.26 2017-03-16 15:03:53 -0400 - Fixed bug where LWP FTP download could require either DirListing or HTML for decode. - Add %{cwd} helper 0.25 2017-03-10 15:05:03 -0500 - You may now abreviate %{alien.foo.bar} as %{.foo.bar} 0.24 2017-03-10 02:23:40 -0500 - Added Alien::Build::Wrapper 0.23 2017-03-09 22:02:41 -0500 - Can store values using \'%{alien.install.foo}' notation with scalar command sequence - Filled out the AlienAuthor manual 0.22 2017-03-09 14:18:39 -0500 - Add subplugin method to Alien::Build::Plugin - Filled out the FAQ 0.21 2017-03-06 00:09:33 -0500 - Net::FTP plugin doesn't require trailing / in URL 0.20 2017-03-04 18:52:11 -0500 - Remove experimental Alien::Base2. Use Alien::Base 0.036 or better instead! 0.19 2017-03-01 08:53:14 +1100 - Fix some platform and environment specific bugs in the test suite 0.18 2017-02-21 18:12:28 +1100 - download hook gets called, even if you are using the fetch, decode, prefer hooks. 0.17 2017-02-16 08:28:19 +1100 - Can now store the output of a command into a property using a scalar reference, like this: [ 'command', '--flags', \'%{alien.runtime.foo}' ] 0.16 2017-02-15 20:07:05 +1100 - Add prefix to %{configure} helper for Build::Autoconf plugin - Add hook_prop to Alien::Build - Add system method to Alien::Build 0.15 2017-02-09 14:08:46 -0500 - Fixed bug where requires sometimes did not return a hash reference 0.14 2017-02-09 02:07:09 -0500 - Add meta directive to alienfile. - Use .pc files from dependant Aliens that used Alien::Build - Work around for elder Perls 5.8.7 and earlier 0.12 2017-02-08 15:39:56 -0500 - Added Probe::GnuWin32 plugin 0.11 2017-02-08 07:56:08 -0500 - Fixed regression in architecture logic for Alien::Build::MM - Fix bug where compile error wouldn't throw exception from Alien::Build->load 0.10 2017-02-06 05:24:25 -0500 - Add heuristic to determine version from filename using Prefer::SortVersions plugin - Add log method to Alien::Build - Fixed bug in probe where first 'share' would be accepted (gh#7) 0.09 2017-02-04 17:31:00 -0500 - Using an undefined property in command interpolation is now an error. - Added patch support. - Add meta property platform.compiler_type to flag Microsoft Visual C++ ("microsoft") compared with everything else ("unix") 0.08 2017-02-04 11:33:01 -0500 - Fixed prereq bug introduced in 0.07 0.07 2017-02-04 11:21:13 -0500 - The namespace Alien::Build::Plugin::Core is reserved for plugins that are automatically loaded for all instances of Alien::Build - Major refactor of Alien::Base2. Please do not use it. - Improved documentation - Added Alien::Build::Plugin::Fetch::Local - Added support for ALIEN_BUILD_POSTLOAD - Fixed bug where PkgConfig negotiator plugin could cause prereqs to get added inappropriately - Make PkgConfig.pm a prereq on platforms that do not provide pkg-config or pkgconf. 0.06 2017-02-02 22:00:38 -0500 - Added support for ALIEN_BUILD_PRELOAD - Legacy Alien::Base compatibility bug fixes - json files now use pretty formatting which is much easier to read 0.05 2017-02-02 12:06:36 -0500 - Fixed bug in Alien::Base2 runtime - Added meta property "arch" - install state file is now called "state.json" to differentiate from runtime file "alien.json" 0.04 2017-02-01 17:19:10 -0500 - Improved documentation 0.03 2017-02-01 11:56:07 -0500 - Fixed interpolator bug expressed in older versions of Perl - Add patch hook to Alien::Build - Add patch directive to alienfile - Fixes for Microsoft Windows / Strawberry Perl - Removed dangerous autosave option from Alien::Build - Fixed error when trying to load modules without a $VERSION - test suite now runs correctly if ALIEN_INSTALL_TYPE is set - The Fetch::HTTPTiny and Fetch::LWP plugins now add the necessary SSL modules if the URL is of the https scheme. 0.02 2017-01-31 13:22:29 -0500 - Extensive documentation improvements (documentation is still fairly incomplete). - Removed alienfile#prop - Added alienfile#meta_prop - Fixed a bug in Download::Negotiate and Prefer::SortVersions that expressed itself in Perl 5.14, 5.16 (and probably older Perls). - make distclean is less noisy now with Alien::Build::MM 0.01 2017-01-30 22:26:05 -0500 - initial version Alien-Build-2.84/Changes.Alien-Base000644 000000 000000 00000042524 14710030646 016714 0ustar00rootroot000000 000000 Revision history for Perl module Alien-Base. After 0.043_01 Alien-Base was merged with Alien-Build 0.043_01 2017-07-17 03:25:31 -0400 - Migrate to Test2::V0 - Documentation improvements (gh#187 jj++) 0.042 2017-05-23 14:40:02 -0400 - Add diagnostics for when temp directory is not writable This manifests itself on Windows sometimes - Configure step will fail if temp directory is not writable 0.041 2017-04-02 18:00:52 -0400 - Fix some minor metadata - Require Alien-Base-ModuleBuild 0.040 to ensure the separated version. 0.040 2017-03-29 01:30:46 -0400 - Spin off Alien::Base::ModuleBuild into the separate distribution Alien-Base-ModuleBuild - Alien::Base::ModuleBuild is a prerequisite, but will be removed on October 1, 2017, so you need to update your Build.PL so that Alien::Base::ModuleBuild is a configure requires. 0.038 2017-03-06 00:16:18 -0500 - Production release identical to 0.035_01 release 0.037_02 2017-03-05 03:20:00 -0500 - Additional fixes for t/yy-system_installed.t 0.037_01 2017-03-03 05:29:54 +1100 - cflags and cflags_static were flipped in 0.035_01 is now fixed (should fix gh#183) 0.036 2017-02-27 03:28:36 -0500 - Production release identical to 0.035_01 release 0.035_01 2017-02-15 04:41:31 -0500 - Add support for Alien::Build (plicease #181) 0.034 2017-02-15 04:30:35 -0500 - Fixed regression introduced in 0.032 which broke repos as array reference 0.032 2017-02-09 13:36:07 -0500 - Automatically add SSL modules as prereqs if we can tell with certainity that we will need to use HTTP::Tiny with SSL (plicease gh#178) - Add environment override of repository settings (gh#180 nshp++) 0.031 2017-01-28 08:11:06 -0500 - Production release identical to 0.030_02 release 0.030_02 2017-01-25 06:25:26 -0500 - Added a version method to Alien::Base. - Improved diagnostic when no files can be found on an attempted share install - A number of documentation improvements, as well as several new FAQs - Tests were failing on OpenBSD to do idiosyncratic pkg-config on that platform. There is now a work around in the test for these idiosyncrasies. 0.030_01 Wed Nov 23, 2016 - Fix test suite to handle it when . is not in @INC 0.030 Mon Oct 31, 2016 - Production release identical to 0.029_01 release 0.029_01 Fri Oct 21, 2016 - Fixed example in documentation for ExtUtil::MakeMaker - Fixed bug in test suite with where multiple users installing AB could cause failures - Added interface for overriding config.site variables see alien_extra_site_config 0.029 Thu Jun 16, 2016 - Production release identical to 0.028_01 release - This is the "Happy Captain Picard Day" Release. 0.028_01 Tue Jun 14, 2016 - Fixed bug where a colon (:) and equal sign (=) can confuse pkg-config parser (dakkar++ gh#165) 0.028 Mon Mar 14, 2016 - Production release identical to 0.027_03 release 0.027_03 Wed Mar 9, 2016 - Updated documentation to recommend the use of Alien::Base::ModuleBuild as a configure_requires. PLEASE UPDATE YOUR Build.PL FILES! - Fixed bug where missing trailing slash when used with exact_filename would cause a failure (plicease gh#161, gh162) - Documentation fix in FAQ (plicease gh#159,gh#160) - Added compatability for Alien::Builder (plicease gh#158, see also gh#157) 0.027_02 Sat Feb 27, 2016 - Fix bug where default ffi_name was incorrectly computed 0.027_01 Fri Feb 19, 2016 - Deprecate %p - Require Alien::CMake 0.07 as a minimum when used as alien_bin_requires for Alien::Base compatability 0.027 Thu Feb 4, 2016 - Production release identical to 0.026_02 release 0.026_02 Mon Feb 1, 2016 - Fix test bug introduced in 0.026_01 where t/builder.t would fail on Windows if Alien::MSYS was not installed. 0.026_01 Mon Feb 1, 2016 - Added alien_env property to Alien::Base::ModuleBuild - require HTTP::Tiny 0.044 for correct calculation of relative URLs on may websites. 0.026 Fri Jan 22, 2016 - For http, use base URL from index request when downloading files (plicease gh#150, gh#151) 0.025 Wed Jan 20, 2016 - Production release identical to 0.024_02 release 0.024_02 Mon Jan 18, 2016 - Silenced warnings that can happen when multiple .pc files are included with a package (salva++ gh#148) - Fixed bug where verbose diagnostic could cause false positives and false negatives for system libraries (salva++ gh#147, plicease gh#149) 0.024_01 Tue Jan 12, 2016 - Use URI internally for improved support for GitHub as a source (among others) (salva++ gh#144) 0.024 Thu Jan 7, 2015 - Production release identical to 0.023_01 release 0.023_01 Sat Jan 2, 2015 - Fixed a usually harmless but frequently annoying isssue where the alien_install_commands were executed on every invocation of './Build', './Build test', and './Build install' instead of just once as is needed. (plicease gh#141) - Archive extraction can now be overridden with the alien_extract_archive method in Alien::Base::ModuleBuild. (salva++ gh#142) - Fixed bug with windows where using \ instead of / broke relocatable installs. (plicease gh#139) - Promoted _env_do_system a public method named alien_do_system (salva++ gh#143) 0.023 Mon Sep 14, 2015 - Fixed typo in FAQ - Updated FAQ Alien::gmake example to require Alien::gmake 0.11 - Otherwise a production release identical to the 0.22_01 release 0.022_01 Fri Jul 31, 2015 - Add support for ALIEN_INSTALL_TYPE environment variable 0.022 Mon Jul 20, 2015 - Correction for the section "How do I specify a minumum or exact version requirement for packages that use pkg-config?" in the FAQ. 0.021_01 Wed Jul 15, 2015 - Added a default %{pkg_config} helper - Fixed bug introduced in 0.016_01 where using --destdir or $ENV{DESTDIR} would break the "./Build install" command. 0.021 Wed Jul 15, 2015 - Fixed bug where upgrading to 0.020 could break Alien modules installed before the upgrade. You do not need to re-install your Alien modules, just upgrade to Alien::Base 0.021. 0.020 Mon Jul 13, 2015 - Production release identical to 0.019_02 release 0.019_02 Wed Jul 8, 2015 - Fixed bug where alien_provides_* options were not being honored when the system provided the library (plicease gh#131) 0.019_01 Mon Jul 6, 2015 - Improved documentation: added a FAQ at Alien::Base::FAQ - Added helpers for source code builds see Alien::Base#alien_helper and Alien::Base::ModuleBuild::API#alien_helper for details 0.019 Fri Jun 5, 2015 - Production release identical to 0.018_02 release 0.018_02 Wed Jun 3, 2015 - Fix test suite for Cygwin 0.018_01 Tue May 26, 2015 - Added alien_arch option for non-homogeneous environments with shared @INC (for example AFS) (plicease gh#119) 0.018 Tue May 26, 2015 - alien_stage_install is now on by default (first production release for this to be the case) 0.017 Fri Apr 24, 2015 - Identical to 0.016_02 release, except alien_stage_install is OFF by default (it was turned on for dev release 0.016_01, and will be turned back on or after May 25). 0.016_02 Fri Apr 24, 2015 - Fix bug where ConfigData.pm was not updated after install to blib (plicease gh#121) 0.016_01 Tue Apr 22, 2015 - alien_stage_install is now on by default 0.016 Tue Apr 22, 2015 - Production release identical to 0.015_03 release 0.015_03 Mon Apr 20, 2015 - Fixed bug related to absolute URL (polettix++ gh#116) 0.015_02 Fri Apr 17, 2015 - On OS X use install_name_tool to more reliably relocate dynamic libraries on that platform (plicease gh#115) 0.015_01 Fri Apr 17, 2015 - Add alien_stage_install option for Alien::Base::ModuleBuild see Alien::Base::ModuleBuild::API for details (plicease gh#114) - alien_stage_install is default for PPM builds 0.015 Tue Mar 17, 2015 - Production release identical to 0.014_01 release 0.014_01 Fri Mar 13, 2015 - Generate config.site for autoconfigure source installs (plicease gh#113) 0.014 Feb 25, 2015 - Production release identical to 0.012_01 release 0.012_01 Feb 24, 2015 - Prefer and require PkgConfig.pm over pkg-config on 64 solaris If pkg-config is used it will likely be giving flags for 32 bit libs (plicease gh#110) - Allow for relocation of Alien-Base based dists. (plicease gh#111) 0.012 Feb 22, 2015 - Fix bug introduced in 0.011 where bin_dir dies when install_type=system 0.011 Feb 22, 2015 - Production release identical to 0.010_01 release 0.010_01 Feb 21, 2015 - When installed from source (install_type=share) if the share directory is missing it is now a fatal exception. (plicease gh#108) 0.010 Feb 17, 2015 - Production release identical to 0.009_04 release 0.009_04 Feb 16, 2015 - Test fix for Microsoft Visual C++ 0.009_03 Feb 15, 2015 - Improved FFI support 0.009_02 Feb 4, 2015 - Added diagnostics for Alien authors to help in diagnosing common configuration problems. 0.009_01 Jan 27, 2015 - Added './Build alien_fakebuild' command which shows you what would be executed without actually doing it (plicease gh#102) 0.009 Jan 27, 2015 - Production release identical to 0.008_01 release 0.008_01 Jan 26, 2015 - Allow multiple argument system calls for alien_build_commands and alien_install_commands (plicease gh#103) 0.008 Jan 16, 2015 - Production release identical to 0.007_01 release 0.007_01 Jan 12, 2015 - Add support for https repositories (zmughal++ gh#98) 0.007 Jan 8, 2015 - Production release identical to 0.006_03 release 0.006_03 Jan 8, 2015 - (optional) inline tests now require Acme::Alien::DontPanic 0.010 older versions do not do a link test, and we want that type of failure reported there, not here 0.006_02 Jan 7, 2015 - alien_bin_requires only become build_requires if Alien::Base::ModuleBuild determines a source build is necessary (plicease gh#96) - On MSWin32, Alien::MSYS is only injected a prereq if Alien::Base::ModuleBuild determines a source build is necessary and autoconf is detected (plicease gh#96) 0.006_01 Nov 14, 2014 - Add support for Alien::Base dynamic_libs method for system installs (previously only share install was supported) This adds FFI::CheckLib as a prereq. 0.006 Oct 14, 2014 - Production release identical to 0.005_07 release 0.005_07 Oct 13, 2014 - commands are printed as they are executed for easier debugging (plicease gh#91) - c_compiler_required repository option (default on) 0.005_06 Sep 30, 2014 - ExtUtils::Depends integration (plicease gh#85, gh#87) - added alien_check_built_version method to Alien::Base::ModuleBuild (plicease gh#83, gh#89) 0.005_05 Sep 29, 2014 - fix regression in test on MSWin32 introduced in 0.005_04 0.005_04 Sep 28, 2014 - added alien_bin_requires property to Alien::Base::ModuleBuild (plicease gh#84, gh#88) - added alien_msys property to Alien::Base::ModuleBuild (plicease gh#86) 0.005_03 Sep 23, 2014 - Inline tests requires Inline 0.56 (skip elsewise) - Document Inline 0.56 or better required for Inline integration 0.005_02 Sep 23, 2014 - silence Archive::Extract deprecation warning (we explicitly specify it as a prereq) - remove accidental undeclared dependency on YAML introduced in 0.005_01 - fixed test failures introduced in 0.005_01 0.005_01 Sep 22, 2014 - fixes with static library detection when pkg-config is not available (plicease gh#79, gh#75) - support for Inline 'with' (plicease gh#71, gh#77, gh#78) - fix prereqs for Text::ParseWords and PkgConfig (plicease gh#73, gh#70) 0.005 Sep 11, 2014 - improved documentation coverage 0.004_05 Sep 09, 2014 - additional use / instead of \ on MSWin32 (plicease gh#68) 0.004_04 Sep 09, 2014 - fixed test error introduced in 0.004_03 expressed on cygwin (plicease gh#67) 0.004_03 Sep 09, 2014 - added support for destdir (plicease gh#65, gh#39) - no longer attempt to dl_load static libraries, which aside from being wrong was triggering a dialog warning in windows (plicease gh#64) - use / instead of \ on MSWin32 (plicease gh#64) 0.004_02 Sep 04, 2014 - fixed MSWin32 specific bug introduced in 0.004_01 (plicease gh#59) - use pure perl PkgConfig as an alternative to pkg-config if the latter is not provided by operating system (plicease gh#61) - support SHA-1/256 sum checks for downloads (vikasnkumar++ gh#33, gh#60) 0.004_01 Sep 04, 2014 - Libraries in the share directory are preferred over the system library if that is what was used during install of the Alien module (plicease++ gh#22) - Better handling of paths on Windows (zmughal++ gh#41) - Fix test failure when pkg-config is not available (mohawk2++ gh#44) - Support for autotools on Windows (MSWin32, but not cygwin) (plicease++ gh#46) - Alien::MSYS will be injected as a build_requires on Windows if autotools is detected - "%c" can now be used as a platform independent way of running autotool based "configure" script - The new default for build uses "%c" instead of "%pconfigure" - Added property alien_isolate_dynamic which allows an Alien author to avoid using dynamic libraries when building XS modules (plicease gh#51) - Added dynamic_libs which returns a list of dynamic libraries (.dll, .so or .dylib depending on platform) which can be used for FFI modules (see FFI::Platypus) (plicease gh#51) - Added support for LWP as an alternative to HTTP::Tiny (preaction++ gh#24) - Added support for content-disposition HTTP header to determine correct filename and determine format from that (rsimoes++ gh#27) - By default run autotools style configure scripts with --with-pic and add alien_autoconf_with_pic property to allow disabling that (plicease gh#47) 0.004 Mar 5, 2014 - Added version token to the interpolator (MidLifeXis++) - Fixed broken test (MidLifeXis++) 0.003 Mar 3, 2013 - Added 'blib scheme' detection logic - Improves Mac/CPANtesters compatibility - Controlled by ALIEN_BLIB env var - ACTION_alien is now ACTION_alien_code - Added ACTION_alien_install - Fix manual .pc file bug - Unbuffer STDOUT during ACTION_alien_* 0.002 Jan 27, 2013 - Added exact_filename key (giatorta++) - Various bugfixes 0.001_003 Nov 29, 2012 - Improved pkg-config handling - Added support for pkg-config key ${pcfiledir} - Note: released from "experimental" branch 0.001_002 Nov 5, 2012 - Fixed some false positives in library detection - Initialize temporary directories later - Note: released from "experimental" branch 0.001_001 Nov 4, 2012 - Improved library detection - Library files are added to packlist - Note: released from "packlist" branch 0.001 Oct 9, 2012 - First Beta release! - Documentation updated - Better autogeneration of pkgconfig information (run4flat++) 0.000_022 Oct 8, 2012 - Major refactoring - separate alien_{x}_commands where x = build, test, install - removed mac specific code - no longer test provisioning (it never worked anyway) - directly allow library to install to final share_dir destination - Moved Alien::DontPanic and Ford::Prefect to CPAN under Acme:: namespaces 0.000_021 Jul 25, 2012 - Some fixes for Mac, not sure its working yet 0.000_020 Jun 22, 2012 - Windows now passes the test suite (another cleanup error trapped) - Begin overloading copy_if_modified for relocalizing dylibs on mac (this is not working yet, this release is for windows testers) 0.000_019 Jun 21, 2012 - REALLY return to EU::LibBuilder (sorry for the noise) 0.000_018 Jun 21, 2012 - return to EU::LibBuilder 0.000_017 May 6, 2012 - typo **faceplant** 0.000_016 May 6, 2012 - remove dependence on EU::LibBuilder (Mac Bundle) - t/zz-example.t shouldn't die on failure to cleanup - Capture::Tiny needs some min version, using newest but perhaps less is ok 0.000_015 May 2, 2012 - interpolation %x is current Perl interpreter ($^X) - platform specific bugfixes 0.000_014 May 1, 2012 - bugfix on dontpanic build chain (t/zz-example.t) 0.000_013 Apr 30, 2012 - libdontpanic build chain should be more x-plat. Uses EU::LibBuilder 0.000_012 Apr 29, 2012 - Simplified capture mechanism, this should prevent warnings from being suppressed - Check the return status of alien_build, die if necessary 0.000_011 Apr 25, 2012 - I'm starting to believe the bug is in the dontpanic library build chain - Die on more warnings in that build chain. This won't fix anything, but may show where the true problem lies 0.000_010 Apr 24, 2012 - Prevent build process from cwd-ing from underneath us (hopefully) 0.000_009 Apr 24, 2012 - Note: Released from 'dlopen' branch - Uses new dynamic loading mechanism via DynaLoader 0.000_008 Apr 11, 2012 - Prevent do_system from changing wd globally 0.000_007 Apr 4, 2012 - Don't rebuild library on repeated M::B::dispatch - More bugfixes 0.000_006 Apr 3, 2012 - Yet anther bugfix(?) release 0.000_005 Apr 2, 2012 - Bugfix: A::B::PkgConfig _manual key shouldn't emit undef values 0.000_004 Apr 2, 2012 - Don't mangle LD_RUN_PATH if system installed - Bugfix related to dreaded '"Can't call method "keyword" on an undefined value' error - Made t/yy-system_installed.t smarter on picking a library for testing 0.000_003 Mar 18, 2012 - Require safer File::chdir - Fixed "Bad File Descriptor" bug calling pkg-config 0.000_002 Mar 18, 2012 - More documentation - Smarter in handling user-provided pkg-config data - Generates pkg-config data from file structure if not defined 0.000_001 Mar 15, 2012 - Initial pre-alpha release, mostly to see CPANtesters results Alien-Build-2.84/Changes.Alien-Base-Wrapper000644 000000 000000 00000001241 14710030646 020321 0ustar00rootroot000000 000000 Revision history for Alien-Base-Wrapper After 0.05 Alien-Base-Wrapper was merged with Alien-Build 0.05 2017-05-23 13:30:44 -0400 - Handle $Config{cc} and $Config{ld} with spaces. - Bug in test where test was incorrectly expecting $Config{cc} instead of $Config{ld} in one test. 0.04 2017-04-04 15:40:13 -0400 - Fix bug related to multiple aliens - Add mm_args method - Add mb_args method 0.03 2017-03-21 15:26:28 -0400 - Sorry, more documentation changes only. The previous version was still pretty terrible! 0.02 2017-03-21 15:11:32 -0400 - Documentation only changes 0.01 2017-03-21 15:10:19 -0400 - initial version Alien-Build-2.84/Changes.Alien-Build-Decode-Mojo000644 000000 000000 00000000537 14710030646 021162 0ustar00rootroot000000 000000 Revision history for Alien-Build-Decode-Mojo After 0.04_01 Alien-Build-Decode-Mojo was merged with Alien-Build 0.04_01 2019-04-25 17:55:57 -0400 - Diagnostic release. 0.03_01 2019-04-24 21:17:08 -0400 - Diagnostic release. 0.02 2019-04-23 19:23:31 -0400 - Fix prereqs (gh#1) 0.01 2019-04-23 03:59:09 -0400 - initial version Alien-Build-2.84/Changes.Test-Alien000644 000000 000000 00000003211 14710030646 016747 0ustar00rootroot000000 000000 Revision history for Test-Alien After 0.15 Test-Alien was merged with Alien-Build 0.15 2017-05-23 13:14:32 -0400 - Documentation fixes - Require more recent Text::ParseWords to avoid bugs in Text::ParseWords - Handle situation where temp directory is mounted noexec 0.14 2017-03-23 22:10:24 -0400 - Documentation fixes. 0.12 2017-02-01 10:56:29 -0500 - workaround for Capture::Tiny on MSWin32 0.11 2017-01-30 18:45:05 -0500 - Only use static methods (see last entry) on share installs Typically you want to use the dynamic libraries on a system install 0.10 2017-01-30 18:37:41 -0500 - Use static methods for cflags and libs if they are provided by the Alien module. 0.09 2017-01-13 07:13:38 -0500 - Test::Alien::Run#note and #diag can be chained like the other methods 0.08 2016-12-29 18:03:35 -0500 - Fixes to silence warnings coming from recent versions of Test2::Suite 0.07 2016-05-10 11:31:59 -0400 - Require non-experimental Test2/Test-Simple and Test2::Suite 0.06 2016-04-27 14:52:12 -0400 - Better diagnostic when there is a link exception. 0.05 2016-04-25 06:59:01 -0400 - Migrated to Test2 API - This will likely break your test if you are using Test::Stream. Sorry! 0.04 2015-12-29 13:52:08 -0500 - Tweaked test skips based on cpantesters feedback 0.03 2015-12-26 17:28:45 -0700 - Fixed (hopefully) test failure in test_alien_synthetic_libarchive.t when FFI::Platypus was installed 0.02 2015-12-25 22:18:53 -0700 - Fixes for Windows. - First CPAN release. 0.01 2015-12-25 20:20:16 -0700 - initial version Alien-Build-2.84/INSTALL000644 000000 000000 00000004544 14710030646 014553 0ustar00rootroot000000 000000 This is the Perl distribution Alien-Build. Installing Alien-Build is straightforward. ## Installation with cpanm If you have cpanm, you only need one line: % cpanm Alien::Build If it does not have permission to install modules to the current perl, cpanm will automatically set up and install to a local::lib in your home directory. See the local::lib documentation (https://metacpan.org/pod/local::lib) for details on enabling it in your environment. ## Installing with the CPAN shell Alternatively, if your CPAN shell is set up, you should just be able to do: % cpan Alien::Build ## Manual installation As a last resort, you can manually install it. If you have not already downloaded the release tarball, you can find the download link on the module's MetaCPAN page: https://metacpan.org/pod/Alien::Build Untar the tarball, install configure prerequisites (see below), then build it: % perl Makefile.PL % make && make test Then install it: % make install On Windows platforms, you should use `dmake` or `nmake`, instead of `make`. If your perl is system-managed, you can create a local::lib in your home directory to install modules to. For details, see the local::lib documentation: https://metacpan.org/pod/local::lib The prerequisites of this distribution will also have to be installed manually. The prerequisites are listed in one of the files: `MYMETA.yml` or `MYMETA.json` generated by running the manual build process described above. ## Configure Prerequisites This distribution requires other modules to be installed before this distribution's installer can be run. They can be found under the "configure_requires" key of META.yml or the "{prereqs}{configure}{requires}" key of META.json. ## Other Prerequisites This distribution may require additional modules to be installed after running Makefile.PL. Look for prerequisites in the following phases: * to run make, PHASE = build * to use the module code itself, PHASE = runtime * to run tests, PHASE = test They can all be found in the "PHASE_requires" key of MYMETA.yml or the "{prereqs}{PHASE}{requires}" key of MYMETA.json. ## Documentation Alien-Build documentation is available as POD. You can run `perldoc` from a shell to read the documentation: % perldoc Alien::Build For more information on installing Perl modules via CPAN, please see: https://www.cpan.org/modules/INSTALL.html Alien-Build-2.84/LICENSE000644 000000 000000 00000046446 14710030646 014536 0ustar00rootroot000000 000000 This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Terms of the Perl programming language system itself a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" --- The GNU General Public License, Version 1, February 1989 --- This software is Copyright (c) 2011-2022 by Graham Ollis. This is free software, licensed under: The GNU General Public License, Version 1, February 1989 GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! --- The Perl Artistic License 1.0 --- This software is Copyright (c) 2011-2022 by Graham Ollis. This is free software, licensed under: The Perl Artistic License 1.0 The "Artistic License" Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End Alien-Build-2.84/MANIFEST000644 000000 000000 00000034654 14710030646 014660 0ustar00rootroot000000 000000 # This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.032. Changes Changes.Alien-Base Changes.Alien-Base-Wrapper Changes.Alien-Build-Decode-Mojo Changes.Test-Alien INSTALL LICENSE MANIFEST META.json META.yml Makefile.PL README SUPPORT author.yml corpus/ab_pkgconfig/gsl.pc corpus/ab_pkgconfig/test.pc corpus/alien_build_plugin_digest_shapp/foo.txt corpus/alien_build_plugin_digest_shapp/foo.txt.gz corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.00.tar corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.02.tar corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html corpus/alien_build_plugin_fetch_curlcommand/record/old.json corpus/alien_build_plugin_fetch_curlcommand/record/old.yml corpus/alien_build_plugin_fetch_wget/dir/foo-1.00.tar corpus/alien_build_plugin_fetch_wget/dir/foo-1.01.tar corpus/alien_build_plugin_fetch_wget/dir/foo-1.02.tar corpus/alien_build_plugin_fetch_wget/dir/html_test.html corpus/alien_build_plugin_fetch_wget/record/old.json corpus/alien_build_plugin_fetch_wget/record/old.yml corpus/basic/alienfile corpus/blank/alienfile corpus/cmake-libpalindrome/CMakeLists.txt corpus/cmake-libpalindrome/LICENSE corpus/cmake-libpalindrome/libpalindrome/CMakeLists.txt corpus/cmake-libpalindrome/libpalindrome/libpalindrome.h corpus/cmake-libpalindrome/libpalindrome/palindrome.c corpus/cmake-libpalindrome/palx/CMakeLists.txt corpus/cmake-libpalindrome/palx/main.c corpus/dir/file.html corpus/dir/ftp.list corpus/dir/ftp_abs.list corpus/dir/http.html corpus/dir/http_rel.html corpus/dist/foo-1.00.tar corpus/dist/foo-1.00.tar.Z corpus/dist/foo-1.00.tar.bz2 corpus/dist/foo-1.00.tar.gz corpus/dist/foo-1.00.tar.xz corpus/dist/foo-1.00.zip corpus/dist/foo-1.00/configure corpus/dist/foo-1.00/foo.c corpus/dist2/foo.tar corpus/lib/Alien/Build/Plugin/Download/Foo.pm corpus/lib/Alien/Build/Plugin/Fetch/Corpus.pm corpus/lib/Alien/Build/Plugin/Fetch/Foo.pm corpus/lib/Alien/Build/Plugin/NesAdvantage/Controller.pm corpus/lib/Alien/Build/Plugin/NesAdvantage/HelperTest.pm corpus/lib/Alien/Build/Plugin/NesAdvantage/Negotiate.pm corpus/lib/Alien/Build/Plugin/RogerRamjet.pm corpus/lib/Alien/Foo.pm corpus/lib/Alien/Foo1.pm corpus/lib/Alien/Foo1/ConfigData.pm corpus/lib/Alien/Foo2.pm corpus/lib/Alien/Foo2/ConfigData.pm corpus/lib/Alien/SansShare.pm corpus/lib/Alien/foomake.pm corpus/lib/Alien/libfoo1.pm corpus/lib/Alien/libfoo2.pm corpus/lib/Alien/libfoo3.pm corpus/lib/Alien/perlhelp.pm corpus/lib/Foo/Bar/Baz.pm corpus/lib/Foo/Bar/Baz1.pm corpus/lib/auto/share/dist/Alien-Foo2/README corpus/lib/auto/share/dist/Alien-Foo2/lib/libfoo2-3.2.1/include/foo2.h corpus/lib/auto/share/dist/Alien-Foo2/lib/libfoo2.a corpus/lib/auto/share/dist/Alien-libfoo1/_alien/alien.json corpus/lib/auto/share/dist/Alien-libfoo1/_alien/for_libfoo1 corpus/lib/auto/share/dist/Alien-libfoo2/_alien/alien.json corpus/lib/auto/share/dist/Alien-libfoo2/_alien/for_libfoo2 corpus/lib/auto/share/dist/Alien-libfoo2/bin/foo-config corpus/lib/auto/share/dist/Alien-libfoo2/dynamic/libfoo.so corpus/lib/auto/share/dist/Alien-libfoo2/dynamic/libfoo.so.2 corpus/lib/auto/share/dist/Alien-libfoo2/include/foo.h corpus/lib/auto/share/dist/Alien-libfoo2/lib/libfoo.a corpus/lib/auto/share/dist/Alien-libfoo2/lib/pkgconfig/x1.pc corpus/lib/auto/share/dist/Alien-libfoo2/share/pkgconfig/x2.pc corpus/lib/auto/share/dist/Alien-libfoo3/_alien/alien.json corpus/lib/auto/share/dist/Alien-perlhelp/_alien/alien.json corpus/lib/pkgconfig/foo.pc corpus/lib/pkgconfig/xor-chillout.pc corpus/lib/pkgconfig/xor.pc corpus/pkgconfig/libbar1.pc corpus/pkgconfig/libfoo1.pc corpus/vcpkg/r1/.vcpkg-root corpus/vcpkg/r1/installed/x64-windows/debug/lib/foo.lib corpus/vcpkg/r1/installed/x64-windows/include/foo.h corpus/vcpkg/r1/installed/x64-windows/lib/foo.lib corpus/vcpkg/r2/.vcpkg-root corpus/vcpkg/r2/installed/vcpkg/info/bzip2_1.0.6-5_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/curl_7.68.0-1_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/libarchive_3.4.1_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/libffi_3.3_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/libffi_3.3_x86-windows.list corpus/vcpkg/r2/installed/vcpkg/info/libiconv_1.16-1_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/liblzma_5.2.4-4_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/libressl_2.9.1-2_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/libxml2_2.9.9-5_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/lz4_1.9.2_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/lzo_2.10-4_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/openssl-windows_1.1.1d-1_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/openssl_1.1.1d_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/xxhash_0.7.0_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/info/zlib_1.2.11-6_x64-windows.list corpus/vcpkg/r2/installed/vcpkg/status corpus/vcpkg/r2/installed/x64-windows/bin/libffi.dll corpus/vcpkg/r2/installed/x64-windows/bin/libffi.pdb corpus/vcpkg/r2/installed/x64-windows/debug/bin/libffi.dll corpus/vcpkg/r2/installed/x64-windows/debug/bin/libffi.pdb corpus/vcpkg/r2/installed/x64-windows/debug/lib/libffi.lib corpus/vcpkg/r2/installed/x64-windows/include/ffi.h corpus/vcpkg/r2/installed/x64-windows/include/ffitarget.h corpus/vcpkg/r2/installed/x64-windows/lib/libffi.lib corpus/vcpkg/r2/installed/x64-windows/share/libffi/copyright corpus/vcpkg/r2/installed/x64-windows/share/libffi/libffiConfig.cmake corpus/vcpkg/r2/installed/x64-windows/share/libffi/libffiConfigVersion.cmake corpus/vcpkg/r2/installed/x64-windows/share/libffi/libffiTargets-debug.cmake corpus/vcpkg/r2/installed/x64-windows/share/libffi/libffiTargets-release.cmake corpus/vcpkg/r2/installed/x64-windows/share/libffi/libffiTargets.cmake corpus/vcpkg/r2/installed/x64-windows/share/libffi/vcpkg_abi_info.txt corpus/vcpkg/r2/installed/x86-windows/bin/libffi.dll corpus/vcpkg/r2/installed/x86-windows/bin/libffi.pdb corpus/vcpkg/r2/installed/x86-windows/debug/bin/libffi.dll corpus/vcpkg/r2/installed/x86-windows/debug/bin/libffi.pdb corpus/vcpkg/r2/installed/x86-windows/debug/lib/libffi.lib corpus/vcpkg/r2/installed/x86-windows/include/ffi.h corpus/vcpkg/r2/installed/x86-windows/include/ffitarget.h corpus/vcpkg/r2/installed/x86-windows/lib/libffi.lib corpus/vcpkg/r2/installed/x86-windows/share/libffi/copyright corpus/vcpkg/r2/installed/x86-windows/share/libffi/libffiConfig.cmake corpus/vcpkg/r2/installed/x86-windows/share/libffi/libffiConfigVersion.cmake corpus/vcpkg/r2/installed/x86-windows/share/libffi/libffiTargets-debug.cmake corpus/vcpkg/r2/installed/x86-windows/share/libffi/libffiTargets-release.cmake corpus/vcpkg/r2/installed/x86-windows/share/libffi/libffiTargets.cmake corpus/vcpkg/r2/installed/x86-windows/share/libffi/vcpkg_abi_info.txt dist.ini example/README example/bzip2.alienfile example/curl.alienfile example/dontpanic.alienfile example/gmake.alienfile example/openssl.alienfile example/user/README example/user/ffi-platypus/lib/LZMA/Example.pm example/user/ffi-platypus/t/lzma_example.t example/user/inline-c/lib/LZMA/Example.pm example/user/inline-c/t/lzma_example.t example/user/tool/lib/LZMA/Example.pm example/user/tool/t/lzma_example.t example/user/xs-dzil/Example.xs example/user/xs-dzil/dist.ini example/user/xs-dzil/lib/LZMA/Example.pm example/user/xs-dzil/t/lzma_example.t example/user/xs-mb/Build.PL example/user/xs-mb/lib/LZMA/Example.pm example/user/xs-mb/lib/LZMA/Example.xs example/user/xs-mb/t/lzma_example.t example/user/xs-mm/Example.xs example/user/xs-mm/Makefile.PL example/user/xs-mm/lib/LZMA/Example.pm example/user/xs-mm/t/lzma_example.t example/wrapper.pl example/xz-manual.alienfile example/xz.alienfile inc/probebad.pl inc/trivial.xs lib/Alien/Base.pm lib/Alien/Base/Authoring.pod lib/Alien/Base/FAQ.pod lib/Alien/Base/PkgConfig.pm lib/Alien/Base/Wrapper.pm lib/Alien/Build.pm lib/Alien/Build/CommandSequence.pm lib/Alien/Build/Interpolate.pm lib/Alien/Build/Interpolate/Default.pm lib/Alien/Build/Log.pm lib/Alien/Build/Log/Abbreviate.pm lib/Alien/Build/Log/Default.pm lib/Alien/Build/MM.pm lib/Alien/Build/Manual.pod lib/Alien/Build/Manual/Alien.pod lib/Alien/Build/Manual/AlienAuthor.pod lib/Alien/Build/Manual/AlienUser.pod lib/Alien/Build/Manual/Contributing.pod lib/Alien/Build/Manual/FAQ.pod lib/Alien/Build/Manual/PluginAuthor.pod lib/Alien/Build/Manual/Security.pod lib/Alien/Build/Manual/image/PluginAuthor-flowchart.png lib/Alien/Build/Manual/image/PluginAuthor-flowchart.svg lib/Alien/Build/Plugin.pm lib/Alien/Build/Plugin/Build.pod lib/Alien/Build/Plugin/Build/Autoconf.pm lib/Alien/Build/Plugin/Build/CMake.pm lib/Alien/Build/Plugin/Build/Copy.pm lib/Alien/Build/Plugin/Build/MSYS.pm lib/Alien/Build/Plugin/Build/Make.pm lib/Alien/Build/Plugin/Build/SearchDep.pm lib/Alien/Build/Plugin/Core.pod lib/Alien/Build/Plugin/Core/CleanInstall.pm lib/Alien/Build/Plugin/Core/Download.pm lib/Alien/Build/Plugin/Core/FFI.pm lib/Alien/Build/Plugin/Core/Gather.pm lib/Alien/Build/Plugin/Core/Legacy.pm lib/Alien/Build/Plugin/Core/Override.pm lib/Alien/Build/Plugin/Core/Setup.pm lib/Alien/Build/Plugin/Core/Tail.pm lib/Alien/Build/Plugin/Decode.pod lib/Alien/Build/Plugin/Decode/DirListing.pm lib/Alien/Build/Plugin/Decode/DirListingFtpcopy.pm lib/Alien/Build/Plugin/Decode/HTML.pm lib/Alien/Build/Plugin/Decode/Mojo.pm lib/Alien/Build/Plugin/Digest.pod lib/Alien/Build/Plugin/Digest/Negotiate.pm lib/Alien/Build/Plugin/Digest/SHA.pm lib/Alien/Build/Plugin/Digest/SHAPP.pm lib/Alien/Build/Plugin/Download.pod lib/Alien/Build/Plugin/Download/Negotiate.pm lib/Alien/Build/Plugin/Extract.pod lib/Alien/Build/Plugin/Extract/ArchiveTar.pm lib/Alien/Build/Plugin/Extract/ArchiveZip.pm lib/Alien/Build/Plugin/Extract/CommandLine.pm lib/Alien/Build/Plugin/Extract/Directory.pm lib/Alien/Build/Plugin/Extract/File.pm lib/Alien/Build/Plugin/Extract/Negotiate.pm lib/Alien/Build/Plugin/Fetch.pod lib/Alien/Build/Plugin/Fetch/CurlCommand.pm lib/Alien/Build/Plugin/Fetch/HTTPTiny.pm lib/Alien/Build/Plugin/Fetch/LWP.pm lib/Alien/Build/Plugin/Fetch/Local.pm lib/Alien/Build/Plugin/Fetch/LocalDir.pm lib/Alien/Build/Plugin/Fetch/NetFTP.pm lib/Alien/Build/Plugin/Fetch/Wget.pm lib/Alien/Build/Plugin/Gather.pod lib/Alien/Build/Plugin/Gather/IsolateDynamic.pm lib/Alien/Build/Plugin/PkgConfig.pod lib/Alien/Build/Plugin/PkgConfig/CommandLine.pm lib/Alien/Build/Plugin/PkgConfig/LibPkgConf.pm lib/Alien/Build/Plugin/PkgConfig/MakeStatic.pm lib/Alien/Build/Plugin/PkgConfig/Negotiate.pm lib/Alien/Build/Plugin/PkgConfig/PP.pm lib/Alien/Build/Plugin/Prefer.pod lib/Alien/Build/Plugin/Prefer/BadVersion.pm lib/Alien/Build/Plugin/Prefer/GoodVersion.pm lib/Alien/Build/Plugin/Prefer/SortVersions.pm lib/Alien/Build/Plugin/Probe.pod lib/Alien/Build/Plugin/Probe/CBuilder.pm lib/Alien/Build/Plugin/Probe/CommandLine.pm lib/Alien/Build/Plugin/Probe/Vcpkg.pm lib/Alien/Build/Plugin/Test.pod lib/Alien/Build/Plugin/Test/Mock.pm lib/Alien/Build/Temp.pm lib/Alien/Build/Util.pm lib/Alien/Build/Version/Basic.pm lib/Alien/Build/rc.pm lib/Alien/Role.pm lib/Alien/Util.pm lib/Test/Alien.pm lib/Test/Alien/Build.pm lib/Test/Alien/CanCompile.pm lib/Test/Alien/CanPlatypus.pm lib/Test/Alien/Diag.pm lib/Test/Alien/Run.pm lib/Test/Alien/Synthetic.pm lib/alienfile.pm maint/Alien-Base-PkgConfig/Makefile.PL maint/ci-test-plugins.pl maint/cip-after-install maint/cip-before-install maint/cip-test-plugins maint/gen-test-archives.pl maint/gen.pl maint/update-cmake-libpalindrome perlcriticrc spellcheck.ini t/00_diag.t t/01_use.t t/alien_base.t t/alien_base__system_installed.t t/alien_base_pkgconfig.t t/alien_base_wrapper.t t/alien_build.t t/alien_build__download_rule.t t/alien_build_commandsequence.t t/alien_build_commandsequence__cd.t t/alien_build_interpolate.t t/alien_build_interpolate_default.t t/alien_build_log.t t/alien_build_log_abbreviate.t t/alien_build_log_default.t t/alien_build_meta.t t/alien_build_mm.t t/alien_build_plugin.t t/alien_build_plugin_build_autoconf.t t/alien_build_plugin_build_cmake.t t/alien_build_plugin_build_copy.t t/alien_build_plugin_build_make.t t/alien_build_plugin_build_msys.t t/alien_build_plugin_build_searchdep.t t/alien_build_plugin_core_cleaninstall.t t/alien_build_plugin_core_download.t t/alien_build_plugin_core_ffi.t t/alien_build_plugin_core_gather.t t/alien_build_plugin_core_legacy.t t/alien_build_plugin_core_override.t t/alien_build_plugin_core_setup.t t/alien_build_plugin_core_tail.t t/alien_build_plugin_decode_dirlisting.t t/alien_build_plugin_decode_dirlistingftpcopy.t t/alien_build_plugin_decode_html.t t/alien_build_plugin_decode_mojo.t t/alien_build_plugin_digest_negotiate.t t/alien_build_plugin_digest_sha.t t/alien_build_plugin_digest_shapp.t t/alien_build_plugin_download_negotiate.t t/alien_build_plugin_extract_archivetar.t t/alien_build_plugin_extract_archivezip.t t/alien_build_plugin_extract_commandline.t t/alien_build_plugin_extract_commandline__tar_can.t t/alien_build_plugin_extract_directory.t t/alien_build_plugin_extract_file.t t/alien_build_plugin_extract_negotiate.t t/alien_build_plugin_fetch_curlcommand.t t/alien_build_plugin_fetch_httptiny.t t/alien_build_plugin_fetch_local.t t/alien_build_plugin_fetch_localdir.t t/alien_build_plugin_fetch_lwp.t t/alien_build_plugin_fetch_netftp.t t/alien_build_plugin_fetch_wget.t t/alien_build_plugin_gather_isolatedynamic.t t/alien_build_plugin_meta.t t/alien_build_plugin_pkgconfig_commandline.t t/alien_build_plugin_pkgconfig_libpkgconf.t t/alien_build_plugin_pkgconfig_makestatic.t t/alien_build_plugin_pkgconfig_negotiate.t t/alien_build_plugin_pkgconfig_negotiate__pick.t t/alien_build_plugin_pkgconfig_pp.t t/alien_build_plugin_prefer_badversion.t t/alien_build_plugin_prefer_goodversion.t t/alien_build_plugin_prefer_sortversions.t t/alien_build_plugin_probe_cbuilder.t t/alien_build_plugin_probe_cbuilder__live.t t/alien_build_plugin_probe_commandline.t t/alien_build_plugin_probe_vcpkg.t t/alien_build_plugin_test_mock.t t/alien_build_rc.t t/alien_build_rc__prepostload.t t/alien_build_rc__prepostload_plugin.t t/alien_build_temp.t t/alien_build_tempdir.t t/alien_build_util.t t/alien_build_version_basic.t t/alien_role.t t/alien_util.t t/alienfile.t t/bin/ftpd t/bin/httpd t/lib/MyTest/CaptureNote.pm t/lib/MyTest/FTP.pm t/lib/MyTest/FauxFetchCommand.pm t/lib/MyTest/File.pm t/lib/MyTest/HTTP.pm t/lib/MyTest/HaveCompiler.pm t/lib/MyTest/System.pm t/test_alien.t t/test_alien_build.t t/test_alien_cancompile.t t/test_alien_canplatypus.t t/test_alien_diag.t t/test_alien_run.t t/test_alien_synthetic.t weaver.ini xt/author/critic.t xt/author/eol.t xt/author/filename.t xt/author/no_tabs.t xt/author/pod.t xt/author/pod_coverage.t xt/author/pod_link.t xt/author/pod_spelling_system.t xt/author/version.t xt/release/changes.t xt/release/fixme.t Alien-Build-2.84/META.json000644 000000 000000 00000021334 14710030646 015137 0ustar00rootroot000000 000000 { "abstract" : "Build external dependencies for use in CPAN", "author" : [ "Graham Ollis ", "Joel Berger " ], "dynamic_config" : 1, "generated_by" : "Dist::Zilla version 6.032, CPAN::Meta::Converter version 2.150010", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Alien-Build", "no_index" : { "directory" : [ "corpus", "example", "maint" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : "6.64" } }, "configure" : { "requires" : { "ExtUtils::CBuilder" : "0", "ExtUtils::MakeMaker" : "6.64", "ExtUtils::ParseXS" : "3.30", "File::Which" : "0", "perl" : "5.008004" } }, "develop" : { "recommends" : { "Dist::Zilla::Plugin::Author::Plicease::Thanks" : "0", "Dist::Zilla::Plugin::Author::Plicease::Upload" : "0", "Dist::Zilla::Plugin::DynamicPrereqs" : "0", "Dist::Zilla::Plugin::GatherFile" : "0", "Dist::Zilla::Plugin::MetaNoIndex" : "0", "Dist::Zilla::Plugin::Prereqs" : "0", "Dist::Zilla::Plugin::PruneFiles" : "0", "Dist::Zilla::Plugin::RemovePrereqs" : "0", "Dist::Zilla::PluginBundle::Author::Plicease" : "2.75", "Perl::Critic::Policy::BuiltinFunctions::ProhibitBooleanGrep" : "0", "Perl::Critic::Policy::BuiltinFunctions::ProhibitStringyEval" : "0", "Perl::Critic::Policy::BuiltinFunctions::ProhibitStringySplit" : "0", "Perl::Critic::Policy::BuiltinFunctions::ProhibitVoidGrep" : "0", "Perl::Critic::Policy::BuiltinFunctions::ProhibitVoidMap" : "0", "Perl::Critic::Policy::ClassHierarchies::ProhibitExplicitISA" : "0", "Perl::Critic::Policy::ClassHierarchies::ProhibitOneArgBless" : "0", "Perl::Critic::Policy::CodeLayout::ProhibitHardTabs" : "0", "Perl::Critic::Policy::CodeLayout::ProhibitTrailingWhitespace" : "0", "Perl::Critic::Policy::CodeLayout::RequireConsistentNewlines" : "0", "Perl::Critic::Policy::Community::ArrayAssignAref" : "0", "Perl::Critic::Policy::Community::BarewordFilehandles" : "0", "Perl::Critic::Policy::Community::ConditionalDeclarations" : "0", "Perl::Critic::Policy::Community::ConditionalImplicitReturn" : "0", "Perl::Critic::Policy::Community::DeprecatedFeatures" : "0", "Perl::Critic::Policy::Community::DiscouragedModules" : "0", "Perl::Critic::Policy::Community::DollarAB" : "0", "Perl::Critic::Policy::Community::Each" : "0", "Perl::Critic::Policy::Community::EmptyReturn" : "0", "Perl::Critic::Policy::Community::IndirectObjectNotation" : "0", "Perl::Critic::Policy::Community::LexicalForeachIterator" : "0", "Perl::Critic::Policy::Community::LoopOnHash" : "0", "Perl::Critic::Policy::Community::ModPerl" : "0", "Perl::Critic::Policy::Community::OpenArgs" : "0", "Perl::Critic::Policy::Community::OverloadOptions" : "0", "Perl::Critic::Policy::Community::POSIXImports" : "0", "Perl::Critic::Policy::Community::PackageMatchesFilename" : "0", "Perl::Critic::Policy::Community::PreferredAlternatives" : "0", "Perl::Critic::Policy::Community::StrictWarnings" : "0", "Perl::Critic::Policy::Community::Threads" : "0", "Perl::Critic::Policy::Community::Wantarray" : "0", "Perl::Critic::Policy::Community::WarningsSwitch" : "0", "Perl::Critic::Policy::Community::WhileDiamondDefaultAssignment" : "0", "Perl::Critic::Policy::ControlStructures::ProhibitLabelsWithSpecialBlockNames" : "0", "Perl::Critic::Policy::ControlStructures::ProhibitMutatingListFunctions" : "0", "Perl::Critic::Policy::ControlStructures::ProhibitUnreachableCode" : "0", "Perl::Critic::Policy::InputOutput::ProhibitBarewordFileHandles" : "0", "Perl::Critic::Policy::InputOutput::ProhibitJoinedReadline" : "0", "Perl::Critic::Policy::InputOutput::ProhibitTwoArgOpen" : "0", "Perl::Critic::Policy::Miscellanea::ProhibitFormats" : "0", "Perl::Critic::Policy::Miscellanea::ProhibitUselessNoCritic" : "0", "Perl::Critic::Policy::Modules::ProhibitConditionalUseStatements" : "0", "Perl::Critic::Policy::Modules::RequireNoMatchVarsWithUseEnglish" : "0", "Perl::Critic::Policy::Objects::ProhibitIndirectSyntax" : "0", "Perl::Critic::Policy::RegularExpressions::ProhibitUselessTopic" : "0", "Perl::Critic::Policy::Subroutines::ProhibitNestedSubs" : "0", "Perl::Critic::Policy::ValuesAndExpressions::ProhibitLeadingZeros" : "0", "Perl::Critic::Policy::ValuesAndExpressions::ProhibitMixedBooleanOperators" : "0", "Perl::Critic::Policy::ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator" : "0", "Perl::Critic::Policy::ValuesAndExpressions::RequireUpperCaseHeredocTerminator" : "0", "Perl::Critic::Policy::Variables::ProhibitPerl4PackageNames" : "0", "Perl::Critic::Policy::Variables::ProhibitUnusedVariables" : "0", "Software::License::Perl_5" : "0" }, "requires" : { "FindBin" : "0", "Perl::Critic" : "0", "Test2::Require::EnvVar" : "0.000121", "Test2::Require::Module" : "0.000121", "Test2::Tools::PerlCritic" : "0", "Test2::V0" : "0.000121", "Test::CPAN::Changes" : "0", "Test::EOL" : "0", "Test::Fixme" : "0.07", "Test::More" : "0.98", "Test::NoTabs" : "0", "Test::Pod" : "0", "Test::Pod::Coverage" : "0", "Test::Pod::LinkCheck::Lite" : "0", "Test::Spelling" : "0" } }, "runtime" : { "requires" : { "Capture::Tiny" : "0.17", "Digest::SHA" : "0", "ExtUtils::CBuilder" : "0", "ExtUtils::MakeMaker" : "6.64", "ExtUtils::ParseXS" : "3.30", "FFI::CheckLib" : "0.11", "File::Which" : "1.10", "File::chdir" : "0", "JSON::PP" : "0", "List::Util" : "1.33", "Path::Tiny" : "0.077", "Test2::API" : "1.302096", "Text::ParseWords" : "3.26", "parent" : "0", "perl" : "5.008004" }, "suggests" : { "Archive::Tar" : "0" } }, "test" : { "requires" : { "Test2::API" : "1.302096", "Test2::V0" : "0.000121", "perl" : "5.008004" }, "suggests" : { "Devel::Hide" : "0" } } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://github.com/PerlAlien/Alien-Build/issues" }, "homepage" : "https://metacpan.org/pod/Alien::Build", "repository" : { "type" : "git", "url" : "git://github.com/PerlAlien/Alien-Build.git", "web" : "https://github.com/PerlAlien/Alien-Build" }, "x_IRC" : "irc://irc.perl.org/#native" }, "version" : "2.84", "x_contributors" : [ "Graham Ollis ", "Diab Jerius (DJERIUS)", "Roy Storey (KIWIROY)", "Ilya Pavlov", "David Mertens (run4flat)", "Mark Nunberg (mordy, mnunberg)", "Christian Walde (Mithaldu)", "Brian Wightman (MidLifeXis)", "Zaki Mughal (zmughal)", "mohawk (mohawk2, ETJ)", "Vikas N Kumar (vikasnkumar)", "Flavio Poletti (polettix)", "Salvador Fandi\u00f1o (salva)", "Gianni Ceccarelli (dakkar)", "Pavel Shaydo (zwon, trinitum)", "Kang-min Liu (\u5289\u5eb7\u6c11, gugod)", "Nicholas Shipp (nshp)", "Juan Juli\u00e1n Merelo Guerv\u00f3s (JJ)", "Joel Berger (JBERGER)", "Petr P\u00edsa\u0159 (ppisar)", "Lance Wicks (LANCEW)", "Ahmad Fatoum (a3f, ATHREEF)", "Jos\u00e9 Joaqu\u00edn Atria (JJATRIA)", "Duke Leto (LETO)", "Shoichi Kaji (SKAJI)", "Shawn Laffan (SLAFFAN)", "Paul Evans (leonerd, PEVANS)", "H\u00e5kon H\u00e6gland (hakonhagland, HAKONH)", "nick nauwelaerts (INPHOBIA)", "Florian Weimer" ], "x_generated_by_perl" : "v5.40.0", "x_serialization_backend" : "Cpanel::JSON::XS version 4.38", "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later", "x_use_unsafe_inc" : 0 } Alien-Build-2.84/META.yml000644 000000 000000 00000004523 14710030646 014770 0ustar00rootroot000000 000000 --- abstract: 'Build external dependencies for use in CPAN' author: - 'Graham Ollis ' - 'Joel Berger ' build_requires: ExtUtils::MakeMaker: '6.64' Test2::API: '1.302096' Test2::V0: '0.000121' perl: '5.008004' configure_requires: ExtUtils::CBuilder: '0' ExtUtils::MakeMaker: '6.64' ExtUtils::ParseXS: '3.30' File::Which: '0' perl: '5.008004' dynamic_config: 1 generated_by: 'Dist::Zilla version 6.032, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Alien-Build no_index: directory: - corpus - example - maint requires: Capture::Tiny: '0.17' Digest::SHA: '0' ExtUtils::CBuilder: '0' ExtUtils::MakeMaker: '6.64' ExtUtils::ParseXS: '3.30' FFI::CheckLib: '0.11' File::Which: '1.10' File::chdir: '0' JSON::PP: '0' List::Util: '1.33' Path::Tiny: '0.077' Test2::API: '1.302096' Text::ParseWords: '3.26' parent: '0' perl: '5.008004' resources: IRC: irc://irc.perl.org/#native bugtracker: https://github.com/PerlAlien/Alien-Build/issues homepage: https://metacpan.org/pod/Alien::Build repository: git://github.com/PerlAlien/Alien-Build.git version: '2.84' x_contributors: - 'Graham Ollis ' - 'Diab Jerius (DJERIUS)' - 'Roy Storey (KIWIROY)' - 'Ilya Pavlov' - 'David Mertens (run4flat)' - 'Mark Nunberg (mordy, mnunberg)' - 'Christian Walde (Mithaldu)' - 'Brian Wightman (MidLifeXis)' - 'Zaki Mughal (zmughal)' - 'mohawk (mohawk2, ETJ)' - 'Vikas N Kumar (vikasnkumar)' - 'Flavio Poletti (polettix)' - 'Salvador Fandiño (salva)' - 'Gianni Ceccarelli (dakkar)' - 'Pavel Shaydo (zwon, trinitum)' - 'Kang-min Liu (劉康民, gugod)' - 'Nicholas Shipp (nshp)' - 'Juan Julián Merelo Guervós (JJ)' - 'Joel Berger (JBERGER)' - 'Petr PísaÅ™ (ppisar)' - 'Lance Wicks (LANCEW)' - 'Ahmad Fatoum (a3f, ATHREEF)' - 'José Joaquín Atria (JJATRIA)' - 'Duke Leto (LETO)' - 'Shoichi Kaji (SKAJI)' - 'Shawn Laffan (SLAFFAN)' - 'Paul Evans (leonerd, PEVANS)' - 'HÃ¥kon Hægland (hakonhagland, HAKONH)' - 'nick nauwelaerts (INPHOBIA)' - 'Florian Weimer' x_generated_by_perl: v5.40.0 x_serialization_backend: 'YAML::Tiny version 1.74' x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later' x_use_unsafe_inc: 0 Alien-Build-2.84/Makefile.PL000644 000000 000000 00000034364 14710030646 015477 0ustar00rootroot000000 000000 BEGIN { use strict; use warnings; require './inc/probebad.pl'; unless(eval q{ use 5.008004; 1}) { print "Perl 5.008004 or better required\n"; exit; } } # This file was automatically generated by Dist::Zilla::Plugin::Author::Plicease::MakeMaker v2.75. use strict; use warnings; use 5.008004; use ExtUtils::MakeMaker; my %WriteMakefileArgs = ( "ABSTRACT" => "Build external dependencies for use in CPAN", "AUTHOR" => "Graham Ollis , Joel Berger ", "BUILD_REQUIRES" => { "ExtUtils::MakeMaker" => "6.64" }, "CONFIGURE_REQUIRES" => { "ExtUtils::CBuilder" => 0, "ExtUtils::MakeMaker" => "6.64", "ExtUtils::ParseXS" => "3.30", "File::Which" => 0 }, "DISTNAME" => "Alien-Build", "LICENSE" => "perl", "MIN_PERL_VERSION" => "5.008004", "NAME" => "Alien::Build", "PM" => { "lib/Alien/Base.pm" => "\$(INST_LIB)/Alien/Base.pm", "lib/Alien/Base/Authoring.pod" => "\$(INST_LIB)/Alien/Base/Authoring.pod", "lib/Alien/Base/FAQ.pod" => "\$(INST_LIB)/Alien/Base/FAQ.pod", "lib/Alien/Base/PkgConfig.pm" => "\$(INST_LIB)/Alien/Base/PkgConfig.pm", "lib/Alien/Base/Wrapper.pm" => "\$(INST_LIB)/Alien/Base/Wrapper.pm", "lib/Alien/Build.pm" => "\$(INST_LIB)/Alien/Build.pm", "lib/Alien/Build/CommandSequence.pm" => "\$(INST_LIB)/Alien/Build/CommandSequence.pm", "lib/Alien/Build/Interpolate.pm" => "\$(INST_LIB)/Alien/Build/Interpolate.pm", "lib/Alien/Build/Interpolate/Default.pm" => "\$(INST_LIB)/Alien/Build/Interpolate/Default.pm", "lib/Alien/Build/Log.pm" => "\$(INST_LIB)/Alien/Build/Log.pm", "lib/Alien/Build/Log/Abbreviate.pm" => "\$(INST_LIB)/Alien/Build/Log/Abbreviate.pm", "lib/Alien/Build/Log/Default.pm" => "\$(INST_LIB)/Alien/Build/Log/Default.pm", "lib/Alien/Build/MM.pm" => "\$(INST_LIB)/Alien/Build/MM.pm", "lib/Alien/Build/Manual.pod" => "\$(INST_LIB)/Alien/Build/Manual.pod", "lib/Alien/Build/Manual/Alien.pod" => "\$(INST_LIB)/Alien/Build/Manual/Alien.pod", "lib/Alien/Build/Manual/AlienAuthor.pod" => "\$(INST_LIB)/Alien/Build/Manual/AlienAuthor.pod", "lib/Alien/Build/Manual/AlienUser.pod" => "\$(INST_LIB)/Alien/Build/Manual/AlienUser.pod", "lib/Alien/Build/Manual/Contributing.pod" => "\$(INST_LIB)/Alien/Build/Manual/Contributing.pod", "lib/Alien/Build/Manual/FAQ.pod" => "\$(INST_LIB)/Alien/Build/Manual/FAQ.pod", "lib/Alien/Build/Manual/PluginAuthor.pod" => "\$(INST_LIB)/Alien/Build/Manual/PluginAuthor.pod", "lib/Alien/Build/Manual/Security.pod" => "\$(INST_LIB)/Alien/Build/Manual/Security.pod", "lib/Alien/Build/Plugin.pm" => "\$(INST_LIB)/Alien/Build/Plugin.pm", "lib/Alien/Build/Plugin/Build.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Build.pod", "lib/Alien/Build/Plugin/Build/Autoconf.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Build/Autoconf.pm", "lib/Alien/Build/Plugin/Build/CMake.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Build/CMake.pm", "lib/Alien/Build/Plugin/Build/Copy.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Build/Copy.pm", "lib/Alien/Build/Plugin/Build/MSYS.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Build/MSYS.pm", "lib/Alien/Build/Plugin/Build/Make.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Build/Make.pm", "lib/Alien/Build/Plugin/Build/SearchDep.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Build/SearchDep.pm", "lib/Alien/Build/Plugin/Core.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Core.pod", "lib/Alien/Build/Plugin/Core/CleanInstall.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Core/CleanInstall.pm", "lib/Alien/Build/Plugin/Core/Download.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Core/Download.pm", "lib/Alien/Build/Plugin/Core/FFI.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Core/FFI.pm", "lib/Alien/Build/Plugin/Core/Gather.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Core/Gather.pm", "lib/Alien/Build/Plugin/Core/Legacy.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Core/Legacy.pm", "lib/Alien/Build/Plugin/Core/Override.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Core/Override.pm", "lib/Alien/Build/Plugin/Core/Setup.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Core/Setup.pm", "lib/Alien/Build/Plugin/Core/Tail.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Core/Tail.pm", "lib/Alien/Build/Plugin/Decode.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Decode.pod", "lib/Alien/Build/Plugin/Decode/DirListing.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Decode/DirListing.pm", "lib/Alien/Build/Plugin/Decode/DirListingFtpcopy.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Decode/DirListingFtpcopy.pm", "lib/Alien/Build/Plugin/Decode/HTML.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Decode/HTML.pm", "lib/Alien/Build/Plugin/Decode/Mojo.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Decode/Mojo.pm", "lib/Alien/Build/Plugin/Digest.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Digest.pod", "lib/Alien/Build/Plugin/Digest/Negotiate.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Digest/Negotiate.pm", "lib/Alien/Build/Plugin/Digest/SHA.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Digest/SHA.pm", "lib/Alien/Build/Plugin/Digest/SHAPP.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Digest/SHAPP.pm", "lib/Alien/Build/Plugin/Download.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Download.pod", "lib/Alien/Build/Plugin/Download/Negotiate.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Download/Negotiate.pm", "lib/Alien/Build/Plugin/Extract.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Extract.pod", "lib/Alien/Build/Plugin/Extract/ArchiveTar.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Extract/ArchiveTar.pm", "lib/Alien/Build/Plugin/Extract/ArchiveZip.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Extract/ArchiveZip.pm", "lib/Alien/Build/Plugin/Extract/CommandLine.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Extract/CommandLine.pm", "lib/Alien/Build/Plugin/Extract/Directory.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Extract/Directory.pm", "lib/Alien/Build/Plugin/Extract/File.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Extract/File.pm", "lib/Alien/Build/Plugin/Extract/Negotiate.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Extract/Negotiate.pm", "lib/Alien/Build/Plugin/Fetch.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Fetch.pod", "lib/Alien/Build/Plugin/Fetch/CurlCommand.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Fetch/CurlCommand.pm", "lib/Alien/Build/Plugin/Fetch/HTTPTiny.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Fetch/HTTPTiny.pm", "lib/Alien/Build/Plugin/Fetch/LWP.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Fetch/LWP.pm", "lib/Alien/Build/Plugin/Fetch/Local.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Fetch/Local.pm", "lib/Alien/Build/Plugin/Fetch/LocalDir.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Fetch/LocalDir.pm", "lib/Alien/Build/Plugin/Fetch/NetFTP.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Fetch/NetFTP.pm", "lib/Alien/Build/Plugin/Fetch/Wget.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Fetch/Wget.pm", "lib/Alien/Build/Plugin/Gather.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Gather.pod", "lib/Alien/Build/Plugin/Gather/IsolateDynamic.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Gather/IsolateDynamic.pm", "lib/Alien/Build/Plugin/PkgConfig.pod" => "\$(INST_LIB)/Alien/Build/Plugin/PkgConfig.pod", "lib/Alien/Build/Plugin/PkgConfig/CommandLine.pm" => "\$(INST_LIB)/Alien/Build/Plugin/PkgConfig/CommandLine.pm", "lib/Alien/Build/Plugin/PkgConfig/LibPkgConf.pm" => "\$(INST_LIB)/Alien/Build/Plugin/PkgConfig/LibPkgConf.pm", "lib/Alien/Build/Plugin/PkgConfig/MakeStatic.pm" => "\$(INST_LIB)/Alien/Build/Plugin/PkgConfig/MakeStatic.pm", "lib/Alien/Build/Plugin/PkgConfig/Negotiate.pm" => "\$(INST_LIB)/Alien/Build/Plugin/PkgConfig/Negotiate.pm", "lib/Alien/Build/Plugin/PkgConfig/PP.pm" => "\$(INST_LIB)/Alien/Build/Plugin/PkgConfig/PP.pm", "lib/Alien/Build/Plugin/Prefer.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Prefer.pod", "lib/Alien/Build/Plugin/Prefer/BadVersion.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Prefer/BadVersion.pm", "lib/Alien/Build/Plugin/Prefer/GoodVersion.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Prefer/GoodVersion.pm", "lib/Alien/Build/Plugin/Prefer/SortVersions.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Prefer/SortVersions.pm", "lib/Alien/Build/Plugin/Probe.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Probe.pod", "lib/Alien/Build/Plugin/Probe/CBuilder.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Probe/CBuilder.pm", "lib/Alien/Build/Plugin/Probe/CommandLine.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Probe/CommandLine.pm", "lib/Alien/Build/Plugin/Probe/Vcpkg.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Probe/Vcpkg.pm", "lib/Alien/Build/Plugin/Test.pod" => "\$(INST_LIB)/Alien/Build/Plugin/Test.pod", "lib/Alien/Build/Plugin/Test/Mock.pm" => "\$(INST_LIB)/Alien/Build/Plugin/Test/Mock.pm", "lib/Alien/Build/Temp.pm" => "\$(INST_LIB)/Alien/Build/Temp.pm", "lib/Alien/Build/Util.pm" => "\$(INST_LIB)/Alien/Build/Util.pm", "lib/Alien/Build/Version/Basic.pm" => "\$(INST_LIB)/Alien/Build/Version/Basic.pm", "lib/Alien/Build/rc.pm" => "\$(INST_LIB)/Alien/Build/rc.pm", "lib/Alien/Role.pm" => "\$(INST_LIB)/Alien/Role.pm", "lib/Alien/Util.pm" => "\$(INST_LIB)/Alien/Util.pm", "lib/Test/Alien.pm" => "\$(INST_LIB)/Test/Alien.pm", "lib/Test/Alien/Build.pm" => "\$(INST_LIB)/Test/Alien/Build.pm", "lib/Test/Alien/CanCompile.pm" => "\$(INST_LIB)/Test/Alien/CanCompile.pm", "lib/Test/Alien/CanPlatypus.pm" => "\$(INST_LIB)/Test/Alien/CanPlatypus.pm", "lib/Test/Alien/Diag.pm" => "\$(INST_LIB)/Test/Alien/Diag.pm", "lib/Test/Alien/Run.pm" => "\$(INST_LIB)/Test/Alien/Run.pm", "lib/Test/Alien/Synthetic.pm" => "\$(INST_LIB)/Test/Alien/Synthetic.pm", "lib/alienfile.pm" => "\$(INST_LIB)/alienfile.pm" }, "PREREQ_PM" => { "Capture::Tiny" => "0.17", "Digest::SHA" => 0, "ExtUtils::CBuilder" => 0, "ExtUtils::MakeMaker" => "6.64", "ExtUtils::ParseXS" => "3.30", "FFI::CheckLib" => "0.11", "File::Which" => "1.10", "File::chdir" => 0, "JSON::PP" => 0, "List::Util" => "1.33", "Path::Tiny" => "0.077", "Test2::API" => "1.302096", "Text::ParseWords" => "3.26", "parent" => 0 }, "TEST_REQUIRES" => { "Test2::API" => "1.302096", "Test2::V0" => "0.000121" }, "VERSION" => "2.84", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "Capture::Tiny" => "0.17", "Digest::SHA" => 0, "ExtUtils::CBuilder" => 0, "ExtUtils::MakeMaker" => "6.64", "ExtUtils::ParseXS" => "3.30", "FFI::CheckLib" => "0.11", "File::Which" => "1.10", "File::chdir" => 0, "JSON::PP" => 0, "List::Util" => "1.33", "Path::Tiny" => "0.077", "Test2::API" => "1.302096", "Test2::V0" => "0.000121", "Text::ParseWords" => "3.26", "parent" => 0 ); # inserted by Dist::Zilla::Plugin::DynamicPrereqs 0.040 if ( !do { require File::Which; ( $ENV{PKG_CONFIG} && File::Which::which( $ENV{PKG_CONFIG} ) ) || File::Which::which('pkgconf') || File::Which::which('pkg-config') } ) { requires( 'PkgConfig' => '0.14026' ); # for static cflags support } # inserted by Dist::Zilla::Plugin::DynamicPrereqs 0.040 if ( do { use Config; ( $^O eq 'solaris' && $Config{ptrsize} == 8 ) || $^O eq 'MSWin32' } ) { requires( 'PkgConfig' => '0.14026' ); # for using the wrong libraries support } # inserted by Dist::Zilla::Plugin::DynamicPrereqs 0.040 $WriteMakefileArgs{clean} = { FILES => ".tmp" }; # inserted by Dist::Zilla::Plugin::DynamicPrereqs 0.040 if ( do { use Config; $^O eq 'MSWin32' && $Config{ccname} eq 'cl' } ) { requires( 'Win32::Vcpkg' => '0.04' ); } unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { delete $WriteMakefileArgs{TEST_REQUIRES}; delete $WriteMakefileArgs{BUILD_REQUIRES}; $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; WriteMakefile(%WriteMakefileArgs); # inserted by Dist::Zilla::Plugin::DynamicPrereqs 0.040 sub _add_prereq { my ( $mm_key, $module, $version_or_range ) = @_; $version_or_range ||= 0; warn "$module already exists in $mm_key (at version $WriteMakefileArgs{$mm_key}{$module}) -- need to do a sane metamerge!" if exists $WriteMakefileArgs{$mm_key}{$module} and $WriteMakefileArgs{$mm_key}{$module} ne '0' and $WriteMakefileArgs{$mm_key}{$module} ne $version_or_range; warn "$module already exists in FallbackPrereqs (at version $FallbackPrereqs{$module}) -- need to do a sane metamerge!" if exists $FallbackPrereqs{$module} and $FallbackPrereqs{$module} ne '0' and $FallbackPrereqs{$module} ne $version_or_range; $WriteMakefileArgs{$mm_key}{$module} = $FallbackPrereqs{$module} = $version_or_range; return; } sub requires { goto &runtime_requires } sub runtime_requires { my ( $module, $version_or_range ) = @_; _add_prereq( PREREQ_PM => $module, $version_or_range ); }Alien-Build-2.84/README000644 000000 000000 00000111223 14710030646 014373 0ustar00rootroot000000 000000 NAME Alien::Build - Build external dependencies for use in CPAN VERSION version 2.84 SYNOPSIS my $build = Alien::Build->load('./alienfile'); $build->load_requires('configure'); $build->set_prefix('/usr/local'); $build->set_stage('/foo/mystage'); # needs to be absolute $build->load_requires($build->install_type); $build->download; $build->build; # files are now in /foo/mystage, it is your job (or # ExtUtils::MakeMaker, Module::Build, etc) to copy # those files into /usr/local DESCRIPTION This module provides tools for building external (non-CPAN) dependencies for CPAN. It is mainly designed to be used at install time of a CPAN client, and work closely with Alien::Base which is used at runtime. This is the detailed documentation for the Alien::Build class. If you are starting out you probably want to do so from one of these documents: Alien::Build::Manual::Alien A broad overview of Alien-Build and its ecosystem. Alien::Build::Manual::AlienUser For users of an Alien::libfoo that is implemented using Alien::Base. (The developer of Alien::libfoo should provide the documentation necessary, but if not, this is the place to start). Alien::Build::Manual::AlienAuthor If you are writing your own Alien based on Alien::Build and Alien::Base. Alien::Build::Manual::FAQ If you have a common question that has already been answered, like "How do I use alienfile with some build system". Alien::Build::Manual::PluginAuthor This is for the brave souls who want to write plugins that will work with Alien::Build + alienfile. Alien::Build::Manual::Security If you are concerned that Aliens might be downloading tarballs off the internet, then this is the place for you. This will discuss some of the risks of downloading (really any) software off the internet and will give you some tools to remediate these risks. Note that you will not usually create a Alien::Build instance directly, but rather be using a thin installer layer, such as Alien::Build::MM (for use with ExtUtils::MakeMaker) or Alien::Build::MB (for use with Module::Build). One of the goals of this project is to remain installer agnostic. CONSTRUCTORS new my $build = Alien::Build->new; This creates a new empty instance of Alien::Build. Normally you will want to use load below to create an instance of Alien::Build from an alienfile recipe. load my $build = Alien::Build->load($alienfile); This creates an Alien::Build instance with the given alienfile recipe. resume my $build = Alien::Build->resume($alienfile, $root); Load a checkpointed Alien::Build instance. You will need the original alienfile and the build root (usually _alien), and a build that had been properly checkpointed using the checkpoint method below. PROPERTIES There are three main properties for Alien::Build. There are a number of properties documented here with a specific usage. Note that these properties may need to be serialized into something primitive like JSON that does not support: regular expressions, code references of blessed objects. If you are writing a plugin (Alien::Build::Plugin) you should use a prefix like "plugin_name" (where name is the name of your plugin) so that it does not interfere with other plugin or future versions of Alien::Build. For example, if you were writing Alien::Build::Plugin::Fetch::NewProtocol, please use the prefix plugin_fetch_newprotocol: sub init { my($self, $meta) = @_; $meta->prop( plugin_fetch_newprotocol_foo => 'some value' ); $meta->register_hook( some_hook => sub { my($build) = @_; $build->install_prop->{plugin_fetch_newprotocol_bar} = 'some other value'; $build->runtime_prop->{plugin_fetch_newprotocol_baz} = 'and another value'; } ); } If you are writing a alienfile recipe please use the prefix my_: use alienfile; meta_prop->{my_foo} = 'some value'; probe sub { my($build) = @_; $build->install_prop->{my_bar} = 'some other value'; $build->install_prop->{my_baz} = 'and another value'; }; Any property may be used from a command: probe [ 'some command %{.meta.plugin_fetch_newprotocol_foo}' ]; probe [ 'some command %{.install.plugin_fetch_newprotocol_bar}' ]; probe [ 'some command %{.runtime.plugin_fetch_newprotocol_baz}' ]; probe [ 'some command %{.meta.my_foo}' ]; probe [ 'some command %{.install.my_bar}' ]; probe [ 'some command %{.runtime.my_baz}' ]; meta_prop my $href = $build->meta_prop; my $href = Alien::Build->meta_prop; Meta properties have to do with the recipe itself, and not any particular instance that probes or builds that recipe. Meta properties can be changed from within an alienfile using the meta_prop directive, or from a plugin from its init method (though should NOT be modified from any hooks registered within that init method). This is not strictly enforced, but if you do not follow this rule your recipe will likely be broken. arch This is a hint to an installer like Alien::Build::MM or Alien::Build::MB, that the library or tool contains architecture dependent files and so should be stored in an architecture dependent location. If not specified by your alienfile then it will be set to true. check_digest True if cryptographic digest should be checked when files are fetched or downloaded. This is set by Digest negotiator plugin. destdir Some plugins (Alien::Build::Plugin::Build::Autoconf for example) support installing via DESTDIR. They will set this property to true if they plan on doing such an install. This helps Alien::Build find the staged install files and how to locate them. If available, DESTDIR is used to stage install files in a sub directory before copying the files into blib. This is generally preferred method if available. destdir_filter Regular expression for the files that should be copied from the DESTDIR into the stage directory. If not defined, then all files will be copied. destdir_ffi_filter Same as destdir_filter except applies to build_ffi instead of build. digest This properties contains the cryptographic digests (if any) that should be used when verifying any fetched and downloaded files. It is a hash reference where the key is the filename and the value is an array reference containing a pair of values, the first being the algorithm ('SHA256' is recommended) and the second is the actual digest. The special filename * may be specified to indicate that any downloaded file should match that digest. If there are both real filenames and the * placeholder, the real filenames will be used for filenames that match and any other files will use the placeholder. Example: $build->meta_prop->{digest} = { 'foo-1.00.tar.gz' => [ SHA256 => '9feac593aa49a44eb837de52513a57736457f1ea70078346c60f0bfc5f24f2c1' ], 'foo-1.01.tar.gz' => [ SHA256 => '6bbde6a7f10ae5924cf74afc26ff5b7bc4b4f9dfd85c6b534c51bd254697b9e7' ], '*' => [ SHA256 => '33a20aae3df6ecfbe812b48082926d55391be4a57d858d35753ab1334b9fddb3' ], }; Cryptographic signatures will only be checked if the check_digest meta property is set and if the Digest negotiator plugin is loaded. (The Digest negotiator can be used directly, but is also loaded automatically if you use the digest directive is used by the alienfile). env Environment variables to override during the build stage. env_interpolate Environment variable values will be interpolated with helpers. Example: meta->prop->{env_interpolate} = 1; meta->prop->{env}->{PERL} = '%{perl}'; local_source Set to true if source code package is available locally. (that is not fetched over the internet). This is computed by default based on the start_url property. Can be set by an alienfile or plugin. platform Hash reference. Contains information about the platform beyond just $^O. platform.compiler_type Refers to the type of flags that the compiler accepts. May be expanded in the future, but for now, will be one of: microsoft On Windows when using Microsoft Visual C++ unix Virtually everything else, including gcc on windows. The main difference is that with Visual C++ -LIBPATH should be used instead of -L, and static libraries should have the .LIB suffix instead of .a. platform.system_type $^O is frequently good enough to make platform specific logic in your alienfile, this handles the case when $^O can cover platforms that provide multiple environments that Perl might run under. The main example is windows, but others may be added in the future. unix vms windows-activestate windows-microsoft windows-mingw windows-strawberry windows-unknown Note that cygwin and msys are considered unix even though they run on windows! platform.cpu.count Contains a non-negative integer of available (possibly virtual) CPUs on the system. This can be used by build plugins to build in parallel. The environment variable ALIEN_CPU_COUNT can be set to override the CPU count. platform.cpu.arch.name Contains a normalized name for the architecture of the current Perl. This can be used by fetch plugins to determine which binary packages to download. The value may be one of the following, but this list will be expanded as needed. armel 32-bit ARM soft-float armhf 32-bit ARM hard-float aarch64 64-bit ARM ppc 32-bit PowerPC (big-endian) ppc64 64-bit PowerPC (big-endian) x86 32-bit Intel (i386, i486, i686) x86_64 64-bit Intel (AMD64) unknown Unable to detect architecture. Please report this if needed. out_of_source Build in a different directory from the where the source code is stored. In autoconf this is referred to as a "VPATH" build. Everyone else calls this an "out-of-source" build. When this property is true, instead of extracting to the source build root, the downloaded source will be extracted to an source extraction directory and the source build root will be empty. You can use the extract install property to get the location of the extracted source. network True if a network fetch is available. This should NOT be set by an alienfile or plugin. This is computed based on the ALIEN_INSTALL_NETWORK environment variables. start_url The default or start URL used by fetch plugins. install_prop my $href = $build->install_prop; Install properties are used during the install phase (either under share or system install). They are remembered for the entire install phase, but not kept around during the runtime phase. Thus they cannot be accessed from your Alien::Base based module. autoconf_prefix The prefix as understood by autoconf. This is only different on Windows Where MSYS is used and paths like C:/foo are represented as /C/foo which are understood by the MSYS tools, but not by Perl. You should only use this if you are using Alien::Build::Plugin::Build::Autoconf in your alienfile. This is set during before the build hook is run. download The location of the downloaded archive (tar.gz, or similar) or directory. This will be undefined until the archive is actually downloaded. download_detail This property contains optional details about a downloaded file. This property is populated by Alien::Build core. This property is a hash reference. The key is the path to the file that has been downloaded and the value is a hash reference with additional detail. All fields are optional. download_detail.digest This, if available, with the cryptographic signature that was successfully matched against the downloaded file. It is an array reference with a pair of values, the algorithm (typically something like SHA256) and the digest. download_detail.protocol This, if available, will be the URL protocol used to fetch the downloaded file. env Environment variables to override during the build stage. Plugins are free to set additional overrides using this hash. extract The location of the last source extraction. For a "out-of-source" build (see the out_of_source meta property above), this will only be set once. For other types of builds, the source code may be extracted multiple times, and thus this property may change. old [deprecated] Hash containing information on a previously installed Alien of the same name, if available. This may be useful in cases where you want to reuse the previous install if it is still sufficient. old.prefix [deprecated] The prefix for the previous install. Versions prior to 1.42 unfortunately had this in typo form of preifx. old.runtime [deprecated] The runtime properties from the previous install. patch Directory with patches, if available. This will be undef if there are no patches. When initially installing an alien this will usually be a sibling of the alienfile, a directory called patch. Once installed this will be in the share directory called _alien/patch. The former is useful for rebuilding an alienized package using af. prefix The install time prefix. Under a destdir install this is the same as the runtime or final install location. Under a non-destdir install this is the stage directory (usually the appropriate share directory under blib). root The build root directory. This will be an absolute path. It is the absolute form of ./_alien by default. stage The stage directory where files will be copied. This is usually the root of the blib share directory. system_probe_class After the probe step this property may contain the plugin class that performed the system probe. It shouldn't be filled in directly by the plugin (instead if should use the hook property probe_class, see below). This is optional, and not all probe plugins will provide this information. system_probe_instance_id After the probe step this property may contain the plugin instance id that performed the system probe. It shouldn't be filled in directly by the plugin (instead if should use the hook property probe_instance_id, see below). This is optional, and not all probe plugins will provide this information. plugin_instance_prop my $href = $build->plugin_instance_prop($plugin); This returns the private plugin instance properties for a given plugin. This method should usually only be called internally by plugins themselves to keep track of internal state. Because the content can be used arbitrarily by the owning plugin because it is private to the plugin, and thus is not part of the Alien::Build spec. runtime_prop my $href = $build->runtime_prop; Runtime properties are used during the install and runtime phases (either under share or system install). This should include anything that you will need to know to use the library or tool during runtime, and shouldn't include anything that is no longer relevant once the install process is complete. alien_build_version The version of Alien::Build used to install the library or tool. alt Alternate configurations. If the alienized package has multiple libraries this could be used to store the different compiler or linker flags for each library. Typically this will be set by a plugin in the gather stage (for either share or system installs). cflags The compiler flags. This is typically set by a plugin in the gather stage (for either share or system installs). cflags_static The static compiler flags. This is typically set by a plugin in the gather stage (for either share or system installs). command The command name for tools where the name my differ from platform to platform. For example, the GNU version of make is usually make in Linux and gmake on FreeBSD. This is typically set by a plugin in the gather stage (for either share or system installs). ffi_name The name DLL or shared object "name" to use when searching for dynamic libraries at runtime. This is passed into FFI::CheckLib, so if your library is something like libarchive.so or archive.dll you would set this to archive. This may be a string or an array of strings. This is typically set by a plugin in the gather stage (for either share or system installs). ffi_checklib This property contains two sub properties: ffi_checklib.share $build->runtime_prop->{ffi_checklib}->{share} = [ ... ]; Array of additional FFI::CheckLib flags to pass in to find_lib for a share install. ffi_checklib.system Array of additional FFI::CheckLib flags to pass in to find_lib for a system install. Among other things, useful for specifying the try_linker_script flag: $build->runtime_prop->{ffi_checklib}->{system} = [ try_linker_script => 1 ]; This is typically set by a plugin in the gather stage (for either share or system installs). inline_auto_include [version 2.53] This property is an array reference of C code that will be passed into Inline::C to make sure that appropriate headers are automatically included. See "auto_include" in Inline::C for details. install_type The install type. This is set by AB core after the probe hook is executed. Is one of: system For when the library or tool is provided by the operating system, can be detected by Alien::Build, and is considered satisfactory by the alienfile recipe. share For when a system install is not possible, the library source will be downloaded from the internet or retrieved in another appropriate fashion and built. libs The library flags. This is typically set by a plugin in the gather stage (for either share or system installs). libs_static The static library flags. This is typically set by a plugin in the gather stage (for either share or system installs). perl_module_version The version of the Perl module used to install the alien (if available). For example if Alien::curl is installing libcurl this would be the version of Alien::curl used during the install step. prefix The final install root. This is usually they share directory. version The version of the library or tool. This is typically set by a plugin in the gather stage (for either share or system installs). hook_prop my $href = $build->hook_prop; Hook properties are for the currently running (if any) hook. They are used only during the execution of each hook and are discarded after. If no hook is currently running then hook_prop will return undef. name The name of the currently running hook. version (probe) Probe and PkgConfig plugins may set this property indicating the version of the alienized package. Not all plugins and configurations may be able to provide this. probe_class (probe) Probe and PkgConfig plugins may set this property indicating the plugin class that made the probe. If the probe results in a system install this will be propagated to system_probe_class for later use. probe_instance_id (probe) Probe and PkgConfig plugins may set this property indicating the plugin instance id that made the probe. If the probe results in a system install this will be propagated to system_probe_instance_id for later use. METHODS checkpoint $build->checkpoint; Save any install or runtime properties so that they can be reloaded on a subsequent run in a separate process. This is useful if your build needs to be done in multiple stages from a Makefile, such as with ExtUtils::MakeMaker. Once checkpointed you can use the resume constructor (documented above) to resume the probe/build/install] process. root my $dir = $build->root; This is just a shortcut for: my $root = $build->install_prop->{root}; Except that it will be created if it does not already exist. install_type my $type = $build->install_type; This will return the install type. (See the like named install property above for details). This method will call probe if it has not already been called. is_system_install my $boolean = $build->is_system_install; Returns true if the alien is a system install type. is_share_install my $boolean = $build->is_share_install; Returns true if the alien is a share install type. download_rule my $rule = $build->download_rule; This returns install rule as a string. This is determined by the environment and should be one of: warn Warn only if fetching via non secure source (secure sources include https, and bundled files, may include other encrypted protocols in the future). digest Require that any downloaded source package have a cryptographic signature in the alienfile and that signature matches what was downloaded. encrypt Require that any downloaded source package is fetched via secure source. digest_or_encrypt Require that any downloaded source package is either fetched via a secure source or has a cryptographic signature in the alienfile and that signature matches what was downloaded. digest_and_encrypt Require that any downloaded source package is both fetched via a secure source and has a cryptographic signature in the alienfile and that signature matches what was downloaded. The current default is warn, but in the near future this will be upgraded to digest_or_encrypt. set_prefix $build->set_prefix($prefix); Set the final (unstaged) prefix. This is normally only called by Alien::Build::MM and similar modules. It is not intended for use from plugins or from an alienfile. set_stage $build->set_stage($dir); Sets the stage directory. This is normally only called by Alien::Build::MM and similar modules. It is not intended for use from plugins or from an alienfile. requires my $hash = $build->requires($phase); Returns a hash reference of the modules required for the given phase. Phases include: configure These modules must already be available when the alienfile is read. any These modules are used during either a system or share install. share These modules are used during the build phase of a share install. system These modules are used during the build phase of a system install. load_requires $build->load_requires($phase); This loads the appropriate modules for the given phase (see requires above for a description of the phases). probe my $install_type = $build->probe; Attempts to determine if the operating system has the library or tool already installed. If so, then the string system will be returned and a system install will be performed. If not, then the string share will be installed and the tool or library will be downloaded and built from source. If the environment variable ALIEN_INSTALL_TYPE is set, then that will force a specific type of install. If the detection logic cannot accommodate the install type requested then it will fail with an exception. download $build->download; Download the source, usually as a tarball, usually from the internet. Under a system install this does not do anything. fetch my $res = $build->fetch; my $res = $build->fetch($url, %options); Fetch a resource using the fetch hook. Returns the same hash structure described below in the fetch hook documentation. [version 2.39] As of Alien::Build 2.39, these options are supported: http_headers my $res = $build->fetch($url, http_headers => [ $key1 => $value1, $key2 => $value 2, ... ]); Set the HTTP request headers on all outgoing HTTP requests. Note that not all protocols or fetch plugins support setting request headers, but the ones that do not should issue a warning if you try to set request headers and they are not supported. check_digest [experimental] my $bool = $build->check_digest($path); Checks any cryptographic signatures for the given file. The file is specified by $path which may be one of: string Containing the path to the file to be checked. Path::Tiny Containing the path to the file to be checked. HASH A Hash reference containing information about a file. See the fetch hook for details on the format. Returns true if the cryptographic signature matches, false if cryptographic signatures are disabled. Will throw an exception if the signature does not match, or if no plugin provides the correct algorithm for checking the signature. decode my $decoded_res = $build->decode($res); Decode the HTML or file listing returned by fetch. Returns the same hash structure described below in the decode hook documentation. prefer my $sorted_res = $build->prefer($res); Filter and sort candidates. The preferred candidate will be returned first in the list. The worst candidate will be returned last. Returns the same hash structure described below in the prefer hook documentation. extract my $dir = $build->extract; my $dir = $build->extract($archive); Extracts the given archive into a fresh directory. This is normally called internally to Alien::Build, and for normal usage is not needed from a plugin or alienfile. build $build->build; Run the build step. It is expected that probe and download have already been performed. What it actually does depends on the type of install: share The source is extracted, and built as determined by the alienfile recipe. If there is a gather_share that will be executed last. system The gather_system hook will be executed. test $build->test; Run the test phase clean_install $build->clean_install Clean files from the final install location. The default implementation removes all files recursively except for the _alien directory. This is helpful when you have an old install with files that may break the new build. For a non-share install this doesn't do anything. system $build->system($command); $build->system($command, @args); Interpolates the command and arguments and run the results using the Perl system command. log $build->log($message); Send a message to the log. By default this prints to STDOUT. meta my $meta = Alien::Build->meta; my $meta = $build->meta; Returns the meta object for your Alien::Build class or instance. The meta object is a way to manipulate the recipe, and so any changes to the meta object should be made before the probe, download or build steps. META METHODS prop my $href = $build->meta->prop; Meta properties. This is the same as calling meta_prop on the class or Alien::Build instance. add_requires Alien::Build->meta->add_requires($phase, $module => $version, ...); Add the requirement to the given phase. Phase should be one of: configure any share system interpolator my $interpolator = $build->meta->interpolator; my $interpolator = Alien::Build->interpolator; Returns the Alien::Build::Interpolate instance for the Alien::Build class. has_hook my $bool = $build->meta->has_hook($name); my $bool = Alien::Build->has_hook($name); Returns if there is a usable hook registered with the given name. register_hook $build->meta->register_hook($name, $instructions); Alien::Build->meta->register_hook($name, $instructions); Register a hook with the given name. $instruction should be either a code reference, or a command sequence, which is an array reference. default_hook $build->meta->default_hook($name, $instructions); Alien::Build->meta->default_hook($name, $instructions); Register a default hook, which will be used if the alienfile does not register its own hook with that name. around_hook $build->meta->around_hook($hook_name, $code); Alien::Build->meta->around_hook($hook_name, $code); Wrap the given hook with a code reference. This is similar to a Moose method modifier, except that it wraps around the given hook instead of a method. For example, this will add a probe system requirement: $build->meta->around_hook( probe => sub { my $orig = shift; my $build = shift; my $type = $orig->($build, @_); return $type unless $type eq 'system'; # also require a configuration file if(-f '/etc/foo.conf') { return 'system'; } else { return 'share'; } }, ); after_hook $build->meta->after_hook($hook_name, sub { my(@args) = @_; ... }); Execute the given code reference after the hook. The original arguments are passed into the code reference. before_hook $build->meta->before_hook($hook_name, sub { my(@args) = @_; ... }); Execute the given code reference before the hook. The original arguments are passed into the code reference. apply_plugin Alien::Build->meta->apply_plugin($name); Alien::Build->meta->apply_plugin($name, @args); Apply the given plugin with the given arguments. ENVIRONMENT Alien::Build responds to these environment variables: ALIEN_BUILD_LOG The default log class used. See Alien::Build::Log and Alien::Build::Log::Default. ALIEN_BUILD_PKG_CONFIG Override the logic in Alien::Build::Plugin::PkgConfig::Negotiate which chooses the best pkg-config plugin. ALIEN_BUILD_POSTLOAD semicolon separated list of plugins to automatically load after parsing your alienfile. ALIEN_BUILD_PRELOAD semicolon separated list of plugins to automatically load before parsing your alienfile. ALIEN_BUILD_RC Perl source file which can override some global defaults for Alien::Build, by, for example, setting preload and postload plugins. ALIEN_DOWNLOAD_RULE This value determines the rules by which types of downloads are allowed. The legal values listed under "download_rule", plus default which will be the default for the current version of Alien::Build. For this version that default is warn. ALIEN_INSTALL_NETWORK If set to true (the default), then network fetch will be allowed. If set to false, then network fetch will not be allowed. What constitutes a local vs. network fetch is determined based on the start_url and local_source meta properties. An alienfile or plugin could override this detection (possibly inappropriately), so this variable is not a substitute for properly auditing of Perl modules for environments that require that. ALIEN_INSTALL_TYPE If set to share or system, it will override the system detection logic. If set to default, it will use the default setting for the alienfile. The behavior of other values is undefined. Although the recommended way for a consumer to use an Alien::Base based Alien is to declare it as a static configure and build-time dependency, some consumers may prefer to fallback on using an Alien only when the consumer itself cannot detect the necessary package. In some cases the consumer may want the user to opt-in to using an Alien before requiring it. To keep the interface consistent among Aliens, the consumer of the fallback opt-in Alien may fallback on the Alien if the environment variable ALIEN_INSTALL_TYPE is set to any value. The rationale is that by setting this environment variable the user is aware that Alien modules may be installed and have indicated consent. The actual implementation of this, by its nature would have to be in the consuming CPAN module. DESTDIR This environment variable will be manipulated during a destdir install. PKG_CONFIG This environment variable can be used to override the program name for pkg-config when using the command line plugin: Alien::Build::Plugin::PkgConfig::CommandLine. ftp_proxy, all_proxy If these environment variables are set, it may influence the Download negotiation plugin Alien::Build::Plugin::Download::Negotiate. Other proxy variables may be used by some Fetch plugins, if they support it. SUPPORT The intent of the Alien-Build team is to support the same versions of Perl that are supported by the Perl toolchain. As of this writing that means 5.16 and better. Please feel encouraged to report issues that you encounter to the project GitHub Issue tracker: https://github.com/PerlAlien/Alien-Build/issues Better if you can fix the issue yourself, please feel encouraged to open pull-request on the project GitHub: https://github.com/PerlAlien/Alien-Build/pulls If you are confounded and have questions, join us on the #native channel on irc.perl.org. The Alien-Build developers frequent this channel and can probably help point you in the right direction. If you don't have an IRC client handy, you can use this web interface: https://chat.mibbit.com/?channel=%23native&server=irc.perl.org SEE ALSO Alien::Build::Manual::AlienAuthor, Alien::Build::Manual::AlienUser, Alien::Build::Manual::Contributing, Alien::Build::Manual::FAQ, Alien::Build::Manual::PluginAuthor alienfile, Alien::Build::MM, Alien::Build::Plugin, Alien::Base, Alien THANKS Alien::Base was originally written by Joel Berger, the rest of this project would not have been possible without him getting the project started. Thanks to his support I have been able to augment the original Alien::Base system with a reliable set of tools (Alien::Build, alienfile, Test::Alien), which make up this toolset. The original Alien::Base is still copyright (c) 2012-2020 Joel Berger. It has the same license as the rest of the Alien::Build and related tools distributed as Alien-Build. Joel Berger thanked a number of people who helped in in the development of Alien::Base, in the documentation for that module. I would also like to acknowledge the other members of the PerlAlien github organization, Zakariyya Mughal (sivoais, ZMUGHAL) and mohawk (ETJ). Also important in the early development of Alien::Build were the early adopters Chase Whitener (genio, CAPOEIRAB, author of Alien::libuv), William N. Braswell, Jr (willthechill, WBRASWELL, author of Alien::JPCRE2 and Alien::PCRE2) and Ahmad Fatoum (a3f, ATHREEF, author of Alien::libudev and Alien::LibUSB). The Alien ecosystem owes a debt to Dan Book, who goes by Grinnz on IRC, for answering question about how to use Alien::Build and friends. AUTHOR Author: Graham Ollis Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Alien-Build-2.84/SUPPORT000644 000000 000000 00000001576 14710030646 014623 0ustar00rootroot000000 000000 SUPPORT The intent of the "Alien-Build" team is to support as best as possible all Perls from 5.8.4 to the latest production version. So long as they are also supported by the Perl toolchain. Please feel encouraged to report issues that you encounter to the project GitHub Issue tracker: Better if you can fix the issue yourself, please feel encouraged to open pull-request on the project GitHub: If you are confounded and have questions, join us on the "#native" channel on irc.perl.org. The "Alien-Build" developers frequent this channel and can probably help point you in the right direction. If you don't have an IRC client handy, you can use this web interface: Alien-Build-2.84/author.yml000644 000000 000000 00000005257 14710030646 015551 0ustar00rootroot000000 000000 --- pod_spelling_system: skip: 0 # list of words that are spelled correctly # (regardless of what spell check thinks) stopwords: - PerlAlien - alienfile - ar - bzip - cmake - cp - devnull - gmake - ld - nasm - pkgconf - xz - interpolator - Autoconf - autoconf - MSYS - ftpcopy - ETJ - Mughal - SIVOAIS - Zaki - mohawk - plugable - cflags - libs - PkgConfig - sys - destdir - alienfile - unstaged - checkpointed - ssl - readme - toolset - unixy - microsoft - GnuWin - alienizing - libfoo - libpkgconf - pc - DJERIUS - Diab - Jerius - ffi - lang - env - diag - pxs - xs - useable - subtests - subtest - unsets - postload - preload - EUMM - alienized - Ceccarelli - Fandiño - Flavio - Gianni - Guervós - JJ - Julián - Kang - Kumar - Liu - Merelo - Mertens - MidLifeXis - Mithaldu - Nunberg - Pavel - Poletti - Shaydo - Vikas - Walde - Wightman - dakkar - gugod - mnunberg - mordy - polettix - salva - trinitum - vikasnkumar - zmughal - zwon - nshp - Shipp - kmx - rpath - activestate - mingw - vms - alienize - umake - travis - JBERGER - Petr - PísaÅ™ - ppisar - wget - VPATH - ATHREEF - Braswell - DLL - CAPOEIRAB - Fatoum - OpenSSL - WBRASWELL - Zakariyya - genio - sivoais - willthechill - LANCEW - JJATRIA - Joaqu - Jos - Leto - LETO - unsetting - ConfigData - Kaji - SKAJI - Shoichi - Laffan - SLAFFAN - autotools - PEVANS - leonerd - KIWIROY - Overridable - logx - google - chatroom - api - WriteMakefile - Grinnz - Vcpkg - macOS - HAKONH - hakonhagland - kon - INPHOBIA - nauwelaerts - cryptographic - TLS - aggresive - CPUs - Florian - Weimer pod_coverage: skip: 0 # format is "Class#method" or "Class", regex allowed # for either Class or method. private: - Alien::Base#Inline - Alien::Base#split_flags - Alien::Base#split_flags_unix - Alien::Base#split_flags_windows - Alien::Build::Plugin::.*#init - Alien::Build::Plugin::Probe::GnuWin32#new - Test::Alien::CanCompile#skip - Test::Alien::CanCompileCpp#skip - Test::Alien::CanPlatypus#skip - Test::Alien#with_subtest - Test::Alien#capture_merged - Alien::Base::PkgConfig - Alien::Build::Temp Alien-Build-2.84/corpus/000755 000000 000000 00000000000 14710030646 015026 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/ab_pkgconfig/000755 000000 000000 00000000000 14710030646 017437 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/ab_pkgconfig/gsl.pc000644 000000 000000 00000001105 14710030646 020545 0ustar00rootroot000000 000000 prefix=/home/joel/Programs/Dist/Alien-Base/examples/Alien-GSL/_install exec_prefix=/home/joel/Programs/Dist/Alien-Base/examples/Alien-GSL/_install libdir=/home/joel/Programs/Dist/Alien-Base/examples/Alien-GSL/_install/lib includedir=/home/joel/Programs/Dist/Alien-Base/examples/Alien-GSL/_install/include GSL_CBLAS_LIB=-lgslcblas Name: GSL Description: GNU Scientific Library Version: 1.15 Libs: -L/home/joel/Programs/Dist/Alien-Base/examples/Alien-GSL/_install/lib -lgsl ${GSL_CBLAS_LIB} -lm -lm Cflags: -I/home/joel/Programs/Dist/Alien-Base/examples/Alien-GSL/_install/include Alien-Build-2.84/corpus/ab_pkgconfig/test.pc000644 000000 000000 00000000407 14710030646 020743 0ustar00rootroot000000 000000 prefix=/home/test/path INTERNAL_VARIABLE=-lotherlib Name: TEST Description: My TEST Library Version: 1.01 Libs: -L/home/test/path/lib -lsomelib ${INTERNAL_VARIABLE} -lm -lm Cflags: -Dfoo=bar -I/home/test/path/deeper/include Requires: lib1 >= 1.0.0 lib2 >= 1.2.3 Alien-Build-2.84/corpus/alien_build_plugin_digest_shapp/000755 000000 000000 00000000000 14710030646 023405 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/alien_build_plugin_digest_shapp/foo.txt000644 000000 000000 00000000022 14710030646 024723 0ustar00rootroot000000 000000 this is some text Alien-Build-2.84/corpus/alien_build_plugin_digest_shapp/foo.txt.gz000644 000000 000000 00000000054 14710030646 025347 0ustar00rootroot000000 000000 ‹ê%úbfoo.txt+ÉÈ,V¢âüÜT…’ÔŠ.h]Ù¨Alien-Build-2.84/corpus/alien_build_plugin_fetch_curlcommand/000755 000000 000000 00000000000 14710030646 024410 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/alien_build_plugin_fetch_curlcommand/dir/000755 000000 000000 00000000000 14710030646 025166 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.00.tar000644 000000 000000 00000000021 14710030646 027026 0ustar00rootroot000000 000000 content:foo-1.00 Alien-Build-2.84/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar000644 000000 000000 00000000021 14710030646 027027 0ustar00rootroot000000 000000 content:foo-1.01 Alien-Build-2.84/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.02.tar000644 000000 000000 00000000021 14710030646 027030 0ustar00rootroot000000 000000 content:foo-1.02 Alien-Build-2.84/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html000644 000000 000000 00000000124 14710030646 030054 0ustar00rootroot000000 000000 Hello World

Hello World

Alien-Build-2.84/corpus/alien_build_plugin_fetch_curlcommand/record/000755 000000 000000 00000000000 14710030646 025666 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/alien_build_plugin_fetch_curlcommand/record/old.json000644 000000 000000 00000026064 14710030646 027347 0ustar00rootroot000000 000000 {"-l ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus/":{"stdout":"","files":{},"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (9) Server denied you to change to the given directory\n","exit":9},"-l ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/":{"exit":0,"files":{},"stdout":"foo-1.00.tar\nfoo-1.01.tar\nfoo-1.02.tar\nhtml_test.html\n","stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 58 0 58 0 0 1172 0 --:--:-- --:--:-- --:--:-- 1183\n"},"-L -f -O -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar":{"exit":0,"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 17 100 17 0 0 2524 0 --:--:-- --:--:-- --:--:-- 2833\n","stdout":"ab-filename :foo-1.01.tar\nab-content_type :text/plain;charset=UTF-8\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar","files":{"foo-1.01.tar":"content:foo-1.01\n"}},"-L -f -O -J -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html":{"stdout":"ab-filename :bogus.html\nab-content_type :\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html","files":{},"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (22) The requested URL returned error: 404 Not Found\n","exit":22},"-L -O -J -f -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar":{"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 17 100 17 0 0 2797 0 --:--:-- --:--:-- --:--:-- 2833\n","files":{"foo-1.01.tar":"content:foo-1.01\n"},"stdout":"ab-filename :foo-1.01.tar\nab-content_type :text/plain\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar","exit":0},"-L -f -o content -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar":{"files":{"content":"content:foo-1.01\n"},"stdout":"ab-filename :content\nab-content_type :text/plain\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar","stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 17 100 17 0 0 3758 0 --:--:-- --:--:-- --:--:-- 4250\n","exit":0},"-o dir ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir":{"exit":78,"files":{},"stdout":"","stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (78) RETR response: 550\n"},"-L -f -O -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html":{"files":{},"stdout":"ab-filename :bogus.html\nab-content_type :\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html","stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (22) The requested URL returned error: 404 Not Found\n","exit":22},"-L -f -o content -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html":{"exit":22,"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (22) The requested URL returned error: 404 Not Found\n","stdout":"ab-filename :content\nab-content_type :\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html","files":{}},"-L -f -O -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html":{"exit":0,"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 84 100 84 0 0 11433 0 --:--:-- --:--:-- --:--:-- 12000\n","files":{"html_test.html":"Hello World

Hello World

\n"},"stdout":"ab-filename :html_test.html\nab-content_type :text/html;charset=UTF-8\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html"},"-L -f -O -J -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar":{"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 17 100 17 0 0 2469 0 --:--:-- --:--:-- --:--:-- 2833\n","files":{"foo-1.01.tar":"content:foo-1.01\n"},"stdout":"ab-filename :foo-1.01.tar\nab-content_type :text/plain;charset=UTF-8\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar","exit":0},"-l ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.txt/":{"exit":9,"stdout":"","files":{},"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (9) Server denied you to change to the given directory\n"},"-o foo-1.01.tar ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar":{"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 17 100 17 0 0 334 0 --:--:-- --:--:-- --:--:-- 333\n","stdout":"","files":{"foo-1.01.tar":"content:foo-1.01\n"},"exit":0},"-o bogus.txt ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.txt":{"stdout":"","files":{},"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (78) RETR response: 550\n","exit":78},"-L -O -J -f -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html":{"exit":0,"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 84 100 84 0 0 14341 0 --:--:-- --:--:-- --:--:-- 16800\n","files":{"html_test.html":"Hello World

Hello World

\n"},"stdout":"ab-filename :html_test.html\nab-content_type :text/html;charset=UTF-8\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html"},"-L -f -O -J -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html":{"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 84 100 84 0 0 13541 0 --:--:-- --:--:-- --:--:-- 14000\n","files":{"html_test.html":"Hello World

Hello World

\n"},"stdout":"ab-filename :html_test.html\nab-content_type :text/html;charset=UTF-8\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html","exit":0},"-L -O -J -f -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html":{"exit":22,"files":{},"stdout":"ab-filename :bogus.html\nab-content_type :\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html","stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (22) The requested URL returned error: 404 Not Found\n"},"-L -f -o content -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html":{"exit":0,"stdout":"ab-filename :content\nab-content_type :text/html;charset=UTF-8\nab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html","files":{"content":"Hello World

Hello World

\n"},"stderr":" % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 84 100 84 0 0 19086 0 --:--:-- --:--:-- --:--:-- 21000\n"}}Alien-Build-2.84/corpus/alien_build_plugin_fetch_curlcommand/record/old.yml000644 000000 000000 00000026341 14710030646 027175 0ustar00rootroot000000 000000 --- -L -O -J -f -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html: exit: 22 files: {} stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (22) The requested URL returned error: 404 Not Found\n" stdout: |- ab-filename :bogus.html ab-content_type : ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html -L -O -J -f -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar: exit: 0 files: foo-1.01.tar: "content:foo-1.01\n" stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 17 100 17 0 0 2797 0 --:--:-- --:--:-- --:--:-- 2833\n" stdout: |- ab-filename :foo-1.01.tar ab-content_type :text/plain ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar -L -O -J -f -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html: exit: 0 files: html_test.html: "Hello World

Hello World

\n" stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 84 100 84 0 0 14341 0 --:--:-- --:--:-- --:--:-- 16800\n" stdout: |- ab-filename :html_test.html ab-content_type :text/html;charset=UTF-8 ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html -L -f -O -J -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html: exit: 22 files: {} stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (22) The requested URL returned error: 404 Not Found\n" stdout: |- ab-filename :bogus.html ab-content_type : ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html -L -f -O -J -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar: exit: 0 files: foo-1.01.tar: "content:foo-1.01\n" stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 17 100 17 0 0 2469 0 --:--:-- --:--:-- --:--:-- 2833\n" stdout: |- ab-filename :foo-1.01.tar ab-content_type :text/plain;charset=UTF-8 ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar -L -f -O -J -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html: exit: 0 files: html_test.html: "Hello World

Hello World

\n" stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 84 100 84 0 0 13541 0 --:--:-- --:--:-- --:--:-- 14000\n" stdout: |- ab-filename :html_test.html ab-content_type :text/html;charset=UTF-8 ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html -L -f -O -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html: exit: 22 files: {} stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (22) The requested URL returned error: 404 Not Found\n" stdout: |- ab-filename :bogus.html ab-content_type : ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html -L -f -O -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar: exit: 0 files: foo-1.01.tar: "content:foo-1.01\n" stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 17 100 17 0 0 2524 0 --:--:-- --:--:-- --:--:-- 2833\n" stdout: |- ab-filename :foo-1.01.tar ab-content_type :text/plain;charset=UTF-8 ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar -L -f -O -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html: exit: 0 files: html_test.html: "Hello World

Hello World

\n" stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 84 100 84 0 0 11433 0 --:--:-- --:--:-- --:--:-- 12000\n" stdout: |- ab-filename :html_test.html ab-content_type :text/html;charset=UTF-8 ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html -L -f -o content -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html: exit: 22 files: {} stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (22) The requested URL returned error: 404 Not Found\n" stdout: |- ab-filename :content ab-content_type : ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.html -L -f -o content -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar: exit: 0 files: content: "content:foo-1.01\n" stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 17 100 17 0 0 3758 0 --:--:-- --:--:-- --:--:-- 4250\n" stdout: |- ab-filename :content ab-content_type :text/plain ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar -L -f -o content -w @writeout http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html: exit: 0 files: content: "Hello World

Hello World

\n" stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 84 100 84 0 0 19086 0 --:--:-- --:--:-- --:--:-- 21000\n" stdout: |- ab-filename :content ab-content_type :text/html;charset=UTF-8 ab-url :http://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/html_test.html -l ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/: exit: 0 files: {} stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 58 0 58 0 0 1172 0 --:--:-- --:--:-- --:--:-- 1183\n" stdout: | foo-1.00.tar foo-1.01.tar foo-1.02.tar html_test.html -l ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.txt/: exit: 9 files: {} stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (9) Server denied you to change to the given directory\n" stdout: '' -l ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus/: exit: 9 files: {} stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (9) Server denied you to change to the given directory\n" stdout: '' -o bogus.txt ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/bogus.txt: exit: 78 files: {} stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (78) RETR response: 550\n" stdout: '' -o dir ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir: exit: 78 files: {} stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (78) RETR response: 550\n" stdout: '' -o foo-1.01.tar ftp://localhost/corpus/alien_build_plugin_fetch_curlcommand/dir/foo-1.01.tar: exit: 0 files: foo-1.01.tar: "content:foo-1.01\n" stderr: " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 17 100 17 0 0 334 0 --:--:-- --:--:-- --:--:-- 333\n" stdout: '' Alien-Build-2.84/corpus/alien_build_plugin_fetch_wget/000755 000000 000000 00000000000 14710030646 023052 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/alien_build_plugin_fetch_wget/dir/000755 000000 000000 00000000000 14710030646 023630 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/alien_build_plugin_fetch_wget/dir/foo-1.00.tar000644 000000 000000 00000000021 14710030646 025470 0ustar00rootroot000000 000000 content:foo-1.00 Alien-Build-2.84/corpus/alien_build_plugin_fetch_wget/dir/foo-1.01.tar000644 000000 000000 00000000021 14710030646 025471 0ustar00rootroot000000 000000 content:foo-1.01 Alien-Build-2.84/corpus/alien_build_plugin_fetch_wget/dir/foo-1.02.tar000644 000000 000000 00000000021 14710030646 025472 0ustar00rootroot000000 000000 content:foo-1.02 Alien-Build-2.84/corpus/alien_build_plugin_fetch_wget/dir/html_test.html000644 000000 000000 00000000124 14710030646 026516 0ustar00rootroot000000 000000 Hello World

Hello World

Alien-Build-2.84/corpus/alien_build_plugin_fetch_wget/record/000755 000000 000000 00000000000 14710030646 024330 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/alien_build_plugin_fetch_wget/record/old.json000644 000000 000000 00000037255 14710030646 026015 0ustar00rootroot000000 000000 {"-k --content-disposition -S http://localhost/corpus/alien_build_plugin_fetch_wget/dir/foo-1.01.tar":{"stderr":"--2021-05-12 00:10:35-- http://localhost/corpus/alien_build_plugin_fetch_wget/dir/foo-1.01.tar\nResolving localhost (localhost)... ::1, 127.0.0.1\nConnecting to localhost (localhost)|::1|:42643... failed: Connection refused.\nConnecting to localhost (localhost)|127.0.0.1|:42643... connected.\nHTTP request sent, awaiting response... \n HTTP/1.0 200 OK\n Date: Wed, 12 May 2021 06:10:35 GMT\n Server: HTTP::Server::PSGI\n Content-Type: application/x-tar\n Content-Length: 17\n Last-Modified: Sun, 02 May 2021 15:41:03 GMT\nLength: 17 [application/x-tar]\nSaving to: ‘foo-1.01.tar’\n\n 0K 100% 1.65M=0s\n\n2021-05-12 00:10:35 (1.65 MB/s) - ‘foo-1.01.tar’ saved [17/17]\n\nConverted links in 0 files in 0 seconds.\n","exit":0,"files":{"foo-1.01.tar":"content:foo-1.01\n"},"stdout":""},"-k --content-disposition -S http://localhost/corpus/alien_build_plugin_fetch_wget/dir/bogus.html":{"files":{},"exit":8,"stdout":"","stderr":"--2021-05-12 00:10:35-- http://localhost/corpus/alien_build_plugin_fetch_wget/dir/bogus.html\nResolving localhost (localhost)... ::1, 127.0.0.1\nConnecting to localhost (localhost)|::1|:42643... failed: Connection refused.\nConnecting to localhost (localhost)|127.0.0.1|:42643... connected.\nHTTP request sent, awaiting response... \n HTTP/1.0 404 Not Found\n Date: Wed, 12 May 2021 06:10:35 GMT\n Server: HTTP::Server::PSGI\n Content-Type: text/plain\n Content-Length: 9\n2021-05-12 00:10:35 ERROR 404: Not Found.\n\nConverted links in 0 files in 0 seconds.\n"},"--help":{"stderr":"","stdout":"GNU Wget 1.20.1, a non-interactive network retriever.\nUsage: wget [OPTION]... [URL]...\n\nMandatory arguments to long options are mandatory for short options too.\n\nStartup:\n -V, --version display the version of Wget and exit\n -h, --help print this help\n -b, --background go to background after startup\n -e, --execute=COMMAND execute a `.wgetrc'-style command\n\nLogging and input file:\n -o, --output-file=FILE log messages to FILE\n -a, --append-output=FILE append messages to FILE\n -d, --debug print lots of debugging information\n -q, --quiet quiet (no output)\n -v, --verbose be verbose (this is the default)\n -nv, --no-verbose turn off verboseness, without being quiet\n --report-speed=TYPE output bandwidth as TYPE. TYPE can be bits\n -i, --input-file=FILE download URLs found in local or external FILE\n -F, --force-html treat input file as HTML\n -B, --base=URL resolves HTML input-file links (-i -F)\n relative to URL\n --config=FILE specify config file to use\n --no-config do not read any config file\n --rejected-log=FILE log reasons for URL rejection to FILE\n\nDownload:\n -t, --tries=NUMBER set number of retries to NUMBER (0 unlimits)\n --retry-connrefused retry even if connection is refused\n --retry-on-http-error=ERRORS comma-separated list of HTTP errors to retry\n -O, --output-document=FILE write documents to FILE\n -nc, --no-clobber skip downloads that would download to\n existing files (overwriting them)\n --no-netrc don't try to obtain credentials from .netrc\n -c, --continue resume getting a partially-downloaded file\n --start-pos=OFFSET start downloading from zero-based position OFFSET\n --progress=TYPE select progress gauge type\n --show-progress display the progress bar in any verbosity mode\n -N, --timestamping don't re-retrieve files unless newer than\n local\n --no-if-modified-since don't use conditional if-modified-since get\n requests in timestamping mode\n --no-use-server-timestamps don't set the local file's timestamp by\n the one on the server\n -S, --server-response print server response\n --spider don't download anything\n -T, --timeout=SECONDS set all timeout values to SECONDS\n --dns-timeout=SECS set the DNS lookup timeout to SECS\n --connect-timeout=SECS set the connect timeout to SECS\n --read-timeout=SECS set the read timeout to SECS\n -w, --wait=SECONDS wait SECONDS between retrievals\n --waitretry=SECONDS wait 1..SECONDS between retries of a retrieval\n --random-wait wait from 0.5*WAIT...1.5*WAIT secs between retrievals\n --no-proxy explicitly turn off proxy\n -Q, --quota=NUMBER set retrieval quota to NUMBER\n --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local host\n --limit-rate=RATE limit download rate to RATE\n --no-dns-cache disable caching DNS lookups\n --restrict-file-names=OS restrict chars in file names to ones OS allows\n --ignore-case ignore case when matching files/directories\n -4, --inet4-only connect only to IPv4 addresses\n -6, --inet6-only connect only to IPv6 addresses\n --prefer-family=FAMILY connect first to addresses of specified family,\n one of IPv6, IPv4, or none\n --user=USER set both ftp and http user to USER\n --password=PASS set both ftp and http password to PASS\n --ask-password prompt for passwords\n --use-askpass=COMMAND specify credential handler for requesting \n username and password. If no COMMAND is \n specified the WGET_ASKPASS or the SSH_ASKPASS \n environment variable is used.\n --no-iri turn off IRI support\n --local-encoding=ENC use ENC as the local encoding for IRIs\n --remote-encoding=ENC use ENC as the default remote encoding\n --unlink remove file before clobber\n --xattr turn on storage of metadata in extended file attributes\n\nDirectories:\n -nd, --no-directories don't create directories\n -x, --force-directories force creation of directories\n -nH, --no-host-directories don't create host directories\n --protocol-directories use protocol name in directories\n -P, --directory-prefix=PREFIX save files to PREFIX/..\n --cut-dirs=NUMBER ignore NUMBER remote directory components\n\nHTTP options:\n --http-user=USER set http user to USER\n --http-password=PASS set http password to PASS\n --no-cache disallow server-cached data\n --default-page=NAME change the default page name (normally\n this is 'index.html'.)\n -E, --adjust-extension save HTML/CSS documents with proper extensions\n --ignore-length ignore 'Content-Length' header field\n --header=STRING insert STRING among the headers\n --compression=TYPE choose compression, one of auto, gzip and none. (default: none)\n --max-redirect maximum redirections allowed per page\n --proxy-user=USER set USER as proxy username\n --proxy-password=PASS set PASS as proxy password\n --referer=URL include 'Referer: URL' header in HTTP request\n --save-headers save the HTTP headers to file\n -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION\n --no-http-keep-alive disable HTTP keep-alive (persistent connections)\n --no-cookies don't use cookies\n --load-cookies=FILE load cookies from FILE before session\n --save-cookies=FILE save cookies to FILE after session\n --keep-session-cookies load and save session (non-permanent) cookies\n --post-data=STRING use the POST method; send STRING as the data\n --post-file=FILE use the POST method; send contents of FILE\n --method=HTTPMethod use method \"HTTPMethod\" in the request\n --body-data=STRING send STRING as data. --method MUST be set\n --body-file=FILE send contents of FILE. --method MUST be set\n --content-disposition honor the Content-Disposition header when\n choosing local file names (EXPERIMENTAL)\n --content-on-error output the received content on server errors\n --auth-no-challenge send Basic HTTP authentication information\n without first waiting for the server's\n challenge\n\nHTTPS (SSL/TLS) options:\n --secure-protocol=PR choose secure protocol, one of auto, SSLv2,\n SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n --https-only only follow secure HTTPS links\n --no-check-certificate don't validate the server's certificate\n --certificate=FILE client certificate file\n --certificate-type=TYPE client certificate type, PEM or DER\n --private-key=FILE private key file\n --private-key-type=TYPE private key type, PEM or DER\n --ca-certificate=FILE file with the bundle of CAs\n --ca-directory=DIR directory where hash list of CAs is stored\n --crl-file=FILE file with bundle of CRLs\n --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n of base64 encoded sha256 hashes preceded by\n 'sha256//' and separated by ';', to verify\n peer against\n\n --ciphers=STR Set the priority string (GnuTLS) or cipher list string (OpenSSL) directly.\n Use with care. This option overrides --secure-protocol.\n The format and syntax of this string depend on the specific SSL/TLS engine.\nHSTS options:\n --no-hsts disable HSTS\n --hsts-file path of HSTS database (will override default)\n\nFTP options:\n --ftp-user=USER set ftp user to USER\n --ftp-password=PASS set ftp password to PASS\n --no-remove-listing don't remove '.listing' files\n --no-glob turn off FTP file name globbing\n --no-passive-ftp disable the \"passive\" transfer mode\n --preserve-permissions preserve remote file permissions\n --retr-symlinks when recursing, get linked-to files (not dir)\n\nFTPS options:\n --ftps-implicit use implicit FTPS (default port is 990)\n --ftps-resume-ssl resume the SSL/TLS session started in the control connection when\n opening a data connection\n --ftps-clear-data-connection cipher the control channel only; all the data will be in plaintext\n --ftps-fallback-to-ftp fall back to FTP if FTPS is not supported in the target server\nWARC options:\n --warc-file=FILENAME save request/response data to a .warc.gz file\n --warc-header=STRING insert STRING into the warcinfo record\n --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n --warc-cdx write CDX index files\n --warc-dedup=FILENAME do not store records listed in this CDX file\n --no-warc-compression do not compress WARC files with GZIP\n --no-warc-digests do not calculate SHA1 digests\n --no-warc-keep-log do not store the log file in a WARC record\n --warc-tempdir=DIRECTORY location for temporary files created by the\n WARC writer\n\nRecursive download:\n -r, --recursive specify recursive download\n -l, --level=NUMBER maximum recursion depth (inf or 0 for infinite)\n --delete-after delete files locally after downloading them\n -k, --convert-links make links in downloaded HTML or CSS point to\n local files\n --convert-file-only convert the file part of the URLs only (usually known as the basename)\n --backups=N before writing file X, rotate up to N backup files\n -K, --backup-converted before converting file X, back up as X.orig\n -m, --mirror shortcut for -N -r -l inf --no-remove-listing\n -p, --page-requisites get all images, etc. needed to display HTML page\n --strict-comments turn on strict (SGML) handling of HTML comments\n\nRecursive accept/reject:\n -A, --accept=LIST comma-separated list of accepted extensions\n -R, --reject=LIST comma-separated list of rejected extensions\n --accept-regex=REGEX regex matching accepted URLs\n --reject-regex=REGEX regex matching rejected URLs\n --regex-type=TYPE regex type (posix|pcre)\n -D, --domains=LIST comma-separated list of accepted domains\n --exclude-domains=LIST comma-separated list of rejected domains\n --follow-ftp follow FTP links from HTML documents\n --follow-tags=LIST comma-separated list of followed HTML tags\n --ignore-tags=LIST comma-separated list of ignored HTML tags\n -H, --span-hosts go to foreign hosts when recursive\n -L, --relative follow relative links only\n -I, --include-directories=LIST list of allowed directories\n --trust-server-names use the name specified by the redirection\n URL's last component\n -X, --exclude-directories=LIST list of excluded directories\n -np, --no-parent don't ascend to the parent directory\n\nEmail bug reports, questions, discussions to \nand/or open issues at https://savannah.gnu.org/bugs/?func=additem&group=wget.\n","files":{},"exit":0},"-k --content-disposition -S http://localhost/corpus/alien_build_plugin_fetch_wget/dir/html_test.html":{"files":{"html_test.html":"Hello World

Hello World

\n"},"exit":0,"stdout":"","stderr":"--2021-05-12 00:10:35-- http://localhost/corpus/alien_build_plugin_fetch_wget/dir/html_test.html\nResolving localhost (localhost)... ::1, 127.0.0.1\nConnecting to localhost (localhost)|::1|:42643... failed: Connection refused.\nConnecting to localhost (localhost)|127.0.0.1|:42643... connected.\nHTTP request sent, awaiting response... \n HTTP/1.0 200 OK\n Date: Wed, 12 May 2021 06:10:35 GMT\n Server: HTTP::Server::PSGI\n Content-Type: text/html; charset=utf-8\n Content-Length: 84\n Last-Modified: Wed, 12 May 2021 04:39:27 GMT\nLength: 84 [text/html]\nSaving to: ‘html_test.html’\n\n 0K 100% 9.79M=0s\n\n2021-05-12 00:10:35 (9.79 MB/s) - ‘html_test.html’ saved [84/84]\n\nConverting links in html_test.html... nothing to do.\nConverted links in 1 files in 0 seconds.\n"}}Alien-Build-2.84/corpus/alien_build_plugin_fetch_wget/record/old.yml000644 000000 000000 00000040656 14710030646 025644 0ustar00rootroot000000 000000 --- --help: exit: 0 files: {} stderr: '' stdout: | GNU Wget 1.20.1, a non-interactive network retriever. Usage: wget [OPTION]... [URL]... Mandatory arguments to long options are mandatory for short options too. Startup: -V, --version display the version of Wget and exit -h, --help print this help -b, --background go to background after startup -e, --execute=COMMAND execute a `.wgetrc'-style command Logging and input file: -o, --output-file=FILE log messages to FILE -a, --append-output=FILE append messages to FILE -d, --debug print lots of debugging information -q, --quiet quiet (no output) -v, --verbose be verbose (this is the default) -nv, --no-verbose turn off verboseness, without being quiet --report-speed=TYPE output bandwidth as TYPE. TYPE can be bits -i, --input-file=FILE download URLs found in local or external FILE -F, --force-html treat input file as HTML -B, --base=URL resolves HTML input-file links (-i -F) relative to URL --config=FILE specify config file to use --no-config do not read any config file --rejected-log=FILE log reasons for URL rejection to FILE Download: -t, --tries=NUMBER set number of retries to NUMBER (0 unlimits) --retry-connrefused retry even if connection is refused --retry-on-http-error=ERRORS comma-separated list of HTTP errors to retry -O, --output-document=FILE write documents to FILE -nc, --no-clobber skip downloads that would download to existing files (overwriting them) --no-netrc don't try to obtain credentials from .netrc -c, --continue resume getting a partially-downloaded file --start-pos=OFFSET start downloading from zero-based position OFFSET --progress=TYPE select progress gauge type --show-progress display the progress bar in any verbosity mode -N, --timestamping don't re-retrieve files unless newer than local --no-if-modified-since don't use conditional if-modified-since get requests in timestamping mode --no-use-server-timestamps don't set the local file's timestamp by the one on the server -S, --server-response print server response --spider don't download anything -T, --timeout=SECONDS set all timeout values to SECONDS --dns-timeout=SECS set the DNS lookup timeout to SECS --connect-timeout=SECS set the connect timeout to SECS --read-timeout=SECS set the read timeout to SECS -w, --wait=SECONDS wait SECONDS between retrievals --waitretry=SECONDS wait 1..SECONDS between retries of a retrieval --random-wait wait from 0.5*WAIT...1.5*WAIT secs between retrievals --no-proxy explicitly turn off proxy -Q, --quota=NUMBER set retrieval quota to NUMBER --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local host --limit-rate=RATE limit download rate to RATE --no-dns-cache disable caching DNS lookups --restrict-file-names=OS restrict chars in file names to ones OS allows --ignore-case ignore case when matching files/directories -4, --inet4-only connect only to IPv4 addresses -6, --inet6-only connect only to IPv6 addresses --prefer-family=FAMILY connect first to addresses of specified family, one of IPv6, IPv4, or none --user=USER set both ftp and http user to USER --password=PASS set both ftp and http password to PASS --ask-password prompt for passwords --use-askpass=COMMAND specify credential handler for requesting username and password. If no COMMAND is specified the WGET_ASKPASS or the SSH_ASKPASS environment variable is used. --no-iri turn off IRI support --local-encoding=ENC use ENC as the local encoding for IRIs --remote-encoding=ENC use ENC as the default remote encoding --unlink remove file before clobber --xattr turn on storage of metadata in extended file attributes Directories: -nd, --no-directories don't create directories -x, --force-directories force creation of directories -nH, --no-host-directories don't create host directories --protocol-directories use protocol name in directories -P, --directory-prefix=PREFIX save files to PREFIX/.. --cut-dirs=NUMBER ignore NUMBER remote directory components HTTP options: --http-user=USER set http user to USER --http-password=PASS set http password to PASS --no-cache disallow server-cached data --default-page=NAME change the default page name (normally this is 'index.html'.) -E, --adjust-extension save HTML/CSS documents with proper extensions --ignore-length ignore 'Content-Length' header field --header=STRING insert STRING among the headers --compression=TYPE choose compression, one of auto, gzip and none. (default: none) --max-redirect maximum redirections allowed per page --proxy-user=USER set USER as proxy username --proxy-password=PASS set PASS as proxy password --referer=URL include 'Referer: URL' header in HTTP request --save-headers save the HTTP headers to file -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION --no-http-keep-alive disable HTTP keep-alive (persistent connections) --no-cookies don't use cookies --load-cookies=FILE load cookies from FILE before session --save-cookies=FILE save cookies to FILE after session --keep-session-cookies load and save session (non-permanent) cookies --post-data=STRING use the POST method; send STRING as the data --post-file=FILE use the POST method; send contents of FILE --method=HTTPMethod use method "HTTPMethod" in the request --body-data=STRING send STRING as data. --method MUST be set --body-file=FILE send contents of FILE. --method MUST be set --content-disposition honor the Content-Disposition header when choosing local file names (EXPERIMENTAL) --content-on-error output the received content on server errors --auth-no-challenge send Basic HTTP authentication information without first waiting for the server's challenge HTTPS (SSL/TLS) options: --secure-protocol=PR choose secure protocol, one of auto, SSLv2, SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS --https-only only follow secure HTTPS links --no-check-certificate don't validate the server's certificate --certificate=FILE client certificate file --certificate-type=TYPE client certificate type, PEM or DER --private-key=FILE private key file --private-key-type=TYPE private key type, PEM or DER --ca-certificate=FILE file with the bundle of CAs --ca-directory=DIR directory where hash list of CAs is stored --crl-file=FILE file with bundle of CRLs --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number of base64 encoded sha256 hashes preceded by 'sha256//' and separated by ';', to verify peer against --ciphers=STR Set the priority string (GnuTLS) or cipher list string (OpenSSL) directly. Use with care. This option overrides --secure-protocol. The format and syntax of this string depend on the specific SSL/TLS engine. HSTS options: --no-hsts disable HSTS --hsts-file path of HSTS database (will override default) FTP options: --ftp-user=USER set ftp user to USER --ftp-password=PASS set ftp password to PASS --no-remove-listing don't remove '.listing' files --no-glob turn off FTP file name globbing --no-passive-ftp disable the "passive" transfer mode --preserve-permissions preserve remote file permissions --retr-symlinks when recursing, get linked-to files (not dir) FTPS options: --ftps-implicit use implicit FTPS (default port is 990) --ftps-resume-ssl resume the SSL/TLS session started in the control connection when opening a data connection --ftps-clear-data-connection cipher the control channel only; all the data will be in plaintext --ftps-fallback-to-ftp fall back to FTP if FTPS is not supported in the target server WARC options: --warc-file=FILENAME save request/response data to a .warc.gz file --warc-header=STRING insert STRING into the warcinfo record --warc-max-size=NUMBER set maximum size of WARC files to NUMBER --warc-cdx write CDX index files --warc-dedup=FILENAME do not store records listed in this CDX file --no-warc-compression do not compress WARC files with GZIP --no-warc-digests do not calculate SHA1 digests --no-warc-keep-log do not store the log file in a WARC record --warc-tempdir=DIRECTORY location for temporary files created by the WARC writer Recursive download: -r, --recursive specify recursive download -l, --level=NUMBER maximum recursion depth (inf or 0 for infinite) --delete-after delete files locally after downloading them -k, --convert-links make links in downloaded HTML or CSS point to local files --convert-file-only convert the file part of the URLs only (usually known as the basename) --backups=N before writing file X, rotate up to N backup files -K, --backup-converted before converting file X, back up as X.orig -m, --mirror shortcut for -N -r -l inf --no-remove-listing -p, --page-requisites get all images, etc. needed to display HTML page --strict-comments turn on strict (SGML) handling of HTML comments Recursive accept/reject: -A, --accept=LIST comma-separated list of accepted extensions -R, --reject=LIST comma-separated list of rejected extensions --accept-regex=REGEX regex matching accepted URLs --reject-regex=REGEX regex matching rejected URLs --regex-type=TYPE regex type (posix|pcre) -D, --domains=LIST comma-separated list of accepted domains --exclude-domains=LIST comma-separated list of rejected domains --follow-ftp follow FTP links from HTML documents --follow-tags=LIST comma-separated list of followed HTML tags --ignore-tags=LIST comma-separated list of ignored HTML tags -H, --span-hosts go to foreign hosts when recursive -L, --relative follow relative links only -I, --include-directories=LIST list of allowed directories --trust-server-names use the name specified by the redirection URL's last component -X, --exclude-directories=LIST list of excluded directories -np, --no-parent don't ascend to the parent directory Email bug reports, questions, discussions to and/or open issues at https://savannah.gnu.org/bugs/?func=additem&group=wget. -k --content-disposition -S http://localhost/corpus/alien_build_plugin_fetch_wget/dir/bogus.html: exit: 8 files: {} stderr: | --2021-05-12 00:10:35-- http://localhost/corpus/alien_build_plugin_fetch_wget/dir/bogus.html Resolving localhost (localhost)... ::1, 127.0.0.1 Connecting to localhost (localhost)|::1|:42643... failed: Connection refused. Connecting to localhost (localhost)|127.0.0.1|:42643... connected. HTTP request sent, awaiting response... HTTP/1.0 404 Not Found Date: Wed, 12 May 2021 06:10:35 GMT Server: HTTP::Server::PSGI Content-Type: text/plain Content-Length: 9 2021-05-12 00:10:35 ERROR 404: Not Found. Converted links in 0 files in 0 seconds. stdout: '' -k --content-disposition -S http://localhost/corpus/alien_build_plugin_fetch_wget/dir/foo-1.01.tar: exit: 0 files: foo-1.01.tar: "content:foo-1.01\n" stderr: | --2021-05-12 00:10:35-- http://localhost/corpus/alien_build_plugin_fetch_wget/dir/foo-1.01.tar Resolving localhost (localhost)... ::1, 127.0.0.1 Connecting to localhost (localhost)|::1|:42643... failed: Connection refused. Connecting to localhost (localhost)|127.0.0.1|:42643... connected. HTTP request sent, awaiting response... HTTP/1.0 200 OK Date: Wed, 12 May 2021 06:10:35 GMT Server: HTTP::Server::PSGI Content-Type: application/x-tar Content-Length: 17 Last-Modified: Sun, 02 May 2021 15:41:03 GMT Length: 17 [application/x-tar] Saving to: ‘foo-1.01.tar’ 0K 100% 1.65M=0s 2021-05-12 00:10:35 (1.65 MB/s) - ‘foo-1.01.tar’ saved [17/17] Converted links in 0 files in 0 seconds. stdout: '' -k --content-disposition -S http://localhost/corpus/alien_build_plugin_fetch_wget/dir/html_test.html: exit: 0 files: html_test.html: "Hello World

Hello World

\n" stderr: | --2021-05-12 00:10:35-- http://localhost/corpus/alien_build_plugin_fetch_wget/dir/html_test.html Resolving localhost (localhost)... ::1, 127.0.0.1 Connecting to localhost (localhost)|::1|:42643... failed: Connection refused. Connecting to localhost (localhost)|127.0.0.1|:42643... connected. HTTP request sent, awaiting response... HTTP/1.0 200 OK Date: Wed, 12 May 2021 06:10:35 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 Content-Length: 84 Last-Modified: Wed, 12 May 2021 04:39:27 GMT Length: 84 [text/html] Saving to: ‘html_test.html’ 0K 100% 9.79M=0s 2021-05-12 00:10:35 (9.79 MB/s) - ‘html_test.html’ saved [84/84] Converting links in html_test.html... nothing to do. Converted links in 1 files in 0 seconds. stdout: '' Alien-Build-2.84/corpus/basic/000755 000000 000000 00000000000 14710030646 016107 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/basic/alienfile000644 000000 000000 00000000247 14710030646 017765 0ustar00rootroot000000 000000 use alienfile; requires 'Foo', '1.00'; configure { requires 'Early::Module', '1.234'; }; share { requires 'Bar', '2.00'; }; sys { requires 'Baz', '3.00'; }; Alien-Build-2.84/corpus/blank/000755 000000 000000 00000000000 14710030646 016115 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/blank/alienfile000644 000000 000000 00000000000 14710030646 017756 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/cmake-libpalindrome/000755 000000 000000 00000000000 14710030646 020725 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/cmake-libpalindrome/CMakeLists.txt000644 000000 000000 00000000172 14710030646 023465 0ustar00rootroot000000 000000 cmake_minimum_required (VERSION 3.0.0) project (libpalindrome C) add_subdirectory (libpalindrome) add_subdirectory (palx) Alien-Build-2.84/corpus/cmake-libpalindrome/LICENSE000644 000000 000000 00000043655 14710030646 021747 0ustar00rootroot000000 000000 This software is copyright (c) 2017 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Terms of the Perl programming language system itself a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" --- The GNU General Public License, Version 1, February 1989 --- This software is Copyright (c) 2017 by Graham Ollis. This is free software, licensed under: The GNU General Public License, Version 1, February 1989 GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! --- The Artistic License 1.0 --- This software is Copyright (c) 2017 by Graham Ollis. This is free software, licensed under: The Artistic License 1.0 The Artistic License Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: - "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. - "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. - "Copyright Holder" is whoever is named in the copyright or copyrights for the package. - "You" is you, if you're thinking about copying or distributing this Package. - "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) - "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. 7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. 8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End Alien-Build-2.84/corpus/cmake-libpalindrome/libpalindrome/000755 000000 000000 00000000000 14710030646 023546 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/cmake-libpalindrome/libpalindrome/CMakeLists.txt000644 000000 000000 00000001167 14710030646 026313 0ustar00rootroot000000 000000 add_library (palindrome SHARED palindrome.c) add_library (palindromeStatic palindrome.c) target_include_directories (palindrome PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories (palindromeStatic PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) IF (WIN32 OR CYGWIN OR MINGW) ELSE() set_target_properties(palindromeStatic PROPERTIES OUTPUT_NAME palindrome) ENDIF() IF (WIN32 OR CYGWIN OR MINGW) install(TARGETS palindrome RUNTIME DESTINATION bin) ELSE() install(TARGETS palindrome LIBRARY DESTINATION lib) ENDIF() install(TARGETS palindromeStatic ARCHIVE DESTINATION lib) install(FILES libpalindrome.h DESTINATION include) Alien-Build-2.84/corpus/cmake-libpalindrome/libpalindrome/libpalindrome.h000644 000000 000000 00000000202 14710030646 026532 0ustar00rootroot000000 000000 /* Copyright (C) 2017 Graham Ollis */ #ifndef LIBPALINDROME_H #define LIBPALINDROME_H 1 int is_palindrome(const char *); #endif Alien-Build-2.84/corpus/cmake-libpalindrome/libpalindrome/palindrome.c000644 000000 000000 00000001457 14710030646 026053 0ustar00rootroot000000 000000 /* Copyright (C) 2017 Graham Ollis */ #include #include #include #include static void copy_letters(char *buffer, const char *original) { while(*original != 0) { if(isalpha(*original)) *(buffer++) = tolower(*original); original++; } *buffer = 0; } static void copy_reverse(char *buffer, const char *original) { int i; for(i=strlen(original)-1; i >= 0; i--) *(buffer++) = original[i]; *buffer = 0; } int is_palindrome(const char *something) { char *copy1; char *copy2; int ret; size_t len; len = strlen(something); copy1 = malloc(len+1); copy2 = malloc(len+1); copy_letters(copy1, something); copy_reverse(copy2, copy1); ret = strncmp(copy1, copy2, len) == 0; free(copy1); free(copy2); return ret; } Alien-Build-2.84/corpus/cmake-libpalindrome/palx/000755 000000 000000 00000000000 14710030646 021671 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/cmake-libpalindrome/palx/CMakeLists.txt000644 000000 000000 00000000205 14710030646 024426 0ustar00rootroot000000 000000 add_executable (palx main.c) target_link_libraries (palx LINK_PUBLIC palindromeStatic) install(TARGETS palx RUNTIME DESTINATION bin) Alien-Build-2.84/corpus/cmake-libpalindrome/palx/main.c000644 000000 000000 00000000363 14710030646 022763 0ustar00rootroot000000 000000 #include int main(int argc, char *argv[]) { /* * If we do not have EXACTLY one argument, * return a usage error. */ if(argc != 2) return 1; if(is_palindrome(argv[1])) return 0; else return 2; } Alien-Build-2.84/corpus/dir/000755 000000 000000 00000000000 14710030646 015604 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/dir/file.html000644 000000 000000 00000001254 14710030646 017413 0ustar00rootroot000000 000000 Directory /home/ollisg/dev/Alien-Build/corpus/dist/

Directory listing of /home/ollisg/dev/Alien-Build/corpus/dist/

Alien-Build-2.84/corpus/dir/ftp.list000644 000000 000000 00000000647 14710030646 017301 0ustar00rootroot000000 000000 total 28 drwxr-xr-x 2 ollisg ollisg 4096 Jan 19 19:43 foo-1.00 -rw-r--r-- 1 ollisg ollisg 3584 Jan 20 06:22 foo-1.00.tar -rw-r--r-- 1 ollisg ollisg 385 Jan 19 19:43 foo-1.00.tar.Z -rw-r--r-- 1 ollisg ollisg 301 Jan 19 19:43 foo-1.00.tar.bz2 -rw-r--r-- 1 ollisg ollisg 261 Jan 20 06:22 foo-1.00.tar.gz -rw-r--r-- 1 ollisg ollisg 296 Jan 19 19:43 foo-1.00.tar.xz -rw-r--r-- 1 ollisg ollisg 584 Jan 20 06:23 foo-1.00.zip Alien-Build-2.84/corpus/dir/ftp_abs.list000644 000000 000000 00000000746 14710030646 020126 0ustar00rootroot000000 000000 total 28 drwxr-xr-x 2 ollisg ollisg 4096 Jan 19 19:43 /xyz/abc/foo-1.00 -rw-r--r-- 1 ollisg ollisg 3584 Jan 20 06:22 /xyz/abc/foo-1.00.tar -rw-r--r-- 1 ollisg ollisg 385 Jan 19 19:43 /xyz/abc/foo-1.00.tar.Z -rw-r--r-- 1 ollisg ollisg 301 Jan 19 19:43 /xyz/abc/foo-1.00.tar.bz2 -rw-r--r-- 1 ollisg ollisg 261 Jan 20 06:22 /xyz/abc/foo-1.00.tar.gz -rw-r--r-- 1 ollisg ollisg 296 Jan 19 19:43 /xyz/abc/foo-1.00.tar.xz -rw-r--r-- 1 ollisg ollisg 584 Jan 20 06:23 /xyz/abc/foo-1.00.zip Alien-Build-2.84/corpus/dir/http.html000644 000000 000000 00000004351 14710030646 017454 0ustar00rootroot000000 000000 Index of /corpus/dist/

Index of /corpus/dist/


Name Size Type Last Modified
Parent Directory
foo-1.00/4096directoryFri, 20 Jan 2017 00:43:29 GMT
foo-1.00.tar3584text/plainFri, 20 Jan 2017 11:22:09 GMT
foo-1.00.tar.Z385text/plainFri, 20 Jan 2017 00:43:29 GMT
foo-1.00.tar.bz2301text/plainFri, 20 Jan 2017 00:43:29 GMT
foo-1.00.tar.gz261application/x-gzipFri, 20 Jan 2017 11:22:51 GMT
foo-1.00.tar.xz296text/plainFri, 20 Jan 2017 00:43:29 GMT
foo%2D1%2E00%2Etgz584application/x-gzipFri, 20 Jan 2017 11:23:15 GMT
foo-1.00.zip584application/zipFri, 20 Jan 2017 11:23:15 GMT

Alien-Build-2.84/corpus/dir/http_rel.html000644 000000 000000 00000004163 14710030646 020317 0ustar00rootroot000000 000000 Index of /foo/bar/

Index of /foo/bar/


Name Size Type Last Modified
Parent Directory
foo-1.00/4096directoryFri, 20 Jan 2017 00:43:29 GMT
foo-1.00.tar3584text/plainFri, 20 Jan 2017 11:22:09 GMT
foo-1.00.tar.Z385text/plainFri, 20 Jan 2017 00:43:29 GMT
foo-1.00.tar.bz2301text/plainFri, 20 Jan 2017 00:43:29 GMT
foo-1.00.tar.gz261application/x-gzipFri, 20 Jan 2017 11:22:51 GMT
foo-1.00.tar.xz296text/plainFri, 20 Jan 2017 00:43:29 GMT
foo-1.00.tgz584application/x-gzipFri, 20 Jan 2017 11:23:15 GMT
foo-1.00.zip584application/zipFri, 20 Jan 2017 11:23:15 GMT

Alien-Build-2.84/corpus/dist/000755 000000 000000 00000000000 14710030646 015771 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/dist/foo-1.00.tar000644 000000 000000 00000007000 14710030646 017635 0ustar00rootroot000000 000000 foo-1.00/000755 001750 001750 00000000000 13040226661 013041 5ustar00ollisgollisg000000 000000 foo-1.00/configure000755 001750 001750 00000000034 13040226634 014745 0ustar00ollisgollisg000000 000000 #!/bin/sh echo "hi there"; foo-1.00/foo.c000644 001750 001750 00000000105 13040226661 013764 0ustar00ollisgollisg000000 000000 #include int main(int argc, char *argv[]) { return 0; } Alien-Build-2.84/corpus/dist/foo-1.00.tar.Z000644 000000 000000 00000000601 14710030646 020045 0ustar00rootroot000000 000000 fÞ¼ià /(\Ȱ¡Ã‡#JœH±âA7jÔà`ŒŒ08z)ò¢É‹ bÌ€A† 6bÆC%Ë@Ԩȳ§ÏŸ@Ö™C'ŒœŽ0Þ°a“fΙ •2u ÕáÉHMr¬Êµ«×¯`ÁXðà‹1oܘIs¦Žœ2aㆽ˜q#Ò5°ŽÌ[ò*Œ4R®lù2&`š1hÜ ±“¦ÜÇ%-zô Ô¦O¿^¦úõj_”‘C‹-zDˆbÒ¸y1eÆ yBš4 è )óVĤƒ N¼¸ñãÈ“+=– A„c]ŒY>ü¢ ï’ÔÎ7ëÉ06Ú$ S&â7®ç„A½ýÂÉF‘nÎìu>XÏÞnuϿŪÁFd”D‘‘Æ. áÃkªÑ¡@a¨†B„ uÆ,€ ›Q ¨ ¡[t‘‚{(oÑá–4ýÖpþÕhã8æ¨ãŽ<öèã@)äDiä‘H&I$Alien-Build-2.84/corpus/dist/foo-1.00.tar.bz2000644 000000 000000 00000000455 14710030646 020340 0ustar00rootroot000000 000000 BZh91AY&SYÍûG+ÙÖxwÿŠçŸ  0ú¶SQ¦E== m š#ÒHôdF A¥4Ÿ”jhÈÐ4A¦'¨`µ(A †@1h8£†ûøHÄL5T„=&8;‰(D³Ó>ºl/R²g ] oW0J êªZ½.®ÿu½€ô½ê¥2ZÔ*@œ´†HÚ0•³HÄÓNê„qNIYty¢ÀÁÜ»Âp™JuaoÁº™B ¥(,€¾jCcŽ÷ÜW+©½ýÛ„;û+ö4f6e@Áj’_ÌÔ$xáÓxÏðb\’—Ô#@ãYc€pS­àóAÒ‡…1³l£"“ŠÉEÜ‘N$3~ÑÊÀAlien-Build-2.84/corpus/dist/foo-1.00.tar.gz000644 000000 000000 00000000405 14710030646 020256 0ustar00rootroot000000 000000 ‹¹-Xí”ÁJÄ0†{ž§˜Ý½¨¬íd7I+¾ˆx¨Ù´ ÔÒÔ‹øîFÐ*ʲ—­²˜ï2H`&üüÓzÍJ¢ª˜"ª…ÀTY-èk@¶%N›”’!½XbÆ™&Æ!6!âûÞÝáwÇîßÿ1Õ3¡ýð_y×Ún úô=Žú¿åŸþ'MŒ×\H§å'ÿÜÿÕ¢z°® €VÆãÒXŒF½ÜÁ_Ï–™Ÿ)ÿI”jž)’óÃùg$¾ïÿZòœÿß`eêǽƛ!î­/Í-€uë.’À&tjÊ4¯’~º»¿„g@ :ŽÁ!íà%/ŠL&“9?^¡l‹›Alien-Build-2.84/corpus/dist/foo-1.00.tar.xz000644 000000 000000 00000000450 14710030646 020277 0ustar00rootroot000000 000000 ý7zXZæÖ´F!t/å£à ÿæ]3ìZ1ù¡Z(r¸\㟵²¥;áˆyr¼dËó¥¿{¸;ÃOé>Ë’ƒ,—iÌq kÝмQÈÖô ì1X€©–Ã4ôÝh¾ î!&§ <úu.³íA/Z{àôb@W†œf)/Ñov3øƒy#˜ûÿ¸ýúŸì#È&‘lÔCØß3o,VoÁ¥Ü õªÁùž¬!DO՗޲¯‘{3×Á•‡š÷²¦.#‚ª¸aH-§~T«qæÓ:\zóUk oØ:´Wûl¥é¦tÑÌŽ¨)˜¦×n$×¹¯Ÿ8ÝÉËÌ5&‚€AÞˆ±ÄgûYZAlien-Build-2.84/corpus/dist/foo-1.00.zip000644 000000 000000 00000000622 14710030646 017654 0ustar00rootroot000000 000000 PK o3J¿«& configureUT 1]XÈXux èè#!/bin/sh echo "hi there"; PKo3JJÝ-DEfoo.cUT 1]XÈXux èèSÎÌKÎ)MIU°).IÉÌ×˰ãâÊÌ+áÊMÌÌÓ2‹Ò“u’3‹´€ì²èXM®j.…¢Ô’Ò¢<k®Z.PK o3J¿«& íconfigureUT1]Xux èèPKo3JJÝ-DE¤_foo.cUT1]Xux èèPKšâAlien-Build-2.84/corpus/dist/foo-1.00/000755 000000 000000 00000000000 14710030646 017130 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/dist/foo-1.00/configure000755 000000 000000 00000000034 14710030646 021034 0ustar00rootroot000000 000000 #!/bin/sh echo "hi there"; Alien-Build-2.84/corpus/dist/foo-1.00/foo.c000644 000000 000000 00000000105 14710030646 020053 0ustar00rootroot000000 000000 #include int main(int argc, char *argv[]) { return 0; } Alien-Build-2.84/corpus/dist2/000755 000000 000000 00000000000 14710030646 016053 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/dist2/foo.tar000644 000000 000000 00000024000 14710030646 017342 0ustar00rootroot000000 000000 pax_global_header00006660000000000000000000000064135307717330014523gustar00rootroot0000000000000052 comment=0463bc1c11f0f13bfd16eb23a7b13ca2ded1eb2e foo-1.00/000077500000000000000000000000001353077173300122265ustar00rootroot00000000000000foo-1.00/foo.txt000066400000000000000000000000031353077173300135430ustar00rootroot00000000000000xx Alien-Build-2.84/corpus/lib/000755 000000 000000 00000000000 14710030646 015574 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Alien/000755 000000 000000 00000000000 14710030646 016624 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Alien/Build/000755 000000 000000 00000000000 14710030646 017663 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/000755 000000 000000 00000000000 14710030646 021121 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/Download/000755 000000 000000 00000000000 14710030646 022670 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/Download/Foo.pm000644 000000 000000 00000000727 14710030646 023757 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Download::Foo; use strict; use warnings; use Alien::Build::Plugin; sub init { my($self,$meta) = @_; $meta->prop->{check_digest} = 1; $meta->prop->{digest} = { '*' => [ FAKE => 'deadbeaf' ] }; $meta->apply_plugin('Download::Negotiate', url => 'corpus/dist/foo-1.00.tar'); $meta->apply_plugin('Extract::ArchiveTar'); $meta->apply_plugin('Test::Mock', check_digest => 1); $meta->register_hook(probe => sub { 'share' }); } 1; Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/Fetch/000755 000000 000000 00000000000 14710030646 022152 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/Fetch/Corpus.pm000644 000000 000000 00000005044 14710030646 023766 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Fetch::Corpus; use strict; use warnings; use Alien::Build::Plugin; use Carp (); use Path::Tiny (); sub _path { Path::Tiny::path(@_) } has '+url' => sub { Carp::croak "url is required"; }; has return_listing_as => 'list'; # or html or dir_listing has return_file_as => 'content'; # or path has regex => qr/\.tar\.gz$/; sub init { my($self, $meta) = @_; my $list = { type => 'list', protocol => 'https', list => [ map { my %h = ( filename => $_, url => "https://test1.test/foo/bar/baz/$_", ); \%h; } ((map { $_->basename } grep { -f $_ } _path('corpus/dist')->children), map { sprintf "foo-0.%02d.tar.gz", $_ } 0..99), ], }; $meta->prop->{start_url} = 'https://test1.test/foo/bar/baz/'; $meta->register_hook( fetch => sub { my(undef, $url) = @_; $url ||= $self->url; if($url =~ qr!^https://test1\.test/foo/bar/baz/?$!) { if($self->return_listing_as eq 'list') { return $list; } elsif($self->return_listing_as =~ /^(?:html|dir_listing)$/) { return { type => $self->return_listing_as, base => 'https://test1.test/foo/bar/baz/', content => 'test content', protocol => 'https', }; } else { die "todo: @{[ $self->return_listing_as ]}"; } } elsif($url =~ qr!^https://test1\.test/foo/bar/baz/(.*)$!) { my $path = _path "corpus/dist/$1"; if(-f $path) { my %hash = ( type => 'file', filename => $path->basename, ); if($self->return_file_as eq 'content') { $hash{content} = $path->slurp_raw; } elsif($self->return_file_as eq 'path') { $hash{path} = $path->stringify; } $hash{protocol} = 'https'; return \%hash; } else { die "bad file: @{[ $path->basename ]}"; } } else { die "bad url: $url"; } }, ); $meta->register_hook( decode => sub { return $list; } ); $meta->register_hook( prefer => sub { my(undef, $res) = @_; my @list = sort { $b->{filename} cmp $a->{filename} } grep { $_->{filename} =~ $self->regex } @{ $res->{list} }; return { type => 'list', list => \@list, }; } ); } 1; Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/Fetch/Foo.pm000644 000000 000000 00000001620 14710030646 023232 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Fetch::Foo; use strict; use warnings; use Alien::Build::Plugin; has '+versions' => undef; sub init { my($self, $meta) = @_; $meta->register_hook( probe => sub { 'share' }, ); $meta->prop->{start_url} = 'file://localhost/'; $meta->register_hook( fetch => sub { my($build, $url) = @_; $build->log("url = @{[ $url || 'undef' ]}"); if(defined $url) { my($filename) = $url =~ m{([^/]*)$}; return { type => 'file', filename => $filename, content => "data:$filename", protocol => 'file', }; } else { return { type => 'list', list => [ map { { filename => "foo-$_.tar.gz", url => "file://localhost/foo-$_.tar.gz" } } @{ $self->versions }, ], protocol => 'file', } } }, ); } 1; Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/NesAdvantage/000755 000000 000000 00000000000 14710030646 023461 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/NesAdvantage/Controller.pm000644 000000 000000 00000000306 14710030646 026141 0ustar00rootroot000000 000000 package Alien::Build::Plugin::NesAdvantage::Controller; use strict; use warnings; use Alien::Build::Plugin; sub init { my($self, $meta) = @_; $meta->prop->{nesadvantage} = 'controller'; } 1; Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/NesAdvantage/HelperTest.pm000644 000000 000000 00000000361 14710030646 026076 0ustar00rootroot000000 000000 package Alien::Build::Plugin::NesAdvantage::HelperTest; use strict; use warnings; use Alien::Build::Plugin; sub init { my($self, $meta) = @_; my $intr = $meta->interpolator; $intr->replace_helper('nes' => sub { 'advantage' }); } 1; Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/NesAdvantage/Negotiate.pm000644 000000 000000 00000000304 14710030646 025733 0ustar00rootroot000000 000000 package Alien::Build::Plugin::NesAdvantage::Negotiate; use strict; use warnings; use Alien::Build::Plugin; sub init { my($self, $meta) = @_; $meta->prop->{nesadvantage} = 'negotiate'; } 1; Alien-Build-2.84/corpus/lib/Alien/Build/Plugin/RogerRamjet.pm000644 000000 000000 00000000567 14710030646 023710 0ustar00rootroot000000 000000 package Alien::Build::Plugin::RogerRamjet; use strict; use warnings; use Alien::Build::Plugin; has 'foo' => 22; has '+bar' => sub { 'something generated' }; has 'baz' => undef; sub init { my($self, $meta) = @_; $meta->prop->{ramjet} = 'roger'; $meta->prop->{foo} = $self->foo; $meta->prop->{bar} = $self->bar; $meta->prop->{baz} = $self->baz; } 1; Alien-Build-2.84/corpus/lib/Alien/Foo.pm000644 000000 000000 00000000233 14710030646 017703 0ustar00rootroot000000 000000 package Alien::Foo; sub new { bless {}, __PACKAGE__ } sub cflags {} sub libs {} sub dynamic_libs {} sub bin_dir { '/foo/bar/baz' } 1; Alien-Build-2.84/corpus/lib/Alien/Foo1.pm000644 000000 000000 00000000122 14710030646 017761 0ustar00rootroot000000 000000 package Alien::Foo1; use strict; use warnings; use parent qw( Alien::Base ); 1; Alien-Build-2.84/corpus/lib/Alien/Foo1/000755 000000 000000 00000000000 14710030646 017430 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Alien/Foo1/ConfigData.pm000644 000000 000000 00000004616 14710030646 021774 0ustar00rootroot000000 000000 package Alien::Foo1::ConfigData; use strict; my $arrayref = eval do {local $/; } or die "Couldn't load ConfigData data: $@"; close DATA; my ($config, $features, $auto_features) = @$arrayref; sub config { $config->{$_[1]} } sub set_config { $config->{$_[1]} = $_[2] } sub set_feature { $features->{$_[1]} = 0+!!$_[2] } # Constrain to 1 or 0 sub auto_feature_names { grep !exists $features->{$_}, keys %$auto_features } sub feature_names { my @features = (keys %$features, auto_feature_names()); @features; } sub config_names { keys %$config } sub write { my $me = __FILE__; # Can't use Module::Build::Dumper here because M::B is only a # build-time prereq of this module require Data::Dumper; my $mode_orig = (stat $me)[2] & 07777; chmod($mode_orig | 0222, $me); # Make it writeable open(my $fh, '+<', $me) or die "Can't rewrite $me: $!"; seek($fh, 0, 0); while (<$fh>) { last if /^__DATA__$/; } die "Couldn't find __DATA__ token in $me" if eof($fh); seek($fh, tell($fh), 0); my $data = [$config, $features, $auto_features]; print($fh 'do{ my ' . Data::Dumper->new([$data],['x'])->Purity(1)->Dump() . '$x; }' ); truncate($fh, tell($fh)); close $fh; chmod($mode_orig, $me) or warn "Couldn't restore permissions on $me: $!"; } sub feature { my ($package, $key) = @_; return $features->{$key} if exists $features->{$key}; my $info = $auto_features->{$key} or return 0; # Under perl 5.005, each(%$foo) isn't working correctly when $foo # was reanimated with Data::Dumper and eval(). Not sure why, but # copying to a new hash seems to solve it. my %info = %$info; require Module::Build; # XXX should get rid of this while (my ($type, $prereqs) = each %info) { next if $type eq 'description' || $type eq 'recommends'; my %p = %$prereqs; # Ditto here. while (my ($modname, $spec) = each %p) { my $status = Module::Build->check_installed_status($modname, $spec); if ((!$status->{ok}) xor ($type =~ /conflicts$/)) { return 0; } if ( ! eval "require $modname; 1" ) { return 0; } } } return 1; } __DATA__ do{ my $x = [ { 'ffi_name' => undef, 'finished_installing' => 0, 'inline_auto_include' => [], 'install_type' => 'system', 'name' => 'libfoo1', 'system_provides' => {}, 'version' => '3.99999 ' }, {}, {} ]; $x; } Alien-Build-2.84/corpus/lib/Alien/Foo2.pm000644 000000 000000 00000000122 14710030646 017762 0ustar00rootroot000000 000000 package Alien::Foo2; use strict; use warnings; use parent qw( Alien::Base ); 1; Alien-Build-2.84/corpus/lib/Alien/Foo2/000755 000000 000000 00000000000 14710030646 017431 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Alien/Foo2/ConfigData.pm000644 000000 000000 00000012310 14710030646 021763 0ustar00rootroot000000 000000 package Alien::Foo2::ConfigData; use strict; my $arrayref = eval do {local $/; } or die "Couldn't load ConfigData data: $@"; close DATA; my ($config, $features, $auto_features) = @$arrayref; sub config { $config->{$_[1]} } sub set_config { $config->{$_[1]} = $_[2] } sub set_feature { $features->{$_[1]} = 0+!!$_[2] } # Constrain to 1 or 0 sub auto_feature_names { grep !exists $features->{$_}, keys %$auto_features } sub feature_names { my @features = (keys %$features, auto_feature_names()); @features; } sub config_names { keys %$config } sub write { my $me = __FILE__; # Can't use Module::Build::Dumper here because M::B is only a # build-time prereq of this module require Data::Dumper; my $mode_orig = (stat $me)[2] & 07777; chmod($mode_orig | 0222, $me); # Make it writeable open(my $fh, '+<', $me) or die "Can't rewrite $me: $!"; seek($fh, 0, 0); while (<$fh>) { last if /^__DATA__$/; } die "Couldn't find __DATA__ token in $me" if eof($fh); seek($fh, tell($fh), 0); my $data = [$config, $features, $auto_features]; print($fh 'do{ my ' . Data::Dumper->new([$data],['x'])->Purity(1)->Dump() . '$x; }' ); truncate($fh, tell($fh)); close $fh; chmod($mode_orig, $me) or warn "Couldn't restore permissions on $me: $!"; } sub feature { my ($package, $key) = @_; return $features->{$key} if exists $features->{$key}; my $info = $auto_features->{$key} or return 0; # Under perl 5.005, each(%$foo) isn't working correctly when $foo # was reanimated with Data::Dumper and eval(). Not sure why, but # copying to a new hash seems to solve it. my %info = %$info; require Module::Build; # XXX should get rid of this while (my ($type, $prereqs) = each %info) { next if $type eq 'description' || $type eq 'recommends'; my %p = %$prereqs; # Ditto here. while (my ($modname, $spec) = each %p) { my $status = Module::Build->check_installed_status($modname, $spec); if ((!$status->{ok}) xor ($type =~ /conflicts$/)) { return 0; } if ( ! eval "require $modname; 1" ) { return 0; } } } return 1; } __DATA__ do{ my $x = [ { 'alien_version' => undef, 'ffi_name' => undef, 'finished_installing' => 1, 'inline_auto_include' => [], 'install_type' => 'share', 'msys' => 0, 'name' => 'libfoo2', 'original_prefix' => '/home/user/.cpanm/work/1456299506.4021/Alien-Foo2-0.12/blib/lib/auto/share/dist/Alien-Foo2', 'pkgconfig' => { '_manual' => bless( { 'keywords' => { 'Cflags' => '-I${pcfiledir}/lib/libfoo2-3.2.1/include', 'Libs' => '-L${pcfiledir}/lib -lfoo2', 'Version' => '' }, 'package' => 'libfoo2', 'vars' => { 'pcfiledir' => '/home/user/.cpanm/work/1456299506.4021/Alien-Foo2-0.12/blib/lib/auto/share/dist/Alien-Foo2' } }, 'Alien::Base::PkgConfig' ), 'libfoo2' => bless( { 'keywords' => { 'Cflags' => '-I${includedir}', 'Description' => 'Library supporting Foreign Function Interfaces', 'Libs' => '-L${toolexeclibdir} -lfoo2', 'Name' => 'libfoo2', 'Version' => '3.2.1' }, 'package' => 'libfoo2', 'vars' => { 'exec_prefix' => '${prefix}', 'includedir' => '${libdir}/libfoo2-3.2.1/include', 'libdir' => '${exec_prefix}/lib', 'pcfiledir' => '/home/user/.cpanm/work/1456299506.4021/Alien-Foo2-0.12/_alien/libfoo2-3.2.1', 'prefix' => '/home/user/.cpanm/work/1456299506.4021/Alien-Foo2-0.12/blib/lib/auto/share/dist/Alien-Foo2', 'toolexeclibdir' => '${exec_prefix}/lib/../lib' } }, 'Alien::Base::PkgConfig' ) }, 'version' => '3.2.1', 'working_directory' => '/home/user/.cpanm/work/1456299506.4021/Alien-Foo2-0.12/_alien/libfoo2-3.2.1' }, {}, {} ]; $x; } Alien-Build-2.84/corpus/lib/Alien/SansShare.pm000644 000000 000000 00000000127 14710030646 021051 0ustar00rootroot000000 000000 package Alien::SansShare; use strict; use warnings; use parent qw( Alien::Base ); 1; Alien-Build-2.84/corpus/lib/Alien/foomake.pm000644 000000 000000 00000000344 14710030646 020604 0ustar00rootroot000000 000000 package Alien::foomake; use strict; use warnings; our $VERSION = '0.25'; sub exe { 'foomake.exe' } sub alien_helper { return { foomake1 => sub { Alien::foomake->exe }, foomake2 => 'Alien::foomake->exe', }; } 1; Alien-Build-2.84/corpus/lib/Alien/libfoo1.pm000644 000000 000000 00000000273 14710030646 020517 0ustar00rootroot000000 000000 package Alien::libfoo1; use strict; use warnings; use parent qw( Alien::Base ); sub alien_helper { return { foo1 => sub { 'bar' . (1+2) }, foo2 => '"baz" . (3+4)', }; } 1; Alien-Build-2.84/corpus/lib/Alien/libfoo2.pm000644 000000 000000 00000000273 14710030646 020520 0ustar00rootroot000000 000000 package Alien::libfoo2; use strict; use warnings; use parent qw( Alien::Base ); sub alien_helper { return { foo1 => sub { 'bar' . (1+2) }, foo2 => '"baz" . (3+4)', }; } 1; Alien-Build-2.84/corpus/lib/Alien/libfoo3.pm000644 000000 000000 00000000125 14710030646 020515 0ustar00rootroot000000 000000 package Alien::libfoo3; use strict; use warnings; use parent qw( Alien::Base ); 1; Alien-Build-2.84/corpus/lib/Alien/perlhelp.pm000644 000000 000000 00000000317 14710030646 020776 0ustar00rootroot000000 000000 package Alien::perlhelp; use strict; use warnings; use parent qw( Alien::Base ); our $VERSION = '0.25'; sub exe { $^X } sub alien_helper { return { perlhelp => sub { __PACKAGE__->exe }, }; } 1; Alien-Build-2.84/corpus/lib/Foo/000755 000000 000000 00000000000 14710030646 016317 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Foo/Bar/000755 000000 000000 00000000000 14710030646 017023 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/Foo/Bar/Baz.pm000644 000000 000000 00000000116 14710030646 020073 0ustar00rootroot000000 000000 package Foo::Bar::Baz; use strict; use warnings; our $VERSION = '1.23'; 1; Alien-Build-2.84/corpus/lib/Foo/Bar/Baz1.pm000644 000000 000000 00000000117 14710030646 020155 0ustar00rootroot000000 000000 package Foo::Bar::Baz1; use strict; use warnings; our $VERSION = '1.23'; 1; Alien-Build-2.84/corpus/lib/auto/000755 000000 000000 00000000000 14710030646 016544 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/000755 000000 000000 00000000000 14710030646 017646 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/000755 000000 000000 00000000000 14710030646 020611 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-Foo2/000755 000000 000000 00000000000 14710030646 022444 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-Foo2/README000644 000000 000000 00000000000 14710030646 023312 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-Foo2/lib/000755 000000 000000 00000000000 14710030646 023212 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-Foo2/lib/libfoo2-3.2.1/000755 000000 000000 00000000000 14710030646 025205 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-Foo2/lib/libfoo2-3.2.1/include/000755 000000 000000 00000000000 14710030646 026630 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-Foo2/lib/libfoo2-3.2.1/include/foo2.h000644 000000 000000 00000000000 14710030646 027634 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-Foo2/lib/libfoo2.a000644 000000 000000 00000000000 14710030646 024676 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo1/000755 000000 000000 00000000000 14710030646 023172 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo1/_alien/000755 000000 000000 00000000000 14710030646 024421 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo1/_alien/alien.json000644 000000 000000 00000000746 14710030646 026413 0ustar00rootroot000000 000000 { "libs" : "-lfoo ", "install_type" : "system", "version" : "1.2.3", "legacy" : { "finished_installing" : 1, "name" : "foo", "version" : "1.2.3", "original_prefix" : "/foo/bar/baz/auto/share/dist/Alien-libfoo1", "install_type" : "system" }, "cflags_static" : "-DFOO=1 -DFOO_STATIC=1 ", "cflags" : "-DFOO=1 ", "libs_static" : "-lfoo -lbar -lbaz ", "prefix" : "/foo/bar/baz/auto/share/dist/Alien-libfoo1", "arbitrary" : "one" } Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo1/_alien/for_libfoo1000644 000000 000000 00000000000 14710030646 026533 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/000755 000000 000000 00000000000 14710030646 023173 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/_alien/000755 000000 000000 00000000000 14710030646 024422 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/_alien/alien.json000644 000000 000000 00000001260 14710030646 026404 0ustar00rootroot000000 000000 { "libs" : "-L/foo/bar/baz/auto/share/dist/Alien-libfoo1/lib -lfoo ", "install_type" : "share", "version" : "2.3.4", "legacy" : { "finished_installing" : 1, "name" : "foo", "version" : "2.3.4", "original_prefix" : "/foo/bar/baz/auto/share/dist/Alien-libfoo1", "install_type" : "share" }, "cflags_static" : "-I/foo/bar/baz/auto/share/dist/Alien-libfoo1/include -DFOO=1 -DFOO_STATIC=1 ", "cflags" : "-I/foo/bar/baz/auto/share/dist/Alien-libfoo1/include -DFOO=1 ", "libs_static" : "-L/foo/bar/baz/auto/share/dist/Alien-libfoo1/lib -lfoo -lbar -lbaz ", "prefix" : "/foo/bar/baz/auto/share/dist/Alien-libfoo1", "arbitrary" : "two" } Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/_alien/for_libfoo2000644 000000 000000 00000000000 14710030646 026535 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/bin/000755 000000 000000 00000000000 14710030646 023743 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/bin/foo-config000755 000000 000000 00000000062 14710030646 025715 0ustar00rootroot000000 000000 #!/usr/bin/env perl print "hi there ho there\n"; Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/dynamic/000755 000000 000000 00000000000 14710030646 024617 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/dynamic/libfoo.so000644 000000 000000 00000000000 14710030646 026422 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/dynamic/libfoo.so.2000644 000000 000000 00000000000 14710030646 026562 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/include/000755 000000 000000 00000000000 14710030646 024616 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/include/foo.h000644 000000 000000 00000000000 14710030646 025540 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/lib/000755 000000 000000 00000000000 14710030646 023741 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/lib/libfoo.a000644 000000 000000 00000000000 14710030646 025343 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/lib/pkgconfig/000755 000000 000000 00000000000 14710030646 025710 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/lib/pkgconfig/x1.pc000644 000000 000000 00000000011 14710030646 026554 0ustar00rootroot000000 000000 Name: x1 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/share/000755 000000 000000 00000000000 14710030646 024275 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/share/pkgconfig/000755 000000 000000 00000000000 14710030646 026244 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo2/share/pkgconfig/x2.pc000644 000000 000000 00000000011 14710030646 027111 0ustar00rootroot000000 000000 Name: x2 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo3/000755 000000 000000 00000000000 14710030646 023174 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo3/_alien/000755 000000 000000 00000000000 14710030646 024423 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-libfoo3/_alien/alien.json000644 000000 000000 00000003105 14710030646 026405 0ustar00rootroot000000 000000 { "libs" : "-L/foo/bar/baz/auto/share/dist/Alien-libfoo1/lib -lfoo ", "install_type" : "share", "version" : "2.3.4", "legacy" : { "finished_installing" : 1, "name" : "foo", "version" : "2.3.4", "original_prefix" : "/foo/bar/baz/auto/share/dist/Alien-libfoo1", "install_type" : "share" }, "cflags_static" : "-I/foo/bar/baz/auto/share/dist/Alien-libfoo1/include -DFOO=1 -DFOO_STATIC=1 ", "cflags" : "-I/foo/bar/baz/auto/share/dist/Alien-libfoo1/include -DFOO=1 ", "libs_static" : "-L/foo/bar/baz/auto/share/dist/Alien-libfoo1/lib -lfoo -lbar -lbaz ", "prefix" : "/foo/bar/baz/auto/share/dist/Alien-libfoo1", "arbitrary" : "two", "alt" : { "foo1" : { "libs" : "-L/foo/bar/baz/auto/share/dist/Alien-libfoo1/lib -lfoo ", "version" : "2.3.4", "cflags_static" : "-I/foo/bar/baz/auto/share/dist/Alien-libfoo1/include -DFOO=1 -DFOO_STATIC=1 ", "cflags" : "-I/foo/bar/baz/auto/share/dist/Alien-libfoo1/include -DFOO=1 ", "libs_static" : "-L/foo/bar/baz/auto/share/dist/Alien-libfoo1/lib -lfoo -lbar -lbaz " }, "foo2" : { "libs" : "-L/foo/bar/baz/auto/share/dist/Alien-libfoo1/lib -lfoo1 ", "version" : "2.3.5", "cflags_static" : "-I/foo/bar/baz/auto/share/dist/Alien-libfoo1/include -DFOO=2 -DFOO_STATIC=2 ", "cflags" : "-I/foo/bar/baz/auto/share/dist/Alien-libfoo1/include -DFOO=2 ", "libs_static" : "-L/foo/bar/baz/auto/share/dist/Alien-libfoo1/lib -lfoo1 -lbar -lbaz ", "arbitrary" : "four" }, "foo3" : { "arbitrary" : "five" } } } Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-perlhelp/000755 000000 000000 00000000000 14710030646 023452 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-perlhelp/_alien/000755 000000 000000 00000000000 14710030646 024701 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/auto/share/dist/Alien-perlhelp/_alien/alien.json000644 000000 000000 00000000636 14710030646 026671 0ustar00rootroot000000 000000 { "libs" : "", "install_type" : "system", "version" : "1.2.3", "legacy" : { "finished_installing" : 1, "name" : "perlhelp", "version" : "1.2.3", "original_prefix" : "/foo/bar/baz/auto/share/dist/Alien-perlhelp", "install_type" : "system" }, "cflags_static" : "", "cflags" : "", "libs_static" : "", "prefix" : "/foo/bar/baz/auto/share/dist/Alien-perlhelp" } Alien-Build-2.84/corpus/lib/pkgconfig/000755 000000 000000 00000000000 14710030646 017543 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/lib/pkgconfig/foo.pc000644 000000 000000 00000000407 14710030646 020653 0ustar00rootroot000000 000000 prefix=/test exec_prefix=${prefix} libdir=${prefix}/lib includedir=${prefix}/include Name: foo Description: A testing pkg-config file Version: 1.2.3 Libs: -L${libdir} -lfoo Libs.private: -lbar -lbaz Cflags: -fPIC -I${includedir}/foo Cflags.private: -DFOO_STATIC Alien-Build-2.84/corpus/lib/pkgconfig/xor-chillout.pc000644 000000 000000 00000000360 14710030646 022517 0ustar00rootroot000000 000000 prefix=/test exec_prefix=${prefix} libdir=${prefix}/lib includedir=${prefix}/include Name: xor Description: A testing pkg-config file Version: 4.2.2 Libs: -L${libdir} -lxor-chillout Cflags: -I${includedir}/xor Cflags.private: -DXOR_STATIC Alien-Build-2.84/corpus/lib/pkgconfig/xor.pc000644 000000 000000 00000000374 14710030646 020703 0ustar00rootroot000000 000000 prefix=/test exec_prefix=${prefix} libdir=${prefix}/lib includedir=${prefix}/include Name: xor Description: A testing pkg-config file Version: 4.2.1 Libs: -L${libdir} -lxor Libs.private: -lxor1 Cflags: -I${includedir}/xor Cflags.private: -DXOR_STATIC Alien-Build-2.84/corpus/pkgconfig/000755 000000 000000 00000000000 14710030646 016775 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/pkgconfig/libbar1.pc000644 000000 000000 00000000516 14710030646 020637 0ustar00rootroot000000 000000 prefix=/home/user/opt/libfoo1/git-06747d318761884e70dfa433a9548219fd779d7d exec_prefix=${prefix} libdir=${exec_prefix}/lib toolexeclibdir=${exec_prefix}/lib/../lib includedir=${libdir}/libfoo1-3.99999/include Name: libfoo1 Description: Library supporting Foreign Function Interfaces Version: 3.99999 Libs: -lbar1 Cflags: -DFOO=stuff Alien-Build-2.84/corpus/pkgconfig/libfoo1.pc000644 000000 000000 00000000516 14710030646 020656 0ustar00rootroot000000 000000 prefix=/home/user/opt/libfoo1/git-06747d318761884e70dfa433a9548219fd779d7d exec_prefix=${prefix} libdir=${exec_prefix}/lib toolexeclibdir=${exec_prefix}/lib/../lib includedir=${libdir}/libfoo1-3.99999/include Name: libfoo1 Description: Library supporting Foreign Function Interfaces Version: 3.99999 Libs: -lfoo1 Cflags: -DFOO=stuff Alien-Build-2.84/corpus/vcpkg/000755 000000 000000 00000000000 14710030646 016140 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r1/000755 000000 000000 00000000000 14710030646 016462 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r1/.vcpkg-root000644 000000 000000 00000000000 14710030646 020544 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r1/installed/000755 000000 000000 00000000000 14710030646 020441 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r1/installed/x64-windows/000755 000000 000000 00000000000 14710030646 022552 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r1/installed/x64-windows/debug/000755 000000 000000 00000000000 14710030646 023640 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r1/installed/x64-windows/debug/lib/000755 000000 000000 00000000000 14710030646 024406 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r1/installed/x64-windows/debug/lib/foo.lib000644 000000 000000 00000000014 14710030646 025654 0ustar00rootroot000000 000000 faux dbg fooAlien-Build-2.84/corpus/vcpkg/r1/installed/x64-windows/include/000755 000000 000000 00000000000 14710030646 024175 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r1/installed/x64-windows/include/foo.h000644 000000 000000 00000000015 14710030646 025125 0ustar00rootroot000000 000000 #define FOO 1Alien-Build-2.84/corpus/vcpkg/r1/installed/x64-windows/lib/000755 000000 000000 00000000000 14710030646 023320 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r1/installed/x64-windows/lib/foo.lib000644 000000 000000 00000000014 14710030646 024566 0ustar00rootroot000000 000000 faux opt fooAlien-Build-2.84/corpus/vcpkg/r2/000755 000000 000000 00000000000 14710030646 016463 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/.vcpkg-root000644 000000 000000 00000000000 14710030646 020545 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/000755 000000 000000 00000000000 14710030646 020442 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/000755 000000 000000 00000000000 14710030646 021554 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/000755 000000 000000 00000000000 14710030646 022507 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/bzip2_1.0.6-5_x64-windows.list000644 000000 000000 00000001124 14710030646 027505 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/bz2.dll x64-windows/bin/bz2.pdb x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/bz2d.dll x64-windows/debug/bin/bz2d.pdb x64-windows/debug/lib/ x64-windows/debug/lib/bz2d.lib x64-windows/include/ x64-windows/include/bzlib.h x64-windows/lib/ x64-windows/lib/bz2.lib x64-windows/share/ x64-windows/share/bzip2/ x64-windows/share/bzip2/copyright x64-windows/share/bzip2/usage x64-windows/share/bzip2/vcpkg_abi_info.txt x64-windows/tools/ x64-windows/tools/bzip2/ x64-windows/tools/bzip2/bzip2.exe x64-windows/tools/bzip2/bzip2recover.exe Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/curl_7.68.0-1_x64-windows.list000644 000000 000000 00000002320 14710030646 027515 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/libcurl.dll x64-windows/bin/libcurl.pdb x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/libcurl-d.dll x64-windows/debug/bin/libcurl-d.pdb x64-windows/debug/lib/ x64-windows/debug/lib/libcurl-d.lib x64-windows/debug/lib/pkgconfig/ x64-windows/debug/lib/pkgconfig/libcurl.pc x64-windows/include/ x64-windows/include/curl/ x64-windows/include/curl/curl.h x64-windows/include/curl/curlver.h x64-windows/include/curl/easy.h x64-windows/include/curl/mprintf.h x64-windows/include/curl/multi.h x64-windows/include/curl/stdcheaders.h x64-windows/include/curl/system.h x64-windows/include/curl/typecheck-gcc.h x64-windows/include/curl/urlapi.h x64-windows/lib/ x64-windows/lib/libcurl.lib x64-windows/lib/pkgconfig/ x64-windows/lib/pkgconfig/libcurl.pc x64-windows/share/ x64-windows/share/curl/ x64-windows/share/curl/CURLConfig.cmake x64-windows/share/curl/CURLConfigVersion.cmake x64-windows/share/curl/CURLTargets-debug.cmake x64-windows/share/curl/CURLTargets-release.cmake x64-windows/share/curl/CURLTargets.cmake x64-windows/share/curl/copyright x64-windows/share/curl/curl-config x64-windows/share/curl/vcpkg-cmake-wrapper.cmake x64-windows/share/curl/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/libarchive_3.4.1_x64-windows.list000644 000000 000000 00000001011 14710030646 030421 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/archive.dll x64-windows/bin/archive.pdb x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/archive.dll x64-windows/debug/bin/archive.pdb x64-windows/debug/lib/ x64-windows/debug/lib/archive.lib x64-windows/include/ x64-windows/include/archive.h x64-windows/include/archive_entry.h x64-windows/lib/ x64-windows/lib/archive.lib x64-windows/share/ x64-windows/share/libarchive/ x64-windows/share/libarchive/copyright x64-windows/share/libarchive/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/libffi_3.3_x64-windows.list000644 000000 000000 00000001343 14710030646 027414 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/libffi.dll x64-windows/bin/libffi.pdb x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/libffi.dll x64-windows/debug/bin/libffi.pdb x64-windows/debug/lib/ x64-windows/debug/lib/libffi.lib x64-windows/include/ x64-windows/include/ffi.h x64-windows/include/ffitarget.h x64-windows/lib/ x64-windows/lib/libffi.lib x64-windows/share/ x64-windows/share/libffi/ x64-windows/share/libffi/copyright x64-windows/share/libffi/libffiConfig.cmake x64-windows/share/libffi/libffiConfigVersion.cmake x64-windows/share/libffi/libffiTargets-debug.cmake x64-windows/share/libffi/libffiTargets-release.cmake x64-windows/share/libffi/libffiTargets.cmake x64-windows/share/libffi/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/libffi_3.3_x86-windows.list000644 000000 000000 00000001343 14710030646 027420 0ustar00rootroot000000 000000 x86-windows/ x86-windows/bin/ x86-windows/bin/libffi.dll x86-windows/bin/libffi.pdb x86-windows/debug/ x86-windows/debug/bin/ x86-windows/debug/bin/libffi.dll x86-windows/debug/bin/libffi.pdb x86-windows/debug/lib/ x86-windows/debug/lib/libffi.lib x86-windows/include/ x86-windows/include/ffi.h x86-windows/include/ffitarget.h x86-windows/lib/ x86-windows/lib/libffi.lib x86-windows/share/ x86-windows/share/libffi/ x86-windows/share/libffi/copyright x86-windows/share/libffi/libffiConfig.cmake x86-windows/share/libffi/libffiConfigVersion.cmake x86-windows/share/libffi/libffiTargets-debug.cmake x86-windows/share/libffi/libffiTargets-release.cmake x86-windows/share/libffi/libffiTargets.cmake x86-windows/share/libffi/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/libiconv_1.16-1_x64-windows.list000644 000000 000000 00000001707 14710030646 030212 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/libcharset.dll x64-windows/bin/libcharset.pdb x64-windows/bin/libiconv.dll x64-windows/bin/libiconv.pdb x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/libcharset.dll x64-windows/debug/bin/libcharset.pdb x64-windows/debug/bin/libiconv.dll x64-windows/debug/bin/libiconv.pdb x64-windows/debug/lib/ x64-windows/debug/lib/libcharset.lib x64-windows/debug/lib/libiconv.lib x64-windows/include/ x64-windows/include/iconv.h x64-windows/include/localcharset.h x64-windows/lib/ x64-windows/lib/libcharset.lib x64-windows/lib/libiconv.lib x64-windows/share/ x64-windows/share/libiconv/ x64-windows/share/libiconv/copyright x64-windows/share/libiconv/vcpkg_abi_info.txt x64-windows/share/unofficial-iconv/ x64-windows/share/unofficial-iconv/unofficial-iconv-config-debug.cmake x64-windows/share/unofficial-iconv/unofficial-iconv-config-release.cmake x64-windows/share/unofficial-iconv/unofficial-iconv-config.cmake Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/liblzma_5.2.4-4_x64-windows.list000644 000000 000000 00000002220 14710030646 030112 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/lzma.dll x64-windows/bin/lzma.pdb x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/lzmad.dll x64-windows/debug/bin/lzmad.pdb x64-windows/debug/lib/ x64-windows/debug/lib/lzmad.lib x64-windows/include/ x64-windows/include/lzma.h x64-windows/include/lzma/ x64-windows/include/lzma/base.h x64-windows/include/lzma/bcj.h x64-windows/include/lzma/block.h x64-windows/include/lzma/check.h x64-windows/include/lzma/container.h x64-windows/include/lzma/delta.h x64-windows/include/lzma/filter.h x64-windows/include/lzma/hardware.h x64-windows/include/lzma/index.h x64-windows/include/lzma/index_hash.h x64-windows/include/lzma/lzma12.h x64-windows/include/lzma/stream_flags.h x64-windows/include/lzma/version.h x64-windows/include/lzma/vli.h x64-windows/lib/ x64-windows/lib/lzma.lib x64-windows/share/ x64-windows/share/liblzma/ x64-windows/share/liblzma/LibLZMAConfig-debug.cmake x64-windows/share/liblzma/LibLZMAConfig-release.cmake x64-windows/share/liblzma/LibLZMAConfig.cmake x64-windows/share/liblzma/copyright x64-windows/share/liblzma/vcpkg-cmake-wrapper.cmake x64-windows/share/liblzma/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/libressl_2.9.1-2_x64-windows.list000644 000000 000000 00000000152 14710030646 030300 0ustar00rootroot000000 000000 x64-windows/ x64-windows/share/ x64-windows/share/libressl/ x64-windows/share/libressl/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/libxml2_2.9.9-5_x64-windows.list000644 000000 000000 00000004434 14710030646 030054 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/libxml2.dll x64-windows/bin/libxml2.pdb x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/libxml2.dll x64-windows/debug/bin/libxml2.pdb x64-windows/debug/lib/ x64-windows/debug/lib/libxml2.lib x64-windows/include/ x64-windows/include/libxml/ x64-windows/include/libxml/DOCBparser.h x64-windows/include/libxml/HTMLparser.h x64-windows/include/libxml/HTMLtree.h x64-windows/include/libxml/SAX.h x64-windows/include/libxml/SAX2.h x64-windows/include/libxml/c14n.h x64-windows/include/libxml/catalog.h x64-windows/include/libxml/chvalid.h x64-windows/include/libxml/debugXML.h x64-windows/include/libxml/dict.h x64-windows/include/libxml/encoding.h x64-windows/include/libxml/entities.h x64-windows/include/libxml/globals.h x64-windows/include/libxml/hash.h x64-windows/include/libxml/list.h x64-windows/include/libxml/nanoftp.h x64-windows/include/libxml/nanohttp.h x64-windows/include/libxml/parser.h x64-windows/include/libxml/parserInternals.h x64-windows/include/libxml/pattern.h x64-windows/include/libxml/relaxng.h x64-windows/include/libxml/schemasInternals.h x64-windows/include/libxml/schematron.h x64-windows/include/libxml/threads.h x64-windows/include/libxml/tree.h x64-windows/include/libxml/uri.h x64-windows/include/libxml/valid.h x64-windows/include/libxml/xinclude.h x64-windows/include/libxml/xlink.h x64-windows/include/libxml/xmlIO.h x64-windows/include/libxml/xmlautomata.h x64-windows/include/libxml/xmlerror.h x64-windows/include/libxml/xmlexports.h x64-windows/include/libxml/xmlmemory.h x64-windows/include/libxml/xmlmodule.h x64-windows/include/libxml/xmlreader.h x64-windows/include/libxml/xmlregexp.h x64-windows/include/libxml/xmlsave.h x64-windows/include/libxml/xmlschemas.h x64-windows/include/libxml/xmlschemastypes.h x64-windows/include/libxml/xmlstring.h x64-windows/include/libxml/xmlunicode.h x64-windows/include/libxml/xmlversion.h x64-windows/include/libxml/xmlwin32version.h x64-windows/include/libxml/xmlwriter.h x64-windows/include/libxml/xpath.h x64-windows/include/libxml/xpathInternals.h x64-windows/include/libxml/xpointer.h x64-windows/lib/ x64-windows/lib/libxml2.lib x64-windows/share/ x64-windows/share/libxml2/ x64-windows/share/libxml2/copyright x64-windows/share/libxml2/usage x64-windows/share/libxml2/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/lz4_1.9.2_x64-windows.list000644 000000 000000 00000001230 14710030646 027031 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/lz4.dll x64-windows/bin/lz4.pdb x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/lz4d.dll x64-windows/debug/bin/lz4d.pdb x64-windows/debug/lib/ x64-windows/debug/lib/lz4d.lib x64-windows/include/ x64-windows/include/lz4.h x64-windows/include/lz4frame.h x64-windows/include/lz4frame_static.h x64-windows/include/lz4hc.h x64-windows/lib/ x64-windows/lib/lz4.lib x64-windows/share/ x64-windows/share/lz4/ x64-windows/share/lz4/copyright x64-windows/share/lz4/lz4Config-debug.cmake x64-windows/share/lz4/lz4Config-release.cmake x64-windows/share/lz4/lz4Config.cmake x64-windows/share/lz4/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/lzo_2.10-4_x64-windows.list000644 000000 000000 00000001540 14710030646 027202 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/lzo2.dll x64-windows/bin/lzo2.pdb x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/lzo2.dll x64-windows/debug/bin/lzo2.pdb x64-windows/debug/lib/ x64-windows/debug/lib/lzo2.lib x64-windows/include/ x64-windows/include/lzo/ x64-windows/include/lzo/lzo1.h x64-windows/include/lzo/lzo1a.h x64-windows/include/lzo/lzo1b.h x64-windows/include/lzo/lzo1c.h x64-windows/include/lzo/lzo1f.h x64-windows/include/lzo/lzo1x.h x64-windows/include/lzo/lzo1y.h x64-windows/include/lzo/lzo1z.h x64-windows/include/lzo/lzo2a.h x64-windows/include/lzo/lzo_asm.h x64-windows/include/lzo/lzoconf.h x64-windows/include/lzo/lzodefs.h x64-windows/include/lzo/lzoutil.h x64-windows/lib/ x64-windows/lib/lzo2.lib x64-windows/share/ x64-windows/share/lzo/ x64-windows/share/lzo/copyright x64-windows/share/lzo/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/openssl-windows_1.1.1d-1_x64-windows.list000644 000000 000000 00001410017 14710030646 031774 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/c_rehash.pl x64-windows/bin/libcrypto-1_1-x64.dll x64-windows/bin/libcrypto-1_1-x64.pdb x64-windows/bin/libssl-1_1-x64.dll x64-windows/bin/libssl-1_1-x64.pdb x64-windows/bin/openssl.pdb x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/c_rehash.pl x64-windows/debug/bin/libcrypto-1_1-x64.dll x64-windows/debug/bin/libcrypto-1_1-x64.pdb x64-windows/debug/bin/libssl-1_1-x64.dll x64-windows/debug/bin/libssl-1_1-x64.pdb x64-windows/debug/bin/openssl.pdb x64-windows/debug/html/ x64-windows/debug/html/man1/ x64-windows/debug/html/man1/CA.pl.html x64-windows/debug/html/man1/asn1parse.html x64-windows/debug/html/man1/c_rehash.html x64-windows/debug/html/man1/ca.html x64-windows/debug/html/man1/ciphers.html x64-windows/debug/html/man1/cms.html x64-windows/debug/html/man1/crl.html x64-windows/debug/html/man1/crl2pkcs7.html x64-windows/debug/html/man1/dgst.html x64-windows/debug/html/man1/dhparam.html x64-windows/debug/html/man1/dsa.html x64-windows/debug/html/man1/dsaparam.html x64-windows/debug/html/man1/ec.html x64-windows/debug/html/man1/ecparam.html x64-windows/debug/html/man1/enc.html x64-windows/debug/html/man1/engine.html x64-windows/debug/html/man1/errstr.html x64-windows/debug/html/man1/gendsa.html x64-windows/debug/html/man1/genpkey.html x64-windows/debug/html/man1/genrsa.html x64-windows/debug/html/man1/list.html x64-windows/debug/html/man1/nseq.html x64-windows/debug/html/man1/ocsp.html x64-windows/debug/html/man1/openssl-asn1parse.html x64-windows/debug/html/man1/openssl-c_rehash.html x64-windows/debug/html/man1/openssl-ca.html x64-windows/debug/html/man1/openssl-ciphers.html x64-windows/debug/html/man1/openssl-cms.html x64-windows/debug/html/man1/openssl-crl.html x64-windows/debug/html/man1/openssl-crl2pkcs7.html x64-windows/debug/html/man1/openssl-dgst.html x64-windows/debug/html/man1/openssl-dhparam.html x64-windows/debug/html/man1/openssl-dsa.html x64-windows/debug/html/man1/openssl-dsaparam.html x64-windows/debug/html/man1/openssl-ec.html x64-windows/debug/html/man1/openssl-ecparam.html x64-windows/debug/html/man1/openssl-enc.html x64-windows/debug/html/man1/openssl-engine.html x64-windows/debug/html/man1/openssl-errstr.html x64-windows/debug/html/man1/openssl-gendsa.html x64-windows/debug/html/man1/openssl-genpkey.html x64-windows/debug/html/man1/openssl-genrsa.html x64-windows/debug/html/man1/openssl-list.html x64-windows/debug/html/man1/openssl-nseq.html x64-windows/debug/html/man1/openssl-ocsp.html x64-windows/debug/html/man1/openssl-passwd.html x64-windows/debug/html/man1/openssl-pkcs12.html x64-windows/debug/html/man1/openssl-pkcs7.html x64-windows/debug/html/man1/openssl-pkcs8.html x64-windows/debug/html/man1/openssl-pkey.html x64-windows/debug/html/man1/openssl-pkeyparam.html x64-windows/debug/html/man1/openssl-pkeyutl.html x64-windows/debug/html/man1/openssl-prime.html x64-windows/debug/html/man1/openssl-rand.html x64-windows/debug/html/man1/openssl-rehash.html x64-windows/debug/html/man1/openssl-req.html x64-windows/debug/html/man1/openssl-rsa.html x64-windows/debug/html/man1/openssl-rsautl.html x64-windows/debug/html/man1/openssl-s_client.html x64-windows/debug/html/man1/openssl-s_server.html x64-windows/debug/html/man1/openssl-s_time.html x64-windows/debug/html/man1/openssl-sess_id.html x64-windows/debug/html/man1/openssl-smime.html x64-windows/debug/html/man1/openssl-speed.html x64-windows/debug/html/man1/openssl-spkac.html x64-windows/debug/html/man1/openssl-srp.html x64-windows/debug/html/man1/openssl-storeutl.html x64-windows/debug/html/man1/openssl-ts.html x64-windows/debug/html/man1/openssl-tsget.html x64-windows/debug/html/man1/openssl-verify.html x64-windows/debug/html/man1/openssl-version.html x64-windows/debug/html/man1/openssl-x509.html x64-windows/debug/html/man1/openssl.html x64-windows/debug/html/man1/passwd.html x64-windows/debug/html/man1/pkcs12.html x64-windows/debug/html/man1/pkcs7.html x64-windows/debug/html/man1/pkcs8.html x64-windows/debug/html/man1/pkey.html x64-windows/debug/html/man1/pkeyparam.html x64-windows/debug/html/man1/pkeyutl.html x64-windows/debug/html/man1/prime.html x64-windows/debug/html/man1/rand.html x64-windows/debug/html/man1/rehash.html x64-windows/debug/html/man1/req.html x64-windows/debug/html/man1/rsa.html x64-windows/debug/html/man1/rsautl.html x64-windows/debug/html/man1/s_client.html x64-windows/debug/html/man1/s_server.html x64-windows/debug/html/man1/s_time.html x64-windows/debug/html/man1/sess_id.html x64-windows/debug/html/man1/smime.html x64-windows/debug/html/man1/speed.html x64-windows/debug/html/man1/spkac.html x64-windows/debug/html/man1/srp.html x64-windows/debug/html/man1/storeutl.html x64-windows/debug/html/man1/ts.html x64-windows/debug/html/man1/tsget.html x64-windows/debug/html/man1/verify.html x64-windows/debug/html/man1/version.html x64-windows/debug/html/man1/x509.html x64-windows/debug/html/man3/ x64-windows/debug/html/man3/ACCESS_DESCRIPTION_free.html x64-windows/debug/html/man3/ACCESS_DESCRIPTION_new.html x64-windows/debug/html/man3/ADMISSIONS.html x64-windows/debug/html/man3/ADMISSIONS_free.html x64-windows/debug/html/man3/ADMISSIONS_get0_admissionAuthority.html x64-windows/debug/html/man3/ADMISSIONS_get0_namingAuthority.html x64-windows/debug/html/man3/ADMISSIONS_get0_professionInfos.html x64-windows/debug/html/man3/ADMISSIONS_new.html x64-windows/debug/html/man3/ADMISSIONS_set0_admissionAuthority.html x64-windows/debug/html/man3/ADMISSIONS_set0_namingAuthority.html x64-windows/debug/html/man3/ADMISSIONS_set0_professionInfos.html x64-windows/debug/html/man3/ADMISSION_SYNTAX.html x64-windows/debug/html/man3/ADMISSION_SYNTAX_free.html x64-windows/debug/html/man3/ADMISSION_SYNTAX_get0_admissionAuthority.html x64-windows/debug/html/man3/ADMISSION_SYNTAX_get0_contentsOfAdmissions.html x64-windows/debug/html/man3/ADMISSION_SYNTAX_new.html x64-windows/debug/html/man3/ADMISSION_SYNTAX_set0_admissionAuthority.html x64-windows/debug/html/man3/ADMISSION_SYNTAX_set0_contentsOfAdmissions.html x64-windows/debug/html/man3/ASIdOrRange_free.html x64-windows/debug/html/man3/ASIdOrRange_new.html x64-windows/debug/html/man3/ASIdentifierChoice_free.html x64-windows/debug/html/man3/ASIdentifierChoice_new.html x64-windows/debug/html/man3/ASIdentifiers_free.html x64-windows/debug/html/man3/ASIdentifiers_new.html x64-windows/debug/html/man3/ASN1_ENUMERATED_get.html x64-windows/debug/html/man3/ASN1_ENUMERATED_get_int64.html x64-windows/debug/html/man3/ASN1_ENUMERATED_set.html x64-windows/debug/html/man3/ASN1_ENUMERATED_set_int64.html x64-windows/debug/html/man3/ASN1_ENUMERATED_to_BN.html x64-windows/debug/html/man3/ASN1_GENERALIZEDTIME_adj.html x64-windows/debug/html/man3/ASN1_GENERALIZEDTIME_check.html x64-windows/debug/html/man3/ASN1_GENERALIZEDTIME_print.html x64-windows/debug/html/man3/ASN1_GENERALIZEDTIME_set.html x64-windows/debug/html/man3/ASN1_GENERALIZEDTIME_set_string.html x64-windows/debug/html/man3/ASN1_INTEGER_get.html x64-windows/debug/html/man3/ASN1_INTEGER_get_int64.html x64-windows/debug/html/man3/ASN1_INTEGER_get_uint64.html x64-windows/debug/html/man3/ASN1_INTEGER_set.html x64-windows/debug/html/man3/ASN1_INTEGER_set_int64.html x64-windows/debug/html/man3/ASN1_INTEGER_set_uint64.html x64-windows/debug/html/man3/ASN1_INTEGER_to_BN.html x64-windows/debug/html/man3/ASN1_ITEM.html x64-windows/debug/html/man3/ASN1_ITEM_get.html x64-windows/debug/html/man3/ASN1_ITEM_lookup.html x64-windows/debug/html/man3/ASN1_OBJECT_free.html x64-windows/debug/html/man3/ASN1_OBJECT_new.html x64-windows/debug/html/man3/ASN1_STRING_TABLE.html x64-windows/debug/html/man3/ASN1_STRING_TABLE_add.html x64-windows/debug/html/man3/ASN1_STRING_TABLE_cleanup.html x64-windows/debug/html/man3/ASN1_STRING_TABLE_get.html x64-windows/debug/html/man3/ASN1_STRING_cmp.html x64-windows/debug/html/man3/ASN1_STRING_data.html x64-windows/debug/html/man3/ASN1_STRING_dup.html x64-windows/debug/html/man3/ASN1_STRING_free.html x64-windows/debug/html/man3/ASN1_STRING_get0_data.html x64-windows/debug/html/man3/ASN1_STRING_length.html x64-windows/debug/html/man3/ASN1_STRING_new.html x64-windows/debug/html/man3/ASN1_STRING_print.html x64-windows/debug/html/man3/ASN1_STRING_print_ex.html x64-windows/debug/html/man3/ASN1_STRING_print_ex_fp.html x64-windows/debug/html/man3/ASN1_STRING_set.html x64-windows/debug/html/man3/ASN1_STRING_to_UTF8.html x64-windows/debug/html/man3/ASN1_STRING_type.html x64-windows/debug/html/man3/ASN1_STRING_type_new.html x64-windows/debug/html/man3/ASN1_TIME_adj.html x64-windows/debug/html/man3/ASN1_TIME_check.html x64-windows/debug/html/man3/ASN1_TIME_cmp_time_t.html x64-windows/debug/html/man3/ASN1_TIME_compare.html x64-windows/debug/html/man3/ASN1_TIME_diff.html x64-windows/debug/html/man3/ASN1_TIME_normalize.html x64-windows/debug/html/man3/ASN1_TIME_print.html x64-windows/debug/html/man3/ASN1_TIME_set.html x64-windows/debug/html/man3/ASN1_TIME_set_string.html x64-windows/debug/html/man3/ASN1_TIME_set_string_X509.html x64-windows/debug/html/man3/ASN1_TIME_to_generalizedtime.html x64-windows/debug/html/man3/ASN1_TIME_to_tm.html x64-windows/debug/html/man3/ASN1_TYPE_cmp.html x64-windows/debug/html/man3/ASN1_TYPE_get.html x64-windows/debug/html/man3/ASN1_TYPE_pack_sequence.html x64-windows/debug/html/man3/ASN1_TYPE_set.html x64-windows/debug/html/man3/ASN1_TYPE_set1.html x64-windows/debug/html/man3/ASN1_TYPE_unpack_sequence.html x64-windows/debug/html/man3/ASN1_UTCTIME_adj.html x64-windows/debug/html/man3/ASN1_UTCTIME_check.html x64-windows/debug/html/man3/ASN1_UTCTIME_cmp_time_t.html x64-windows/debug/html/man3/ASN1_UTCTIME_print.html x64-windows/debug/html/man3/ASN1_UTCTIME_set.html x64-windows/debug/html/man3/ASN1_UTCTIME_set_string.html x64-windows/debug/html/man3/ASN1_add_oid_module.html x64-windows/debug/html/man3/ASN1_generate_nconf.html x64-windows/debug/html/man3/ASN1_generate_v3.html x64-windows/debug/html/man3/ASN1_tag2str.html x64-windows/debug/html/man3/ASRange_free.html x64-windows/debug/html/man3/ASRange_new.html x64-windows/debug/html/man3/ASYNC_WAIT_CTX_clear_fd.html x64-windows/debug/html/man3/ASYNC_WAIT_CTX_free.html x64-windows/debug/html/man3/ASYNC_WAIT_CTX_get_all_fds.html x64-windows/debug/html/man3/ASYNC_WAIT_CTX_get_changed_fds.html x64-windows/debug/html/man3/ASYNC_WAIT_CTX_get_fd.html x64-windows/debug/html/man3/ASYNC_WAIT_CTX_new.html x64-windows/debug/html/man3/ASYNC_WAIT_CTX_set_wait_fd.html x64-windows/debug/html/man3/ASYNC_block_pause.html x64-windows/debug/html/man3/ASYNC_cleanup_thread.html x64-windows/debug/html/man3/ASYNC_get_current_job.html x64-windows/debug/html/man3/ASYNC_get_wait_ctx.html x64-windows/debug/html/man3/ASYNC_init_thread.html x64-windows/debug/html/man3/ASYNC_is_capable.html x64-windows/debug/html/man3/ASYNC_pause_job.html x64-windows/debug/html/man3/ASYNC_start_job.html x64-windows/debug/html/man3/ASYNC_unblock_pause.html x64-windows/debug/html/man3/AUTHORITY_INFO_ACCESS_free.html x64-windows/debug/html/man3/AUTHORITY_INFO_ACCESS_new.html x64-windows/debug/html/man3/AUTHORITY_KEYID_free.html x64-windows/debug/html/man3/AUTHORITY_KEYID_new.html x64-windows/debug/html/man3/BASIC_CONSTRAINTS_free.html x64-windows/debug/html/man3/BASIC_CONSTRAINTS_new.html x64-windows/debug/html/man3/BF_cbc_encrypt.html x64-windows/debug/html/man3/BF_cfb64_encrypt.html x64-windows/debug/html/man3/BF_decrypt.html x64-windows/debug/html/man3/BF_ecb_encrypt.html x64-windows/debug/html/man3/BF_encrypt.html x64-windows/debug/html/man3/BF_ofb64_encrypt.html x64-windows/debug/html/man3/BF_options.html x64-windows/debug/html/man3/BF_set_key.html x64-windows/debug/html/man3/BIO_ADDR.html x64-windows/debug/html/man3/BIO_ADDRINFO.html x64-windows/debug/html/man3/BIO_ADDRINFO_address.html x64-windows/debug/html/man3/BIO_ADDRINFO_family.html x64-windows/debug/html/man3/BIO_ADDRINFO_free.html x64-windows/debug/html/man3/BIO_ADDRINFO_next.html x64-windows/debug/html/man3/BIO_ADDRINFO_protocol.html x64-windows/debug/html/man3/BIO_ADDRINFO_socktype.html x64-windows/debug/html/man3/BIO_ADDR_clear.html x64-windows/debug/html/man3/BIO_ADDR_family.html x64-windows/debug/html/man3/BIO_ADDR_free.html x64-windows/debug/html/man3/BIO_ADDR_hostname_string.html x64-windows/debug/html/man3/BIO_ADDR_new.html x64-windows/debug/html/man3/BIO_ADDR_path_string.html x64-windows/debug/html/man3/BIO_ADDR_rawaddress.html x64-windows/debug/html/man3/BIO_ADDR_rawmake.html x64-windows/debug/html/man3/BIO_ADDR_rawport.html x64-windows/debug/html/man3/BIO_ADDR_service_string.html x64-windows/debug/html/man3/BIO_accept_ex.html x64-windows/debug/html/man3/BIO_append_filename.html x64-windows/debug/html/man3/BIO_bind.html x64-windows/debug/html/man3/BIO_callback_ctrl.html x64-windows/debug/html/man3/BIO_callback_fn.html x64-windows/debug/html/man3/BIO_callback_fn_ex.html x64-windows/debug/html/man3/BIO_closesocket.html x64-windows/debug/html/man3/BIO_connect.html x64-windows/debug/html/man3/BIO_ctrl.html x64-windows/debug/html/man3/BIO_ctrl_get_read_request.html x64-windows/debug/html/man3/BIO_ctrl_get_write_guarantee.html x64-windows/debug/html/man3/BIO_ctrl_pending.html x64-windows/debug/html/man3/BIO_ctrl_reset_read_request.html x64-windows/debug/html/man3/BIO_ctrl_wpending.html x64-windows/debug/html/man3/BIO_debug_callback.html x64-windows/debug/html/man3/BIO_destroy_bio_pair.html x64-windows/debug/html/man3/BIO_do_accept.html x64-windows/debug/html/man3/BIO_do_connect.html x64-windows/debug/html/man3/BIO_do_handshake.html x64-windows/debug/html/man3/BIO_eof.html x64-windows/debug/html/man3/BIO_f_base64.html x64-windows/debug/html/man3/BIO_f_buffer.html x64-windows/debug/html/man3/BIO_f_cipher.html x64-windows/debug/html/man3/BIO_f_md.html x64-windows/debug/html/man3/BIO_f_null.html x64-windows/debug/html/man3/BIO_f_ssl.html x64-windows/debug/html/man3/BIO_find_type.html x64-windows/debug/html/man3/BIO_flush.html x64-windows/debug/html/man3/BIO_free.html x64-windows/debug/html/man3/BIO_free_all.html x64-windows/debug/html/man3/BIO_get_accept_ip_family.html x64-windows/debug/html/man3/BIO_get_accept_name.html x64-windows/debug/html/man3/BIO_get_accept_port.html x64-windows/debug/html/man3/BIO_get_bind_mode.html x64-windows/debug/html/man3/BIO_get_buffer_num_lines.html x64-windows/debug/html/man3/BIO_get_callback.html x64-windows/debug/html/man3/BIO_get_callback_arg.html x64-windows/debug/html/man3/BIO_get_callback_ex.html x64-windows/debug/html/man3/BIO_get_cipher_ctx.html x64-windows/debug/html/man3/BIO_get_cipher_status.html x64-windows/debug/html/man3/BIO_get_close.html x64-windows/debug/html/man3/BIO_get_conn_address.html x64-windows/debug/html/man3/BIO_get_conn_hostname.html x64-windows/debug/html/man3/BIO_get_conn_ip_family.html x64-windows/debug/html/man3/BIO_get_conn_port.html x64-windows/debug/html/man3/BIO_get_data.html x64-windows/debug/html/man3/BIO_get_ex_data.html x64-windows/debug/html/man3/BIO_get_ex_new_index.html x64-windows/debug/html/man3/BIO_get_fd.html x64-windows/debug/html/man3/BIO_get_fp.html x64-windows/debug/html/man3/BIO_get_info_callback.html x64-windows/debug/html/man3/BIO_get_init.html x64-windows/debug/html/man3/BIO_get_md.html x64-windows/debug/html/man3/BIO_get_md_ctx.html x64-windows/debug/html/man3/BIO_get_mem_data.html x64-windows/debug/html/man3/BIO_get_mem_ptr.html x64-windows/debug/html/man3/BIO_get_new_index.html x64-windows/debug/html/man3/BIO_get_num_renegotiates.html x64-windows/debug/html/man3/BIO_get_peer_name.html x64-windows/debug/html/man3/BIO_get_peer_port.html x64-windows/debug/html/man3/BIO_get_read_request.html x64-windows/debug/html/man3/BIO_get_retry_BIO.html x64-windows/debug/html/man3/BIO_get_retry_reason.html x64-windows/debug/html/man3/BIO_get_shutdown.html x64-windows/debug/html/man3/BIO_get_ssl.html x64-windows/debug/html/man3/BIO_get_write_buf_size.html x64-windows/debug/html/man3/BIO_get_write_guarantee.html x64-windows/debug/html/man3/BIO_gets.html x64-windows/debug/html/man3/BIO_hostserv_priorities.html x64-windows/debug/html/man3/BIO_info_cb.html x64-windows/debug/html/man3/BIO_int_ctrl.html x64-windows/debug/html/man3/BIO_listen.html x64-windows/debug/html/man3/BIO_lookup.html x64-windows/debug/html/man3/BIO_lookup_ex.html x64-windows/debug/html/man3/BIO_lookup_type.html x64-windows/debug/html/man3/BIO_make_bio_pair.html x64-windows/debug/html/man3/BIO_meth_free.html x64-windows/debug/html/man3/BIO_meth_get_callback_ctrl.html x64-windows/debug/html/man3/BIO_meth_get_create.html x64-windows/debug/html/man3/BIO_meth_get_ctrl.html x64-windows/debug/html/man3/BIO_meth_get_destroy.html x64-windows/debug/html/man3/BIO_meth_get_gets.html x64-windows/debug/html/man3/BIO_meth_get_puts.html x64-windows/debug/html/man3/BIO_meth_get_read.html x64-windows/debug/html/man3/BIO_meth_get_read_ex.html x64-windows/debug/html/man3/BIO_meth_get_write.html x64-windows/debug/html/man3/BIO_meth_get_write_ex.html x64-windows/debug/html/man3/BIO_meth_new.html x64-windows/debug/html/man3/BIO_meth_set_callback_ctrl.html x64-windows/debug/html/man3/BIO_meth_set_create.html x64-windows/debug/html/man3/BIO_meth_set_ctrl.html x64-windows/debug/html/man3/BIO_meth_set_destroy.html x64-windows/debug/html/man3/BIO_meth_set_gets.html x64-windows/debug/html/man3/BIO_meth_set_puts.html x64-windows/debug/html/man3/BIO_meth_set_read.html x64-windows/debug/html/man3/BIO_meth_set_read_ex.html x64-windows/debug/html/man3/BIO_meth_set_write.html x64-windows/debug/html/man3/BIO_meth_set_write_ex.html x64-windows/debug/html/man3/BIO_method_type.html x64-windows/debug/html/man3/BIO_new.html x64-windows/debug/html/man3/BIO_new_CMS.html x64-windows/debug/html/man3/BIO_new_accept.html x64-windows/debug/html/man3/BIO_new_bio_pair.html x64-windows/debug/html/man3/BIO_new_buffer_ssl_connect.html x64-windows/debug/html/man3/BIO_new_connect.html x64-windows/debug/html/man3/BIO_new_fd.html x64-windows/debug/html/man3/BIO_new_file.html x64-windows/debug/html/man3/BIO_new_fp.html x64-windows/debug/html/man3/BIO_new_mem_buf.html x64-windows/debug/html/man3/BIO_new_socket.html x64-windows/debug/html/man3/BIO_new_ssl.html x64-windows/debug/html/man3/BIO_new_ssl_connect.html x64-windows/debug/html/man3/BIO_next.html x64-windows/debug/html/man3/BIO_parse_hostserv.html x64-windows/debug/html/man3/BIO_pending.html x64-windows/debug/html/man3/BIO_pop.html x64-windows/debug/html/man3/BIO_printf.html x64-windows/debug/html/man3/BIO_ptr_ctrl.html x64-windows/debug/html/man3/BIO_push.html x64-windows/debug/html/man3/BIO_puts.html x64-windows/debug/html/man3/BIO_read.html x64-windows/debug/html/man3/BIO_read_ex.html x64-windows/debug/html/man3/BIO_read_filename.html x64-windows/debug/html/man3/BIO_reset.html x64-windows/debug/html/man3/BIO_retry_type.html x64-windows/debug/html/man3/BIO_rw_filename.html x64-windows/debug/html/man3/BIO_s_accept.html x64-windows/debug/html/man3/BIO_s_bio.html x64-windows/debug/html/man3/BIO_s_connect.html x64-windows/debug/html/man3/BIO_s_fd.html x64-windows/debug/html/man3/BIO_s_file.html x64-windows/debug/html/man3/BIO_s_mem.html x64-windows/debug/html/man3/BIO_s_null.html x64-windows/debug/html/man3/BIO_s_secmem.html x64-windows/debug/html/man3/BIO_s_socket.html x64-windows/debug/html/man3/BIO_seek.html x64-windows/debug/html/man3/BIO_set_accept_bios.html x64-windows/debug/html/man3/BIO_set_accept_ip_family.html x64-windows/debug/html/man3/BIO_set_accept_name.html x64-windows/debug/html/man3/BIO_set_accept_port.html x64-windows/debug/html/man3/BIO_set_bind_mode.html x64-windows/debug/html/man3/BIO_set_buffer_read_data.html x64-windows/debug/html/man3/BIO_set_buffer_size.html x64-windows/debug/html/man3/BIO_set_callback.html x64-windows/debug/html/man3/BIO_set_callback_arg.html x64-windows/debug/html/man3/BIO_set_callback_ex.html x64-windows/debug/html/man3/BIO_set_cipher.html x64-windows/debug/html/man3/BIO_set_close.html x64-windows/debug/html/man3/BIO_set_conn_address.html x64-windows/debug/html/man3/BIO_set_conn_hostname.html x64-windows/debug/html/man3/BIO_set_conn_ip_family.html x64-windows/debug/html/man3/BIO_set_conn_port.html x64-windows/debug/html/man3/BIO_set_data.html x64-windows/debug/html/man3/BIO_set_ex_data.html x64-windows/debug/html/man3/BIO_set_fd.html x64-windows/debug/html/man3/BIO_set_fp.html x64-windows/debug/html/man3/BIO_set_info_callback.html x64-windows/debug/html/man3/BIO_set_init.html x64-windows/debug/html/man3/BIO_set_md.html x64-windows/debug/html/man3/BIO_set_mem_buf.html x64-windows/debug/html/man3/BIO_set_mem_eof_return.html x64-windows/debug/html/man3/BIO_set_nbio.html x64-windows/debug/html/man3/BIO_set_nbio_accept.html x64-windows/debug/html/man3/BIO_set_next.html x64-windows/debug/html/man3/BIO_set_read_buffer_size.html x64-windows/debug/html/man3/BIO_set_retry_reason.html x64-windows/debug/html/man3/BIO_set_shutdown.html x64-windows/debug/html/man3/BIO_set_ssl.html x64-windows/debug/html/man3/BIO_set_ssl_mode.html x64-windows/debug/html/man3/BIO_set_ssl_renegotiate_bytes.html x64-windows/debug/html/man3/BIO_set_ssl_renegotiate_timeout.html x64-windows/debug/html/man3/BIO_set_write_buf_size.html x64-windows/debug/html/man3/BIO_set_write_buffer_size.html x64-windows/debug/html/man3/BIO_should_io_special.html x64-windows/debug/html/man3/BIO_should_read.html x64-windows/debug/html/man3/BIO_should_retry.html x64-windows/debug/html/man3/BIO_should_write.html x64-windows/debug/html/man3/BIO_shutdown_wr.html x64-windows/debug/html/man3/BIO_snprintf.html x64-windows/debug/html/man3/BIO_socket.html x64-windows/debug/html/man3/BIO_ssl_copy_session_id.html x64-windows/debug/html/man3/BIO_ssl_shutdown.html x64-windows/debug/html/man3/BIO_tell.html x64-windows/debug/html/man3/BIO_up_ref.html x64-windows/debug/html/man3/BIO_vfree.html x64-windows/debug/html/man3/BIO_vprintf.html x64-windows/debug/html/man3/BIO_vsnprintf.html x64-windows/debug/html/man3/BIO_wpending.html x64-windows/debug/html/man3/BIO_write.html x64-windows/debug/html/man3/BIO_write_ex.html x64-windows/debug/html/man3/BIO_write_filename.html x64-windows/debug/html/man3/BN_BLINDING_convert.html x64-windows/debug/html/man3/BN_BLINDING_convert_ex.html x64-windows/debug/html/man3/BN_BLINDING_create_param.html x64-windows/debug/html/man3/BN_BLINDING_free.html x64-windows/debug/html/man3/BN_BLINDING_get_flags.html x64-windows/debug/html/man3/BN_BLINDING_invert.html x64-windows/debug/html/man3/BN_BLINDING_invert_ex.html x64-windows/debug/html/man3/BN_BLINDING_is_current_thread.html x64-windows/debug/html/man3/BN_BLINDING_lock.html x64-windows/debug/html/man3/BN_BLINDING_new.html x64-windows/debug/html/man3/BN_BLINDING_set_current_thread.html x64-windows/debug/html/man3/BN_BLINDING_set_flags.html x64-windows/debug/html/man3/BN_BLINDING_unlock.html x64-windows/debug/html/man3/BN_BLINDING_update.html x64-windows/debug/html/man3/BN_CTX_end.html x64-windows/debug/html/man3/BN_CTX_free.html x64-windows/debug/html/man3/BN_CTX_get.html x64-windows/debug/html/man3/BN_CTX_new.html x64-windows/debug/html/man3/BN_CTX_secure_new.html x64-windows/debug/html/man3/BN_CTX_start.html x64-windows/debug/html/man3/BN_GENCB_call.html x64-windows/debug/html/man3/BN_GENCB_free.html x64-windows/debug/html/man3/BN_GENCB_get_arg.html x64-windows/debug/html/man3/BN_GENCB_new.html x64-windows/debug/html/man3/BN_GENCB_set.html x64-windows/debug/html/man3/BN_GENCB_set_old.html x64-windows/debug/html/man3/BN_MONT_CTX_copy.html x64-windows/debug/html/man3/BN_MONT_CTX_free.html x64-windows/debug/html/man3/BN_MONT_CTX_new.html x64-windows/debug/html/man3/BN_MONT_CTX_set.html x64-windows/debug/html/man3/BN_RECP_CTX_free.html x64-windows/debug/html/man3/BN_RECP_CTX_new.html x64-windows/debug/html/man3/BN_RECP_CTX_set.html x64-windows/debug/html/man3/BN_add.html x64-windows/debug/html/man3/BN_add_word.html x64-windows/debug/html/man3/BN_bin2bn.html x64-windows/debug/html/man3/BN_bn2bin.html x64-windows/debug/html/man3/BN_bn2binpad.html x64-windows/debug/html/man3/BN_bn2dec.html x64-windows/debug/html/man3/BN_bn2hex.html x64-windows/debug/html/man3/BN_bn2lebinpad.html x64-windows/debug/html/man3/BN_bn2mpi.html x64-windows/debug/html/man3/BN_clear.html x64-windows/debug/html/man3/BN_clear_bit.html x64-windows/debug/html/man3/BN_clear_free.html x64-windows/debug/html/man3/BN_cmp.html x64-windows/debug/html/man3/BN_copy.html x64-windows/debug/html/man3/BN_dec2bn.html x64-windows/debug/html/man3/BN_div.html x64-windows/debug/html/man3/BN_div_recp.html x64-windows/debug/html/man3/BN_div_word.html x64-windows/debug/html/man3/BN_dup.html x64-windows/debug/html/man3/BN_exp.html x64-windows/debug/html/man3/BN_free.html x64-windows/debug/html/man3/BN_from_montgomery.html x64-windows/debug/html/man3/BN_gcd.html x64-windows/debug/html/man3/BN_generate_prime.html x64-windows/debug/html/man3/BN_generate_prime_ex.html x64-windows/debug/html/man3/BN_get0_nist_prime_192.html x64-windows/debug/html/man3/BN_get0_nist_prime_224.html x64-windows/debug/html/man3/BN_get0_nist_prime_256.html x64-windows/debug/html/man3/BN_get0_nist_prime_384.html x64-windows/debug/html/man3/BN_get0_nist_prime_521.html x64-windows/debug/html/man3/BN_get_rfc2409_prime_1024.html x64-windows/debug/html/man3/BN_get_rfc2409_prime_768.html x64-windows/debug/html/man3/BN_get_rfc3526_prime_1536.html x64-windows/debug/html/man3/BN_get_rfc3526_prime_2048.html x64-windows/debug/html/man3/BN_get_rfc3526_prime_3072.html x64-windows/debug/html/man3/BN_get_rfc3526_prime_4096.html x64-windows/debug/html/man3/BN_get_rfc3526_prime_6144.html x64-windows/debug/html/man3/BN_get_rfc3526_prime_8192.html x64-windows/debug/html/man3/BN_get_word.html x64-windows/debug/html/man3/BN_hex2bn.html x64-windows/debug/html/man3/BN_is_bit_set.html x64-windows/debug/html/man3/BN_is_odd.html x64-windows/debug/html/man3/BN_is_one.html x64-windows/debug/html/man3/BN_is_prime.html x64-windows/debug/html/man3/BN_is_prime_ex.html x64-windows/debug/html/man3/BN_is_prime_fasttest.html x64-windows/debug/html/man3/BN_is_prime_fasttest_ex.html x64-windows/debug/html/man3/BN_is_word.html x64-windows/debug/html/man3/BN_is_zero.html x64-windows/debug/html/man3/BN_lebin2bn.html x64-windows/debug/html/man3/BN_lshift.html x64-windows/debug/html/man3/BN_lshift1.html x64-windows/debug/html/man3/BN_mask_bits.html x64-windows/debug/html/man3/BN_mod.html x64-windows/debug/html/man3/BN_mod_add.html x64-windows/debug/html/man3/BN_mod_exp.html x64-windows/debug/html/man3/BN_mod_inverse.html x64-windows/debug/html/man3/BN_mod_mul.html x64-windows/debug/html/man3/BN_mod_mul_montgomery.html x64-windows/debug/html/man3/BN_mod_mul_reciprocal.html x64-windows/debug/html/man3/BN_mod_sqr.html x64-windows/debug/html/man3/BN_mod_sub.html x64-windows/debug/html/man3/BN_mod_word.html x64-windows/debug/html/man3/BN_mpi2bn.html x64-windows/debug/html/man3/BN_mul.html x64-windows/debug/html/man3/BN_mul_word.html x64-windows/debug/html/man3/BN_new.html x64-windows/debug/html/man3/BN_nnmod.html x64-windows/debug/html/man3/BN_num_bits.html x64-windows/debug/html/man3/BN_num_bits_word.html x64-windows/debug/html/man3/BN_num_bytes.html x64-windows/debug/html/man3/BN_one.html x64-windows/debug/html/man3/BN_print.html x64-windows/debug/html/man3/BN_print_fp.html x64-windows/debug/html/man3/BN_priv_rand.html x64-windows/debug/html/man3/BN_priv_rand_range.html x64-windows/debug/html/man3/BN_pseudo_rand.html x64-windows/debug/html/man3/BN_pseudo_rand_range.html x64-windows/debug/html/man3/BN_rand.html x64-windows/debug/html/man3/BN_rand_range.html x64-windows/debug/html/man3/BN_rshift.html x64-windows/debug/html/man3/BN_rshift1.html x64-windows/debug/html/man3/BN_secure_new.html x64-windows/debug/html/man3/BN_security_bits.html x64-windows/debug/html/man3/BN_set_bit.html x64-windows/debug/html/man3/BN_set_word.html x64-windows/debug/html/man3/BN_sqr.html x64-windows/debug/html/man3/BN_sub.html x64-windows/debug/html/man3/BN_sub_word.html x64-windows/debug/html/man3/BN_swap.html x64-windows/debug/html/man3/BN_to_ASN1_ENUMERATED.html x64-windows/debug/html/man3/BN_to_ASN1_INTEGER.html x64-windows/debug/html/man3/BN_to_montgomery.html x64-windows/debug/html/man3/BN_ucmp.html x64-windows/debug/html/man3/BN_value_one.html x64-windows/debug/html/man3/BN_with_flags.html x64-windows/debug/html/man3/BN_zero.html x64-windows/debug/html/man3/BUF_MEM_free.html x64-windows/debug/html/man3/BUF_MEM_grow.html x64-windows/debug/html/man3/BUF_MEM_grow_clean.html x64-windows/debug/html/man3/BUF_MEM_new.html x64-windows/debug/html/man3/BUF_MEM_new_ex.html x64-windows/debug/html/man3/BUF_reverse.html x64-windows/debug/html/man3/CERTIFICATEPOLICIES_free.html x64-windows/debug/html/man3/CERTIFICATEPOLICIES_new.html x64-windows/debug/html/man3/CMS_ContentInfo_free.html x64-windows/debug/html/man3/CMS_ContentInfo_new.html x64-windows/debug/html/man3/CMS_ContentInfo_print_ctx.html x64-windows/debug/html/man3/CMS_ReceiptRequest_create0.html x64-windows/debug/html/man3/CMS_ReceiptRequest_free.html x64-windows/debug/html/man3/CMS_ReceiptRequest_get0_values.html x64-windows/debug/html/man3/CMS_ReceiptRequest_new.html x64-windows/debug/html/man3/CMS_RecipientInfo_decrypt.html x64-windows/debug/html/man3/CMS_RecipientInfo_encrypt.html x64-windows/debug/html/man3/CMS_RecipientInfo_kekri_get0_id.html x64-windows/debug/html/man3/CMS_RecipientInfo_kekri_id_cmp.html x64-windows/debug/html/man3/CMS_RecipientInfo_ktri_cert_cmp.html x64-windows/debug/html/man3/CMS_RecipientInfo_ktri_get0_signer_id.html x64-windows/debug/html/man3/CMS_RecipientInfo_set0_key.html x64-windows/debug/html/man3/CMS_RecipientInfo_set0_pkey.html x64-windows/debug/html/man3/CMS_RecipientInfo_type.html x64-windows/debug/html/man3/CMS_SignerInfo_cert_cmp.html x64-windows/debug/html/man3/CMS_SignerInfo_get0_signature.html x64-windows/debug/html/man3/CMS_SignerInfo_get0_signer_id.html x64-windows/debug/html/man3/CMS_SignerInfo_set1_signer_cert.html x64-windows/debug/html/man3/CMS_SignerInfo_sign.html x64-windows/debug/html/man3/CMS_add0_cert.html x64-windows/debug/html/man3/CMS_add0_crl.html x64-windows/debug/html/man3/CMS_add0_recipient_key.html x64-windows/debug/html/man3/CMS_add1_ReceiptRequest.html x64-windows/debug/html/man3/CMS_add1_cert.html x64-windows/debug/html/man3/CMS_add1_crl.html x64-windows/debug/html/man3/CMS_add1_recipient_cert.html x64-windows/debug/html/man3/CMS_add1_signer.html x64-windows/debug/html/man3/CMS_compress.html x64-windows/debug/html/man3/CMS_decrypt.html x64-windows/debug/html/man3/CMS_encrypt.html x64-windows/debug/html/man3/CMS_final.html x64-windows/debug/html/man3/CMS_get0_RecipientInfos.html x64-windows/debug/html/man3/CMS_get0_SignerInfos.html x64-windows/debug/html/man3/CMS_get0_content.html x64-windows/debug/html/man3/CMS_get0_eContentType.html x64-windows/debug/html/man3/CMS_get0_signers.html x64-windows/debug/html/man3/CMS_get0_type.html x64-windows/debug/html/man3/CMS_get1_ReceiptRequest.html x64-windows/debug/html/man3/CMS_get1_certs.html x64-windows/debug/html/man3/CMS_get1_crls.html x64-windows/debug/html/man3/CMS_set1_eContentType.html x64-windows/debug/html/man3/CMS_sign.html x64-windows/debug/html/man3/CMS_sign_receipt.html x64-windows/debug/html/man3/CMS_uncompress.html x64-windows/debug/html/man3/CMS_verify.html x64-windows/debug/html/man3/CMS_verify_receipt.html x64-windows/debug/html/man3/CONF_modules_finish.html x64-windows/debug/html/man3/CONF_modules_free.html x64-windows/debug/html/man3/CONF_modules_load.html x64-windows/debug/html/man3/CONF_modules_load_file.html x64-windows/debug/html/man3/CONF_modules_unload.html x64-windows/debug/html/man3/CRL_DIST_POINTS_free.html x64-windows/debug/html/man3/CRL_DIST_POINTS_new.html x64-windows/debug/html/man3/CRYPTO_EX_dup.html x64-windows/debug/html/man3/CRYPTO_EX_free.html x64-windows/debug/html/man3/CRYPTO_EX_new.html x64-windows/debug/html/man3/CRYPTO_THREAD_lock_free.html x64-windows/debug/html/man3/CRYPTO_THREAD_lock_new.html x64-windows/debug/html/man3/CRYPTO_THREAD_read_lock.html x64-windows/debug/html/man3/CRYPTO_THREAD_run_once.html x64-windows/debug/html/man3/CRYPTO_THREAD_unlock.html x64-windows/debug/html/man3/CRYPTO_THREAD_write_lock.html x64-windows/debug/html/man3/CRYPTO_atomic_add.html x64-windows/debug/html/man3/CRYPTO_clear_free.html x64-windows/debug/html/man3/CRYPTO_clear_realloc.html x64-windows/debug/html/man3/CRYPTO_free.html x64-windows/debug/html/man3/CRYPTO_free_ex_data.html x64-windows/debug/html/man3/CRYPTO_free_ex_index.html x64-windows/debug/html/man3/CRYPTO_get_alloc_counts.html x64-windows/debug/html/man3/CRYPTO_get_ex_data.html x64-windows/debug/html/man3/CRYPTO_get_ex_new_index.html x64-windows/debug/html/man3/CRYPTO_get_mem_functions.html x64-windows/debug/html/man3/CRYPTO_malloc.html x64-windows/debug/html/man3/CRYPTO_mem_ctrl.html x64-windows/debug/html/man3/CRYPTO_mem_debug_pop.html x64-windows/debug/html/man3/CRYPTO_mem_debug_push.html x64-windows/debug/html/man3/CRYPTO_mem_leaks.html x64-windows/debug/html/man3/CRYPTO_mem_leaks_cb.html x64-windows/debug/html/man3/CRYPTO_mem_leaks_fp.html x64-windows/debug/html/man3/CRYPTO_memcmp.html x64-windows/debug/html/man3/CRYPTO_new_ex_data.html x64-windows/debug/html/man3/CRYPTO_realloc.html x64-windows/debug/html/man3/CRYPTO_secure_clear_free.html x64-windows/debug/html/man3/CRYPTO_secure_free.html x64-windows/debug/html/man3/CRYPTO_secure_malloc.html x64-windows/debug/html/man3/CRYPTO_secure_malloc_done.html x64-windows/debug/html/man3/CRYPTO_secure_malloc_init.html x64-windows/debug/html/man3/CRYPTO_secure_malloc_initialized.html x64-windows/debug/html/man3/CRYPTO_secure_used.html x64-windows/debug/html/man3/CRYPTO_secure_zalloc.html x64-windows/debug/html/man3/CRYPTO_set_ex_data.html x64-windows/debug/html/man3/CRYPTO_set_mem_debug.html x64-windows/debug/html/man3/CRYPTO_set_mem_functions.html x64-windows/debug/html/man3/CRYPTO_strdup.html x64-windows/debug/html/man3/CRYPTO_strndup.html x64-windows/debug/html/man3/CRYPTO_zalloc.html x64-windows/debug/html/man3/CTLOG_STORE_free.html x64-windows/debug/html/man3/CTLOG_STORE_get0_log_by_id.html x64-windows/debug/html/man3/CTLOG_STORE_load_default_file.html x64-windows/debug/html/man3/CTLOG_STORE_load_file.html x64-windows/debug/html/man3/CTLOG_STORE_new.html x64-windows/debug/html/man3/CTLOG_free.html x64-windows/debug/html/man3/CTLOG_get0_log_id.html x64-windows/debug/html/man3/CTLOG_get0_name.html x64-windows/debug/html/man3/CTLOG_get0_public_key.html x64-windows/debug/html/man3/CTLOG_new.html x64-windows/debug/html/man3/CTLOG_new_from_base64.html x64-windows/debug/html/man3/CT_POLICY_EVAL_CTX_free.html x64-windows/debug/html/man3/CT_POLICY_EVAL_CTX_get0_cert.html x64-windows/debug/html/man3/CT_POLICY_EVAL_CTX_get0_issuer.html x64-windows/debug/html/man3/CT_POLICY_EVAL_CTX_get0_log_store.html x64-windows/debug/html/man3/CT_POLICY_EVAL_CTX_get_time.html x64-windows/debug/html/man3/CT_POLICY_EVAL_CTX_new.html x64-windows/debug/html/man3/CT_POLICY_EVAL_CTX_set1_cert.html x64-windows/debug/html/man3/CT_POLICY_EVAL_CTX_set1_issuer.html x64-windows/debug/html/man3/CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE.html x64-windows/debug/html/man3/CT_POLICY_EVAL_CTX_set_time.html x64-windows/debug/html/man3/DECLARE_ASN1_FUNCTIONS.html x64-windows/debug/html/man3/DECLARE_LHASH_OF.html x64-windows/debug/html/man3/DECLARE_PEM_rw.html x64-windows/debug/html/man3/DEFINE_SPECIAL_STACK_OF.html x64-windows/debug/html/man3/DEFINE_SPECIAL_STACK_OF_CONST.html x64-windows/debug/html/man3/DEFINE_STACK_OF.html x64-windows/debug/html/man3/DEFINE_STACK_OF_CONST.html x64-windows/debug/html/man3/DES_cbc_cksum.html x64-windows/debug/html/man3/DES_cfb64_encrypt.html x64-windows/debug/html/man3/DES_cfb_encrypt.html x64-windows/debug/html/man3/DES_crypt.html x64-windows/debug/html/man3/DES_ecb2_encrypt.html x64-windows/debug/html/man3/DES_ecb3_encrypt.html x64-windows/debug/html/man3/DES_ecb_encrypt.html x64-windows/debug/html/man3/DES_ede2_cbc_encrypt.html x64-windows/debug/html/man3/DES_ede2_cfb64_encrypt.html x64-windows/debug/html/man3/DES_ede2_ofb64_encrypt.html x64-windows/debug/html/man3/DES_ede3_cbc_encrypt.html x64-windows/debug/html/man3/DES_ede3_cfb64_encrypt.html x64-windows/debug/html/man3/DES_ede3_ofb64_encrypt.html x64-windows/debug/html/man3/DES_fcrypt.html x64-windows/debug/html/man3/DES_is_weak_key.html x64-windows/debug/html/man3/DES_key_sched.html x64-windows/debug/html/man3/DES_ncbc_encrypt.html x64-windows/debug/html/man3/DES_ofb64_encrypt.html x64-windows/debug/html/man3/DES_ofb_encrypt.html x64-windows/debug/html/man3/DES_pcbc_encrypt.html x64-windows/debug/html/man3/DES_quad_cksum.html x64-windows/debug/html/man3/DES_random_key.html x64-windows/debug/html/man3/DES_set_key.html x64-windows/debug/html/man3/DES_set_key_checked.html x64-windows/debug/html/man3/DES_set_key_unchecked.html x64-windows/debug/html/man3/DES_set_odd_parity.html x64-windows/debug/html/man3/DES_string_to_2keys.html x64-windows/debug/html/man3/DES_string_to_key.html x64-windows/debug/html/man3/DES_xcbc_encrypt.html x64-windows/debug/html/man3/DH_OpenSSL.html x64-windows/debug/html/man3/DH_bits.html x64-windows/debug/html/man3/DH_check.html x64-windows/debug/html/man3/DH_check_ex.html x64-windows/debug/html/man3/DH_check_params.html x64-windows/debug/html/man3/DH_check_params_ex.html x64-windows/debug/html/man3/DH_check_pub_key_ex.html x64-windows/debug/html/man3/DH_clear_flags.html x64-windows/debug/html/man3/DH_compute_key.html x64-windows/debug/html/man3/DH_free.html x64-windows/debug/html/man3/DH_generate_key.html x64-windows/debug/html/man3/DH_generate_parameters.html x64-windows/debug/html/man3/DH_generate_parameters_ex.html x64-windows/debug/html/man3/DH_get0_engine.html x64-windows/debug/html/man3/DH_get0_g.html x64-windows/debug/html/man3/DH_get0_key.html x64-windows/debug/html/man3/DH_get0_p.html x64-windows/debug/html/man3/DH_get0_pqg.html x64-windows/debug/html/man3/DH_get0_priv_key.html x64-windows/debug/html/man3/DH_get0_pub_key.html x64-windows/debug/html/man3/DH_get0_q.html x64-windows/debug/html/man3/DH_get_1024_160.html x64-windows/debug/html/man3/DH_get_2048_224.html x64-windows/debug/html/man3/DH_get_2048_256.html x64-windows/debug/html/man3/DH_get_default_method.html x64-windows/debug/html/man3/DH_get_ex_data.html x64-windows/debug/html/man3/DH_get_ex_new_index.html x64-windows/debug/html/man3/DH_get_length.html x64-windows/debug/html/man3/DH_get_nid.html x64-windows/debug/html/man3/DH_meth_dup.html x64-windows/debug/html/man3/DH_meth_free.html x64-windows/debug/html/man3/DH_meth_get0_app_data.html x64-windows/debug/html/man3/DH_meth_get0_name.html x64-windows/debug/html/man3/DH_meth_get_bn_mod_exp.html x64-windows/debug/html/man3/DH_meth_get_compute_key.html x64-windows/debug/html/man3/DH_meth_get_finish.html x64-windows/debug/html/man3/DH_meth_get_flags.html x64-windows/debug/html/man3/DH_meth_get_generate_key.html x64-windows/debug/html/man3/DH_meth_get_generate_params.html x64-windows/debug/html/man3/DH_meth_get_init.html x64-windows/debug/html/man3/DH_meth_new.html x64-windows/debug/html/man3/DH_meth_set0_app_data.html x64-windows/debug/html/man3/DH_meth_set1_name.html x64-windows/debug/html/man3/DH_meth_set_bn_mod_exp.html x64-windows/debug/html/man3/DH_meth_set_compute_key.html x64-windows/debug/html/man3/DH_meth_set_finish.html x64-windows/debug/html/man3/DH_meth_set_flags.html x64-windows/debug/html/man3/DH_meth_set_generate_key.html x64-windows/debug/html/man3/DH_meth_set_generate_params.html x64-windows/debug/html/man3/DH_meth_set_init.html x64-windows/debug/html/man3/DH_new.html x64-windows/debug/html/man3/DH_new_by_nid.html x64-windows/debug/html/man3/DH_new_method.html x64-windows/debug/html/man3/DH_security_bits.html x64-windows/debug/html/man3/DH_set0_key.html x64-windows/debug/html/man3/DH_set0_pqg.html x64-windows/debug/html/man3/DH_set_default_method.html x64-windows/debug/html/man3/DH_set_ex_data.html x64-windows/debug/html/man3/DH_set_flags.html x64-windows/debug/html/man3/DH_set_length.html x64-windows/debug/html/man3/DH_set_method.html x64-windows/debug/html/man3/DH_size.html x64-windows/debug/html/man3/DH_test_flags.html x64-windows/debug/html/man3/DHparams_print.html x64-windows/debug/html/man3/DHparams_print_fp.html x64-windows/debug/html/man3/DIRECTORYSTRING_free.html x64-windows/debug/html/man3/DIRECTORYSTRING_new.html x64-windows/debug/html/man3/DISPLAYTEXT_free.html x64-windows/debug/html/man3/DISPLAYTEXT_new.html x64-windows/debug/html/man3/DIST_POINT_NAME_free.html x64-windows/debug/html/man3/DIST_POINT_NAME_new.html x64-windows/debug/html/man3/DIST_POINT_free.html x64-windows/debug/html/man3/DIST_POINT_new.html x64-windows/debug/html/man3/DSA_OpenSSL.html x64-windows/debug/html/man3/DSA_SIG_free.html x64-windows/debug/html/man3/DSA_SIG_get0.html x64-windows/debug/html/man3/DSA_SIG_new.html x64-windows/debug/html/man3/DSA_SIG_set0.html x64-windows/debug/html/man3/DSA_bits.html x64-windows/debug/html/man3/DSA_clear_flags.html x64-windows/debug/html/man3/DSA_do_sign.html x64-windows/debug/html/man3/DSA_do_verify.html x64-windows/debug/html/man3/DSA_dup_DH.html x64-windows/debug/html/man3/DSA_free.html x64-windows/debug/html/man3/DSA_generate_key.html x64-windows/debug/html/man3/DSA_generate_parameters.html x64-windows/debug/html/man3/DSA_generate_parameters_ex.html x64-windows/debug/html/man3/DSA_get0_engine.html x64-windows/debug/html/man3/DSA_get0_g.html x64-windows/debug/html/man3/DSA_get0_key.html x64-windows/debug/html/man3/DSA_get0_p.html x64-windows/debug/html/man3/DSA_get0_pqg.html x64-windows/debug/html/man3/DSA_get0_priv_key.html x64-windows/debug/html/man3/DSA_get0_pub_key.html x64-windows/debug/html/man3/DSA_get0_q.html x64-windows/debug/html/man3/DSA_get_default_method.html x64-windows/debug/html/man3/DSA_get_ex_data.html x64-windows/debug/html/man3/DSA_get_ex_new_index.html x64-windows/debug/html/man3/DSA_meth_dup.html x64-windows/debug/html/man3/DSA_meth_free.html x64-windows/debug/html/man3/DSA_meth_get0_app_data.html x64-windows/debug/html/man3/DSA_meth_get0_name.html x64-windows/debug/html/man3/DSA_meth_get_bn_mod_exp.html x64-windows/debug/html/man3/DSA_meth_get_finish.html x64-windows/debug/html/man3/DSA_meth_get_flags.html x64-windows/debug/html/man3/DSA_meth_get_init.html x64-windows/debug/html/man3/DSA_meth_get_keygen.html x64-windows/debug/html/man3/DSA_meth_get_mod_exp.html x64-windows/debug/html/man3/DSA_meth_get_paramgen.html x64-windows/debug/html/man3/DSA_meth_get_sign.html x64-windows/debug/html/man3/DSA_meth_get_sign_setup.html x64-windows/debug/html/man3/DSA_meth_get_verify.html x64-windows/debug/html/man3/DSA_meth_new.html x64-windows/debug/html/man3/DSA_meth_set0_app_data.html x64-windows/debug/html/man3/DSA_meth_set1_name.html x64-windows/debug/html/man3/DSA_meth_set_bn_mod_exp.html x64-windows/debug/html/man3/DSA_meth_set_finish.html x64-windows/debug/html/man3/DSA_meth_set_flags.html x64-windows/debug/html/man3/DSA_meth_set_init.html x64-windows/debug/html/man3/DSA_meth_set_keygen.html x64-windows/debug/html/man3/DSA_meth_set_mod_exp.html x64-windows/debug/html/man3/DSA_meth_set_paramgen.html x64-windows/debug/html/man3/DSA_meth_set_sign.html x64-windows/debug/html/man3/DSA_meth_set_sign_setup.html x64-windows/debug/html/man3/DSA_meth_set_verify.html x64-windows/debug/html/man3/DSA_new.html x64-windows/debug/html/man3/DSA_new_method.html x64-windows/debug/html/man3/DSA_print.html x64-windows/debug/html/man3/DSA_print_fp.html x64-windows/debug/html/man3/DSA_security_bits.html x64-windows/debug/html/man3/DSA_set0_key.html x64-windows/debug/html/man3/DSA_set0_pqg.html x64-windows/debug/html/man3/DSA_set_default_method.html x64-windows/debug/html/man3/DSA_set_ex_data.html x64-windows/debug/html/man3/DSA_set_flags.html x64-windows/debug/html/man3/DSA_set_method.html x64-windows/debug/html/man3/DSA_sign.html x64-windows/debug/html/man3/DSA_sign_setup.html x64-windows/debug/html/man3/DSA_size.html x64-windows/debug/html/man3/DSA_test_flags.html x64-windows/debug/html/man3/DSA_verify.html x64-windows/debug/html/man3/DSAparams_dup.html x64-windows/debug/html/man3/DSAparams_print.html x64-windows/debug/html/man3/DSAparams_print_fp.html x64-windows/debug/html/man3/DTLS_client_method.html x64-windows/debug/html/man3/DTLS_get_data_mtu.html x64-windows/debug/html/man3/DTLS_method.html x64-windows/debug/html/man3/DTLS_server_method.html x64-windows/debug/html/man3/DTLS_set_timer_cb.html x64-windows/debug/html/man3/DTLS_timer_cb.html x64-windows/debug/html/man3/DTLSv1_2_client_method.html x64-windows/debug/html/man3/DTLSv1_2_method.html x64-windows/debug/html/man3/DTLSv1_2_server_method.html x64-windows/debug/html/man3/DTLSv1_client_method.html x64-windows/debug/html/man3/DTLSv1_listen.html x64-windows/debug/html/man3/DTLSv1_method.html x64-windows/debug/html/man3/DTLSv1_server_method.html x64-windows/debug/html/man3/ECDH_get_ex_data.html x64-windows/debug/html/man3/ECDH_get_ex_new_index.html x64-windows/debug/html/man3/ECDH_set_ex_data.html x64-windows/debug/html/man3/ECDSA_SIG_free.html x64-windows/debug/html/man3/ECDSA_SIG_get0.html x64-windows/debug/html/man3/ECDSA_SIG_get0_r.html x64-windows/debug/html/man3/ECDSA_SIG_get0_s.html x64-windows/debug/html/man3/ECDSA_SIG_new.html x64-windows/debug/html/man3/ECDSA_SIG_set0.html x64-windows/debug/html/man3/ECDSA_do_sign.html x64-windows/debug/html/man3/ECDSA_do_sign_ex.html x64-windows/debug/html/man3/ECDSA_do_verify.html x64-windows/debug/html/man3/ECDSA_sign.html x64-windows/debug/html/man3/ECDSA_sign_ex.html x64-windows/debug/html/man3/ECDSA_sign_setup.html x64-windows/debug/html/man3/ECDSA_size.html x64-windows/debug/html/man3/ECDSA_verify.html x64-windows/debug/html/man3/ECPARAMETERS_free.html x64-windows/debug/html/man3/ECPARAMETERS_new.html x64-windows/debug/html/man3/ECPKPARAMETERS_free.html x64-windows/debug/html/man3/ECPKPARAMETERS_new.html x64-windows/debug/html/man3/ECPKParameters_print.html x64-windows/debug/html/man3/ECPKParameters_print_fp.html x64-windows/debug/html/man3/EC_GF2m_simple_method.html x64-windows/debug/html/man3/EC_GFp_mont_method.html x64-windows/debug/html/man3/EC_GFp_nist_method.html x64-windows/debug/html/man3/EC_GFp_nistp224_method.html x64-windows/debug/html/man3/EC_GFp_nistp256_method.html x64-windows/debug/html/man3/EC_GFp_nistp521_method.html x64-windows/debug/html/man3/EC_GFp_simple_method.html x64-windows/debug/html/man3/EC_GROUP_check.html x64-windows/debug/html/man3/EC_GROUP_check_discriminant.html x64-windows/debug/html/man3/EC_GROUP_clear_free.html x64-windows/debug/html/man3/EC_GROUP_cmp.html x64-windows/debug/html/man3/EC_GROUP_copy.html x64-windows/debug/html/man3/EC_GROUP_dup.html x64-windows/debug/html/man3/EC_GROUP_free.html x64-windows/debug/html/man3/EC_GROUP_get0_cofactor.html x64-windows/debug/html/man3/EC_GROUP_get0_generator.html x64-windows/debug/html/man3/EC_GROUP_get0_order.html x64-windows/debug/html/man3/EC_GROUP_get0_seed.html x64-windows/debug/html/man3/EC_GROUP_get_asn1_flag.html x64-windows/debug/html/man3/EC_GROUP_get_basis_type.html x64-windows/debug/html/man3/EC_GROUP_get_cofactor.html x64-windows/debug/html/man3/EC_GROUP_get_curve.html x64-windows/debug/html/man3/EC_GROUP_get_curve_GF2m.html x64-windows/debug/html/man3/EC_GROUP_get_curve_GFp.html x64-windows/debug/html/man3/EC_GROUP_get_curve_name.html x64-windows/debug/html/man3/EC_GROUP_get_degree.html x64-windows/debug/html/man3/EC_GROUP_get_ecparameters.html x64-windows/debug/html/man3/EC_GROUP_get_ecpkparameters.html x64-windows/debug/html/man3/EC_GROUP_get_order.html x64-windows/debug/html/man3/EC_GROUP_get_pentanomial_basis.html x64-windows/debug/html/man3/EC_GROUP_get_point_conversion_form.html x64-windows/debug/html/man3/EC_GROUP_get_seed_len.html x64-windows/debug/html/man3/EC_GROUP_get_trinomial_basis.html x64-windows/debug/html/man3/EC_GROUP_have_precompute_mult.html x64-windows/debug/html/man3/EC_GROUP_method_of.html x64-windows/debug/html/man3/EC_GROUP_new.html x64-windows/debug/html/man3/EC_GROUP_new_by_curve_name.html x64-windows/debug/html/man3/EC_GROUP_new_curve_GF2m.html x64-windows/debug/html/man3/EC_GROUP_new_curve_GFp.html x64-windows/debug/html/man3/EC_GROUP_new_from_ecparameters.html x64-windows/debug/html/man3/EC_GROUP_new_from_ecpkparameters.html x64-windows/debug/html/man3/EC_GROUP_order_bits.html x64-windows/debug/html/man3/EC_GROUP_precompute_mult.html x64-windows/debug/html/man3/EC_GROUP_set_asn1_flag.html x64-windows/debug/html/man3/EC_GROUP_set_curve.html x64-windows/debug/html/man3/EC_GROUP_set_curve_GF2m.html x64-windows/debug/html/man3/EC_GROUP_set_curve_GFp.html x64-windows/debug/html/man3/EC_GROUP_set_curve_name.html x64-windows/debug/html/man3/EC_GROUP_set_generator.html x64-windows/debug/html/man3/EC_GROUP_set_point_conversion_form.html x64-windows/debug/html/man3/EC_GROUP_set_seed.html x64-windows/debug/html/man3/EC_KEY_check_key.html x64-windows/debug/html/man3/EC_KEY_clear_flags.html x64-windows/debug/html/man3/EC_KEY_copy.html x64-windows/debug/html/man3/EC_KEY_dup.html x64-windows/debug/html/man3/EC_KEY_free.html x64-windows/debug/html/man3/EC_KEY_generate_key.html x64-windows/debug/html/man3/EC_KEY_get0_engine.html x64-windows/debug/html/man3/EC_KEY_get0_group.html x64-windows/debug/html/man3/EC_KEY_get0_private_key.html x64-windows/debug/html/man3/EC_KEY_get0_public_key.html x64-windows/debug/html/man3/EC_KEY_get_conv_form.html x64-windows/debug/html/man3/EC_KEY_get_enc_flags.html x64-windows/debug/html/man3/EC_KEY_get_ex_data.html x64-windows/debug/html/man3/EC_KEY_get_ex_new_index.html x64-windows/debug/html/man3/EC_KEY_get_flags.html x64-windows/debug/html/man3/EC_KEY_get_method.html x64-windows/debug/html/man3/EC_KEY_key2buf.html x64-windows/debug/html/man3/EC_KEY_new.html x64-windows/debug/html/man3/EC_KEY_new_by_curve_name.html x64-windows/debug/html/man3/EC_KEY_oct2key.html x64-windows/debug/html/man3/EC_KEY_oct2priv.html x64-windows/debug/html/man3/EC_KEY_precompute_mult.html x64-windows/debug/html/man3/EC_KEY_priv2buf.html x64-windows/debug/html/man3/EC_KEY_priv2oct.html x64-windows/debug/html/man3/EC_KEY_set_asn1_flag.html x64-windows/debug/html/man3/EC_KEY_set_conv_form.html x64-windows/debug/html/man3/EC_KEY_set_enc_flags.html x64-windows/debug/html/man3/EC_KEY_set_ex_data.html x64-windows/debug/html/man3/EC_KEY_set_flags.html x64-windows/debug/html/man3/EC_KEY_set_group.html x64-windows/debug/html/man3/EC_KEY_set_method.html x64-windows/debug/html/man3/EC_KEY_set_private_key.html x64-windows/debug/html/man3/EC_KEY_set_public_key.html x64-windows/debug/html/man3/EC_KEY_set_public_key_affine_coordinates.html x64-windows/debug/html/man3/EC_KEY_up_ref.html x64-windows/debug/html/man3/EC_METHOD_get_field_type.html x64-windows/debug/html/man3/EC_POINT_add.html x64-windows/debug/html/man3/EC_POINT_bn2point.html x64-windows/debug/html/man3/EC_POINT_clear_free.html x64-windows/debug/html/man3/EC_POINT_cmp.html x64-windows/debug/html/man3/EC_POINT_copy.html x64-windows/debug/html/man3/EC_POINT_dbl.html x64-windows/debug/html/man3/EC_POINT_dup.html x64-windows/debug/html/man3/EC_POINT_free.html x64-windows/debug/html/man3/EC_POINT_get_Jprojective_coordinates_GFp.html x64-windows/debug/html/man3/EC_POINT_get_affine_coordinates.html x64-windows/debug/html/man3/EC_POINT_get_affine_coordinates_GF2m.html x64-windows/debug/html/man3/EC_POINT_get_affine_coordinates_GFp.html x64-windows/debug/html/man3/EC_POINT_hex2point.html x64-windows/debug/html/man3/EC_POINT_invert.html x64-windows/debug/html/man3/EC_POINT_is_at_infinity.html x64-windows/debug/html/man3/EC_POINT_is_on_curve.html x64-windows/debug/html/man3/EC_POINT_make_affine.html x64-windows/debug/html/man3/EC_POINT_method_of.html x64-windows/debug/html/man3/EC_POINT_mul.html x64-windows/debug/html/man3/EC_POINT_new.html x64-windows/debug/html/man3/EC_POINT_oct2point.html x64-windows/debug/html/man3/EC_POINT_point2bn.html x64-windows/debug/html/man3/EC_POINT_point2buf.html x64-windows/debug/html/man3/EC_POINT_point2hex.html x64-windows/debug/html/man3/EC_POINT_point2oct.html x64-windows/debug/html/man3/EC_POINT_set_Jprojective_coordinates_GFp.html x64-windows/debug/html/man3/EC_POINT_set_affine_coordinates.html x64-windows/debug/html/man3/EC_POINT_set_affine_coordinates_GF2m.html x64-windows/debug/html/man3/EC_POINT_set_affine_coordinates_GFp.html x64-windows/debug/html/man3/EC_POINT_set_compressed_coordinates.html x64-windows/debug/html/man3/EC_POINT_set_compressed_coordinates_GF2m.html x64-windows/debug/html/man3/EC_POINT_set_compressed_coordinates_GFp.html x64-windows/debug/html/man3/EC_POINT_set_to_infinity.html x64-windows/debug/html/man3/EC_POINTs_make_affine.html x64-windows/debug/html/man3/EC_POINTs_mul.html x64-windows/debug/html/man3/EC_get_builtin_curves.html x64-windows/debug/html/man3/EDIPARTYNAME_free.html x64-windows/debug/html/man3/EDIPARTYNAME_new.html x64-windows/debug/html/man3/ENGINE_add.html x64-windows/debug/html/man3/ENGINE_add_conf_module.html x64-windows/debug/html/man3/ENGINE_by_id.html x64-windows/debug/html/man3/ENGINE_cleanup.html x64-windows/debug/html/man3/ENGINE_cmd_is_executable.html x64-windows/debug/html/man3/ENGINE_ctrl.html x64-windows/debug/html/man3/ENGINE_ctrl_cmd.html x64-windows/debug/html/man3/ENGINE_ctrl_cmd_string.html x64-windows/debug/html/man3/ENGINE_finish.html x64-windows/debug/html/man3/ENGINE_free.html x64-windows/debug/html/man3/ENGINE_get_DH.html x64-windows/debug/html/man3/ENGINE_get_DSA.html x64-windows/debug/html/man3/ENGINE_get_RAND.html x64-windows/debug/html/man3/ENGINE_get_RSA.html x64-windows/debug/html/man3/ENGINE_get_cipher.html x64-windows/debug/html/man3/ENGINE_get_cipher_engine.html x64-windows/debug/html/man3/ENGINE_get_ciphers.html x64-windows/debug/html/man3/ENGINE_get_cmd_defns.html x64-windows/debug/html/man3/ENGINE_get_ctrl_function.html x64-windows/debug/html/man3/ENGINE_get_default_DH.html x64-windows/debug/html/man3/ENGINE_get_default_DSA.html x64-windows/debug/html/man3/ENGINE_get_default_RAND.html x64-windows/debug/html/man3/ENGINE_get_default_RSA.html x64-windows/debug/html/man3/ENGINE_get_destroy_function.html x64-windows/debug/html/man3/ENGINE_get_digest.html x64-windows/debug/html/man3/ENGINE_get_digest_engine.html x64-windows/debug/html/man3/ENGINE_get_digests.html x64-windows/debug/html/man3/ENGINE_get_ex_data.html x64-windows/debug/html/man3/ENGINE_get_ex_new_index.html x64-windows/debug/html/man3/ENGINE_get_finish_function.html x64-windows/debug/html/man3/ENGINE_get_first.html x64-windows/debug/html/man3/ENGINE_get_flags.html x64-windows/debug/html/man3/ENGINE_get_id.html x64-windows/debug/html/man3/ENGINE_get_init_function.html x64-windows/debug/html/man3/ENGINE_get_last.html x64-windows/debug/html/man3/ENGINE_get_load_privkey_function.html x64-windows/debug/html/man3/ENGINE_get_load_pubkey_function.html x64-windows/debug/html/man3/ENGINE_get_name.html x64-windows/debug/html/man3/ENGINE_get_next.html x64-windows/debug/html/man3/ENGINE_get_prev.html x64-windows/debug/html/man3/ENGINE_get_table_flags.html x64-windows/debug/html/man3/ENGINE_init.html x64-windows/debug/html/man3/ENGINE_load_builtin_engines.html x64-windows/debug/html/man3/ENGINE_load_private_key.html x64-windows/debug/html/man3/ENGINE_load_public_key.html x64-windows/debug/html/man3/ENGINE_new.html x64-windows/debug/html/man3/ENGINE_register_DH.html x64-windows/debug/html/man3/ENGINE_register_DSA.html x64-windows/debug/html/man3/ENGINE_register_RAND.html x64-windows/debug/html/man3/ENGINE_register_RSA.html x64-windows/debug/html/man3/ENGINE_register_all_DH.html x64-windows/debug/html/man3/ENGINE_register_all_DSA.html x64-windows/debug/html/man3/ENGINE_register_all_RAND.html x64-windows/debug/html/man3/ENGINE_register_all_RSA.html x64-windows/debug/html/man3/ENGINE_register_all_ciphers.html x64-windows/debug/html/man3/ENGINE_register_all_complete.html x64-windows/debug/html/man3/ENGINE_register_all_digests.html x64-windows/debug/html/man3/ENGINE_register_ciphers.html x64-windows/debug/html/man3/ENGINE_register_complete.html x64-windows/debug/html/man3/ENGINE_register_digests.html x64-windows/debug/html/man3/ENGINE_remove.html x64-windows/debug/html/man3/ENGINE_set_DH.html x64-windows/debug/html/man3/ENGINE_set_DSA.html x64-windows/debug/html/man3/ENGINE_set_RAND.html x64-windows/debug/html/man3/ENGINE_set_RSA.html x64-windows/debug/html/man3/ENGINE_set_ciphers.html x64-windows/debug/html/man3/ENGINE_set_cmd_defns.html x64-windows/debug/html/man3/ENGINE_set_ctrl_function.html x64-windows/debug/html/man3/ENGINE_set_default.html x64-windows/debug/html/man3/ENGINE_set_default_DH.html x64-windows/debug/html/man3/ENGINE_set_default_DSA.html x64-windows/debug/html/man3/ENGINE_set_default_RAND.html x64-windows/debug/html/man3/ENGINE_set_default_RSA.html x64-windows/debug/html/man3/ENGINE_set_default_ciphers.html x64-windows/debug/html/man3/ENGINE_set_default_digests.html x64-windows/debug/html/man3/ENGINE_set_default_string.html x64-windows/debug/html/man3/ENGINE_set_destroy_function.html x64-windows/debug/html/man3/ENGINE_set_digests.html x64-windows/debug/html/man3/ENGINE_set_ex_data.html x64-windows/debug/html/man3/ENGINE_set_finish_function.html x64-windows/debug/html/man3/ENGINE_set_flags.html x64-windows/debug/html/man3/ENGINE_set_id.html x64-windows/debug/html/man3/ENGINE_set_init_function.html x64-windows/debug/html/man3/ENGINE_set_load_privkey_function.html x64-windows/debug/html/man3/ENGINE_set_load_pubkey_function.html x64-windows/debug/html/man3/ENGINE_set_name.html x64-windows/debug/html/man3/ENGINE_set_table_flags.html x64-windows/debug/html/man3/ENGINE_unregister_DH.html x64-windows/debug/html/man3/ENGINE_unregister_DSA.html x64-windows/debug/html/man3/ENGINE_unregister_RAND.html x64-windows/debug/html/man3/ENGINE_unregister_RSA.html x64-windows/debug/html/man3/ENGINE_unregister_ciphers.html x64-windows/debug/html/man3/ENGINE_unregister_digests.html x64-windows/debug/html/man3/ENGINE_up_ref.html x64-windows/debug/html/man3/ERR_FATAL_ERROR.html x64-windows/debug/html/man3/ERR_GET_FUNC.html x64-windows/debug/html/man3/ERR_GET_LIB.html x64-windows/debug/html/man3/ERR_GET_REASON.html x64-windows/debug/html/man3/ERR_PACK.html x64-windows/debug/html/man3/ERR_add_error_data.html x64-windows/debug/html/man3/ERR_add_error_vdata.html x64-windows/debug/html/man3/ERR_clear_error.html x64-windows/debug/html/man3/ERR_error_string.html x64-windows/debug/html/man3/ERR_error_string_n.html x64-windows/debug/html/man3/ERR_free_strings.html x64-windows/debug/html/man3/ERR_func_error_string.html x64-windows/debug/html/man3/ERR_get_error.html x64-windows/debug/html/man3/ERR_get_error_line.html x64-windows/debug/html/man3/ERR_get_error_line_data.html x64-windows/debug/html/man3/ERR_get_next_error_library.html x64-windows/debug/html/man3/ERR_lib_error_string.html x64-windows/debug/html/man3/ERR_load_crypto_strings.html x64-windows/debug/html/man3/ERR_load_strings.html x64-windows/debug/html/man3/ERR_peek_error.html x64-windows/debug/html/man3/ERR_peek_error_line.html x64-windows/debug/html/man3/ERR_peek_error_line_data.html x64-windows/debug/html/man3/ERR_peek_last_error.html x64-windows/debug/html/man3/ERR_peek_last_error_line.html x64-windows/debug/html/man3/ERR_peek_last_error_line_data.html x64-windows/debug/html/man3/ERR_pop_to_mark.html x64-windows/debug/html/man3/ERR_print_errors.html x64-windows/debug/html/man3/ERR_print_errors_cb.html x64-windows/debug/html/man3/ERR_print_errors_fp.html x64-windows/debug/html/man3/ERR_put_error.html x64-windows/debug/html/man3/ERR_reason_error_string.html x64-windows/debug/html/man3/ERR_remove_state.html x64-windows/debug/html/man3/ERR_remove_thread_state.html x64-windows/debug/html/man3/ERR_set_mark.html x64-windows/debug/html/man3/ESS_CERT_ID_dup.html x64-windows/debug/html/man3/ESS_CERT_ID_free.html x64-windows/debug/html/man3/ESS_CERT_ID_new.html x64-windows/debug/html/man3/ESS_ISSUER_SERIAL_dup.html x64-windows/debug/html/man3/ESS_ISSUER_SERIAL_free.html x64-windows/debug/html/man3/ESS_ISSUER_SERIAL_new.html x64-windows/debug/html/man3/ESS_SIGNING_CERT_dup.html x64-windows/debug/html/man3/ESS_SIGNING_CERT_free.html x64-windows/debug/html/man3/ESS_SIGNING_CERT_new.html x64-windows/debug/html/man3/EVP_BytesToKey.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_block_size.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_cipher.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_ctrl.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_flags.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_free.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_get_app_data.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_get_cipher_data.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_iv_length.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_key_length.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_mode.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_new.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_nid.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_reset.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_set_app_data.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_set_cipher_data.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_set_key_length.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_set_padding.html x64-windows/debug/html/man3/EVP_CIPHER_CTX_type.html x64-windows/debug/html/man3/EVP_CIPHER_asn1_to_param.html x64-windows/debug/html/man3/EVP_CIPHER_block_size.html x64-windows/debug/html/man3/EVP_CIPHER_flags.html x64-windows/debug/html/man3/EVP_CIPHER_iv_length.html x64-windows/debug/html/man3/EVP_CIPHER_key_length.html x64-windows/debug/html/man3/EVP_CIPHER_meth_dup.html x64-windows/debug/html/man3/EVP_CIPHER_meth_free.html x64-windows/debug/html/man3/EVP_CIPHER_meth_get_cleanup.html x64-windows/debug/html/man3/EVP_CIPHER_meth_get_ctrl.html x64-windows/debug/html/man3/EVP_CIPHER_meth_get_do_cipher.html x64-windows/debug/html/man3/EVP_CIPHER_meth_get_get_asn1_params.html x64-windows/debug/html/man3/EVP_CIPHER_meth_get_init.html x64-windows/debug/html/man3/EVP_CIPHER_meth_get_set_asn1_params.html x64-windows/debug/html/man3/EVP_CIPHER_meth_new.html x64-windows/debug/html/man3/EVP_CIPHER_meth_set_cleanup.html x64-windows/debug/html/man3/EVP_CIPHER_meth_set_ctrl.html x64-windows/debug/html/man3/EVP_CIPHER_meth_set_do_cipher.html x64-windows/debug/html/man3/EVP_CIPHER_meth_set_flags.html x64-windows/debug/html/man3/EVP_CIPHER_meth_set_get_asn1_params.html x64-windows/debug/html/man3/EVP_CIPHER_meth_set_impl_ctx_size.html x64-windows/debug/html/man3/EVP_CIPHER_meth_set_init.html x64-windows/debug/html/man3/EVP_CIPHER_meth_set_iv_length.html x64-windows/debug/html/man3/EVP_CIPHER_meth_set_set_asn1_params.html x64-windows/debug/html/man3/EVP_CIPHER_mode.html x64-windows/debug/html/man3/EVP_CIPHER_nid.html x64-windows/debug/html/man3/EVP_CIPHER_param_to_asn1.html x64-windows/debug/html/man3/EVP_CIPHER_type.html x64-windows/debug/html/man3/EVP_CipherFinal.html x64-windows/debug/html/man3/EVP_CipherFinal_ex.html x64-windows/debug/html/man3/EVP_CipherInit.html x64-windows/debug/html/man3/EVP_CipherInit_ex.html x64-windows/debug/html/man3/EVP_CipherUpdate.html x64-windows/debug/html/man3/EVP_DecodeBlock.html x64-windows/debug/html/man3/EVP_DecodeFinal.html x64-windows/debug/html/man3/EVP_DecodeInit.html x64-windows/debug/html/man3/EVP_DecodeUpdate.html x64-windows/debug/html/man3/EVP_DecryptFinal.html x64-windows/debug/html/man3/EVP_DecryptFinal_ex.html x64-windows/debug/html/man3/EVP_DecryptInit.html x64-windows/debug/html/man3/EVP_DecryptInit_ex.html x64-windows/debug/html/man3/EVP_DecryptUpdate.html x64-windows/debug/html/man3/EVP_DigestFinal.html x64-windows/debug/html/man3/EVP_DigestFinalXOF.html x64-windows/debug/html/man3/EVP_DigestFinal_ex.html x64-windows/debug/html/man3/EVP_DigestInit.html x64-windows/debug/html/man3/EVP_DigestInit_ex.html x64-windows/debug/html/man3/EVP_DigestSign.html x64-windows/debug/html/man3/EVP_DigestSignFinal.html x64-windows/debug/html/man3/EVP_DigestSignInit.html x64-windows/debug/html/man3/EVP_DigestSignUpdate.html x64-windows/debug/html/man3/EVP_DigestUpdate.html x64-windows/debug/html/man3/EVP_DigestVerify.html x64-windows/debug/html/man3/EVP_DigestVerifyFinal.html x64-windows/debug/html/man3/EVP_DigestVerifyInit.html x64-windows/debug/html/man3/EVP_DigestVerifyUpdate.html x64-windows/debug/html/man3/EVP_ENCODE_CTX_copy.html x64-windows/debug/html/man3/EVP_ENCODE_CTX_free.html x64-windows/debug/html/man3/EVP_ENCODE_CTX_new.html x64-windows/debug/html/man3/EVP_ENCODE_CTX_num.html x64-windows/debug/html/man3/EVP_EncodeBlock.html x64-windows/debug/html/man3/EVP_EncodeFinal.html x64-windows/debug/html/man3/EVP_EncodeInit.html x64-windows/debug/html/man3/EVP_EncodeUpdate.html x64-windows/debug/html/man3/EVP_EncryptFinal.html x64-windows/debug/html/man3/EVP_EncryptFinal_ex.html x64-windows/debug/html/man3/EVP_EncryptInit.html x64-windows/debug/html/man3/EVP_EncryptInit_ex.html x64-windows/debug/html/man3/EVP_EncryptUpdate.html x64-windows/debug/html/man3/EVP_MD_CTX_block_size.html x64-windows/debug/html/man3/EVP_MD_CTX_clear_flags.html x64-windows/debug/html/man3/EVP_MD_CTX_copy.html x64-windows/debug/html/man3/EVP_MD_CTX_copy_ex.html x64-windows/debug/html/man3/EVP_MD_CTX_ctrl.html x64-windows/debug/html/man3/EVP_MD_CTX_free.html x64-windows/debug/html/man3/EVP_MD_CTX_md.html x64-windows/debug/html/man3/EVP_MD_CTX_md_data.html x64-windows/debug/html/man3/EVP_MD_CTX_new.html x64-windows/debug/html/man3/EVP_MD_CTX_reset.html x64-windows/debug/html/man3/EVP_MD_CTX_set_flags.html x64-windows/debug/html/man3/EVP_MD_CTX_set_pkey_ctx.html x64-windows/debug/html/man3/EVP_MD_CTX_size.html x64-windows/debug/html/man3/EVP_MD_CTX_test_flags.html x64-windows/debug/html/man3/EVP_MD_CTX_type.html x64-windows/debug/html/man3/EVP_MD_block_size.html x64-windows/debug/html/man3/EVP_MD_meth_dup.html x64-windows/debug/html/man3/EVP_MD_meth_free.html x64-windows/debug/html/man3/EVP_MD_meth_get_app_datasize.html x64-windows/debug/html/man3/EVP_MD_meth_get_cleanup.html x64-windows/debug/html/man3/EVP_MD_meth_get_copy.html x64-windows/debug/html/man3/EVP_MD_meth_get_ctrl.html x64-windows/debug/html/man3/EVP_MD_meth_get_final.html x64-windows/debug/html/man3/EVP_MD_meth_get_flags.html x64-windows/debug/html/man3/EVP_MD_meth_get_init.html x64-windows/debug/html/man3/EVP_MD_meth_get_input_blocksize.html x64-windows/debug/html/man3/EVP_MD_meth_get_result_size.html x64-windows/debug/html/man3/EVP_MD_meth_get_update.html x64-windows/debug/html/man3/EVP_MD_meth_new.html x64-windows/debug/html/man3/EVP_MD_meth_set_app_datasize.html x64-windows/debug/html/man3/EVP_MD_meth_set_cleanup.html x64-windows/debug/html/man3/EVP_MD_meth_set_copy.html x64-windows/debug/html/man3/EVP_MD_meth_set_ctrl.html x64-windows/debug/html/man3/EVP_MD_meth_set_final.html x64-windows/debug/html/man3/EVP_MD_meth_set_flags.html x64-windows/debug/html/man3/EVP_MD_meth_set_init.html x64-windows/debug/html/man3/EVP_MD_meth_set_input_blocksize.html x64-windows/debug/html/man3/EVP_MD_meth_set_result_size.html x64-windows/debug/html/man3/EVP_MD_meth_set_update.html x64-windows/debug/html/man3/EVP_MD_pkey_type.html x64-windows/debug/html/man3/EVP_MD_size.html x64-windows/debug/html/man3/EVP_MD_type.html x64-windows/debug/html/man3/EVP_OpenFinal.html x64-windows/debug/html/man3/EVP_OpenInit.html x64-windows/debug/html/man3/EVP_OpenUpdate.html x64-windows/debug/html/man3/EVP_PKEY_ASN1_METHOD.html x64-windows/debug/html/man3/EVP_PKEY_CTX_add1_hkdf_info.html x64-windows/debug/html/man3/EVP_PKEY_CTX_add1_tls1_prf_seed.html x64-windows/debug/html/man3/EVP_PKEY_CTX_ctrl.html x64-windows/debug/html/man3/EVP_PKEY_CTX_ctrl_str.html x64-windows/debug/html/man3/EVP_PKEY_CTX_ctrl_uint64.html x64-windows/debug/html/man3/EVP_PKEY_CTX_dup.html x64-windows/debug/html/man3/EVP_PKEY_CTX_free.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get0_dh_kdf_oid.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get0_dh_kdf_ukm.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get0_ecdh_kdf_ukm.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get0_rsa_oaep_label.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get1_id.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get1_id_len.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_app_data.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_cb.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_dh_kdf_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_dh_kdf_outlen.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_dh_kdf_type.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_ecdh_cofactor_mode.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_ecdh_kdf_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_ecdh_kdf_outlen.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_ecdh_kdf_type.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_keygen_info.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_rsa_mgf1_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_rsa_oaep_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_rsa_padding.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_rsa_pss_saltlen.html x64-windows/debug/html/man3/EVP_PKEY_CTX_get_signature_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_hkdf_mode.html x64-windows/debug/html/man3/EVP_PKEY_CTX_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_new.html x64-windows/debug/html/man3/EVP_PKEY_CTX_new_id.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set0_dh_kdf_oid.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set0_dh_kdf_ukm.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set0_ecdh_kdf_ukm.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set0_rsa_oaep_label.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set1_hkdf_key.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set1_hkdf_salt.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set1_id.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set1_pbe_pass.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set1_scrypt_salt.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set1_tls1_prf_secret.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_app_data.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_cb.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dh_kdf_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dh_kdf_outlen.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dh_kdf_type.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dh_nid.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dh_pad.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dh_paramgen_generator.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dh_paramgen_prime_len.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dh_paramgen_subprime_len.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dh_paramgen_type.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dh_rfc5114.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dhx_rfc5114.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_dsa_paramgen_bits.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_ec_param_enc.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_ec_paramgen_curve_nid.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_ecdh_cofactor_mode.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_ecdh_kdf_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_ecdh_kdf_outlen.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_ecdh_kdf_type.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_hkdf_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_mac_key.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_rsa_keygen_bits.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_rsa_keygen_primes.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_rsa_keygen_pubexp.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_rsa_mgf1_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_rsa_oaep_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_rsa_padding.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_rsa_pss_saltlen.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_scrypt_N.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_scrypt_maxmem_bytes.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_scrypt_p.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_scrypt_r.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_signature_md.html x64-windows/debug/html/man3/EVP_PKEY_CTX_set_tls1_prf_md.html x64-windows/debug/html/man3/EVP_PKEY_METHOD.html x64-windows/debug/html/man3/EVP_PKEY_asn1_add0.html x64-windows/debug/html/man3/EVP_PKEY_asn1_add_alias.html x64-windows/debug/html/man3/EVP_PKEY_asn1_copy.html x64-windows/debug/html/man3/EVP_PKEY_asn1_find.html x64-windows/debug/html/man3/EVP_PKEY_asn1_find_str.html x64-windows/debug/html/man3/EVP_PKEY_asn1_free.html x64-windows/debug/html/man3/EVP_PKEY_asn1_get0.html x64-windows/debug/html/man3/EVP_PKEY_asn1_get0_info.html x64-windows/debug/html/man3/EVP_PKEY_asn1_get_count.html x64-windows/debug/html/man3/EVP_PKEY_asn1_new.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_check.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_ctrl.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_free.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_get_priv_key.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_get_pub_key.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_item.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_param.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_param_check.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_private.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_public.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_public_check.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_security_bits.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_set_priv_key.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_set_pub_key.html x64-windows/debug/html/man3/EVP_PKEY_asn1_set_siginf.html x64-windows/debug/html/man3/EVP_PKEY_assign_DH.html x64-windows/debug/html/man3/EVP_PKEY_assign_DSA.html x64-windows/debug/html/man3/EVP_PKEY_assign_EC_KEY.html x64-windows/debug/html/man3/EVP_PKEY_assign_POLY1305.html x64-windows/debug/html/man3/EVP_PKEY_assign_RSA.html x64-windows/debug/html/man3/EVP_PKEY_assign_SIPHASH.html x64-windows/debug/html/man3/EVP_PKEY_base_id.html x64-windows/debug/html/man3/EVP_PKEY_check.html x64-windows/debug/html/man3/EVP_PKEY_cmp.html x64-windows/debug/html/man3/EVP_PKEY_cmp_parameters.html x64-windows/debug/html/man3/EVP_PKEY_copy_parameters.html x64-windows/debug/html/man3/EVP_PKEY_decrypt.html x64-windows/debug/html/man3/EVP_PKEY_decrypt_init.html x64-windows/debug/html/man3/EVP_PKEY_derive.html x64-windows/debug/html/man3/EVP_PKEY_derive_init.html x64-windows/debug/html/man3/EVP_PKEY_derive_set_peer.html x64-windows/debug/html/man3/EVP_PKEY_encrypt.html x64-windows/debug/html/man3/EVP_PKEY_encrypt_init.html x64-windows/debug/html/man3/EVP_PKEY_free.html x64-windows/debug/html/man3/EVP_PKEY_gen_cb.html x64-windows/debug/html/man3/EVP_PKEY_get0_DH.html x64-windows/debug/html/man3/EVP_PKEY_get0_DSA.html x64-windows/debug/html/man3/EVP_PKEY_get0_EC_KEY.html x64-windows/debug/html/man3/EVP_PKEY_get0_RSA.html x64-windows/debug/html/man3/EVP_PKEY_get0_asn1.html x64-windows/debug/html/man3/EVP_PKEY_get0_engine.html x64-windows/debug/html/man3/EVP_PKEY_get0_hmac.html x64-windows/debug/html/man3/EVP_PKEY_get0_poly1305.html x64-windows/debug/html/man3/EVP_PKEY_get0_siphash.html x64-windows/debug/html/man3/EVP_PKEY_get1_DH.html x64-windows/debug/html/man3/EVP_PKEY_get1_DSA.html x64-windows/debug/html/man3/EVP_PKEY_get1_EC_KEY.html x64-windows/debug/html/man3/EVP_PKEY_get1_RSA.html x64-windows/debug/html/man3/EVP_PKEY_get_default_digest_nid.html x64-windows/debug/html/man3/EVP_PKEY_get_raw_private_key.html x64-windows/debug/html/man3/EVP_PKEY_get_raw_public_key.html x64-windows/debug/html/man3/EVP_PKEY_id.html x64-windows/debug/html/man3/EVP_PKEY_keygen.html x64-windows/debug/html/man3/EVP_PKEY_keygen_init.html x64-windows/debug/html/man3/EVP_PKEY_meth_add0.html x64-windows/debug/html/man3/EVP_PKEY_meth_copy.html x64-windows/debug/html/man3/EVP_PKEY_meth_find.html x64-windows/debug/html/man3/EVP_PKEY_meth_free.html x64-windows/debug/html/man3/EVP_PKEY_meth_get0.html x64-windows/debug/html/man3/EVP_PKEY_meth_get0_info.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_check.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_cleanup.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_copy.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_count.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_ctrl.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_decrypt.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_derive.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_digest_custom.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_encrypt.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_init.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_keygen.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_param_check.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_paramgen.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_public_check.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_sign.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_signctx.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_verify.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_verify_recover.html x64-windows/debug/html/man3/EVP_PKEY_meth_get_verifyctx.html x64-windows/debug/html/man3/EVP_PKEY_meth_new.html x64-windows/debug/html/man3/EVP_PKEY_meth_remove.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_check.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_cleanup.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_copy.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_ctrl.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_decrypt.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_derive.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_digest_custom.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_encrypt.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_init.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_keygen.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_param_check.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_paramgen.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_public_check.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_sign.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_signctx.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_verify.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_verify_recover.html x64-windows/debug/html/man3/EVP_PKEY_meth_set_verifyctx.html x64-windows/debug/html/man3/EVP_PKEY_missing_parameters.html x64-windows/debug/html/man3/EVP_PKEY_new.html x64-windows/debug/html/man3/EVP_PKEY_new_CMAC_key.html x64-windows/debug/html/man3/EVP_PKEY_new_mac_key.html x64-windows/debug/html/man3/EVP_PKEY_new_raw_private_key.html x64-windows/debug/html/man3/EVP_PKEY_new_raw_public_key.html x64-windows/debug/html/man3/EVP_PKEY_param_check.html x64-windows/debug/html/man3/EVP_PKEY_paramgen.html x64-windows/debug/html/man3/EVP_PKEY_paramgen_init.html x64-windows/debug/html/man3/EVP_PKEY_print_params.html x64-windows/debug/html/man3/EVP_PKEY_print_private.html x64-windows/debug/html/man3/EVP_PKEY_print_public.html x64-windows/debug/html/man3/EVP_PKEY_public_check.html x64-windows/debug/html/man3/EVP_PKEY_security_bits.html x64-windows/debug/html/man3/EVP_PKEY_set1_DH.html x64-windows/debug/html/man3/EVP_PKEY_set1_DSA.html x64-windows/debug/html/man3/EVP_PKEY_set1_EC_KEY.html x64-windows/debug/html/man3/EVP_PKEY_set1_RSA.html x64-windows/debug/html/man3/EVP_PKEY_set1_engine.html x64-windows/debug/html/man3/EVP_PKEY_set_alias_type.html x64-windows/debug/html/man3/EVP_PKEY_sign.html x64-windows/debug/html/man3/EVP_PKEY_sign_init.html x64-windows/debug/html/man3/EVP_PKEY_size.html x64-windows/debug/html/man3/EVP_PKEY_type.html x64-windows/debug/html/man3/EVP_PKEY_up_ref.html x64-windows/debug/html/man3/EVP_PKEY_verify.html x64-windows/debug/html/man3/EVP_PKEY_verify_init.html x64-windows/debug/html/man3/EVP_PKEY_verify_recover.html x64-windows/debug/html/man3/EVP_PKEY_verify_recover_init.html x64-windows/debug/html/man3/EVP_SealFinal.html x64-windows/debug/html/man3/EVP_SealInit.html x64-windows/debug/html/man3/EVP_SealUpdate.html x64-windows/debug/html/man3/EVP_SignFinal.html x64-windows/debug/html/man3/EVP_SignInit.html x64-windows/debug/html/man3/EVP_SignInit_ex.html x64-windows/debug/html/man3/EVP_SignUpdate.html x64-windows/debug/html/man3/EVP_VerifyFinal.html x64-windows/debug/html/man3/EVP_VerifyInit.html x64-windows/debug/html/man3/EVP_VerifyInit_ex.html x64-windows/debug/html/man3/EVP_VerifyUpdate.html x64-windows/debug/html/man3/EVP_aes.html x64-windows/debug/html/man3/EVP_aes_128_cbc.html x64-windows/debug/html/man3/EVP_aes_128_cbc_hmac_sha1.html x64-windows/debug/html/man3/EVP_aes_128_cbc_hmac_sha256.html x64-windows/debug/html/man3/EVP_aes_128_ccm.html x64-windows/debug/html/man3/EVP_aes_128_cfb.html x64-windows/debug/html/man3/EVP_aes_128_cfb1.html x64-windows/debug/html/man3/EVP_aes_128_cfb128.html x64-windows/debug/html/man3/EVP_aes_128_cfb8.html x64-windows/debug/html/man3/EVP_aes_128_ctr.html x64-windows/debug/html/man3/EVP_aes_128_ecb.html x64-windows/debug/html/man3/EVP_aes_128_gcm.html x64-windows/debug/html/man3/EVP_aes_128_ocb.html x64-windows/debug/html/man3/EVP_aes_128_ofb.html x64-windows/debug/html/man3/EVP_aes_128_wrap.html x64-windows/debug/html/man3/EVP_aes_128_wrap_pad.html x64-windows/debug/html/man3/EVP_aes_128_xts.html x64-windows/debug/html/man3/EVP_aes_192_cbc.html x64-windows/debug/html/man3/EVP_aes_192_ccm.html x64-windows/debug/html/man3/EVP_aes_192_cfb.html x64-windows/debug/html/man3/EVP_aes_192_cfb1.html x64-windows/debug/html/man3/EVP_aes_192_cfb128.html x64-windows/debug/html/man3/EVP_aes_192_cfb8.html x64-windows/debug/html/man3/EVP_aes_192_ctr.html x64-windows/debug/html/man3/EVP_aes_192_ecb.html x64-windows/debug/html/man3/EVP_aes_192_gcm.html x64-windows/debug/html/man3/EVP_aes_192_ocb.html x64-windows/debug/html/man3/EVP_aes_192_ofb.html x64-windows/debug/html/man3/EVP_aes_192_wrap.html x64-windows/debug/html/man3/EVP_aes_192_wrap_pad.html x64-windows/debug/html/man3/EVP_aes_256_cbc.html x64-windows/debug/html/man3/EVP_aes_256_cbc_hmac_sha1.html x64-windows/debug/html/man3/EVP_aes_256_cbc_hmac_sha256.html x64-windows/debug/html/man3/EVP_aes_256_ccm.html x64-windows/debug/html/man3/EVP_aes_256_cfb.html x64-windows/debug/html/man3/EVP_aes_256_cfb1.html x64-windows/debug/html/man3/EVP_aes_256_cfb128.html x64-windows/debug/html/man3/EVP_aes_256_cfb8.html x64-windows/debug/html/man3/EVP_aes_256_ctr.html x64-windows/debug/html/man3/EVP_aes_256_ecb.html x64-windows/debug/html/man3/EVP_aes_256_gcm.html x64-windows/debug/html/man3/EVP_aes_256_ocb.html x64-windows/debug/html/man3/EVP_aes_256_ofb.html x64-windows/debug/html/man3/EVP_aes_256_wrap.html x64-windows/debug/html/man3/EVP_aes_256_wrap_pad.html x64-windows/debug/html/man3/EVP_aes_256_xts.html x64-windows/debug/html/man3/EVP_aria.html x64-windows/debug/html/man3/EVP_aria_128_cbc.html x64-windows/debug/html/man3/EVP_aria_128_ccm.html x64-windows/debug/html/man3/EVP_aria_128_cfb.html x64-windows/debug/html/man3/EVP_aria_128_cfb1.html x64-windows/debug/html/man3/EVP_aria_128_cfb128.html x64-windows/debug/html/man3/EVP_aria_128_cfb8.html x64-windows/debug/html/man3/EVP_aria_128_ctr.html x64-windows/debug/html/man3/EVP_aria_128_ecb.html x64-windows/debug/html/man3/EVP_aria_128_gcm.html x64-windows/debug/html/man3/EVP_aria_128_ofb.html x64-windows/debug/html/man3/EVP_aria_192_cbc.html x64-windows/debug/html/man3/EVP_aria_192_ccm.html x64-windows/debug/html/man3/EVP_aria_192_cfb.html x64-windows/debug/html/man3/EVP_aria_192_cfb1.html x64-windows/debug/html/man3/EVP_aria_192_cfb128.html x64-windows/debug/html/man3/EVP_aria_192_cfb8.html x64-windows/debug/html/man3/EVP_aria_192_ctr.html x64-windows/debug/html/man3/EVP_aria_192_ecb.html x64-windows/debug/html/man3/EVP_aria_192_gcm.html x64-windows/debug/html/man3/EVP_aria_192_ofb.html x64-windows/debug/html/man3/EVP_aria_256_cbc.html x64-windows/debug/html/man3/EVP_aria_256_ccm.html x64-windows/debug/html/man3/EVP_aria_256_cfb.html x64-windows/debug/html/man3/EVP_aria_256_cfb1.html x64-windows/debug/html/man3/EVP_aria_256_cfb128.html x64-windows/debug/html/man3/EVP_aria_256_cfb8.html x64-windows/debug/html/man3/EVP_aria_256_ctr.html x64-windows/debug/html/man3/EVP_aria_256_ecb.html x64-windows/debug/html/man3/EVP_aria_256_gcm.html x64-windows/debug/html/man3/EVP_aria_256_ofb.html x64-windows/debug/html/man3/EVP_bf_cbc.html x64-windows/debug/html/man3/EVP_bf_cfb.html x64-windows/debug/html/man3/EVP_bf_cfb64.html x64-windows/debug/html/man3/EVP_bf_ecb.html x64-windows/debug/html/man3/EVP_bf_ofb.html x64-windows/debug/html/man3/EVP_blake2b512.html x64-windows/debug/html/man3/EVP_blake2s256.html x64-windows/debug/html/man3/EVP_camellia.html x64-windows/debug/html/man3/EVP_camellia_128_cbc.html x64-windows/debug/html/man3/EVP_camellia_128_cfb.html x64-windows/debug/html/man3/EVP_camellia_128_cfb1.html x64-windows/debug/html/man3/EVP_camellia_128_cfb128.html x64-windows/debug/html/man3/EVP_camellia_128_cfb8.html x64-windows/debug/html/man3/EVP_camellia_128_ctr.html x64-windows/debug/html/man3/EVP_camellia_128_ecb.html x64-windows/debug/html/man3/EVP_camellia_128_ofb.html x64-windows/debug/html/man3/EVP_camellia_192_cbc.html x64-windows/debug/html/man3/EVP_camellia_192_cfb.html x64-windows/debug/html/man3/EVP_camellia_192_cfb1.html x64-windows/debug/html/man3/EVP_camellia_192_cfb128.html x64-windows/debug/html/man3/EVP_camellia_192_cfb8.html x64-windows/debug/html/man3/EVP_camellia_192_ctr.html x64-windows/debug/html/man3/EVP_camellia_192_ecb.html x64-windows/debug/html/man3/EVP_camellia_192_ofb.html x64-windows/debug/html/man3/EVP_camellia_256_cbc.html x64-windows/debug/html/man3/EVP_camellia_256_cfb.html x64-windows/debug/html/man3/EVP_camellia_256_cfb1.html x64-windows/debug/html/man3/EVP_camellia_256_cfb128.html x64-windows/debug/html/man3/EVP_camellia_256_cfb8.html x64-windows/debug/html/man3/EVP_camellia_256_ctr.html x64-windows/debug/html/man3/EVP_camellia_256_ecb.html x64-windows/debug/html/man3/EVP_camellia_256_ofb.html x64-windows/debug/html/man3/EVP_cast5_cbc.html x64-windows/debug/html/man3/EVP_cast5_cfb.html x64-windows/debug/html/man3/EVP_cast5_cfb64.html x64-windows/debug/html/man3/EVP_cast5_ecb.html x64-windows/debug/html/man3/EVP_cast5_ofb.html x64-windows/debug/html/man3/EVP_chacha20.html x64-windows/debug/html/man3/EVP_chacha20_poly1305.html x64-windows/debug/html/man3/EVP_cleanup.html x64-windows/debug/html/man3/EVP_des.html x64-windows/debug/html/man3/EVP_des_cbc.html x64-windows/debug/html/man3/EVP_des_cfb.html x64-windows/debug/html/man3/EVP_des_cfb1.html x64-windows/debug/html/man3/EVP_des_cfb64.html x64-windows/debug/html/man3/EVP_des_cfb8.html x64-windows/debug/html/man3/EVP_des_ecb.html x64-windows/debug/html/man3/EVP_des_ede.html x64-windows/debug/html/man3/EVP_des_ede3.html x64-windows/debug/html/man3/EVP_des_ede3_cbc.html x64-windows/debug/html/man3/EVP_des_ede3_cfb.html x64-windows/debug/html/man3/EVP_des_ede3_cfb1.html x64-windows/debug/html/man3/EVP_des_ede3_cfb64.html x64-windows/debug/html/man3/EVP_des_ede3_cfb8.html x64-windows/debug/html/man3/EVP_des_ede3_ecb.html x64-windows/debug/html/man3/EVP_des_ede3_ofb.html x64-windows/debug/html/man3/EVP_des_ede3_wrap.html x64-windows/debug/html/man3/EVP_des_ede_cbc.html x64-windows/debug/html/man3/EVP_des_ede_cfb.html x64-windows/debug/html/man3/EVP_des_ede_cfb64.html x64-windows/debug/html/man3/EVP_des_ede_ecb.html x64-windows/debug/html/man3/EVP_des_ede_ofb.html x64-windows/debug/html/man3/EVP_des_ofb.html x64-windows/debug/html/man3/EVP_desx_cbc.html x64-windows/debug/html/man3/EVP_enc_null.html x64-windows/debug/html/man3/EVP_get_cipherbyname.html x64-windows/debug/html/man3/EVP_get_cipherbynid.html x64-windows/debug/html/man3/EVP_get_cipherbyobj.html x64-windows/debug/html/man3/EVP_get_digestbyname.html x64-windows/debug/html/man3/EVP_get_digestbynid.html x64-windows/debug/html/man3/EVP_get_digestbyobj.html x64-windows/debug/html/man3/EVP_idea_cbc.html x64-windows/debug/html/man3/EVP_idea_cfb.html x64-windows/debug/html/man3/EVP_idea_cfb64.html x64-windows/debug/html/man3/EVP_idea_ecb.html x64-windows/debug/html/man3/EVP_idea_ofb.html x64-windows/debug/html/man3/EVP_md2.html x64-windows/debug/html/man3/EVP_md4.html x64-windows/debug/html/man3/EVP_md5.html x64-windows/debug/html/man3/EVP_md5_sha1.html x64-windows/debug/html/man3/EVP_md_null.html x64-windows/debug/html/man3/EVP_mdc2.html x64-windows/debug/html/man3/EVP_rc2_40_cbc.html x64-windows/debug/html/man3/EVP_rc2_64_cbc.html x64-windows/debug/html/man3/EVP_rc2_cbc.html x64-windows/debug/html/man3/EVP_rc2_cfb.html x64-windows/debug/html/man3/EVP_rc2_cfb64.html x64-windows/debug/html/man3/EVP_rc2_ecb.html x64-windows/debug/html/man3/EVP_rc2_ofb.html x64-windows/debug/html/man3/EVP_rc4.html x64-windows/debug/html/man3/EVP_rc4_40.html x64-windows/debug/html/man3/EVP_rc4_hmac_md5.html x64-windows/debug/html/man3/EVP_rc5_32_12_16_cbc.html x64-windows/debug/html/man3/EVP_rc5_32_12_16_cfb.html x64-windows/debug/html/man3/EVP_rc5_32_12_16_cfb64.html x64-windows/debug/html/man3/EVP_rc5_32_12_16_ecb.html x64-windows/debug/html/man3/EVP_rc5_32_12_16_ofb.html x64-windows/debug/html/man3/EVP_ripemd160.html x64-windows/debug/html/man3/EVP_seed_cbc.html x64-windows/debug/html/man3/EVP_seed_cfb.html x64-windows/debug/html/man3/EVP_seed_cfb128.html x64-windows/debug/html/man3/EVP_seed_ecb.html x64-windows/debug/html/man3/EVP_seed_ofb.html x64-windows/debug/html/man3/EVP_sha1.html x64-windows/debug/html/man3/EVP_sha224.html x64-windows/debug/html/man3/EVP_sha256.html x64-windows/debug/html/man3/EVP_sha384.html x64-windows/debug/html/man3/EVP_sha3_224.html x64-windows/debug/html/man3/EVP_sha3_256.html x64-windows/debug/html/man3/EVP_sha3_384.html x64-windows/debug/html/man3/EVP_sha3_512.html x64-windows/debug/html/man3/EVP_sha512.html x64-windows/debug/html/man3/EVP_sha512_224.html x64-windows/debug/html/man3/EVP_sha512_256.html x64-windows/debug/html/man3/EVP_shake128.html x64-windows/debug/html/man3/EVP_shake256.html x64-windows/debug/html/man3/EVP_sm3.html x64-windows/debug/html/man3/EVP_sm4_cbc.html x64-windows/debug/html/man3/EVP_sm4_cfb.html x64-windows/debug/html/man3/EVP_sm4_cfb128.html x64-windows/debug/html/man3/EVP_sm4_ctr.html x64-windows/debug/html/man3/EVP_sm4_ecb.html x64-windows/debug/html/man3/EVP_sm4_ofb.html x64-windows/debug/html/man3/EVP_whirlpool.html x64-windows/debug/html/man3/EXTENDED_KEY_USAGE_free.html x64-windows/debug/html/man3/EXTENDED_KEY_USAGE_new.html x64-windows/debug/html/man3/GENERAL_NAMES_free.html x64-windows/debug/html/man3/GENERAL_NAMES_new.html x64-windows/debug/html/man3/GENERAL_NAME_dup.html x64-windows/debug/html/man3/GENERAL_NAME_free.html x64-windows/debug/html/man3/GENERAL_NAME_new.html x64-windows/debug/html/man3/GENERAL_SUBTREE_free.html x64-windows/debug/html/man3/GENERAL_SUBTREE_new.html x64-windows/debug/html/man3/GEN_SESSION_CB.html x64-windows/debug/html/man3/HMAC.html x64-windows/debug/html/man3/HMAC_CTX_copy.html x64-windows/debug/html/man3/HMAC_CTX_free.html x64-windows/debug/html/man3/HMAC_CTX_get_md.html x64-windows/debug/html/man3/HMAC_CTX_new.html x64-windows/debug/html/man3/HMAC_CTX_reset.html x64-windows/debug/html/man3/HMAC_CTX_set_flags.html x64-windows/debug/html/man3/HMAC_Final.html x64-windows/debug/html/man3/HMAC_Init.html x64-windows/debug/html/man3/HMAC_Init_ex.html x64-windows/debug/html/man3/HMAC_Update.html x64-windows/debug/html/man3/HMAC_size.html x64-windows/debug/html/man3/IMPLEMENT_ASN1_FUNCTIONS.html x64-windows/debug/html/man3/IMPLEMENT_LHASH_COMP_FN.html x64-windows/debug/html/man3/IMPLEMENT_LHASH_HASH_FN.html x64-windows/debug/html/man3/IPAddressChoice_free.html x64-windows/debug/html/man3/IPAddressChoice_new.html x64-windows/debug/html/man3/IPAddressFamily_free.html x64-windows/debug/html/man3/IPAddressFamily_new.html x64-windows/debug/html/man3/IPAddressOrRange_free.html x64-windows/debug/html/man3/IPAddressOrRange_new.html x64-windows/debug/html/man3/IPAddressRange_free.html x64-windows/debug/html/man3/IPAddressRange_new.html x64-windows/debug/html/man3/ISSUING_DIST_POINT_free.html x64-windows/debug/html/man3/ISSUING_DIST_POINT_new.html x64-windows/debug/html/man3/LHASH.html x64-windows/debug/html/man3/LHASH_DOALL_ARG_FN_TYPE.html x64-windows/debug/html/man3/MD2.html x64-windows/debug/html/man3/MD2_Final.html x64-windows/debug/html/man3/MD2_Init.html x64-windows/debug/html/man3/MD2_Update.html x64-windows/debug/html/man3/MD4.html x64-windows/debug/html/man3/MD4_Final.html x64-windows/debug/html/man3/MD4_Init.html x64-windows/debug/html/man3/MD4_Update.html x64-windows/debug/html/man3/MD5.html x64-windows/debug/html/man3/MD5_Final.html x64-windows/debug/html/man3/MD5_Init.html x64-windows/debug/html/man3/MD5_Update.html x64-windows/debug/html/man3/MDC2.html x64-windows/debug/html/man3/MDC2_Final.html x64-windows/debug/html/man3/MDC2_Init.html x64-windows/debug/html/man3/MDC2_Update.html x64-windows/debug/html/man3/NAME_CONSTRAINTS_free.html x64-windows/debug/html/man3/NAME_CONSTRAINTS_new.html x64-windows/debug/html/man3/NAMING_AUTHORITY.html x64-windows/debug/html/man3/NAMING_AUTHORITY_free.html x64-windows/debug/html/man3/NAMING_AUTHORITY_get0_authorityId.html x64-windows/debug/html/man3/NAMING_AUTHORITY_get0_authorityText.html x64-windows/debug/html/man3/NAMING_AUTHORITY_get0_authorityURL.html x64-windows/debug/html/man3/NAMING_AUTHORITY_new.html x64-windows/debug/html/man3/NAMING_AUTHORITY_set0_authorityId.html x64-windows/debug/html/man3/NAMING_AUTHORITY_set0_authorityText.html x64-windows/debug/html/man3/NAMING_AUTHORITY_set0_authorityURL.html x64-windows/debug/html/man3/NETSCAPE_CERT_SEQUENCE_free.html x64-windows/debug/html/man3/NETSCAPE_CERT_SEQUENCE_new.html x64-windows/debug/html/man3/NETSCAPE_SPKAC_free.html x64-windows/debug/html/man3/NETSCAPE_SPKAC_new.html x64-windows/debug/html/man3/NETSCAPE_SPKI_free.html x64-windows/debug/html/man3/NETSCAPE_SPKI_new.html x64-windows/debug/html/man3/NOTICEREF_free.html x64-windows/debug/html/man3/NOTICEREF_new.html x64-windows/debug/html/man3/OBJ_cleanup.html x64-windows/debug/html/man3/OBJ_cmp.html x64-windows/debug/html/man3/OBJ_create.html x64-windows/debug/html/man3/OBJ_dup.html x64-windows/debug/html/man3/OBJ_get0_data.html x64-windows/debug/html/man3/OBJ_length.html x64-windows/debug/html/man3/OBJ_ln2nid.html x64-windows/debug/html/man3/OBJ_nid2ln.html x64-windows/debug/html/man3/OBJ_nid2obj.html x64-windows/debug/html/man3/OBJ_nid2sn.html x64-windows/debug/html/man3/OBJ_obj2nid.html x64-windows/debug/html/man3/OBJ_obj2txt.html x64-windows/debug/html/man3/OBJ_sn2nid.html x64-windows/debug/html/man3/OBJ_txt2nid.html x64-windows/debug/html/man3/OBJ_txt2obj.html x64-windows/debug/html/man3/OCSP_BASICRESP_free.html x64-windows/debug/html/man3/OCSP_BASICRESP_new.html x64-windows/debug/html/man3/OCSP_CERTID_dup.html x64-windows/debug/html/man3/OCSP_CERTID_free.html x64-windows/debug/html/man3/OCSP_CERTID_new.html x64-windows/debug/html/man3/OCSP_CERTSTATUS_free.html x64-windows/debug/html/man3/OCSP_CERTSTATUS_new.html x64-windows/debug/html/man3/OCSP_CRLID_free.html x64-windows/debug/html/man3/OCSP_CRLID_new.html x64-windows/debug/html/man3/OCSP_ONEREQ_free.html x64-windows/debug/html/man3/OCSP_ONEREQ_new.html x64-windows/debug/html/man3/OCSP_REQINFO_free.html x64-windows/debug/html/man3/OCSP_REQINFO_new.html x64-windows/debug/html/man3/OCSP_REQUEST_free.html x64-windows/debug/html/man3/OCSP_REQUEST_new.html x64-windows/debug/html/man3/OCSP_REQ_CTX_add1_header.html x64-windows/debug/html/man3/OCSP_REQ_CTX_free.html x64-windows/debug/html/man3/OCSP_REQ_CTX_set1_req.html x64-windows/debug/html/man3/OCSP_RESPBYTES_free.html x64-windows/debug/html/man3/OCSP_RESPBYTES_new.html x64-windows/debug/html/man3/OCSP_RESPDATA_free.html x64-windows/debug/html/man3/OCSP_RESPDATA_new.html x64-windows/debug/html/man3/OCSP_RESPID_free.html x64-windows/debug/html/man3/OCSP_RESPID_match.html x64-windows/debug/html/man3/OCSP_RESPID_new.html x64-windows/debug/html/man3/OCSP_RESPID_set_by_key.html x64-windows/debug/html/man3/OCSP_RESPID_set_by_name.html x64-windows/debug/html/man3/OCSP_RESPONSE_free.html x64-windows/debug/html/man3/OCSP_RESPONSE_new.html x64-windows/debug/html/man3/OCSP_REVOKEDINFO_free.html x64-windows/debug/html/man3/OCSP_REVOKEDINFO_new.html x64-windows/debug/html/man3/OCSP_SERVICELOC_free.html x64-windows/debug/html/man3/OCSP_SERVICELOC_new.html x64-windows/debug/html/man3/OCSP_SIGNATURE_free.html x64-windows/debug/html/man3/OCSP_SIGNATURE_new.html x64-windows/debug/html/man3/OCSP_SINGLERESP_free.html x64-windows/debug/html/man3/OCSP_SINGLERESP_new.html x64-windows/debug/html/man3/OCSP_basic_add1_nonce.html x64-windows/debug/html/man3/OCSP_basic_sign.html x64-windows/debug/html/man3/OCSP_basic_sign_ctx.html x64-windows/debug/html/man3/OCSP_basic_verify.html x64-windows/debug/html/man3/OCSP_cert_id_new.html x64-windows/debug/html/man3/OCSP_cert_to_id.html x64-windows/debug/html/man3/OCSP_check_nonce.html x64-windows/debug/html/man3/OCSP_check_validity.html x64-windows/debug/html/man3/OCSP_copy_nonce.html x64-windows/debug/html/man3/OCSP_id_cmp.html x64-windows/debug/html/man3/OCSP_id_get0_info.html x64-windows/debug/html/man3/OCSP_id_issuer_cmp.html x64-windows/debug/html/man3/OCSP_request_add0_id.html x64-windows/debug/html/man3/OCSP_request_add1_cert.html x64-windows/debug/html/man3/OCSP_request_add1_nonce.html x64-windows/debug/html/man3/OCSP_request_onereq_count.html x64-windows/debug/html/man3/OCSP_request_onereq_get0.html x64-windows/debug/html/man3/OCSP_request_sign.html x64-windows/debug/html/man3/OCSP_resp_count.html x64-windows/debug/html/man3/OCSP_resp_find.html x64-windows/debug/html/man3/OCSP_resp_find_status.html x64-windows/debug/html/man3/OCSP_resp_get0.html x64-windows/debug/html/man3/OCSP_resp_get0_certs.html x64-windows/debug/html/man3/OCSP_resp_get0_id.html x64-windows/debug/html/man3/OCSP_resp_get0_produced_at.html x64-windows/debug/html/man3/OCSP_resp_get0_respdata.html x64-windows/debug/html/man3/OCSP_resp_get0_signature.html x64-windows/debug/html/man3/OCSP_resp_get0_signer.html x64-windows/debug/html/man3/OCSP_resp_get0_tbs_sigalg.html x64-windows/debug/html/man3/OCSP_resp_get1_id.html x64-windows/debug/html/man3/OCSP_response_create.html x64-windows/debug/html/man3/OCSP_response_get1_basic.html x64-windows/debug/html/man3/OCSP_response_status.html x64-windows/debug/html/man3/OCSP_sendreq_bio.html x64-windows/debug/html/man3/OCSP_sendreq_nbio.html x64-windows/debug/html/man3/OCSP_sendreq_new.html x64-windows/debug/html/man3/OCSP_set_max_response_length.html x64-windows/debug/html/man3/OCSP_single_get0_status.html x64-windows/debug/html/man3/OPENSSL_Applink.html x64-windows/debug/html/man3/OPENSSL_INIT_free.html x64-windows/debug/html/man3/OPENSSL_INIT_new.html x64-windows/debug/html/man3/OPENSSL_INIT_set_config_appname.html x64-windows/debug/html/man3/OPENSSL_INIT_set_config_file_flags.html x64-windows/debug/html/man3/OPENSSL_INIT_set_config_filename.html x64-windows/debug/html/man3/OPENSSL_LH_COMPFUNC.html x64-windows/debug/html/man3/OPENSSL_LH_DOALL_FUNC.html x64-windows/debug/html/man3/OPENSSL_LH_HASHFUNC.html x64-windows/debug/html/man3/OPENSSL_LH_node_stats.html x64-windows/debug/html/man3/OPENSSL_LH_node_stats_bio.html x64-windows/debug/html/man3/OPENSSL_LH_node_usage_stats.html x64-windows/debug/html/man3/OPENSSL_LH_node_usage_stats_bio.html x64-windows/debug/html/man3/OPENSSL_LH_stats.html x64-windows/debug/html/man3/OPENSSL_LH_stats_bio.html x64-windows/debug/html/man3/OPENSSL_MALLOC_FAILURES.html x64-windows/debug/html/man3/OPENSSL_MALLOC_FD.html x64-windows/debug/html/man3/OPENSSL_VERSION_NUMBER.html x64-windows/debug/html/man3/OPENSSL_VERSION_TEXT.html x64-windows/debug/html/man3/OPENSSL_atexit.html x64-windows/debug/html/man3/OPENSSL_buf2hexstr.html x64-windows/debug/html/man3/OPENSSL_cipher_name.html x64-windows/debug/html/man3/OPENSSL_cleanse.html x64-windows/debug/html/man3/OPENSSL_cleanup.html x64-windows/debug/html/man3/OPENSSL_clear_free.html x64-windows/debug/html/man3/OPENSSL_clear_realloc.html x64-windows/debug/html/man3/OPENSSL_config.html x64-windows/debug/html/man3/OPENSSL_fork_child.html x64-windows/debug/html/man3/OPENSSL_fork_parent.html x64-windows/debug/html/man3/OPENSSL_fork_prepare.html x64-windows/debug/html/man3/OPENSSL_free.html x64-windows/debug/html/man3/OPENSSL_hexchar2int.html x64-windows/debug/html/man3/OPENSSL_hexstr2buf.html x64-windows/debug/html/man3/OPENSSL_ia32cap.html x64-windows/debug/html/man3/OPENSSL_init_crypto.html x64-windows/debug/html/man3/OPENSSL_init_ssl.html x64-windows/debug/html/man3/OPENSSL_instrument_bus.html x64-windows/debug/html/man3/OPENSSL_instrument_bus2.html x64-windows/debug/html/man3/OPENSSL_load_builtin_modules.html x64-windows/debug/html/man3/OPENSSL_malloc.html x64-windows/debug/html/man3/OPENSSL_malloc_init.html x64-windows/debug/html/man3/OPENSSL_mem_debug_pop.html x64-windows/debug/html/man3/OPENSSL_mem_debug_push.html x64-windows/debug/html/man3/OPENSSL_memdup.html x64-windows/debug/html/man3/OPENSSL_no_config.html x64-windows/debug/html/man3/OPENSSL_realloc.html x64-windows/debug/html/man3/OPENSSL_secure_actual_size.html x64-windows/debug/html/man3/OPENSSL_secure_clear_free.html x64-windows/debug/html/man3/OPENSSL_secure_free.html x64-windows/debug/html/man3/OPENSSL_secure_malloc.html x64-windows/debug/html/man3/OPENSSL_secure_zalloc.html x64-windows/debug/html/man3/OPENSSL_strdup.html x64-windows/debug/html/man3/OPENSSL_strlcat.html x64-windows/debug/html/man3/OPENSSL_strlcpy.html x64-windows/debug/html/man3/OPENSSL_strndup.html x64-windows/debug/html/man3/OPENSSL_thread_stop.html x64-windows/debug/html/man3/OPENSSL_zalloc.html x64-windows/debug/html/man3/OSSL_STORE_CTX.html x64-windows/debug/html/man3/OSSL_STORE_INFO.html x64-windows/debug/html/man3/OSSL_STORE_INFO_free.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get0_CERT.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get0_CRL.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get0_NAME.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get0_NAME_description.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get0_PARAMS.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get0_PKEY.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get1_CERT.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get1_CRL.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get1_NAME.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get1_NAME_description.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get1_PARAMS.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get1_PKEY.html x64-windows/debug/html/man3/OSSL_STORE_INFO_get_type.html x64-windows/debug/html/man3/OSSL_STORE_INFO_new_CERT.html x64-windows/debug/html/man3/OSSL_STORE_INFO_new_CRL.html x64-windows/debug/html/man3/OSSL_STORE_INFO_new_NAME.html x64-windows/debug/html/man3/OSSL_STORE_INFO_new_PARAMS.html x64-windows/debug/html/man3/OSSL_STORE_INFO_new_PKEY.html x64-windows/debug/html/man3/OSSL_STORE_INFO_set0_NAME_description.html x64-windows/debug/html/man3/OSSL_STORE_INFO_type_string.html x64-windows/debug/html/man3/OSSL_STORE_LOADER.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_CTX.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_free.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_get0_engine.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_get0_scheme.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_new.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_set_close.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_set_ctrl.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_set_eof.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_set_error.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_set_expect.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_set_find.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_set_load.html x64-windows/debug/html/man3/OSSL_STORE_LOADER_set_open.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_by_alias.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_by_issuer_serial.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_by_key_fingerprint.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_by_name.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_free.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_get0_bytes.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_get0_digest.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_get0_name.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_get0_serial.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_get0_string.html x64-windows/debug/html/man3/OSSL_STORE_SEARCH_get_type.html x64-windows/debug/html/man3/OSSL_STORE_close.html x64-windows/debug/html/man3/OSSL_STORE_close_fn.html x64-windows/debug/html/man3/OSSL_STORE_ctrl.html x64-windows/debug/html/man3/OSSL_STORE_ctrl_fn.html x64-windows/debug/html/man3/OSSL_STORE_eof.html x64-windows/debug/html/man3/OSSL_STORE_eof_fn.html x64-windows/debug/html/man3/OSSL_STORE_error.html x64-windows/debug/html/man3/OSSL_STORE_error_fn.html x64-windows/debug/html/man3/OSSL_STORE_expect.html x64-windows/debug/html/man3/OSSL_STORE_expect_fn.html x64-windows/debug/html/man3/OSSL_STORE_find.html x64-windows/debug/html/man3/OSSL_STORE_find_fn.html x64-windows/debug/html/man3/OSSL_STORE_load.html x64-windows/debug/html/man3/OSSL_STORE_load_fn.html x64-windows/debug/html/man3/OSSL_STORE_open.html x64-windows/debug/html/man3/OSSL_STORE_open_fn.html x64-windows/debug/html/man3/OSSL_STORE_post_process_info_fn.html x64-windows/debug/html/man3/OSSL_STORE_register_loader.html x64-windows/debug/html/man3/OSSL_STORE_supports_search.html x64-windows/debug/html/man3/OSSL_STORE_unregister_loader.html x64-windows/debug/html/man3/OTHERNAME_free.html x64-windows/debug/html/man3/OTHERNAME_new.html x64-windows/debug/html/man3/OpenSSL_add_all_algorithms.html x64-windows/debug/html/man3/OpenSSL_add_all_ciphers.html x64-windows/debug/html/man3/OpenSSL_add_all_digests.html x64-windows/debug/html/man3/OpenSSL_add_ssl_algorithms.html x64-windows/debug/html/man3/OpenSSL_version.html x64-windows/debug/html/man3/OpenSSL_version_num.html x64-windows/debug/html/man3/PBE2PARAM_free.html x64-windows/debug/html/man3/PBE2PARAM_new.html x64-windows/debug/html/man3/PBEPARAM_free.html x64-windows/debug/html/man3/PBEPARAM_new.html x64-windows/debug/html/man3/PBKDF2PARAM_free.html x64-windows/debug/html/man3/PBKDF2PARAM_new.html x64-windows/debug/html/man3/PEM_FLAG_EAY_COMPATIBLE.html x64-windows/debug/html/man3/PEM_FLAG_ONLY_B64.html x64-windows/debug/html/man3/PEM_FLAG_SECURE.html x64-windows/debug/html/man3/PEM_bytes_read_bio.html x64-windows/debug/html/man3/PEM_bytes_read_bio_secmem.html x64-windows/debug/html/man3/PEM_do_header.html x64-windows/debug/html/man3/PEM_get_EVP_CIPHER_INFO.html x64-windows/debug/html/man3/PEM_read.html x64-windows/debug/html/man3/PEM_read_CMS.html x64-windows/debug/html/man3/PEM_read_DHparams.html x64-windows/debug/html/man3/PEM_read_DSAPrivateKey.html x64-windows/debug/html/man3/PEM_read_DSA_PUBKEY.html x64-windows/debug/html/man3/PEM_read_DSAparams.html x64-windows/debug/html/man3/PEM_read_ECPKParameters.html x64-windows/debug/html/man3/PEM_read_ECPrivateKey.html x64-windows/debug/html/man3/PEM_read_EC_PUBKEY.html x64-windows/debug/html/man3/PEM_read_NETSCAPE_CERT_SEQUENCE.html x64-windows/debug/html/man3/PEM_read_PKCS7.html x64-windows/debug/html/man3/PEM_read_PKCS8.html x64-windows/debug/html/man3/PEM_read_PKCS8_PRIV_KEY_INFO.html x64-windows/debug/html/man3/PEM_read_PUBKEY.html x64-windows/debug/html/man3/PEM_read_PrivateKey.html x64-windows/debug/html/man3/PEM_read_RSAPrivateKey.html x64-windows/debug/html/man3/PEM_read_RSAPublicKey.html x64-windows/debug/html/man3/PEM_read_RSA_PUBKEY.html x64-windows/debug/html/man3/PEM_read_SSL_SESSION.html x64-windows/debug/html/man3/PEM_read_X509.html x64-windows/debug/html/man3/PEM_read_X509_AUX.html x64-windows/debug/html/man3/PEM_read_X509_CRL.html x64-windows/debug/html/man3/PEM_read_X509_REQ.html x64-windows/debug/html/man3/PEM_read_bio.html x64-windows/debug/html/man3/PEM_read_bio_CMS.html x64-windows/debug/html/man3/PEM_read_bio_DHparams.html x64-windows/debug/html/man3/PEM_read_bio_DSAPrivateKey.html x64-windows/debug/html/man3/PEM_read_bio_DSA_PUBKEY.html x64-windows/debug/html/man3/PEM_read_bio_DSAparams.html x64-windows/debug/html/man3/PEM_read_bio_ECPKParameters.html x64-windows/debug/html/man3/PEM_read_bio_EC_PUBKEY.html x64-windows/debug/html/man3/PEM_read_bio_NETSCAPE_CERT_SEQUENCE.html x64-windows/debug/html/man3/PEM_read_bio_PKCS7.html x64-windows/debug/html/man3/PEM_read_bio_PKCS8.html x64-windows/debug/html/man3/PEM_read_bio_PKCS8_PRIV_KEY_INFO.html x64-windows/debug/html/man3/PEM_read_bio_PUBKEY.html x64-windows/debug/html/man3/PEM_read_bio_PrivateKey.html x64-windows/debug/html/man3/PEM_read_bio_RSAPrivateKey.html x64-windows/debug/html/man3/PEM_read_bio_RSAPublicKey.html x64-windows/debug/html/man3/PEM_read_bio_RSA_PUBKEY.html x64-windows/debug/html/man3/PEM_read_bio_SSL_SESSION.html x64-windows/debug/html/man3/PEM_read_bio_X509.html x64-windows/debug/html/man3/PEM_read_bio_X509_AUX.html x64-windows/debug/html/man3/PEM_read_bio_X509_CRL.html x64-windows/debug/html/man3/PEM_read_bio_X509_REQ.html x64-windows/debug/html/man3/PEM_read_bio_ex.html x64-windows/debug/html/man3/PEM_write.html x64-windows/debug/html/man3/PEM_write_CMS.html x64-windows/debug/html/man3/PEM_write_DHparams.html x64-windows/debug/html/man3/PEM_write_DHxparams.html x64-windows/debug/html/man3/PEM_write_DSAPrivateKey.html x64-windows/debug/html/man3/PEM_write_DSA_PUBKEY.html x64-windows/debug/html/man3/PEM_write_DSAparams.html x64-windows/debug/html/man3/PEM_write_ECPKParameters.html x64-windows/debug/html/man3/PEM_write_ECPrivateKey.html x64-windows/debug/html/man3/PEM_write_EC_PUBKEY.html x64-windows/debug/html/man3/PEM_write_NETSCAPE_CERT_SEQUENCE.html x64-windows/debug/html/man3/PEM_write_PKCS7.html x64-windows/debug/html/man3/PEM_write_PKCS8.html x64-windows/debug/html/man3/PEM_write_PKCS8PrivateKey.html x64-windows/debug/html/man3/PEM_write_PKCS8PrivateKey_nid.html x64-windows/debug/html/man3/PEM_write_PKCS8_PRIV_KEY_INFO.html x64-windows/debug/html/man3/PEM_write_PUBKEY.html x64-windows/debug/html/man3/PEM_write_PrivateKey.html x64-windows/debug/html/man3/PEM_write_RSAPrivateKey.html x64-windows/debug/html/man3/PEM_write_RSAPublicKey.html x64-windows/debug/html/man3/PEM_write_RSA_PUBKEY.html x64-windows/debug/html/man3/PEM_write_SSL_SESSION.html x64-windows/debug/html/man3/PEM_write_X509.html x64-windows/debug/html/man3/PEM_write_X509_AUX.html x64-windows/debug/html/man3/PEM_write_X509_CRL.html x64-windows/debug/html/man3/PEM_write_X509_REQ.html x64-windows/debug/html/man3/PEM_write_X509_REQ_NEW.html x64-windows/debug/html/man3/PEM_write_bio.html x64-windows/debug/html/man3/PEM_write_bio_CMS.html x64-windows/debug/html/man3/PEM_write_bio_CMS_stream.html x64-windows/debug/html/man3/PEM_write_bio_DHparams.html x64-windows/debug/html/man3/PEM_write_bio_DHxparams.html x64-windows/debug/html/man3/PEM_write_bio_DSAPrivateKey.html x64-windows/debug/html/man3/PEM_write_bio_DSA_PUBKEY.html x64-windows/debug/html/man3/PEM_write_bio_DSAparams.html x64-windows/debug/html/man3/PEM_write_bio_ECPKParameters.html x64-windows/debug/html/man3/PEM_write_bio_ECPrivateKey.html x64-windows/debug/html/man3/PEM_write_bio_EC_PUBKEY.html x64-windows/debug/html/man3/PEM_write_bio_NETSCAPE_CERT_SEQUENCE.html x64-windows/debug/html/man3/PEM_write_bio_PKCS7.html x64-windows/debug/html/man3/PEM_write_bio_PKCS7_stream.html x64-windows/debug/html/man3/PEM_write_bio_PKCS8.html x64-windows/debug/html/man3/PEM_write_bio_PKCS8PrivateKey.html x64-windows/debug/html/man3/PEM_write_bio_PKCS8PrivateKey_nid.html x64-windows/debug/html/man3/PEM_write_bio_PKCS8_PRIV_KEY_INFO.html x64-windows/debug/html/man3/PEM_write_bio_PUBKEY.html x64-windows/debug/html/man3/PEM_write_bio_PrivateKey.html x64-windows/debug/html/man3/PEM_write_bio_PrivateKey_traditional.html x64-windows/debug/html/man3/PEM_write_bio_RSAPrivateKey.html x64-windows/debug/html/man3/PEM_write_bio_RSAPublicKey.html x64-windows/debug/html/man3/PEM_write_bio_RSA_PUBKEY.html x64-windows/debug/html/man3/PEM_write_bio_SSL_SESSION.html x64-windows/debug/html/man3/PEM_write_bio_X509.html x64-windows/debug/html/man3/PEM_write_bio_X509_AUX.html x64-windows/debug/html/man3/PEM_write_bio_X509_CRL.html x64-windows/debug/html/man3/PEM_write_bio_X509_REQ.html x64-windows/debug/html/man3/PEM_write_bio_X509_REQ_NEW.html x64-windows/debug/html/man3/PKCS12_BAGS_free.html x64-windows/debug/html/man3/PKCS12_BAGS_new.html x64-windows/debug/html/man3/PKCS12_MAC_DATA_free.html x64-windows/debug/html/man3/PKCS12_MAC_DATA_new.html x64-windows/debug/html/man3/PKCS12_SAFEBAG_free.html x64-windows/debug/html/man3/PKCS12_SAFEBAG_new.html x64-windows/debug/html/man3/PKCS12_create.html x64-windows/debug/html/man3/PKCS12_free.html x64-windows/debug/html/man3/PKCS12_new.html x64-windows/debug/html/man3/PKCS12_newpass.html x64-windows/debug/html/man3/PKCS12_parse.html x64-windows/debug/html/man3/PKCS5_PBKDF2_HMAC.html x64-windows/debug/html/man3/PKCS5_PBKDF2_HMAC_SHA1.html x64-windows/debug/html/man3/PKCS7_DIGEST_free.html x64-windows/debug/html/man3/PKCS7_DIGEST_new.html x64-windows/debug/html/man3/PKCS7_ENCRYPT_free.html x64-windows/debug/html/man3/PKCS7_ENCRYPT_new.html x64-windows/debug/html/man3/PKCS7_ENC_CONTENT_free.html x64-windows/debug/html/man3/PKCS7_ENC_CONTENT_new.html x64-windows/debug/html/man3/PKCS7_ENVELOPE_free.html x64-windows/debug/html/man3/PKCS7_ENVELOPE_new.html x64-windows/debug/html/man3/PKCS7_ISSUER_AND_SERIAL_digest.html x64-windows/debug/html/man3/PKCS7_ISSUER_AND_SERIAL_free.html x64-windows/debug/html/man3/PKCS7_ISSUER_AND_SERIAL_new.html x64-windows/debug/html/man3/PKCS7_RECIP_INFO_free.html x64-windows/debug/html/man3/PKCS7_RECIP_INFO_new.html x64-windows/debug/html/man3/PKCS7_SIGNED_free.html x64-windows/debug/html/man3/PKCS7_SIGNED_new.html x64-windows/debug/html/man3/PKCS7_SIGNER_INFO_free.html x64-windows/debug/html/man3/PKCS7_SIGNER_INFO_new.html x64-windows/debug/html/man3/PKCS7_SIGN_ENVELOPE_free.html x64-windows/debug/html/man3/PKCS7_SIGN_ENVELOPE_new.html x64-windows/debug/html/man3/PKCS7_decrypt.html x64-windows/debug/html/man3/PKCS7_dup.html x64-windows/debug/html/man3/PKCS7_encrypt.html x64-windows/debug/html/man3/PKCS7_free.html x64-windows/debug/html/man3/PKCS7_get0_signers.html x64-windows/debug/html/man3/PKCS7_new.html x64-windows/debug/html/man3/PKCS7_print_ctx.html x64-windows/debug/html/man3/PKCS7_sign.html x64-windows/debug/html/man3/PKCS7_sign_add_signer.html x64-windows/debug/html/man3/PKCS7_verify.html x64-windows/debug/html/man3/PKCS8_PRIV_KEY_INFO_free.html x64-windows/debug/html/man3/PKCS8_PRIV_KEY_INFO_new.html x64-windows/debug/html/man3/PKEY_USAGE_PERIOD_free.html x64-windows/debug/html/man3/PKEY_USAGE_PERIOD_new.html x64-windows/debug/html/man3/POLICYINFO_free.html x64-windows/debug/html/man3/POLICYINFO_new.html x64-windows/debug/html/man3/POLICYQUALINFO_free.html x64-windows/debug/html/man3/POLICYQUALINFO_new.html x64-windows/debug/html/man3/POLICY_CONSTRAINTS_free.html x64-windows/debug/html/man3/POLICY_CONSTRAINTS_new.html x64-windows/debug/html/man3/POLICY_MAPPING_free.html x64-windows/debug/html/man3/POLICY_MAPPING_new.html x64-windows/debug/html/man3/PROFESSION_INFO.html x64-windows/debug/html/man3/PROFESSION_INFOS.html x64-windows/debug/html/man3/PROFESSION_INFOS_free.html x64-windows/debug/html/man3/PROFESSION_INFOS_new.html x64-windows/debug/html/man3/PROFESSION_INFO_free.html x64-windows/debug/html/man3/PROFESSION_INFO_get0_addProfessionInfo.html x64-windows/debug/html/man3/PROFESSION_INFO_get0_namingAuthority.html x64-windows/debug/html/man3/PROFESSION_INFO_get0_professionItems.html x64-windows/debug/html/man3/PROFESSION_INFO_get0_professionOIDs.html x64-windows/debug/html/man3/PROFESSION_INFO_get0_registrationNumber.html x64-windows/debug/html/man3/PROFESSION_INFO_new.html x64-windows/debug/html/man3/PROFESSION_INFO_set0_addProfessionInfo.html x64-windows/debug/html/man3/PROFESSION_INFO_set0_namingAuthority.html x64-windows/debug/html/man3/PROFESSION_INFO_set0_professionItems.html x64-windows/debug/html/man3/PROFESSION_INFO_set0_professionOIDs.html x64-windows/debug/html/man3/PROFESSION_INFO_set0_registrationNumber.html x64-windows/debug/html/man3/PROXY_CERT_INFO_EXTENSION_free.html x64-windows/debug/html/man3/PROXY_CERT_INFO_EXTENSION_new.html x64-windows/debug/html/man3/PROXY_POLICY_free.html x64-windows/debug/html/man3/PROXY_POLICY_new.html x64-windows/debug/html/man3/RAND_DRBG_bytes.html x64-windows/debug/html/man3/RAND_DRBG_cleanup_entropy_fn.html x64-windows/debug/html/man3/RAND_DRBG_cleanup_nonce_fn.html x64-windows/debug/html/man3/RAND_DRBG_free.html x64-windows/debug/html/man3/RAND_DRBG_generate.html x64-windows/debug/html/man3/RAND_DRBG_get0_master.html x64-windows/debug/html/man3/RAND_DRBG_get0_private.html x64-windows/debug/html/man3/RAND_DRBG_get0_public.html x64-windows/debug/html/man3/RAND_DRBG_get_entropy_fn.html x64-windows/debug/html/man3/RAND_DRBG_get_ex_data.html x64-windows/debug/html/man3/RAND_DRBG_get_ex_new_index.html x64-windows/debug/html/man3/RAND_DRBG_get_nonce_fn.html x64-windows/debug/html/man3/RAND_DRBG_instantiate.html x64-windows/debug/html/man3/RAND_DRBG_new.html x64-windows/debug/html/man3/RAND_DRBG_reseed.html x64-windows/debug/html/man3/RAND_DRBG_secure_new.html x64-windows/debug/html/man3/RAND_DRBG_set.html x64-windows/debug/html/man3/RAND_DRBG_set_callbacks.html x64-windows/debug/html/man3/RAND_DRBG_set_defaults.html x64-windows/debug/html/man3/RAND_DRBG_set_ex_data.html x64-windows/debug/html/man3/RAND_DRBG_set_reseed_defaults.html x64-windows/debug/html/man3/RAND_DRBG_set_reseed_interval.html x64-windows/debug/html/man3/RAND_DRBG_set_reseed_time_interval.html x64-windows/debug/html/man3/RAND_DRBG_uninstantiate.html x64-windows/debug/html/man3/RAND_OpenSSL.html x64-windows/debug/html/man3/RAND_add.html x64-windows/debug/html/man3/RAND_bytes.html x64-windows/debug/html/man3/RAND_cleanup.html x64-windows/debug/html/man3/RAND_egd.html x64-windows/debug/html/man3/RAND_egd_bytes.html x64-windows/debug/html/man3/RAND_event.html x64-windows/debug/html/man3/RAND_file_name.html x64-windows/debug/html/man3/RAND_get_rand_method.html x64-windows/debug/html/man3/RAND_keep_random_devices_open.html x64-windows/debug/html/man3/RAND_load_file.html x64-windows/debug/html/man3/RAND_poll.html x64-windows/debug/html/man3/RAND_priv_bytes.html x64-windows/debug/html/man3/RAND_pseudo_bytes.html x64-windows/debug/html/man3/RAND_query_egd_bytes.html x64-windows/debug/html/man3/RAND_screen.html x64-windows/debug/html/man3/RAND_seed.html x64-windows/debug/html/man3/RAND_set_rand_method.html x64-windows/debug/html/man3/RAND_status.html x64-windows/debug/html/man3/RAND_write_file.html x64-windows/debug/html/man3/RC4.html x64-windows/debug/html/man3/RC4_set_key.html x64-windows/debug/html/man3/RIPEMD160.html x64-windows/debug/html/man3/RIPEMD160_Final.html x64-windows/debug/html/man3/RIPEMD160_Init.html x64-windows/debug/html/man3/RIPEMD160_Update.html x64-windows/debug/html/man3/RSAPrivateKey_dup.html x64-windows/debug/html/man3/RSAPublicKey_dup.html x64-windows/debug/html/man3/RSA_OAEP_PARAMS_free.html x64-windows/debug/html/man3/RSA_OAEP_PARAMS_new.html x64-windows/debug/html/man3/RSA_PKCS1_OpenSSL.html x64-windows/debug/html/man3/RSA_PSS_PARAMS_free.html x64-windows/debug/html/man3/RSA_PSS_PARAMS_new.html x64-windows/debug/html/man3/RSA_bits.html x64-windows/debug/html/man3/RSA_blinding_off.html x64-windows/debug/html/man3/RSA_blinding_on.html x64-windows/debug/html/man3/RSA_check_key.html x64-windows/debug/html/man3/RSA_check_key_ex.html x64-windows/debug/html/man3/RSA_clear_flags.html x64-windows/debug/html/man3/RSA_flags.html x64-windows/debug/html/man3/RSA_free.html x64-windows/debug/html/man3/RSA_generate_key.html x64-windows/debug/html/man3/RSA_generate_key_ex.html x64-windows/debug/html/man3/RSA_generate_multi_prime_key.html x64-windows/debug/html/man3/RSA_get0_crt_params.html x64-windows/debug/html/man3/RSA_get0_d.html x64-windows/debug/html/man3/RSA_get0_dmp1.html x64-windows/debug/html/man3/RSA_get0_dmq1.html x64-windows/debug/html/man3/RSA_get0_e.html x64-windows/debug/html/man3/RSA_get0_engine.html x64-windows/debug/html/man3/RSA_get0_factors.html x64-windows/debug/html/man3/RSA_get0_iqmp.html x64-windows/debug/html/man3/RSA_get0_key.html x64-windows/debug/html/man3/RSA_get0_multi_prime_crt_params.html x64-windows/debug/html/man3/RSA_get0_multi_prime_factors.html x64-windows/debug/html/man3/RSA_get0_n.html x64-windows/debug/html/man3/RSA_get0_p.html x64-windows/debug/html/man3/RSA_get0_q.html x64-windows/debug/html/man3/RSA_get_default_method.html x64-windows/debug/html/man3/RSA_get_ex_data.html x64-windows/debug/html/man3/RSA_get_ex_new_index.html x64-windows/debug/html/man3/RSA_get_method.html x64-windows/debug/html/man3/RSA_get_multi_prime_extra_count.html x64-windows/debug/html/man3/RSA_get_version.html x64-windows/debug/html/man3/RSA_meth_dup.html x64-windows/debug/html/man3/RSA_meth_free.html x64-windows/debug/html/man3/RSA_meth_get0_app_data.html x64-windows/debug/html/man3/RSA_meth_get0_name.html x64-windows/debug/html/man3/RSA_meth_get_bn_mod_exp.html x64-windows/debug/html/man3/RSA_meth_get_finish.html x64-windows/debug/html/man3/RSA_meth_get_flags.html x64-windows/debug/html/man3/RSA_meth_get_init.html x64-windows/debug/html/man3/RSA_meth_get_keygen.html x64-windows/debug/html/man3/RSA_meth_get_mod_exp.html x64-windows/debug/html/man3/RSA_meth_get_multi_prime_keygen.html x64-windows/debug/html/man3/RSA_meth_get_priv_dec.html x64-windows/debug/html/man3/RSA_meth_get_priv_enc.html x64-windows/debug/html/man3/RSA_meth_get_pub_dec.html x64-windows/debug/html/man3/RSA_meth_get_pub_enc.html x64-windows/debug/html/man3/RSA_meth_get_sign.html x64-windows/debug/html/man3/RSA_meth_get_verify.html x64-windows/debug/html/man3/RSA_meth_new.html x64-windows/debug/html/man3/RSA_meth_set0_app_data.html x64-windows/debug/html/man3/RSA_meth_set1_name.html x64-windows/debug/html/man3/RSA_meth_set_bn_mod_exp.html x64-windows/debug/html/man3/RSA_meth_set_finish.html x64-windows/debug/html/man3/RSA_meth_set_flags.html x64-windows/debug/html/man3/RSA_meth_set_init.html x64-windows/debug/html/man3/RSA_meth_set_keygen.html x64-windows/debug/html/man3/RSA_meth_set_mod_exp.html x64-windows/debug/html/man3/RSA_meth_set_multi_prime_keygen.html x64-windows/debug/html/man3/RSA_meth_set_priv_dec.html x64-windows/debug/html/man3/RSA_meth_set_priv_enc.html x64-windows/debug/html/man3/RSA_meth_set_pub_dec.html x64-windows/debug/html/man3/RSA_meth_set_pub_enc.html x64-windows/debug/html/man3/RSA_meth_set_sign.html x64-windows/debug/html/man3/RSA_meth_set_verify.html x64-windows/debug/html/man3/RSA_new.html x64-windows/debug/html/man3/RSA_new_method.html x64-windows/debug/html/man3/RSA_padding_add_PKCS1_OAEP.html x64-windows/debug/html/man3/RSA_padding_add_PKCS1_OAEP_mgf1.html x64-windows/debug/html/man3/RSA_padding_add_PKCS1_type_1.html x64-windows/debug/html/man3/RSA_padding_add_PKCS1_type_2.html x64-windows/debug/html/man3/RSA_padding_add_SSLv23.html x64-windows/debug/html/man3/RSA_padding_add_none.html x64-windows/debug/html/man3/RSA_padding_check_PKCS1_OAEP.html x64-windows/debug/html/man3/RSA_padding_check_PKCS1_OAEP_mgf1.html x64-windows/debug/html/man3/RSA_padding_check_PKCS1_type_1.html x64-windows/debug/html/man3/RSA_padding_check_PKCS1_type_2.html x64-windows/debug/html/man3/RSA_padding_check_SSLv23.html x64-windows/debug/html/man3/RSA_padding_check_none.html x64-windows/debug/html/man3/RSA_print.html x64-windows/debug/html/man3/RSA_print_fp.html x64-windows/debug/html/man3/RSA_private_decrypt.html x64-windows/debug/html/man3/RSA_private_encrypt.html x64-windows/debug/html/man3/RSA_public_decrypt.html x64-windows/debug/html/man3/RSA_public_encrypt.html x64-windows/debug/html/man3/RSA_security_bits.html x64-windows/debug/html/man3/RSA_set0_crt_params.html x64-windows/debug/html/man3/RSA_set0_factors.html x64-windows/debug/html/man3/RSA_set0_key.html x64-windows/debug/html/man3/RSA_set0_multi_prime_params.html x64-windows/debug/html/man3/RSA_set_default_method.html x64-windows/debug/html/man3/RSA_set_ex_data.html x64-windows/debug/html/man3/RSA_set_flags.html x64-windows/debug/html/man3/RSA_set_method.html x64-windows/debug/html/man3/RSA_sign.html x64-windows/debug/html/man3/RSA_sign_ASN1_OCTET_STRING.html x64-windows/debug/html/man3/RSA_size.html x64-windows/debug/html/man3/RSA_test_flags.html x64-windows/debug/html/man3/RSA_verify.html x64-windows/debug/html/man3/RSA_verify_ASN1_OCTET_STRING.html x64-windows/debug/html/man3/SCRYPT_PARAMS_free.html x64-windows/debug/html/man3/SCRYPT_PARAMS_new.html x64-windows/debug/html/man3/SCT_LIST_free.html x64-windows/debug/html/man3/SCT_LIST_print.html x64-windows/debug/html/man3/SCT_LIST_validate.html x64-windows/debug/html/man3/SCT_free.html x64-windows/debug/html/man3/SCT_get0_extensions.html x64-windows/debug/html/man3/SCT_get0_log_id.html x64-windows/debug/html/man3/SCT_get0_signature.html x64-windows/debug/html/man3/SCT_get_log_entry_type.html x64-windows/debug/html/man3/SCT_get_signature_nid.html x64-windows/debug/html/man3/SCT_get_source.html x64-windows/debug/html/man3/SCT_get_timestamp.html x64-windows/debug/html/man3/SCT_get_validation_status.html x64-windows/debug/html/man3/SCT_get_version.html x64-windows/debug/html/man3/SCT_new.html x64-windows/debug/html/man3/SCT_new_from_base64.html x64-windows/debug/html/man3/SCT_print.html x64-windows/debug/html/man3/SCT_set0_extensions.html x64-windows/debug/html/man3/SCT_set0_log_id.html x64-windows/debug/html/man3/SCT_set0_signature.html x64-windows/debug/html/man3/SCT_set1_extensions.html x64-windows/debug/html/man3/SCT_set1_log_id.html x64-windows/debug/html/man3/SCT_set1_signature.html x64-windows/debug/html/man3/SCT_set_log_entry_type.html x64-windows/debug/html/man3/SCT_set_signature_nid.html x64-windows/debug/html/man3/SCT_set_source.html x64-windows/debug/html/man3/SCT_set_timestamp.html x64-windows/debug/html/man3/SCT_set_version.html x64-windows/debug/html/man3/SCT_validate.html x64-windows/debug/html/man3/SCT_validation_status_string.html x64-windows/debug/html/man3/SHA1.html x64-windows/debug/html/man3/SHA1_Final.html x64-windows/debug/html/man3/SHA1_Init.html x64-windows/debug/html/man3/SHA1_Update.html x64-windows/debug/html/man3/SHA224.html x64-windows/debug/html/man3/SHA224_Final.html x64-windows/debug/html/man3/SHA224_Init.html x64-windows/debug/html/man3/SHA224_Update.html x64-windows/debug/html/man3/SHA256.html x64-windows/debug/html/man3/SHA256_Final.html x64-windows/debug/html/man3/SHA256_Init.html x64-windows/debug/html/man3/SHA256_Update.html x64-windows/debug/html/man3/SHA384.html x64-windows/debug/html/man3/SHA384_Final.html x64-windows/debug/html/man3/SHA384_Init.html x64-windows/debug/html/man3/SHA384_Update.html x64-windows/debug/html/man3/SHA512.html x64-windows/debug/html/man3/SHA512_Final.html x64-windows/debug/html/man3/SHA512_Init.html x64-windows/debug/html/man3/SHA512_Update.html x64-windows/debug/html/man3/SMIME_read_CMS.html x64-windows/debug/html/man3/SMIME_read_PKCS7.html x64-windows/debug/html/man3/SMIME_write_CMS.html x64-windows/debug/html/man3/SMIME_write_PKCS7.html x64-windows/debug/html/man3/SSL_CIPHER_description.html x64-windows/debug/html/man3/SSL_CIPHER_find.html x64-windows/debug/html/man3/SSL_CIPHER_get_auth_nid.html x64-windows/debug/html/man3/SSL_CIPHER_get_bits.html x64-windows/debug/html/man3/SSL_CIPHER_get_cipher_nid.html x64-windows/debug/html/man3/SSL_CIPHER_get_digest_nid.html x64-windows/debug/html/man3/SSL_CIPHER_get_handshake_digest.html x64-windows/debug/html/man3/SSL_CIPHER_get_id.html x64-windows/debug/html/man3/SSL_CIPHER_get_kx_nid.html x64-windows/debug/html/man3/SSL_CIPHER_get_name.html x64-windows/debug/html/man3/SSL_CIPHER_get_protocol_id.html x64-windows/debug/html/man3/SSL_CIPHER_get_version.html x64-windows/debug/html/man3/SSL_CIPHER_is_aead.html x64-windows/debug/html/man3/SSL_CIPHER_standard_name.html x64-windows/debug/html/man3/SSL_COMP_add_compression_method.html x64-windows/debug/html/man3/SSL_COMP_free_compression_methods.html x64-windows/debug/html/man3/SSL_COMP_get0_name.html x64-windows/debug/html/man3/SSL_COMP_get_compression_methods.html x64-windows/debug/html/man3/SSL_COMP_get_id.html x64-windows/debug/html/man3/SSL_CONF_CTX_clear_flags.html x64-windows/debug/html/man3/SSL_CONF_CTX_free.html x64-windows/debug/html/man3/SSL_CONF_CTX_new.html x64-windows/debug/html/man3/SSL_CONF_CTX_set1_prefix.html x64-windows/debug/html/man3/SSL_CONF_CTX_set_flags.html x64-windows/debug/html/man3/SSL_CONF_CTX_set_ssl.html x64-windows/debug/html/man3/SSL_CONF_CTX_set_ssl_ctx.html x64-windows/debug/html/man3/SSL_CONF_cmd.html x64-windows/debug/html/man3/SSL_CONF_cmd_argv.html x64-windows/debug/html/man3/SSL_CONF_cmd_value_type.html x64-windows/debug/html/man3/SSL_CTX_add0_chain_cert.html x64-windows/debug/html/man3/SSL_CTX_add1_chain_cert.html x64-windows/debug/html/man3/SSL_CTX_add1_to_CA_list.html x64-windows/debug/html/man3/SSL_CTX_add_client_CA.html x64-windows/debug/html/man3/SSL_CTX_add_client_custom_ext.html x64-windows/debug/html/man3/SSL_CTX_add_custom_ext.html x64-windows/debug/html/man3/SSL_CTX_add_extra_chain_cert.html x64-windows/debug/html/man3/SSL_CTX_add_server_custom_ext.html x64-windows/debug/html/man3/SSL_CTX_add_session.html x64-windows/debug/html/man3/SSL_CTX_build_cert_chain.html x64-windows/debug/html/man3/SSL_CTX_callback_ctrl.html x64-windows/debug/html/man3/SSL_CTX_check_private_key.html x64-windows/debug/html/man3/SSL_CTX_clear_chain_certs.html x64-windows/debug/html/man3/SSL_CTX_clear_extra_chain_certs.html x64-windows/debug/html/man3/SSL_CTX_clear_mode.html x64-windows/debug/html/man3/SSL_CTX_clear_options.html x64-windows/debug/html/man3/SSL_CTX_config.html x64-windows/debug/html/man3/SSL_CTX_ct_is_enabled.html x64-windows/debug/html/man3/SSL_CTX_ctrl.html x64-windows/debug/html/man3/SSL_CTX_dane_clear_flags.html x64-windows/debug/html/man3/SSL_CTX_dane_enable.html x64-windows/debug/html/man3/SSL_CTX_dane_mtype_set.html x64-windows/debug/html/man3/SSL_CTX_dane_set_flags.html x64-windows/debug/html/man3/SSL_CTX_decrypt_session_ticket_fn.html x64-windows/debug/html/man3/SSL_CTX_disable_ct.html x64-windows/debug/html/man3/SSL_CTX_enable_ct.html x64-windows/debug/html/man3/SSL_CTX_flush_sessions.html x64-windows/debug/html/man3/SSL_CTX_free.html x64-windows/debug/html/man3/SSL_CTX_generate_session_ticket_fn.html x64-windows/debug/html/man3/SSL_CTX_get0_CA_list.html x64-windows/debug/html/man3/SSL_CTX_get0_chain_certs.html x64-windows/debug/html/man3/SSL_CTX_get0_param.html x64-windows/debug/html/man3/SSL_CTX_get0_security_ex_data.html x64-windows/debug/html/man3/SSL_CTX_get_cert_store.html x64-windows/debug/html/man3/SSL_CTX_get_ciphers.html x64-windows/debug/html/man3/SSL_CTX_get_client_CA_list.html x64-windows/debug/html/man3/SSL_CTX_get_client_cert_cb.html x64-windows/debug/html/man3/SSL_CTX_get_default_passwd_cb.html x64-windows/debug/html/man3/SSL_CTX_get_default_passwd_cb_userdata.html x64-windows/debug/html/man3/SSL_CTX_get_default_read_ahead.html x64-windows/debug/html/man3/SSL_CTX_get_ex_data.html x64-windows/debug/html/man3/SSL_CTX_get_info_callback.html x64-windows/debug/html/man3/SSL_CTX_get_keylog_callback.html x64-windows/debug/html/man3/SSL_CTX_get_max_cert_list.html x64-windows/debug/html/man3/SSL_CTX_get_max_early_data.html x64-windows/debug/html/man3/SSL_CTX_get_max_proto_version.html x64-windows/debug/html/man3/SSL_CTX_get_min_proto_version.html x64-windows/debug/html/man3/SSL_CTX_get_mode.html x64-windows/debug/html/man3/SSL_CTX_get_num_tickets.html x64-windows/debug/html/man3/SSL_CTX_get_options.html x64-windows/debug/html/man3/SSL_CTX_get_quiet_shutdown.html x64-windows/debug/html/man3/SSL_CTX_get_read_ahead.html x64-windows/debug/html/man3/SSL_CTX_get_record_padding_callback_arg.html x64-windows/debug/html/man3/SSL_CTX_get_recv_max_early_data.html x64-windows/debug/html/man3/SSL_CTX_get_security_callback.html x64-windows/debug/html/man3/SSL_CTX_get_security_level.html x64-windows/debug/html/man3/SSL_CTX_get_session_cache_mode.html x64-windows/debug/html/man3/SSL_CTX_get_timeout.html x64-windows/debug/html/man3/SSL_CTX_get_tlsext_status_arg.html x64-windows/debug/html/man3/SSL_CTX_get_tlsext_status_cb.html x64-windows/debug/html/man3/SSL_CTX_get_tlsext_status_type.html x64-windows/debug/html/man3/SSL_CTX_get_verify_callback.html x64-windows/debug/html/man3/SSL_CTX_get_verify_depth.html x64-windows/debug/html/man3/SSL_CTX_get_verify_mode.html x64-windows/debug/html/man3/SSL_CTX_has_client_custom_ext.html x64-windows/debug/html/man3/SSL_CTX_keylog_cb_func.html x64-windows/debug/html/man3/SSL_CTX_load_verify_locations.html x64-windows/debug/html/man3/SSL_CTX_new.html x64-windows/debug/html/man3/SSL_CTX_remove_session.html x64-windows/debug/html/man3/SSL_CTX_select_current_cert.html x64-windows/debug/html/man3/SSL_CTX_sess_accept.html x64-windows/debug/html/man3/SSL_CTX_sess_accept_good.html x64-windows/debug/html/man3/SSL_CTX_sess_accept_renegotiate.html x64-windows/debug/html/man3/SSL_CTX_sess_cache_full.html x64-windows/debug/html/man3/SSL_CTX_sess_cb_hits.html x64-windows/debug/html/man3/SSL_CTX_sess_connect.html x64-windows/debug/html/man3/SSL_CTX_sess_connect_good.html x64-windows/debug/html/man3/SSL_CTX_sess_connect_renegotiate.html x64-windows/debug/html/man3/SSL_CTX_sess_get_cache_size.html x64-windows/debug/html/man3/SSL_CTX_sess_get_get_cb.html x64-windows/debug/html/man3/SSL_CTX_sess_get_new_cb.html x64-windows/debug/html/man3/SSL_CTX_sess_get_remove_cb.html x64-windows/debug/html/man3/SSL_CTX_sess_hits.html x64-windows/debug/html/man3/SSL_CTX_sess_misses.html x64-windows/debug/html/man3/SSL_CTX_sess_number.html x64-windows/debug/html/man3/SSL_CTX_sess_set_cache_size.html x64-windows/debug/html/man3/SSL_CTX_sess_set_get_cb.html x64-windows/debug/html/man3/SSL_CTX_sess_set_new_cb.html x64-windows/debug/html/man3/SSL_CTX_sess_set_remove_cb.html x64-windows/debug/html/man3/SSL_CTX_sess_timeouts.html x64-windows/debug/html/man3/SSL_CTX_sessions.html x64-windows/debug/html/man3/SSL_CTX_set0_CA_list.html x64-windows/debug/html/man3/SSL_CTX_set0_chain.html x64-windows/debug/html/man3/SSL_CTX_set0_chain_cert_store.html x64-windows/debug/html/man3/SSL_CTX_set0_security_ex_data.html x64-windows/debug/html/man3/SSL_CTX_set0_verify_cert_store.html x64-windows/debug/html/man3/SSL_CTX_set1_cert_store.html x64-windows/debug/html/man3/SSL_CTX_set1_chain.html x64-windows/debug/html/man3/SSL_CTX_set1_chain_cert_store.html x64-windows/debug/html/man3/SSL_CTX_set1_client_sigalgs.html x64-windows/debug/html/man3/SSL_CTX_set1_client_sigalgs_list.html x64-windows/debug/html/man3/SSL_CTX_set1_curves.html x64-windows/debug/html/man3/SSL_CTX_set1_curves_list.html x64-windows/debug/html/man3/SSL_CTX_set1_groups.html x64-windows/debug/html/man3/SSL_CTX_set1_groups_list.html x64-windows/debug/html/man3/SSL_CTX_set1_param.html x64-windows/debug/html/man3/SSL_CTX_set1_sigalgs.html x64-windows/debug/html/man3/SSL_CTX_set1_sigalgs_list.html x64-windows/debug/html/man3/SSL_CTX_set1_verify_cert_store.html x64-windows/debug/html/man3/SSL_CTX_set_allow_early_data_cb.html x64-windows/debug/html/man3/SSL_CTX_set_alpn_protos.html x64-windows/debug/html/man3/SSL_CTX_set_alpn_select_cb.html x64-windows/debug/html/man3/SSL_CTX_set_block_padding.html x64-windows/debug/html/man3/SSL_CTX_set_cert_cb.html x64-windows/debug/html/man3/SSL_CTX_set_cert_store.html x64-windows/debug/html/man3/SSL_CTX_set_cert_verify_callback.html x64-windows/debug/html/man3/SSL_CTX_set_cipher_list.html x64-windows/debug/html/man3/SSL_CTX_set_ciphersuites.html x64-windows/debug/html/man3/SSL_CTX_set_client_CA_list.html x64-windows/debug/html/man3/SSL_CTX_set_client_cert_cb.html x64-windows/debug/html/man3/SSL_CTX_set_client_hello_cb.html x64-windows/debug/html/man3/SSL_CTX_set_ct_validation_callback.html x64-windows/debug/html/man3/SSL_CTX_set_ctlog_list_file.html x64-windows/debug/html/man3/SSL_CTX_set_current_cert.html x64-windows/debug/html/man3/SSL_CTX_set_default_ctlog_list_file.html x64-windows/debug/html/man3/SSL_CTX_set_default_passwd_cb.html x64-windows/debug/html/man3/SSL_CTX_set_default_passwd_cb_userdata.html x64-windows/debug/html/man3/SSL_CTX_set_default_read_buffer_len.html x64-windows/debug/html/man3/SSL_CTX_set_default_verify_dir.html x64-windows/debug/html/man3/SSL_CTX_set_default_verify_file.html x64-windows/debug/html/man3/SSL_CTX_set_default_verify_paths.html x64-windows/debug/html/man3/SSL_CTX_set_ex_data.html x64-windows/debug/html/man3/SSL_CTX_set_generate_session_id.html x64-windows/debug/html/man3/SSL_CTX_set_info_callback.html x64-windows/debug/html/man3/SSL_CTX_set_keylog_callback.html x64-windows/debug/html/man3/SSL_CTX_set_max_cert_list.html x64-windows/debug/html/man3/SSL_CTX_set_max_early_data.html x64-windows/debug/html/man3/SSL_CTX_set_max_pipelines.html x64-windows/debug/html/man3/SSL_CTX_set_max_proto_version.html x64-windows/debug/html/man3/SSL_CTX_set_max_send_fragment.html x64-windows/debug/html/man3/SSL_CTX_set_min_proto_version.html x64-windows/debug/html/man3/SSL_CTX_set_mode.html x64-windows/debug/html/man3/SSL_CTX_set_msg_callback.html x64-windows/debug/html/man3/SSL_CTX_set_msg_callback_arg.html x64-windows/debug/html/man3/SSL_CTX_set_next_proto_select_cb.html x64-windows/debug/html/man3/SSL_CTX_set_next_protos_advertised_cb.html x64-windows/debug/html/man3/SSL_CTX_set_num_tickets.html x64-windows/debug/html/man3/SSL_CTX_set_options.html x64-windows/debug/html/man3/SSL_CTX_set_post_handshake_auth.html x64-windows/debug/html/man3/SSL_CTX_set_psk_client_callback.html x64-windows/debug/html/man3/SSL_CTX_set_psk_find_session_callback.html x64-windows/debug/html/man3/SSL_CTX_set_psk_server_callback.html x64-windows/debug/html/man3/SSL_CTX_set_psk_use_session_callback.html x64-windows/debug/html/man3/SSL_CTX_set_quiet_shutdown.html x64-windows/debug/html/man3/SSL_CTX_set_read_ahead.html x64-windows/debug/html/man3/SSL_CTX_set_record_padding_callback.html x64-windows/debug/html/man3/SSL_CTX_set_record_padding_callback_arg.html x64-windows/debug/html/man3/SSL_CTX_set_recv_max_early_data.html x64-windows/debug/html/man3/SSL_CTX_set_security_callback.html x64-windows/debug/html/man3/SSL_CTX_set_security_level.html x64-windows/debug/html/man3/SSL_CTX_set_session_cache_mode.html x64-windows/debug/html/man3/SSL_CTX_set_session_id_context.html x64-windows/debug/html/man3/SSL_CTX_set_session_ticket_cb.html x64-windows/debug/html/man3/SSL_CTX_set_split_send_fragment.html x64-windows/debug/html/man3/SSL_CTX_set_ssl_version.html x64-windows/debug/html/man3/SSL_CTX_set_stateless_cookie_generate_cb.html x64-windows/debug/html/man3/SSL_CTX_set_stateless_cookie_verify_cb.html x64-windows/debug/html/man3/SSL_CTX_set_timeout.html x64-windows/debug/html/man3/SSL_CTX_set_tlsext_max_fragment_length.html x64-windows/debug/html/man3/SSL_CTX_set_tlsext_servername_arg.html x64-windows/debug/html/man3/SSL_CTX_set_tlsext_servername_callback.html x64-windows/debug/html/man3/SSL_CTX_set_tlsext_status_arg.html x64-windows/debug/html/man3/SSL_CTX_set_tlsext_status_cb.html x64-windows/debug/html/man3/SSL_CTX_set_tlsext_status_type.html x64-windows/debug/html/man3/SSL_CTX_set_tlsext_ticket_key_cb.html x64-windows/debug/html/man3/SSL_CTX_set_tlsext_use_srtp.html x64-windows/debug/html/man3/SSL_CTX_set_tmp_dh.html x64-windows/debug/html/man3/SSL_CTX_set_tmp_dh_callback.html x64-windows/debug/html/man3/SSL_CTX_set_verify.html x64-windows/debug/html/man3/SSL_CTX_set_verify_depth.html x64-windows/debug/html/man3/SSL_CTX_up_ref.html x64-windows/debug/html/man3/SSL_CTX_use_PrivateKey.html x64-windows/debug/html/man3/SSL_CTX_use_PrivateKey_ASN1.html x64-windows/debug/html/man3/SSL_CTX_use_PrivateKey_file.html x64-windows/debug/html/man3/SSL_CTX_use_RSAPrivateKey.html x64-windows/debug/html/man3/SSL_CTX_use_RSAPrivateKey_ASN1.html x64-windows/debug/html/man3/SSL_CTX_use_RSAPrivateKey_file.html x64-windows/debug/html/man3/SSL_CTX_use_cert_and_key.html x64-windows/debug/html/man3/SSL_CTX_use_certificate.html x64-windows/debug/html/man3/SSL_CTX_use_certificate_ASN1.html x64-windows/debug/html/man3/SSL_CTX_use_certificate_chain_file.html x64-windows/debug/html/man3/SSL_CTX_use_certificate_file.html x64-windows/debug/html/man3/SSL_CTX_use_psk_identity_hint.html x64-windows/debug/html/man3/SSL_CTX_use_serverinfo.html x64-windows/debug/html/man3/SSL_CTX_use_serverinfo_ex.html x64-windows/debug/html/man3/SSL_CTX_use_serverinfo_file.html x64-windows/debug/html/man3/SSL_SESSION_dup.html x64-windows/debug/html/man3/SSL_SESSION_free.html x64-windows/debug/html/man3/SSL_SESSION_get0_alpn_selected.html x64-windows/debug/html/man3/SSL_SESSION_get0_cipher.html x64-windows/debug/html/man3/SSL_SESSION_get0_hostname.html x64-windows/debug/html/man3/SSL_SESSION_get0_id_context.html x64-windows/debug/html/man3/SSL_SESSION_get0_peer.html x64-windows/debug/html/man3/SSL_SESSION_get0_ticket.html x64-windows/debug/html/man3/SSL_SESSION_get0_ticket_appdata.html x64-windows/debug/html/man3/SSL_SESSION_get_compress_id.html x64-windows/debug/html/man3/SSL_SESSION_get_ex_data.html x64-windows/debug/html/man3/SSL_SESSION_get_id.html x64-windows/debug/html/man3/SSL_SESSION_get_master_key.html x64-windows/debug/html/man3/SSL_SESSION_get_max_early_data.html x64-windows/debug/html/man3/SSL_SESSION_get_max_fragment_length.html x64-windows/debug/html/man3/SSL_SESSION_get_protocol_version.html x64-windows/debug/html/man3/SSL_SESSION_get_ticket_lifetime_hint.html x64-windows/debug/html/man3/SSL_SESSION_get_time.html x64-windows/debug/html/man3/SSL_SESSION_get_timeout.html x64-windows/debug/html/man3/SSL_SESSION_has_ticket.html x64-windows/debug/html/man3/SSL_SESSION_is_resumable.html x64-windows/debug/html/man3/SSL_SESSION_new.html x64-windows/debug/html/man3/SSL_SESSION_print.html x64-windows/debug/html/man3/SSL_SESSION_print_fp.html x64-windows/debug/html/man3/SSL_SESSION_print_keylog.html x64-windows/debug/html/man3/SSL_SESSION_set1_alpn_selected.html x64-windows/debug/html/man3/SSL_SESSION_set1_hostname.html x64-windows/debug/html/man3/SSL_SESSION_set1_id.html x64-windows/debug/html/man3/SSL_SESSION_set1_id_context.html x64-windows/debug/html/man3/SSL_SESSION_set1_master_key.html x64-windows/debug/html/man3/SSL_SESSION_set1_ticket_appdata.html x64-windows/debug/html/man3/SSL_SESSION_set_cipher.html x64-windows/debug/html/man3/SSL_SESSION_set_ex_data.html x64-windows/debug/html/man3/SSL_SESSION_set_max_early_data.html x64-windows/debug/html/man3/SSL_SESSION_set_protocol_version.html x64-windows/debug/html/man3/SSL_SESSION_set_time.html x64-windows/debug/html/man3/SSL_SESSION_set_timeout.html x64-windows/debug/html/man3/SSL_SESSION_up_ref.html x64-windows/debug/html/man3/SSL_accept.html x64-windows/debug/html/man3/SSL_add0_chain_cert.html x64-windows/debug/html/man3/SSL_add1_chain_cert.html x64-windows/debug/html/man3/SSL_add1_host.html x64-windows/debug/html/man3/SSL_add1_to_CA_list.html x64-windows/debug/html/man3/SSL_add_client_CA.html x64-windows/debug/html/man3/SSL_alert_desc_string.html x64-windows/debug/html/man3/SSL_alert_desc_string_long.html x64-windows/debug/html/man3/SSL_alert_type_string.html x64-windows/debug/html/man3/SSL_alert_type_string_long.html x64-windows/debug/html/man3/SSL_alloc_buffers.html x64-windows/debug/html/man3/SSL_allow_early_data_cb_fn.html x64-windows/debug/html/man3/SSL_build_cert_chain.html x64-windows/debug/html/man3/SSL_bytes_to_cipher_list.html x64-windows/debug/html/man3/SSL_callback_ctrl.html x64-windows/debug/html/man3/SSL_check_chain.html x64-windows/debug/html/man3/SSL_check_private_key.html x64-windows/debug/html/man3/SSL_clear.html x64-windows/debug/html/man3/SSL_clear_chain_certs.html x64-windows/debug/html/man3/SSL_clear_mode.html x64-windows/debug/html/man3/SSL_clear_options.html x64-windows/debug/html/man3/SSL_client_hello_cb_fn.html x64-windows/debug/html/man3/SSL_client_hello_get0_ciphers.html x64-windows/debug/html/man3/SSL_client_hello_get0_compression_methods.html x64-windows/debug/html/man3/SSL_client_hello_get0_ext.html x64-windows/debug/html/man3/SSL_client_hello_get0_legacy_version.html x64-windows/debug/html/man3/SSL_client_hello_get0_random.html x64-windows/debug/html/man3/SSL_client_hello_get0_session_id.html x64-windows/debug/html/man3/SSL_client_hello_get1_extensions_present.html x64-windows/debug/html/man3/SSL_client_hello_isv2.html x64-windows/debug/html/man3/SSL_client_version.html x64-windows/debug/html/man3/SSL_config.html x64-windows/debug/html/man3/SSL_connect.html x64-windows/debug/html/man3/SSL_ct_is_enabled.html x64-windows/debug/html/man3/SSL_ctrl.html x64-windows/debug/html/man3/SSL_dane_clear_flags.html x64-windows/debug/html/man3/SSL_dane_enable.html x64-windows/debug/html/man3/SSL_dane_set_flags.html x64-windows/debug/html/man3/SSL_dane_tlsa_add.html x64-windows/debug/html/man3/SSL_disable_ct.html x64-windows/debug/html/man3/SSL_do_handshake.html x64-windows/debug/html/man3/SSL_dup.html x64-windows/debug/html/man3/SSL_enable_ct.html x64-windows/debug/html/man3/SSL_export_keying_material.html x64-windows/debug/html/man3/SSL_export_keying_material_early.html x64-windows/debug/html/man3/SSL_extension_supported.html x64-windows/debug/html/man3/SSL_free.html x64-windows/debug/html/man3/SSL_free_buffers.html x64-windows/debug/html/man3/SSL_get0_CA_list.html x64-windows/debug/html/man3/SSL_get0_alpn_selected.html x64-windows/debug/html/man3/SSL_get0_chain_certs.html x64-windows/debug/html/man3/SSL_get0_dane_authority.html x64-windows/debug/html/man3/SSL_get0_dane_tlsa.html x64-windows/debug/html/man3/SSL_get0_next_proto_negotiated.html x64-windows/debug/html/man3/SSL_get0_param.html x64-windows/debug/html/man3/SSL_get0_peer_CA_list.html x64-windows/debug/html/man3/SSL_get0_peer_scts.html x64-windows/debug/html/man3/SSL_get0_peername.html x64-windows/debug/html/man3/SSL_get0_security_ex_data.html x64-windows/debug/html/man3/SSL_get0_session.html x64-windows/debug/html/man3/SSL_get0_verified_chain.html x64-windows/debug/html/man3/SSL_get1_curves.html x64-windows/debug/html/man3/SSL_get1_groups.html x64-windows/debug/html/man3/SSL_get1_session.html x64-windows/debug/html/man3/SSL_get1_supported_ciphers.html x64-windows/debug/html/man3/SSL_get_SSL_CTX.html x64-windows/debug/html/man3/SSL_get_all_async_fds.html x64-windows/debug/html/man3/SSL_get_changed_async_fds.html x64-windows/debug/html/man3/SSL_get_cipher.html x64-windows/debug/html/man3/SSL_get_cipher_bits.html x64-windows/debug/html/man3/SSL_get_cipher_list.html x64-windows/debug/html/man3/SSL_get_cipher_name.html x64-windows/debug/html/man3/SSL_get_cipher_version.html x64-windows/debug/html/man3/SSL_get_ciphers.html x64-windows/debug/html/man3/SSL_get_client_CA_list.html x64-windows/debug/html/man3/SSL_get_client_ciphers.html x64-windows/debug/html/man3/SSL_get_client_random.html x64-windows/debug/html/man3/SSL_get_current_cipher.html x64-windows/debug/html/man3/SSL_get_default_passwd_cb.html x64-windows/debug/html/man3/SSL_get_default_passwd_cb_userdata.html x64-windows/debug/html/man3/SSL_get_default_timeout.html x64-windows/debug/html/man3/SSL_get_early_data_status.html x64-windows/debug/html/man3/SSL_get_error.html x64-windows/debug/html/man3/SSL_get_ex_data.html x64-windows/debug/html/man3/SSL_get_ex_data_X509_STORE_CTX_idx.html x64-windows/debug/html/man3/SSL_get_extms_support.html x64-windows/debug/html/man3/SSL_get_fd.html x64-windows/debug/html/man3/SSL_get_info_callback.html x64-windows/debug/html/man3/SSL_get_key_update_type.html x64-windows/debug/html/man3/SSL_get_max_cert_list.html x64-windows/debug/html/man3/SSL_get_max_early_data.html x64-windows/debug/html/man3/SSL_get_max_proto_version.html x64-windows/debug/html/man3/SSL_get_min_proto_version.html x64-windows/debug/html/man3/SSL_get_mode.html x64-windows/debug/html/man3/SSL_get_num_tickets.html x64-windows/debug/html/man3/SSL_get_options.html x64-windows/debug/html/man3/SSL_get_peer_cert_chain.html x64-windows/debug/html/man3/SSL_get_peer_certificate.html x64-windows/debug/html/man3/SSL_get_peer_signature_nid.html x64-windows/debug/html/man3/SSL_get_peer_signature_type_nid.html x64-windows/debug/html/man3/SSL_get_peer_tmp_key.html x64-windows/debug/html/man3/SSL_get_pending_cipher.html x64-windows/debug/html/man3/SSL_get_psk_identity.html x64-windows/debug/html/man3/SSL_get_psk_identity_hint.html x64-windows/debug/html/man3/SSL_get_quiet_shutdown.html x64-windows/debug/html/man3/SSL_get_rbio.html x64-windows/debug/html/man3/SSL_get_read_ahead.html x64-windows/debug/html/man3/SSL_get_record_padding_callback_arg.html x64-windows/debug/html/man3/SSL_get_recv_max_early_data.html x64-windows/debug/html/man3/SSL_get_rfd.html x64-windows/debug/html/man3/SSL_get_secure_renegotiation_support.html x64-windows/debug/html/man3/SSL_get_security_callback.html x64-windows/debug/html/man3/SSL_get_security_level.html x64-windows/debug/html/man3/SSL_get_selected_srtp_profile.html x64-windows/debug/html/man3/SSL_get_server_random.html x64-windows/debug/html/man3/SSL_get_server_tmp_key.html x64-windows/debug/html/man3/SSL_get_servername.html x64-windows/debug/html/man3/SSL_get_servername_type.html x64-windows/debug/html/man3/SSL_get_session.html x64-windows/debug/html/man3/SSL_get_shared_ciphers.html x64-windows/debug/html/man3/SSL_get_shared_curve.html x64-windows/debug/html/man3/SSL_get_shared_group.html x64-windows/debug/html/man3/SSL_get_shared_sigalgs.html x64-windows/debug/html/man3/SSL_get_shutdown.html x64-windows/debug/html/man3/SSL_get_sigalgs.html x64-windows/debug/html/man3/SSL_get_signature_nid.html x64-windows/debug/html/man3/SSL_get_signature_type_nid.html x64-windows/debug/html/man3/SSL_get_srtp_profiles.html x64-windows/debug/html/man3/SSL_get_ssl_method.html x64-windows/debug/html/man3/SSL_get_state.html x64-windows/debug/html/man3/SSL_get_time.html x64-windows/debug/html/man3/SSL_get_timeout.html x64-windows/debug/html/man3/SSL_get_tlsext_status_ocsp_resp.html x64-windows/debug/html/man3/SSL_get_tlsext_status_type.html x64-windows/debug/html/man3/SSL_get_tmp_key.html x64-windows/debug/html/man3/SSL_get_verify_callback.html x64-windows/debug/html/man3/SSL_get_verify_depth.html x64-windows/debug/html/man3/SSL_get_verify_mode.html x64-windows/debug/html/man3/SSL_get_verify_result.html x64-windows/debug/html/man3/SSL_get_version.html x64-windows/debug/html/man3/SSL_get_wbio.html x64-windows/debug/html/man3/SSL_get_wfd.html x64-windows/debug/html/man3/SSL_has_matching_session_id.html x64-windows/debug/html/man3/SSL_has_pending.html x64-windows/debug/html/man3/SSL_in_accept_init.html x64-windows/debug/html/man3/SSL_in_before.html x64-windows/debug/html/man3/SSL_in_connect_init.html x64-windows/debug/html/man3/SSL_in_init.html x64-windows/debug/html/man3/SSL_is_dtls.html x64-windows/debug/html/man3/SSL_is_init_finished.html x64-windows/debug/html/man3/SSL_is_server.html x64-windows/debug/html/man3/SSL_key_update.html x64-windows/debug/html/man3/SSL_library_init.html x64-windows/debug/html/man3/SSL_load_client_CA_file.html x64-windows/debug/html/man3/SSL_load_error_strings.html x64-windows/debug/html/man3/SSL_new.html x64-windows/debug/html/man3/SSL_peek.html x64-windows/debug/html/man3/SSL_peek_ex.html x64-windows/debug/html/man3/SSL_pending.html x64-windows/debug/html/man3/SSL_psk_client_cb_func.html x64-windows/debug/html/man3/SSL_psk_find_session_cb_func.html x64-windows/debug/html/man3/SSL_psk_server_cb_func.html x64-windows/debug/html/man3/SSL_psk_use_session_cb_func.html x64-windows/debug/html/man3/SSL_read.html x64-windows/debug/html/man3/SSL_read_early_data.html x64-windows/debug/html/man3/SSL_read_ex.html x64-windows/debug/html/man3/SSL_renegotiate.html x64-windows/debug/html/man3/SSL_renegotiate_abbreviated.html x64-windows/debug/html/man3/SSL_renegotiate_pending.html x64-windows/debug/html/man3/SSL_rstate_string.html x64-windows/debug/html/man3/SSL_rstate_string_long.html x64-windows/debug/html/man3/SSL_select_current_cert.html x64-windows/debug/html/man3/SSL_select_next_proto.html x64-windows/debug/html/man3/SSL_session_reused.html x64-windows/debug/html/man3/SSL_set0_CA_list.html x64-windows/debug/html/man3/SSL_set0_chain.html x64-windows/debug/html/man3/SSL_set0_chain_cert_store.html x64-windows/debug/html/man3/SSL_set0_rbio.html x64-windows/debug/html/man3/SSL_set0_security_ex_data.html x64-windows/debug/html/man3/SSL_set0_verify_cert_store.html x64-windows/debug/html/man3/SSL_set0_wbio.html x64-windows/debug/html/man3/SSL_set1_chain.html x64-windows/debug/html/man3/SSL_set1_chain_cert_store.html x64-windows/debug/html/man3/SSL_set1_client_sigalgs.html x64-windows/debug/html/man3/SSL_set1_client_sigalgs_list.html x64-windows/debug/html/man3/SSL_set1_curves.html x64-windows/debug/html/man3/SSL_set1_curves_list.html x64-windows/debug/html/man3/SSL_set1_groups.html x64-windows/debug/html/man3/SSL_set1_groups_list.html x64-windows/debug/html/man3/SSL_set1_host.html x64-windows/debug/html/man3/SSL_set1_param.html x64-windows/debug/html/man3/SSL_set1_sigalgs.html x64-windows/debug/html/man3/SSL_set1_sigalgs_list.html x64-windows/debug/html/man3/SSL_set1_verify_cert_store.html x64-windows/debug/html/man3/SSL_set_accept_state.html x64-windows/debug/html/man3/SSL_set_allow_early_data_cb.html x64-windows/debug/html/man3/SSL_set_alpn_protos.html x64-windows/debug/html/man3/SSL_set_bio.html x64-windows/debug/html/man3/SSL_set_block_padding.html x64-windows/debug/html/man3/SSL_set_cert_cb.html x64-windows/debug/html/man3/SSL_set_cipher_list.html x64-windows/debug/html/man3/SSL_set_ciphersuites.html x64-windows/debug/html/man3/SSL_set_client_CA_list.html x64-windows/debug/html/man3/SSL_set_connect_state.html x64-windows/debug/html/man3/SSL_set_ct_validation_callback.html x64-windows/debug/html/man3/SSL_set_current_cert.html x64-windows/debug/html/man3/SSL_set_default_passwd_cb.html x64-windows/debug/html/man3/SSL_set_default_passwd_cb_userdata.html x64-windows/debug/html/man3/SSL_set_default_read_buffer_len.html x64-windows/debug/html/man3/SSL_set_ex_data.html x64-windows/debug/html/man3/SSL_set_fd.html x64-windows/debug/html/man3/SSL_set_generate_session_id.html x64-windows/debug/html/man3/SSL_set_hostflags.html x64-windows/debug/html/man3/SSL_set_info_callback.html x64-windows/debug/html/man3/SSL_set_max_cert_list.html x64-windows/debug/html/man3/SSL_set_max_early_data.html x64-windows/debug/html/man3/SSL_set_max_pipelines.html x64-windows/debug/html/man3/SSL_set_max_proto_version.html x64-windows/debug/html/man3/SSL_set_max_send_fragment.html x64-windows/debug/html/man3/SSL_set_min_proto_version.html x64-windows/debug/html/man3/SSL_set_mode.html x64-windows/debug/html/man3/SSL_set_msg_callback.html x64-windows/debug/html/man3/SSL_set_msg_callback_arg.html x64-windows/debug/html/man3/SSL_set_num_tickets.html x64-windows/debug/html/man3/SSL_set_options.html x64-windows/debug/html/man3/SSL_set_post_handshake_auth.html x64-windows/debug/html/man3/SSL_set_psk_client_callback.html x64-windows/debug/html/man3/SSL_set_psk_find_session_callback.html x64-windows/debug/html/man3/SSL_set_psk_server_callback.html x64-windows/debug/html/man3/SSL_set_psk_use_session_callback.html x64-windows/debug/html/man3/SSL_set_quiet_shutdown.html x64-windows/debug/html/man3/SSL_set_read_ahead.html x64-windows/debug/html/man3/SSL_set_record_padding_callback.html x64-windows/debug/html/man3/SSL_set_record_padding_callback_arg.html x64-windows/debug/html/man3/SSL_set_recv_max_early_data.html x64-windows/debug/html/man3/SSL_set_rfd.html x64-windows/debug/html/man3/SSL_set_security_callback.html x64-windows/debug/html/man3/SSL_set_security_level.html x64-windows/debug/html/man3/SSL_set_session.html x64-windows/debug/html/man3/SSL_set_session_id_context.html x64-windows/debug/html/man3/SSL_set_shutdown.html x64-windows/debug/html/man3/SSL_set_split_send_fragment.html x64-windows/debug/html/man3/SSL_set_ssl_method.html x64-windows/debug/html/man3/SSL_set_time.html x64-windows/debug/html/man3/SSL_set_timeout.html x64-windows/debug/html/man3/SSL_set_tlsext_host_name.html x64-windows/debug/html/man3/SSL_set_tlsext_max_fragment_length.html x64-windows/debug/html/man3/SSL_set_tlsext_status_ocsp_resp.html x64-windows/debug/html/man3/SSL_set_tlsext_status_type.html x64-windows/debug/html/man3/SSL_set_tlsext_use_srtp.html x64-windows/debug/html/man3/SSL_set_tmp_dh.html x64-windows/debug/html/man3/SSL_set_tmp_dh_callback.html x64-windows/debug/html/man3/SSL_set_verify.html x64-windows/debug/html/man3/SSL_set_verify_depth.html x64-windows/debug/html/man3/SSL_set_verify_result.html x64-windows/debug/html/man3/SSL_set_wfd.html x64-windows/debug/html/man3/SSL_shutdown.html x64-windows/debug/html/man3/SSL_state_string.html x64-windows/debug/html/man3/SSL_state_string_long.html x64-windows/debug/html/man3/SSL_stateless.html x64-windows/debug/html/man3/SSL_up_ref.html x64-windows/debug/html/man3/SSL_use_PrivateKey.html x64-windows/debug/html/man3/SSL_use_PrivateKey_ASN1.html x64-windows/debug/html/man3/SSL_use_PrivateKey_file.html x64-windows/debug/html/man3/SSL_use_RSAPrivateKey.html x64-windows/debug/html/man3/SSL_use_RSAPrivateKey_ASN1.html x64-windows/debug/html/man3/SSL_use_RSAPrivateKey_file.html x64-windows/debug/html/man3/SSL_use_cert_and_key.html x64-windows/debug/html/man3/SSL_use_certificate.html x64-windows/debug/html/man3/SSL_use_certificate_ASN1.html x64-windows/debug/html/man3/SSL_use_certificate_chain_file.html x64-windows/debug/html/man3/SSL_use_certificate_file.html x64-windows/debug/html/man3/SSL_use_psk_identity_hint.html x64-windows/debug/html/man3/SSL_verify_cb.html x64-windows/debug/html/man3/SSL_verify_client_post_handshake.html x64-windows/debug/html/man3/SSL_version.html x64-windows/debug/html/man3/SSL_waiting_for_async.html x64-windows/debug/html/man3/SSL_want.html x64-windows/debug/html/man3/SSL_want_async.html x64-windows/debug/html/man3/SSL_want_async_job.html x64-windows/debug/html/man3/SSL_want_client_hello_cb.html x64-windows/debug/html/man3/SSL_want_nothing.html x64-windows/debug/html/man3/SSL_want_read.html x64-windows/debug/html/man3/SSL_want_write.html x64-windows/debug/html/man3/SSL_want_x509_lookup.html x64-windows/debug/html/man3/SSL_write.html x64-windows/debug/html/man3/SSL_write_early_data.html x64-windows/debug/html/man3/SSL_write_ex.html x64-windows/debug/html/man3/SSLv23_client_method.html x64-windows/debug/html/man3/SSLv23_method.html x64-windows/debug/html/man3/SSLv23_server_method.html x64-windows/debug/html/man3/SSLv3_client_method.html x64-windows/debug/html/man3/SSLv3_method.html x64-windows/debug/html/man3/SSLv3_server_method.html x64-windows/debug/html/man3/SXNETID_free.html x64-windows/debug/html/man3/SXNETID_new.html x64-windows/debug/html/man3/SXNET_free.html x64-windows/debug/html/man3/SXNET_new.html x64-windows/debug/html/man3/TLS_FEATURE_free.html x64-windows/debug/html/man3/TLS_FEATURE_new.html x64-windows/debug/html/man3/TLS_client_method.html x64-windows/debug/html/man3/TLS_method.html x64-windows/debug/html/man3/TLS_server_method.html x64-windows/debug/html/man3/TLSv1_1_client_method.html x64-windows/debug/html/man3/TLSv1_1_method.html x64-windows/debug/html/man3/TLSv1_1_server_method.html x64-windows/debug/html/man3/TLSv1_2_client_method.html x64-windows/debug/html/man3/TLSv1_2_method.html x64-windows/debug/html/man3/TLSv1_2_server_method.html x64-windows/debug/html/man3/TLSv1_client_method.html x64-windows/debug/html/man3/TLSv1_method.html x64-windows/debug/html/man3/TLSv1_server_method.html x64-windows/debug/html/man3/TS_ACCURACY_dup.html x64-windows/debug/html/man3/TS_ACCURACY_free.html x64-windows/debug/html/man3/TS_ACCURACY_new.html x64-windows/debug/html/man3/TS_MSG_IMPRINT_dup.html x64-windows/debug/html/man3/TS_MSG_IMPRINT_free.html x64-windows/debug/html/man3/TS_MSG_IMPRINT_new.html x64-windows/debug/html/man3/TS_REQ_dup.html x64-windows/debug/html/man3/TS_REQ_free.html x64-windows/debug/html/man3/TS_REQ_new.html x64-windows/debug/html/man3/TS_RESP_dup.html x64-windows/debug/html/man3/TS_RESP_free.html x64-windows/debug/html/man3/TS_RESP_new.html x64-windows/debug/html/man3/TS_STATUS_INFO_dup.html x64-windows/debug/html/man3/TS_STATUS_INFO_free.html x64-windows/debug/html/man3/TS_STATUS_INFO_new.html x64-windows/debug/html/man3/TS_TST_INFO_dup.html x64-windows/debug/html/man3/TS_TST_INFO_free.html x64-windows/debug/html/man3/TS_TST_INFO_new.html x64-windows/debug/html/man3/UI.html x64-windows/debug/html/man3/UI_METHOD.html x64-windows/debug/html/man3/UI_OpenSSL.html x64-windows/debug/html/man3/UI_STRING.html x64-windows/debug/html/man3/UI_UTIL_read_pw.html x64-windows/debug/html/man3/UI_UTIL_read_pw_string.html x64-windows/debug/html/man3/UI_UTIL_wrap_read_pem_callback.html x64-windows/debug/html/man3/UI_add_error_string.html x64-windows/debug/html/man3/UI_add_info_string.html x64-windows/debug/html/man3/UI_add_input_boolean.html x64-windows/debug/html/man3/UI_add_input_string.html x64-windows/debug/html/man3/UI_add_user_data.html x64-windows/debug/html/man3/UI_add_verify_string.html x64-windows/debug/html/man3/UI_construct_prompt.html x64-windows/debug/html/man3/UI_create_method.html x64-windows/debug/html/man3/UI_ctrl.html x64-windows/debug/html/man3/UI_destroy_method.html x64-windows/debug/html/man3/UI_dup_error_string.html x64-windows/debug/html/man3/UI_dup_info_string.html x64-windows/debug/html/man3/UI_dup_input_boolean.html x64-windows/debug/html/man3/UI_dup_input_string.html x64-windows/debug/html/man3/UI_dup_user_data.html x64-windows/debug/html/man3/UI_dup_verify_string.html x64-windows/debug/html/man3/UI_free.html x64-windows/debug/html/man3/UI_get0_action_string.html x64-windows/debug/html/man3/UI_get0_output_string.html x64-windows/debug/html/man3/UI_get0_result.html x64-windows/debug/html/man3/UI_get0_result_string.html x64-windows/debug/html/man3/UI_get0_test_string.html x64-windows/debug/html/man3/UI_get0_user_data.html x64-windows/debug/html/man3/UI_get_default_method.html x64-windows/debug/html/man3/UI_get_ex_data.html x64-windows/debug/html/man3/UI_get_ex_new_index.html x64-windows/debug/html/man3/UI_get_input_flags.html x64-windows/debug/html/man3/UI_get_method.html x64-windows/debug/html/man3/UI_get_result_length.html x64-windows/debug/html/man3/UI_get_result_maxsize.html x64-windows/debug/html/man3/UI_get_result_minsize.html x64-windows/debug/html/man3/UI_get_result_string_length.html x64-windows/debug/html/man3/UI_get_string_type.html x64-windows/debug/html/man3/UI_method_get_closer.html x64-windows/debug/html/man3/UI_method_get_data_destructor.html x64-windows/debug/html/man3/UI_method_get_data_duplicator.html x64-windows/debug/html/man3/UI_method_get_ex_data.html x64-windows/debug/html/man3/UI_method_get_flusher.html x64-windows/debug/html/man3/UI_method_get_opener.html x64-windows/debug/html/man3/UI_method_get_prompt_constructor.html x64-windows/debug/html/man3/UI_method_get_reader.html x64-windows/debug/html/man3/UI_method_get_writer.html x64-windows/debug/html/man3/UI_method_set_closer.html x64-windows/debug/html/man3/UI_method_set_data_duplicator.html x64-windows/debug/html/man3/UI_method_set_ex_data.html x64-windows/debug/html/man3/UI_method_set_flusher.html x64-windows/debug/html/man3/UI_method_set_opener.html x64-windows/debug/html/man3/UI_method_set_prompt_constructor.html x64-windows/debug/html/man3/UI_method_set_reader.html x64-windows/debug/html/man3/UI_method_set_writer.html x64-windows/debug/html/man3/UI_new.html x64-windows/debug/html/man3/UI_new_method.html x64-windows/debug/html/man3/UI_null.html x64-windows/debug/html/man3/UI_process.html x64-windows/debug/html/man3/UI_set_default_method.html x64-windows/debug/html/man3/UI_set_ex_data.html x64-windows/debug/html/man3/UI_set_method.html x64-windows/debug/html/man3/UI_set_result.html x64-windows/debug/html/man3/UI_set_result_ex.html x64-windows/debug/html/man3/UI_string_types.html x64-windows/debug/html/man3/USERNOTICE_free.html x64-windows/debug/html/man3/USERNOTICE_new.html x64-windows/debug/html/man3/X509V3_EXT_d2i.html x64-windows/debug/html/man3/X509V3_EXT_i2d.html x64-windows/debug/html/man3/X509V3_add1_i2d.html x64-windows/debug/html/man3/X509V3_get_d2i.html x64-windows/debug/html/man3/X509_ALGOR_cmp.html x64-windows/debug/html/man3/X509_ALGOR_dup.html x64-windows/debug/html/man3/X509_ALGOR_free.html x64-windows/debug/html/man3/X509_ALGOR_get0.html x64-windows/debug/html/man3/X509_ALGOR_new.html x64-windows/debug/html/man3/X509_ALGOR_set0.html x64-windows/debug/html/man3/X509_ALGOR_set_md.html x64-windows/debug/html/man3/X509_ATTRIBUTE_dup.html x64-windows/debug/html/man3/X509_ATTRIBUTE_free.html x64-windows/debug/html/man3/X509_ATTRIBUTE_new.html x64-windows/debug/html/man3/X509_CERT_AUX_free.html x64-windows/debug/html/man3/X509_CERT_AUX_new.html x64-windows/debug/html/man3/X509_CINF_free.html x64-windows/debug/html/man3/X509_CINF_new.html x64-windows/debug/html/man3/X509_CRL_INFO_free.html x64-windows/debug/html/man3/X509_CRL_INFO_new.html x64-windows/debug/html/man3/X509_CRL_add0_revoked.html x64-windows/debug/html/man3/X509_CRL_add1_ext_i2d.html x64-windows/debug/html/man3/X509_CRL_add_ext.html x64-windows/debug/html/man3/X509_CRL_cmp.html x64-windows/debug/html/man3/X509_CRL_delete_ext.html x64-windows/debug/html/man3/X509_CRL_digest.html x64-windows/debug/html/man3/X509_CRL_dup.html x64-windows/debug/html/man3/X509_CRL_free.html x64-windows/debug/html/man3/X509_CRL_get0_by_cert.html x64-windows/debug/html/man3/X509_CRL_get0_by_serial.html x64-windows/debug/html/man3/X509_CRL_get0_extensions.html x64-windows/debug/html/man3/X509_CRL_get0_lastUpdate.html x64-windows/debug/html/man3/X509_CRL_get0_nextUpdate.html x64-windows/debug/html/man3/X509_CRL_get0_signature.html x64-windows/debug/html/man3/X509_CRL_get_REVOKED.html x64-windows/debug/html/man3/X509_CRL_get_ext.html x64-windows/debug/html/man3/X509_CRL_get_ext_by_NID.html x64-windows/debug/html/man3/X509_CRL_get_ext_by_OBJ.html x64-windows/debug/html/man3/X509_CRL_get_ext_by_critical.html x64-windows/debug/html/man3/X509_CRL_get_ext_count.html x64-windows/debug/html/man3/X509_CRL_get_ext_d2i.html x64-windows/debug/html/man3/X509_CRL_get_issuer.html x64-windows/debug/html/man3/X509_CRL_get_signature_nid.html x64-windows/debug/html/man3/X509_CRL_get_version.html x64-windows/debug/html/man3/X509_CRL_match.html x64-windows/debug/html/man3/X509_CRL_new.html x64-windows/debug/html/man3/X509_CRL_set1_lastUpdate.html x64-windows/debug/html/man3/X509_CRL_set1_nextUpdate.html x64-windows/debug/html/man3/X509_CRL_set_issuer_name.html x64-windows/debug/html/man3/X509_CRL_set_version.html x64-windows/debug/html/man3/X509_CRL_sign.html x64-windows/debug/html/man3/X509_CRL_sign_ctx.html x64-windows/debug/html/man3/X509_CRL_sort.html x64-windows/debug/html/man3/X509_CRL_verify.html x64-windows/debug/html/man3/X509_EXTENSION_create_by_NID.html x64-windows/debug/html/man3/X509_EXTENSION_create_by_OBJ.html x64-windows/debug/html/man3/X509_EXTENSION_dup.html x64-windows/debug/html/man3/X509_EXTENSION_free.html x64-windows/debug/html/man3/X509_EXTENSION_get_critical.html x64-windows/debug/html/man3/X509_EXTENSION_get_data.html x64-windows/debug/html/man3/X509_EXTENSION_get_object.html x64-windows/debug/html/man3/X509_EXTENSION_new.html x64-windows/debug/html/man3/X509_EXTENSION_set_critical.html x64-windows/debug/html/man3/X509_EXTENSION_set_data.html x64-windows/debug/html/man3/X509_EXTENSION_set_object.html x64-windows/debug/html/man3/X509_LOOKUP_ctrl_fn.html x64-windows/debug/html/man3/X509_LOOKUP_file.html x64-windows/debug/html/man3/X509_LOOKUP_get_by_alias_fn.html x64-windows/debug/html/man3/X509_LOOKUP_get_by_fingerprint_fn.html x64-windows/debug/html/man3/X509_LOOKUP_get_by_issuer_serial_fn.html x64-windows/debug/html/man3/X509_LOOKUP_get_by_subject_fn.html x64-windows/debug/html/man3/X509_LOOKUP_get_method_data.html x64-windows/debug/html/man3/X509_LOOKUP_get_store.html x64-windows/debug/html/man3/X509_LOOKUP_hash_dir.html x64-windows/debug/html/man3/X509_LOOKUP_meth_free.html x64-windows/debug/html/man3/X509_LOOKUP_meth_get_ctrl.html x64-windows/debug/html/man3/X509_LOOKUP_meth_get_free.html x64-windows/debug/html/man3/X509_LOOKUP_meth_get_get_by_alias.html x64-windows/debug/html/man3/X509_LOOKUP_meth_get_get_by_fingerprint.html x64-windows/debug/html/man3/X509_LOOKUP_meth_get_get_by_issuer_serial.html x64-windows/debug/html/man3/X509_LOOKUP_meth_get_get_by_subject.html x64-windows/debug/html/man3/X509_LOOKUP_meth_get_init.html x64-windows/debug/html/man3/X509_LOOKUP_meth_get_new_item.html x64-windows/debug/html/man3/X509_LOOKUP_meth_get_shutdown.html x64-windows/debug/html/man3/X509_LOOKUP_meth_new.html x64-windows/debug/html/man3/X509_LOOKUP_meth_set_ctrl.html x64-windows/debug/html/man3/X509_LOOKUP_meth_set_free.html x64-windows/debug/html/man3/X509_LOOKUP_meth_set_get_by_alias.html x64-windows/debug/html/man3/X509_LOOKUP_meth_set_get_by_fingerprint.html x64-windows/debug/html/man3/X509_LOOKUP_meth_set_get_by_issuer_serial.html x64-windows/debug/html/man3/X509_LOOKUP_meth_set_get_by_subject.html x64-windows/debug/html/man3/X509_LOOKUP_meth_set_init.html x64-windows/debug/html/man3/X509_LOOKUP_meth_set_new_item.html x64-windows/debug/html/man3/X509_LOOKUP_meth_set_shutdown.html x64-windows/debug/html/man3/X509_LOOKUP_set_method_data.html x64-windows/debug/html/man3/X509_NAME_ENTRY_create_by_NID.html x64-windows/debug/html/man3/X509_NAME_ENTRY_create_by_OBJ.html x64-windows/debug/html/man3/X509_NAME_ENTRY_create_by_txt.html x64-windows/debug/html/man3/X509_NAME_ENTRY_dup.html x64-windows/debug/html/man3/X509_NAME_ENTRY_free.html x64-windows/debug/html/man3/X509_NAME_ENTRY_get_data.html x64-windows/debug/html/man3/X509_NAME_ENTRY_get_object.html x64-windows/debug/html/man3/X509_NAME_ENTRY_new.html x64-windows/debug/html/man3/X509_NAME_ENTRY_set_data.html x64-windows/debug/html/man3/X509_NAME_ENTRY_set_object.html x64-windows/debug/html/man3/X509_NAME_add_entry.html x64-windows/debug/html/man3/X509_NAME_add_entry_by_NID.html x64-windows/debug/html/man3/X509_NAME_add_entry_by_OBJ.html x64-windows/debug/html/man3/X509_NAME_add_entry_by_txt.html x64-windows/debug/html/man3/X509_NAME_cmp.html x64-windows/debug/html/man3/X509_NAME_delete_entry.html x64-windows/debug/html/man3/X509_NAME_digest.html x64-windows/debug/html/man3/X509_NAME_dup.html x64-windows/debug/html/man3/X509_NAME_entry_count.html x64-windows/debug/html/man3/X509_NAME_free.html x64-windows/debug/html/man3/X509_NAME_get0_der.html x64-windows/debug/html/man3/X509_NAME_get_entry.html x64-windows/debug/html/man3/X509_NAME_get_index_by_NID.html x64-windows/debug/html/man3/X509_NAME_get_index_by_OBJ.html x64-windows/debug/html/man3/X509_NAME_get_text_by_NID.html x64-windows/debug/html/man3/X509_NAME_get_text_by_OBJ.html x64-windows/debug/html/man3/X509_NAME_new.html x64-windows/debug/html/man3/X509_NAME_oneline.html x64-windows/debug/html/man3/X509_NAME_print.html x64-windows/debug/html/man3/X509_NAME_print_ex.html x64-windows/debug/html/man3/X509_NAME_print_ex_fp.html x64-windows/debug/html/man3/X509_OBJECT_set1_X509.html x64-windows/debug/html/man3/X509_OBJECT_set1_X509_CRL.html x64-windows/debug/html/man3/X509_PUBKEY_free.html x64-windows/debug/html/man3/X509_PUBKEY_get.html x64-windows/debug/html/man3/X509_PUBKEY_get0.html x64-windows/debug/html/man3/X509_PUBKEY_get0_param.html x64-windows/debug/html/man3/X509_PUBKEY_new.html x64-windows/debug/html/man3/X509_PUBKEY_set.html x64-windows/debug/html/man3/X509_PUBKEY_set0_param.html x64-windows/debug/html/man3/X509_REQ_INFO_free.html x64-windows/debug/html/man3/X509_REQ_INFO_new.html x64-windows/debug/html/man3/X509_REQ_check_private_key.html x64-windows/debug/html/man3/X509_REQ_digest.html x64-windows/debug/html/man3/X509_REQ_dup.html x64-windows/debug/html/man3/X509_REQ_free.html x64-windows/debug/html/man3/X509_REQ_get0_pubkey.html x64-windows/debug/html/man3/X509_REQ_get0_signature.html x64-windows/debug/html/man3/X509_REQ_get_X509_PUBKEY.html x64-windows/debug/html/man3/X509_REQ_get_pubkey.html x64-windows/debug/html/man3/X509_REQ_get_signature_nid.html x64-windows/debug/html/man3/X509_REQ_get_subject_name.html x64-windows/debug/html/man3/X509_REQ_get_version.html x64-windows/debug/html/man3/X509_REQ_new.html x64-windows/debug/html/man3/X509_REQ_set_pubkey.html x64-windows/debug/html/man3/X509_REQ_set_subject_name.html x64-windows/debug/html/man3/X509_REQ_set_version.html x64-windows/debug/html/man3/X509_REQ_sign.html x64-windows/debug/html/man3/X509_REQ_sign_ctx.html x64-windows/debug/html/man3/X509_REQ_verify.html x64-windows/debug/html/man3/X509_REVOKED_add1_ext_i2d.html x64-windows/debug/html/man3/X509_REVOKED_add_ext.html x64-windows/debug/html/man3/X509_REVOKED_delete_ext.html x64-windows/debug/html/man3/X509_REVOKED_dup.html x64-windows/debug/html/man3/X509_REVOKED_free.html x64-windows/debug/html/man3/X509_REVOKED_get0_extensions.html x64-windows/debug/html/man3/X509_REVOKED_get0_revocationDate.html x64-windows/debug/html/man3/X509_REVOKED_get0_serialNumber.html x64-windows/debug/html/man3/X509_REVOKED_get_ext.html x64-windows/debug/html/man3/X509_REVOKED_get_ext_by_NID.html x64-windows/debug/html/man3/X509_REVOKED_get_ext_by_OBJ.html x64-windows/debug/html/man3/X509_REVOKED_get_ext_by_critical.html x64-windows/debug/html/man3/X509_REVOKED_get_ext_count.html x64-windows/debug/html/man3/X509_REVOKED_get_ext_d2i.html x64-windows/debug/html/man3/X509_REVOKED_new.html x64-windows/debug/html/man3/X509_REVOKED_set_revocationDate.html x64-windows/debug/html/man3/X509_REVOKED_set_serialNumber.html x64-windows/debug/html/man3/X509_SIG_INFO_get.html x64-windows/debug/html/man3/X509_SIG_INFO_set.html x64-windows/debug/html/man3/X509_SIG_free.html x64-windows/debug/html/man3/X509_SIG_get0.html x64-windows/debug/html/man3/X509_SIG_getm.html x64-windows/debug/html/man3/X509_SIG_new.html x64-windows/debug/html/man3/X509_STORE_CTX_cert_crl_fn.html x64-windows/debug/html/man3/X509_STORE_CTX_check_crl_fn.html x64-windows/debug/html/man3/X509_STORE_CTX_check_issued_fn.html x64-windows/debug/html/man3/X509_STORE_CTX_check_policy_fn.html x64-windows/debug/html/man3/X509_STORE_CTX_check_revocation_fn.html x64-windows/debug/html/man3/X509_STORE_CTX_cleanup.html x64-windows/debug/html/man3/X509_STORE_CTX_cleanup_fn.html x64-windows/debug/html/man3/X509_STORE_CTX_free.html x64-windows/debug/html/man3/X509_STORE_CTX_get0_cert.html x64-windows/debug/html/man3/X509_STORE_CTX_get0_chain.html x64-windows/debug/html/man3/X509_STORE_CTX_get0_param.html x64-windows/debug/html/man3/X509_STORE_CTX_get0_untrusted.html x64-windows/debug/html/man3/X509_STORE_CTX_get1_chain.html x64-windows/debug/html/man3/X509_STORE_CTX_get_cert_crl.html x64-windows/debug/html/man3/X509_STORE_CTX_get_check_crl.html x64-windows/debug/html/man3/X509_STORE_CTX_get_check_issued.html x64-windows/debug/html/man3/X509_STORE_CTX_get_check_policy.html x64-windows/debug/html/man3/X509_STORE_CTX_get_check_revocation.html x64-windows/debug/html/man3/X509_STORE_CTX_get_cleanup.html x64-windows/debug/html/man3/X509_STORE_CTX_get_crl_fn.html x64-windows/debug/html/man3/X509_STORE_CTX_get_current_cert.html x64-windows/debug/html/man3/X509_STORE_CTX_get_error.html x64-windows/debug/html/man3/X509_STORE_CTX_get_error_depth.html x64-windows/debug/html/man3/X509_STORE_CTX_get_ex_data.html x64-windows/debug/html/man3/X509_STORE_CTX_get_ex_new_index.html x64-windows/debug/html/man3/X509_STORE_CTX_get_get_crl.html x64-windows/debug/html/man3/X509_STORE_CTX_get_get_issuer.html x64-windows/debug/html/man3/X509_STORE_CTX_get_issuer_fn.html x64-windows/debug/html/man3/X509_STORE_CTX_get_lookup_certs.html x64-windows/debug/html/man3/X509_STORE_CTX_get_lookup_crls.html x64-windows/debug/html/man3/X509_STORE_CTX_get_num_untrusted.html x64-windows/debug/html/man3/X509_STORE_CTX_get_verify.html x64-windows/debug/html/man3/X509_STORE_CTX_get_verify_cb.html x64-windows/debug/html/man3/X509_STORE_CTX_init.html x64-windows/debug/html/man3/X509_STORE_CTX_lookup_certs_fn.html x64-windows/debug/html/man3/X509_STORE_CTX_lookup_crls_fn.html x64-windows/debug/html/man3/X509_STORE_CTX_new.html x64-windows/debug/html/man3/X509_STORE_CTX_set0_crls.html x64-windows/debug/html/man3/X509_STORE_CTX_set0_param.html x64-windows/debug/html/man3/X509_STORE_CTX_set0_trusted_stack.html x64-windows/debug/html/man3/X509_STORE_CTX_set0_untrusted.html x64-windows/debug/html/man3/X509_STORE_CTX_set0_verified_chain.html x64-windows/debug/html/man3/X509_STORE_CTX_set_cert.html x64-windows/debug/html/man3/X509_STORE_CTX_set_current_cert.html x64-windows/debug/html/man3/X509_STORE_CTX_set_default.html x64-windows/debug/html/man3/X509_STORE_CTX_set_error.html x64-windows/debug/html/man3/X509_STORE_CTX_set_error_depth.html x64-windows/debug/html/man3/X509_STORE_CTX_set_ex_data.html x64-windows/debug/html/man3/X509_STORE_CTX_set_verify.html x64-windows/debug/html/man3/X509_STORE_CTX_set_verify_cb.html x64-windows/debug/html/man3/X509_STORE_CTX_verify_cb.html x64-windows/debug/html/man3/X509_STORE_CTX_verify_fn.html x64-windows/debug/html/man3/X509_STORE_add_cert.html x64-windows/debug/html/man3/X509_STORE_add_crl.html x64-windows/debug/html/man3/X509_STORE_free.html x64-windows/debug/html/man3/X509_STORE_get0_objects.html x64-windows/debug/html/man3/X509_STORE_get0_param.html x64-windows/debug/html/man3/X509_STORE_get_cert_crl.html x64-windows/debug/html/man3/X509_STORE_get_check_crl.html x64-windows/debug/html/man3/X509_STORE_get_check_issued.html x64-windows/debug/html/man3/X509_STORE_get_check_policy.html x64-windows/debug/html/man3/X509_STORE_get_check_revocation.html x64-windows/debug/html/man3/X509_STORE_get_cleanup.html x64-windows/debug/html/man3/X509_STORE_get_ex_data.html x64-windows/debug/html/man3/X509_STORE_get_ex_new_index.html x64-windows/debug/html/man3/X509_STORE_get_get_crl.html x64-windows/debug/html/man3/X509_STORE_get_get_issuer.html x64-windows/debug/html/man3/X509_STORE_get_lookup_certs.html x64-windows/debug/html/man3/X509_STORE_get_lookup_crls.html x64-windows/debug/html/man3/X509_STORE_get_verify_cb.html x64-windows/debug/html/man3/X509_STORE_load_locations.html x64-windows/debug/html/man3/X509_STORE_lock.html x64-windows/debug/html/man3/X509_STORE_new.html x64-windows/debug/html/man3/X509_STORE_set1_param.html x64-windows/debug/html/man3/X509_STORE_set_cert_crl.html x64-windows/debug/html/man3/X509_STORE_set_check_crl.html x64-windows/debug/html/man3/X509_STORE_set_check_issued.html x64-windows/debug/html/man3/X509_STORE_set_check_policy.html x64-windows/debug/html/man3/X509_STORE_set_check_revocation.html x64-windows/debug/html/man3/X509_STORE_set_cleanup.html x64-windows/debug/html/man3/X509_STORE_set_default_paths.html x64-windows/debug/html/man3/X509_STORE_set_depth.html x64-windows/debug/html/man3/X509_STORE_set_ex_data.html x64-windows/debug/html/man3/X509_STORE_set_flags.html x64-windows/debug/html/man3/X509_STORE_set_get_crl.html x64-windows/debug/html/man3/X509_STORE_set_get_issuer.html x64-windows/debug/html/man3/X509_STORE_set_lookup_certs.html x64-windows/debug/html/man3/X509_STORE_set_lookup_crls.html x64-windows/debug/html/man3/X509_STORE_set_lookup_crls_cb.html x64-windows/debug/html/man3/X509_STORE_set_purpose.html x64-windows/debug/html/man3/X509_STORE_set_trust.html x64-windows/debug/html/man3/X509_STORE_set_verify.html x64-windows/debug/html/man3/X509_STORE_set_verify_cb.html x64-windows/debug/html/man3/X509_STORE_set_verify_cb_func.html x64-windows/debug/html/man3/X509_STORE_set_verify_func.html x64-windows/debug/html/man3/X509_STORE_unlock.html x64-windows/debug/html/man3/X509_STORE_up_ref.html x64-windows/debug/html/man3/X509_VAL_free.html x64-windows/debug/html/man3/X509_VAL_new.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_add0_policy.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_add1_host.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_clear_flags.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_get0_peername.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_get_auth_level.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_get_depth.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_get_flags.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_get_hostflags.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_get_inh_flags.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_get_time.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set1_email.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set1_host.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set1_ip.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set1_ip_asc.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set1_policies.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set_auth_level.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set_depth.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set_flags.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set_hostflags.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set_inh_flags.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set_purpose.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set_time.html x64-windows/debug/html/man3/X509_VERIFY_PARAM_set_trust.html x64-windows/debug/html/man3/X509_add1_ext_i2d.html x64-windows/debug/html/man3/X509_add_ext.html x64-windows/debug/html/man3/X509_chain_up_ref.html x64-windows/debug/html/man3/X509_check_ca.html x64-windows/debug/html/man3/X509_check_email.html x64-windows/debug/html/man3/X509_check_host.html x64-windows/debug/html/man3/X509_check_ip.html x64-windows/debug/html/man3/X509_check_ip_asc.html x64-windows/debug/html/man3/X509_check_issued.html x64-windows/debug/html/man3/X509_check_private_key.html x64-windows/debug/html/man3/X509_cmp.html x64-windows/debug/html/man3/X509_cmp_current_time.html x64-windows/debug/html/man3/X509_cmp_time.html x64-windows/debug/html/man3/X509_delete_ext.html x64-windows/debug/html/man3/X509_digest.html x64-windows/debug/html/man3/X509_dup.html x64-windows/debug/html/man3/X509_free.html x64-windows/debug/html/man3/X509_get0_authority_issuer.html x64-windows/debug/html/man3/X509_get0_authority_key_id.html x64-windows/debug/html/man3/X509_get0_authority_serial.html x64-windows/debug/html/man3/X509_get0_extensions.html x64-windows/debug/html/man3/X509_get0_notAfter.html x64-windows/debug/html/man3/X509_get0_notBefore.html x64-windows/debug/html/man3/X509_get0_pubkey.html x64-windows/debug/html/man3/X509_get0_serialNumber.html x64-windows/debug/html/man3/X509_get0_signature.html x64-windows/debug/html/man3/X509_get0_subject_key_id.html x64-windows/debug/html/man3/X509_get0_tbs_sigalg.html x64-windows/debug/html/man3/X509_get0_uids.html x64-windows/debug/html/man3/X509_get_X509_PUBKEY.html x64-windows/debug/html/man3/X509_get_ex_data.html x64-windows/debug/html/man3/X509_get_ex_new_index.html x64-windows/debug/html/man3/X509_get_ext.html x64-windows/debug/html/man3/X509_get_ext_by_NID.html x64-windows/debug/html/man3/X509_get_ext_by_OBJ.html x64-windows/debug/html/man3/X509_get_ext_by_critical.html x64-windows/debug/html/man3/X509_get_ext_count.html x64-windows/debug/html/man3/X509_get_ext_d2i.html x64-windows/debug/html/man3/X509_get_extended_key_usage.html x64-windows/debug/html/man3/X509_get_extension_flags.html x64-windows/debug/html/man3/X509_get_issuer_name.html x64-windows/debug/html/man3/X509_get_key_usage.html x64-windows/debug/html/man3/X509_get_pathlen.html x64-windows/debug/html/man3/X509_get_proxy_pathlen.html x64-windows/debug/html/man3/X509_get_pubkey.html x64-windows/debug/html/man3/X509_get_serialNumber.html x64-windows/debug/html/man3/X509_get_signature_info.html x64-windows/debug/html/man3/X509_get_signature_nid.html x64-windows/debug/html/man3/X509_get_subject_name.html x64-windows/debug/html/man3/X509_get_version.html x64-windows/debug/html/man3/X509_getm_notAfter.html x64-windows/debug/html/man3/X509_getm_notBefore.html x64-windows/debug/html/man3/X509_issuer_and_serial_cmp.html x64-windows/debug/html/man3/X509_issuer_name_cmp.html x64-windows/debug/html/man3/X509_load_cert_crl_file.html x64-windows/debug/html/man3/X509_load_cert_file.html x64-windows/debug/html/man3/X509_load_crl_file.html x64-windows/debug/html/man3/X509_new.html x64-windows/debug/html/man3/X509_pubkey_digest.html x64-windows/debug/html/man3/X509_set1_notAfter.html x64-windows/debug/html/man3/X509_set1_notBefore.html x64-windows/debug/html/man3/X509_set_ex_data.html x64-windows/debug/html/man3/X509_set_issuer_name.html x64-windows/debug/html/man3/X509_set_proxy_flag.html x64-windows/debug/html/man3/X509_set_proxy_pathlen.html x64-windows/debug/html/man3/X509_set_pubkey.html x64-windows/debug/html/man3/X509_set_serialNumber.html x64-windows/debug/html/man3/X509_set_subject_name.html x64-windows/debug/html/man3/X509_set_version.html x64-windows/debug/html/man3/X509_sign.html x64-windows/debug/html/man3/X509_sign_ctx.html x64-windows/debug/html/man3/X509_subject_name_cmp.html x64-windows/debug/html/man3/X509_time_adj.html x64-windows/debug/html/man3/X509_time_adj_ex.html x64-windows/debug/html/man3/X509_up_ref.html x64-windows/debug/html/man3/X509_verify.html x64-windows/debug/html/man3/X509_verify_cert.html x64-windows/debug/html/man3/X509_verify_cert_error_string.html x64-windows/debug/html/man3/X509v3_add_ext.html x64-windows/debug/html/man3/X509v3_delete_ext.html x64-windows/debug/html/man3/X509v3_get_ext.html x64-windows/debug/html/man3/X509v3_get_ext_by_NID.html x64-windows/debug/html/man3/X509v3_get_ext_by_OBJ.html x64-windows/debug/html/man3/X509v3_get_ext_by_critical.html x64-windows/debug/html/man3/X509v3_get_ext_count.html x64-windows/debug/html/man3/custom_ext_add_cb.html x64-windows/debug/html/man3/custom_ext_free_cb.html x64-windows/debug/html/man3/custom_ext_parse_cb.html x64-windows/debug/html/man3/d2i_ACCESS_DESCRIPTION.html x64-windows/debug/html/man3/d2i_ADMISSIONS.html x64-windows/debug/html/man3/d2i_ADMISSION_SYNTAX.html x64-windows/debug/html/man3/d2i_ASIdOrRange.html x64-windows/debug/html/man3/d2i_ASIdentifierChoice.html x64-windows/debug/html/man3/d2i_ASIdentifiers.html x64-windows/debug/html/man3/d2i_ASN1_BIT_STRING.html x64-windows/debug/html/man3/d2i_ASN1_BMPSTRING.html x64-windows/debug/html/man3/d2i_ASN1_ENUMERATED.html x64-windows/debug/html/man3/d2i_ASN1_GENERALIZEDTIME.html x64-windows/debug/html/man3/d2i_ASN1_GENERALSTRING.html x64-windows/debug/html/man3/d2i_ASN1_IA5STRING.html x64-windows/debug/html/man3/d2i_ASN1_INTEGER.html x64-windows/debug/html/man3/d2i_ASN1_NULL.html x64-windows/debug/html/man3/d2i_ASN1_OBJECT.html x64-windows/debug/html/man3/d2i_ASN1_OCTET_STRING.html x64-windows/debug/html/man3/d2i_ASN1_PRINTABLE.html x64-windows/debug/html/man3/d2i_ASN1_PRINTABLESTRING.html x64-windows/debug/html/man3/d2i_ASN1_SEQUENCE_ANY.html x64-windows/debug/html/man3/d2i_ASN1_SET_ANY.html x64-windows/debug/html/man3/d2i_ASN1_T61STRING.html x64-windows/debug/html/man3/d2i_ASN1_TIME.html x64-windows/debug/html/man3/d2i_ASN1_TYPE.html x64-windows/debug/html/man3/d2i_ASN1_UINTEGER.html x64-windows/debug/html/man3/d2i_ASN1_UNIVERSALSTRING.html x64-windows/debug/html/man3/d2i_ASN1_UTCTIME.html x64-windows/debug/html/man3/d2i_ASN1_UTF8STRING.html x64-windows/debug/html/man3/d2i_ASN1_VISIBLESTRING.html x64-windows/debug/html/man3/d2i_ASRange.html x64-windows/debug/html/man3/d2i_AUTHORITY_INFO_ACCESS.html x64-windows/debug/html/man3/d2i_AUTHORITY_KEYID.html x64-windows/debug/html/man3/d2i_AutoPrivateKey.html x64-windows/debug/html/man3/d2i_BASIC_CONSTRAINTS.html x64-windows/debug/html/man3/d2i_CERTIFICATEPOLICIES.html x64-windows/debug/html/man3/d2i_CMS_ContentInfo.html x64-windows/debug/html/man3/d2i_CMS_ReceiptRequest.html x64-windows/debug/html/man3/d2i_CMS_bio.html x64-windows/debug/html/man3/d2i_CRL_DIST_POINTS.html x64-windows/debug/html/man3/d2i_DHparams.html x64-windows/debug/html/man3/d2i_DHxparams.html x64-windows/debug/html/man3/d2i_DIRECTORYSTRING.html x64-windows/debug/html/man3/d2i_DISPLAYTEXT.html x64-windows/debug/html/man3/d2i_DIST_POINT.html x64-windows/debug/html/man3/d2i_DIST_POINT_NAME.html x64-windows/debug/html/man3/d2i_DSAPrivateKey.html x64-windows/debug/html/man3/d2i_DSAPrivateKey_bio.html x64-windows/debug/html/man3/d2i_DSAPrivateKey_fp.html x64-windows/debug/html/man3/d2i_DSAPublicKey.html x64-windows/debug/html/man3/d2i_DSA_PUBKEY.html x64-windows/debug/html/man3/d2i_DSA_PUBKEY_bio.html x64-windows/debug/html/man3/d2i_DSA_PUBKEY_fp.html x64-windows/debug/html/man3/d2i_DSA_SIG.html x64-windows/debug/html/man3/d2i_DSAparams.html x64-windows/debug/html/man3/d2i_ECDSA_SIG.html x64-windows/debug/html/man3/d2i_ECPKParameters.html x64-windows/debug/html/man3/d2i_ECParameters.html x64-windows/debug/html/man3/d2i_ECPrivateKey.html x64-windows/debug/html/man3/d2i_ECPrivateKey_bio.html x64-windows/debug/html/man3/d2i_ECPrivateKey_fp.html x64-windows/debug/html/man3/d2i_EC_PUBKEY.html x64-windows/debug/html/man3/d2i_EC_PUBKEY_bio.html x64-windows/debug/html/man3/d2i_EC_PUBKEY_fp.html x64-windows/debug/html/man3/d2i_EDIPARTYNAME.html x64-windows/debug/html/man3/d2i_ESS_CERT_ID.html x64-windows/debug/html/man3/d2i_ESS_ISSUER_SERIAL.html x64-windows/debug/html/man3/d2i_ESS_SIGNING_CERT.html x64-windows/debug/html/man3/d2i_EXTENDED_KEY_USAGE.html x64-windows/debug/html/man3/d2i_GENERAL_NAME.html x64-windows/debug/html/man3/d2i_GENERAL_NAMES.html x64-windows/debug/html/man3/d2i_IPAddressChoice.html x64-windows/debug/html/man3/d2i_IPAddressFamily.html x64-windows/debug/html/man3/d2i_IPAddressOrRange.html x64-windows/debug/html/man3/d2i_IPAddressRange.html x64-windows/debug/html/man3/d2i_ISSUING_DIST_POINT.html x64-windows/debug/html/man3/d2i_NAMING_AUTHORITY.html x64-windows/debug/html/man3/d2i_NETSCAPE_CERT_SEQUENCE.html x64-windows/debug/html/man3/d2i_NETSCAPE_SPKAC.html x64-windows/debug/html/man3/d2i_NETSCAPE_SPKI.html x64-windows/debug/html/man3/d2i_NOTICEREF.html x64-windows/debug/html/man3/d2i_OCSP_BASICRESP.html x64-windows/debug/html/man3/d2i_OCSP_CERTID.html x64-windows/debug/html/man3/d2i_OCSP_CERTSTATUS.html x64-windows/debug/html/man3/d2i_OCSP_CRLID.html x64-windows/debug/html/man3/d2i_OCSP_ONEREQ.html x64-windows/debug/html/man3/d2i_OCSP_REQINFO.html x64-windows/debug/html/man3/d2i_OCSP_REQUEST.html x64-windows/debug/html/man3/d2i_OCSP_RESPBYTES.html x64-windows/debug/html/man3/d2i_OCSP_RESPDATA.html x64-windows/debug/html/man3/d2i_OCSP_RESPID.html x64-windows/debug/html/man3/d2i_OCSP_RESPONSE.html x64-windows/debug/html/man3/d2i_OCSP_REVOKEDINFO.html x64-windows/debug/html/man3/d2i_OCSP_SERVICELOC.html x64-windows/debug/html/man3/d2i_OCSP_SIGNATURE.html x64-windows/debug/html/man3/d2i_OCSP_SINGLERESP.html x64-windows/debug/html/man3/d2i_OTHERNAME.html x64-windows/debug/html/man3/d2i_PBE2PARAM.html x64-windows/debug/html/man3/d2i_PBEPARAM.html x64-windows/debug/html/man3/d2i_PBKDF2PARAM.html x64-windows/debug/html/man3/d2i_PKCS12.html x64-windows/debug/html/man3/d2i_PKCS12_BAGS.html x64-windows/debug/html/man3/d2i_PKCS12_MAC_DATA.html x64-windows/debug/html/man3/d2i_PKCS12_SAFEBAG.html x64-windows/debug/html/man3/d2i_PKCS12_bio.html x64-windows/debug/html/man3/d2i_PKCS12_fp.html x64-windows/debug/html/man3/d2i_PKCS7.html x64-windows/debug/html/man3/d2i_PKCS7_DIGEST.html x64-windows/debug/html/man3/d2i_PKCS7_ENCRYPT.html x64-windows/debug/html/man3/d2i_PKCS7_ENC_CONTENT.html x64-windows/debug/html/man3/d2i_PKCS7_ENVELOPE.html x64-windows/debug/html/man3/d2i_PKCS7_ISSUER_AND_SERIAL.html x64-windows/debug/html/man3/d2i_PKCS7_RECIP_INFO.html x64-windows/debug/html/man3/d2i_PKCS7_SIGNED.html x64-windows/debug/html/man3/d2i_PKCS7_SIGNER_INFO.html x64-windows/debug/html/man3/d2i_PKCS7_SIGN_ENVELOPE.html x64-windows/debug/html/man3/d2i_PKCS7_bio.html x64-windows/debug/html/man3/d2i_PKCS7_fp.html x64-windows/debug/html/man3/d2i_PKCS8PrivateKey_bio.html x64-windows/debug/html/man3/d2i_PKCS8PrivateKey_fp.html x64-windows/debug/html/man3/d2i_PKCS8_PRIV_KEY_INFO.html x64-windows/debug/html/man3/d2i_PKCS8_PRIV_KEY_INFO_bio.html x64-windows/debug/html/man3/d2i_PKCS8_PRIV_KEY_INFO_fp.html x64-windows/debug/html/man3/d2i_PKCS8_bio.html x64-windows/debug/html/man3/d2i_PKCS8_fp.html x64-windows/debug/html/man3/d2i_PKEY_USAGE_PERIOD.html x64-windows/debug/html/man3/d2i_POLICYINFO.html x64-windows/debug/html/man3/d2i_POLICYQUALINFO.html x64-windows/debug/html/man3/d2i_PROFESSION_INFO.html x64-windows/debug/html/man3/d2i_PROXY_CERT_INFO_EXTENSION.html x64-windows/debug/html/man3/d2i_PROXY_POLICY.html x64-windows/debug/html/man3/d2i_PUBKEY.html x64-windows/debug/html/man3/d2i_PUBKEY_bio.html x64-windows/debug/html/man3/d2i_PUBKEY_fp.html x64-windows/debug/html/man3/d2i_PrivateKey.html x64-windows/debug/html/man3/d2i_PrivateKey_bio.html x64-windows/debug/html/man3/d2i_PrivateKey_fp.html x64-windows/debug/html/man3/d2i_PublicKey.html x64-windows/debug/html/man3/d2i_RSAPrivateKey.html x64-windows/debug/html/man3/d2i_RSAPrivateKey_bio.html x64-windows/debug/html/man3/d2i_RSAPrivateKey_fp.html x64-windows/debug/html/man3/d2i_RSAPublicKey.html x64-windows/debug/html/man3/d2i_RSAPublicKey_bio.html x64-windows/debug/html/man3/d2i_RSAPublicKey_fp.html x64-windows/debug/html/man3/d2i_RSA_OAEP_PARAMS.html x64-windows/debug/html/man3/d2i_RSA_PSS_PARAMS.html x64-windows/debug/html/man3/d2i_RSA_PUBKEY.html x64-windows/debug/html/man3/d2i_RSA_PUBKEY_bio.html x64-windows/debug/html/man3/d2i_RSA_PUBKEY_fp.html x64-windows/debug/html/man3/d2i_SCRYPT_PARAMS.html x64-windows/debug/html/man3/d2i_SCT_LIST.html x64-windows/debug/html/man3/d2i_SSL_SESSION.html x64-windows/debug/html/man3/d2i_SXNET.html x64-windows/debug/html/man3/d2i_SXNETID.html x64-windows/debug/html/man3/d2i_TS_ACCURACY.html x64-windows/debug/html/man3/d2i_TS_MSG_IMPRINT.html x64-windows/debug/html/man3/d2i_TS_MSG_IMPRINT_bio.html x64-windows/debug/html/man3/d2i_TS_MSG_IMPRINT_fp.html x64-windows/debug/html/man3/d2i_TS_REQ.html x64-windows/debug/html/man3/d2i_TS_REQ_bio.html x64-windows/debug/html/man3/d2i_TS_REQ_fp.html x64-windows/debug/html/man3/d2i_TS_RESP.html x64-windows/debug/html/man3/d2i_TS_RESP_bio.html x64-windows/debug/html/man3/d2i_TS_RESP_fp.html x64-windows/debug/html/man3/d2i_TS_STATUS_INFO.html x64-windows/debug/html/man3/d2i_TS_TST_INFO.html x64-windows/debug/html/man3/d2i_TS_TST_INFO_bio.html x64-windows/debug/html/man3/d2i_TS_TST_INFO_fp.html x64-windows/debug/html/man3/d2i_USERNOTICE.html x64-windows/debug/html/man3/d2i_X509.html x64-windows/debug/html/man3/d2i_X509_ALGOR.html x64-windows/debug/html/man3/d2i_X509_ALGORS.html x64-windows/debug/html/man3/d2i_X509_ATTRIBUTE.html x64-windows/debug/html/man3/d2i_X509_AUX.html x64-windows/debug/html/man3/d2i_X509_CERT_AUX.html x64-windows/debug/html/man3/d2i_X509_CINF.html x64-windows/debug/html/man3/d2i_X509_CRL.html x64-windows/debug/html/man3/d2i_X509_CRL_INFO.html x64-windows/debug/html/man3/d2i_X509_CRL_bio.html x64-windows/debug/html/man3/d2i_X509_CRL_fp.html x64-windows/debug/html/man3/d2i_X509_EXTENSION.html x64-windows/debug/html/man3/d2i_X509_EXTENSIONS.html x64-windows/debug/html/man3/d2i_X509_NAME.html x64-windows/debug/html/man3/d2i_X509_NAME_ENTRY.html x64-windows/debug/html/man3/d2i_X509_PUBKEY.html x64-windows/debug/html/man3/d2i_X509_REQ.html x64-windows/debug/html/man3/d2i_X509_REQ_INFO.html x64-windows/debug/html/man3/d2i_X509_REQ_bio.html x64-windows/debug/html/man3/d2i_X509_REQ_fp.html x64-windows/debug/html/man3/d2i_X509_REVOKED.html x64-windows/debug/html/man3/d2i_X509_SIG.html x64-windows/debug/html/man3/d2i_X509_VAL.html x64-windows/debug/html/man3/i2d_ACCESS_DESCRIPTION.html x64-windows/debug/html/man3/i2d_ADMISSIONS.html x64-windows/debug/html/man3/i2d_ADMISSION_SYNTAX.html x64-windows/debug/html/man3/i2d_ASIdOrRange.html x64-windows/debug/html/man3/i2d_ASIdentifierChoice.html x64-windows/debug/html/man3/i2d_ASIdentifiers.html x64-windows/debug/html/man3/i2d_ASN1_BIT_STRING.html x64-windows/debug/html/man3/i2d_ASN1_BMPSTRING.html x64-windows/debug/html/man3/i2d_ASN1_ENUMERATED.html x64-windows/debug/html/man3/i2d_ASN1_GENERALIZEDTIME.html x64-windows/debug/html/man3/i2d_ASN1_GENERALSTRING.html x64-windows/debug/html/man3/i2d_ASN1_IA5STRING.html x64-windows/debug/html/man3/i2d_ASN1_INTEGER.html x64-windows/debug/html/man3/i2d_ASN1_NULL.html x64-windows/debug/html/man3/i2d_ASN1_OBJECT.html x64-windows/debug/html/man3/i2d_ASN1_OCTET_STRING.html x64-windows/debug/html/man3/i2d_ASN1_PRINTABLE.html x64-windows/debug/html/man3/i2d_ASN1_PRINTABLESTRING.html x64-windows/debug/html/man3/i2d_ASN1_SEQUENCE_ANY.html x64-windows/debug/html/man3/i2d_ASN1_SET_ANY.html x64-windows/debug/html/man3/i2d_ASN1_T61STRING.html x64-windows/debug/html/man3/i2d_ASN1_TIME.html x64-windows/debug/html/man3/i2d_ASN1_TYPE.html x64-windows/debug/html/man3/i2d_ASN1_UNIVERSALSTRING.html x64-windows/debug/html/man3/i2d_ASN1_UTCTIME.html x64-windows/debug/html/man3/i2d_ASN1_UTF8STRING.html x64-windows/debug/html/man3/i2d_ASN1_VISIBLESTRING.html x64-windows/debug/html/man3/i2d_ASN1_bio_stream.html x64-windows/debug/html/man3/i2d_ASRange.html x64-windows/debug/html/man3/i2d_AUTHORITY_INFO_ACCESS.html x64-windows/debug/html/man3/i2d_AUTHORITY_KEYID.html x64-windows/debug/html/man3/i2d_BASIC_CONSTRAINTS.html x64-windows/debug/html/man3/i2d_CERTIFICATEPOLICIES.html x64-windows/debug/html/man3/i2d_CMS_ContentInfo.html x64-windows/debug/html/man3/i2d_CMS_ReceiptRequest.html x64-windows/debug/html/man3/i2d_CMS_bio.html x64-windows/debug/html/man3/i2d_CMS_bio_stream.html x64-windows/debug/html/man3/i2d_CRL_DIST_POINTS.html x64-windows/debug/html/man3/i2d_DHparams.html x64-windows/debug/html/man3/i2d_DHxparams.html x64-windows/debug/html/man3/i2d_DIRECTORYSTRING.html x64-windows/debug/html/man3/i2d_DISPLAYTEXT.html x64-windows/debug/html/man3/i2d_DIST_POINT.html x64-windows/debug/html/man3/i2d_DIST_POINT_NAME.html x64-windows/debug/html/man3/i2d_DSAPrivateKey.html x64-windows/debug/html/man3/i2d_DSAPrivateKey_bio.html x64-windows/debug/html/man3/i2d_DSAPrivateKey_fp.html x64-windows/debug/html/man3/i2d_DSAPublicKey.html x64-windows/debug/html/man3/i2d_DSA_PUBKEY.html x64-windows/debug/html/man3/i2d_DSA_PUBKEY_bio.html x64-windows/debug/html/man3/i2d_DSA_PUBKEY_fp.html x64-windows/debug/html/man3/i2d_DSA_SIG.html x64-windows/debug/html/man3/i2d_DSAparams.html x64-windows/debug/html/man3/i2d_ECDSA_SIG.html x64-windows/debug/html/man3/i2d_ECPKParameters.html x64-windows/debug/html/man3/i2d_ECParameters.html x64-windows/debug/html/man3/i2d_ECPrivateKey.html x64-windows/debug/html/man3/i2d_ECPrivateKey_bio.html x64-windows/debug/html/man3/i2d_ECPrivateKey_fp.html x64-windows/debug/html/man3/i2d_EC_PUBKEY.html x64-windows/debug/html/man3/i2d_EC_PUBKEY_bio.html x64-windows/debug/html/man3/i2d_EC_PUBKEY_fp.html x64-windows/debug/html/man3/i2d_EDIPARTYNAME.html x64-windows/debug/html/man3/i2d_ESS_CERT_ID.html x64-windows/debug/html/man3/i2d_ESS_ISSUER_SERIAL.html x64-windows/debug/html/man3/i2d_ESS_SIGNING_CERT.html x64-windows/debug/html/man3/i2d_EXTENDED_KEY_USAGE.html x64-windows/debug/html/man3/i2d_GENERAL_NAME.html x64-windows/debug/html/man3/i2d_GENERAL_NAMES.html x64-windows/debug/html/man3/i2d_IPAddressChoice.html x64-windows/debug/html/man3/i2d_IPAddressFamily.html x64-windows/debug/html/man3/i2d_IPAddressOrRange.html x64-windows/debug/html/man3/i2d_IPAddressRange.html x64-windows/debug/html/man3/i2d_ISSUING_DIST_POINT.html x64-windows/debug/html/man3/i2d_NAMING_AUTHORITY.html x64-windows/debug/html/man3/i2d_NETSCAPE_CERT_SEQUENCE.html x64-windows/debug/html/man3/i2d_NETSCAPE_SPKAC.html x64-windows/debug/html/man3/i2d_NETSCAPE_SPKI.html x64-windows/debug/html/man3/i2d_NOTICEREF.html x64-windows/debug/html/man3/i2d_OCSP_BASICRESP.html x64-windows/debug/html/man3/i2d_OCSP_CERTID.html x64-windows/debug/html/man3/i2d_OCSP_CERTSTATUS.html x64-windows/debug/html/man3/i2d_OCSP_CRLID.html x64-windows/debug/html/man3/i2d_OCSP_ONEREQ.html x64-windows/debug/html/man3/i2d_OCSP_REQINFO.html x64-windows/debug/html/man3/i2d_OCSP_REQUEST.html x64-windows/debug/html/man3/i2d_OCSP_RESPBYTES.html x64-windows/debug/html/man3/i2d_OCSP_RESPDATA.html x64-windows/debug/html/man3/i2d_OCSP_RESPID.html x64-windows/debug/html/man3/i2d_OCSP_RESPONSE.html x64-windows/debug/html/man3/i2d_OCSP_REVOKEDINFO.html x64-windows/debug/html/man3/i2d_OCSP_SERVICELOC.html x64-windows/debug/html/man3/i2d_OCSP_SIGNATURE.html x64-windows/debug/html/man3/i2d_OCSP_SINGLERESP.html x64-windows/debug/html/man3/i2d_OTHERNAME.html x64-windows/debug/html/man3/i2d_PBE2PARAM.html x64-windows/debug/html/man3/i2d_PBEPARAM.html x64-windows/debug/html/man3/i2d_PBKDF2PARAM.html x64-windows/debug/html/man3/i2d_PKCS12.html x64-windows/debug/html/man3/i2d_PKCS12_BAGS.html x64-windows/debug/html/man3/i2d_PKCS12_MAC_DATA.html x64-windows/debug/html/man3/i2d_PKCS12_SAFEBAG.html x64-windows/debug/html/man3/i2d_PKCS12_bio.html x64-windows/debug/html/man3/i2d_PKCS12_fp.html x64-windows/debug/html/man3/i2d_PKCS7.html x64-windows/debug/html/man3/i2d_PKCS7_DIGEST.html x64-windows/debug/html/man3/i2d_PKCS7_ENCRYPT.html x64-windows/debug/html/man3/i2d_PKCS7_ENC_CONTENT.html x64-windows/debug/html/man3/i2d_PKCS7_ENVELOPE.html x64-windows/debug/html/man3/i2d_PKCS7_ISSUER_AND_SERIAL.html x64-windows/debug/html/man3/i2d_PKCS7_NDEF.html x64-windows/debug/html/man3/i2d_PKCS7_RECIP_INFO.html x64-windows/debug/html/man3/i2d_PKCS7_SIGNED.html x64-windows/debug/html/man3/i2d_PKCS7_SIGNER_INFO.html x64-windows/debug/html/man3/i2d_PKCS7_SIGN_ENVELOPE.html x64-windows/debug/html/man3/i2d_PKCS7_bio.html x64-windows/debug/html/man3/i2d_PKCS7_bio_stream.html x64-windows/debug/html/man3/i2d_PKCS7_fp.html x64-windows/debug/html/man3/i2d_PKCS8PrivateKeyInfo_bio.html x64-windows/debug/html/man3/i2d_PKCS8PrivateKeyInfo_fp.html x64-windows/debug/html/man3/i2d_PKCS8PrivateKey_bio.html x64-windows/debug/html/man3/i2d_PKCS8PrivateKey_fp.html x64-windows/debug/html/man3/i2d_PKCS8PrivateKey_nid_bio.html x64-windows/debug/html/man3/i2d_PKCS8PrivateKey_nid_fp.html x64-windows/debug/html/man3/i2d_PKCS8_PRIV_KEY_INFO.html x64-windows/debug/html/man3/i2d_PKCS8_PRIV_KEY_INFO_bio.html x64-windows/debug/html/man3/i2d_PKCS8_PRIV_KEY_INFO_fp.html x64-windows/debug/html/man3/i2d_PKCS8_bio.html x64-windows/debug/html/man3/i2d_PKCS8_fp.html x64-windows/debug/html/man3/i2d_PKEY_USAGE_PERIOD.html x64-windows/debug/html/man3/i2d_POLICYINFO.html x64-windows/debug/html/man3/i2d_POLICYQUALINFO.html x64-windows/debug/html/man3/i2d_PROFESSION_INFO.html x64-windows/debug/html/man3/i2d_PROXY_CERT_INFO_EXTENSION.html x64-windows/debug/html/man3/i2d_PROXY_POLICY.html x64-windows/debug/html/man3/i2d_PUBKEY.html x64-windows/debug/html/man3/i2d_PUBKEY_bio.html x64-windows/debug/html/man3/i2d_PUBKEY_fp.html x64-windows/debug/html/man3/i2d_PrivateKey.html x64-windows/debug/html/man3/i2d_PublicKey.html x64-windows/debug/html/man3/i2d_RSAPrivateKey.html x64-windows/debug/html/man3/i2d_RSAPrivateKey_bio.html x64-windows/debug/html/man3/i2d_RSAPrivateKey_fp.html x64-windows/debug/html/man3/i2d_RSAPublicKey.html x64-windows/debug/html/man3/i2d_RSAPublicKey_bio.html x64-windows/debug/html/man3/i2d_RSAPublicKey_fp.html x64-windows/debug/html/man3/i2d_RSA_OAEP_PARAMS.html x64-windows/debug/html/man3/i2d_RSA_PSS_PARAMS.html x64-windows/debug/html/man3/i2d_RSA_PUBKEY.html x64-windows/debug/html/man3/i2d_RSA_PUBKEY_bio.html x64-windows/debug/html/man3/i2d_RSA_PUBKEY_fp.html x64-windows/debug/html/man3/i2d_SCRYPT_PARAMS.html x64-windows/debug/html/man3/i2d_SCT_LIST.html x64-windows/debug/html/man3/i2d_SSL_SESSION.html x64-windows/debug/html/man3/i2d_SXNET.html x64-windows/debug/html/man3/i2d_SXNETID.html x64-windows/debug/html/man3/i2d_TS_ACCURACY.html x64-windows/debug/html/man3/i2d_TS_MSG_IMPRINT.html x64-windows/debug/html/man3/i2d_TS_MSG_IMPRINT_bio.html x64-windows/debug/html/man3/i2d_TS_MSG_IMPRINT_fp.html x64-windows/debug/html/man3/i2d_TS_REQ.html x64-windows/debug/html/man3/i2d_TS_REQ_bio.html x64-windows/debug/html/man3/i2d_TS_REQ_fp.html x64-windows/debug/html/man3/i2d_TS_RESP.html x64-windows/debug/html/man3/i2d_TS_RESP_bio.html x64-windows/debug/html/man3/i2d_TS_RESP_fp.html x64-windows/debug/html/man3/i2d_TS_STATUS_INFO.html x64-windows/debug/html/man3/i2d_TS_TST_INFO.html x64-windows/debug/html/man3/i2d_TS_TST_INFO_bio.html x64-windows/debug/html/man3/i2d_TS_TST_INFO_fp.html x64-windows/debug/html/man3/i2d_USERNOTICE.html x64-windows/debug/html/man3/i2d_X509.html x64-windows/debug/html/man3/i2d_X509_ALGOR.html x64-windows/debug/html/man3/i2d_X509_ALGORS.html x64-windows/debug/html/man3/i2d_X509_ATTRIBUTE.html x64-windows/debug/html/man3/i2d_X509_AUX.html x64-windows/debug/html/man3/i2d_X509_CERT_AUX.html x64-windows/debug/html/man3/i2d_X509_CINF.html x64-windows/debug/html/man3/i2d_X509_CRL.html x64-windows/debug/html/man3/i2d_X509_CRL_INFO.html x64-windows/debug/html/man3/i2d_X509_CRL_bio.html x64-windows/debug/html/man3/i2d_X509_CRL_fp.html x64-windows/debug/html/man3/i2d_X509_EXTENSION.html x64-windows/debug/html/man3/i2d_X509_EXTENSIONS.html x64-windows/debug/html/man3/i2d_X509_NAME.html x64-windows/debug/html/man3/i2d_X509_NAME_ENTRY.html x64-windows/debug/html/man3/i2d_X509_PUBKEY.html x64-windows/debug/html/man3/i2d_X509_REQ.html x64-windows/debug/html/man3/i2d_X509_REQ_INFO.html x64-windows/debug/html/man3/i2d_X509_REQ_bio.html x64-windows/debug/html/man3/i2d_X509_REQ_fp.html x64-windows/debug/html/man3/i2d_X509_REVOKED.html x64-windows/debug/html/man3/i2d_X509_SIG.html x64-windows/debug/html/man3/i2d_X509_VAL.html x64-windows/debug/html/man3/i2d_re_X509_CRL_tbs.html x64-windows/debug/html/man3/i2d_re_X509_REQ_tbs.html x64-windows/debug/html/man3/i2d_re_X509_tbs.html x64-windows/debug/html/man3/i2o_SCT.html x64-windows/debug/html/man3/i2o_SCT_LIST.html x64-windows/debug/html/man3/i2t_ASN1_OBJECT.html x64-windows/debug/html/man3/lh_TYPE_delete.html x64-windows/debug/html/man3/lh_TYPE_doall.html x64-windows/debug/html/man3/lh_TYPE_doall_arg.html x64-windows/debug/html/man3/lh_TYPE_error.html x64-windows/debug/html/man3/lh_TYPE_free.html x64-windows/debug/html/man3/lh_TYPE_insert.html x64-windows/debug/html/man3/lh_TYPE_new.html x64-windows/debug/html/man3/lh_TYPE_retrieve.html x64-windows/debug/html/man3/o2i_SCT.html x64-windows/debug/html/man3/o2i_SCT_LIST.html x64-windows/debug/html/man3/pem_password_cb.html x64-windows/debug/html/man3/sk_TYPE_deep_copy.html x64-windows/debug/html/man3/sk_TYPE_delete.html x64-windows/debug/html/man3/sk_TYPE_delete_ptr.html x64-windows/debug/html/man3/sk_TYPE_dup.html x64-windows/debug/html/man3/sk_TYPE_find.html x64-windows/debug/html/man3/sk_TYPE_find_ex.html x64-windows/debug/html/man3/sk_TYPE_free.html x64-windows/debug/html/man3/sk_TYPE_insert.html x64-windows/debug/html/man3/sk_TYPE_is_sorted.html x64-windows/debug/html/man3/sk_TYPE_new.html x64-windows/debug/html/man3/sk_TYPE_new_null.html x64-windows/debug/html/man3/sk_TYPE_new_reserve.html x64-windows/debug/html/man3/sk_TYPE_num.html x64-windows/debug/html/man3/sk_TYPE_pop.html x64-windows/debug/html/man3/sk_TYPE_pop_free.html x64-windows/debug/html/man3/sk_TYPE_push.html x64-windows/debug/html/man3/sk_TYPE_reserve.html x64-windows/debug/html/man3/sk_TYPE_set.html x64-windows/debug/html/man3/sk_TYPE_set_cmp_func.html x64-windows/debug/html/man3/sk_TYPE_shift.html x64-windows/debug/html/man3/sk_TYPE_sort.html x64-windows/debug/html/man3/sk_TYPE_unshift.html x64-windows/debug/html/man3/sk_TYPE_value.html x64-windows/debug/html/man3/sk_TYPE_zero.html x64-windows/debug/html/man3/ssl_ct_validation_cb.html x64-windows/debug/html/man5/ x64-windows/debug/html/man5/config.html x64-windows/debug/html/man5/x509v3_config.html x64-windows/debug/html/man7/ x64-windows/debug/html/man7/Ed25519.html x64-windows/debug/html/man7/Ed448.html x64-windows/debug/html/man7/RAND.html x64-windows/debug/html/man7/RAND_DRBG.html x64-windows/debug/html/man7/RSA-PSS.html x64-windows/debug/html/man7/SM2.html x64-windows/debug/html/man7/X25519.html x64-windows/debug/html/man7/X448.html x64-windows/debug/html/man7/bio.html x64-windows/debug/html/man7/crypto.html x64-windows/debug/html/man7/ct.html x64-windows/debug/html/man7/des_modes.html x64-windows/debug/html/man7/evp.html x64-windows/debug/html/man7/ossl_store-file.html x64-windows/debug/html/man7/ossl_store.html x64-windows/debug/html/man7/passphrase-encoding.html x64-windows/debug/html/man7/scrypt.html x64-windows/debug/html/man7/ssl.html x64-windows/debug/html/man7/x509.html x64-windows/debug/lib/ x64-windows/debug/lib/libcrypto.lib x64-windows/debug/lib/libssl.lib x64-windows/debug/misc/ x64-windows/debug/misc/CA.pl x64-windows/debug/misc/tsget.pl x64-windows/html/ x64-windows/html/man1/ x64-windows/html/man1/CA.pl.html x64-windows/html/man1/asn1parse.html x64-windows/html/man1/c_rehash.html x64-windows/html/man1/ca.html x64-windows/html/man1/ciphers.html x64-windows/html/man1/cms.html x64-windows/html/man1/crl.html x64-windows/html/man1/crl2pkcs7.html x64-windows/html/man1/dgst.html x64-windows/html/man1/dhparam.html x64-windows/html/man1/dsa.html x64-windows/html/man1/dsaparam.html x64-windows/html/man1/ec.html x64-windows/html/man1/ecparam.html x64-windows/html/man1/enc.html x64-windows/html/man1/engine.html x64-windows/html/man1/errstr.html x64-windows/html/man1/gendsa.html x64-windows/html/man1/genpkey.html x64-windows/html/man1/genrsa.html x64-windows/html/man1/list.html x64-windows/html/man1/nseq.html x64-windows/html/man1/ocsp.html x64-windows/html/man1/openssl-asn1parse.html x64-windows/html/man1/openssl-c_rehash.html x64-windows/html/man1/openssl-ca.html x64-windows/html/man1/openssl-ciphers.html x64-windows/html/man1/openssl-cms.html x64-windows/html/man1/openssl-crl.html x64-windows/html/man1/openssl-crl2pkcs7.html x64-windows/html/man1/openssl-dgst.html x64-windows/html/man1/openssl-dhparam.html x64-windows/html/man1/openssl-dsa.html x64-windows/html/man1/openssl-dsaparam.html x64-windows/html/man1/openssl-ec.html x64-windows/html/man1/openssl-ecparam.html x64-windows/html/man1/openssl-enc.html x64-windows/html/man1/openssl-engine.html x64-windows/html/man1/openssl-errstr.html x64-windows/html/man1/openssl-gendsa.html x64-windows/html/man1/openssl-genpkey.html x64-windows/html/man1/openssl-genrsa.html x64-windows/html/man1/openssl-list.html x64-windows/html/man1/openssl-nseq.html x64-windows/html/man1/openssl-ocsp.html x64-windows/html/man1/openssl-passwd.html x64-windows/html/man1/openssl-pkcs12.html x64-windows/html/man1/openssl-pkcs7.html x64-windows/html/man1/openssl-pkcs8.html x64-windows/html/man1/openssl-pkey.html x64-windows/html/man1/openssl-pkeyparam.html x64-windows/html/man1/openssl-pkeyutl.html x64-windows/html/man1/openssl-prime.html x64-windows/html/man1/openssl-rand.html x64-windows/html/man1/openssl-rehash.html x64-windows/html/man1/openssl-req.html x64-windows/html/man1/openssl-rsa.html x64-windows/html/man1/openssl-rsautl.html x64-windows/html/man1/openssl-s_client.html x64-windows/html/man1/openssl-s_server.html x64-windows/html/man1/openssl-s_time.html x64-windows/html/man1/openssl-sess_id.html x64-windows/html/man1/openssl-smime.html x64-windows/html/man1/openssl-speed.html x64-windows/html/man1/openssl-spkac.html x64-windows/html/man1/openssl-srp.html x64-windows/html/man1/openssl-storeutl.html x64-windows/html/man1/openssl-ts.html x64-windows/html/man1/openssl-tsget.html x64-windows/html/man1/openssl-verify.html x64-windows/html/man1/openssl-version.html x64-windows/html/man1/openssl-x509.html x64-windows/html/man1/openssl.html x64-windows/html/man1/passwd.html x64-windows/html/man1/pkcs12.html x64-windows/html/man1/pkcs7.html x64-windows/html/man1/pkcs8.html x64-windows/html/man1/pkey.html x64-windows/html/man1/pkeyparam.html x64-windows/html/man1/pkeyutl.html x64-windows/html/man1/prime.html x64-windows/html/man1/rand.html x64-windows/html/man1/rehash.html x64-windows/html/man1/req.html x64-windows/html/man1/rsa.html x64-windows/html/man1/rsautl.html x64-windows/html/man1/s_client.html x64-windows/html/man1/s_server.html x64-windows/html/man1/s_time.html x64-windows/html/man1/sess_id.html x64-windows/html/man1/smime.html x64-windows/html/man1/speed.html x64-windows/html/man1/spkac.html x64-windows/html/man1/srp.html x64-windows/html/man1/storeutl.html x64-windows/html/man1/ts.html x64-windows/html/man1/tsget.html x64-windows/html/man1/verify.html x64-windows/html/man1/version.html x64-windows/html/man1/x509.html x64-windows/html/man3/ x64-windows/html/man3/ACCESS_DESCRIPTION_free.html x64-windows/html/man3/ACCESS_DESCRIPTION_new.html x64-windows/html/man3/ADMISSIONS.html x64-windows/html/man3/ADMISSIONS_free.html x64-windows/html/man3/ADMISSIONS_get0_admissionAuthority.html x64-windows/html/man3/ADMISSIONS_get0_namingAuthority.html x64-windows/html/man3/ADMISSIONS_get0_professionInfos.html x64-windows/html/man3/ADMISSIONS_new.html x64-windows/html/man3/ADMISSIONS_set0_admissionAuthority.html x64-windows/html/man3/ADMISSIONS_set0_namingAuthority.html x64-windows/html/man3/ADMISSIONS_set0_professionInfos.html x64-windows/html/man3/ADMISSION_SYNTAX.html x64-windows/html/man3/ADMISSION_SYNTAX_free.html x64-windows/html/man3/ADMISSION_SYNTAX_get0_admissionAuthority.html x64-windows/html/man3/ADMISSION_SYNTAX_get0_contentsOfAdmissions.html x64-windows/html/man3/ADMISSION_SYNTAX_new.html x64-windows/html/man3/ADMISSION_SYNTAX_set0_admissionAuthority.html x64-windows/html/man3/ADMISSION_SYNTAX_set0_contentsOfAdmissions.html x64-windows/html/man3/ASIdOrRange_free.html x64-windows/html/man3/ASIdOrRange_new.html x64-windows/html/man3/ASIdentifierChoice_free.html x64-windows/html/man3/ASIdentifierChoice_new.html x64-windows/html/man3/ASIdentifiers_free.html x64-windows/html/man3/ASIdentifiers_new.html x64-windows/html/man3/ASN1_ENUMERATED_get.html x64-windows/html/man3/ASN1_ENUMERATED_get_int64.html x64-windows/html/man3/ASN1_ENUMERATED_set.html x64-windows/html/man3/ASN1_ENUMERATED_set_int64.html x64-windows/html/man3/ASN1_ENUMERATED_to_BN.html x64-windows/html/man3/ASN1_GENERALIZEDTIME_adj.html x64-windows/html/man3/ASN1_GENERALIZEDTIME_check.html x64-windows/html/man3/ASN1_GENERALIZEDTIME_print.html x64-windows/html/man3/ASN1_GENERALIZEDTIME_set.html x64-windows/html/man3/ASN1_GENERALIZEDTIME_set_string.html x64-windows/html/man3/ASN1_INTEGER_get.html x64-windows/html/man3/ASN1_INTEGER_get_int64.html x64-windows/html/man3/ASN1_INTEGER_get_uint64.html x64-windows/html/man3/ASN1_INTEGER_set.html x64-windows/html/man3/ASN1_INTEGER_set_int64.html x64-windows/html/man3/ASN1_INTEGER_set_uint64.html x64-windows/html/man3/ASN1_INTEGER_to_BN.html x64-windows/html/man3/ASN1_ITEM.html x64-windows/html/man3/ASN1_ITEM_get.html x64-windows/html/man3/ASN1_ITEM_lookup.html x64-windows/html/man3/ASN1_OBJECT_free.html x64-windows/html/man3/ASN1_OBJECT_new.html x64-windows/html/man3/ASN1_STRING_TABLE.html x64-windows/html/man3/ASN1_STRING_TABLE_add.html x64-windows/html/man3/ASN1_STRING_TABLE_cleanup.html x64-windows/html/man3/ASN1_STRING_TABLE_get.html x64-windows/html/man3/ASN1_STRING_cmp.html x64-windows/html/man3/ASN1_STRING_data.html x64-windows/html/man3/ASN1_STRING_dup.html x64-windows/html/man3/ASN1_STRING_free.html x64-windows/html/man3/ASN1_STRING_get0_data.html x64-windows/html/man3/ASN1_STRING_length.html x64-windows/html/man3/ASN1_STRING_new.html x64-windows/html/man3/ASN1_STRING_print.html x64-windows/html/man3/ASN1_STRING_print_ex.html x64-windows/html/man3/ASN1_STRING_print_ex_fp.html x64-windows/html/man3/ASN1_STRING_set.html x64-windows/html/man3/ASN1_STRING_to_UTF8.html x64-windows/html/man3/ASN1_STRING_type.html x64-windows/html/man3/ASN1_STRING_type_new.html x64-windows/html/man3/ASN1_TIME_adj.html x64-windows/html/man3/ASN1_TIME_check.html x64-windows/html/man3/ASN1_TIME_cmp_time_t.html x64-windows/html/man3/ASN1_TIME_compare.html x64-windows/html/man3/ASN1_TIME_diff.html x64-windows/html/man3/ASN1_TIME_normalize.html x64-windows/html/man3/ASN1_TIME_print.html x64-windows/html/man3/ASN1_TIME_set.html x64-windows/html/man3/ASN1_TIME_set_string.html x64-windows/html/man3/ASN1_TIME_set_string_X509.html x64-windows/html/man3/ASN1_TIME_to_generalizedtime.html x64-windows/html/man3/ASN1_TIME_to_tm.html x64-windows/html/man3/ASN1_TYPE_cmp.html x64-windows/html/man3/ASN1_TYPE_get.html x64-windows/html/man3/ASN1_TYPE_pack_sequence.html x64-windows/html/man3/ASN1_TYPE_set.html x64-windows/html/man3/ASN1_TYPE_set1.html x64-windows/html/man3/ASN1_TYPE_unpack_sequence.html x64-windows/html/man3/ASN1_UTCTIME_adj.html x64-windows/html/man3/ASN1_UTCTIME_check.html x64-windows/html/man3/ASN1_UTCTIME_cmp_time_t.html x64-windows/html/man3/ASN1_UTCTIME_print.html x64-windows/html/man3/ASN1_UTCTIME_set.html x64-windows/html/man3/ASN1_UTCTIME_set_string.html x64-windows/html/man3/ASN1_add_oid_module.html x64-windows/html/man3/ASN1_generate_nconf.html x64-windows/html/man3/ASN1_generate_v3.html x64-windows/html/man3/ASN1_tag2str.html x64-windows/html/man3/ASRange_free.html x64-windows/html/man3/ASRange_new.html x64-windows/html/man3/ASYNC_WAIT_CTX_clear_fd.html x64-windows/html/man3/ASYNC_WAIT_CTX_free.html x64-windows/html/man3/ASYNC_WAIT_CTX_get_all_fds.html x64-windows/html/man3/ASYNC_WAIT_CTX_get_changed_fds.html x64-windows/html/man3/ASYNC_WAIT_CTX_get_fd.html x64-windows/html/man3/ASYNC_WAIT_CTX_new.html x64-windows/html/man3/ASYNC_WAIT_CTX_set_wait_fd.html x64-windows/html/man3/ASYNC_block_pause.html x64-windows/html/man3/ASYNC_cleanup_thread.html x64-windows/html/man3/ASYNC_get_current_job.html x64-windows/html/man3/ASYNC_get_wait_ctx.html x64-windows/html/man3/ASYNC_init_thread.html x64-windows/html/man3/ASYNC_is_capable.html x64-windows/html/man3/ASYNC_pause_job.html x64-windows/html/man3/ASYNC_start_job.html x64-windows/html/man3/ASYNC_unblock_pause.html x64-windows/html/man3/AUTHORITY_INFO_ACCESS_free.html x64-windows/html/man3/AUTHORITY_INFO_ACCESS_new.html x64-windows/html/man3/AUTHORITY_KEYID_free.html x64-windows/html/man3/AUTHORITY_KEYID_new.html x64-windows/html/man3/BASIC_CONSTRAINTS_free.html x64-windows/html/man3/BASIC_CONSTRAINTS_new.html x64-windows/html/man3/BF_cbc_encrypt.html x64-windows/html/man3/BF_cfb64_encrypt.html x64-windows/html/man3/BF_decrypt.html x64-windows/html/man3/BF_ecb_encrypt.html x64-windows/html/man3/BF_encrypt.html x64-windows/html/man3/BF_ofb64_encrypt.html x64-windows/html/man3/BF_options.html x64-windows/html/man3/BF_set_key.html x64-windows/html/man3/BIO_ADDR.html x64-windows/html/man3/BIO_ADDRINFO.html x64-windows/html/man3/BIO_ADDRINFO_address.html x64-windows/html/man3/BIO_ADDRINFO_family.html x64-windows/html/man3/BIO_ADDRINFO_free.html x64-windows/html/man3/BIO_ADDRINFO_next.html x64-windows/html/man3/BIO_ADDRINFO_protocol.html x64-windows/html/man3/BIO_ADDRINFO_socktype.html x64-windows/html/man3/BIO_ADDR_clear.html x64-windows/html/man3/BIO_ADDR_family.html x64-windows/html/man3/BIO_ADDR_free.html x64-windows/html/man3/BIO_ADDR_hostname_string.html x64-windows/html/man3/BIO_ADDR_new.html x64-windows/html/man3/BIO_ADDR_path_string.html x64-windows/html/man3/BIO_ADDR_rawaddress.html x64-windows/html/man3/BIO_ADDR_rawmake.html x64-windows/html/man3/BIO_ADDR_rawport.html x64-windows/html/man3/BIO_ADDR_service_string.html x64-windows/html/man3/BIO_accept_ex.html x64-windows/html/man3/BIO_append_filename.html x64-windows/html/man3/BIO_bind.html x64-windows/html/man3/BIO_callback_ctrl.html x64-windows/html/man3/BIO_callback_fn.html x64-windows/html/man3/BIO_callback_fn_ex.html x64-windows/html/man3/BIO_closesocket.html x64-windows/html/man3/BIO_connect.html x64-windows/html/man3/BIO_ctrl.html x64-windows/html/man3/BIO_ctrl_get_read_request.html x64-windows/html/man3/BIO_ctrl_get_write_guarantee.html x64-windows/html/man3/BIO_ctrl_pending.html x64-windows/html/man3/BIO_ctrl_reset_read_request.html x64-windows/html/man3/BIO_ctrl_wpending.html x64-windows/html/man3/BIO_debug_callback.html x64-windows/html/man3/BIO_destroy_bio_pair.html x64-windows/html/man3/BIO_do_accept.html x64-windows/html/man3/BIO_do_connect.html x64-windows/html/man3/BIO_do_handshake.html x64-windows/html/man3/BIO_eof.html x64-windows/html/man3/BIO_f_base64.html x64-windows/html/man3/BIO_f_buffer.html x64-windows/html/man3/BIO_f_cipher.html x64-windows/html/man3/BIO_f_md.html x64-windows/html/man3/BIO_f_null.html x64-windows/html/man3/BIO_f_ssl.html x64-windows/html/man3/BIO_find_type.html x64-windows/html/man3/BIO_flush.html x64-windows/html/man3/BIO_free.html x64-windows/html/man3/BIO_free_all.html x64-windows/html/man3/BIO_get_accept_ip_family.html x64-windows/html/man3/BIO_get_accept_name.html x64-windows/html/man3/BIO_get_accept_port.html x64-windows/html/man3/BIO_get_bind_mode.html x64-windows/html/man3/BIO_get_buffer_num_lines.html x64-windows/html/man3/BIO_get_callback.html x64-windows/html/man3/BIO_get_callback_arg.html x64-windows/html/man3/BIO_get_callback_ex.html x64-windows/html/man3/BIO_get_cipher_ctx.html x64-windows/html/man3/BIO_get_cipher_status.html x64-windows/html/man3/BIO_get_close.html x64-windows/html/man3/BIO_get_conn_address.html x64-windows/html/man3/BIO_get_conn_hostname.html x64-windows/html/man3/BIO_get_conn_ip_family.html x64-windows/html/man3/BIO_get_conn_port.html x64-windows/html/man3/BIO_get_data.html x64-windows/html/man3/BIO_get_ex_data.html x64-windows/html/man3/BIO_get_ex_new_index.html x64-windows/html/man3/BIO_get_fd.html x64-windows/html/man3/BIO_get_fp.html x64-windows/html/man3/BIO_get_info_callback.html x64-windows/html/man3/BIO_get_init.html x64-windows/html/man3/BIO_get_md.html x64-windows/html/man3/BIO_get_md_ctx.html x64-windows/html/man3/BIO_get_mem_data.html x64-windows/html/man3/BIO_get_mem_ptr.html x64-windows/html/man3/BIO_get_new_index.html x64-windows/html/man3/BIO_get_num_renegotiates.html x64-windows/html/man3/BIO_get_peer_name.html x64-windows/html/man3/BIO_get_peer_port.html x64-windows/html/man3/BIO_get_read_request.html x64-windows/html/man3/BIO_get_retry_BIO.html x64-windows/html/man3/BIO_get_retry_reason.html x64-windows/html/man3/BIO_get_shutdown.html x64-windows/html/man3/BIO_get_ssl.html x64-windows/html/man3/BIO_get_write_buf_size.html x64-windows/html/man3/BIO_get_write_guarantee.html x64-windows/html/man3/BIO_gets.html x64-windows/html/man3/BIO_hostserv_priorities.html x64-windows/html/man3/BIO_info_cb.html x64-windows/html/man3/BIO_int_ctrl.html x64-windows/html/man3/BIO_listen.html x64-windows/html/man3/BIO_lookup.html x64-windows/html/man3/BIO_lookup_ex.html x64-windows/html/man3/BIO_lookup_type.html x64-windows/html/man3/BIO_make_bio_pair.html x64-windows/html/man3/BIO_meth_free.html x64-windows/html/man3/BIO_meth_get_callback_ctrl.html x64-windows/html/man3/BIO_meth_get_create.html x64-windows/html/man3/BIO_meth_get_ctrl.html x64-windows/html/man3/BIO_meth_get_destroy.html x64-windows/html/man3/BIO_meth_get_gets.html x64-windows/html/man3/BIO_meth_get_puts.html x64-windows/html/man3/BIO_meth_get_read.html x64-windows/html/man3/BIO_meth_get_read_ex.html x64-windows/html/man3/BIO_meth_get_write.html x64-windows/html/man3/BIO_meth_get_write_ex.html x64-windows/html/man3/BIO_meth_new.html x64-windows/html/man3/BIO_meth_set_callback_ctrl.html x64-windows/html/man3/BIO_meth_set_create.html x64-windows/html/man3/BIO_meth_set_ctrl.html x64-windows/html/man3/BIO_meth_set_destroy.html x64-windows/html/man3/BIO_meth_set_gets.html x64-windows/html/man3/BIO_meth_set_puts.html x64-windows/html/man3/BIO_meth_set_read.html x64-windows/html/man3/BIO_meth_set_read_ex.html x64-windows/html/man3/BIO_meth_set_write.html x64-windows/html/man3/BIO_meth_set_write_ex.html x64-windows/html/man3/BIO_method_type.html x64-windows/html/man3/BIO_new.html x64-windows/html/man3/BIO_new_CMS.html x64-windows/html/man3/BIO_new_accept.html x64-windows/html/man3/BIO_new_bio_pair.html x64-windows/html/man3/BIO_new_buffer_ssl_connect.html x64-windows/html/man3/BIO_new_connect.html x64-windows/html/man3/BIO_new_fd.html x64-windows/html/man3/BIO_new_file.html x64-windows/html/man3/BIO_new_fp.html x64-windows/html/man3/BIO_new_mem_buf.html x64-windows/html/man3/BIO_new_socket.html x64-windows/html/man3/BIO_new_ssl.html x64-windows/html/man3/BIO_new_ssl_connect.html x64-windows/html/man3/BIO_next.html x64-windows/html/man3/BIO_parse_hostserv.html x64-windows/html/man3/BIO_pending.html x64-windows/html/man3/BIO_pop.html x64-windows/html/man3/BIO_printf.html x64-windows/html/man3/BIO_ptr_ctrl.html x64-windows/html/man3/BIO_push.html x64-windows/html/man3/BIO_puts.html x64-windows/html/man3/BIO_read.html x64-windows/html/man3/BIO_read_ex.html x64-windows/html/man3/BIO_read_filename.html x64-windows/html/man3/BIO_reset.html x64-windows/html/man3/BIO_retry_type.html x64-windows/html/man3/BIO_rw_filename.html x64-windows/html/man3/BIO_s_accept.html x64-windows/html/man3/BIO_s_bio.html x64-windows/html/man3/BIO_s_connect.html x64-windows/html/man3/BIO_s_fd.html x64-windows/html/man3/BIO_s_file.html x64-windows/html/man3/BIO_s_mem.html x64-windows/html/man3/BIO_s_null.html x64-windows/html/man3/BIO_s_secmem.html x64-windows/html/man3/BIO_s_socket.html x64-windows/html/man3/BIO_seek.html x64-windows/html/man3/BIO_set_accept_bios.html x64-windows/html/man3/BIO_set_accept_ip_family.html x64-windows/html/man3/BIO_set_accept_name.html x64-windows/html/man3/BIO_set_accept_port.html x64-windows/html/man3/BIO_set_bind_mode.html x64-windows/html/man3/BIO_set_buffer_read_data.html x64-windows/html/man3/BIO_set_buffer_size.html x64-windows/html/man3/BIO_set_callback.html x64-windows/html/man3/BIO_set_callback_arg.html x64-windows/html/man3/BIO_set_callback_ex.html x64-windows/html/man3/BIO_set_cipher.html x64-windows/html/man3/BIO_set_close.html x64-windows/html/man3/BIO_set_conn_address.html x64-windows/html/man3/BIO_set_conn_hostname.html x64-windows/html/man3/BIO_set_conn_ip_family.html x64-windows/html/man3/BIO_set_conn_port.html x64-windows/html/man3/BIO_set_data.html x64-windows/html/man3/BIO_set_ex_data.html x64-windows/html/man3/BIO_set_fd.html x64-windows/html/man3/BIO_set_fp.html x64-windows/html/man3/BIO_set_info_callback.html x64-windows/html/man3/BIO_set_init.html x64-windows/html/man3/BIO_set_md.html x64-windows/html/man3/BIO_set_mem_buf.html x64-windows/html/man3/BIO_set_mem_eof_return.html x64-windows/html/man3/BIO_set_nbio.html x64-windows/html/man3/BIO_set_nbio_accept.html x64-windows/html/man3/BIO_set_next.html x64-windows/html/man3/BIO_set_read_buffer_size.html x64-windows/html/man3/BIO_set_retry_reason.html x64-windows/html/man3/BIO_set_shutdown.html x64-windows/html/man3/BIO_set_ssl.html x64-windows/html/man3/BIO_set_ssl_mode.html x64-windows/html/man3/BIO_set_ssl_renegotiate_bytes.html x64-windows/html/man3/BIO_set_ssl_renegotiate_timeout.html x64-windows/html/man3/BIO_set_write_buf_size.html x64-windows/html/man3/BIO_set_write_buffer_size.html x64-windows/html/man3/BIO_should_io_special.html x64-windows/html/man3/BIO_should_read.html x64-windows/html/man3/BIO_should_retry.html x64-windows/html/man3/BIO_should_write.html x64-windows/html/man3/BIO_shutdown_wr.html x64-windows/html/man3/BIO_snprintf.html x64-windows/html/man3/BIO_socket.html x64-windows/html/man3/BIO_ssl_copy_session_id.html x64-windows/html/man3/BIO_ssl_shutdown.html x64-windows/html/man3/BIO_tell.html x64-windows/html/man3/BIO_up_ref.html x64-windows/html/man3/BIO_vfree.html x64-windows/html/man3/BIO_vprintf.html x64-windows/html/man3/BIO_vsnprintf.html x64-windows/html/man3/BIO_wpending.html x64-windows/html/man3/BIO_write.html x64-windows/html/man3/BIO_write_ex.html x64-windows/html/man3/BIO_write_filename.html x64-windows/html/man3/BN_BLINDING_convert.html x64-windows/html/man3/BN_BLINDING_convert_ex.html x64-windows/html/man3/BN_BLINDING_create_param.html x64-windows/html/man3/BN_BLINDING_free.html x64-windows/html/man3/BN_BLINDING_get_flags.html x64-windows/html/man3/BN_BLINDING_invert.html x64-windows/html/man3/BN_BLINDING_invert_ex.html x64-windows/html/man3/BN_BLINDING_is_current_thread.html x64-windows/html/man3/BN_BLINDING_lock.html x64-windows/html/man3/BN_BLINDING_new.html x64-windows/html/man3/BN_BLINDING_set_current_thread.html x64-windows/html/man3/BN_BLINDING_set_flags.html x64-windows/html/man3/BN_BLINDING_unlock.html x64-windows/html/man3/BN_BLINDING_update.html x64-windows/html/man3/BN_CTX_end.html x64-windows/html/man3/BN_CTX_free.html x64-windows/html/man3/BN_CTX_get.html x64-windows/html/man3/BN_CTX_new.html x64-windows/html/man3/BN_CTX_secure_new.html x64-windows/html/man3/BN_CTX_start.html x64-windows/html/man3/BN_GENCB_call.html x64-windows/html/man3/BN_GENCB_free.html x64-windows/html/man3/BN_GENCB_get_arg.html x64-windows/html/man3/BN_GENCB_new.html x64-windows/html/man3/BN_GENCB_set.html x64-windows/html/man3/BN_GENCB_set_old.html x64-windows/html/man3/BN_MONT_CTX_copy.html x64-windows/html/man3/BN_MONT_CTX_free.html x64-windows/html/man3/BN_MONT_CTX_new.html x64-windows/html/man3/BN_MONT_CTX_set.html x64-windows/html/man3/BN_RECP_CTX_free.html x64-windows/html/man3/BN_RECP_CTX_new.html x64-windows/html/man3/BN_RECP_CTX_set.html x64-windows/html/man3/BN_add.html x64-windows/html/man3/BN_add_word.html x64-windows/html/man3/BN_bin2bn.html x64-windows/html/man3/BN_bn2bin.html x64-windows/html/man3/BN_bn2binpad.html x64-windows/html/man3/BN_bn2dec.html x64-windows/html/man3/BN_bn2hex.html x64-windows/html/man3/BN_bn2lebinpad.html x64-windows/html/man3/BN_bn2mpi.html x64-windows/html/man3/BN_clear.html x64-windows/html/man3/BN_clear_bit.html x64-windows/html/man3/BN_clear_free.html x64-windows/html/man3/BN_cmp.html x64-windows/html/man3/BN_copy.html x64-windows/html/man3/BN_dec2bn.html x64-windows/html/man3/BN_div.html x64-windows/html/man3/BN_div_recp.html x64-windows/html/man3/BN_div_word.html x64-windows/html/man3/BN_dup.html x64-windows/html/man3/BN_exp.html x64-windows/html/man3/BN_free.html x64-windows/html/man3/BN_from_montgomery.html x64-windows/html/man3/BN_gcd.html x64-windows/html/man3/BN_generate_prime.html x64-windows/html/man3/BN_generate_prime_ex.html x64-windows/html/man3/BN_get0_nist_prime_192.html x64-windows/html/man3/BN_get0_nist_prime_224.html x64-windows/html/man3/BN_get0_nist_prime_256.html x64-windows/html/man3/BN_get0_nist_prime_384.html x64-windows/html/man3/BN_get0_nist_prime_521.html x64-windows/html/man3/BN_get_rfc2409_prime_1024.html x64-windows/html/man3/BN_get_rfc2409_prime_768.html x64-windows/html/man3/BN_get_rfc3526_prime_1536.html x64-windows/html/man3/BN_get_rfc3526_prime_2048.html x64-windows/html/man3/BN_get_rfc3526_prime_3072.html x64-windows/html/man3/BN_get_rfc3526_prime_4096.html x64-windows/html/man3/BN_get_rfc3526_prime_6144.html x64-windows/html/man3/BN_get_rfc3526_prime_8192.html x64-windows/html/man3/BN_get_word.html x64-windows/html/man3/BN_hex2bn.html x64-windows/html/man3/BN_is_bit_set.html x64-windows/html/man3/BN_is_odd.html x64-windows/html/man3/BN_is_one.html x64-windows/html/man3/BN_is_prime.html x64-windows/html/man3/BN_is_prime_ex.html x64-windows/html/man3/BN_is_prime_fasttest.html x64-windows/html/man3/BN_is_prime_fasttest_ex.html x64-windows/html/man3/BN_is_word.html x64-windows/html/man3/BN_is_zero.html x64-windows/html/man3/BN_lebin2bn.html x64-windows/html/man3/BN_lshift.html x64-windows/html/man3/BN_lshift1.html x64-windows/html/man3/BN_mask_bits.html x64-windows/html/man3/BN_mod.html x64-windows/html/man3/BN_mod_add.html x64-windows/html/man3/BN_mod_exp.html x64-windows/html/man3/BN_mod_inverse.html x64-windows/html/man3/BN_mod_mul.html x64-windows/html/man3/BN_mod_mul_montgomery.html x64-windows/html/man3/BN_mod_mul_reciprocal.html x64-windows/html/man3/BN_mod_sqr.html x64-windows/html/man3/BN_mod_sub.html x64-windows/html/man3/BN_mod_word.html x64-windows/html/man3/BN_mpi2bn.html x64-windows/html/man3/BN_mul.html x64-windows/html/man3/BN_mul_word.html x64-windows/html/man3/BN_new.html x64-windows/html/man3/BN_nnmod.html x64-windows/html/man3/BN_num_bits.html x64-windows/html/man3/BN_num_bits_word.html x64-windows/html/man3/BN_num_bytes.html x64-windows/html/man3/BN_one.html x64-windows/html/man3/BN_print.html x64-windows/html/man3/BN_print_fp.html x64-windows/html/man3/BN_priv_rand.html x64-windows/html/man3/BN_priv_rand_range.html x64-windows/html/man3/BN_pseudo_rand.html x64-windows/html/man3/BN_pseudo_rand_range.html x64-windows/html/man3/BN_rand.html x64-windows/html/man3/BN_rand_range.html x64-windows/html/man3/BN_rshift.html x64-windows/html/man3/BN_rshift1.html x64-windows/html/man3/BN_secure_new.html x64-windows/html/man3/BN_security_bits.html x64-windows/html/man3/BN_set_bit.html x64-windows/html/man3/BN_set_word.html x64-windows/html/man3/BN_sqr.html x64-windows/html/man3/BN_sub.html x64-windows/html/man3/BN_sub_word.html x64-windows/html/man3/BN_swap.html x64-windows/html/man3/BN_to_ASN1_ENUMERATED.html x64-windows/html/man3/BN_to_ASN1_INTEGER.html x64-windows/html/man3/BN_to_montgomery.html x64-windows/html/man3/BN_ucmp.html x64-windows/html/man3/BN_value_one.html x64-windows/html/man3/BN_with_flags.html x64-windows/html/man3/BN_zero.html x64-windows/html/man3/BUF_MEM_free.html x64-windows/html/man3/BUF_MEM_grow.html x64-windows/html/man3/BUF_MEM_grow_clean.html x64-windows/html/man3/BUF_MEM_new.html x64-windows/html/man3/BUF_MEM_new_ex.html x64-windows/html/man3/BUF_reverse.html x64-windows/html/man3/CERTIFICATEPOLICIES_free.html x64-windows/html/man3/CERTIFICATEPOLICIES_new.html x64-windows/html/man3/CMS_ContentInfo_free.html x64-windows/html/man3/CMS_ContentInfo_new.html x64-windows/html/man3/CMS_ContentInfo_print_ctx.html x64-windows/html/man3/CMS_ReceiptRequest_create0.html x64-windows/html/man3/CMS_ReceiptRequest_free.html x64-windows/html/man3/CMS_ReceiptRequest_get0_values.html x64-windows/html/man3/CMS_ReceiptRequest_new.html x64-windows/html/man3/CMS_RecipientInfo_decrypt.html x64-windows/html/man3/CMS_RecipientInfo_encrypt.html x64-windows/html/man3/CMS_RecipientInfo_kekri_get0_id.html x64-windows/html/man3/CMS_RecipientInfo_kekri_id_cmp.html x64-windows/html/man3/CMS_RecipientInfo_ktri_cert_cmp.html x64-windows/html/man3/CMS_RecipientInfo_ktri_get0_signer_id.html x64-windows/html/man3/CMS_RecipientInfo_set0_key.html x64-windows/html/man3/CMS_RecipientInfo_set0_pkey.html x64-windows/html/man3/CMS_RecipientInfo_type.html x64-windows/html/man3/CMS_SignerInfo_cert_cmp.html x64-windows/html/man3/CMS_SignerInfo_get0_signature.html x64-windows/html/man3/CMS_SignerInfo_get0_signer_id.html x64-windows/html/man3/CMS_SignerInfo_set1_signer_cert.html x64-windows/html/man3/CMS_SignerInfo_sign.html x64-windows/html/man3/CMS_add0_cert.html x64-windows/html/man3/CMS_add0_crl.html x64-windows/html/man3/CMS_add0_recipient_key.html x64-windows/html/man3/CMS_add1_ReceiptRequest.html x64-windows/html/man3/CMS_add1_cert.html x64-windows/html/man3/CMS_add1_crl.html x64-windows/html/man3/CMS_add1_recipient_cert.html x64-windows/html/man3/CMS_add1_signer.html x64-windows/html/man3/CMS_compress.html x64-windows/html/man3/CMS_decrypt.html x64-windows/html/man3/CMS_encrypt.html x64-windows/html/man3/CMS_final.html x64-windows/html/man3/CMS_get0_RecipientInfos.html x64-windows/html/man3/CMS_get0_SignerInfos.html x64-windows/html/man3/CMS_get0_content.html x64-windows/html/man3/CMS_get0_eContentType.html x64-windows/html/man3/CMS_get0_signers.html x64-windows/html/man3/CMS_get0_type.html x64-windows/html/man3/CMS_get1_ReceiptRequest.html x64-windows/html/man3/CMS_get1_certs.html x64-windows/html/man3/CMS_get1_crls.html x64-windows/html/man3/CMS_set1_eContentType.html x64-windows/html/man3/CMS_sign.html x64-windows/html/man3/CMS_sign_receipt.html x64-windows/html/man3/CMS_uncompress.html x64-windows/html/man3/CMS_verify.html x64-windows/html/man3/CMS_verify_receipt.html x64-windows/html/man3/CONF_modules_finish.html x64-windows/html/man3/CONF_modules_free.html x64-windows/html/man3/CONF_modules_load.html x64-windows/html/man3/CONF_modules_load_file.html x64-windows/html/man3/CONF_modules_unload.html x64-windows/html/man3/CRL_DIST_POINTS_free.html x64-windows/html/man3/CRL_DIST_POINTS_new.html x64-windows/html/man3/CRYPTO_EX_dup.html x64-windows/html/man3/CRYPTO_EX_free.html x64-windows/html/man3/CRYPTO_EX_new.html x64-windows/html/man3/CRYPTO_THREAD_lock_free.html x64-windows/html/man3/CRYPTO_THREAD_lock_new.html x64-windows/html/man3/CRYPTO_THREAD_read_lock.html x64-windows/html/man3/CRYPTO_THREAD_run_once.html x64-windows/html/man3/CRYPTO_THREAD_unlock.html x64-windows/html/man3/CRYPTO_THREAD_write_lock.html x64-windows/html/man3/CRYPTO_atomic_add.html x64-windows/html/man3/CRYPTO_clear_free.html x64-windows/html/man3/CRYPTO_clear_realloc.html x64-windows/html/man3/CRYPTO_free.html x64-windows/html/man3/CRYPTO_free_ex_data.html x64-windows/html/man3/CRYPTO_free_ex_index.html x64-windows/html/man3/CRYPTO_get_alloc_counts.html x64-windows/html/man3/CRYPTO_get_ex_data.html x64-windows/html/man3/CRYPTO_get_ex_new_index.html x64-windows/html/man3/CRYPTO_get_mem_functions.html x64-windows/html/man3/CRYPTO_malloc.html x64-windows/html/man3/CRYPTO_mem_ctrl.html x64-windows/html/man3/CRYPTO_mem_debug_pop.html x64-windows/html/man3/CRYPTO_mem_debug_push.html x64-windows/html/man3/CRYPTO_mem_leaks.html x64-windows/html/man3/CRYPTO_mem_leaks_cb.html x64-windows/html/man3/CRYPTO_mem_leaks_fp.html x64-windows/html/man3/CRYPTO_memcmp.html x64-windows/html/man3/CRYPTO_new_ex_data.html x64-windows/html/man3/CRYPTO_realloc.html x64-windows/html/man3/CRYPTO_secure_clear_free.html x64-windows/html/man3/CRYPTO_secure_free.html x64-windows/html/man3/CRYPTO_secure_malloc.html x64-windows/html/man3/CRYPTO_secure_malloc_done.html x64-windows/html/man3/CRYPTO_secure_malloc_init.html x64-windows/html/man3/CRYPTO_secure_malloc_initialized.html x64-windows/html/man3/CRYPTO_secure_used.html x64-windows/html/man3/CRYPTO_secure_zalloc.html x64-windows/html/man3/CRYPTO_set_ex_data.html x64-windows/html/man3/CRYPTO_set_mem_debug.html x64-windows/html/man3/CRYPTO_set_mem_functions.html x64-windows/html/man3/CRYPTO_strdup.html x64-windows/html/man3/CRYPTO_strndup.html x64-windows/html/man3/CRYPTO_zalloc.html x64-windows/html/man3/CTLOG_STORE_free.html x64-windows/html/man3/CTLOG_STORE_get0_log_by_id.html x64-windows/html/man3/CTLOG_STORE_load_default_file.html x64-windows/html/man3/CTLOG_STORE_load_file.html x64-windows/html/man3/CTLOG_STORE_new.html x64-windows/html/man3/CTLOG_free.html x64-windows/html/man3/CTLOG_get0_log_id.html x64-windows/html/man3/CTLOG_get0_name.html x64-windows/html/man3/CTLOG_get0_public_key.html x64-windows/html/man3/CTLOG_new.html x64-windows/html/man3/CTLOG_new_from_base64.html x64-windows/html/man3/CT_POLICY_EVAL_CTX_free.html x64-windows/html/man3/CT_POLICY_EVAL_CTX_get0_cert.html x64-windows/html/man3/CT_POLICY_EVAL_CTX_get0_issuer.html x64-windows/html/man3/CT_POLICY_EVAL_CTX_get0_log_store.html x64-windows/html/man3/CT_POLICY_EVAL_CTX_get_time.html x64-windows/html/man3/CT_POLICY_EVAL_CTX_new.html x64-windows/html/man3/CT_POLICY_EVAL_CTX_set1_cert.html x64-windows/html/man3/CT_POLICY_EVAL_CTX_set1_issuer.html x64-windows/html/man3/CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE.html x64-windows/html/man3/CT_POLICY_EVAL_CTX_set_time.html x64-windows/html/man3/DECLARE_ASN1_FUNCTIONS.html x64-windows/html/man3/DECLARE_LHASH_OF.html x64-windows/html/man3/DECLARE_PEM_rw.html x64-windows/html/man3/DEFINE_SPECIAL_STACK_OF.html x64-windows/html/man3/DEFINE_SPECIAL_STACK_OF_CONST.html x64-windows/html/man3/DEFINE_STACK_OF.html x64-windows/html/man3/DEFINE_STACK_OF_CONST.html x64-windows/html/man3/DES_cbc_cksum.html x64-windows/html/man3/DES_cfb64_encrypt.html x64-windows/html/man3/DES_cfb_encrypt.html x64-windows/html/man3/DES_crypt.html x64-windows/html/man3/DES_ecb2_encrypt.html x64-windows/html/man3/DES_ecb3_encrypt.html x64-windows/html/man3/DES_ecb_encrypt.html x64-windows/html/man3/DES_ede2_cbc_encrypt.html x64-windows/html/man3/DES_ede2_cfb64_encrypt.html x64-windows/html/man3/DES_ede2_ofb64_encrypt.html x64-windows/html/man3/DES_ede3_cbc_encrypt.html x64-windows/html/man3/DES_ede3_cfb64_encrypt.html x64-windows/html/man3/DES_ede3_ofb64_encrypt.html x64-windows/html/man3/DES_fcrypt.html x64-windows/html/man3/DES_is_weak_key.html x64-windows/html/man3/DES_key_sched.html x64-windows/html/man3/DES_ncbc_encrypt.html x64-windows/html/man3/DES_ofb64_encrypt.html x64-windows/html/man3/DES_ofb_encrypt.html x64-windows/html/man3/DES_pcbc_encrypt.html x64-windows/html/man3/DES_quad_cksum.html x64-windows/html/man3/DES_random_key.html x64-windows/html/man3/DES_set_key.html x64-windows/html/man3/DES_set_key_checked.html x64-windows/html/man3/DES_set_key_unchecked.html x64-windows/html/man3/DES_set_odd_parity.html x64-windows/html/man3/DES_string_to_2keys.html x64-windows/html/man3/DES_string_to_key.html x64-windows/html/man3/DES_xcbc_encrypt.html x64-windows/html/man3/DH_OpenSSL.html x64-windows/html/man3/DH_bits.html x64-windows/html/man3/DH_check.html x64-windows/html/man3/DH_check_ex.html x64-windows/html/man3/DH_check_params.html x64-windows/html/man3/DH_check_params_ex.html x64-windows/html/man3/DH_check_pub_key_ex.html x64-windows/html/man3/DH_clear_flags.html x64-windows/html/man3/DH_compute_key.html x64-windows/html/man3/DH_free.html x64-windows/html/man3/DH_generate_key.html x64-windows/html/man3/DH_generate_parameters.html x64-windows/html/man3/DH_generate_parameters_ex.html x64-windows/html/man3/DH_get0_engine.html x64-windows/html/man3/DH_get0_g.html x64-windows/html/man3/DH_get0_key.html x64-windows/html/man3/DH_get0_p.html x64-windows/html/man3/DH_get0_pqg.html x64-windows/html/man3/DH_get0_priv_key.html x64-windows/html/man3/DH_get0_pub_key.html x64-windows/html/man3/DH_get0_q.html x64-windows/html/man3/DH_get_1024_160.html x64-windows/html/man3/DH_get_2048_224.html x64-windows/html/man3/DH_get_2048_256.html x64-windows/html/man3/DH_get_default_method.html x64-windows/html/man3/DH_get_ex_data.html x64-windows/html/man3/DH_get_ex_new_index.html x64-windows/html/man3/DH_get_length.html x64-windows/html/man3/DH_get_nid.html x64-windows/html/man3/DH_meth_dup.html x64-windows/html/man3/DH_meth_free.html x64-windows/html/man3/DH_meth_get0_app_data.html x64-windows/html/man3/DH_meth_get0_name.html x64-windows/html/man3/DH_meth_get_bn_mod_exp.html x64-windows/html/man3/DH_meth_get_compute_key.html x64-windows/html/man3/DH_meth_get_finish.html x64-windows/html/man3/DH_meth_get_flags.html x64-windows/html/man3/DH_meth_get_generate_key.html x64-windows/html/man3/DH_meth_get_generate_params.html x64-windows/html/man3/DH_meth_get_init.html x64-windows/html/man3/DH_meth_new.html x64-windows/html/man3/DH_meth_set0_app_data.html x64-windows/html/man3/DH_meth_set1_name.html x64-windows/html/man3/DH_meth_set_bn_mod_exp.html x64-windows/html/man3/DH_meth_set_compute_key.html x64-windows/html/man3/DH_meth_set_finish.html x64-windows/html/man3/DH_meth_set_flags.html x64-windows/html/man3/DH_meth_set_generate_key.html x64-windows/html/man3/DH_meth_set_generate_params.html x64-windows/html/man3/DH_meth_set_init.html x64-windows/html/man3/DH_new.html x64-windows/html/man3/DH_new_by_nid.html x64-windows/html/man3/DH_new_method.html x64-windows/html/man3/DH_security_bits.html x64-windows/html/man3/DH_set0_key.html x64-windows/html/man3/DH_set0_pqg.html x64-windows/html/man3/DH_set_default_method.html x64-windows/html/man3/DH_set_ex_data.html x64-windows/html/man3/DH_set_flags.html x64-windows/html/man3/DH_set_length.html x64-windows/html/man3/DH_set_method.html x64-windows/html/man3/DH_size.html x64-windows/html/man3/DH_test_flags.html x64-windows/html/man3/DHparams_print.html x64-windows/html/man3/DHparams_print_fp.html x64-windows/html/man3/DIRECTORYSTRING_free.html x64-windows/html/man3/DIRECTORYSTRING_new.html x64-windows/html/man3/DISPLAYTEXT_free.html x64-windows/html/man3/DISPLAYTEXT_new.html x64-windows/html/man3/DIST_POINT_NAME_free.html x64-windows/html/man3/DIST_POINT_NAME_new.html x64-windows/html/man3/DIST_POINT_free.html x64-windows/html/man3/DIST_POINT_new.html x64-windows/html/man3/DSA_OpenSSL.html x64-windows/html/man3/DSA_SIG_free.html x64-windows/html/man3/DSA_SIG_get0.html x64-windows/html/man3/DSA_SIG_new.html x64-windows/html/man3/DSA_SIG_set0.html x64-windows/html/man3/DSA_bits.html x64-windows/html/man3/DSA_clear_flags.html x64-windows/html/man3/DSA_do_sign.html x64-windows/html/man3/DSA_do_verify.html x64-windows/html/man3/DSA_dup_DH.html x64-windows/html/man3/DSA_free.html x64-windows/html/man3/DSA_generate_key.html x64-windows/html/man3/DSA_generate_parameters.html x64-windows/html/man3/DSA_generate_parameters_ex.html x64-windows/html/man3/DSA_get0_engine.html x64-windows/html/man3/DSA_get0_g.html x64-windows/html/man3/DSA_get0_key.html x64-windows/html/man3/DSA_get0_p.html x64-windows/html/man3/DSA_get0_pqg.html x64-windows/html/man3/DSA_get0_priv_key.html x64-windows/html/man3/DSA_get0_pub_key.html x64-windows/html/man3/DSA_get0_q.html x64-windows/html/man3/DSA_get_default_method.html x64-windows/html/man3/DSA_get_ex_data.html x64-windows/html/man3/DSA_get_ex_new_index.html x64-windows/html/man3/DSA_meth_dup.html x64-windows/html/man3/DSA_meth_free.html x64-windows/html/man3/DSA_meth_get0_app_data.html x64-windows/html/man3/DSA_meth_get0_name.html x64-windows/html/man3/DSA_meth_get_bn_mod_exp.html x64-windows/html/man3/DSA_meth_get_finish.html x64-windows/html/man3/DSA_meth_get_flags.html x64-windows/html/man3/DSA_meth_get_init.html x64-windows/html/man3/DSA_meth_get_keygen.html x64-windows/html/man3/DSA_meth_get_mod_exp.html x64-windows/html/man3/DSA_meth_get_paramgen.html x64-windows/html/man3/DSA_meth_get_sign.html x64-windows/html/man3/DSA_meth_get_sign_setup.html x64-windows/html/man3/DSA_meth_get_verify.html x64-windows/html/man3/DSA_meth_new.html x64-windows/html/man3/DSA_meth_set0_app_data.html x64-windows/html/man3/DSA_meth_set1_name.html x64-windows/html/man3/DSA_meth_set_bn_mod_exp.html x64-windows/html/man3/DSA_meth_set_finish.html x64-windows/html/man3/DSA_meth_set_flags.html x64-windows/html/man3/DSA_meth_set_init.html x64-windows/html/man3/DSA_meth_set_keygen.html x64-windows/html/man3/DSA_meth_set_mod_exp.html x64-windows/html/man3/DSA_meth_set_paramgen.html x64-windows/html/man3/DSA_meth_set_sign.html x64-windows/html/man3/DSA_meth_set_sign_setup.html x64-windows/html/man3/DSA_meth_set_verify.html x64-windows/html/man3/DSA_new.html x64-windows/html/man3/DSA_new_method.html x64-windows/html/man3/DSA_print.html x64-windows/html/man3/DSA_print_fp.html x64-windows/html/man3/DSA_security_bits.html x64-windows/html/man3/DSA_set0_key.html x64-windows/html/man3/DSA_set0_pqg.html x64-windows/html/man3/DSA_set_default_method.html x64-windows/html/man3/DSA_set_ex_data.html x64-windows/html/man3/DSA_set_flags.html x64-windows/html/man3/DSA_set_method.html x64-windows/html/man3/DSA_sign.html x64-windows/html/man3/DSA_sign_setup.html x64-windows/html/man3/DSA_size.html x64-windows/html/man3/DSA_test_flags.html x64-windows/html/man3/DSA_verify.html x64-windows/html/man3/DSAparams_dup.html x64-windows/html/man3/DSAparams_print.html x64-windows/html/man3/DSAparams_print_fp.html x64-windows/html/man3/DTLS_client_method.html x64-windows/html/man3/DTLS_get_data_mtu.html x64-windows/html/man3/DTLS_method.html x64-windows/html/man3/DTLS_server_method.html x64-windows/html/man3/DTLS_set_timer_cb.html x64-windows/html/man3/DTLS_timer_cb.html x64-windows/html/man3/DTLSv1_2_client_method.html x64-windows/html/man3/DTLSv1_2_method.html x64-windows/html/man3/DTLSv1_2_server_method.html x64-windows/html/man3/DTLSv1_client_method.html x64-windows/html/man3/DTLSv1_listen.html x64-windows/html/man3/DTLSv1_method.html x64-windows/html/man3/DTLSv1_server_method.html x64-windows/html/man3/ECDH_get_ex_data.html x64-windows/html/man3/ECDH_get_ex_new_index.html x64-windows/html/man3/ECDH_set_ex_data.html x64-windows/html/man3/ECDSA_SIG_free.html x64-windows/html/man3/ECDSA_SIG_get0.html x64-windows/html/man3/ECDSA_SIG_get0_r.html x64-windows/html/man3/ECDSA_SIG_get0_s.html x64-windows/html/man3/ECDSA_SIG_new.html x64-windows/html/man3/ECDSA_SIG_set0.html x64-windows/html/man3/ECDSA_do_sign.html x64-windows/html/man3/ECDSA_do_sign_ex.html x64-windows/html/man3/ECDSA_do_verify.html x64-windows/html/man3/ECDSA_sign.html x64-windows/html/man3/ECDSA_sign_ex.html x64-windows/html/man3/ECDSA_sign_setup.html x64-windows/html/man3/ECDSA_size.html x64-windows/html/man3/ECDSA_verify.html x64-windows/html/man3/ECPARAMETERS_free.html x64-windows/html/man3/ECPARAMETERS_new.html x64-windows/html/man3/ECPKPARAMETERS_free.html x64-windows/html/man3/ECPKPARAMETERS_new.html x64-windows/html/man3/ECPKParameters_print.html x64-windows/html/man3/ECPKParameters_print_fp.html x64-windows/html/man3/EC_GF2m_simple_method.html x64-windows/html/man3/EC_GFp_mont_method.html x64-windows/html/man3/EC_GFp_nist_method.html x64-windows/html/man3/EC_GFp_nistp224_method.html x64-windows/html/man3/EC_GFp_nistp256_method.html x64-windows/html/man3/EC_GFp_nistp521_method.html x64-windows/html/man3/EC_GFp_simple_method.html x64-windows/html/man3/EC_GROUP_check.html x64-windows/html/man3/EC_GROUP_check_discriminant.html x64-windows/html/man3/EC_GROUP_clear_free.html x64-windows/html/man3/EC_GROUP_cmp.html x64-windows/html/man3/EC_GROUP_copy.html x64-windows/html/man3/EC_GROUP_dup.html x64-windows/html/man3/EC_GROUP_free.html x64-windows/html/man3/EC_GROUP_get0_cofactor.html x64-windows/html/man3/EC_GROUP_get0_generator.html x64-windows/html/man3/EC_GROUP_get0_order.html x64-windows/html/man3/EC_GROUP_get0_seed.html x64-windows/html/man3/EC_GROUP_get_asn1_flag.html x64-windows/html/man3/EC_GROUP_get_basis_type.html x64-windows/html/man3/EC_GROUP_get_cofactor.html x64-windows/html/man3/EC_GROUP_get_curve.html x64-windows/html/man3/EC_GROUP_get_curve_GF2m.html x64-windows/html/man3/EC_GROUP_get_curve_GFp.html x64-windows/html/man3/EC_GROUP_get_curve_name.html x64-windows/html/man3/EC_GROUP_get_degree.html x64-windows/html/man3/EC_GROUP_get_ecparameters.html x64-windows/html/man3/EC_GROUP_get_ecpkparameters.html x64-windows/html/man3/EC_GROUP_get_order.html x64-windows/html/man3/EC_GROUP_get_pentanomial_basis.html x64-windows/html/man3/EC_GROUP_get_point_conversion_form.html x64-windows/html/man3/EC_GROUP_get_seed_len.html x64-windows/html/man3/EC_GROUP_get_trinomial_basis.html x64-windows/html/man3/EC_GROUP_have_precompute_mult.html x64-windows/html/man3/EC_GROUP_method_of.html x64-windows/html/man3/EC_GROUP_new.html x64-windows/html/man3/EC_GROUP_new_by_curve_name.html x64-windows/html/man3/EC_GROUP_new_curve_GF2m.html x64-windows/html/man3/EC_GROUP_new_curve_GFp.html x64-windows/html/man3/EC_GROUP_new_from_ecparameters.html x64-windows/html/man3/EC_GROUP_new_from_ecpkparameters.html x64-windows/html/man3/EC_GROUP_order_bits.html x64-windows/html/man3/EC_GROUP_precompute_mult.html x64-windows/html/man3/EC_GROUP_set_asn1_flag.html x64-windows/html/man3/EC_GROUP_set_curve.html x64-windows/html/man3/EC_GROUP_set_curve_GF2m.html x64-windows/html/man3/EC_GROUP_set_curve_GFp.html x64-windows/html/man3/EC_GROUP_set_curve_name.html x64-windows/html/man3/EC_GROUP_set_generator.html x64-windows/html/man3/EC_GROUP_set_point_conversion_form.html x64-windows/html/man3/EC_GROUP_set_seed.html x64-windows/html/man3/EC_KEY_check_key.html x64-windows/html/man3/EC_KEY_clear_flags.html x64-windows/html/man3/EC_KEY_copy.html x64-windows/html/man3/EC_KEY_dup.html x64-windows/html/man3/EC_KEY_free.html x64-windows/html/man3/EC_KEY_generate_key.html x64-windows/html/man3/EC_KEY_get0_engine.html x64-windows/html/man3/EC_KEY_get0_group.html x64-windows/html/man3/EC_KEY_get0_private_key.html x64-windows/html/man3/EC_KEY_get0_public_key.html x64-windows/html/man3/EC_KEY_get_conv_form.html x64-windows/html/man3/EC_KEY_get_enc_flags.html x64-windows/html/man3/EC_KEY_get_ex_data.html x64-windows/html/man3/EC_KEY_get_ex_new_index.html x64-windows/html/man3/EC_KEY_get_flags.html x64-windows/html/man3/EC_KEY_get_method.html x64-windows/html/man3/EC_KEY_key2buf.html x64-windows/html/man3/EC_KEY_new.html x64-windows/html/man3/EC_KEY_new_by_curve_name.html x64-windows/html/man3/EC_KEY_oct2key.html x64-windows/html/man3/EC_KEY_oct2priv.html x64-windows/html/man3/EC_KEY_precompute_mult.html x64-windows/html/man3/EC_KEY_priv2buf.html x64-windows/html/man3/EC_KEY_priv2oct.html x64-windows/html/man3/EC_KEY_set_asn1_flag.html x64-windows/html/man3/EC_KEY_set_conv_form.html x64-windows/html/man3/EC_KEY_set_enc_flags.html x64-windows/html/man3/EC_KEY_set_ex_data.html x64-windows/html/man3/EC_KEY_set_flags.html x64-windows/html/man3/EC_KEY_set_group.html x64-windows/html/man3/EC_KEY_set_method.html x64-windows/html/man3/EC_KEY_set_private_key.html x64-windows/html/man3/EC_KEY_set_public_key.html x64-windows/html/man3/EC_KEY_set_public_key_affine_coordinates.html x64-windows/html/man3/EC_KEY_up_ref.html x64-windows/html/man3/EC_METHOD_get_field_type.html x64-windows/html/man3/EC_POINT_add.html x64-windows/html/man3/EC_POINT_bn2point.html x64-windows/html/man3/EC_POINT_clear_free.html x64-windows/html/man3/EC_POINT_cmp.html x64-windows/html/man3/EC_POINT_copy.html x64-windows/html/man3/EC_POINT_dbl.html x64-windows/html/man3/EC_POINT_dup.html x64-windows/html/man3/EC_POINT_free.html x64-windows/html/man3/EC_POINT_get_Jprojective_coordinates_GFp.html x64-windows/html/man3/EC_POINT_get_affine_coordinates.html x64-windows/html/man3/EC_POINT_get_affine_coordinates_GF2m.html x64-windows/html/man3/EC_POINT_get_affine_coordinates_GFp.html x64-windows/html/man3/EC_POINT_hex2point.html x64-windows/html/man3/EC_POINT_invert.html x64-windows/html/man3/EC_POINT_is_at_infinity.html x64-windows/html/man3/EC_POINT_is_on_curve.html x64-windows/html/man3/EC_POINT_make_affine.html x64-windows/html/man3/EC_POINT_method_of.html x64-windows/html/man3/EC_POINT_mul.html x64-windows/html/man3/EC_POINT_new.html x64-windows/html/man3/EC_POINT_oct2point.html x64-windows/html/man3/EC_POINT_point2bn.html x64-windows/html/man3/EC_POINT_point2buf.html x64-windows/html/man3/EC_POINT_point2hex.html x64-windows/html/man3/EC_POINT_point2oct.html x64-windows/html/man3/EC_POINT_set_Jprojective_coordinates_GFp.html x64-windows/html/man3/EC_POINT_set_affine_coordinates.html x64-windows/html/man3/EC_POINT_set_affine_coordinates_GF2m.html x64-windows/html/man3/EC_POINT_set_affine_coordinates_GFp.html x64-windows/html/man3/EC_POINT_set_compressed_coordinates.html x64-windows/html/man3/EC_POINT_set_compressed_coordinates_GF2m.html x64-windows/html/man3/EC_POINT_set_compressed_coordinates_GFp.html x64-windows/html/man3/EC_POINT_set_to_infinity.html x64-windows/html/man3/EC_POINTs_make_affine.html x64-windows/html/man3/EC_POINTs_mul.html x64-windows/html/man3/EC_get_builtin_curves.html x64-windows/html/man3/EDIPARTYNAME_free.html x64-windows/html/man3/EDIPARTYNAME_new.html x64-windows/html/man3/ENGINE_add.html x64-windows/html/man3/ENGINE_add_conf_module.html x64-windows/html/man3/ENGINE_by_id.html x64-windows/html/man3/ENGINE_cleanup.html x64-windows/html/man3/ENGINE_cmd_is_executable.html x64-windows/html/man3/ENGINE_ctrl.html x64-windows/html/man3/ENGINE_ctrl_cmd.html x64-windows/html/man3/ENGINE_ctrl_cmd_string.html x64-windows/html/man3/ENGINE_finish.html x64-windows/html/man3/ENGINE_free.html x64-windows/html/man3/ENGINE_get_DH.html x64-windows/html/man3/ENGINE_get_DSA.html x64-windows/html/man3/ENGINE_get_RAND.html x64-windows/html/man3/ENGINE_get_RSA.html x64-windows/html/man3/ENGINE_get_cipher.html x64-windows/html/man3/ENGINE_get_cipher_engine.html x64-windows/html/man3/ENGINE_get_ciphers.html x64-windows/html/man3/ENGINE_get_cmd_defns.html x64-windows/html/man3/ENGINE_get_ctrl_function.html x64-windows/html/man3/ENGINE_get_default_DH.html x64-windows/html/man3/ENGINE_get_default_DSA.html x64-windows/html/man3/ENGINE_get_default_RAND.html x64-windows/html/man3/ENGINE_get_default_RSA.html x64-windows/html/man3/ENGINE_get_destroy_function.html x64-windows/html/man3/ENGINE_get_digest.html x64-windows/html/man3/ENGINE_get_digest_engine.html x64-windows/html/man3/ENGINE_get_digests.html x64-windows/html/man3/ENGINE_get_ex_data.html x64-windows/html/man3/ENGINE_get_ex_new_index.html x64-windows/html/man3/ENGINE_get_finish_function.html x64-windows/html/man3/ENGINE_get_first.html x64-windows/html/man3/ENGINE_get_flags.html x64-windows/html/man3/ENGINE_get_id.html x64-windows/html/man3/ENGINE_get_init_function.html x64-windows/html/man3/ENGINE_get_last.html x64-windows/html/man3/ENGINE_get_load_privkey_function.html x64-windows/html/man3/ENGINE_get_load_pubkey_function.html x64-windows/html/man3/ENGINE_get_name.html x64-windows/html/man3/ENGINE_get_next.html x64-windows/html/man3/ENGINE_get_prev.html x64-windows/html/man3/ENGINE_get_table_flags.html x64-windows/html/man3/ENGINE_init.html x64-windows/html/man3/ENGINE_load_builtin_engines.html x64-windows/html/man3/ENGINE_load_private_key.html x64-windows/html/man3/ENGINE_load_public_key.html x64-windows/html/man3/ENGINE_new.html x64-windows/html/man3/ENGINE_register_DH.html x64-windows/html/man3/ENGINE_register_DSA.html x64-windows/html/man3/ENGINE_register_RAND.html x64-windows/html/man3/ENGINE_register_RSA.html x64-windows/html/man3/ENGINE_register_all_DH.html x64-windows/html/man3/ENGINE_register_all_DSA.html x64-windows/html/man3/ENGINE_register_all_RAND.html x64-windows/html/man3/ENGINE_register_all_RSA.html x64-windows/html/man3/ENGINE_register_all_ciphers.html x64-windows/html/man3/ENGINE_register_all_complete.html x64-windows/html/man3/ENGINE_register_all_digests.html x64-windows/html/man3/ENGINE_register_ciphers.html x64-windows/html/man3/ENGINE_register_complete.html x64-windows/html/man3/ENGINE_register_digests.html x64-windows/html/man3/ENGINE_remove.html x64-windows/html/man3/ENGINE_set_DH.html x64-windows/html/man3/ENGINE_set_DSA.html x64-windows/html/man3/ENGINE_set_RAND.html x64-windows/html/man3/ENGINE_set_RSA.html x64-windows/html/man3/ENGINE_set_ciphers.html x64-windows/html/man3/ENGINE_set_cmd_defns.html x64-windows/html/man3/ENGINE_set_ctrl_function.html x64-windows/html/man3/ENGINE_set_default.html x64-windows/html/man3/ENGINE_set_default_DH.html x64-windows/html/man3/ENGINE_set_default_DSA.html x64-windows/html/man3/ENGINE_set_default_RAND.html x64-windows/html/man3/ENGINE_set_default_RSA.html x64-windows/html/man3/ENGINE_set_default_ciphers.html x64-windows/html/man3/ENGINE_set_default_digests.html x64-windows/html/man3/ENGINE_set_default_string.html x64-windows/html/man3/ENGINE_set_destroy_function.html x64-windows/html/man3/ENGINE_set_digests.html x64-windows/html/man3/ENGINE_set_ex_data.html x64-windows/html/man3/ENGINE_set_finish_function.html x64-windows/html/man3/ENGINE_set_flags.html x64-windows/html/man3/ENGINE_set_id.html x64-windows/html/man3/ENGINE_set_init_function.html x64-windows/html/man3/ENGINE_set_load_privkey_function.html x64-windows/html/man3/ENGINE_set_load_pubkey_function.html x64-windows/html/man3/ENGINE_set_name.html x64-windows/html/man3/ENGINE_set_table_flags.html x64-windows/html/man3/ENGINE_unregister_DH.html x64-windows/html/man3/ENGINE_unregister_DSA.html x64-windows/html/man3/ENGINE_unregister_RAND.html x64-windows/html/man3/ENGINE_unregister_RSA.html x64-windows/html/man3/ENGINE_unregister_ciphers.html x64-windows/html/man3/ENGINE_unregister_digests.html x64-windows/html/man3/ENGINE_up_ref.html x64-windows/html/man3/ERR_FATAL_ERROR.html x64-windows/html/man3/ERR_GET_FUNC.html x64-windows/html/man3/ERR_GET_LIB.html x64-windows/html/man3/ERR_GET_REASON.html x64-windows/html/man3/ERR_PACK.html x64-windows/html/man3/ERR_add_error_data.html x64-windows/html/man3/ERR_add_error_vdata.html x64-windows/html/man3/ERR_clear_error.html x64-windows/html/man3/ERR_error_string.html x64-windows/html/man3/ERR_error_string_n.html x64-windows/html/man3/ERR_free_strings.html x64-windows/html/man3/ERR_func_error_string.html x64-windows/html/man3/ERR_get_error.html x64-windows/html/man3/ERR_get_error_line.html x64-windows/html/man3/ERR_get_error_line_data.html x64-windows/html/man3/ERR_get_next_error_library.html x64-windows/html/man3/ERR_lib_error_string.html x64-windows/html/man3/ERR_load_crypto_strings.html x64-windows/html/man3/ERR_load_strings.html x64-windows/html/man3/ERR_peek_error.html x64-windows/html/man3/ERR_peek_error_line.html x64-windows/html/man3/ERR_peek_error_line_data.html x64-windows/html/man3/ERR_peek_last_error.html x64-windows/html/man3/ERR_peek_last_error_line.html x64-windows/html/man3/ERR_peek_last_error_line_data.html x64-windows/html/man3/ERR_pop_to_mark.html x64-windows/html/man3/ERR_print_errors.html x64-windows/html/man3/ERR_print_errors_cb.html x64-windows/html/man3/ERR_print_errors_fp.html x64-windows/html/man3/ERR_put_error.html x64-windows/html/man3/ERR_reason_error_string.html x64-windows/html/man3/ERR_remove_state.html x64-windows/html/man3/ERR_remove_thread_state.html x64-windows/html/man3/ERR_set_mark.html x64-windows/html/man3/ESS_CERT_ID_dup.html x64-windows/html/man3/ESS_CERT_ID_free.html x64-windows/html/man3/ESS_CERT_ID_new.html x64-windows/html/man3/ESS_ISSUER_SERIAL_dup.html x64-windows/html/man3/ESS_ISSUER_SERIAL_free.html x64-windows/html/man3/ESS_ISSUER_SERIAL_new.html x64-windows/html/man3/ESS_SIGNING_CERT_dup.html x64-windows/html/man3/ESS_SIGNING_CERT_free.html x64-windows/html/man3/ESS_SIGNING_CERT_new.html x64-windows/html/man3/EVP_BytesToKey.html x64-windows/html/man3/EVP_CIPHER_CTX_block_size.html x64-windows/html/man3/EVP_CIPHER_CTX_cipher.html x64-windows/html/man3/EVP_CIPHER_CTX_ctrl.html x64-windows/html/man3/EVP_CIPHER_CTX_flags.html x64-windows/html/man3/EVP_CIPHER_CTX_free.html x64-windows/html/man3/EVP_CIPHER_CTX_get_app_data.html x64-windows/html/man3/EVP_CIPHER_CTX_get_cipher_data.html x64-windows/html/man3/EVP_CIPHER_CTX_iv_length.html x64-windows/html/man3/EVP_CIPHER_CTX_key_length.html x64-windows/html/man3/EVP_CIPHER_CTX_mode.html x64-windows/html/man3/EVP_CIPHER_CTX_new.html x64-windows/html/man3/EVP_CIPHER_CTX_nid.html x64-windows/html/man3/EVP_CIPHER_CTX_reset.html x64-windows/html/man3/EVP_CIPHER_CTX_set_app_data.html x64-windows/html/man3/EVP_CIPHER_CTX_set_cipher_data.html x64-windows/html/man3/EVP_CIPHER_CTX_set_key_length.html x64-windows/html/man3/EVP_CIPHER_CTX_set_padding.html x64-windows/html/man3/EVP_CIPHER_CTX_type.html x64-windows/html/man3/EVP_CIPHER_asn1_to_param.html x64-windows/html/man3/EVP_CIPHER_block_size.html x64-windows/html/man3/EVP_CIPHER_flags.html x64-windows/html/man3/EVP_CIPHER_iv_length.html x64-windows/html/man3/EVP_CIPHER_key_length.html x64-windows/html/man3/EVP_CIPHER_meth_dup.html x64-windows/html/man3/EVP_CIPHER_meth_free.html x64-windows/html/man3/EVP_CIPHER_meth_get_cleanup.html x64-windows/html/man3/EVP_CIPHER_meth_get_ctrl.html x64-windows/html/man3/EVP_CIPHER_meth_get_do_cipher.html x64-windows/html/man3/EVP_CIPHER_meth_get_get_asn1_params.html x64-windows/html/man3/EVP_CIPHER_meth_get_init.html x64-windows/html/man3/EVP_CIPHER_meth_get_set_asn1_params.html x64-windows/html/man3/EVP_CIPHER_meth_new.html x64-windows/html/man3/EVP_CIPHER_meth_set_cleanup.html x64-windows/html/man3/EVP_CIPHER_meth_set_ctrl.html x64-windows/html/man3/EVP_CIPHER_meth_set_do_cipher.html x64-windows/html/man3/EVP_CIPHER_meth_set_flags.html x64-windows/html/man3/EVP_CIPHER_meth_set_get_asn1_params.html x64-windows/html/man3/EVP_CIPHER_meth_set_impl_ctx_size.html x64-windows/html/man3/EVP_CIPHER_meth_set_init.html x64-windows/html/man3/EVP_CIPHER_meth_set_iv_length.html x64-windows/html/man3/EVP_CIPHER_meth_set_set_asn1_params.html x64-windows/html/man3/EVP_CIPHER_mode.html x64-windows/html/man3/EVP_CIPHER_nid.html x64-windows/html/man3/EVP_CIPHER_param_to_asn1.html x64-windows/html/man3/EVP_CIPHER_type.html x64-windows/html/man3/EVP_CipherFinal.html x64-windows/html/man3/EVP_CipherFinal_ex.html x64-windows/html/man3/EVP_CipherInit.html x64-windows/html/man3/EVP_CipherInit_ex.html x64-windows/html/man3/EVP_CipherUpdate.html x64-windows/html/man3/EVP_DecodeBlock.html x64-windows/html/man3/EVP_DecodeFinal.html x64-windows/html/man3/EVP_DecodeInit.html x64-windows/html/man3/EVP_DecodeUpdate.html x64-windows/html/man3/EVP_DecryptFinal.html x64-windows/html/man3/EVP_DecryptFinal_ex.html x64-windows/html/man3/EVP_DecryptInit.html x64-windows/html/man3/EVP_DecryptInit_ex.html x64-windows/html/man3/EVP_DecryptUpdate.html x64-windows/html/man3/EVP_DigestFinal.html x64-windows/html/man3/EVP_DigestFinalXOF.html x64-windows/html/man3/EVP_DigestFinal_ex.html x64-windows/html/man3/EVP_DigestInit.html x64-windows/html/man3/EVP_DigestInit_ex.html x64-windows/html/man3/EVP_DigestSign.html x64-windows/html/man3/EVP_DigestSignFinal.html x64-windows/html/man3/EVP_DigestSignInit.html x64-windows/html/man3/EVP_DigestSignUpdate.html x64-windows/html/man3/EVP_DigestUpdate.html x64-windows/html/man3/EVP_DigestVerify.html x64-windows/html/man3/EVP_DigestVerifyFinal.html x64-windows/html/man3/EVP_DigestVerifyInit.html x64-windows/html/man3/EVP_DigestVerifyUpdate.html x64-windows/html/man3/EVP_ENCODE_CTX_copy.html x64-windows/html/man3/EVP_ENCODE_CTX_free.html x64-windows/html/man3/EVP_ENCODE_CTX_new.html x64-windows/html/man3/EVP_ENCODE_CTX_num.html x64-windows/html/man3/EVP_EncodeBlock.html x64-windows/html/man3/EVP_EncodeFinal.html x64-windows/html/man3/EVP_EncodeInit.html x64-windows/html/man3/EVP_EncodeUpdate.html x64-windows/html/man3/EVP_EncryptFinal.html x64-windows/html/man3/EVP_EncryptFinal_ex.html x64-windows/html/man3/EVP_EncryptInit.html x64-windows/html/man3/EVP_EncryptInit_ex.html x64-windows/html/man3/EVP_EncryptUpdate.html x64-windows/html/man3/EVP_MD_CTX_block_size.html x64-windows/html/man3/EVP_MD_CTX_clear_flags.html x64-windows/html/man3/EVP_MD_CTX_copy.html x64-windows/html/man3/EVP_MD_CTX_copy_ex.html x64-windows/html/man3/EVP_MD_CTX_ctrl.html x64-windows/html/man3/EVP_MD_CTX_free.html x64-windows/html/man3/EVP_MD_CTX_md.html x64-windows/html/man3/EVP_MD_CTX_md_data.html x64-windows/html/man3/EVP_MD_CTX_new.html x64-windows/html/man3/EVP_MD_CTX_reset.html x64-windows/html/man3/EVP_MD_CTX_set_flags.html x64-windows/html/man3/EVP_MD_CTX_set_pkey_ctx.html x64-windows/html/man3/EVP_MD_CTX_size.html x64-windows/html/man3/EVP_MD_CTX_test_flags.html x64-windows/html/man3/EVP_MD_CTX_type.html x64-windows/html/man3/EVP_MD_block_size.html x64-windows/html/man3/EVP_MD_meth_dup.html x64-windows/html/man3/EVP_MD_meth_free.html x64-windows/html/man3/EVP_MD_meth_get_app_datasize.html x64-windows/html/man3/EVP_MD_meth_get_cleanup.html x64-windows/html/man3/EVP_MD_meth_get_copy.html x64-windows/html/man3/EVP_MD_meth_get_ctrl.html x64-windows/html/man3/EVP_MD_meth_get_final.html x64-windows/html/man3/EVP_MD_meth_get_flags.html x64-windows/html/man3/EVP_MD_meth_get_init.html x64-windows/html/man3/EVP_MD_meth_get_input_blocksize.html x64-windows/html/man3/EVP_MD_meth_get_result_size.html x64-windows/html/man3/EVP_MD_meth_get_update.html x64-windows/html/man3/EVP_MD_meth_new.html x64-windows/html/man3/EVP_MD_meth_set_app_datasize.html x64-windows/html/man3/EVP_MD_meth_set_cleanup.html x64-windows/html/man3/EVP_MD_meth_set_copy.html x64-windows/html/man3/EVP_MD_meth_set_ctrl.html x64-windows/html/man3/EVP_MD_meth_set_final.html x64-windows/html/man3/EVP_MD_meth_set_flags.html x64-windows/html/man3/EVP_MD_meth_set_init.html x64-windows/html/man3/EVP_MD_meth_set_input_blocksize.html x64-windows/html/man3/EVP_MD_meth_set_result_size.html x64-windows/html/man3/EVP_MD_meth_set_update.html x64-windows/html/man3/EVP_MD_pkey_type.html x64-windows/html/man3/EVP_MD_size.html x64-windows/html/man3/EVP_MD_type.html x64-windows/html/man3/EVP_OpenFinal.html x64-windows/html/man3/EVP_OpenInit.html x64-windows/html/man3/EVP_OpenUpdate.html x64-windows/html/man3/EVP_PKEY_ASN1_METHOD.html x64-windows/html/man3/EVP_PKEY_CTX_add1_hkdf_info.html x64-windows/html/man3/EVP_PKEY_CTX_add1_tls1_prf_seed.html x64-windows/html/man3/EVP_PKEY_CTX_ctrl.html x64-windows/html/man3/EVP_PKEY_CTX_ctrl_str.html x64-windows/html/man3/EVP_PKEY_CTX_ctrl_uint64.html x64-windows/html/man3/EVP_PKEY_CTX_dup.html x64-windows/html/man3/EVP_PKEY_CTX_free.html x64-windows/html/man3/EVP_PKEY_CTX_get0_dh_kdf_oid.html x64-windows/html/man3/EVP_PKEY_CTX_get0_dh_kdf_ukm.html x64-windows/html/man3/EVP_PKEY_CTX_get0_ecdh_kdf_ukm.html x64-windows/html/man3/EVP_PKEY_CTX_get0_rsa_oaep_label.html x64-windows/html/man3/EVP_PKEY_CTX_get1_id.html x64-windows/html/man3/EVP_PKEY_CTX_get1_id_len.html x64-windows/html/man3/EVP_PKEY_CTX_get_app_data.html x64-windows/html/man3/EVP_PKEY_CTX_get_cb.html x64-windows/html/man3/EVP_PKEY_CTX_get_dh_kdf_md.html x64-windows/html/man3/EVP_PKEY_CTX_get_dh_kdf_outlen.html x64-windows/html/man3/EVP_PKEY_CTX_get_dh_kdf_type.html x64-windows/html/man3/EVP_PKEY_CTX_get_ecdh_cofactor_mode.html x64-windows/html/man3/EVP_PKEY_CTX_get_ecdh_kdf_md.html x64-windows/html/man3/EVP_PKEY_CTX_get_ecdh_kdf_outlen.html x64-windows/html/man3/EVP_PKEY_CTX_get_ecdh_kdf_type.html x64-windows/html/man3/EVP_PKEY_CTX_get_keygen_info.html x64-windows/html/man3/EVP_PKEY_CTX_get_rsa_mgf1_md.html x64-windows/html/man3/EVP_PKEY_CTX_get_rsa_oaep_md.html x64-windows/html/man3/EVP_PKEY_CTX_get_rsa_padding.html x64-windows/html/man3/EVP_PKEY_CTX_get_rsa_pss_saltlen.html x64-windows/html/man3/EVP_PKEY_CTX_get_signature_md.html x64-windows/html/man3/EVP_PKEY_CTX_hkdf_mode.html x64-windows/html/man3/EVP_PKEY_CTX_md.html x64-windows/html/man3/EVP_PKEY_CTX_new.html x64-windows/html/man3/EVP_PKEY_CTX_new_id.html x64-windows/html/man3/EVP_PKEY_CTX_set0_dh_kdf_oid.html x64-windows/html/man3/EVP_PKEY_CTX_set0_dh_kdf_ukm.html x64-windows/html/man3/EVP_PKEY_CTX_set0_ecdh_kdf_ukm.html x64-windows/html/man3/EVP_PKEY_CTX_set0_rsa_oaep_label.html x64-windows/html/man3/EVP_PKEY_CTX_set1_hkdf_key.html x64-windows/html/man3/EVP_PKEY_CTX_set1_hkdf_salt.html x64-windows/html/man3/EVP_PKEY_CTX_set1_id.html x64-windows/html/man3/EVP_PKEY_CTX_set1_pbe_pass.html x64-windows/html/man3/EVP_PKEY_CTX_set1_scrypt_salt.html x64-windows/html/man3/EVP_PKEY_CTX_set1_tls1_prf_secret.html x64-windows/html/man3/EVP_PKEY_CTX_set_app_data.html x64-windows/html/man3/EVP_PKEY_CTX_set_cb.html x64-windows/html/man3/EVP_PKEY_CTX_set_dh_kdf_md.html x64-windows/html/man3/EVP_PKEY_CTX_set_dh_kdf_outlen.html x64-windows/html/man3/EVP_PKEY_CTX_set_dh_kdf_type.html x64-windows/html/man3/EVP_PKEY_CTX_set_dh_nid.html x64-windows/html/man3/EVP_PKEY_CTX_set_dh_pad.html x64-windows/html/man3/EVP_PKEY_CTX_set_dh_paramgen_generator.html x64-windows/html/man3/EVP_PKEY_CTX_set_dh_paramgen_prime_len.html x64-windows/html/man3/EVP_PKEY_CTX_set_dh_paramgen_subprime_len.html x64-windows/html/man3/EVP_PKEY_CTX_set_dh_paramgen_type.html x64-windows/html/man3/EVP_PKEY_CTX_set_dh_rfc5114.html x64-windows/html/man3/EVP_PKEY_CTX_set_dhx_rfc5114.html x64-windows/html/man3/EVP_PKEY_CTX_set_dsa_paramgen_bits.html x64-windows/html/man3/EVP_PKEY_CTX_set_ec_param_enc.html x64-windows/html/man3/EVP_PKEY_CTX_set_ec_paramgen_curve_nid.html x64-windows/html/man3/EVP_PKEY_CTX_set_ecdh_cofactor_mode.html x64-windows/html/man3/EVP_PKEY_CTX_set_ecdh_kdf_md.html x64-windows/html/man3/EVP_PKEY_CTX_set_ecdh_kdf_outlen.html x64-windows/html/man3/EVP_PKEY_CTX_set_ecdh_kdf_type.html x64-windows/html/man3/EVP_PKEY_CTX_set_hkdf_md.html x64-windows/html/man3/EVP_PKEY_CTX_set_mac_key.html x64-windows/html/man3/EVP_PKEY_CTX_set_rsa_keygen_bits.html x64-windows/html/man3/EVP_PKEY_CTX_set_rsa_keygen_primes.html x64-windows/html/man3/EVP_PKEY_CTX_set_rsa_keygen_pubexp.html x64-windows/html/man3/EVP_PKEY_CTX_set_rsa_mgf1_md.html x64-windows/html/man3/EVP_PKEY_CTX_set_rsa_oaep_md.html x64-windows/html/man3/EVP_PKEY_CTX_set_rsa_padding.html x64-windows/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.html x64-windows/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md.html x64-windows/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen.html x64-windows/html/man3/EVP_PKEY_CTX_set_rsa_pss_saltlen.html x64-windows/html/man3/EVP_PKEY_CTX_set_scrypt_N.html x64-windows/html/man3/EVP_PKEY_CTX_set_scrypt_maxmem_bytes.html x64-windows/html/man3/EVP_PKEY_CTX_set_scrypt_p.html x64-windows/html/man3/EVP_PKEY_CTX_set_scrypt_r.html x64-windows/html/man3/EVP_PKEY_CTX_set_signature_md.html x64-windows/html/man3/EVP_PKEY_CTX_set_tls1_prf_md.html x64-windows/html/man3/EVP_PKEY_METHOD.html x64-windows/html/man3/EVP_PKEY_asn1_add0.html x64-windows/html/man3/EVP_PKEY_asn1_add_alias.html x64-windows/html/man3/EVP_PKEY_asn1_copy.html x64-windows/html/man3/EVP_PKEY_asn1_find.html x64-windows/html/man3/EVP_PKEY_asn1_find_str.html x64-windows/html/man3/EVP_PKEY_asn1_free.html x64-windows/html/man3/EVP_PKEY_asn1_get0.html x64-windows/html/man3/EVP_PKEY_asn1_get0_info.html x64-windows/html/man3/EVP_PKEY_asn1_get_count.html x64-windows/html/man3/EVP_PKEY_asn1_new.html x64-windows/html/man3/EVP_PKEY_asn1_set_check.html x64-windows/html/man3/EVP_PKEY_asn1_set_ctrl.html x64-windows/html/man3/EVP_PKEY_asn1_set_free.html x64-windows/html/man3/EVP_PKEY_asn1_set_get_priv_key.html x64-windows/html/man3/EVP_PKEY_asn1_set_get_pub_key.html x64-windows/html/man3/EVP_PKEY_asn1_set_item.html x64-windows/html/man3/EVP_PKEY_asn1_set_param.html x64-windows/html/man3/EVP_PKEY_asn1_set_param_check.html x64-windows/html/man3/EVP_PKEY_asn1_set_private.html x64-windows/html/man3/EVP_PKEY_asn1_set_public.html x64-windows/html/man3/EVP_PKEY_asn1_set_public_check.html x64-windows/html/man3/EVP_PKEY_asn1_set_security_bits.html x64-windows/html/man3/EVP_PKEY_asn1_set_set_priv_key.html x64-windows/html/man3/EVP_PKEY_asn1_set_set_pub_key.html x64-windows/html/man3/EVP_PKEY_asn1_set_siginf.html x64-windows/html/man3/EVP_PKEY_assign_DH.html x64-windows/html/man3/EVP_PKEY_assign_DSA.html x64-windows/html/man3/EVP_PKEY_assign_EC_KEY.html x64-windows/html/man3/EVP_PKEY_assign_POLY1305.html x64-windows/html/man3/EVP_PKEY_assign_RSA.html x64-windows/html/man3/EVP_PKEY_assign_SIPHASH.html x64-windows/html/man3/EVP_PKEY_base_id.html x64-windows/html/man3/EVP_PKEY_check.html x64-windows/html/man3/EVP_PKEY_cmp.html x64-windows/html/man3/EVP_PKEY_cmp_parameters.html x64-windows/html/man3/EVP_PKEY_copy_parameters.html x64-windows/html/man3/EVP_PKEY_decrypt.html x64-windows/html/man3/EVP_PKEY_decrypt_init.html x64-windows/html/man3/EVP_PKEY_derive.html x64-windows/html/man3/EVP_PKEY_derive_init.html x64-windows/html/man3/EVP_PKEY_derive_set_peer.html x64-windows/html/man3/EVP_PKEY_encrypt.html x64-windows/html/man3/EVP_PKEY_encrypt_init.html x64-windows/html/man3/EVP_PKEY_free.html x64-windows/html/man3/EVP_PKEY_gen_cb.html x64-windows/html/man3/EVP_PKEY_get0_DH.html x64-windows/html/man3/EVP_PKEY_get0_DSA.html x64-windows/html/man3/EVP_PKEY_get0_EC_KEY.html x64-windows/html/man3/EVP_PKEY_get0_RSA.html x64-windows/html/man3/EVP_PKEY_get0_asn1.html x64-windows/html/man3/EVP_PKEY_get0_engine.html x64-windows/html/man3/EVP_PKEY_get0_hmac.html x64-windows/html/man3/EVP_PKEY_get0_poly1305.html x64-windows/html/man3/EVP_PKEY_get0_siphash.html x64-windows/html/man3/EVP_PKEY_get1_DH.html x64-windows/html/man3/EVP_PKEY_get1_DSA.html x64-windows/html/man3/EVP_PKEY_get1_EC_KEY.html x64-windows/html/man3/EVP_PKEY_get1_RSA.html x64-windows/html/man3/EVP_PKEY_get_default_digest_nid.html x64-windows/html/man3/EVP_PKEY_get_raw_private_key.html x64-windows/html/man3/EVP_PKEY_get_raw_public_key.html x64-windows/html/man3/EVP_PKEY_id.html x64-windows/html/man3/EVP_PKEY_keygen.html x64-windows/html/man3/EVP_PKEY_keygen_init.html x64-windows/html/man3/EVP_PKEY_meth_add0.html x64-windows/html/man3/EVP_PKEY_meth_copy.html x64-windows/html/man3/EVP_PKEY_meth_find.html x64-windows/html/man3/EVP_PKEY_meth_free.html x64-windows/html/man3/EVP_PKEY_meth_get0.html x64-windows/html/man3/EVP_PKEY_meth_get0_info.html x64-windows/html/man3/EVP_PKEY_meth_get_check.html x64-windows/html/man3/EVP_PKEY_meth_get_cleanup.html x64-windows/html/man3/EVP_PKEY_meth_get_copy.html x64-windows/html/man3/EVP_PKEY_meth_get_count.html x64-windows/html/man3/EVP_PKEY_meth_get_ctrl.html x64-windows/html/man3/EVP_PKEY_meth_get_decrypt.html x64-windows/html/man3/EVP_PKEY_meth_get_derive.html x64-windows/html/man3/EVP_PKEY_meth_get_digest_custom.html x64-windows/html/man3/EVP_PKEY_meth_get_encrypt.html x64-windows/html/man3/EVP_PKEY_meth_get_init.html x64-windows/html/man3/EVP_PKEY_meth_get_keygen.html x64-windows/html/man3/EVP_PKEY_meth_get_param_check.html x64-windows/html/man3/EVP_PKEY_meth_get_paramgen.html x64-windows/html/man3/EVP_PKEY_meth_get_public_check.html x64-windows/html/man3/EVP_PKEY_meth_get_sign.html x64-windows/html/man3/EVP_PKEY_meth_get_signctx.html x64-windows/html/man3/EVP_PKEY_meth_get_verify.html x64-windows/html/man3/EVP_PKEY_meth_get_verify_recover.html x64-windows/html/man3/EVP_PKEY_meth_get_verifyctx.html x64-windows/html/man3/EVP_PKEY_meth_new.html x64-windows/html/man3/EVP_PKEY_meth_remove.html x64-windows/html/man3/EVP_PKEY_meth_set_check.html x64-windows/html/man3/EVP_PKEY_meth_set_cleanup.html x64-windows/html/man3/EVP_PKEY_meth_set_copy.html x64-windows/html/man3/EVP_PKEY_meth_set_ctrl.html x64-windows/html/man3/EVP_PKEY_meth_set_decrypt.html x64-windows/html/man3/EVP_PKEY_meth_set_derive.html x64-windows/html/man3/EVP_PKEY_meth_set_digest_custom.html x64-windows/html/man3/EVP_PKEY_meth_set_encrypt.html x64-windows/html/man3/EVP_PKEY_meth_set_init.html x64-windows/html/man3/EVP_PKEY_meth_set_keygen.html x64-windows/html/man3/EVP_PKEY_meth_set_param_check.html x64-windows/html/man3/EVP_PKEY_meth_set_paramgen.html x64-windows/html/man3/EVP_PKEY_meth_set_public_check.html x64-windows/html/man3/EVP_PKEY_meth_set_sign.html x64-windows/html/man3/EVP_PKEY_meth_set_signctx.html x64-windows/html/man3/EVP_PKEY_meth_set_verify.html x64-windows/html/man3/EVP_PKEY_meth_set_verify_recover.html x64-windows/html/man3/EVP_PKEY_meth_set_verifyctx.html x64-windows/html/man3/EVP_PKEY_missing_parameters.html x64-windows/html/man3/EVP_PKEY_new.html x64-windows/html/man3/EVP_PKEY_new_CMAC_key.html x64-windows/html/man3/EVP_PKEY_new_mac_key.html x64-windows/html/man3/EVP_PKEY_new_raw_private_key.html x64-windows/html/man3/EVP_PKEY_new_raw_public_key.html x64-windows/html/man3/EVP_PKEY_param_check.html x64-windows/html/man3/EVP_PKEY_paramgen.html x64-windows/html/man3/EVP_PKEY_paramgen_init.html x64-windows/html/man3/EVP_PKEY_print_params.html x64-windows/html/man3/EVP_PKEY_print_private.html x64-windows/html/man3/EVP_PKEY_print_public.html x64-windows/html/man3/EVP_PKEY_public_check.html x64-windows/html/man3/EVP_PKEY_security_bits.html x64-windows/html/man3/EVP_PKEY_set1_DH.html x64-windows/html/man3/EVP_PKEY_set1_DSA.html x64-windows/html/man3/EVP_PKEY_set1_EC_KEY.html x64-windows/html/man3/EVP_PKEY_set1_RSA.html x64-windows/html/man3/EVP_PKEY_set1_engine.html x64-windows/html/man3/EVP_PKEY_set_alias_type.html x64-windows/html/man3/EVP_PKEY_sign.html x64-windows/html/man3/EVP_PKEY_sign_init.html x64-windows/html/man3/EVP_PKEY_size.html x64-windows/html/man3/EVP_PKEY_type.html x64-windows/html/man3/EVP_PKEY_up_ref.html x64-windows/html/man3/EVP_PKEY_verify.html x64-windows/html/man3/EVP_PKEY_verify_init.html x64-windows/html/man3/EVP_PKEY_verify_recover.html x64-windows/html/man3/EVP_PKEY_verify_recover_init.html x64-windows/html/man3/EVP_SealFinal.html x64-windows/html/man3/EVP_SealInit.html x64-windows/html/man3/EVP_SealUpdate.html x64-windows/html/man3/EVP_SignFinal.html x64-windows/html/man3/EVP_SignInit.html x64-windows/html/man3/EVP_SignInit_ex.html x64-windows/html/man3/EVP_SignUpdate.html x64-windows/html/man3/EVP_VerifyFinal.html x64-windows/html/man3/EVP_VerifyInit.html x64-windows/html/man3/EVP_VerifyInit_ex.html x64-windows/html/man3/EVP_VerifyUpdate.html x64-windows/html/man3/EVP_aes.html x64-windows/html/man3/EVP_aes_128_cbc.html x64-windows/html/man3/EVP_aes_128_cbc_hmac_sha1.html x64-windows/html/man3/EVP_aes_128_cbc_hmac_sha256.html x64-windows/html/man3/EVP_aes_128_ccm.html x64-windows/html/man3/EVP_aes_128_cfb.html x64-windows/html/man3/EVP_aes_128_cfb1.html x64-windows/html/man3/EVP_aes_128_cfb128.html x64-windows/html/man3/EVP_aes_128_cfb8.html x64-windows/html/man3/EVP_aes_128_ctr.html x64-windows/html/man3/EVP_aes_128_ecb.html x64-windows/html/man3/EVP_aes_128_gcm.html x64-windows/html/man3/EVP_aes_128_ocb.html x64-windows/html/man3/EVP_aes_128_ofb.html x64-windows/html/man3/EVP_aes_128_wrap.html x64-windows/html/man3/EVP_aes_128_wrap_pad.html x64-windows/html/man3/EVP_aes_128_xts.html x64-windows/html/man3/EVP_aes_192_cbc.html x64-windows/html/man3/EVP_aes_192_ccm.html x64-windows/html/man3/EVP_aes_192_cfb.html x64-windows/html/man3/EVP_aes_192_cfb1.html x64-windows/html/man3/EVP_aes_192_cfb128.html x64-windows/html/man3/EVP_aes_192_cfb8.html x64-windows/html/man3/EVP_aes_192_ctr.html x64-windows/html/man3/EVP_aes_192_ecb.html x64-windows/html/man3/EVP_aes_192_gcm.html x64-windows/html/man3/EVP_aes_192_ocb.html x64-windows/html/man3/EVP_aes_192_ofb.html x64-windows/html/man3/EVP_aes_192_wrap.html x64-windows/html/man3/EVP_aes_192_wrap_pad.html x64-windows/html/man3/EVP_aes_256_cbc.html x64-windows/html/man3/EVP_aes_256_cbc_hmac_sha1.html x64-windows/html/man3/EVP_aes_256_cbc_hmac_sha256.html x64-windows/html/man3/EVP_aes_256_ccm.html x64-windows/html/man3/EVP_aes_256_cfb.html x64-windows/html/man3/EVP_aes_256_cfb1.html x64-windows/html/man3/EVP_aes_256_cfb128.html x64-windows/html/man3/EVP_aes_256_cfb8.html x64-windows/html/man3/EVP_aes_256_ctr.html x64-windows/html/man3/EVP_aes_256_ecb.html x64-windows/html/man3/EVP_aes_256_gcm.html x64-windows/html/man3/EVP_aes_256_ocb.html x64-windows/html/man3/EVP_aes_256_ofb.html x64-windows/html/man3/EVP_aes_256_wrap.html x64-windows/html/man3/EVP_aes_256_wrap_pad.html x64-windows/html/man3/EVP_aes_256_xts.html x64-windows/html/man3/EVP_aria.html x64-windows/html/man3/EVP_aria_128_cbc.html x64-windows/html/man3/EVP_aria_128_ccm.html x64-windows/html/man3/EVP_aria_128_cfb.html x64-windows/html/man3/EVP_aria_128_cfb1.html x64-windows/html/man3/EVP_aria_128_cfb128.html x64-windows/html/man3/EVP_aria_128_cfb8.html x64-windows/html/man3/EVP_aria_128_ctr.html x64-windows/html/man3/EVP_aria_128_ecb.html x64-windows/html/man3/EVP_aria_128_gcm.html x64-windows/html/man3/EVP_aria_128_ofb.html x64-windows/html/man3/EVP_aria_192_cbc.html x64-windows/html/man3/EVP_aria_192_ccm.html x64-windows/html/man3/EVP_aria_192_cfb.html x64-windows/html/man3/EVP_aria_192_cfb1.html x64-windows/html/man3/EVP_aria_192_cfb128.html x64-windows/html/man3/EVP_aria_192_cfb8.html x64-windows/html/man3/EVP_aria_192_ctr.html x64-windows/html/man3/EVP_aria_192_ecb.html x64-windows/html/man3/EVP_aria_192_gcm.html x64-windows/html/man3/EVP_aria_192_ofb.html x64-windows/html/man3/EVP_aria_256_cbc.html x64-windows/html/man3/EVP_aria_256_ccm.html x64-windows/html/man3/EVP_aria_256_cfb.html x64-windows/html/man3/EVP_aria_256_cfb1.html x64-windows/html/man3/EVP_aria_256_cfb128.html x64-windows/html/man3/EVP_aria_256_cfb8.html x64-windows/html/man3/EVP_aria_256_ctr.html x64-windows/html/man3/EVP_aria_256_ecb.html x64-windows/html/man3/EVP_aria_256_gcm.html x64-windows/html/man3/EVP_aria_256_ofb.html x64-windows/html/man3/EVP_bf_cbc.html x64-windows/html/man3/EVP_bf_cfb.html x64-windows/html/man3/EVP_bf_cfb64.html x64-windows/html/man3/EVP_bf_ecb.html x64-windows/html/man3/EVP_bf_ofb.html x64-windows/html/man3/EVP_blake2b512.html x64-windows/html/man3/EVP_blake2s256.html x64-windows/html/man3/EVP_camellia.html x64-windows/html/man3/EVP_camellia_128_cbc.html x64-windows/html/man3/EVP_camellia_128_cfb.html x64-windows/html/man3/EVP_camellia_128_cfb1.html x64-windows/html/man3/EVP_camellia_128_cfb128.html x64-windows/html/man3/EVP_camellia_128_cfb8.html x64-windows/html/man3/EVP_camellia_128_ctr.html x64-windows/html/man3/EVP_camellia_128_ecb.html x64-windows/html/man3/EVP_camellia_128_ofb.html x64-windows/html/man3/EVP_camellia_192_cbc.html x64-windows/html/man3/EVP_camellia_192_cfb.html x64-windows/html/man3/EVP_camellia_192_cfb1.html x64-windows/html/man3/EVP_camellia_192_cfb128.html x64-windows/html/man3/EVP_camellia_192_cfb8.html x64-windows/html/man3/EVP_camellia_192_ctr.html x64-windows/html/man3/EVP_camellia_192_ecb.html x64-windows/html/man3/EVP_camellia_192_ofb.html x64-windows/html/man3/EVP_camellia_256_cbc.html x64-windows/html/man3/EVP_camellia_256_cfb.html x64-windows/html/man3/EVP_camellia_256_cfb1.html x64-windows/html/man3/EVP_camellia_256_cfb128.html x64-windows/html/man3/EVP_camellia_256_cfb8.html x64-windows/html/man3/EVP_camellia_256_ctr.html x64-windows/html/man3/EVP_camellia_256_ecb.html x64-windows/html/man3/EVP_camellia_256_ofb.html x64-windows/html/man3/EVP_cast5_cbc.html x64-windows/html/man3/EVP_cast5_cfb.html x64-windows/html/man3/EVP_cast5_cfb64.html x64-windows/html/man3/EVP_cast5_ecb.html x64-windows/html/man3/EVP_cast5_ofb.html x64-windows/html/man3/EVP_chacha20.html x64-windows/html/man3/EVP_chacha20_poly1305.html x64-windows/html/man3/EVP_cleanup.html x64-windows/html/man3/EVP_des.html x64-windows/html/man3/EVP_des_cbc.html x64-windows/html/man3/EVP_des_cfb.html x64-windows/html/man3/EVP_des_cfb1.html x64-windows/html/man3/EVP_des_cfb64.html x64-windows/html/man3/EVP_des_cfb8.html x64-windows/html/man3/EVP_des_ecb.html x64-windows/html/man3/EVP_des_ede.html x64-windows/html/man3/EVP_des_ede3.html x64-windows/html/man3/EVP_des_ede3_cbc.html x64-windows/html/man3/EVP_des_ede3_cfb.html x64-windows/html/man3/EVP_des_ede3_cfb1.html x64-windows/html/man3/EVP_des_ede3_cfb64.html x64-windows/html/man3/EVP_des_ede3_cfb8.html x64-windows/html/man3/EVP_des_ede3_ecb.html x64-windows/html/man3/EVP_des_ede3_ofb.html x64-windows/html/man3/EVP_des_ede3_wrap.html x64-windows/html/man3/EVP_des_ede_cbc.html x64-windows/html/man3/EVP_des_ede_cfb.html x64-windows/html/man3/EVP_des_ede_cfb64.html x64-windows/html/man3/EVP_des_ede_ecb.html x64-windows/html/man3/EVP_des_ede_ofb.html x64-windows/html/man3/EVP_des_ofb.html x64-windows/html/man3/EVP_desx_cbc.html x64-windows/html/man3/EVP_enc_null.html x64-windows/html/man3/EVP_get_cipherbyname.html x64-windows/html/man3/EVP_get_cipherbynid.html x64-windows/html/man3/EVP_get_cipherbyobj.html x64-windows/html/man3/EVP_get_digestbyname.html x64-windows/html/man3/EVP_get_digestbynid.html x64-windows/html/man3/EVP_get_digestbyobj.html x64-windows/html/man3/EVP_idea_cbc.html x64-windows/html/man3/EVP_idea_cfb.html x64-windows/html/man3/EVP_idea_cfb64.html x64-windows/html/man3/EVP_idea_ecb.html x64-windows/html/man3/EVP_idea_ofb.html x64-windows/html/man3/EVP_md2.html x64-windows/html/man3/EVP_md4.html x64-windows/html/man3/EVP_md5.html x64-windows/html/man3/EVP_md5_sha1.html x64-windows/html/man3/EVP_md_null.html x64-windows/html/man3/EVP_mdc2.html x64-windows/html/man3/EVP_rc2_40_cbc.html x64-windows/html/man3/EVP_rc2_64_cbc.html x64-windows/html/man3/EVP_rc2_cbc.html x64-windows/html/man3/EVP_rc2_cfb.html x64-windows/html/man3/EVP_rc2_cfb64.html x64-windows/html/man3/EVP_rc2_ecb.html x64-windows/html/man3/EVP_rc2_ofb.html x64-windows/html/man3/EVP_rc4.html x64-windows/html/man3/EVP_rc4_40.html x64-windows/html/man3/EVP_rc4_hmac_md5.html x64-windows/html/man3/EVP_rc5_32_12_16_cbc.html x64-windows/html/man3/EVP_rc5_32_12_16_cfb.html x64-windows/html/man3/EVP_rc5_32_12_16_cfb64.html x64-windows/html/man3/EVP_rc5_32_12_16_ecb.html x64-windows/html/man3/EVP_rc5_32_12_16_ofb.html x64-windows/html/man3/EVP_ripemd160.html x64-windows/html/man3/EVP_seed_cbc.html x64-windows/html/man3/EVP_seed_cfb.html x64-windows/html/man3/EVP_seed_cfb128.html x64-windows/html/man3/EVP_seed_ecb.html x64-windows/html/man3/EVP_seed_ofb.html x64-windows/html/man3/EVP_sha1.html x64-windows/html/man3/EVP_sha224.html x64-windows/html/man3/EVP_sha256.html x64-windows/html/man3/EVP_sha384.html x64-windows/html/man3/EVP_sha3_224.html x64-windows/html/man3/EVP_sha3_256.html x64-windows/html/man3/EVP_sha3_384.html x64-windows/html/man3/EVP_sha3_512.html x64-windows/html/man3/EVP_sha512.html x64-windows/html/man3/EVP_sha512_224.html x64-windows/html/man3/EVP_sha512_256.html x64-windows/html/man3/EVP_shake128.html x64-windows/html/man3/EVP_shake256.html x64-windows/html/man3/EVP_sm3.html x64-windows/html/man3/EVP_sm4_cbc.html x64-windows/html/man3/EVP_sm4_cfb.html x64-windows/html/man3/EVP_sm4_cfb128.html x64-windows/html/man3/EVP_sm4_ctr.html x64-windows/html/man3/EVP_sm4_ecb.html x64-windows/html/man3/EVP_sm4_ofb.html x64-windows/html/man3/EVP_whirlpool.html x64-windows/html/man3/EXTENDED_KEY_USAGE_free.html x64-windows/html/man3/EXTENDED_KEY_USAGE_new.html x64-windows/html/man3/GENERAL_NAMES_free.html x64-windows/html/man3/GENERAL_NAMES_new.html x64-windows/html/man3/GENERAL_NAME_dup.html x64-windows/html/man3/GENERAL_NAME_free.html x64-windows/html/man3/GENERAL_NAME_new.html x64-windows/html/man3/GENERAL_SUBTREE_free.html x64-windows/html/man3/GENERAL_SUBTREE_new.html x64-windows/html/man3/GEN_SESSION_CB.html x64-windows/html/man3/HMAC.html x64-windows/html/man3/HMAC_CTX_copy.html x64-windows/html/man3/HMAC_CTX_free.html x64-windows/html/man3/HMAC_CTX_get_md.html x64-windows/html/man3/HMAC_CTX_new.html x64-windows/html/man3/HMAC_CTX_reset.html x64-windows/html/man3/HMAC_CTX_set_flags.html x64-windows/html/man3/HMAC_Final.html x64-windows/html/man3/HMAC_Init.html x64-windows/html/man3/HMAC_Init_ex.html x64-windows/html/man3/HMAC_Update.html x64-windows/html/man3/HMAC_size.html x64-windows/html/man3/IMPLEMENT_ASN1_FUNCTIONS.html x64-windows/html/man3/IMPLEMENT_LHASH_COMP_FN.html x64-windows/html/man3/IMPLEMENT_LHASH_HASH_FN.html x64-windows/html/man3/IPAddressChoice_free.html x64-windows/html/man3/IPAddressChoice_new.html x64-windows/html/man3/IPAddressFamily_free.html x64-windows/html/man3/IPAddressFamily_new.html x64-windows/html/man3/IPAddressOrRange_free.html x64-windows/html/man3/IPAddressOrRange_new.html x64-windows/html/man3/IPAddressRange_free.html x64-windows/html/man3/IPAddressRange_new.html x64-windows/html/man3/ISSUING_DIST_POINT_free.html x64-windows/html/man3/ISSUING_DIST_POINT_new.html x64-windows/html/man3/LHASH.html x64-windows/html/man3/LHASH_DOALL_ARG_FN_TYPE.html x64-windows/html/man3/MD2.html x64-windows/html/man3/MD2_Final.html x64-windows/html/man3/MD2_Init.html x64-windows/html/man3/MD2_Update.html x64-windows/html/man3/MD4.html x64-windows/html/man3/MD4_Final.html x64-windows/html/man3/MD4_Init.html x64-windows/html/man3/MD4_Update.html x64-windows/html/man3/MD5.html x64-windows/html/man3/MD5_Final.html x64-windows/html/man3/MD5_Init.html x64-windows/html/man3/MD5_Update.html x64-windows/html/man3/MDC2.html x64-windows/html/man3/MDC2_Final.html x64-windows/html/man3/MDC2_Init.html x64-windows/html/man3/MDC2_Update.html x64-windows/html/man3/NAME_CONSTRAINTS_free.html x64-windows/html/man3/NAME_CONSTRAINTS_new.html x64-windows/html/man3/NAMING_AUTHORITY.html x64-windows/html/man3/NAMING_AUTHORITY_free.html x64-windows/html/man3/NAMING_AUTHORITY_get0_authorityId.html x64-windows/html/man3/NAMING_AUTHORITY_get0_authorityText.html x64-windows/html/man3/NAMING_AUTHORITY_get0_authorityURL.html x64-windows/html/man3/NAMING_AUTHORITY_new.html x64-windows/html/man3/NAMING_AUTHORITY_set0_authorityId.html x64-windows/html/man3/NAMING_AUTHORITY_set0_authorityText.html x64-windows/html/man3/NAMING_AUTHORITY_set0_authorityURL.html x64-windows/html/man3/NETSCAPE_CERT_SEQUENCE_free.html x64-windows/html/man3/NETSCAPE_CERT_SEQUENCE_new.html x64-windows/html/man3/NETSCAPE_SPKAC_free.html x64-windows/html/man3/NETSCAPE_SPKAC_new.html x64-windows/html/man3/NETSCAPE_SPKI_free.html x64-windows/html/man3/NETSCAPE_SPKI_new.html x64-windows/html/man3/NOTICEREF_free.html x64-windows/html/man3/NOTICEREF_new.html x64-windows/html/man3/OBJ_cleanup.html x64-windows/html/man3/OBJ_cmp.html x64-windows/html/man3/OBJ_create.html x64-windows/html/man3/OBJ_dup.html x64-windows/html/man3/OBJ_get0_data.html x64-windows/html/man3/OBJ_length.html x64-windows/html/man3/OBJ_ln2nid.html x64-windows/html/man3/OBJ_nid2ln.html x64-windows/html/man3/OBJ_nid2obj.html x64-windows/html/man3/OBJ_nid2sn.html x64-windows/html/man3/OBJ_obj2nid.html x64-windows/html/man3/OBJ_obj2txt.html x64-windows/html/man3/OBJ_sn2nid.html x64-windows/html/man3/OBJ_txt2nid.html x64-windows/html/man3/OBJ_txt2obj.html x64-windows/html/man3/OCSP_BASICRESP_free.html x64-windows/html/man3/OCSP_BASICRESP_new.html x64-windows/html/man3/OCSP_CERTID_dup.html x64-windows/html/man3/OCSP_CERTID_free.html x64-windows/html/man3/OCSP_CERTID_new.html x64-windows/html/man3/OCSP_CERTSTATUS_free.html x64-windows/html/man3/OCSP_CERTSTATUS_new.html x64-windows/html/man3/OCSP_CRLID_free.html x64-windows/html/man3/OCSP_CRLID_new.html x64-windows/html/man3/OCSP_ONEREQ_free.html x64-windows/html/man3/OCSP_ONEREQ_new.html x64-windows/html/man3/OCSP_REQINFO_free.html x64-windows/html/man3/OCSP_REQINFO_new.html x64-windows/html/man3/OCSP_REQUEST_free.html x64-windows/html/man3/OCSP_REQUEST_new.html x64-windows/html/man3/OCSP_REQ_CTX_add1_header.html x64-windows/html/man3/OCSP_REQ_CTX_free.html x64-windows/html/man3/OCSP_REQ_CTX_set1_req.html x64-windows/html/man3/OCSP_RESPBYTES_free.html x64-windows/html/man3/OCSP_RESPBYTES_new.html x64-windows/html/man3/OCSP_RESPDATA_free.html x64-windows/html/man3/OCSP_RESPDATA_new.html x64-windows/html/man3/OCSP_RESPID_free.html x64-windows/html/man3/OCSP_RESPID_match.html x64-windows/html/man3/OCSP_RESPID_new.html x64-windows/html/man3/OCSP_RESPID_set_by_key.html x64-windows/html/man3/OCSP_RESPID_set_by_name.html x64-windows/html/man3/OCSP_RESPONSE_free.html x64-windows/html/man3/OCSP_RESPONSE_new.html x64-windows/html/man3/OCSP_REVOKEDINFO_free.html x64-windows/html/man3/OCSP_REVOKEDINFO_new.html x64-windows/html/man3/OCSP_SERVICELOC_free.html x64-windows/html/man3/OCSP_SERVICELOC_new.html x64-windows/html/man3/OCSP_SIGNATURE_free.html x64-windows/html/man3/OCSP_SIGNATURE_new.html x64-windows/html/man3/OCSP_SINGLERESP_free.html x64-windows/html/man3/OCSP_SINGLERESP_new.html x64-windows/html/man3/OCSP_basic_add1_nonce.html x64-windows/html/man3/OCSP_basic_sign.html x64-windows/html/man3/OCSP_basic_sign_ctx.html x64-windows/html/man3/OCSP_basic_verify.html x64-windows/html/man3/OCSP_cert_id_new.html x64-windows/html/man3/OCSP_cert_to_id.html x64-windows/html/man3/OCSP_check_nonce.html x64-windows/html/man3/OCSP_check_validity.html x64-windows/html/man3/OCSP_copy_nonce.html x64-windows/html/man3/OCSP_id_cmp.html x64-windows/html/man3/OCSP_id_get0_info.html x64-windows/html/man3/OCSP_id_issuer_cmp.html x64-windows/html/man3/OCSP_request_add0_id.html x64-windows/html/man3/OCSP_request_add1_cert.html x64-windows/html/man3/OCSP_request_add1_nonce.html x64-windows/html/man3/OCSP_request_onereq_count.html x64-windows/html/man3/OCSP_request_onereq_get0.html x64-windows/html/man3/OCSP_request_sign.html x64-windows/html/man3/OCSP_resp_count.html x64-windows/html/man3/OCSP_resp_find.html x64-windows/html/man3/OCSP_resp_find_status.html x64-windows/html/man3/OCSP_resp_get0.html x64-windows/html/man3/OCSP_resp_get0_certs.html x64-windows/html/man3/OCSP_resp_get0_id.html x64-windows/html/man3/OCSP_resp_get0_produced_at.html x64-windows/html/man3/OCSP_resp_get0_respdata.html x64-windows/html/man3/OCSP_resp_get0_signature.html x64-windows/html/man3/OCSP_resp_get0_signer.html x64-windows/html/man3/OCSP_resp_get0_tbs_sigalg.html x64-windows/html/man3/OCSP_resp_get1_id.html x64-windows/html/man3/OCSP_response_create.html x64-windows/html/man3/OCSP_response_get1_basic.html x64-windows/html/man3/OCSP_response_status.html x64-windows/html/man3/OCSP_sendreq_bio.html x64-windows/html/man3/OCSP_sendreq_nbio.html x64-windows/html/man3/OCSP_sendreq_new.html x64-windows/html/man3/OCSP_set_max_response_length.html x64-windows/html/man3/OCSP_single_get0_status.html x64-windows/html/man3/OPENSSL_Applink.html x64-windows/html/man3/OPENSSL_INIT_free.html x64-windows/html/man3/OPENSSL_INIT_new.html x64-windows/html/man3/OPENSSL_INIT_set_config_appname.html x64-windows/html/man3/OPENSSL_INIT_set_config_file_flags.html x64-windows/html/man3/OPENSSL_INIT_set_config_filename.html x64-windows/html/man3/OPENSSL_LH_COMPFUNC.html x64-windows/html/man3/OPENSSL_LH_DOALL_FUNC.html x64-windows/html/man3/OPENSSL_LH_HASHFUNC.html x64-windows/html/man3/OPENSSL_LH_node_stats.html x64-windows/html/man3/OPENSSL_LH_node_stats_bio.html x64-windows/html/man3/OPENSSL_LH_node_usage_stats.html x64-windows/html/man3/OPENSSL_LH_node_usage_stats_bio.html x64-windows/html/man3/OPENSSL_LH_stats.html x64-windows/html/man3/OPENSSL_LH_stats_bio.html x64-windows/html/man3/OPENSSL_MALLOC_FAILURES.html x64-windows/html/man3/OPENSSL_MALLOC_FD.html x64-windows/html/man3/OPENSSL_VERSION_NUMBER.html x64-windows/html/man3/OPENSSL_VERSION_TEXT.html x64-windows/html/man3/OPENSSL_atexit.html x64-windows/html/man3/OPENSSL_buf2hexstr.html x64-windows/html/man3/OPENSSL_cipher_name.html x64-windows/html/man3/OPENSSL_cleanse.html x64-windows/html/man3/OPENSSL_cleanup.html x64-windows/html/man3/OPENSSL_clear_free.html x64-windows/html/man3/OPENSSL_clear_realloc.html x64-windows/html/man3/OPENSSL_config.html x64-windows/html/man3/OPENSSL_fork_child.html x64-windows/html/man3/OPENSSL_fork_parent.html x64-windows/html/man3/OPENSSL_fork_prepare.html x64-windows/html/man3/OPENSSL_free.html x64-windows/html/man3/OPENSSL_hexchar2int.html x64-windows/html/man3/OPENSSL_hexstr2buf.html x64-windows/html/man3/OPENSSL_ia32cap.html x64-windows/html/man3/OPENSSL_init_crypto.html x64-windows/html/man3/OPENSSL_init_ssl.html x64-windows/html/man3/OPENSSL_instrument_bus.html x64-windows/html/man3/OPENSSL_instrument_bus2.html x64-windows/html/man3/OPENSSL_load_builtin_modules.html x64-windows/html/man3/OPENSSL_malloc.html x64-windows/html/man3/OPENSSL_malloc_init.html x64-windows/html/man3/OPENSSL_mem_debug_pop.html x64-windows/html/man3/OPENSSL_mem_debug_push.html x64-windows/html/man3/OPENSSL_memdup.html x64-windows/html/man3/OPENSSL_no_config.html x64-windows/html/man3/OPENSSL_realloc.html x64-windows/html/man3/OPENSSL_secure_actual_size.html x64-windows/html/man3/OPENSSL_secure_clear_free.html x64-windows/html/man3/OPENSSL_secure_free.html x64-windows/html/man3/OPENSSL_secure_malloc.html x64-windows/html/man3/OPENSSL_secure_zalloc.html x64-windows/html/man3/OPENSSL_strdup.html x64-windows/html/man3/OPENSSL_strlcat.html x64-windows/html/man3/OPENSSL_strlcpy.html x64-windows/html/man3/OPENSSL_strndup.html x64-windows/html/man3/OPENSSL_thread_stop.html x64-windows/html/man3/OPENSSL_zalloc.html x64-windows/html/man3/OSSL_STORE_CTX.html x64-windows/html/man3/OSSL_STORE_INFO.html x64-windows/html/man3/OSSL_STORE_INFO_free.html x64-windows/html/man3/OSSL_STORE_INFO_get0_CERT.html x64-windows/html/man3/OSSL_STORE_INFO_get0_CRL.html x64-windows/html/man3/OSSL_STORE_INFO_get0_NAME.html x64-windows/html/man3/OSSL_STORE_INFO_get0_NAME_description.html x64-windows/html/man3/OSSL_STORE_INFO_get0_PARAMS.html x64-windows/html/man3/OSSL_STORE_INFO_get0_PKEY.html x64-windows/html/man3/OSSL_STORE_INFO_get1_CERT.html x64-windows/html/man3/OSSL_STORE_INFO_get1_CRL.html x64-windows/html/man3/OSSL_STORE_INFO_get1_NAME.html x64-windows/html/man3/OSSL_STORE_INFO_get1_NAME_description.html x64-windows/html/man3/OSSL_STORE_INFO_get1_PARAMS.html x64-windows/html/man3/OSSL_STORE_INFO_get1_PKEY.html x64-windows/html/man3/OSSL_STORE_INFO_get_type.html x64-windows/html/man3/OSSL_STORE_INFO_new_CERT.html x64-windows/html/man3/OSSL_STORE_INFO_new_CRL.html x64-windows/html/man3/OSSL_STORE_INFO_new_NAME.html x64-windows/html/man3/OSSL_STORE_INFO_new_PARAMS.html x64-windows/html/man3/OSSL_STORE_INFO_new_PKEY.html x64-windows/html/man3/OSSL_STORE_INFO_set0_NAME_description.html x64-windows/html/man3/OSSL_STORE_INFO_type_string.html x64-windows/html/man3/OSSL_STORE_LOADER.html x64-windows/html/man3/OSSL_STORE_LOADER_CTX.html x64-windows/html/man3/OSSL_STORE_LOADER_free.html x64-windows/html/man3/OSSL_STORE_LOADER_get0_engine.html x64-windows/html/man3/OSSL_STORE_LOADER_get0_scheme.html x64-windows/html/man3/OSSL_STORE_LOADER_new.html x64-windows/html/man3/OSSL_STORE_LOADER_set_close.html x64-windows/html/man3/OSSL_STORE_LOADER_set_ctrl.html x64-windows/html/man3/OSSL_STORE_LOADER_set_eof.html x64-windows/html/man3/OSSL_STORE_LOADER_set_error.html x64-windows/html/man3/OSSL_STORE_LOADER_set_expect.html x64-windows/html/man3/OSSL_STORE_LOADER_set_find.html x64-windows/html/man3/OSSL_STORE_LOADER_set_load.html x64-windows/html/man3/OSSL_STORE_LOADER_set_open.html x64-windows/html/man3/OSSL_STORE_SEARCH.html x64-windows/html/man3/OSSL_STORE_SEARCH_by_alias.html x64-windows/html/man3/OSSL_STORE_SEARCH_by_issuer_serial.html x64-windows/html/man3/OSSL_STORE_SEARCH_by_key_fingerprint.html x64-windows/html/man3/OSSL_STORE_SEARCH_by_name.html x64-windows/html/man3/OSSL_STORE_SEARCH_free.html x64-windows/html/man3/OSSL_STORE_SEARCH_get0_bytes.html x64-windows/html/man3/OSSL_STORE_SEARCH_get0_digest.html x64-windows/html/man3/OSSL_STORE_SEARCH_get0_name.html x64-windows/html/man3/OSSL_STORE_SEARCH_get0_serial.html x64-windows/html/man3/OSSL_STORE_SEARCH_get0_string.html x64-windows/html/man3/OSSL_STORE_SEARCH_get_type.html x64-windows/html/man3/OSSL_STORE_close.html x64-windows/html/man3/OSSL_STORE_close_fn.html x64-windows/html/man3/OSSL_STORE_ctrl.html x64-windows/html/man3/OSSL_STORE_ctrl_fn.html x64-windows/html/man3/OSSL_STORE_eof.html x64-windows/html/man3/OSSL_STORE_eof_fn.html x64-windows/html/man3/OSSL_STORE_error.html x64-windows/html/man3/OSSL_STORE_error_fn.html x64-windows/html/man3/OSSL_STORE_expect.html x64-windows/html/man3/OSSL_STORE_expect_fn.html x64-windows/html/man3/OSSL_STORE_find.html x64-windows/html/man3/OSSL_STORE_find_fn.html x64-windows/html/man3/OSSL_STORE_load.html x64-windows/html/man3/OSSL_STORE_load_fn.html x64-windows/html/man3/OSSL_STORE_open.html x64-windows/html/man3/OSSL_STORE_open_fn.html x64-windows/html/man3/OSSL_STORE_post_process_info_fn.html x64-windows/html/man3/OSSL_STORE_register_loader.html x64-windows/html/man3/OSSL_STORE_supports_search.html x64-windows/html/man3/OSSL_STORE_unregister_loader.html x64-windows/html/man3/OTHERNAME_free.html x64-windows/html/man3/OTHERNAME_new.html x64-windows/html/man3/OpenSSL_add_all_algorithms.html x64-windows/html/man3/OpenSSL_add_all_ciphers.html x64-windows/html/man3/OpenSSL_add_all_digests.html x64-windows/html/man3/OpenSSL_add_ssl_algorithms.html x64-windows/html/man3/OpenSSL_version.html x64-windows/html/man3/OpenSSL_version_num.html x64-windows/html/man3/PBE2PARAM_free.html x64-windows/html/man3/PBE2PARAM_new.html x64-windows/html/man3/PBEPARAM_free.html x64-windows/html/man3/PBEPARAM_new.html x64-windows/html/man3/PBKDF2PARAM_free.html x64-windows/html/man3/PBKDF2PARAM_new.html x64-windows/html/man3/PEM_FLAG_EAY_COMPATIBLE.html x64-windows/html/man3/PEM_FLAG_ONLY_B64.html x64-windows/html/man3/PEM_FLAG_SECURE.html x64-windows/html/man3/PEM_bytes_read_bio.html x64-windows/html/man3/PEM_bytes_read_bio_secmem.html x64-windows/html/man3/PEM_do_header.html x64-windows/html/man3/PEM_get_EVP_CIPHER_INFO.html x64-windows/html/man3/PEM_read.html x64-windows/html/man3/PEM_read_CMS.html x64-windows/html/man3/PEM_read_DHparams.html x64-windows/html/man3/PEM_read_DSAPrivateKey.html x64-windows/html/man3/PEM_read_DSA_PUBKEY.html x64-windows/html/man3/PEM_read_DSAparams.html x64-windows/html/man3/PEM_read_ECPKParameters.html x64-windows/html/man3/PEM_read_ECPrivateKey.html x64-windows/html/man3/PEM_read_EC_PUBKEY.html x64-windows/html/man3/PEM_read_NETSCAPE_CERT_SEQUENCE.html x64-windows/html/man3/PEM_read_PKCS7.html x64-windows/html/man3/PEM_read_PKCS8.html x64-windows/html/man3/PEM_read_PKCS8_PRIV_KEY_INFO.html x64-windows/html/man3/PEM_read_PUBKEY.html x64-windows/html/man3/PEM_read_PrivateKey.html x64-windows/html/man3/PEM_read_RSAPrivateKey.html x64-windows/html/man3/PEM_read_RSAPublicKey.html x64-windows/html/man3/PEM_read_RSA_PUBKEY.html x64-windows/html/man3/PEM_read_SSL_SESSION.html x64-windows/html/man3/PEM_read_X509.html x64-windows/html/man3/PEM_read_X509_AUX.html x64-windows/html/man3/PEM_read_X509_CRL.html x64-windows/html/man3/PEM_read_X509_REQ.html x64-windows/html/man3/PEM_read_bio.html x64-windows/html/man3/PEM_read_bio_CMS.html x64-windows/html/man3/PEM_read_bio_DHparams.html x64-windows/html/man3/PEM_read_bio_DSAPrivateKey.html x64-windows/html/man3/PEM_read_bio_DSA_PUBKEY.html x64-windows/html/man3/PEM_read_bio_DSAparams.html x64-windows/html/man3/PEM_read_bio_ECPKParameters.html x64-windows/html/man3/PEM_read_bio_EC_PUBKEY.html x64-windows/html/man3/PEM_read_bio_NETSCAPE_CERT_SEQUENCE.html x64-windows/html/man3/PEM_read_bio_PKCS7.html x64-windows/html/man3/PEM_read_bio_PKCS8.html x64-windows/html/man3/PEM_read_bio_PKCS8_PRIV_KEY_INFO.html x64-windows/html/man3/PEM_read_bio_PUBKEY.html x64-windows/html/man3/PEM_read_bio_PrivateKey.html x64-windows/html/man3/PEM_read_bio_RSAPrivateKey.html x64-windows/html/man3/PEM_read_bio_RSAPublicKey.html x64-windows/html/man3/PEM_read_bio_RSA_PUBKEY.html x64-windows/html/man3/PEM_read_bio_SSL_SESSION.html x64-windows/html/man3/PEM_read_bio_X509.html x64-windows/html/man3/PEM_read_bio_X509_AUX.html x64-windows/html/man3/PEM_read_bio_X509_CRL.html x64-windows/html/man3/PEM_read_bio_X509_REQ.html x64-windows/html/man3/PEM_read_bio_ex.html x64-windows/html/man3/PEM_write.html x64-windows/html/man3/PEM_write_CMS.html x64-windows/html/man3/PEM_write_DHparams.html x64-windows/html/man3/PEM_write_DHxparams.html x64-windows/html/man3/PEM_write_DSAPrivateKey.html x64-windows/html/man3/PEM_write_DSA_PUBKEY.html x64-windows/html/man3/PEM_write_DSAparams.html x64-windows/html/man3/PEM_write_ECPKParameters.html x64-windows/html/man3/PEM_write_ECPrivateKey.html x64-windows/html/man3/PEM_write_EC_PUBKEY.html x64-windows/html/man3/PEM_write_NETSCAPE_CERT_SEQUENCE.html x64-windows/html/man3/PEM_write_PKCS7.html x64-windows/html/man3/PEM_write_PKCS8.html x64-windows/html/man3/PEM_write_PKCS8PrivateKey.html x64-windows/html/man3/PEM_write_PKCS8PrivateKey_nid.html x64-windows/html/man3/PEM_write_PKCS8_PRIV_KEY_INFO.html x64-windows/html/man3/PEM_write_PUBKEY.html x64-windows/html/man3/PEM_write_PrivateKey.html x64-windows/html/man3/PEM_write_RSAPrivateKey.html x64-windows/html/man3/PEM_write_RSAPublicKey.html x64-windows/html/man3/PEM_write_RSA_PUBKEY.html x64-windows/html/man3/PEM_write_SSL_SESSION.html x64-windows/html/man3/PEM_write_X509.html x64-windows/html/man3/PEM_write_X509_AUX.html x64-windows/html/man3/PEM_write_X509_CRL.html x64-windows/html/man3/PEM_write_X509_REQ.html x64-windows/html/man3/PEM_write_X509_REQ_NEW.html x64-windows/html/man3/PEM_write_bio.html x64-windows/html/man3/PEM_write_bio_CMS.html x64-windows/html/man3/PEM_write_bio_CMS_stream.html x64-windows/html/man3/PEM_write_bio_DHparams.html x64-windows/html/man3/PEM_write_bio_DHxparams.html x64-windows/html/man3/PEM_write_bio_DSAPrivateKey.html x64-windows/html/man3/PEM_write_bio_DSA_PUBKEY.html x64-windows/html/man3/PEM_write_bio_DSAparams.html x64-windows/html/man3/PEM_write_bio_ECPKParameters.html x64-windows/html/man3/PEM_write_bio_ECPrivateKey.html x64-windows/html/man3/PEM_write_bio_EC_PUBKEY.html x64-windows/html/man3/PEM_write_bio_NETSCAPE_CERT_SEQUENCE.html x64-windows/html/man3/PEM_write_bio_PKCS7.html x64-windows/html/man3/PEM_write_bio_PKCS7_stream.html x64-windows/html/man3/PEM_write_bio_PKCS8.html x64-windows/html/man3/PEM_write_bio_PKCS8PrivateKey.html x64-windows/html/man3/PEM_write_bio_PKCS8PrivateKey_nid.html x64-windows/html/man3/PEM_write_bio_PKCS8_PRIV_KEY_INFO.html x64-windows/html/man3/PEM_write_bio_PUBKEY.html x64-windows/html/man3/PEM_write_bio_PrivateKey.html x64-windows/html/man3/PEM_write_bio_PrivateKey_traditional.html x64-windows/html/man3/PEM_write_bio_RSAPrivateKey.html x64-windows/html/man3/PEM_write_bio_RSAPublicKey.html x64-windows/html/man3/PEM_write_bio_RSA_PUBKEY.html x64-windows/html/man3/PEM_write_bio_SSL_SESSION.html x64-windows/html/man3/PEM_write_bio_X509.html x64-windows/html/man3/PEM_write_bio_X509_AUX.html x64-windows/html/man3/PEM_write_bio_X509_CRL.html x64-windows/html/man3/PEM_write_bio_X509_REQ.html x64-windows/html/man3/PEM_write_bio_X509_REQ_NEW.html x64-windows/html/man3/PKCS12_BAGS_free.html x64-windows/html/man3/PKCS12_BAGS_new.html x64-windows/html/man3/PKCS12_MAC_DATA_free.html x64-windows/html/man3/PKCS12_MAC_DATA_new.html x64-windows/html/man3/PKCS12_SAFEBAG_free.html x64-windows/html/man3/PKCS12_SAFEBAG_new.html x64-windows/html/man3/PKCS12_create.html x64-windows/html/man3/PKCS12_free.html x64-windows/html/man3/PKCS12_new.html x64-windows/html/man3/PKCS12_newpass.html x64-windows/html/man3/PKCS12_parse.html x64-windows/html/man3/PKCS5_PBKDF2_HMAC.html x64-windows/html/man3/PKCS5_PBKDF2_HMAC_SHA1.html x64-windows/html/man3/PKCS7_DIGEST_free.html x64-windows/html/man3/PKCS7_DIGEST_new.html x64-windows/html/man3/PKCS7_ENCRYPT_free.html x64-windows/html/man3/PKCS7_ENCRYPT_new.html x64-windows/html/man3/PKCS7_ENC_CONTENT_free.html x64-windows/html/man3/PKCS7_ENC_CONTENT_new.html x64-windows/html/man3/PKCS7_ENVELOPE_free.html x64-windows/html/man3/PKCS7_ENVELOPE_new.html x64-windows/html/man3/PKCS7_ISSUER_AND_SERIAL_digest.html x64-windows/html/man3/PKCS7_ISSUER_AND_SERIAL_free.html x64-windows/html/man3/PKCS7_ISSUER_AND_SERIAL_new.html x64-windows/html/man3/PKCS7_RECIP_INFO_free.html x64-windows/html/man3/PKCS7_RECIP_INFO_new.html x64-windows/html/man3/PKCS7_SIGNED_free.html x64-windows/html/man3/PKCS7_SIGNED_new.html x64-windows/html/man3/PKCS7_SIGNER_INFO_free.html x64-windows/html/man3/PKCS7_SIGNER_INFO_new.html x64-windows/html/man3/PKCS7_SIGN_ENVELOPE_free.html x64-windows/html/man3/PKCS7_SIGN_ENVELOPE_new.html x64-windows/html/man3/PKCS7_decrypt.html x64-windows/html/man3/PKCS7_dup.html x64-windows/html/man3/PKCS7_encrypt.html x64-windows/html/man3/PKCS7_free.html x64-windows/html/man3/PKCS7_get0_signers.html x64-windows/html/man3/PKCS7_new.html x64-windows/html/man3/PKCS7_print_ctx.html x64-windows/html/man3/PKCS7_sign.html x64-windows/html/man3/PKCS7_sign_add_signer.html x64-windows/html/man3/PKCS7_verify.html x64-windows/html/man3/PKCS8_PRIV_KEY_INFO_free.html x64-windows/html/man3/PKCS8_PRIV_KEY_INFO_new.html x64-windows/html/man3/PKEY_USAGE_PERIOD_free.html x64-windows/html/man3/PKEY_USAGE_PERIOD_new.html x64-windows/html/man3/POLICYINFO_free.html x64-windows/html/man3/POLICYINFO_new.html x64-windows/html/man3/POLICYQUALINFO_free.html x64-windows/html/man3/POLICYQUALINFO_new.html x64-windows/html/man3/POLICY_CONSTRAINTS_free.html x64-windows/html/man3/POLICY_CONSTRAINTS_new.html x64-windows/html/man3/POLICY_MAPPING_free.html x64-windows/html/man3/POLICY_MAPPING_new.html x64-windows/html/man3/PROFESSION_INFO.html x64-windows/html/man3/PROFESSION_INFOS.html x64-windows/html/man3/PROFESSION_INFOS_free.html x64-windows/html/man3/PROFESSION_INFOS_new.html x64-windows/html/man3/PROFESSION_INFO_free.html x64-windows/html/man3/PROFESSION_INFO_get0_addProfessionInfo.html x64-windows/html/man3/PROFESSION_INFO_get0_namingAuthority.html x64-windows/html/man3/PROFESSION_INFO_get0_professionItems.html x64-windows/html/man3/PROFESSION_INFO_get0_professionOIDs.html x64-windows/html/man3/PROFESSION_INFO_get0_registrationNumber.html x64-windows/html/man3/PROFESSION_INFO_new.html x64-windows/html/man3/PROFESSION_INFO_set0_addProfessionInfo.html x64-windows/html/man3/PROFESSION_INFO_set0_namingAuthority.html x64-windows/html/man3/PROFESSION_INFO_set0_professionItems.html x64-windows/html/man3/PROFESSION_INFO_set0_professionOIDs.html x64-windows/html/man3/PROFESSION_INFO_set0_registrationNumber.html x64-windows/html/man3/PROXY_CERT_INFO_EXTENSION_free.html x64-windows/html/man3/PROXY_CERT_INFO_EXTENSION_new.html x64-windows/html/man3/PROXY_POLICY_free.html x64-windows/html/man3/PROXY_POLICY_new.html x64-windows/html/man3/RAND_DRBG_bytes.html x64-windows/html/man3/RAND_DRBG_cleanup_entropy_fn.html x64-windows/html/man3/RAND_DRBG_cleanup_nonce_fn.html x64-windows/html/man3/RAND_DRBG_free.html x64-windows/html/man3/RAND_DRBG_generate.html x64-windows/html/man3/RAND_DRBG_get0_master.html x64-windows/html/man3/RAND_DRBG_get0_private.html x64-windows/html/man3/RAND_DRBG_get0_public.html x64-windows/html/man3/RAND_DRBG_get_entropy_fn.html x64-windows/html/man3/RAND_DRBG_get_ex_data.html x64-windows/html/man3/RAND_DRBG_get_ex_new_index.html x64-windows/html/man3/RAND_DRBG_get_nonce_fn.html x64-windows/html/man3/RAND_DRBG_instantiate.html x64-windows/html/man3/RAND_DRBG_new.html x64-windows/html/man3/RAND_DRBG_reseed.html x64-windows/html/man3/RAND_DRBG_secure_new.html x64-windows/html/man3/RAND_DRBG_set.html x64-windows/html/man3/RAND_DRBG_set_callbacks.html x64-windows/html/man3/RAND_DRBG_set_defaults.html x64-windows/html/man3/RAND_DRBG_set_ex_data.html x64-windows/html/man3/RAND_DRBG_set_reseed_defaults.html x64-windows/html/man3/RAND_DRBG_set_reseed_interval.html x64-windows/html/man3/RAND_DRBG_set_reseed_time_interval.html x64-windows/html/man3/RAND_DRBG_uninstantiate.html x64-windows/html/man3/RAND_OpenSSL.html x64-windows/html/man3/RAND_add.html x64-windows/html/man3/RAND_bytes.html x64-windows/html/man3/RAND_cleanup.html x64-windows/html/man3/RAND_egd.html x64-windows/html/man3/RAND_egd_bytes.html x64-windows/html/man3/RAND_event.html x64-windows/html/man3/RAND_file_name.html x64-windows/html/man3/RAND_get_rand_method.html x64-windows/html/man3/RAND_keep_random_devices_open.html x64-windows/html/man3/RAND_load_file.html x64-windows/html/man3/RAND_poll.html x64-windows/html/man3/RAND_priv_bytes.html x64-windows/html/man3/RAND_pseudo_bytes.html x64-windows/html/man3/RAND_query_egd_bytes.html x64-windows/html/man3/RAND_screen.html x64-windows/html/man3/RAND_seed.html x64-windows/html/man3/RAND_set_rand_method.html x64-windows/html/man3/RAND_status.html x64-windows/html/man3/RAND_write_file.html x64-windows/html/man3/RC4.html x64-windows/html/man3/RC4_set_key.html x64-windows/html/man3/RIPEMD160.html x64-windows/html/man3/RIPEMD160_Final.html x64-windows/html/man3/RIPEMD160_Init.html x64-windows/html/man3/RIPEMD160_Update.html x64-windows/html/man3/RSAPrivateKey_dup.html x64-windows/html/man3/RSAPublicKey_dup.html x64-windows/html/man3/RSA_OAEP_PARAMS_free.html x64-windows/html/man3/RSA_OAEP_PARAMS_new.html x64-windows/html/man3/RSA_PKCS1_OpenSSL.html x64-windows/html/man3/RSA_PSS_PARAMS_free.html x64-windows/html/man3/RSA_PSS_PARAMS_new.html x64-windows/html/man3/RSA_bits.html x64-windows/html/man3/RSA_blinding_off.html x64-windows/html/man3/RSA_blinding_on.html x64-windows/html/man3/RSA_check_key.html x64-windows/html/man3/RSA_check_key_ex.html x64-windows/html/man3/RSA_clear_flags.html x64-windows/html/man3/RSA_flags.html x64-windows/html/man3/RSA_free.html x64-windows/html/man3/RSA_generate_key.html x64-windows/html/man3/RSA_generate_key_ex.html x64-windows/html/man3/RSA_generate_multi_prime_key.html x64-windows/html/man3/RSA_get0_crt_params.html x64-windows/html/man3/RSA_get0_d.html x64-windows/html/man3/RSA_get0_dmp1.html x64-windows/html/man3/RSA_get0_dmq1.html x64-windows/html/man3/RSA_get0_e.html x64-windows/html/man3/RSA_get0_engine.html x64-windows/html/man3/RSA_get0_factors.html x64-windows/html/man3/RSA_get0_iqmp.html x64-windows/html/man3/RSA_get0_key.html x64-windows/html/man3/RSA_get0_multi_prime_crt_params.html x64-windows/html/man3/RSA_get0_multi_prime_factors.html x64-windows/html/man3/RSA_get0_n.html x64-windows/html/man3/RSA_get0_p.html x64-windows/html/man3/RSA_get0_q.html x64-windows/html/man3/RSA_get_default_method.html x64-windows/html/man3/RSA_get_ex_data.html x64-windows/html/man3/RSA_get_ex_new_index.html x64-windows/html/man3/RSA_get_method.html x64-windows/html/man3/RSA_get_multi_prime_extra_count.html x64-windows/html/man3/RSA_get_version.html x64-windows/html/man3/RSA_meth_dup.html x64-windows/html/man3/RSA_meth_free.html x64-windows/html/man3/RSA_meth_get0_app_data.html x64-windows/html/man3/RSA_meth_get0_name.html x64-windows/html/man3/RSA_meth_get_bn_mod_exp.html x64-windows/html/man3/RSA_meth_get_finish.html x64-windows/html/man3/RSA_meth_get_flags.html x64-windows/html/man3/RSA_meth_get_init.html x64-windows/html/man3/RSA_meth_get_keygen.html x64-windows/html/man3/RSA_meth_get_mod_exp.html x64-windows/html/man3/RSA_meth_get_multi_prime_keygen.html x64-windows/html/man3/RSA_meth_get_priv_dec.html x64-windows/html/man3/RSA_meth_get_priv_enc.html x64-windows/html/man3/RSA_meth_get_pub_dec.html x64-windows/html/man3/RSA_meth_get_pub_enc.html x64-windows/html/man3/RSA_meth_get_sign.html x64-windows/html/man3/RSA_meth_get_verify.html x64-windows/html/man3/RSA_meth_new.html x64-windows/html/man3/RSA_meth_set0_app_data.html x64-windows/html/man3/RSA_meth_set1_name.html x64-windows/html/man3/RSA_meth_set_bn_mod_exp.html x64-windows/html/man3/RSA_meth_set_finish.html x64-windows/html/man3/RSA_meth_set_flags.html x64-windows/html/man3/RSA_meth_set_init.html x64-windows/html/man3/RSA_meth_set_keygen.html x64-windows/html/man3/RSA_meth_set_mod_exp.html x64-windows/html/man3/RSA_meth_set_multi_prime_keygen.html x64-windows/html/man3/RSA_meth_set_priv_dec.html x64-windows/html/man3/RSA_meth_set_priv_enc.html x64-windows/html/man3/RSA_meth_set_pub_dec.html x64-windows/html/man3/RSA_meth_set_pub_enc.html x64-windows/html/man3/RSA_meth_set_sign.html x64-windows/html/man3/RSA_meth_set_verify.html x64-windows/html/man3/RSA_new.html x64-windows/html/man3/RSA_new_method.html x64-windows/html/man3/RSA_padding_add_PKCS1_OAEP.html x64-windows/html/man3/RSA_padding_add_PKCS1_OAEP_mgf1.html x64-windows/html/man3/RSA_padding_add_PKCS1_type_1.html x64-windows/html/man3/RSA_padding_add_PKCS1_type_2.html x64-windows/html/man3/RSA_padding_add_SSLv23.html x64-windows/html/man3/RSA_padding_add_none.html x64-windows/html/man3/RSA_padding_check_PKCS1_OAEP.html x64-windows/html/man3/RSA_padding_check_PKCS1_OAEP_mgf1.html x64-windows/html/man3/RSA_padding_check_PKCS1_type_1.html x64-windows/html/man3/RSA_padding_check_PKCS1_type_2.html x64-windows/html/man3/RSA_padding_check_SSLv23.html x64-windows/html/man3/RSA_padding_check_none.html x64-windows/html/man3/RSA_print.html x64-windows/html/man3/RSA_print_fp.html x64-windows/html/man3/RSA_private_decrypt.html x64-windows/html/man3/RSA_private_encrypt.html x64-windows/html/man3/RSA_public_decrypt.html x64-windows/html/man3/RSA_public_encrypt.html x64-windows/html/man3/RSA_security_bits.html x64-windows/html/man3/RSA_set0_crt_params.html x64-windows/html/man3/RSA_set0_factors.html x64-windows/html/man3/RSA_set0_key.html x64-windows/html/man3/RSA_set0_multi_prime_params.html x64-windows/html/man3/RSA_set_default_method.html x64-windows/html/man3/RSA_set_ex_data.html x64-windows/html/man3/RSA_set_flags.html x64-windows/html/man3/RSA_set_method.html x64-windows/html/man3/RSA_sign.html x64-windows/html/man3/RSA_sign_ASN1_OCTET_STRING.html x64-windows/html/man3/RSA_size.html x64-windows/html/man3/RSA_test_flags.html x64-windows/html/man3/RSA_verify.html x64-windows/html/man3/RSA_verify_ASN1_OCTET_STRING.html x64-windows/html/man3/SCRYPT_PARAMS_free.html x64-windows/html/man3/SCRYPT_PARAMS_new.html x64-windows/html/man3/SCT_LIST_free.html x64-windows/html/man3/SCT_LIST_print.html x64-windows/html/man3/SCT_LIST_validate.html x64-windows/html/man3/SCT_free.html x64-windows/html/man3/SCT_get0_extensions.html x64-windows/html/man3/SCT_get0_log_id.html x64-windows/html/man3/SCT_get0_signature.html x64-windows/html/man3/SCT_get_log_entry_type.html x64-windows/html/man3/SCT_get_signature_nid.html x64-windows/html/man3/SCT_get_source.html x64-windows/html/man3/SCT_get_timestamp.html x64-windows/html/man3/SCT_get_validation_status.html x64-windows/html/man3/SCT_get_version.html x64-windows/html/man3/SCT_new.html x64-windows/html/man3/SCT_new_from_base64.html x64-windows/html/man3/SCT_print.html x64-windows/html/man3/SCT_set0_extensions.html x64-windows/html/man3/SCT_set0_log_id.html x64-windows/html/man3/SCT_set0_signature.html x64-windows/html/man3/SCT_set1_extensions.html x64-windows/html/man3/SCT_set1_log_id.html x64-windows/html/man3/SCT_set1_signature.html x64-windows/html/man3/SCT_set_log_entry_type.html x64-windows/html/man3/SCT_set_signature_nid.html x64-windows/html/man3/SCT_set_source.html x64-windows/html/man3/SCT_set_timestamp.html x64-windows/html/man3/SCT_set_version.html x64-windows/html/man3/SCT_validate.html x64-windows/html/man3/SCT_validation_status_string.html x64-windows/html/man3/SHA1.html x64-windows/html/man3/SHA1_Final.html x64-windows/html/man3/SHA1_Init.html x64-windows/html/man3/SHA1_Update.html x64-windows/html/man3/SHA224.html x64-windows/html/man3/SHA224_Final.html x64-windows/html/man3/SHA224_Init.html x64-windows/html/man3/SHA224_Update.html x64-windows/html/man3/SHA256.html x64-windows/html/man3/SHA256_Final.html x64-windows/html/man3/SHA256_Init.html x64-windows/html/man3/SHA256_Update.html x64-windows/html/man3/SHA384.html x64-windows/html/man3/SHA384_Final.html x64-windows/html/man3/SHA384_Init.html x64-windows/html/man3/SHA384_Update.html x64-windows/html/man3/SHA512.html x64-windows/html/man3/SHA512_Final.html x64-windows/html/man3/SHA512_Init.html x64-windows/html/man3/SHA512_Update.html x64-windows/html/man3/SMIME_read_CMS.html x64-windows/html/man3/SMIME_read_PKCS7.html x64-windows/html/man3/SMIME_write_CMS.html x64-windows/html/man3/SMIME_write_PKCS7.html x64-windows/html/man3/SSL_CIPHER_description.html x64-windows/html/man3/SSL_CIPHER_find.html x64-windows/html/man3/SSL_CIPHER_get_auth_nid.html x64-windows/html/man3/SSL_CIPHER_get_bits.html x64-windows/html/man3/SSL_CIPHER_get_cipher_nid.html x64-windows/html/man3/SSL_CIPHER_get_digest_nid.html x64-windows/html/man3/SSL_CIPHER_get_handshake_digest.html x64-windows/html/man3/SSL_CIPHER_get_id.html x64-windows/html/man3/SSL_CIPHER_get_kx_nid.html x64-windows/html/man3/SSL_CIPHER_get_name.html x64-windows/html/man3/SSL_CIPHER_get_protocol_id.html x64-windows/html/man3/SSL_CIPHER_get_version.html x64-windows/html/man3/SSL_CIPHER_is_aead.html x64-windows/html/man3/SSL_CIPHER_standard_name.html x64-windows/html/man3/SSL_COMP_add_compression_method.html x64-windows/html/man3/SSL_COMP_free_compression_methods.html x64-windows/html/man3/SSL_COMP_get0_name.html x64-windows/html/man3/SSL_COMP_get_compression_methods.html x64-windows/html/man3/SSL_COMP_get_id.html x64-windows/html/man3/SSL_CONF_CTX_clear_flags.html x64-windows/html/man3/SSL_CONF_CTX_free.html x64-windows/html/man3/SSL_CONF_CTX_new.html x64-windows/html/man3/SSL_CONF_CTX_set1_prefix.html x64-windows/html/man3/SSL_CONF_CTX_set_flags.html x64-windows/html/man3/SSL_CONF_CTX_set_ssl.html x64-windows/html/man3/SSL_CONF_CTX_set_ssl_ctx.html x64-windows/html/man3/SSL_CONF_cmd.html x64-windows/html/man3/SSL_CONF_cmd_argv.html x64-windows/html/man3/SSL_CONF_cmd_value_type.html x64-windows/html/man3/SSL_CTX_add0_chain_cert.html x64-windows/html/man3/SSL_CTX_add1_chain_cert.html x64-windows/html/man3/SSL_CTX_add1_to_CA_list.html x64-windows/html/man3/SSL_CTX_add_client_CA.html x64-windows/html/man3/SSL_CTX_add_client_custom_ext.html x64-windows/html/man3/SSL_CTX_add_custom_ext.html x64-windows/html/man3/SSL_CTX_add_extra_chain_cert.html x64-windows/html/man3/SSL_CTX_add_server_custom_ext.html x64-windows/html/man3/SSL_CTX_add_session.html x64-windows/html/man3/SSL_CTX_build_cert_chain.html x64-windows/html/man3/SSL_CTX_callback_ctrl.html x64-windows/html/man3/SSL_CTX_check_private_key.html x64-windows/html/man3/SSL_CTX_clear_chain_certs.html x64-windows/html/man3/SSL_CTX_clear_extra_chain_certs.html x64-windows/html/man3/SSL_CTX_clear_mode.html x64-windows/html/man3/SSL_CTX_clear_options.html x64-windows/html/man3/SSL_CTX_config.html x64-windows/html/man3/SSL_CTX_ct_is_enabled.html x64-windows/html/man3/SSL_CTX_ctrl.html x64-windows/html/man3/SSL_CTX_dane_clear_flags.html x64-windows/html/man3/SSL_CTX_dane_enable.html x64-windows/html/man3/SSL_CTX_dane_mtype_set.html x64-windows/html/man3/SSL_CTX_dane_set_flags.html x64-windows/html/man3/SSL_CTX_decrypt_session_ticket_fn.html x64-windows/html/man3/SSL_CTX_disable_ct.html x64-windows/html/man3/SSL_CTX_enable_ct.html x64-windows/html/man3/SSL_CTX_flush_sessions.html x64-windows/html/man3/SSL_CTX_free.html x64-windows/html/man3/SSL_CTX_generate_session_ticket_fn.html x64-windows/html/man3/SSL_CTX_get0_CA_list.html x64-windows/html/man3/SSL_CTX_get0_chain_certs.html x64-windows/html/man3/SSL_CTX_get0_param.html x64-windows/html/man3/SSL_CTX_get0_security_ex_data.html x64-windows/html/man3/SSL_CTX_get_cert_store.html x64-windows/html/man3/SSL_CTX_get_ciphers.html x64-windows/html/man3/SSL_CTX_get_client_CA_list.html x64-windows/html/man3/SSL_CTX_get_client_cert_cb.html x64-windows/html/man3/SSL_CTX_get_default_passwd_cb.html x64-windows/html/man3/SSL_CTX_get_default_passwd_cb_userdata.html x64-windows/html/man3/SSL_CTX_get_default_read_ahead.html x64-windows/html/man3/SSL_CTX_get_ex_data.html x64-windows/html/man3/SSL_CTX_get_info_callback.html x64-windows/html/man3/SSL_CTX_get_keylog_callback.html x64-windows/html/man3/SSL_CTX_get_max_cert_list.html x64-windows/html/man3/SSL_CTX_get_max_early_data.html x64-windows/html/man3/SSL_CTX_get_max_proto_version.html x64-windows/html/man3/SSL_CTX_get_min_proto_version.html x64-windows/html/man3/SSL_CTX_get_mode.html x64-windows/html/man3/SSL_CTX_get_num_tickets.html x64-windows/html/man3/SSL_CTX_get_options.html x64-windows/html/man3/SSL_CTX_get_quiet_shutdown.html x64-windows/html/man3/SSL_CTX_get_read_ahead.html x64-windows/html/man3/SSL_CTX_get_record_padding_callback_arg.html x64-windows/html/man3/SSL_CTX_get_recv_max_early_data.html x64-windows/html/man3/SSL_CTX_get_security_callback.html x64-windows/html/man3/SSL_CTX_get_security_level.html x64-windows/html/man3/SSL_CTX_get_session_cache_mode.html x64-windows/html/man3/SSL_CTX_get_timeout.html x64-windows/html/man3/SSL_CTX_get_tlsext_status_arg.html x64-windows/html/man3/SSL_CTX_get_tlsext_status_cb.html x64-windows/html/man3/SSL_CTX_get_tlsext_status_type.html x64-windows/html/man3/SSL_CTX_get_verify_callback.html x64-windows/html/man3/SSL_CTX_get_verify_depth.html x64-windows/html/man3/SSL_CTX_get_verify_mode.html x64-windows/html/man3/SSL_CTX_has_client_custom_ext.html x64-windows/html/man3/SSL_CTX_keylog_cb_func.html x64-windows/html/man3/SSL_CTX_load_verify_locations.html x64-windows/html/man3/SSL_CTX_new.html x64-windows/html/man3/SSL_CTX_remove_session.html x64-windows/html/man3/SSL_CTX_select_current_cert.html x64-windows/html/man3/SSL_CTX_sess_accept.html x64-windows/html/man3/SSL_CTX_sess_accept_good.html x64-windows/html/man3/SSL_CTX_sess_accept_renegotiate.html x64-windows/html/man3/SSL_CTX_sess_cache_full.html x64-windows/html/man3/SSL_CTX_sess_cb_hits.html x64-windows/html/man3/SSL_CTX_sess_connect.html x64-windows/html/man3/SSL_CTX_sess_connect_good.html x64-windows/html/man3/SSL_CTX_sess_connect_renegotiate.html x64-windows/html/man3/SSL_CTX_sess_get_cache_size.html x64-windows/html/man3/SSL_CTX_sess_get_get_cb.html x64-windows/html/man3/SSL_CTX_sess_get_new_cb.html x64-windows/html/man3/SSL_CTX_sess_get_remove_cb.html x64-windows/html/man3/SSL_CTX_sess_hits.html x64-windows/html/man3/SSL_CTX_sess_misses.html x64-windows/html/man3/SSL_CTX_sess_number.html x64-windows/html/man3/SSL_CTX_sess_set_cache_size.html x64-windows/html/man3/SSL_CTX_sess_set_get_cb.html x64-windows/html/man3/SSL_CTX_sess_set_new_cb.html x64-windows/html/man3/SSL_CTX_sess_set_remove_cb.html x64-windows/html/man3/SSL_CTX_sess_timeouts.html x64-windows/html/man3/SSL_CTX_sessions.html x64-windows/html/man3/SSL_CTX_set0_CA_list.html x64-windows/html/man3/SSL_CTX_set0_chain.html x64-windows/html/man3/SSL_CTX_set0_chain_cert_store.html x64-windows/html/man3/SSL_CTX_set0_security_ex_data.html x64-windows/html/man3/SSL_CTX_set0_verify_cert_store.html x64-windows/html/man3/SSL_CTX_set1_cert_store.html x64-windows/html/man3/SSL_CTX_set1_chain.html x64-windows/html/man3/SSL_CTX_set1_chain_cert_store.html x64-windows/html/man3/SSL_CTX_set1_client_sigalgs.html x64-windows/html/man3/SSL_CTX_set1_client_sigalgs_list.html x64-windows/html/man3/SSL_CTX_set1_curves.html x64-windows/html/man3/SSL_CTX_set1_curves_list.html x64-windows/html/man3/SSL_CTX_set1_groups.html x64-windows/html/man3/SSL_CTX_set1_groups_list.html x64-windows/html/man3/SSL_CTX_set1_param.html x64-windows/html/man3/SSL_CTX_set1_sigalgs.html x64-windows/html/man3/SSL_CTX_set1_sigalgs_list.html x64-windows/html/man3/SSL_CTX_set1_verify_cert_store.html x64-windows/html/man3/SSL_CTX_set_allow_early_data_cb.html x64-windows/html/man3/SSL_CTX_set_alpn_protos.html x64-windows/html/man3/SSL_CTX_set_alpn_select_cb.html x64-windows/html/man3/SSL_CTX_set_block_padding.html x64-windows/html/man3/SSL_CTX_set_cert_cb.html x64-windows/html/man3/SSL_CTX_set_cert_store.html x64-windows/html/man3/SSL_CTX_set_cert_verify_callback.html x64-windows/html/man3/SSL_CTX_set_cipher_list.html x64-windows/html/man3/SSL_CTX_set_ciphersuites.html x64-windows/html/man3/SSL_CTX_set_client_CA_list.html x64-windows/html/man3/SSL_CTX_set_client_cert_cb.html x64-windows/html/man3/SSL_CTX_set_client_hello_cb.html x64-windows/html/man3/SSL_CTX_set_ct_validation_callback.html x64-windows/html/man3/SSL_CTX_set_ctlog_list_file.html x64-windows/html/man3/SSL_CTX_set_current_cert.html x64-windows/html/man3/SSL_CTX_set_default_ctlog_list_file.html x64-windows/html/man3/SSL_CTX_set_default_passwd_cb.html x64-windows/html/man3/SSL_CTX_set_default_passwd_cb_userdata.html x64-windows/html/man3/SSL_CTX_set_default_read_buffer_len.html x64-windows/html/man3/SSL_CTX_set_default_verify_dir.html x64-windows/html/man3/SSL_CTX_set_default_verify_file.html x64-windows/html/man3/SSL_CTX_set_default_verify_paths.html x64-windows/html/man3/SSL_CTX_set_ex_data.html x64-windows/html/man3/SSL_CTX_set_generate_session_id.html x64-windows/html/man3/SSL_CTX_set_info_callback.html x64-windows/html/man3/SSL_CTX_set_keylog_callback.html x64-windows/html/man3/SSL_CTX_set_max_cert_list.html x64-windows/html/man3/SSL_CTX_set_max_early_data.html x64-windows/html/man3/SSL_CTX_set_max_pipelines.html x64-windows/html/man3/SSL_CTX_set_max_proto_version.html x64-windows/html/man3/SSL_CTX_set_max_send_fragment.html x64-windows/html/man3/SSL_CTX_set_min_proto_version.html x64-windows/html/man3/SSL_CTX_set_mode.html x64-windows/html/man3/SSL_CTX_set_msg_callback.html x64-windows/html/man3/SSL_CTX_set_msg_callback_arg.html x64-windows/html/man3/SSL_CTX_set_next_proto_select_cb.html x64-windows/html/man3/SSL_CTX_set_next_protos_advertised_cb.html x64-windows/html/man3/SSL_CTX_set_num_tickets.html x64-windows/html/man3/SSL_CTX_set_options.html x64-windows/html/man3/SSL_CTX_set_post_handshake_auth.html x64-windows/html/man3/SSL_CTX_set_psk_client_callback.html x64-windows/html/man3/SSL_CTX_set_psk_find_session_callback.html x64-windows/html/man3/SSL_CTX_set_psk_server_callback.html x64-windows/html/man3/SSL_CTX_set_psk_use_session_callback.html x64-windows/html/man3/SSL_CTX_set_quiet_shutdown.html x64-windows/html/man3/SSL_CTX_set_read_ahead.html x64-windows/html/man3/SSL_CTX_set_record_padding_callback.html x64-windows/html/man3/SSL_CTX_set_record_padding_callback_arg.html x64-windows/html/man3/SSL_CTX_set_recv_max_early_data.html x64-windows/html/man3/SSL_CTX_set_security_callback.html x64-windows/html/man3/SSL_CTX_set_security_level.html x64-windows/html/man3/SSL_CTX_set_session_cache_mode.html x64-windows/html/man3/SSL_CTX_set_session_id_context.html x64-windows/html/man3/SSL_CTX_set_session_ticket_cb.html x64-windows/html/man3/SSL_CTX_set_split_send_fragment.html x64-windows/html/man3/SSL_CTX_set_ssl_version.html x64-windows/html/man3/SSL_CTX_set_stateless_cookie_generate_cb.html x64-windows/html/man3/SSL_CTX_set_stateless_cookie_verify_cb.html x64-windows/html/man3/SSL_CTX_set_timeout.html x64-windows/html/man3/SSL_CTX_set_tlsext_max_fragment_length.html x64-windows/html/man3/SSL_CTX_set_tlsext_servername_arg.html x64-windows/html/man3/SSL_CTX_set_tlsext_servername_callback.html x64-windows/html/man3/SSL_CTX_set_tlsext_status_arg.html x64-windows/html/man3/SSL_CTX_set_tlsext_status_cb.html x64-windows/html/man3/SSL_CTX_set_tlsext_status_type.html x64-windows/html/man3/SSL_CTX_set_tlsext_ticket_key_cb.html x64-windows/html/man3/SSL_CTX_set_tlsext_use_srtp.html x64-windows/html/man3/SSL_CTX_set_tmp_dh.html x64-windows/html/man3/SSL_CTX_set_tmp_dh_callback.html x64-windows/html/man3/SSL_CTX_set_verify.html x64-windows/html/man3/SSL_CTX_set_verify_depth.html x64-windows/html/man3/SSL_CTX_up_ref.html x64-windows/html/man3/SSL_CTX_use_PrivateKey.html x64-windows/html/man3/SSL_CTX_use_PrivateKey_ASN1.html x64-windows/html/man3/SSL_CTX_use_PrivateKey_file.html x64-windows/html/man3/SSL_CTX_use_RSAPrivateKey.html x64-windows/html/man3/SSL_CTX_use_RSAPrivateKey_ASN1.html x64-windows/html/man3/SSL_CTX_use_RSAPrivateKey_file.html x64-windows/html/man3/SSL_CTX_use_cert_and_key.html x64-windows/html/man3/SSL_CTX_use_certificate.html x64-windows/html/man3/SSL_CTX_use_certificate_ASN1.html x64-windows/html/man3/SSL_CTX_use_certificate_chain_file.html x64-windows/html/man3/SSL_CTX_use_certificate_file.html x64-windows/html/man3/SSL_CTX_use_psk_identity_hint.html x64-windows/html/man3/SSL_CTX_use_serverinfo.html x64-windows/html/man3/SSL_CTX_use_serverinfo_ex.html x64-windows/html/man3/SSL_CTX_use_serverinfo_file.html x64-windows/html/man3/SSL_SESSION_dup.html x64-windows/html/man3/SSL_SESSION_free.html x64-windows/html/man3/SSL_SESSION_get0_alpn_selected.html x64-windows/html/man3/SSL_SESSION_get0_cipher.html x64-windows/html/man3/SSL_SESSION_get0_hostname.html x64-windows/html/man3/SSL_SESSION_get0_id_context.html x64-windows/html/man3/SSL_SESSION_get0_peer.html x64-windows/html/man3/SSL_SESSION_get0_ticket.html x64-windows/html/man3/SSL_SESSION_get0_ticket_appdata.html x64-windows/html/man3/SSL_SESSION_get_compress_id.html x64-windows/html/man3/SSL_SESSION_get_ex_data.html x64-windows/html/man3/SSL_SESSION_get_id.html x64-windows/html/man3/SSL_SESSION_get_master_key.html x64-windows/html/man3/SSL_SESSION_get_max_early_data.html x64-windows/html/man3/SSL_SESSION_get_max_fragment_length.html x64-windows/html/man3/SSL_SESSION_get_protocol_version.html x64-windows/html/man3/SSL_SESSION_get_ticket_lifetime_hint.html x64-windows/html/man3/SSL_SESSION_get_time.html x64-windows/html/man3/SSL_SESSION_get_timeout.html x64-windows/html/man3/SSL_SESSION_has_ticket.html x64-windows/html/man3/SSL_SESSION_is_resumable.html x64-windows/html/man3/SSL_SESSION_new.html x64-windows/html/man3/SSL_SESSION_print.html x64-windows/html/man3/SSL_SESSION_print_fp.html x64-windows/html/man3/SSL_SESSION_print_keylog.html x64-windows/html/man3/SSL_SESSION_set1_alpn_selected.html x64-windows/html/man3/SSL_SESSION_set1_hostname.html x64-windows/html/man3/SSL_SESSION_set1_id.html x64-windows/html/man3/SSL_SESSION_set1_id_context.html x64-windows/html/man3/SSL_SESSION_set1_master_key.html x64-windows/html/man3/SSL_SESSION_set1_ticket_appdata.html x64-windows/html/man3/SSL_SESSION_set_cipher.html x64-windows/html/man3/SSL_SESSION_set_ex_data.html x64-windows/html/man3/SSL_SESSION_set_max_early_data.html x64-windows/html/man3/SSL_SESSION_set_protocol_version.html x64-windows/html/man3/SSL_SESSION_set_time.html x64-windows/html/man3/SSL_SESSION_set_timeout.html x64-windows/html/man3/SSL_SESSION_up_ref.html x64-windows/html/man3/SSL_accept.html x64-windows/html/man3/SSL_add0_chain_cert.html x64-windows/html/man3/SSL_add1_chain_cert.html x64-windows/html/man3/SSL_add1_host.html x64-windows/html/man3/SSL_add1_to_CA_list.html x64-windows/html/man3/SSL_add_client_CA.html x64-windows/html/man3/SSL_alert_desc_string.html x64-windows/html/man3/SSL_alert_desc_string_long.html x64-windows/html/man3/SSL_alert_type_string.html x64-windows/html/man3/SSL_alert_type_string_long.html x64-windows/html/man3/SSL_alloc_buffers.html x64-windows/html/man3/SSL_allow_early_data_cb_fn.html x64-windows/html/man3/SSL_build_cert_chain.html x64-windows/html/man3/SSL_bytes_to_cipher_list.html x64-windows/html/man3/SSL_callback_ctrl.html x64-windows/html/man3/SSL_check_chain.html x64-windows/html/man3/SSL_check_private_key.html x64-windows/html/man3/SSL_clear.html x64-windows/html/man3/SSL_clear_chain_certs.html x64-windows/html/man3/SSL_clear_mode.html x64-windows/html/man3/SSL_clear_options.html x64-windows/html/man3/SSL_client_hello_cb_fn.html x64-windows/html/man3/SSL_client_hello_get0_ciphers.html x64-windows/html/man3/SSL_client_hello_get0_compression_methods.html x64-windows/html/man3/SSL_client_hello_get0_ext.html x64-windows/html/man3/SSL_client_hello_get0_legacy_version.html x64-windows/html/man3/SSL_client_hello_get0_random.html x64-windows/html/man3/SSL_client_hello_get0_session_id.html x64-windows/html/man3/SSL_client_hello_get1_extensions_present.html x64-windows/html/man3/SSL_client_hello_isv2.html x64-windows/html/man3/SSL_client_version.html x64-windows/html/man3/SSL_config.html x64-windows/html/man3/SSL_connect.html x64-windows/html/man3/SSL_ct_is_enabled.html x64-windows/html/man3/SSL_ctrl.html x64-windows/html/man3/SSL_dane_clear_flags.html x64-windows/html/man3/SSL_dane_enable.html x64-windows/html/man3/SSL_dane_set_flags.html x64-windows/html/man3/SSL_dane_tlsa_add.html x64-windows/html/man3/SSL_disable_ct.html x64-windows/html/man3/SSL_do_handshake.html x64-windows/html/man3/SSL_dup.html x64-windows/html/man3/SSL_enable_ct.html x64-windows/html/man3/SSL_export_keying_material.html x64-windows/html/man3/SSL_export_keying_material_early.html x64-windows/html/man3/SSL_extension_supported.html x64-windows/html/man3/SSL_free.html x64-windows/html/man3/SSL_free_buffers.html x64-windows/html/man3/SSL_get0_CA_list.html x64-windows/html/man3/SSL_get0_alpn_selected.html x64-windows/html/man3/SSL_get0_chain_certs.html x64-windows/html/man3/SSL_get0_dane_authority.html x64-windows/html/man3/SSL_get0_dane_tlsa.html x64-windows/html/man3/SSL_get0_next_proto_negotiated.html x64-windows/html/man3/SSL_get0_param.html x64-windows/html/man3/SSL_get0_peer_CA_list.html x64-windows/html/man3/SSL_get0_peer_scts.html x64-windows/html/man3/SSL_get0_peername.html x64-windows/html/man3/SSL_get0_security_ex_data.html x64-windows/html/man3/SSL_get0_session.html x64-windows/html/man3/SSL_get0_verified_chain.html x64-windows/html/man3/SSL_get1_curves.html x64-windows/html/man3/SSL_get1_groups.html x64-windows/html/man3/SSL_get1_session.html x64-windows/html/man3/SSL_get1_supported_ciphers.html x64-windows/html/man3/SSL_get_SSL_CTX.html x64-windows/html/man3/SSL_get_all_async_fds.html x64-windows/html/man3/SSL_get_changed_async_fds.html x64-windows/html/man3/SSL_get_cipher.html x64-windows/html/man3/SSL_get_cipher_bits.html x64-windows/html/man3/SSL_get_cipher_list.html x64-windows/html/man3/SSL_get_cipher_name.html x64-windows/html/man3/SSL_get_cipher_version.html x64-windows/html/man3/SSL_get_ciphers.html x64-windows/html/man3/SSL_get_client_CA_list.html x64-windows/html/man3/SSL_get_client_ciphers.html x64-windows/html/man3/SSL_get_client_random.html x64-windows/html/man3/SSL_get_current_cipher.html x64-windows/html/man3/SSL_get_default_passwd_cb.html x64-windows/html/man3/SSL_get_default_passwd_cb_userdata.html x64-windows/html/man3/SSL_get_default_timeout.html x64-windows/html/man3/SSL_get_early_data_status.html x64-windows/html/man3/SSL_get_error.html x64-windows/html/man3/SSL_get_ex_data.html x64-windows/html/man3/SSL_get_ex_data_X509_STORE_CTX_idx.html x64-windows/html/man3/SSL_get_extms_support.html x64-windows/html/man3/SSL_get_fd.html x64-windows/html/man3/SSL_get_info_callback.html x64-windows/html/man3/SSL_get_key_update_type.html x64-windows/html/man3/SSL_get_max_cert_list.html x64-windows/html/man3/SSL_get_max_early_data.html x64-windows/html/man3/SSL_get_max_proto_version.html x64-windows/html/man3/SSL_get_min_proto_version.html x64-windows/html/man3/SSL_get_mode.html x64-windows/html/man3/SSL_get_num_tickets.html x64-windows/html/man3/SSL_get_options.html x64-windows/html/man3/SSL_get_peer_cert_chain.html x64-windows/html/man3/SSL_get_peer_certificate.html x64-windows/html/man3/SSL_get_peer_signature_nid.html x64-windows/html/man3/SSL_get_peer_signature_type_nid.html x64-windows/html/man3/SSL_get_peer_tmp_key.html x64-windows/html/man3/SSL_get_pending_cipher.html x64-windows/html/man3/SSL_get_psk_identity.html x64-windows/html/man3/SSL_get_psk_identity_hint.html x64-windows/html/man3/SSL_get_quiet_shutdown.html x64-windows/html/man3/SSL_get_rbio.html x64-windows/html/man3/SSL_get_read_ahead.html x64-windows/html/man3/SSL_get_record_padding_callback_arg.html x64-windows/html/man3/SSL_get_recv_max_early_data.html x64-windows/html/man3/SSL_get_rfd.html x64-windows/html/man3/SSL_get_secure_renegotiation_support.html x64-windows/html/man3/SSL_get_security_callback.html x64-windows/html/man3/SSL_get_security_level.html x64-windows/html/man3/SSL_get_selected_srtp_profile.html x64-windows/html/man3/SSL_get_server_random.html x64-windows/html/man3/SSL_get_server_tmp_key.html x64-windows/html/man3/SSL_get_servername.html x64-windows/html/man3/SSL_get_servername_type.html x64-windows/html/man3/SSL_get_session.html x64-windows/html/man3/SSL_get_shared_ciphers.html x64-windows/html/man3/SSL_get_shared_curve.html x64-windows/html/man3/SSL_get_shared_group.html x64-windows/html/man3/SSL_get_shared_sigalgs.html x64-windows/html/man3/SSL_get_shutdown.html x64-windows/html/man3/SSL_get_sigalgs.html x64-windows/html/man3/SSL_get_signature_nid.html x64-windows/html/man3/SSL_get_signature_type_nid.html x64-windows/html/man3/SSL_get_srtp_profiles.html x64-windows/html/man3/SSL_get_ssl_method.html x64-windows/html/man3/SSL_get_state.html x64-windows/html/man3/SSL_get_time.html x64-windows/html/man3/SSL_get_timeout.html x64-windows/html/man3/SSL_get_tlsext_status_ocsp_resp.html x64-windows/html/man3/SSL_get_tlsext_status_type.html x64-windows/html/man3/SSL_get_tmp_key.html x64-windows/html/man3/SSL_get_verify_callback.html x64-windows/html/man3/SSL_get_verify_depth.html x64-windows/html/man3/SSL_get_verify_mode.html x64-windows/html/man3/SSL_get_verify_result.html x64-windows/html/man3/SSL_get_version.html x64-windows/html/man3/SSL_get_wbio.html x64-windows/html/man3/SSL_get_wfd.html x64-windows/html/man3/SSL_has_matching_session_id.html x64-windows/html/man3/SSL_has_pending.html x64-windows/html/man3/SSL_in_accept_init.html x64-windows/html/man3/SSL_in_before.html x64-windows/html/man3/SSL_in_connect_init.html x64-windows/html/man3/SSL_in_init.html x64-windows/html/man3/SSL_is_dtls.html x64-windows/html/man3/SSL_is_init_finished.html x64-windows/html/man3/SSL_is_server.html x64-windows/html/man3/SSL_key_update.html x64-windows/html/man3/SSL_library_init.html x64-windows/html/man3/SSL_load_client_CA_file.html x64-windows/html/man3/SSL_load_error_strings.html x64-windows/html/man3/SSL_new.html x64-windows/html/man3/SSL_peek.html x64-windows/html/man3/SSL_peek_ex.html x64-windows/html/man3/SSL_pending.html x64-windows/html/man3/SSL_psk_client_cb_func.html x64-windows/html/man3/SSL_psk_find_session_cb_func.html x64-windows/html/man3/SSL_psk_server_cb_func.html x64-windows/html/man3/SSL_psk_use_session_cb_func.html x64-windows/html/man3/SSL_read.html x64-windows/html/man3/SSL_read_early_data.html x64-windows/html/man3/SSL_read_ex.html x64-windows/html/man3/SSL_renegotiate.html x64-windows/html/man3/SSL_renegotiate_abbreviated.html x64-windows/html/man3/SSL_renegotiate_pending.html x64-windows/html/man3/SSL_rstate_string.html x64-windows/html/man3/SSL_rstate_string_long.html x64-windows/html/man3/SSL_select_current_cert.html x64-windows/html/man3/SSL_select_next_proto.html x64-windows/html/man3/SSL_session_reused.html x64-windows/html/man3/SSL_set0_CA_list.html x64-windows/html/man3/SSL_set0_chain.html x64-windows/html/man3/SSL_set0_chain_cert_store.html x64-windows/html/man3/SSL_set0_rbio.html x64-windows/html/man3/SSL_set0_security_ex_data.html x64-windows/html/man3/SSL_set0_verify_cert_store.html x64-windows/html/man3/SSL_set0_wbio.html x64-windows/html/man3/SSL_set1_chain.html x64-windows/html/man3/SSL_set1_chain_cert_store.html x64-windows/html/man3/SSL_set1_client_sigalgs.html x64-windows/html/man3/SSL_set1_client_sigalgs_list.html x64-windows/html/man3/SSL_set1_curves.html x64-windows/html/man3/SSL_set1_curves_list.html x64-windows/html/man3/SSL_set1_groups.html x64-windows/html/man3/SSL_set1_groups_list.html x64-windows/html/man3/SSL_set1_host.html x64-windows/html/man3/SSL_set1_param.html x64-windows/html/man3/SSL_set1_sigalgs.html x64-windows/html/man3/SSL_set1_sigalgs_list.html x64-windows/html/man3/SSL_set1_verify_cert_store.html x64-windows/html/man3/SSL_set_accept_state.html x64-windows/html/man3/SSL_set_allow_early_data_cb.html x64-windows/html/man3/SSL_set_alpn_protos.html x64-windows/html/man3/SSL_set_bio.html x64-windows/html/man3/SSL_set_block_padding.html x64-windows/html/man3/SSL_set_cert_cb.html x64-windows/html/man3/SSL_set_cipher_list.html x64-windows/html/man3/SSL_set_ciphersuites.html x64-windows/html/man3/SSL_set_client_CA_list.html x64-windows/html/man3/SSL_set_connect_state.html x64-windows/html/man3/SSL_set_ct_validation_callback.html x64-windows/html/man3/SSL_set_current_cert.html x64-windows/html/man3/SSL_set_default_passwd_cb.html x64-windows/html/man3/SSL_set_default_passwd_cb_userdata.html x64-windows/html/man3/SSL_set_default_read_buffer_len.html x64-windows/html/man3/SSL_set_ex_data.html x64-windows/html/man3/SSL_set_fd.html x64-windows/html/man3/SSL_set_generate_session_id.html x64-windows/html/man3/SSL_set_hostflags.html x64-windows/html/man3/SSL_set_info_callback.html x64-windows/html/man3/SSL_set_max_cert_list.html x64-windows/html/man3/SSL_set_max_early_data.html x64-windows/html/man3/SSL_set_max_pipelines.html x64-windows/html/man3/SSL_set_max_proto_version.html x64-windows/html/man3/SSL_set_max_send_fragment.html x64-windows/html/man3/SSL_set_min_proto_version.html x64-windows/html/man3/SSL_set_mode.html x64-windows/html/man3/SSL_set_msg_callback.html x64-windows/html/man3/SSL_set_msg_callback_arg.html x64-windows/html/man3/SSL_set_num_tickets.html x64-windows/html/man3/SSL_set_options.html x64-windows/html/man3/SSL_set_post_handshake_auth.html x64-windows/html/man3/SSL_set_psk_client_callback.html x64-windows/html/man3/SSL_set_psk_find_session_callback.html x64-windows/html/man3/SSL_set_psk_server_callback.html x64-windows/html/man3/SSL_set_psk_use_session_callback.html x64-windows/html/man3/SSL_set_quiet_shutdown.html x64-windows/html/man3/SSL_set_read_ahead.html x64-windows/html/man3/SSL_set_record_padding_callback.html x64-windows/html/man3/SSL_set_record_padding_callback_arg.html x64-windows/html/man3/SSL_set_recv_max_early_data.html x64-windows/html/man3/SSL_set_rfd.html x64-windows/html/man3/SSL_set_security_callback.html x64-windows/html/man3/SSL_set_security_level.html x64-windows/html/man3/SSL_set_session.html x64-windows/html/man3/SSL_set_session_id_context.html x64-windows/html/man3/SSL_set_shutdown.html x64-windows/html/man3/SSL_set_split_send_fragment.html x64-windows/html/man3/SSL_set_ssl_method.html x64-windows/html/man3/SSL_set_time.html x64-windows/html/man3/SSL_set_timeout.html x64-windows/html/man3/SSL_set_tlsext_host_name.html x64-windows/html/man3/SSL_set_tlsext_max_fragment_length.html x64-windows/html/man3/SSL_set_tlsext_status_ocsp_resp.html x64-windows/html/man3/SSL_set_tlsext_status_type.html x64-windows/html/man3/SSL_set_tlsext_use_srtp.html x64-windows/html/man3/SSL_set_tmp_dh.html x64-windows/html/man3/SSL_set_tmp_dh_callback.html x64-windows/html/man3/SSL_set_verify.html x64-windows/html/man3/SSL_set_verify_depth.html x64-windows/html/man3/SSL_set_verify_result.html x64-windows/html/man3/SSL_set_wfd.html x64-windows/html/man3/SSL_shutdown.html x64-windows/html/man3/SSL_state_string.html x64-windows/html/man3/SSL_state_string_long.html x64-windows/html/man3/SSL_stateless.html x64-windows/html/man3/SSL_up_ref.html x64-windows/html/man3/SSL_use_PrivateKey.html x64-windows/html/man3/SSL_use_PrivateKey_ASN1.html x64-windows/html/man3/SSL_use_PrivateKey_file.html x64-windows/html/man3/SSL_use_RSAPrivateKey.html x64-windows/html/man3/SSL_use_RSAPrivateKey_ASN1.html x64-windows/html/man3/SSL_use_RSAPrivateKey_file.html x64-windows/html/man3/SSL_use_cert_and_key.html x64-windows/html/man3/SSL_use_certificate.html x64-windows/html/man3/SSL_use_certificate_ASN1.html x64-windows/html/man3/SSL_use_certificate_chain_file.html x64-windows/html/man3/SSL_use_certificate_file.html x64-windows/html/man3/SSL_use_psk_identity_hint.html x64-windows/html/man3/SSL_verify_cb.html x64-windows/html/man3/SSL_verify_client_post_handshake.html x64-windows/html/man3/SSL_version.html x64-windows/html/man3/SSL_waiting_for_async.html x64-windows/html/man3/SSL_want.html x64-windows/html/man3/SSL_want_async.html x64-windows/html/man3/SSL_want_async_job.html x64-windows/html/man3/SSL_want_client_hello_cb.html x64-windows/html/man3/SSL_want_nothing.html x64-windows/html/man3/SSL_want_read.html x64-windows/html/man3/SSL_want_write.html x64-windows/html/man3/SSL_want_x509_lookup.html x64-windows/html/man3/SSL_write.html x64-windows/html/man3/SSL_write_early_data.html x64-windows/html/man3/SSL_write_ex.html x64-windows/html/man3/SSLv23_client_method.html x64-windows/html/man3/SSLv23_method.html x64-windows/html/man3/SSLv23_server_method.html x64-windows/html/man3/SSLv3_client_method.html x64-windows/html/man3/SSLv3_method.html x64-windows/html/man3/SSLv3_server_method.html x64-windows/html/man3/SXNETID_free.html x64-windows/html/man3/SXNETID_new.html x64-windows/html/man3/SXNET_free.html x64-windows/html/man3/SXNET_new.html x64-windows/html/man3/TLS_FEATURE_free.html x64-windows/html/man3/TLS_FEATURE_new.html x64-windows/html/man3/TLS_client_method.html x64-windows/html/man3/TLS_method.html x64-windows/html/man3/TLS_server_method.html x64-windows/html/man3/TLSv1_1_client_method.html x64-windows/html/man3/TLSv1_1_method.html x64-windows/html/man3/TLSv1_1_server_method.html x64-windows/html/man3/TLSv1_2_client_method.html x64-windows/html/man3/TLSv1_2_method.html x64-windows/html/man3/TLSv1_2_server_method.html x64-windows/html/man3/TLSv1_client_method.html x64-windows/html/man3/TLSv1_method.html x64-windows/html/man3/TLSv1_server_method.html x64-windows/html/man3/TS_ACCURACY_dup.html x64-windows/html/man3/TS_ACCURACY_free.html x64-windows/html/man3/TS_ACCURACY_new.html x64-windows/html/man3/TS_MSG_IMPRINT_dup.html x64-windows/html/man3/TS_MSG_IMPRINT_free.html x64-windows/html/man3/TS_MSG_IMPRINT_new.html x64-windows/html/man3/TS_REQ_dup.html x64-windows/html/man3/TS_REQ_free.html x64-windows/html/man3/TS_REQ_new.html x64-windows/html/man3/TS_RESP_dup.html x64-windows/html/man3/TS_RESP_free.html x64-windows/html/man3/TS_RESP_new.html x64-windows/html/man3/TS_STATUS_INFO_dup.html x64-windows/html/man3/TS_STATUS_INFO_free.html x64-windows/html/man3/TS_STATUS_INFO_new.html x64-windows/html/man3/TS_TST_INFO_dup.html x64-windows/html/man3/TS_TST_INFO_free.html x64-windows/html/man3/TS_TST_INFO_new.html x64-windows/html/man3/UI.html x64-windows/html/man3/UI_METHOD.html x64-windows/html/man3/UI_OpenSSL.html x64-windows/html/man3/UI_STRING.html x64-windows/html/man3/UI_UTIL_read_pw.html x64-windows/html/man3/UI_UTIL_read_pw_string.html x64-windows/html/man3/UI_UTIL_wrap_read_pem_callback.html x64-windows/html/man3/UI_add_error_string.html x64-windows/html/man3/UI_add_info_string.html x64-windows/html/man3/UI_add_input_boolean.html x64-windows/html/man3/UI_add_input_string.html x64-windows/html/man3/UI_add_user_data.html x64-windows/html/man3/UI_add_verify_string.html x64-windows/html/man3/UI_construct_prompt.html x64-windows/html/man3/UI_create_method.html x64-windows/html/man3/UI_ctrl.html x64-windows/html/man3/UI_destroy_method.html x64-windows/html/man3/UI_dup_error_string.html x64-windows/html/man3/UI_dup_info_string.html x64-windows/html/man3/UI_dup_input_boolean.html x64-windows/html/man3/UI_dup_input_string.html x64-windows/html/man3/UI_dup_user_data.html x64-windows/html/man3/UI_dup_verify_string.html x64-windows/html/man3/UI_free.html x64-windows/html/man3/UI_get0_action_string.html x64-windows/html/man3/UI_get0_output_string.html x64-windows/html/man3/UI_get0_result.html x64-windows/html/man3/UI_get0_result_string.html x64-windows/html/man3/UI_get0_test_string.html x64-windows/html/man3/UI_get0_user_data.html x64-windows/html/man3/UI_get_default_method.html x64-windows/html/man3/UI_get_ex_data.html x64-windows/html/man3/UI_get_ex_new_index.html x64-windows/html/man3/UI_get_input_flags.html x64-windows/html/man3/UI_get_method.html x64-windows/html/man3/UI_get_result_length.html x64-windows/html/man3/UI_get_result_maxsize.html x64-windows/html/man3/UI_get_result_minsize.html x64-windows/html/man3/UI_get_result_string_length.html x64-windows/html/man3/UI_get_string_type.html x64-windows/html/man3/UI_method_get_closer.html x64-windows/html/man3/UI_method_get_data_destructor.html x64-windows/html/man3/UI_method_get_data_duplicator.html x64-windows/html/man3/UI_method_get_ex_data.html x64-windows/html/man3/UI_method_get_flusher.html x64-windows/html/man3/UI_method_get_opener.html x64-windows/html/man3/UI_method_get_prompt_constructor.html x64-windows/html/man3/UI_method_get_reader.html x64-windows/html/man3/UI_method_get_writer.html x64-windows/html/man3/UI_method_set_closer.html x64-windows/html/man3/UI_method_set_data_duplicator.html x64-windows/html/man3/UI_method_set_ex_data.html x64-windows/html/man3/UI_method_set_flusher.html x64-windows/html/man3/UI_method_set_opener.html x64-windows/html/man3/UI_method_set_prompt_constructor.html x64-windows/html/man3/UI_method_set_reader.html x64-windows/html/man3/UI_method_set_writer.html x64-windows/html/man3/UI_new.html x64-windows/html/man3/UI_new_method.html x64-windows/html/man3/UI_null.html x64-windows/html/man3/UI_process.html x64-windows/html/man3/UI_set_default_method.html x64-windows/html/man3/UI_set_ex_data.html x64-windows/html/man3/UI_set_method.html x64-windows/html/man3/UI_set_result.html x64-windows/html/man3/UI_set_result_ex.html x64-windows/html/man3/UI_string_types.html x64-windows/html/man3/USERNOTICE_free.html x64-windows/html/man3/USERNOTICE_new.html x64-windows/html/man3/X509V3_EXT_d2i.html x64-windows/html/man3/X509V3_EXT_i2d.html x64-windows/html/man3/X509V3_add1_i2d.html x64-windows/html/man3/X509V3_get_d2i.html x64-windows/html/man3/X509_ALGOR_cmp.html x64-windows/html/man3/X509_ALGOR_dup.html x64-windows/html/man3/X509_ALGOR_free.html x64-windows/html/man3/X509_ALGOR_get0.html x64-windows/html/man3/X509_ALGOR_new.html x64-windows/html/man3/X509_ALGOR_set0.html x64-windows/html/man3/X509_ALGOR_set_md.html x64-windows/html/man3/X509_ATTRIBUTE_dup.html x64-windows/html/man3/X509_ATTRIBUTE_free.html x64-windows/html/man3/X509_ATTRIBUTE_new.html x64-windows/html/man3/X509_CERT_AUX_free.html x64-windows/html/man3/X509_CERT_AUX_new.html x64-windows/html/man3/X509_CINF_free.html x64-windows/html/man3/X509_CINF_new.html x64-windows/html/man3/X509_CRL_INFO_free.html x64-windows/html/man3/X509_CRL_INFO_new.html x64-windows/html/man3/X509_CRL_add0_revoked.html x64-windows/html/man3/X509_CRL_add1_ext_i2d.html x64-windows/html/man3/X509_CRL_add_ext.html x64-windows/html/man3/X509_CRL_cmp.html x64-windows/html/man3/X509_CRL_delete_ext.html x64-windows/html/man3/X509_CRL_digest.html x64-windows/html/man3/X509_CRL_dup.html x64-windows/html/man3/X509_CRL_free.html x64-windows/html/man3/X509_CRL_get0_by_cert.html x64-windows/html/man3/X509_CRL_get0_by_serial.html x64-windows/html/man3/X509_CRL_get0_extensions.html x64-windows/html/man3/X509_CRL_get0_lastUpdate.html x64-windows/html/man3/X509_CRL_get0_nextUpdate.html x64-windows/html/man3/X509_CRL_get0_signature.html x64-windows/html/man3/X509_CRL_get_REVOKED.html x64-windows/html/man3/X509_CRL_get_ext.html x64-windows/html/man3/X509_CRL_get_ext_by_NID.html x64-windows/html/man3/X509_CRL_get_ext_by_OBJ.html x64-windows/html/man3/X509_CRL_get_ext_by_critical.html x64-windows/html/man3/X509_CRL_get_ext_count.html x64-windows/html/man3/X509_CRL_get_ext_d2i.html x64-windows/html/man3/X509_CRL_get_issuer.html x64-windows/html/man3/X509_CRL_get_signature_nid.html x64-windows/html/man3/X509_CRL_get_version.html x64-windows/html/man3/X509_CRL_match.html x64-windows/html/man3/X509_CRL_new.html x64-windows/html/man3/X509_CRL_set1_lastUpdate.html x64-windows/html/man3/X509_CRL_set1_nextUpdate.html x64-windows/html/man3/X509_CRL_set_issuer_name.html x64-windows/html/man3/X509_CRL_set_version.html x64-windows/html/man3/X509_CRL_sign.html x64-windows/html/man3/X509_CRL_sign_ctx.html x64-windows/html/man3/X509_CRL_sort.html x64-windows/html/man3/X509_CRL_verify.html x64-windows/html/man3/X509_EXTENSION_create_by_NID.html x64-windows/html/man3/X509_EXTENSION_create_by_OBJ.html x64-windows/html/man3/X509_EXTENSION_dup.html x64-windows/html/man3/X509_EXTENSION_free.html x64-windows/html/man3/X509_EXTENSION_get_critical.html x64-windows/html/man3/X509_EXTENSION_get_data.html x64-windows/html/man3/X509_EXTENSION_get_object.html x64-windows/html/man3/X509_EXTENSION_new.html x64-windows/html/man3/X509_EXTENSION_set_critical.html x64-windows/html/man3/X509_EXTENSION_set_data.html x64-windows/html/man3/X509_EXTENSION_set_object.html x64-windows/html/man3/X509_LOOKUP_ctrl_fn.html x64-windows/html/man3/X509_LOOKUP_file.html x64-windows/html/man3/X509_LOOKUP_get_by_alias_fn.html x64-windows/html/man3/X509_LOOKUP_get_by_fingerprint_fn.html x64-windows/html/man3/X509_LOOKUP_get_by_issuer_serial_fn.html x64-windows/html/man3/X509_LOOKUP_get_by_subject_fn.html x64-windows/html/man3/X509_LOOKUP_get_method_data.html x64-windows/html/man3/X509_LOOKUP_get_store.html x64-windows/html/man3/X509_LOOKUP_hash_dir.html x64-windows/html/man3/X509_LOOKUP_meth_free.html x64-windows/html/man3/X509_LOOKUP_meth_get_ctrl.html x64-windows/html/man3/X509_LOOKUP_meth_get_free.html x64-windows/html/man3/X509_LOOKUP_meth_get_get_by_alias.html x64-windows/html/man3/X509_LOOKUP_meth_get_get_by_fingerprint.html x64-windows/html/man3/X509_LOOKUP_meth_get_get_by_issuer_serial.html x64-windows/html/man3/X509_LOOKUP_meth_get_get_by_subject.html x64-windows/html/man3/X509_LOOKUP_meth_get_init.html x64-windows/html/man3/X509_LOOKUP_meth_get_new_item.html x64-windows/html/man3/X509_LOOKUP_meth_get_shutdown.html x64-windows/html/man3/X509_LOOKUP_meth_new.html x64-windows/html/man3/X509_LOOKUP_meth_set_ctrl.html x64-windows/html/man3/X509_LOOKUP_meth_set_free.html x64-windows/html/man3/X509_LOOKUP_meth_set_get_by_alias.html x64-windows/html/man3/X509_LOOKUP_meth_set_get_by_fingerprint.html x64-windows/html/man3/X509_LOOKUP_meth_set_get_by_issuer_serial.html x64-windows/html/man3/X509_LOOKUP_meth_set_get_by_subject.html x64-windows/html/man3/X509_LOOKUP_meth_set_init.html x64-windows/html/man3/X509_LOOKUP_meth_set_new_item.html x64-windows/html/man3/X509_LOOKUP_meth_set_shutdown.html x64-windows/html/man3/X509_LOOKUP_set_method_data.html x64-windows/html/man3/X509_NAME_ENTRY_create_by_NID.html x64-windows/html/man3/X509_NAME_ENTRY_create_by_OBJ.html x64-windows/html/man3/X509_NAME_ENTRY_create_by_txt.html x64-windows/html/man3/X509_NAME_ENTRY_dup.html x64-windows/html/man3/X509_NAME_ENTRY_free.html x64-windows/html/man3/X509_NAME_ENTRY_get_data.html x64-windows/html/man3/X509_NAME_ENTRY_get_object.html x64-windows/html/man3/X509_NAME_ENTRY_new.html x64-windows/html/man3/X509_NAME_ENTRY_set_data.html x64-windows/html/man3/X509_NAME_ENTRY_set_object.html x64-windows/html/man3/X509_NAME_add_entry.html x64-windows/html/man3/X509_NAME_add_entry_by_NID.html x64-windows/html/man3/X509_NAME_add_entry_by_OBJ.html x64-windows/html/man3/X509_NAME_add_entry_by_txt.html x64-windows/html/man3/X509_NAME_cmp.html x64-windows/html/man3/X509_NAME_delete_entry.html x64-windows/html/man3/X509_NAME_digest.html x64-windows/html/man3/X509_NAME_dup.html x64-windows/html/man3/X509_NAME_entry_count.html x64-windows/html/man3/X509_NAME_free.html x64-windows/html/man3/X509_NAME_get0_der.html x64-windows/html/man3/X509_NAME_get_entry.html x64-windows/html/man3/X509_NAME_get_index_by_NID.html x64-windows/html/man3/X509_NAME_get_index_by_OBJ.html x64-windows/html/man3/X509_NAME_get_text_by_NID.html x64-windows/html/man3/X509_NAME_get_text_by_OBJ.html x64-windows/html/man3/X509_NAME_new.html x64-windows/html/man3/X509_NAME_oneline.html x64-windows/html/man3/X509_NAME_print.html x64-windows/html/man3/X509_NAME_print_ex.html x64-windows/html/man3/X509_NAME_print_ex_fp.html x64-windows/html/man3/X509_OBJECT_set1_X509.html x64-windows/html/man3/X509_OBJECT_set1_X509_CRL.html x64-windows/html/man3/X509_PUBKEY_free.html x64-windows/html/man3/X509_PUBKEY_get.html x64-windows/html/man3/X509_PUBKEY_get0.html x64-windows/html/man3/X509_PUBKEY_get0_param.html x64-windows/html/man3/X509_PUBKEY_new.html x64-windows/html/man3/X509_PUBKEY_set.html x64-windows/html/man3/X509_PUBKEY_set0_param.html x64-windows/html/man3/X509_REQ_INFO_free.html x64-windows/html/man3/X509_REQ_INFO_new.html x64-windows/html/man3/X509_REQ_check_private_key.html x64-windows/html/man3/X509_REQ_digest.html x64-windows/html/man3/X509_REQ_dup.html x64-windows/html/man3/X509_REQ_free.html x64-windows/html/man3/X509_REQ_get0_pubkey.html x64-windows/html/man3/X509_REQ_get0_signature.html x64-windows/html/man3/X509_REQ_get_X509_PUBKEY.html x64-windows/html/man3/X509_REQ_get_pubkey.html x64-windows/html/man3/X509_REQ_get_signature_nid.html x64-windows/html/man3/X509_REQ_get_subject_name.html x64-windows/html/man3/X509_REQ_get_version.html x64-windows/html/man3/X509_REQ_new.html x64-windows/html/man3/X509_REQ_set_pubkey.html x64-windows/html/man3/X509_REQ_set_subject_name.html x64-windows/html/man3/X509_REQ_set_version.html x64-windows/html/man3/X509_REQ_sign.html x64-windows/html/man3/X509_REQ_sign_ctx.html x64-windows/html/man3/X509_REQ_verify.html x64-windows/html/man3/X509_REVOKED_add1_ext_i2d.html x64-windows/html/man3/X509_REVOKED_add_ext.html x64-windows/html/man3/X509_REVOKED_delete_ext.html x64-windows/html/man3/X509_REVOKED_dup.html x64-windows/html/man3/X509_REVOKED_free.html x64-windows/html/man3/X509_REVOKED_get0_extensions.html x64-windows/html/man3/X509_REVOKED_get0_revocationDate.html x64-windows/html/man3/X509_REVOKED_get0_serialNumber.html x64-windows/html/man3/X509_REVOKED_get_ext.html x64-windows/html/man3/X509_REVOKED_get_ext_by_NID.html x64-windows/html/man3/X509_REVOKED_get_ext_by_OBJ.html x64-windows/html/man3/X509_REVOKED_get_ext_by_critical.html x64-windows/html/man3/X509_REVOKED_get_ext_count.html x64-windows/html/man3/X509_REVOKED_get_ext_d2i.html x64-windows/html/man3/X509_REVOKED_new.html x64-windows/html/man3/X509_REVOKED_set_revocationDate.html x64-windows/html/man3/X509_REVOKED_set_serialNumber.html x64-windows/html/man3/X509_SIG_INFO_get.html x64-windows/html/man3/X509_SIG_INFO_set.html x64-windows/html/man3/X509_SIG_free.html x64-windows/html/man3/X509_SIG_get0.html x64-windows/html/man3/X509_SIG_getm.html x64-windows/html/man3/X509_SIG_new.html x64-windows/html/man3/X509_STORE_CTX_cert_crl_fn.html x64-windows/html/man3/X509_STORE_CTX_check_crl_fn.html x64-windows/html/man3/X509_STORE_CTX_check_issued_fn.html x64-windows/html/man3/X509_STORE_CTX_check_policy_fn.html x64-windows/html/man3/X509_STORE_CTX_check_revocation_fn.html x64-windows/html/man3/X509_STORE_CTX_cleanup.html x64-windows/html/man3/X509_STORE_CTX_cleanup_fn.html x64-windows/html/man3/X509_STORE_CTX_free.html x64-windows/html/man3/X509_STORE_CTX_get0_cert.html x64-windows/html/man3/X509_STORE_CTX_get0_chain.html x64-windows/html/man3/X509_STORE_CTX_get0_param.html x64-windows/html/man3/X509_STORE_CTX_get0_untrusted.html x64-windows/html/man3/X509_STORE_CTX_get1_chain.html x64-windows/html/man3/X509_STORE_CTX_get_cert_crl.html x64-windows/html/man3/X509_STORE_CTX_get_check_crl.html x64-windows/html/man3/X509_STORE_CTX_get_check_issued.html x64-windows/html/man3/X509_STORE_CTX_get_check_policy.html x64-windows/html/man3/X509_STORE_CTX_get_check_revocation.html x64-windows/html/man3/X509_STORE_CTX_get_cleanup.html x64-windows/html/man3/X509_STORE_CTX_get_crl_fn.html x64-windows/html/man3/X509_STORE_CTX_get_current_cert.html x64-windows/html/man3/X509_STORE_CTX_get_error.html x64-windows/html/man3/X509_STORE_CTX_get_error_depth.html x64-windows/html/man3/X509_STORE_CTX_get_ex_data.html x64-windows/html/man3/X509_STORE_CTX_get_ex_new_index.html x64-windows/html/man3/X509_STORE_CTX_get_get_crl.html x64-windows/html/man3/X509_STORE_CTX_get_get_issuer.html x64-windows/html/man3/X509_STORE_CTX_get_issuer_fn.html x64-windows/html/man3/X509_STORE_CTX_get_lookup_certs.html x64-windows/html/man3/X509_STORE_CTX_get_lookup_crls.html x64-windows/html/man3/X509_STORE_CTX_get_num_untrusted.html x64-windows/html/man3/X509_STORE_CTX_get_verify.html x64-windows/html/man3/X509_STORE_CTX_get_verify_cb.html x64-windows/html/man3/X509_STORE_CTX_init.html x64-windows/html/man3/X509_STORE_CTX_lookup_certs_fn.html x64-windows/html/man3/X509_STORE_CTX_lookup_crls_fn.html x64-windows/html/man3/X509_STORE_CTX_new.html x64-windows/html/man3/X509_STORE_CTX_set0_crls.html x64-windows/html/man3/X509_STORE_CTX_set0_param.html x64-windows/html/man3/X509_STORE_CTX_set0_trusted_stack.html x64-windows/html/man3/X509_STORE_CTX_set0_untrusted.html x64-windows/html/man3/X509_STORE_CTX_set0_verified_chain.html x64-windows/html/man3/X509_STORE_CTX_set_cert.html x64-windows/html/man3/X509_STORE_CTX_set_current_cert.html x64-windows/html/man3/X509_STORE_CTX_set_default.html x64-windows/html/man3/X509_STORE_CTX_set_error.html x64-windows/html/man3/X509_STORE_CTX_set_error_depth.html x64-windows/html/man3/X509_STORE_CTX_set_ex_data.html x64-windows/html/man3/X509_STORE_CTX_set_verify.html x64-windows/html/man3/X509_STORE_CTX_set_verify_cb.html x64-windows/html/man3/X509_STORE_CTX_verify_cb.html x64-windows/html/man3/X509_STORE_CTX_verify_fn.html x64-windows/html/man3/X509_STORE_add_cert.html x64-windows/html/man3/X509_STORE_add_crl.html x64-windows/html/man3/X509_STORE_free.html x64-windows/html/man3/X509_STORE_get0_objects.html x64-windows/html/man3/X509_STORE_get0_param.html x64-windows/html/man3/X509_STORE_get_cert_crl.html x64-windows/html/man3/X509_STORE_get_check_crl.html x64-windows/html/man3/X509_STORE_get_check_issued.html x64-windows/html/man3/X509_STORE_get_check_policy.html x64-windows/html/man3/X509_STORE_get_check_revocation.html x64-windows/html/man3/X509_STORE_get_cleanup.html x64-windows/html/man3/X509_STORE_get_ex_data.html x64-windows/html/man3/X509_STORE_get_ex_new_index.html x64-windows/html/man3/X509_STORE_get_get_crl.html x64-windows/html/man3/X509_STORE_get_get_issuer.html x64-windows/html/man3/X509_STORE_get_lookup_certs.html x64-windows/html/man3/X509_STORE_get_lookup_crls.html x64-windows/html/man3/X509_STORE_get_verify_cb.html x64-windows/html/man3/X509_STORE_load_locations.html x64-windows/html/man3/X509_STORE_lock.html x64-windows/html/man3/X509_STORE_new.html x64-windows/html/man3/X509_STORE_set1_param.html x64-windows/html/man3/X509_STORE_set_cert_crl.html x64-windows/html/man3/X509_STORE_set_check_crl.html x64-windows/html/man3/X509_STORE_set_check_issued.html x64-windows/html/man3/X509_STORE_set_check_policy.html x64-windows/html/man3/X509_STORE_set_check_revocation.html x64-windows/html/man3/X509_STORE_set_cleanup.html x64-windows/html/man3/X509_STORE_set_default_paths.html x64-windows/html/man3/X509_STORE_set_depth.html x64-windows/html/man3/X509_STORE_set_ex_data.html x64-windows/html/man3/X509_STORE_set_flags.html x64-windows/html/man3/X509_STORE_set_get_crl.html x64-windows/html/man3/X509_STORE_set_get_issuer.html x64-windows/html/man3/X509_STORE_set_lookup_certs.html x64-windows/html/man3/X509_STORE_set_lookup_crls.html x64-windows/html/man3/X509_STORE_set_lookup_crls_cb.html x64-windows/html/man3/X509_STORE_set_purpose.html x64-windows/html/man3/X509_STORE_set_trust.html x64-windows/html/man3/X509_STORE_set_verify.html x64-windows/html/man3/X509_STORE_set_verify_cb.html x64-windows/html/man3/X509_STORE_set_verify_cb_func.html x64-windows/html/man3/X509_STORE_set_verify_func.html x64-windows/html/man3/X509_STORE_unlock.html x64-windows/html/man3/X509_STORE_up_ref.html x64-windows/html/man3/X509_VAL_free.html x64-windows/html/man3/X509_VAL_new.html x64-windows/html/man3/X509_VERIFY_PARAM_add0_policy.html x64-windows/html/man3/X509_VERIFY_PARAM_add1_host.html x64-windows/html/man3/X509_VERIFY_PARAM_clear_flags.html x64-windows/html/man3/X509_VERIFY_PARAM_get0_peername.html x64-windows/html/man3/X509_VERIFY_PARAM_get_auth_level.html x64-windows/html/man3/X509_VERIFY_PARAM_get_depth.html x64-windows/html/man3/X509_VERIFY_PARAM_get_flags.html x64-windows/html/man3/X509_VERIFY_PARAM_get_hostflags.html x64-windows/html/man3/X509_VERIFY_PARAM_get_inh_flags.html x64-windows/html/man3/X509_VERIFY_PARAM_get_time.html x64-windows/html/man3/X509_VERIFY_PARAM_set1_email.html x64-windows/html/man3/X509_VERIFY_PARAM_set1_host.html x64-windows/html/man3/X509_VERIFY_PARAM_set1_ip.html x64-windows/html/man3/X509_VERIFY_PARAM_set1_ip_asc.html x64-windows/html/man3/X509_VERIFY_PARAM_set1_policies.html x64-windows/html/man3/X509_VERIFY_PARAM_set_auth_level.html x64-windows/html/man3/X509_VERIFY_PARAM_set_depth.html x64-windows/html/man3/X509_VERIFY_PARAM_set_flags.html x64-windows/html/man3/X509_VERIFY_PARAM_set_hostflags.html x64-windows/html/man3/X509_VERIFY_PARAM_set_inh_flags.html x64-windows/html/man3/X509_VERIFY_PARAM_set_purpose.html x64-windows/html/man3/X509_VERIFY_PARAM_set_time.html x64-windows/html/man3/X509_VERIFY_PARAM_set_trust.html x64-windows/html/man3/X509_add1_ext_i2d.html x64-windows/html/man3/X509_add_ext.html x64-windows/html/man3/X509_chain_up_ref.html x64-windows/html/man3/X509_check_ca.html x64-windows/html/man3/X509_check_email.html x64-windows/html/man3/X509_check_host.html x64-windows/html/man3/X509_check_ip.html x64-windows/html/man3/X509_check_ip_asc.html x64-windows/html/man3/X509_check_issued.html x64-windows/html/man3/X509_check_private_key.html x64-windows/html/man3/X509_cmp.html x64-windows/html/man3/X509_cmp_current_time.html x64-windows/html/man3/X509_cmp_time.html x64-windows/html/man3/X509_delete_ext.html x64-windows/html/man3/X509_digest.html x64-windows/html/man3/X509_dup.html x64-windows/html/man3/X509_free.html x64-windows/html/man3/X509_get0_authority_issuer.html x64-windows/html/man3/X509_get0_authority_key_id.html x64-windows/html/man3/X509_get0_authority_serial.html x64-windows/html/man3/X509_get0_extensions.html x64-windows/html/man3/X509_get0_notAfter.html x64-windows/html/man3/X509_get0_notBefore.html x64-windows/html/man3/X509_get0_pubkey.html x64-windows/html/man3/X509_get0_serialNumber.html x64-windows/html/man3/X509_get0_signature.html x64-windows/html/man3/X509_get0_subject_key_id.html x64-windows/html/man3/X509_get0_tbs_sigalg.html x64-windows/html/man3/X509_get0_uids.html x64-windows/html/man3/X509_get_X509_PUBKEY.html x64-windows/html/man3/X509_get_ex_data.html x64-windows/html/man3/X509_get_ex_new_index.html x64-windows/html/man3/X509_get_ext.html x64-windows/html/man3/X509_get_ext_by_NID.html x64-windows/html/man3/X509_get_ext_by_OBJ.html x64-windows/html/man3/X509_get_ext_by_critical.html x64-windows/html/man3/X509_get_ext_count.html x64-windows/html/man3/X509_get_ext_d2i.html x64-windows/html/man3/X509_get_extended_key_usage.html x64-windows/html/man3/X509_get_extension_flags.html x64-windows/html/man3/X509_get_issuer_name.html x64-windows/html/man3/X509_get_key_usage.html x64-windows/html/man3/X509_get_pathlen.html x64-windows/html/man3/X509_get_proxy_pathlen.html x64-windows/html/man3/X509_get_pubkey.html x64-windows/html/man3/X509_get_serialNumber.html x64-windows/html/man3/X509_get_signature_info.html x64-windows/html/man3/X509_get_signature_nid.html x64-windows/html/man3/X509_get_subject_name.html x64-windows/html/man3/X509_get_version.html x64-windows/html/man3/X509_getm_notAfter.html x64-windows/html/man3/X509_getm_notBefore.html x64-windows/html/man3/X509_issuer_and_serial_cmp.html x64-windows/html/man3/X509_issuer_name_cmp.html x64-windows/html/man3/X509_load_cert_crl_file.html x64-windows/html/man3/X509_load_cert_file.html x64-windows/html/man3/X509_load_crl_file.html x64-windows/html/man3/X509_new.html x64-windows/html/man3/X509_pubkey_digest.html x64-windows/html/man3/X509_set1_notAfter.html x64-windows/html/man3/X509_set1_notBefore.html x64-windows/html/man3/X509_set_ex_data.html x64-windows/html/man3/X509_set_issuer_name.html x64-windows/html/man3/X509_set_proxy_flag.html x64-windows/html/man3/X509_set_proxy_pathlen.html x64-windows/html/man3/X509_set_pubkey.html x64-windows/html/man3/X509_set_serialNumber.html x64-windows/html/man3/X509_set_subject_name.html x64-windows/html/man3/X509_set_version.html x64-windows/html/man3/X509_sign.html x64-windows/html/man3/X509_sign_ctx.html x64-windows/html/man3/X509_subject_name_cmp.html x64-windows/html/man3/X509_time_adj.html x64-windows/html/man3/X509_time_adj_ex.html x64-windows/html/man3/X509_up_ref.html x64-windows/html/man3/X509_verify.html x64-windows/html/man3/X509_verify_cert.html x64-windows/html/man3/X509_verify_cert_error_string.html x64-windows/html/man3/X509v3_add_ext.html x64-windows/html/man3/X509v3_delete_ext.html x64-windows/html/man3/X509v3_get_ext.html x64-windows/html/man3/X509v3_get_ext_by_NID.html x64-windows/html/man3/X509v3_get_ext_by_OBJ.html x64-windows/html/man3/X509v3_get_ext_by_critical.html x64-windows/html/man3/X509v3_get_ext_count.html x64-windows/html/man3/custom_ext_add_cb.html x64-windows/html/man3/custom_ext_free_cb.html x64-windows/html/man3/custom_ext_parse_cb.html x64-windows/html/man3/d2i_ACCESS_DESCRIPTION.html x64-windows/html/man3/d2i_ADMISSIONS.html x64-windows/html/man3/d2i_ADMISSION_SYNTAX.html x64-windows/html/man3/d2i_ASIdOrRange.html x64-windows/html/man3/d2i_ASIdentifierChoice.html x64-windows/html/man3/d2i_ASIdentifiers.html x64-windows/html/man3/d2i_ASN1_BIT_STRING.html x64-windows/html/man3/d2i_ASN1_BMPSTRING.html x64-windows/html/man3/d2i_ASN1_ENUMERATED.html x64-windows/html/man3/d2i_ASN1_GENERALIZEDTIME.html x64-windows/html/man3/d2i_ASN1_GENERALSTRING.html x64-windows/html/man3/d2i_ASN1_IA5STRING.html x64-windows/html/man3/d2i_ASN1_INTEGER.html x64-windows/html/man3/d2i_ASN1_NULL.html x64-windows/html/man3/d2i_ASN1_OBJECT.html x64-windows/html/man3/d2i_ASN1_OCTET_STRING.html x64-windows/html/man3/d2i_ASN1_PRINTABLE.html x64-windows/html/man3/d2i_ASN1_PRINTABLESTRING.html x64-windows/html/man3/d2i_ASN1_SEQUENCE_ANY.html x64-windows/html/man3/d2i_ASN1_SET_ANY.html x64-windows/html/man3/d2i_ASN1_T61STRING.html x64-windows/html/man3/d2i_ASN1_TIME.html x64-windows/html/man3/d2i_ASN1_TYPE.html x64-windows/html/man3/d2i_ASN1_UINTEGER.html x64-windows/html/man3/d2i_ASN1_UNIVERSALSTRING.html x64-windows/html/man3/d2i_ASN1_UTCTIME.html x64-windows/html/man3/d2i_ASN1_UTF8STRING.html x64-windows/html/man3/d2i_ASN1_VISIBLESTRING.html x64-windows/html/man3/d2i_ASRange.html x64-windows/html/man3/d2i_AUTHORITY_INFO_ACCESS.html x64-windows/html/man3/d2i_AUTHORITY_KEYID.html x64-windows/html/man3/d2i_AutoPrivateKey.html x64-windows/html/man3/d2i_BASIC_CONSTRAINTS.html x64-windows/html/man3/d2i_CERTIFICATEPOLICIES.html x64-windows/html/man3/d2i_CMS_ContentInfo.html x64-windows/html/man3/d2i_CMS_ReceiptRequest.html x64-windows/html/man3/d2i_CMS_bio.html x64-windows/html/man3/d2i_CRL_DIST_POINTS.html x64-windows/html/man3/d2i_DHparams.html x64-windows/html/man3/d2i_DHxparams.html x64-windows/html/man3/d2i_DIRECTORYSTRING.html x64-windows/html/man3/d2i_DISPLAYTEXT.html x64-windows/html/man3/d2i_DIST_POINT.html x64-windows/html/man3/d2i_DIST_POINT_NAME.html x64-windows/html/man3/d2i_DSAPrivateKey.html x64-windows/html/man3/d2i_DSAPrivateKey_bio.html x64-windows/html/man3/d2i_DSAPrivateKey_fp.html x64-windows/html/man3/d2i_DSAPublicKey.html x64-windows/html/man3/d2i_DSA_PUBKEY.html x64-windows/html/man3/d2i_DSA_PUBKEY_bio.html x64-windows/html/man3/d2i_DSA_PUBKEY_fp.html x64-windows/html/man3/d2i_DSA_SIG.html x64-windows/html/man3/d2i_DSAparams.html x64-windows/html/man3/d2i_ECDSA_SIG.html x64-windows/html/man3/d2i_ECPKParameters.html x64-windows/html/man3/d2i_ECParameters.html x64-windows/html/man3/d2i_ECPrivateKey.html x64-windows/html/man3/d2i_ECPrivateKey_bio.html x64-windows/html/man3/d2i_ECPrivateKey_fp.html x64-windows/html/man3/d2i_EC_PUBKEY.html x64-windows/html/man3/d2i_EC_PUBKEY_bio.html x64-windows/html/man3/d2i_EC_PUBKEY_fp.html x64-windows/html/man3/d2i_EDIPARTYNAME.html x64-windows/html/man3/d2i_ESS_CERT_ID.html x64-windows/html/man3/d2i_ESS_ISSUER_SERIAL.html x64-windows/html/man3/d2i_ESS_SIGNING_CERT.html x64-windows/html/man3/d2i_EXTENDED_KEY_USAGE.html x64-windows/html/man3/d2i_GENERAL_NAME.html x64-windows/html/man3/d2i_GENERAL_NAMES.html x64-windows/html/man3/d2i_IPAddressChoice.html x64-windows/html/man3/d2i_IPAddressFamily.html x64-windows/html/man3/d2i_IPAddressOrRange.html x64-windows/html/man3/d2i_IPAddressRange.html x64-windows/html/man3/d2i_ISSUING_DIST_POINT.html x64-windows/html/man3/d2i_NAMING_AUTHORITY.html x64-windows/html/man3/d2i_NETSCAPE_CERT_SEQUENCE.html x64-windows/html/man3/d2i_NETSCAPE_SPKAC.html x64-windows/html/man3/d2i_NETSCAPE_SPKI.html x64-windows/html/man3/d2i_NOTICEREF.html x64-windows/html/man3/d2i_OCSP_BASICRESP.html x64-windows/html/man3/d2i_OCSP_CERTID.html x64-windows/html/man3/d2i_OCSP_CERTSTATUS.html x64-windows/html/man3/d2i_OCSP_CRLID.html x64-windows/html/man3/d2i_OCSP_ONEREQ.html x64-windows/html/man3/d2i_OCSP_REQINFO.html x64-windows/html/man3/d2i_OCSP_REQUEST.html x64-windows/html/man3/d2i_OCSP_RESPBYTES.html x64-windows/html/man3/d2i_OCSP_RESPDATA.html x64-windows/html/man3/d2i_OCSP_RESPID.html x64-windows/html/man3/d2i_OCSP_RESPONSE.html x64-windows/html/man3/d2i_OCSP_REVOKEDINFO.html x64-windows/html/man3/d2i_OCSP_SERVICELOC.html x64-windows/html/man3/d2i_OCSP_SIGNATURE.html x64-windows/html/man3/d2i_OCSP_SINGLERESP.html x64-windows/html/man3/d2i_OTHERNAME.html x64-windows/html/man3/d2i_PBE2PARAM.html x64-windows/html/man3/d2i_PBEPARAM.html x64-windows/html/man3/d2i_PBKDF2PARAM.html x64-windows/html/man3/d2i_PKCS12.html x64-windows/html/man3/d2i_PKCS12_BAGS.html x64-windows/html/man3/d2i_PKCS12_MAC_DATA.html x64-windows/html/man3/d2i_PKCS12_SAFEBAG.html x64-windows/html/man3/d2i_PKCS12_bio.html x64-windows/html/man3/d2i_PKCS12_fp.html x64-windows/html/man3/d2i_PKCS7.html x64-windows/html/man3/d2i_PKCS7_DIGEST.html x64-windows/html/man3/d2i_PKCS7_ENCRYPT.html x64-windows/html/man3/d2i_PKCS7_ENC_CONTENT.html x64-windows/html/man3/d2i_PKCS7_ENVELOPE.html x64-windows/html/man3/d2i_PKCS7_ISSUER_AND_SERIAL.html x64-windows/html/man3/d2i_PKCS7_RECIP_INFO.html x64-windows/html/man3/d2i_PKCS7_SIGNED.html x64-windows/html/man3/d2i_PKCS7_SIGNER_INFO.html x64-windows/html/man3/d2i_PKCS7_SIGN_ENVELOPE.html x64-windows/html/man3/d2i_PKCS7_bio.html x64-windows/html/man3/d2i_PKCS7_fp.html x64-windows/html/man3/d2i_PKCS8PrivateKey_bio.html x64-windows/html/man3/d2i_PKCS8PrivateKey_fp.html x64-windows/html/man3/d2i_PKCS8_PRIV_KEY_INFO.html x64-windows/html/man3/d2i_PKCS8_PRIV_KEY_INFO_bio.html x64-windows/html/man3/d2i_PKCS8_PRIV_KEY_INFO_fp.html x64-windows/html/man3/d2i_PKCS8_bio.html x64-windows/html/man3/d2i_PKCS8_fp.html x64-windows/html/man3/d2i_PKEY_USAGE_PERIOD.html x64-windows/html/man3/d2i_POLICYINFO.html x64-windows/html/man3/d2i_POLICYQUALINFO.html x64-windows/html/man3/d2i_PROFESSION_INFO.html x64-windows/html/man3/d2i_PROXY_CERT_INFO_EXTENSION.html x64-windows/html/man3/d2i_PROXY_POLICY.html x64-windows/html/man3/d2i_PUBKEY.html x64-windows/html/man3/d2i_PUBKEY_bio.html x64-windows/html/man3/d2i_PUBKEY_fp.html x64-windows/html/man3/d2i_PrivateKey.html x64-windows/html/man3/d2i_PrivateKey_bio.html x64-windows/html/man3/d2i_PrivateKey_fp.html x64-windows/html/man3/d2i_PublicKey.html x64-windows/html/man3/d2i_RSAPrivateKey.html x64-windows/html/man3/d2i_RSAPrivateKey_bio.html x64-windows/html/man3/d2i_RSAPrivateKey_fp.html x64-windows/html/man3/d2i_RSAPublicKey.html x64-windows/html/man3/d2i_RSAPublicKey_bio.html x64-windows/html/man3/d2i_RSAPublicKey_fp.html x64-windows/html/man3/d2i_RSA_OAEP_PARAMS.html x64-windows/html/man3/d2i_RSA_PSS_PARAMS.html x64-windows/html/man3/d2i_RSA_PUBKEY.html x64-windows/html/man3/d2i_RSA_PUBKEY_bio.html x64-windows/html/man3/d2i_RSA_PUBKEY_fp.html x64-windows/html/man3/d2i_SCRYPT_PARAMS.html x64-windows/html/man3/d2i_SCT_LIST.html x64-windows/html/man3/d2i_SSL_SESSION.html x64-windows/html/man3/d2i_SXNET.html x64-windows/html/man3/d2i_SXNETID.html x64-windows/html/man3/d2i_TS_ACCURACY.html x64-windows/html/man3/d2i_TS_MSG_IMPRINT.html x64-windows/html/man3/d2i_TS_MSG_IMPRINT_bio.html x64-windows/html/man3/d2i_TS_MSG_IMPRINT_fp.html x64-windows/html/man3/d2i_TS_REQ.html x64-windows/html/man3/d2i_TS_REQ_bio.html x64-windows/html/man3/d2i_TS_REQ_fp.html x64-windows/html/man3/d2i_TS_RESP.html x64-windows/html/man3/d2i_TS_RESP_bio.html x64-windows/html/man3/d2i_TS_RESP_fp.html x64-windows/html/man3/d2i_TS_STATUS_INFO.html x64-windows/html/man3/d2i_TS_TST_INFO.html x64-windows/html/man3/d2i_TS_TST_INFO_bio.html x64-windows/html/man3/d2i_TS_TST_INFO_fp.html x64-windows/html/man3/d2i_USERNOTICE.html x64-windows/html/man3/d2i_X509.html x64-windows/html/man3/d2i_X509_ALGOR.html x64-windows/html/man3/d2i_X509_ALGORS.html x64-windows/html/man3/d2i_X509_ATTRIBUTE.html x64-windows/html/man3/d2i_X509_AUX.html x64-windows/html/man3/d2i_X509_CERT_AUX.html x64-windows/html/man3/d2i_X509_CINF.html x64-windows/html/man3/d2i_X509_CRL.html x64-windows/html/man3/d2i_X509_CRL_INFO.html x64-windows/html/man3/d2i_X509_CRL_bio.html x64-windows/html/man3/d2i_X509_CRL_fp.html x64-windows/html/man3/d2i_X509_EXTENSION.html x64-windows/html/man3/d2i_X509_EXTENSIONS.html x64-windows/html/man3/d2i_X509_NAME.html x64-windows/html/man3/d2i_X509_NAME_ENTRY.html x64-windows/html/man3/d2i_X509_PUBKEY.html x64-windows/html/man3/d2i_X509_REQ.html x64-windows/html/man3/d2i_X509_REQ_INFO.html x64-windows/html/man3/d2i_X509_REQ_bio.html x64-windows/html/man3/d2i_X509_REQ_fp.html x64-windows/html/man3/d2i_X509_REVOKED.html x64-windows/html/man3/d2i_X509_SIG.html x64-windows/html/man3/d2i_X509_VAL.html x64-windows/html/man3/i2d_ACCESS_DESCRIPTION.html x64-windows/html/man3/i2d_ADMISSIONS.html x64-windows/html/man3/i2d_ADMISSION_SYNTAX.html x64-windows/html/man3/i2d_ASIdOrRange.html x64-windows/html/man3/i2d_ASIdentifierChoice.html x64-windows/html/man3/i2d_ASIdentifiers.html x64-windows/html/man3/i2d_ASN1_BIT_STRING.html x64-windows/html/man3/i2d_ASN1_BMPSTRING.html x64-windows/html/man3/i2d_ASN1_ENUMERATED.html x64-windows/html/man3/i2d_ASN1_GENERALIZEDTIME.html x64-windows/html/man3/i2d_ASN1_GENERALSTRING.html x64-windows/html/man3/i2d_ASN1_IA5STRING.html x64-windows/html/man3/i2d_ASN1_INTEGER.html x64-windows/html/man3/i2d_ASN1_NULL.html x64-windows/html/man3/i2d_ASN1_OBJECT.html x64-windows/html/man3/i2d_ASN1_OCTET_STRING.html x64-windows/html/man3/i2d_ASN1_PRINTABLE.html x64-windows/html/man3/i2d_ASN1_PRINTABLESTRING.html x64-windows/html/man3/i2d_ASN1_SEQUENCE_ANY.html x64-windows/html/man3/i2d_ASN1_SET_ANY.html x64-windows/html/man3/i2d_ASN1_T61STRING.html x64-windows/html/man3/i2d_ASN1_TIME.html x64-windows/html/man3/i2d_ASN1_TYPE.html x64-windows/html/man3/i2d_ASN1_UNIVERSALSTRING.html x64-windows/html/man3/i2d_ASN1_UTCTIME.html x64-windows/html/man3/i2d_ASN1_UTF8STRING.html x64-windows/html/man3/i2d_ASN1_VISIBLESTRING.html x64-windows/html/man3/i2d_ASN1_bio_stream.html x64-windows/html/man3/i2d_ASRange.html x64-windows/html/man3/i2d_AUTHORITY_INFO_ACCESS.html x64-windows/html/man3/i2d_AUTHORITY_KEYID.html x64-windows/html/man3/i2d_BASIC_CONSTRAINTS.html x64-windows/html/man3/i2d_CERTIFICATEPOLICIES.html x64-windows/html/man3/i2d_CMS_ContentInfo.html x64-windows/html/man3/i2d_CMS_ReceiptRequest.html x64-windows/html/man3/i2d_CMS_bio.html x64-windows/html/man3/i2d_CMS_bio_stream.html x64-windows/html/man3/i2d_CRL_DIST_POINTS.html x64-windows/html/man3/i2d_DHparams.html x64-windows/html/man3/i2d_DHxparams.html x64-windows/html/man3/i2d_DIRECTORYSTRING.html x64-windows/html/man3/i2d_DISPLAYTEXT.html x64-windows/html/man3/i2d_DIST_POINT.html x64-windows/html/man3/i2d_DIST_POINT_NAME.html x64-windows/html/man3/i2d_DSAPrivateKey.html x64-windows/html/man3/i2d_DSAPrivateKey_bio.html x64-windows/html/man3/i2d_DSAPrivateKey_fp.html x64-windows/html/man3/i2d_DSAPublicKey.html x64-windows/html/man3/i2d_DSA_PUBKEY.html x64-windows/html/man3/i2d_DSA_PUBKEY_bio.html x64-windows/html/man3/i2d_DSA_PUBKEY_fp.html x64-windows/html/man3/i2d_DSA_SIG.html x64-windows/html/man3/i2d_DSAparams.html x64-windows/html/man3/i2d_ECDSA_SIG.html x64-windows/html/man3/i2d_ECPKParameters.html x64-windows/html/man3/i2d_ECParameters.html x64-windows/html/man3/i2d_ECPrivateKey.html x64-windows/html/man3/i2d_ECPrivateKey_bio.html x64-windows/html/man3/i2d_ECPrivateKey_fp.html x64-windows/html/man3/i2d_EC_PUBKEY.html x64-windows/html/man3/i2d_EC_PUBKEY_bio.html x64-windows/html/man3/i2d_EC_PUBKEY_fp.html x64-windows/html/man3/i2d_EDIPARTYNAME.html x64-windows/html/man3/i2d_ESS_CERT_ID.html x64-windows/html/man3/i2d_ESS_ISSUER_SERIAL.html x64-windows/html/man3/i2d_ESS_SIGNING_CERT.html x64-windows/html/man3/i2d_EXTENDED_KEY_USAGE.html x64-windows/html/man3/i2d_GENERAL_NAME.html x64-windows/html/man3/i2d_GENERAL_NAMES.html x64-windows/html/man3/i2d_IPAddressChoice.html x64-windows/html/man3/i2d_IPAddressFamily.html x64-windows/html/man3/i2d_IPAddressOrRange.html x64-windows/html/man3/i2d_IPAddressRange.html x64-windows/html/man3/i2d_ISSUING_DIST_POINT.html x64-windows/html/man3/i2d_NAMING_AUTHORITY.html x64-windows/html/man3/i2d_NETSCAPE_CERT_SEQUENCE.html x64-windows/html/man3/i2d_NETSCAPE_SPKAC.html x64-windows/html/man3/i2d_NETSCAPE_SPKI.html x64-windows/html/man3/i2d_NOTICEREF.html x64-windows/html/man3/i2d_OCSP_BASICRESP.html x64-windows/html/man3/i2d_OCSP_CERTID.html x64-windows/html/man3/i2d_OCSP_CERTSTATUS.html x64-windows/html/man3/i2d_OCSP_CRLID.html x64-windows/html/man3/i2d_OCSP_ONEREQ.html x64-windows/html/man3/i2d_OCSP_REQINFO.html x64-windows/html/man3/i2d_OCSP_REQUEST.html x64-windows/html/man3/i2d_OCSP_RESPBYTES.html x64-windows/html/man3/i2d_OCSP_RESPDATA.html x64-windows/html/man3/i2d_OCSP_RESPID.html x64-windows/html/man3/i2d_OCSP_RESPONSE.html x64-windows/html/man3/i2d_OCSP_REVOKEDINFO.html x64-windows/html/man3/i2d_OCSP_SERVICELOC.html x64-windows/html/man3/i2d_OCSP_SIGNATURE.html x64-windows/html/man3/i2d_OCSP_SINGLERESP.html x64-windows/html/man3/i2d_OTHERNAME.html x64-windows/html/man3/i2d_PBE2PARAM.html x64-windows/html/man3/i2d_PBEPARAM.html x64-windows/html/man3/i2d_PBKDF2PARAM.html x64-windows/html/man3/i2d_PKCS12.html x64-windows/html/man3/i2d_PKCS12_BAGS.html x64-windows/html/man3/i2d_PKCS12_MAC_DATA.html x64-windows/html/man3/i2d_PKCS12_SAFEBAG.html x64-windows/html/man3/i2d_PKCS12_bio.html x64-windows/html/man3/i2d_PKCS12_fp.html x64-windows/html/man3/i2d_PKCS7.html x64-windows/html/man3/i2d_PKCS7_DIGEST.html x64-windows/html/man3/i2d_PKCS7_ENCRYPT.html x64-windows/html/man3/i2d_PKCS7_ENC_CONTENT.html x64-windows/html/man3/i2d_PKCS7_ENVELOPE.html x64-windows/html/man3/i2d_PKCS7_ISSUER_AND_SERIAL.html x64-windows/html/man3/i2d_PKCS7_NDEF.html x64-windows/html/man3/i2d_PKCS7_RECIP_INFO.html x64-windows/html/man3/i2d_PKCS7_SIGNED.html x64-windows/html/man3/i2d_PKCS7_SIGNER_INFO.html x64-windows/html/man3/i2d_PKCS7_SIGN_ENVELOPE.html x64-windows/html/man3/i2d_PKCS7_bio.html x64-windows/html/man3/i2d_PKCS7_bio_stream.html x64-windows/html/man3/i2d_PKCS7_fp.html x64-windows/html/man3/i2d_PKCS8PrivateKeyInfo_bio.html x64-windows/html/man3/i2d_PKCS8PrivateKeyInfo_fp.html x64-windows/html/man3/i2d_PKCS8PrivateKey_bio.html x64-windows/html/man3/i2d_PKCS8PrivateKey_fp.html x64-windows/html/man3/i2d_PKCS8PrivateKey_nid_bio.html x64-windows/html/man3/i2d_PKCS8PrivateKey_nid_fp.html x64-windows/html/man3/i2d_PKCS8_PRIV_KEY_INFO.html x64-windows/html/man3/i2d_PKCS8_PRIV_KEY_INFO_bio.html x64-windows/html/man3/i2d_PKCS8_PRIV_KEY_INFO_fp.html x64-windows/html/man3/i2d_PKCS8_bio.html x64-windows/html/man3/i2d_PKCS8_fp.html x64-windows/html/man3/i2d_PKEY_USAGE_PERIOD.html x64-windows/html/man3/i2d_POLICYINFO.html x64-windows/html/man3/i2d_POLICYQUALINFO.html x64-windows/html/man3/i2d_PROFESSION_INFO.html x64-windows/html/man3/i2d_PROXY_CERT_INFO_EXTENSION.html x64-windows/html/man3/i2d_PROXY_POLICY.html x64-windows/html/man3/i2d_PUBKEY.html x64-windows/html/man3/i2d_PUBKEY_bio.html x64-windows/html/man3/i2d_PUBKEY_fp.html x64-windows/html/man3/i2d_PrivateKey.html x64-windows/html/man3/i2d_PublicKey.html x64-windows/html/man3/i2d_RSAPrivateKey.html x64-windows/html/man3/i2d_RSAPrivateKey_bio.html x64-windows/html/man3/i2d_RSAPrivateKey_fp.html x64-windows/html/man3/i2d_RSAPublicKey.html x64-windows/html/man3/i2d_RSAPublicKey_bio.html x64-windows/html/man3/i2d_RSAPublicKey_fp.html x64-windows/html/man3/i2d_RSA_OAEP_PARAMS.html x64-windows/html/man3/i2d_RSA_PSS_PARAMS.html x64-windows/html/man3/i2d_RSA_PUBKEY.html x64-windows/html/man3/i2d_RSA_PUBKEY_bio.html x64-windows/html/man3/i2d_RSA_PUBKEY_fp.html x64-windows/html/man3/i2d_SCRYPT_PARAMS.html x64-windows/html/man3/i2d_SCT_LIST.html x64-windows/html/man3/i2d_SSL_SESSION.html x64-windows/html/man3/i2d_SXNET.html x64-windows/html/man3/i2d_SXNETID.html x64-windows/html/man3/i2d_TS_ACCURACY.html x64-windows/html/man3/i2d_TS_MSG_IMPRINT.html x64-windows/html/man3/i2d_TS_MSG_IMPRINT_bio.html x64-windows/html/man3/i2d_TS_MSG_IMPRINT_fp.html x64-windows/html/man3/i2d_TS_REQ.html x64-windows/html/man3/i2d_TS_REQ_bio.html x64-windows/html/man3/i2d_TS_REQ_fp.html x64-windows/html/man3/i2d_TS_RESP.html x64-windows/html/man3/i2d_TS_RESP_bio.html x64-windows/html/man3/i2d_TS_RESP_fp.html x64-windows/html/man3/i2d_TS_STATUS_INFO.html x64-windows/html/man3/i2d_TS_TST_INFO.html x64-windows/html/man3/i2d_TS_TST_INFO_bio.html x64-windows/html/man3/i2d_TS_TST_INFO_fp.html x64-windows/html/man3/i2d_USERNOTICE.html x64-windows/html/man3/i2d_X509.html x64-windows/html/man3/i2d_X509_ALGOR.html x64-windows/html/man3/i2d_X509_ALGORS.html x64-windows/html/man3/i2d_X509_ATTRIBUTE.html x64-windows/html/man3/i2d_X509_AUX.html x64-windows/html/man3/i2d_X509_CERT_AUX.html x64-windows/html/man3/i2d_X509_CINF.html x64-windows/html/man3/i2d_X509_CRL.html x64-windows/html/man3/i2d_X509_CRL_INFO.html x64-windows/html/man3/i2d_X509_CRL_bio.html x64-windows/html/man3/i2d_X509_CRL_fp.html x64-windows/html/man3/i2d_X509_EXTENSION.html x64-windows/html/man3/i2d_X509_EXTENSIONS.html x64-windows/html/man3/i2d_X509_NAME.html x64-windows/html/man3/i2d_X509_NAME_ENTRY.html x64-windows/html/man3/i2d_X509_PUBKEY.html x64-windows/html/man3/i2d_X509_REQ.html x64-windows/html/man3/i2d_X509_REQ_INFO.html x64-windows/html/man3/i2d_X509_REQ_bio.html x64-windows/html/man3/i2d_X509_REQ_fp.html x64-windows/html/man3/i2d_X509_REVOKED.html x64-windows/html/man3/i2d_X509_SIG.html x64-windows/html/man3/i2d_X509_VAL.html x64-windows/html/man3/i2d_re_X509_CRL_tbs.html x64-windows/html/man3/i2d_re_X509_REQ_tbs.html x64-windows/html/man3/i2d_re_X509_tbs.html x64-windows/html/man3/i2o_SCT.html x64-windows/html/man3/i2o_SCT_LIST.html x64-windows/html/man3/i2t_ASN1_OBJECT.html x64-windows/html/man3/lh_TYPE_delete.html x64-windows/html/man3/lh_TYPE_doall.html x64-windows/html/man3/lh_TYPE_doall_arg.html x64-windows/html/man3/lh_TYPE_error.html x64-windows/html/man3/lh_TYPE_free.html x64-windows/html/man3/lh_TYPE_insert.html x64-windows/html/man3/lh_TYPE_new.html x64-windows/html/man3/lh_TYPE_retrieve.html x64-windows/html/man3/o2i_SCT.html x64-windows/html/man3/o2i_SCT_LIST.html x64-windows/html/man3/pem_password_cb.html x64-windows/html/man3/sk_TYPE_deep_copy.html x64-windows/html/man3/sk_TYPE_delete.html x64-windows/html/man3/sk_TYPE_delete_ptr.html x64-windows/html/man3/sk_TYPE_dup.html x64-windows/html/man3/sk_TYPE_find.html x64-windows/html/man3/sk_TYPE_find_ex.html x64-windows/html/man3/sk_TYPE_free.html x64-windows/html/man3/sk_TYPE_insert.html x64-windows/html/man3/sk_TYPE_is_sorted.html x64-windows/html/man3/sk_TYPE_new.html x64-windows/html/man3/sk_TYPE_new_null.html x64-windows/html/man3/sk_TYPE_new_reserve.html x64-windows/html/man3/sk_TYPE_num.html x64-windows/html/man3/sk_TYPE_pop.html x64-windows/html/man3/sk_TYPE_pop_free.html x64-windows/html/man3/sk_TYPE_push.html x64-windows/html/man3/sk_TYPE_reserve.html x64-windows/html/man3/sk_TYPE_set.html x64-windows/html/man3/sk_TYPE_set_cmp_func.html x64-windows/html/man3/sk_TYPE_shift.html x64-windows/html/man3/sk_TYPE_sort.html x64-windows/html/man3/sk_TYPE_unshift.html x64-windows/html/man3/sk_TYPE_value.html x64-windows/html/man3/sk_TYPE_zero.html x64-windows/html/man3/ssl_ct_validation_cb.html x64-windows/html/man5/ x64-windows/html/man5/config.html x64-windows/html/man5/x509v3_config.html x64-windows/html/man7/ x64-windows/html/man7/Ed25519.html x64-windows/html/man7/Ed448.html x64-windows/html/man7/RAND.html x64-windows/html/man7/RAND_DRBG.html x64-windows/html/man7/RSA-PSS.html x64-windows/html/man7/SM2.html x64-windows/html/man7/X25519.html x64-windows/html/man7/X448.html x64-windows/html/man7/bio.html x64-windows/html/man7/crypto.html x64-windows/html/man7/ct.html x64-windows/html/man7/des_modes.html x64-windows/html/man7/evp.html x64-windows/html/man7/ossl_store-file.html x64-windows/html/man7/ossl_store.html x64-windows/html/man7/passphrase-encoding.html x64-windows/html/man7/scrypt.html x64-windows/html/man7/ssl.html x64-windows/html/man7/x509.html x64-windows/include/ x64-windows/include/openssl/ x64-windows/include/openssl/__DECC_INCLUDE_EPILOGUE.H x64-windows/include/openssl/__DECC_INCLUDE_PROLOGUE.H x64-windows/include/openssl/aes.h x64-windows/include/openssl/applink.c x64-windows/include/openssl/asn1.h x64-windows/include/openssl/asn1_mac.h x64-windows/include/openssl/asn1err.h x64-windows/include/openssl/asn1t.h x64-windows/include/openssl/async.h x64-windows/include/openssl/asyncerr.h x64-windows/include/openssl/bio.h x64-windows/include/openssl/bioerr.h x64-windows/include/openssl/blowfish.h x64-windows/include/openssl/bn.h x64-windows/include/openssl/bnerr.h x64-windows/include/openssl/buffer.h x64-windows/include/openssl/buffererr.h x64-windows/include/openssl/camellia.h x64-windows/include/openssl/cast.h x64-windows/include/openssl/cmac.h x64-windows/include/openssl/cms.h x64-windows/include/openssl/cmserr.h x64-windows/include/openssl/comp.h x64-windows/include/openssl/comperr.h x64-windows/include/openssl/conf.h x64-windows/include/openssl/conf_api.h x64-windows/include/openssl/conferr.h x64-windows/include/openssl/crypto.h x64-windows/include/openssl/cryptoerr.h x64-windows/include/openssl/ct.h x64-windows/include/openssl/cterr.h x64-windows/include/openssl/des.h x64-windows/include/openssl/dh.h x64-windows/include/openssl/dherr.h x64-windows/include/openssl/dsa.h x64-windows/include/openssl/dsaerr.h x64-windows/include/openssl/dtls1.h x64-windows/include/openssl/e_os2.h x64-windows/include/openssl/ebcdic.h x64-windows/include/openssl/ec.h x64-windows/include/openssl/ecdh.h x64-windows/include/openssl/ecdsa.h x64-windows/include/openssl/ecerr.h x64-windows/include/openssl/engine.h x64-windows/include/openssl/engineerr.h x64-windows/include/openssl/err.h x64-windows/include/openssl/evp.h x64-windows/include/openssl/evperr.h x64-windows/include/openssl/hmac.h x64-windows/include/openssl/idea.h x64-windows/include/openssl/kdf.h x64-windows/include/openssl/kdferr.h x64-windows/include/openssl/lhash.h x64-windows/include/openssl/md2.h x64-windows/include/openssl/md4.h x64-windows/include/openssl/md5.h x64-windows/include/openssl/mdc2.h x64-windows/include/openssl/modes.h x64-windows/include/openssl/obj_mac.h x64-windows/include/openssl/objects.h x64-windows/include/openssl/objectserr.h x64-windows/include/openssl/ocsp.h x64-windows/include/openssl/ocsperr.h x64-windows/include/openssl/opensslconf.h x64-windows/include/openssl/opensslv.h x64-windows/include/openssl/ossl_typ.h x64-windows/include/openssl/pem.h x64-windows/include/openssl/pem2.h x64-windows/include/openssl/pemerr.h x64-windows/include/openssl/pkcs12.h x64-windows/include/openssl/pkcs12err.h x64-windows/include/openssl/pkcs7.h x64-windows/include/openssl/pkcs7err.h x64-windows/include/openssl/rand.h x64-windows/include/openssl/rand_drbg.h x64-windows/include/openssl/randerr.h x64-windows/include/openssl/rc2.h x64-windows/include/openssl/rc4.h x64-windows/include/openssl/rc5.h x64-windows/include/openssl/ripemd.h x64-windows/include/openssl/rsa.h x64-windows/include/openssl/rsaerr.h x64-windows/include/openssl/safestack.h x64-windows/include/openssl/seed.h x64-windows/include/openssl/sha.h x64-windows/include/openssl/srp.h x64-windows/include/openssl/srtp.h x64-windows/include/openssl/ssl.h x64-windows/include/openssl/ssl2.h x64-windows/include/openssl/ssl3.h x64-windows/include/openssl/sslerr.h x64-windows/include/openssl/stack.h x64-windows/include/openssl/store.h x64-windows/include/openssl/storeerr.h x64-windows/include/openssl/symhacks.h x64-windows/include/openssl/tls1.h x64-windows/include/openssl/ts.h x64-windows/include/openssl/tserr.h x64-windows/include/openssl/txt_db.h x64-windows/include/openssl/ui.h x64-windows/include/openssl/uierr.h x64-windows/include/openssl/whrlpool.h x64-windows/include/openssl/x509.h x64-windows/include/openssl/x509_vfy.h x64-windows/include/openssl/x509err.h x64-windows/include/openssl/x509v3.h x64-windows/include/openssl/x509v3err.h x64-windows/lib/ x64-windows/lib/libcrypto.lib x64-windows/lib/libssl.lib x64-windows/misc/ x64-windows/misc/CA.pl x64-windows/misc/tsget.pl x64-windows/share/ x64-windows/share/openssl-windows/ x64-windows/share/openssl-windows/copyright x64-windows/share/openssl-windows/usage x64-windows/share/openssl-windows/vcpkg_abi_info.txt x64-windows/tools/ x64-windows/tools/openssl/ x64-windows/tools/openssl/libcrypto-1_1-x64.dll x64-windows/tools/openssl/libssl-1_1-x64.dll x64-windows/tools/openssl/openssl.cnf x64-windows/tools/openssl/openssl.exe Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/openssl_1.1.1d_x64-windows.list000644 000000 000000 00000000210 14710030646 030133 0ustar00rootroot000000 000000 x64-windows/ x64-windows/share/ x64-windows/share/openssl/ x64-windows/share/openssl/usage x64-windows/share/openssl/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/xxhash_0.7.0_x64-windows.list000644 000000 000000 00000000611 14710030646 027620 0ustar00rootroot000000 000000 x64-windows/ x64-windows/debug/ x64-windows/debug/lib/ x64-windows/debug/lib/xxhash.lib x64-windows/include/ x64-windows/include/xxhash.h x64-windows/lib/ x64-windows/lib/xxhash.lib x64-windows/share/ x64-windows/share/man/ x64-windows/share/man/man1/ x64-windows/share/man/man1/xxhsum.1 x64-windows/share/xxhash/ x64-windows/share/xxhash/copyright x64-windows/share/xxhash/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/info/zlib_1.2.11-6_x64-windows.list000644 000000 000000 00000000774 14710030646 027510 0ustar00rootroot000000 000000 x64-windows/ x64-windows/bin/ x64-windows/bin/zlib.pdb x64-windows/bin/zlib1.dll x64-windows/debug/ x64-windows/debug/bin/ x64-windows/debug/bin/zlibd.pdb x64-windows/debug/bin/zlibd1.dll x64-windows/debug/lib/ x64-windows/debug/lib/zlibd.lib x64-windows/include/ x64-windows/include/zconf.h x64-windows/include/zlib.h x64-windows/lib/ x64-windows/lib/zlib.lib x64-windows/share/ x64-windows/share/zlib/ x64-windows/share/zlib/copyright x64-windows/share/zlib/usage x64-windows/share/zlib/vcpkg_abi_info.txt Alien-Build-2.84/corpus/vcpkg/r2/installed/vcpkg/status000644 000000 000000 00000012563 14710030646 023031 0ustar00rootroot000000 000000 Package: libffi Version: 3.3 Architecture: x64-windows Multi-Arch: same Abi: 712ed0e4431b356d2392012a2d8963da19ddb7e0 Description: Portable, high level programming interface to various calling conventions Type: Port Status: install ok installed Package: zlib Version: 1.2.11-6 Architecture: x64-windows Multi-Arch: same Abi: 00662fc5e607fe54d2ed6002f3b3dffb70e43561 Description: A compression library Type: Port Status: install ok installed Package: curl Version: 7.68.0-1 Depends: zlib Architecture: x64-windows Multi-Arch: same Abi: 66aaac54c2d8530c7763a75d644cc7630e994121 Description: A library for transferring data with URLs Type: Port Status: install ok installed Package: curl Feature: non-http Architecture: x64-windows Multi-Arch: same Description: Enables protocols beyond HTTP/HTTPS/HTTP2 Type: Port Status: install ok installed Package: curl Feature: ssl Depends: curl Architecture: x64-windows Multi-Arch: same Description: Default SSL backend Type: Port Status: install ok installed Package: curl Feature: winssl Architecture: x64-windows Multi-Arch: same Description: SSL support (Secure Channel / "WinSSL") Type: Port Status: install ok installed Package: bzip2 Version: 1.0.6-5 Architecture: x64-windows Multi-Arch: same Abi: 72ba4da48d5d2a5960f2b4f30285ed1e005742d9 Description: High-quality data compressor. Type: Port Status: install ok installed Package: liblzma Version: 5.2.4-4 Architecture: x64-windows Multi-Arch: same Abi: efe52e2ddcd9df4d5c6ee758cd0ddbad199282b4 Description: Compression library with an API similar to that of zlib. Type: Port Status: install ok installed Package: libiconv Version: 1.16-1 Architecture: x64-windows Multi-Arch: same Abi: 8e01c6a6ffa478cd7282a38ad4d9e33c741b2248 Description: GNU Unicode text conversion Type: Port Status: install ok installed Package: libxml2 Version: 2.9.9-5 Depends: libiconv, liblzma, zlib Architecture: x64-windows Multi-Arch: same Abi: 28184c787b852db2b039ed16d9bfee7c7ad018fb Description: Libxml2 is the XML C parser and toolkit developed for the Gnome project (but usable outside of the Gnome platform) Type: Port Status: install ok installed Package: xxhash Version: 0.7.0 Architecture: x64-windows Multi-Arch: same Abi: 73001da5f2bec5955370df0528e1e4c42c850aea Description: Extremely fast hash algorithm Type: Port Status: install ok installed Package: lz4 Version: 1.9.2 Depends: xxhash Architecture: x64-windows Multi-Arch: same Abi: a34260c765ccbabb88be0ad1e22db197ef3fa9d1 Description: Lossless compression algorithm, providing compression speed at 400 MB/s per core. Type: Port Status: install ok installed Package: lzo Version: 2.10-4 Architecture: x64-windows Multi-Arch: same Abi: 4462822fd6949c570d995ff53b3dcc176f776e96 Description: Lossless data compression library Type: Port Status: install ok installed Package: openssl-windows Version: 1.1.1d-1 Architecture: x64-windows Multi-Arch: same Abi: b60d9e665f44db8f1ecf46999d3a119a60cf85bf Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. Type: Port Status: install ok installed Package: openssl Version: 1.1.1d Depends: openssl-windows Architecture: x64-windows Multi-Arch: same Abi: 4ba25726d4eb953d9f9051f22b6336586169ee79 Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. Type: Port Status: install ok installed Package: libarchive Version: 3.4.1 Depends: zlib Architecture: x64-windows Multi-Arch: same Abi: ba1215581a0d9c103604109cfeb3f92673b9754d Description: Library for reading and writing streaming archives Type: Port Status: install ok installed Package: libarchive Feature: bzip2 Depends: bzip2 Architecture: x64-windows Multi-Arch: same Description: BZip2 support Type: Port Status: install ok installed Package: libarchive Feature: libxml2 Depends: libxml2 Architecture: x64-windows Multi-Arch: same Description: Libxml2 support Type: Port Status: install ok installed Package: libarchive Feature: lz4 Depends: lz4 Architecture: x64-windows Multi-Arch: same Description: LZ4 support Type: Port Status: install ok installed Package: libarchive Feature: lzma Depends: liblzma Architecture: x64-windows Multi-Arch: same Description: LZMA support Type: Port Status: install ok installed Package: libarchive Feature: lzo Depends: lzo Architecture: x64-windows Multi-Arch: same Description: LZO support Type: Port Status: install ok installed Package: libarchive Feature: openssl Depends: openssl Architecture: x64-windows Multi-Arch: same Description: OpenSSL support Type: Port Status: install ok installed Package: libressl Version: 2.9.1-2 Architecture: x64-windows Multi-Arch: same Abi: faa3fe00496397545d489c14b1a14c25143d91bd Description: LibreSSL is a version of the TLS/crypto stack forked from OpenSSL in 2014, with goals of modernizing the codebase, improving security, and applying best practice development processes. Type: Port Status: install ok installed Package: libffi Version: 3.3 Architecture: x86-windows Multi-Arch: same Abi: 26fac73eca7ab28cad695055b44f461dace1fc39 Description: Portable, high level programming interface to various calling conventions Type: Port Status: install ok installed Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/000755 000000 000000 00000000000 14710030646 022553 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/bin/000755 000000 000000 00000000000 14710030646 023323 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/bin/libffi.dll000644 000000 000000 00000000000 14710030646 025241 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/bin/libffi.pdb000644 000000 000000 00000000000 14710030646 025233 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/debug/000755 000000 000000 00000000000 14710030646 023641 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/debug/bin/000755 000000 000000 00000000000 14710030646 024411 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/debug/bin/libffi.dll000644 000000 000000 00000000000 14710030646 026327 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/debug/bin/libffi.pdb000644 000000 000000 00000000000 14710030646 026321 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/debug/lib/000755 000000 000000 00000000000 14710030646 024407 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/debug/lib/libffi.lib000644 000000 000000 00000000000 14710030646 026320 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/include/000755 000000 000000 00000000000 14710030646 024176 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/include/ffi.h000644 000000 000000 00000000000 14710030646 025101 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/include/ffitarget.h000644 000000 000000 00000000000 14710030646 026310 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/lib/000755 000000 000000 00000000000 14710030646 023321 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/lib/libffi.lib000644 000000 000000 00000000000 14710030646 025232 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/share/000755 000000 000000 00000000000 14710030646 023655 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/share/libffi/000755 000000 000000 00000000000 14710030646 025110 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/share/libffi/copyright000644 000000 000000 00000000000 14710030646 027031 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/share/libffi/libffiConfig.cmake000644 000000 000000 00000000000 14710030646 030461 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/share/libffi/libffiConfigVersion.cmake000644 000000 000000 00000000000 14710030646 032027 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/share/libffi/libffiTargets-debug.cmake000644 000000 000000 00000000000 14710030646 031751 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/share/libffi/libffiTargets-release.cmake000644 000000 000000 00000000000 14710030646 032303 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/share/libffi/libffiTargets.cmake000644 000000 000000 00000000000 14710030646 030665 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x64-windows/share/libffi/vcpkg_abi_info.txt000644 000000 000000 00000000000 14710030646 030577 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/000755 000000 000000 00000000000 14710030646 022557 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/bin/000755 000000 000000 00000000000 14710030646 023327 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/bin/libffi.dll000644 000000 000000 00000000000 14710030646 025245 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/bin/libffi.pdb000644 000000 000000 00000000000 14710030646 025237 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/debug/000755 000000 000000 00000000000 14710030646 023645 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/debug/bin/000755 000000 000000 00000000000 14710030646 024415 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/debug/bin/libffi.dll000644 000000 000000 00000000000 14710030646 026333 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/debug/bin/libffi.pdb000644 000000 000000 00000000000 14710030646 026325 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/debug/lib/000755 000000 000000 00000000000 14710030646 024413 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/debug/lib/libffi.lib000644 000000 000000 00000000000 14710030646 026324 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/include/000755 000000 000000 00000000000 14710030646 024202 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/include/ffi.h000644 000000 000000 00000000000 14710030646 025105 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/include/ffitarget.h000644 000000 000000 00000000000 14710030646 026314 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/lib/000755 000000 000000 00000000000 14710030646 023325 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/lib/libffi.lib000644 000000 000000 00000000000 14710030646 025236 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/share/000755 000000 000000 00000000000 14710030646 023661 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/share/libffi/000755 000000 000000 00000000000 14710030646 025114 5ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/share/libffi/copyright000644 000000 000000 00000000000 14710030646 027035 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/share/libffi/libffiConfig.cmake000644 000000 000000 00000000000 14710030646 030465 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/share/libffi/libffiConfigVersion.cmake000644 000000 000000 00000000000 14710030646 032033 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/share/libffi/libffiTargets-debug.cmake000644 000000 000000 00000000000 14710030646 031755 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/share/libffi/libffiTargets-release.cmake000644 000000 000000 00000000000 14710030646 032307 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/share/libffi/libffiTargets.cmake000644 000000 000000 00000000000 14710030646 030671 0ustar00rootroot000000 000000 Alien-Build-2.84/corpus/vcpkg/r2/installed/x86-windows/share/libffi/vcpkg_abi_info.txt000644 000000 000000 00000000000 14710030646 030603 0ustar00rootroot000000 000000 Alien-Build-2.84/dist.ini000644 000000 000000 00000017655 14710030646 015175 0ustar00rootroot000000 000000 name = Alien-Build author = Graham Ollis author = Joel Berger license = Perl_5 copyright_holder = Graham Ollis copyright_year = 2011-2022 version = 2.84 [@Author::Plicease] :version = 2.75 release_tests = 1 installer = Author::Plicease::MakeMaker github_user = PerlAlien github_repo = Alien-Build irc = irc://irc.perl.org/#native diag = +FFI::Platypus diag = +Acme::Alien::DontPanic diag = +Plack test2_v0 = 1 clean_keep = ^corpus workflow = static workflow = linux workflow = macos workflow = windows workflow = msys2-mingw preamble = | require './inc/probebad.pl'; diag_preamble = | $post_diag = sub { diag_preamble = | eval { diag_preamble = | require Alien::Build::Plugin::Core::Setup; diag_preamble = | require Alien::Build::Plugin::Build::Autoconf; diag_preamble = | require Alien::Build::Plugin::Build::CMake; diag_preamble = | require Alien::Build::Plugin::PkgConfig::Negotiate; diag_preamble = | require Alien::Build::Util; diag_preamble = | require File::Which; diag_preamble = | }; diag_preamble = | if($@) diag_preamble = | { diag_preamble = | diag "error: $@"; diag_preamble = | } diag_preamble = | else diag_preamble = | { diag_preamble = | my %hash; diag_preamble = | Alien::Build::Plugin::Core::Setup->_platform(\%hash); diag_preamble = | $hash{cmake_generator} = Alien::Build::Plugin::Build::CMake::cmake_generator(); diag_preamble = | $hash{'pkg-config'}->{$_} = File::Which::which($_) for qw( pkg-config pkgconf ); diag_preamble = | $hash{'pkg-config'}->{PKG_CONFIG} = File::Which::which($ENV{PKG_CONFIG}) if defined $ENV{PKG_CONFIG}; diag_preamble = | diag Alien::Build::Util::_dump(\%hash); diag_preamble = | diag "pkg-config negotiate pick = ", Alien::Build::Plugin::PkgConfig::Negotiate->pick; diag_preamble = | diag ''; diag_preamble = | diag ''; diag_preamble = | diag "[config.site]"; diag_preamble = | diag(Alien::Build::Plugin::Build::Autoconf->new->config_site); diag_preamble = | } diag_preamble = | }; diag = +YAML diag = +PkgConfig diag = +PkgConfig::LibPkgConf diag = +Net::FTP diag = +URI diag = +Sort::Versions daig = +File::Listing diag = +HTTP::Tiny diag = +HTML::Parser diag = +LWP diag = +File::Listing diag = +File::Listing::Ftpcopy diag = +Alien::Base::ModuleBuild diag = +IO::Zlib diag = +IO::Uncompress::Bunzip2 diag = +IO::Compress::Bzip2 diag = +Alien::xz diag = +Alien::Libbz2 diag = +Alien::gzip diag = +IO::Socket::SSL diag = +Net::SSLeay diag = +LWP::Protocol::https diag = +Alien::cmake3 diag = +Readonly diag = +Env::ShellWords diag = +Mojo::DOM58 diag = +Mojolicious diag = +Archive::Zip [GatherFile] filename = corpus/vcpkg/r1/.vcpkg-root filename = corpus/vcpkg/r2/.vcpkg-root [RemovePrereqs] ; core pragma remove = strict remove = warnings remove = lib remove = constant remove = overload remove = if remove = utf8 ; core modules remove = Exporter remove = Data::Dumper remove = Carp remove = File::Temp remove = Getopt::Long remove = IO::Socket::INET remove = File::Basename remove = File::Copy remove = Scalar::Util remove = Storable remove = Env remove = File::Find remove = File::Glob remove = File::Path remove = File::Spec remove = DynaLoader remove = XSLoader remove = Term::ANSIColor ; optional for Test::Alien remove = FFI::Platypus remove = Acme::Alien::DontPanic ; corpus remove = Alien::Build::Plugin::RogerRamjet remove = Alien::Build::Plugin::Fetch::Corpus remove = Alien::Foo remove = Alien::libfoo1 remove = Alien::libfoo2 remove = Alien::libfoo3 remove = Alien::perlhelp ; ABMB remove = Alien::Base::ModuleBuild remove = Alien::Base::PkgConfig ; pulled in dynamically as needed remove = Alien::MSYS remove = URI remove = URI::file remove = Net::FTP remove = HTTP::Tiny remove = Sort::Versions remove = File::Listing remove = File::Listing::Ftpcopy remove = HTML::LinkExtor remove = LWP remove = LWP::UserAgent remove = PkgConfig remove = PkgConfig::LibPkgConf remove = PkgConfig::LibPkgConf::Client remove = PkgConfig::LibPkgConf::Util remove = Win32::Vcpkg remove = Win32::Vcpkg::List remove = Win32::Vcpkg::Package ; only optionally used in diagnostics ; for tests remove = YAML ; only used for developer testing remove = AnyEvent remove = AnyEvent::FTP::Server remove = EV remove = Proc::Daemon remove = Mojolicious remove = Mojolicious::Lite remove = Mojo::DOM remove = Mojo::DOM58 remove = Mojo::JSON remove = Mojo::URL remove = HTTP::Server::PSGI remove = Plack::App::Directory remove = Plack::Builder remove = Plack remove = URI::Escape ; other optional / dynamic thingies remove = Archive::Tar remove = Archive::Zip remove = Alien::gmake remove = Alien::cmake3 remove = Devel::Hide remove = Net::SSLeay remove = IO::Socket::SSL remove = Env::ShellWords remove = Readonly [Prereqs] Capture::Tiny = 0.17 Path::Tiny = 0.077 FFI::CheckLib = 0.11 Text::ParseWords = 3.26 ExtUtils::ParseXS = 3.30 ExtUtils::MakeMaker = 6.64 parent = 0 [Prereqs / ConfigureRequires] -phase = configure ExtUtils::CBuilder = 0 ExtUtils::ParseXS = 3.30 File::Which = 0 ExtUtils::MakeMaker = 6.64 [Prereqs / BuildRequires] -phase = build ExtUtils::MakeMaker = 6.64 [Prereqs / TestSuggestRequires] -phase = test -relationship = suggests Devel::Hide = 0 [Prereqs / SuggestsRequires] -relationship = suggests Archive::Tar = 0 [Author::Plicease::Upload] cpan = 1 [PruneFiles] match = ^t/bin/.*\.log$ match = ^t/bin/.*\.json$ match = ^example/Alien- match = ^corpus/alien_build_plugin_fetch_curlcommand/record/new\. match = ^corpus/alien_build_plugin_fetch_wget/record/new\. match = ^test-logs/ match = ^testalien match = ^t/cip/ match = ^.tmp/ match = \.old$ filename = xt/author/pod_spelling_common.t filename = xt/author/strict.t [MetaNoIndex] directory = corpus directory = example directory = maint ;; TODO: convert these to inc/mymm.pl so that we can avoid ;; extra prereqs [DynamicPrereqs / PkgConfigPM] -condition = !do { require File::Which; ($ENV{PKG_CONFIG} && File::Which::which($ENV{PKG_CONFIG})) || File::Which::which('pkgconf') || File::Which::which('pkg-config') } -body = requires('PkgConfig' => '0.14026' ); # for static cflags support [DynamicPrereqs / PkgConfigPMSolaris] -condition = do { use Config; ($^O eq 'solaris' && $Config{ptrsize} == 8) || $^O eq 'MSWin32' } -body = requires('PkgConfig' => '0.14026' ); # for using the wrong libraries support [DynamicPrereqs / CleanupDotTmp] -raw = $WriteMakefileArgs{clean} = {FILES => ".tmp"}; [DynamicPrereqs / Vcpkg] -condition = do { use Config; $^O eq 'MSWin32' && $Config{ccname} eq 'cl' } -body = requires('Win32::Vcpkg' => '0.04'); [Author::Plicease::Thanks] current = Graham Ollis ; if you have a preference for how to display your name ; feel free send a PR. I don't use the git hisory. contributor = Diab Jerius (DJERIUS) contributor = Roy Storey (KIWIROY) contributor = Ilya Pavlov contributor = David Mertens (run4flat) contributor = Mark Nunberg (mordy, mnunberg) contributor = Christian Walde (Mithaldu) contributor = Brian Wightman (MidLifeXis) contributor = Zaki Mughal (zmughal) contributor = mohawk (mohawk2, ETJ) contributor = Vikas N Kumar (vikasnkumar) contributor = Flavio Poletti (polettix) contributor = Salvador Fandiño (salva) contributor = Gianni Ceccarelli (dakkar) contributor = Pavel Shaydo (zwon, trinitum) contributor = Kang-min Liu (劉康民, gugod) contributor = Nicholas Shipp (nshp) contributor = Juan Julián Merelo Guervós (JJ) contributor = Joel Berger (JBERGER) contributor = Petr PísaÅ™ (ppisar) contributor = Lance Wicks (LANCEW) contributor = Ahmad Fatoum (a3f, ATHREEF) contributor = José Joaquín Atria (JJATRIA) contributor = Duke Leto (LETO) contributor = Shoichi Kaji (SKAJI) contributor = Shawn Laffan (SLAFFAN) contributor = Paul Evans (leonerd, PEVANS) contributor = HÃ¥kon Hægland (hakonhagland, HAKONH) contributor = nick nauwelaerts (INPHOBIA) contributor = Florian Weimer Alien-Build-2.84/example/000755 000000 000000 00000000000 14710030646 015146 5ustar00rootroot000000 000000 Alien-Build-2.84/example/README000644 000000 000000 00000000657 14710030646 016036 0ustar00rootroot000000 000000 =pod In this directory are some example Ls. You can test them with the L command if you have L installed. For example: % af install --prefix=/tmp/foo -f xz.alienfile If you want to force a C install you can use the C<--type> option: % af install --type=share --prefix=/tmp/foo -f xz.alienfile For more details on what you can do with the L command, please see its documentation. =cut Alien-Build-2.84/example/bzip2.alienfile000644 000000 000000 00000006747 14710030646 020064 0ustar00rootroot000000 000000 use alienfile; use Path::Tiny qw( path ); # Because bzip2 does not come with a pkg-config compatible .pc file # we use the CBuilder plugin to guess the appropriate flags # (usually just libs=-lbz2): plugin 'Probe::CBuilder' => ( libs => '-lbz2', # The version regex here will attempt to parse out the # bzip2 version number from the output of the test program below. version => qr/version = '(.*?)[,']/, # Both the test program and the version regex are optional, but # if you do not provide them, then you should provide a # sys { gather } declaration for how to obtain the version number. # assuming the version number matters. program => q{ #include #include int main(int argc, char *argv[]) { printf("version = '%s'\n", BZ2_bzlibVersion()); return 0; } }, ); # in addition to the library, we require that the bzip2 command # is also available. plugin 'Probe::CommandLine' => ( command => 'bzip2', secondary => 1, ); share { # items in the share block relate to building the package # from source. It is called share because it will be # installed into a dist level share directory in your # perl lib. # The Build::MSYS plugin just makes sure that Alien::MSYS # is used to provide the necessary tools on Windows. It # doesn't do anything on other platforms. plugin 'Build::MSYS'; # The Download negotiator picks the best method for # downloading the package. plugin 'Download' => ( url => 'https://sourceforge.net/projects/bzip2/files/latest/download', ); # The Extract negotiator picks the best method for # extracting from the tarball. We give it a hint # here that we expect the tarball to be .gz compressed # in case it needs to load extra modules to # decompress. plugin Extract => 'tar.gz'; # The build stage here is specified as a series of commands. # bzip2 uses make to build and install. It is vital that we # include cccdlflags in the compiler flags, because this will # include any flags necessary for making the library relocatable # which we need to link into a Perl XS .so file. # We also use CC=$Config{cc} to make sure that we use the # same compiler as was used to build Perl. build [ [ '%{make}', 'all', "CC=%{perl.config.cc}", "CFLAGS=%{perl.config.cccdlflags} %{perl.config.optimize}", ], [ '%{make}', 'install', 'PREFIX=%{.install.prefix}', ], # we can use a code ref here to determine the version number of # bzip2 from the directory that is extracted from the tarball. # Usually this is something like bzip2-1.0.6 and we just parse # off the bit that looks like a version number. sub { my($build) = @_; my($version) = path(".")->absolute->basename =~ /([0-9\.]+)$/; $build->runtime_prop->{version} = $version; }, ]; # This package doesn't build a dynamic library by default, but if # it did this would make sure that it wasn't used with XS. # (See Alien::Build::Manual::AlienAuthor for details). plugin 'Gather::IsolateDynamic'; # The gather stage determines the appropriate cflags and libs for # using the library that we just built. gather sub { my($build) =@_; my $prefix = $build->runtime_prop->{prefix}; $build->runtime_prop->{cflags} = "-I$prefix/include"; $build->runtime_prop->{cflags_static} = "-I$prefix/include"; $build->runtime_prop->{libs} = "-L$prefix/lib -lbz2"; $build->runtime_prop->{libs_static} = "-L$prefix/lib -lbz2"; }; }; Alien-Build-2.84/example/curl.alienfile000644 000000 000000 00000003547 14710030646 017776 0ustar00rootroot000000 000000 use alienfile; # PkgConfig uses the pkg-config negotiator to pick the best # available implementation (as of this writing, in order: # libpkgconf, pkg-config, PkgConfig,pm), to determine # if the system already provides the library. In addition, # it gets the version, cflags and libs during either a # "system" or "share" install. plugin 'PkgConfig' => 'libcurl'; # in addition to the library, we require that the xz command # is also available. plugin 'Probe::CommandLine' => ( command => 'curl', secondary => 1, ); share { # items in the share block relate to building the package # from source. It is called share because it will be # installed into a dist level share directory in your # perl lib. # The Download negotiator picks the best method for # downloading the package. It uses the version # regex to parse out the version number from the # tarball so that it can pick the most recent # version. start_url 'https://curl.haxx.se/download/'; plugin Download => ( version => qr/^curl-([0-9\.]+)\.tar\.gz$/, ); # The Extract negotiator picks the best method for # extracting from the tarball. We give it a hint # here that we expect the tarball to be .gz compressed # in case it needs to load extra modules to # decompress. plugin Extract => 'tar.gz'; # The Autoconf plugin builds using the standard # configure and make tools. It uses a DESTDIR # ( https://www.gnu.org/prep/standards/html_node/DESTDIR.html ) # to ensure that the prefix during the build # (ie when you install the Alien::xz module) # matches the prefix during runtime # (ie when you use it from XZ::XS). plugin 'Build::Autoconf'; # This package doesn't build a dynamic library, but if # it did this would make sure that it wasn't used with XS. # (See Alien::Build::Manual::AlienAuthor for details). plugin 'Gather::IsolateDynamic'; }; Alien-Build-2.84/example/dontpanic.alienfile000644 000000 000000 00000000707 14710030646 021003 0ustar00rootroot000000 000000 use alienfile; probe sub { 'share' }; share { start_url 'https://github.com/PerlAlien/dontpanic.git'; download [ [ "git clone --bare %{.meta.start_url}" ] ]; extract [ [ "git clone %{.install.download}" ] ]; plugin 'Build::Autoconf'; plugin 'Gather::IsolateDynamic'; build [ 'git checkout 1.00', 'bash autogen.sh', '%{configure} --enable-static --enable-shared', '%{make}', '%{make} install', ]; }; Alien-Build-2.84/example/gmake.alienfile000644 000000 000000 00000005622 14710030646 020111 0ustar00rootroot000000 000000 use alienfile; use Capture::Tiny qw( capture ); configure { # Because we use Capture::Tiny in # the alienfile itself, we need to register it # as a configure time require (that is it needs # to be installed before we even attempt to load # this alienfile). requires 'Capture::Tiny'; }; # probe for GNU Make by trying the usual names for # it. Because 'make' could be some other make, we # try running it with --version and see if it looks # like the GNU version. plugin 'Probe::CommandLine' => ( command => $_, args => ['--version'], match => qr/GNU Make/, ) for qw( gmake make ); share { # items in the share block relate to building the package # from source. It is called share because it will be # installed into a dist level share directory in your # perl lib. # The Download negotiator picks the best method for # downloading the package. It uses the version # regex to parse out the version number from the # tarball so that it can pick the most recent # version. start_url 'http://ftp.gnu.org/gnu/make'; plugin 'Download' => ( version => qr/^make-([0-9\.]+)\.tar\.gz$/, ); # The Extract negotiator picks the best method for # extracting from the tarball. We give it a hint # here that we expect the tarball to be .gz compressed # in case it needs to load extra modules to # decompress. plugin 'Extract' => 'tar.gz'; # The Autoconf plugin builds using the standard # configure and make tools. It uses a DESTDIR # ( https://www.gnu.org/prep/standards/html_node/DESTDIR.html ) # to ensure that the prefix during the build # (ie when you install the Alien::xz module) # matches the prefix during runtime # (ie when you use it from XZ::XS). plugin 'Build::Autoconf'; # unlike the xz alienfile, we need to explicitly specify # the commands used to build. For this package it is # because we need to specify --program-prefix=g so that # the gmake executable will be 'gmake' and will not conflict # with the system provided 'make' which may not be compatible. build [ '%{configure} --program-prefix=g --disable-shared', '%{make}', '%{make} install', sub { my($build) = @_; $build->runtime_prop->{command} = 'gmake'; }, ]; # This package doesn't build a dynamic library, but if # it did this would make sure that it wasn't used with XS. # (See Alien::Build::Manual::AlienAuthor for details). plugin 'Gather::IsolateDynamic'; }; # For either a 'share' or 'system' install we try to get # the version number from make --version output. But if # for whatever reason we are not able to parse it out, it # is more important to just have gmake, so we will set # version to unknown. gather sub { my($build) = @_; my($stdout) = capture { system($build->runtime_prop->{command}, '--version'); }; my($version) = $stdout =~ /GNU Make ([0-9\.]+)/; $build->runtime_prop->{version} = $version || 'unknown'; }; Alien-Build-2.84/example/openssl.alienfile000644 000000 000000 00000003440 14710030646 020504 0ustar00rootroot000000 000000 use alienfile; plugin 'PkgConfig' => ( pkg_name => 'openssl', ); share { # when building OpenSSL from source we have a few challenges. # - AB uses Net::SSLeay (via HTTP::Tiny) by default when downloading https URLs # - Net::SSLeay requires OpenSSL # - We can download OpenSSL from FTP, but that is susceptible to man-in-the-middle attacks # (and that is a bad look for a security product) # Solution: # - try downloading with curl or wget via the 'bootstrap_ssl' option. # - if that doesn't work, fallback on FTP # - don't attempt FTP transfer if ALIEN_OPENSSL_FTP is set to 0 start_url 'https://www.openssl.org/source/'; plugin Download => ( version => qr/^openssl-([0-9\.]+[a-z]*)\.tar\.gz$/, bootstrap_ssl => 1, ); unless(meta->has_hook('fetch')) { my $ftp_ok = $ENV{ALIEN_OPENSSL_FTP}; $ftp_ok = 1 unless defined $ftp_ok; if($ftp_ok) { log(" ************************************************* "); log(" * WARNING downloading OpenSSL via FTP * "); log(" ************************************************* "); start_url 'ftp://ftp.openssl.org/source/'; plugin 'Fetch::NetFTP'; plugin 'Decode::DirListing'; } else { log("Unable to download OpenSSL via https without OpenSSL!"); log("Recommend installing wget or curl to bootstrap Alien::OpenSSL"); die "unable to download OpenSSL via https"; } } plugin 'Extract' => 'tar.gz'; build [ '%{perl} Configure --prefix=%{.install.prefix} no-shared cc', '%{make}', '%{make} install', ]; # This package doesn't build a dynamic library by default, but if # it did this would make sure that it wasn't used with XS. # (See Alien::Build::Manual::AlienAuthor for details). plugin 'Gather::IsolateDynamic'; }; Alien-Build-2.84/example/user/000755 000000 000000 00000000000 14710030646 016124 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/README000644 000000 000000 00000000271 14710030646 017004 0ustar00rootroot000000 000000 This directory contains examples of how to USE an Alien from another module. These examples use Alien::xz, which uses alienfile + Alien::Build + Alien::Base, and can be found on CPAN. Alien-Build-2.84/example/user/ffi-platypus/000755 000000 000000 00000000000 14710030646 020547 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/ffi-platypus/lib/000755 000000 000000 00000000000 14710030646 021315 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/ffi-platypus/lib/LZMA/000755 000000 000000 00000000000 14710030646 022060 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/ffi-platypus/lib/LZMA/Example.pm000644 000000 000000 00000000464 14710030646 024015 0ustar00rootroot000000 000000 package LZMA::Example; use strict; use warnings; use FFI::Platypus; use Alien::xz; use Exporter qw( import ); our $VERSION = '0.01'; our @EXPORT = qw( lzma_version_string ); my $ffi = FFI::Platypus->new( lib => [ Alien::xz->dynamic_libs ], ); $ffi->attach( lzma_version_string => [] => 'string' ); 1; Alien-Build-2.84/example/user/ffi-platypus/t/000755 000000 000000 00000000000 14710030646 021012 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/ffi-platypus/t/lzma_example.t000644 000000 000000 00000000225 14710030646 023654 0ustar00rootroot000000 000000 use Test2::V0; use LZMA::Example; my $version = lzma_version_string(); ok $version, 'returns a version'; note "version = $version"; done_testing; Alien-Build-2.84/example/user/inline-c/000755 000000 000000 00000000000 14710030646 017622 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/inline-c/lib/000755 000000 000000 00000000000 14710030646 020370 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/inline-c/lib/LZMA/000755 000000 000000 00000000000 14710030646 021133 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/inline-c/lib/LZMA/Example.pm000644 000000 000000 00000000526 14710030646 023067 0ustar00rootroot000000 000000 package LZMA::Example; use strict; use warnings; use Inline with => 'Alien::xz'; use Inline C => <<'END'; #include const char * _version_string() { return lzma_version_string(); } END use Exporter qw( import ); our $VERSION = '0.01'; our @EXPORT = qw( lzma_version_string ); sub lzma_version_string { _version_string(); } 1; Alien-Build-2.84/example/user/inline-c/t/000755 000000 000000 00000000000 14710030646 020065 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/inline-c/t/lzma_example.t000644 000000 000000 00000000225 14710030646 022727 0ustar00rootroot000000 000000 use Test2::V0; use LZMA::Example; my $version = lzma_version_string(); ok $version, 'returns a version'; note "version = $version"; done_testing; Alien-Build-2.84/example/user/tool/000755 000000 000000 00000000000 14710030646 017101 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/tool/lib/000755 000000 000000 00000000000 14710030646 017647 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/tool/lib/LZMA/000755 000000 000000 00000000000 14710030646 020412 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/tool/lib/LZMA/Example.pm000644 000000 000000 00000000604 14710030646 022343 0ustar00rootroot000000 000000 package LZMA::Example; use strict; use warnings; use Capture::Tiny qw( capture ); use Alien::xz; use Env qw( @PATH ); use Exporter qw( import ); our $VERSION = '0.01'; our @EXPORT = qw( lzma_version_string ); unshift @PATH, Alien::xz->bin_dir; sub lzma_version_string { my $out = capture { system 'xz', '--version' }; my($version) = $out =~ /liblzma ([0-9.]+)/; $version; } 1; Alien-Build-2.84/example/user/tool/t/000755 000000 000000 00000000000 14710030646 017344 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/tool/t/lzma_example.t000644 000000 000000 00000000225 14710030646 022206 0ustar00rootroot000000 000000 use Test2::V0; use LZMA::Example; my $version = lzma_version_string(); ok $version, 'returns a version'; note "version = $version"; done_testing; Alien-Build-2.84/example/user/xs-dzil/000755 000000 000000 00000000000 14710030646 017516 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-dzil/Example.xs000644 000000 000000 00000000236 14710030646 021466 0ustar00rootroot000000 000000 #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "lzma.h" MODULE = LZMA::Example PACKAGE = LZMA::Example const char * lzma_version_string() Alien-Build-2.84/example/user/xs-dzil/dist.ini000644 000000 000000 00000000565 14710030646 021170 0ustar00rootroot000000 000000 name = LZMA-Example version = 0.01 abstract = LZMA example [@Filter] -bundle = @Basic -remove = MakeMaker [Prereqs / ConfigureRequires] Alien::xz = 0.05 [MakeMaker::Awesome] header = use Config; header = use Alien::xz; WriteMakefile_arg = CCFLAGS => Alien::xz->cflags . ' ' . $Config{ccflags} WriteMakefile_arg = LIBS => [ Alien::xz->libs ] Alien-Build-2.84/example/user/xs-dzil/lib/000755 000000 000000 00000000000 14710030646 020264 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-dzil/lib/LZMA/000755 000000 000000 00000000000 14710030646 021027 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-dzil/lib/LZMA/Example.pm000644 000000 000000 00000000320 14710030646 022753 0ustar00rootroot000000 000000 package LZMA::Example; use strict; use warnings; use Exporter qw( import ); our $VERSION = '0.01'; our @EXPORT = qw( lzma_version_string ); require XSLoader; XSLoader::load('LZMA::Example', $VERSION); 1; Alien-Build-2.84/example/user/xs-dzil/t/000755 000000 000000 00000000000 14710030646 017761 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-dzil/t/lzma_example.t000644 000000 000000 00000000225 14710030646 022623 0ustar00rootroot000000 000000 use Test2::V0; use LZMA::Example; my $version = lzma_version_string(); ok $version, 'returns a version'; note "version = $version"; done_testing; Alien-Build-2.84/example/user/xs-mb/000755 000000 000000 00000000000 14710030646 017152 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-mb/Build.PL000644 000000 000000 00000000526 14710030646 020451 0ustar00rootroot000000 000000 use strict; use warnings; use Module::Build; use Alien::xz; my $build = Module::Build->new( module_name => 'LZMA::Example', dist_abstract => 'lzma example', configure_requires => { 'Alien::xz' => '0.05', }, extra_compiler_flags => Alien::xz->cflags, extra_linker_flags => Alien::xz->libs, ); $build->create_build_script; Alien-Build-2.84/example/user/xs-mb/lib/000755 000000 000000 00000000000 14710030646 017720 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-mb/lib/LZMA/000755 000000 000000 00000000000 14710030646 020463 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-mb/lib/LZMA/Example.pm000644 000000 000000 00000000320 14710030646 022407 0ustar00rootroot000000 000000 package LZMA::Example; use strict; use warnings; use Exporter qw( import ); our $VERSION = '0.01'; our @EXPORT = qw( lzma_version_string ); require XSLoader; XSLoader::load('LZMA::Example', $VERSION); 1; Alien-Build-2.84/example/user/xs-mb/lib/LZMA/Example.xs000644 000000 000000 00000000236 14710030646 022433 0ustar00rootroot000000 000000 #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "lzma.h" MODULE = LZMA::Example PACKAGE = LZMA::Example const char * lzma_version_string() Alien-Build-2.84/example/user/xs-mb/t/000755 000000 000000 00000000000 14710030646 017415 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-mb/t/lzma_example.t000644 000000 000000 00000000225 14710030646 022257 0ustar00rootroot000000 000000 use Test2::V0; use LZMA::Example; my $version = lzma_version_string(); ok $version, 'returns a version'; note "version = $version"; done_testing; Alien-Build-2.84/example/user/xs-mm/000755 000000 000000 00000000000 14710030646 017165 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-mm/Example.xs000644 000000 000000 00000000236 14710030646 021135 0ustar00rootroot000000 000000 #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "lzma.h" MODULE = LZMA::Example PACKAGE = LZMA::Example const char * lzma_version_string() Alien-Build-2.84/example/user/xs-mm/Makefile.PL000644 000000 000000 00000000520 14710030646 021134 0ustar00rootroot000000 000000 use strict; use warnings; use ExtUtils::MakeMaker; use Alien::Base::Wrapper qw( Alien::xz ); WriteMakefile( NAME => 'LZMA::Example', VERSION_FROM => 'lib/LZMA/Example.pm', CONFIGURE_REQUIRES => { 'ExtUtils::MakeMaker' => 6.52, 'Alien::xz' => '0.05', }, Alien::Base::Wrapper->mm_args, ); Alien-Build-2.84/example/user/xs-mm/lib/000755 000000 000000 00000000000 14710030646 017733 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-mm/lib/LZMA/000755 000000 000000 00000000000 14710030646 020476 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-mm/lib/LZMA/Example.pm000644 000000 000000 00000000320 14710030646 022422 0ustar00rootroot000000 000000 package LZMA::Example; use strict; use warnings; use Exporter qw( import ); our $VERSION = '0.01'; our @EXPORT = qw( lzma_version_string ); require XSLoader; XSLoader::load('LZMA::Example', $VERSION); 1; Alien-Build-2.84/example/user/xs-mm/t/000755 000000 000000 00000000000 14710030646 017430 5ustar00rootroot000000 000000 Alien-Build-2.84/example/user/xs-mm/t/lzma_example.t000644 000000 000000 00000000225 14710030646 022272 0ustar00rootroot000000 000000 use Test2::V0; use LZMA::Example; my $version = lzma_version_string(); ok $version, 'returns a version'; note "version = $version"; done_testing; Alien-Build-2.84/example/wrapper.pl000644 000000 000000 00000000513 14710030646 017162 0ustar00rootroot000000 000000 use strict; use warnings; use YAML qw( Dump ); use Alien::Base::Wrapper (); # Print out the Module::Build and ExtUtils::MakeMaker # for a list of aliens, using Alien::Base::Wrapper Alien::Base::Wrapper->import(@ARGV, '!export'); print Dump( mb => [Alien::Base::Wrapper->mb_args], mm => [Alien::Base::Wrapper->mm_args], ); Alien-Build-2.84/example/xz-manual.alienfile000644 000000 000000 00000002516 14710030646 020740 0ustar00rootroot000000 000000 use alienfile; # see xz.alienfile for a more reliable and portable # example that uses plugins. # Use pkg-config to check if the library exists. # also, use which to check that the xz command is # in the path. probe [ 'pkg-config --exists liblzma', 'which xz', ]; share { start_url 'http://tukaani.org/xz/xz-5.2.3.tar.gz'; # the first one which succeeds will be used download [ 'wget %{.meta.start_url}' ]; download [ 'curl -O %{.meta.start_url}' ]; # use tar to extract the tarball extract [ 'tar zxf %{.install.download}' ]; # use the standard build process build [ './configure --prefix=%{.install.prefix} --disable-shared', '%{make}', '%{make} install', ]; # This package doesn't build a dynamic library by default, but if # it did this would make sure that it wasn't used with XS. # (See Alien::Build::Manual::AlienAuthor for details). plugin 'Gather::IsolateDynamic'; }; # You can specify individual gather steps in share {} or # sys {} too, but for many cases the same procedure can # be used for both. gather [ # store the (chomped) output into the appropriate runtime properties [ 'pkg-config', '--modversion', 'liblzma', \'%{.runtime.version}' ], [ 'pkg-config', '--cflags', 'liblzma', \'%{.runtime.cflags}' ], [ 'pkg-config', '--libs', 'liblzma', \'%{.runtime.libs}' ], ]; Alien-Build-2.84/example/xz.alienfile000644 000000 000000 00000003546 14710030646 017471 0ustar00rootroot000000 000000 use alienfile; # PkgConfig uses the pkg-config negotiator to pick the best # available implementation (as of this writing, in order: # libpkgconf, pkg-config, PkgConfig,pm), to determine # if the system already provides the library. In addition, # it gets the version, cflags and libs during either a # "system" or "share" install. plugin 'PkgConfig' => 'liblzma'; # in addition to the library, we require that the xz command # is also available. plugin 'Probe::CommandLine' => ( command => 'xz', secondary => 1, ); share { # items in the share block relate to building the package # from source. It is called share because it will be # installed into a dist level share directory in your # perl lib. # The Download negotiator picks the best method for # downloading the package. It uses the version # regex to parse out the version number from the # tarball so that it can pick the most recent # version. start_url 'http://tukaani.org/xz/'; plugin Download => ( version => qr/^xz-([0-9\.]+)\.tar\.gz$/, ); # The Extract negotiator picks the best method for # extracting from the tarball. We give it a hint # here that we expect the tarball to be .gz compressed # in case it needs to load extra modules to # decompress. plugin Extract => 'tar.gz'; # The Autoconf plugin builds using the standard # configure and make tools. It uses a DESTDIR # ( https://www.gnu.org/prep/standards/html_node/DESTDIR.html ) # to ensure that the prefix during the build # (ie when you install the Alien::xz module) # matches the prefix during runtime # (ie when you use it from XZ::XS). plugin 'Build::Autoconf'; # This package doesn't build a dynamic library by default, but if # it did this would make sure that it wasn't used with XS. # (See Alien::Build::Manual::AlienAuthor for details). plugin 'Gather::IsolateDynamic'; }; Alien-Build-2.84/inc/000755 000000 000000 00000000000 14710030646 014264 5ustar00rootroot000000 000000 Alien-Build-2.84/inc/probebad.pl000644 000000 000000 00000005222 14710030646 016400 0ustar00rootroot000000 000000 use strict; use warnings; use ExtUtils::CBuilder; use ExtUtils::ParseXS; use File::Temp qw( tempdir ); use File::Spec; # probebad.pl: this is intended to be run by Makefile.PL to find FAIL reports # that commonly come from cpantesters, but are in fact the result of badly # configured environments. Usually I try to contact the testers in quesion, # but sometimes they are either unable or unwilling to respond, and I don't # want to waste my time re-diagnosing the same errors. { # /tmp check my $dir = eval { tempdir( CLEANUP => 1 ) }; if($@) { print "Configuration unsupported\n"; print "Unable to create a temp directory using File::Temp. This is used\n"; print "extensively by the test suite. You may want to check if the dir\n"; print "@{[ File::Spec->tmpdir ]} is full or has other problems\n"; exit; } } { # compiler checks my $cb = ExtUtils::CBuilder->new; if($cb->have_compiler) { my $pxs = ExtUtils::ParseXS->new; eval { $pxs->process_file( filename => "inc/trivial.xs", output => "inc/trivial.c", versioncheck => 0, prototypes => 0, ); }; if(my $error = $@) { print "Configuration unsupported\n"; print "You appear to have a C compiler, but I am unable to process a\n"; print "trivial XS file, errored with:\n"; print "$error\n"; exit; } if($pxs->report_error_count != 0) { print "Configuration unsupported\n"; print "You appear to have a C compiler, but there were errors processing\n"; print "a trivial XS file.\n"; exit; } my($cc_out, $obj, $cc_exception) = capture_merged( sub { my $obj = eval { $cb->compile( source => "inc/trivial.c", ); }; ($obj, $@); } ); if(! $obj) { print "Configuration unsupported\n"; print "You appear to have a C compiler, but there were errors processing\n"; print "the C file generated from a trivial XS file.\n"; if($cc_exception) { print "Exception:\n"; print "$cc_exception\n"; } if($cc_out) { print "Compiler output:\n"; print "$cc_out\n"; } exit; } # cleanup unlink 'inc/trivial.c'; unlink $obj; } } sub capture_merged { # I don't want to make Capture::Tiny a configure require, but # I also don't want to spew compiler output where the probe is # okay. Compromise by using it if it is already installed. if(eval { require Capture::Tiny }) { goto \&Capture::Tiny::capture_merged; } else { my($code) = @_; return ('', $code->()); } } 1; Alien-Build-2.84/inc/trivial.xs000644 000000 000000 00000000250 14710030646 016307 0ustar00rootroot000000 000000 #include "EXTERN.h" #include "perl.h" #include "XSUB.h" MODULE = Trivial::XS PACKAGE = Trivial::XS int answer() CODE: RETVAL = 42; OUTPUT: RETVAL Alien-Build-2.84/lib/000755 000000 000000 00000000000 14710030646 014261 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/000755 000000 000000 00000000000 14710030646 015311 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Base.pm000644 000000 000000 00000071312 14710030646 016525 0ustar00rootroot000000 000000 package Alien::Base; use strict; use warnings; use 5.008004; use Carp; use Path::Tiny (); use Scalar::Util qw/blessed/; use Capture::Tiny 0.17 qw/capture_stdout/; use Text::ParseWords qw/shellwords/; use Alien::Util; # ABSTRACT: Base classes for Alien:: modules our $VERSION = '2.84'; # VERSION sub import { my $class = shift; return if $class eq __PACKAGE__; return if $class->runtime_prop; return if $class->install_type('system'); require DynaLoader; # Sanity check in order to ensure that dist_dir can be found. # This will throw an exception otherwise. $class->dist_dir; # get a reference to %Alien::MyLibrary::AlienLoaded # which contains names of already loaded libraries # this logic may be replaced by investigating the DynaLoader arrays my $loaded = do { no strict 'refs'; no warnings 'once'; \%{ $class . "::AlienLoaded" }; }; my @libs = $class->split_flags( $class->libs ); my @L = grep { s/^-L// } map { "$_" } @libs; ## no critic (ControlStructures::ProhibitMutatingListFunctions) my @l = grep { /^-l/ } @libs; unshift @DynaLoader::dl_library_path, @L; my @libpaths; foreach my $l (@l) { next if $loaded->{$l}; my $path = DynaLoader::dl_findfile( $l ); unless ($path) { carp "Could not resolve $l"; next; } push @libpaths, $path; $loaded->{$l} = $path; } push @DynaLoader::dl_resolve_using, @libpaths; my @librefs = map { DynaLoader::dl_load_file( $_, 0x01 ) } grep !/\.(a|lib)$/, @libpaths; push @DynaLoader::dl_librefs, @librefs; } sub _dist_dir ($) { my($dist_name) = @_; my @pm = split /-/, $dist_name; $pm[-1] .= ".pm"; foreach my $inc (@INC) { my $pm = Path::Tiny->new($inc, @pm); if(-f $pm) { my $share = Path::Tiny->new($inc, qw( auto share dist ), $dist_name ); if(-d $share) { return $share->absolute->stringify; } last; } } Carp::croak("unable to find dist share directory for $dist_name"); } sub dist_dir { my $class = shift; my $dist = blessed $class || $class; $dist =~ s/::/-/g; my $dist_dir = $class->config('finished_installing') ? _dist_dir $dist : $class->config('working_directory'); croak "Failed to find share dir for dist '$dist'" unless defined $dist_dir && -d $dist_dir; return $dist_dir; } sub new { return bless {}, $_[0] } sub _flags { my($class, $key) = @_; my $config = $class->runtime_prop; my $flags = $config->{$key}; my $prefix = $config->{prefix}; $prefix =~ s{\\}{/}g if $^O =~ /^(MSWin32|msys)$/; my $distdir = $config->{distdir}; $distdir =~ s{\\}{/}g if $^O =~ /^(MSWin32|msys)$/; if(defined $flags && $prefix ne $distdir) { $flags = join ' ', map { my $flag = $_; $flag =~ s/^(-I|-L|-LIBPATH:)?\Q$prefix\E/$1$distdir/; $flag =~ s/(\s)/\\$1/g; $flag; } $class->split_flags($flags); } $flags; } sub cflags { my $class = shift; return $class->runtime_prop ? $class->_flags('cflags') : $class->_pkgconfig_keyword('Cflags'); } sub cflags_static { my $class = shift; return $class->runtime_prop ? $class->_flags('cflags_static') : $class->_pkgconfig_keyword('Cflags', 'static'); } sub libs { my $class = shift; return $class->runtime_prop ? $class->_flags('libs') : $class->_pkgconfig_keyword('Libs'); } sub libs_static { my $class = shift; return $class->runtime_prop ? $class->_flags('libs_static') : $class->_pkgconfig_keyword('Libs', 'static'); } sub version { my $self = shift; return $self->runtime_prop ? $self->runtime_prop->{version} : do { my $version = $self->config('version'); chomp $version; $version; }; } sub atleast_version { my $self = shift; my ($wantver) = @_; defined(my $version = $self->version) or croak "$self has no defined ->version"; return $self->version_cmp($version, $wantver) >= 0; } sub exact_version { my $self = shift; my ($wantver) = @_; defined(my $version = $self->version) or croak "$self has no defined ->version"; return $self->version_cmp($version, $wantver) == 0; } sub max_version { my $self = shift; my ($wantver) = @_; defined(my $version = $self->version) or croak "$self has no defined ->version"; return $self->version_cmp($version, $wantver) <= 0; } sub version_cmp { shift; goto &Alien::Util::version_cmp; } sub install_type { my $self = shift; my $type = $self->config('install_type'); return @_ ? $type eq $_[0] : $type; } sub is_system_install { my($self) = @_; $self->install_type('system'); } sub is_share_install { my($self) = @_; $self->install_type('share'); } sub _pkgconfig_keyword { my $self = shift; my $keyword = shift; my $static = shift; # use pkg-config if installed system-wide if ($self->install_type('system')) { my $name = $self->config('name'); require Alien::Base::PkgConfig; my $command = Alien::Base::PkgConfig->pkg_config_command . " @{[ $static ? '--static' : '' ]} --\L$keyword\E $name"; $! = 0; chomp ( my $pcdata = capture_stdout { system( $command ) } ); # if pkg-config fails for whatever reason, then we try to # fallback on alien_provides_* $pcdata = '' if $! || $?; $pcdata =~ s/\s*$//; if($self->config('system_provides')) { if(my $system_provides = $self->config('system_provides')->{$keyword}) { $pcdata = length $pcdata ? "$pcdata $system_provides" : $system_provides; } } return $pcdata; } # use parsed info from build .pc file my $dist_dir = $self->dist_dir; my @pc = $self->_pkgconfig(@_); my @strings = grep defined, map { $_->keyword($keyword, #{ pcfiledir => $dist_dir } ) } @pc; if(defined $self->config('original_prefix') && $self->config('original_prefix') ne $self->dist_dir) { my $dist_dir = $self->dist_dir; $dist_dir =~ s{\\}{/}g if $^O eq 'MSWin32'; my $old = quotemeta $self->config('original_prefix'); @strings = map { my $flag = $_; $flag =~ s{^(-I|-L|-LIBPATH:)?($old)}{$1.$dist_dir}e; $flag =~ s/(\s)/\\$1/g; $flag; } map { $self->split_flags($_) } @strings; } return join( ' ', @strings ); } sub _pkgconfig { my $self = shift; my %all = %{ $self->config('pkgconfig') }; # merge in found pc files require File::Find; my $wanted = sub { return if ( -d or not /\.pc$/ ); require Alien::Base::PkgConfig; my $pkg = Alien::Base::PkgConfig->new($_); $all{$pkg->{package}} = $pkg; }; File::Find::find( $wanted, $self->dist_dir ); croak "No Alien::Base::PkgConfig objects are stored!" unless keys %all; # Run through all pkgconfig objects and ensure that their modules are loaded: for my $pkg_obj (values %all) { my $perl_module_name = blessed $pkg_obj; my $pm = "$perl_module_name.pm"; $pm =~ s/::/\//g; eval { require $pm }; } return @all{@_} if @_; my $manual = delete $all{_manual}; if (keys %all) { return values %all; } else { return $manual; } } # helper method to call Alien::MyLib::ConfigData->config(@_) sub config { my $class = shift; $class = blessed $class || $class; if(my $ab_config = $class->runtime_prop) { my $key = shift; return $ab_config->{legacy}->{$key}; } my $config = $class . '::ConfigData'; my $pm = "$class/ConfigData.pm"; $pm =~ s{::}{/}g; eval { require $pm }; if($@) { warn "Cannot find either a share directory or a ConfigData module for $class.\n"; my $pm = "$class.pm"; $pm =~ s{::}{/}g; warn "($class loaded from $INC{$pm})\n" if $INC{$pm}; warn "Please see https://metacpan.org/pod/distribution/Alien-Build/lib/Alien/Build/Manual/FAQ.pod#Cannot-find-either-a-share-directory-or-a-ConfigData-module\n"; die $@; } return $config->config(@_); } # helper method to split flags based on the OS sub split_flags { my ($class, $line) = @_; if( $^O eq 'MSWin32' ) { $class->split_flags_windows($line); } else { # $os eq 'Unix' $class->split_flags_unix($line); } } sub split_flags_unix { my ($class, $line) = @_; shellwords($line); } sub split_flags_windows { # NOTE a better approach would be to write a function that understands cmd.exe metacharacters. my ($class, $line) = @_; # Double the backslashes so that when they are unescaped by shellwords(), # they become a single backslash. This should be fine on Windows since # backslashes are not used to escape metacharacters in cmd.exe. $line =~ s,\\,\\\\,g; shellwords($line); } sub dynamic_libs { my ($class) = @_; require FFI::CheckLib; my @find_lib_flags; if($class->install_type('system')) { if(my $prop = $class->runtime_prop) { if($prop->{ffi_checklib}->{system}) { push @find_lib_flags, @{ $prop->{ffi_checklib}->{system} }; } return FFI::CheckLib::find_lib( lib => $prop->{ffi_name}, @find_lib_flags ) if defined $prop->{ffi_name}; } my $name = $class->config('ffi_name'); unless(defined $name) { $name = $class->config('name'); $name = '' unless defined $name; # strip leading lib from things like libarchive or libffi $name =~ s/^lib//; # strip trailing version numbers $name =~ s/-[0-9\.]+$//; } my @libpath; if(defined $class->libs) { foreach my $flag ($class->split_flags($class->libs)) { if($flag =~ /^-L(.*)$/) { push @libpath, $1; } } } return FFI::CheckLib::find_lib(lib => $name, libpath => \@libpath, @find_lib_flags ); } else { my $dir = $class->dist_dir; my $dynamic = Path::Tiny->new($class->dist_dir, 'dynamic'); if(my $prop = $class->runtime_prop) { if($prop->{ffi_checklib}->{share}) { push @find_lib_flags, @{ $prop->{ffi_checklib}->{share_flags} }; } } if(-d $dynamic) { return FFI::CheckLib::find_lib( lib => '*', libpath => "$dynamic", systempath => [], ); } return FFI::CheckLib::find_lib( lib => '*', libpath => $dir, systempath => [], recursive => 1, ); } } sub bin_dir { my ($class) = @_; if($class->install_type('system')) { my $prop = $class->runtime_prop; return () unless defined $prop; return () unless defined $prop->{system_bin_dir}; return ref $prop->{system_bin_dir} ? @{ $prop->{system_bin_dir} } : ($prop->{system_bin_dir}); } else { my $dir = Path::Tiny->new($class->dist_dir, 'bin'); return -d $dir ? ("$dir") : (); } } sub dynamic_dir { my ($class) = @_; if($class->install_type('system')) { return (); } else { my $dir = Path::Tiny->new($class->dist_dir, 'dynamic'); return -d $dir ? ("$dir") : (); } } sub alien_helper { {}; } sub inline_auto_include { my ($class) = @_; $class->runtime_prop->{inline_auto_include} || $class->config('inline_auto_include') || [] } sub Inline { my ($class, $language) = @_; return unless defined $language; return if $language !~ /^(C|CPP)$/; my $config = { # INC should arguably be for -I flags only, but # this improves compat with ExtUtils::Depends. # see gh#107, gh#108 INC => $class->cflags, LIBS => $class->libs, }; if (@{ $class->inline_auto_include } > 0) { $config->{AUTO_INCLUDE} = join "\n", map { "#include \"$_\"" } @{ $class->inline_auto_include }; } $config; } { my %alien_build_config_cache; sub runtime_prop { my($class) = @_; if(ref($class)) { # called as an instance method. my $self = $class; $class = ref $self; return $self->{_alt}->{runtime_prop} if defined $self->{_alt}; } return $alien_build_config_cache{$class} if exists $alien_build_config_cache{$class}; $alien_build_config_cache{$class} ||= do { my $dist = ref $class ? ref $class : $class; $dist =~ s/::/-/g; my $dist_dir = eval { _dist_dir $dist }; return if $@; my $alien_json = Path::Tiny->new($dist_dir, '_alien', 'alien.json'); return unless -r $alien_json; my $json = $alien_json->slurp; require JSON::PP; my $config = JSON::PP::decode_json($json); $config->{distdir} = $dist_dir; $config; }; } } sub alt { my($old, $name) = @_; my $new = ref $old ? (ref $old)->new : $old->new; my $orig; if(ref($old) && defined $old->{_alt}) { $orig = $old->{_alt}->{orig} } else { $orig = $old->runtime_prop } require Storable; my $runtime_prop = Storable::dclone($orig); if($runtime_prop->{alt}->{$name}) { foreach my $key (keys %{ $runtime_prop->{alt}->{$name} }) { $runtime_prop->{$key} = $runtime_prop->{alt}->{$name}->{$key}; } } else { Carp::croak("no such alt: $name"); } $new->{_alt} = { runtime_prop => $runtime_prop, orig => $orig, }; $new; } sub alt_names { my($class) = @_; my $alts = $class->runtime_prop->{alt}; defined $alts ? sort keys %$alts : (); } sub alt_exists { my($class, $alt_name) = @_; my $alts = $class->runtime_prop->{alt}; defined $alts ? exists $alts->{$alt_name} && defined $alts->{$alt_name} : 0; } 1; =pod =encoding UTF-8 =head1 NAME Alien::Base - Base classes for Alien:: modules =head1 VERSION version 2.84 =head1 SYNOPSIS package Alien::MyLibrary; use strict; use warnings; use parent 'Alien::Base'; 1; (for details on the C or C and L that should be bundled with your L subclass, please see L). Then a C can use C in its C: use Alien::MyLibrary use ExtUtils::MakeMaker; use Alien::Base::Wrapper qw( Alien::MyLibrary !export ); use Config; WriteMakefile( ... Alien::Base::Wrapper->mm_args, ... ); Or if you prefer L, in its C: use Alien::MyLibrary; use Module::Build 0.28; # need at least 0.28 use Alien::Base::Wrapper qw( Alien::MyLibrary !export ); my $builder = Module::Build->new( ... Alien::Base::Wrapper->mb_args, ... ); $builder->create_build_script; Or if you are using L: use ExtUtils::MakeMaker; use ExtUtils::Depends; my $eud = ExtUtils::Depends->new(qw( MyLibrary::XS Alien::MyLibrary )); WriteMakefile( ... $eud->get_makefile_vars ); If you are using L instead of the recommended L and L, then in your C module, you may need something like this in your main C<.pm> file IF your library uses dynamic libraries: package MyLibrary::XS; use Alien::MyLibrary; # may only be needed if you are using Alien::Base::ModuleBuild ... Or you can use it from an FFI module: package MyLibrary::FFI; use Alien::MyLibrary; use FFI::Platypus; use FFI::CheckLib 0.28 qw( find_lib_or_die ); my $ffi = FFI::Platypus->new; $ffi->lib(find_lib_or_die lib => 'mylib', alien => ['Alien::MyLibrary']); $ffi->attach( 'my_library_function' => [] => 'void' ); You can even use it with L (C and C++ languages are supported): package MyLibrary::Inline; use Alien::MyLibrary; # Inline 0.56 or better is required use Inline 0.56 with => 'Alien::MyLibrary'; ... =head1 DESCRIPTION B: L is no longer bundled with L and has been spun off into a separate distribution. L will be a prerequisite for L until October 1, 2017. If you are using L you need to make sure it is declared as a C in your C. You may want to also consider using L and L as a more modern alternative. L comprises base classes to help in the construction of C modules. Modules in the L namespace are used to locate and install (if necessary) external libraries needed by other Perl modules. This is the documentation for the L module itself. If you are starting out you probably want to do so from one of these documents: =over 4 =item L For users of an C that is implemented using L. (The developer of C I provide the documentation necessary, but if not, this is the place to start). =item L If you are writing your own L based on L and L. =item L If you have a common question that has already been answered, like "How do I use L with some build system". =item L This is for the brave souls who want to write plugins that will work with L + L. =back Before using an L based L directly, please consider the following advice: If you are wanting to use an L based L with an XS module using L or L, it is highly recommended that you use L, rather than using the L directly, because it handles a number of sharp edges and avoids pitfalls common when trying to use an L directly with L. In the same vein, if you are wanting to use an L based L with an XS module using L it is highly recommended that you use L for the same reasons. As of version 0.28, L has a good interface for working with L based Ls in fallback mode, which is recommended. You should typically only be using an L based L directly, if you need to integrate it with some other system, or if it is a tool based L that you don't need to link. The above synopsis and linked manual documents will lead you down the right path, but it is worth knowing before you read further in this document. =head1 METHODS In the example snippets here, C represents any subclass of L. =head2 dist_dir my $dir = Alien::MyLibrary->dist_dir; Returns the directory that contains the install root for the packaged software, if it was built from install (i.e., if C is C). =head2 new my $alien = Alien::MyLibrary->new; Creates an instance of an L object. This is typically unnecessary. =head2 cflags my $cflags = Alien::MyLibrary->cflags; use Text::ParseWords qw( shellwords ); my @cflags = shellwords( Alien::MyLibrary->cflags ); Returns the C compiler flags necessary to compile an XS module using the alien software. If you need this in list form (for example if you are calling system with a list argument) you can pass this value into C from the Perl core L module. =head2 cflags_static my $cflags = Alien::MyLibrary->cflags_static; Same as C above, but gets the static compiler flags, if they are different. =head2 libs my $libs = Alien::MyLibrary->libs; use Text::ParseWords qw( shellwords ); my @cflags = shellwords( Alien::MyLibrary->libs ); Returns the library linker flags necessary to link an XS module against the alien software. If you need this in list form (for example if you are calling system with a list argument) you can pass this value into C from the Perl core L module. =head2 libs_static my $libs = Alien::MyLibrary->libs_static; Same as C above, but gets the static linker flags, if they are different. =head2 version my $version = Alien::MyLibrary->version; Returns the version of the alienized library or tool that was determined at install time. =head2 atleast_version =head2 exact_version =head2 max_version my $ok = Alien::MyLibrary->atleast_version($wanted_version); my $ok = Alien::MyLibrary->exact_version($wanted_version); my $ok = Alien::MyLibrary->max_version($wanted_version); Returns true if the version of the alienized library or tool is at least, exactly, or at most the version specified, respectively. =head2 version_cmp $cmp = Alien::MyLibrary->version_cmp($x, $y) Comparison method used by L, L and L. May be useful to implement custom comparisons, or for subclasses to overload to get different version comparison semantics than the default rules, for packages that have some other rules than the F behaviour. Should return a number less than, equal to, or greater than zero; similar in behaviour to the C<< <=> >> and C operators. =head2 install_type my $install_type = Alien::MyLibrary->install_type; my $bool = Alien::MyLibrary->install_type($install_type); Returns the install type that was used when C was installed. If a type is provided (the second form in the synopsis) returns true if the actual install type matches. For this use case it is recommended to use C or C instead as these are less prone to typographical errors. Types include: =over 4 =item system The library was provided by the operating system =item share The library was not available when C was installed, so it was built from source code, either downloaded from the Internet or bundled with C. =back =head2 is_system_install my $type = $build->is_system_install; Returns true if the alien is a system install type. =head2 is_share_install my $type = $build->is_share_install; Returns true if the alien is a share install type. =head2 config my $value = Alien::MyLibrary->config($key); Returns the configuration data as determined during the install of C. For the appropriate config keys, see L. This is not typically used by L and L, but a compatible interface will be provided. =head2 dynamic_libs my @dlls = Alien::MyLibrary->dynamic_libs; my($dll) = Alien::MyLibrary->dynamic_libs; Returns a list of the dynamic library or shared object files for the alien software. =head2 bin_dir my(@dir) = Alien::MyLibrary->bin_dir Returns a list of directories with executables in them. For a C install this will be an empty list. For a C install this will be a directory under C named C if it exists. You may wish to override the default behavior if you have executables or scripts that get installed into non-standard locations. Example usage: use Env qw( @PATH ); unshift @PATH, Alien::MyLibrary->bin_dir; =head2 dynamic_dir my(@dir) = Alien::MyLibrary->dynamic_dir Returns the dynamic dir for a dynamic build (if the main build is static). For a C install this will be a directory under C named C if it exists. System builds return an empty list. Example usage: use Env qw( @PATH ); unshift @PATH, Alien::MyLibrary->dynamic_dir; =head2 alien_helper my $helpers = Alien::MyLibrary->alien_helper; Returns a hash reference of helpers provided by the Alien module. The keys are helper names and the values are code references. The code references will be executed at command time and the return value will be interpolated into the command before execution. The default implementation returns an empty hash reference, and you are expected to override the method to create your own helpers. For use with commands specified in and L or in your C when used with L. Helpers allow users of your Alien module to use platform or environment determined logic to compute command names or arguments in your installer logic. Helpers allow you to do this without making your Alien module a requirement when a build from source code is not necessary. As a concrete example, consider L, which provides the helper C: package Alien::gmake; ... sub alien_helper { my($class) = @_; return { gmake => sub { # return the executable name for GNU make, # usually either make or gmake depending on # the platform and environment $class->exe; } }, } Now consider L. C requires GNU Make to build from source code, but if the system C package is installed we don't need it. From the L of C: use alienfile; plugin 'Probe::CommandLine' => ( command => 'nasm', args => ['-v'], match => qr/NASM version/, ); share { ... plugin 'Extract' => 'tar.gz'; plugin 'Build::MSYS'; build [ 'sh configure --prefix=%{alien.install.prefix}', '%{gmake}', '%{gmake} install', ]; }; ... =head2 inline_auto_include my(@headers) = Alien::MyLibrary->inline_auto_include; List of header files to automatically include in inline C and C++ code when using L or L. This is provided as a public interface primarily so that it can be overridden at run time. This can also be specified in your C with L using the C property. =head2 runtime_prop my $hashref = Alien::MyLibrary->runtime_prop; Returns a hash reference of the runtime properties computed by L during its install process. If the L based L was not built using L, then this will return undef. =head2 alt my $new_alien = Alien::MyLibrary->alt($alt_name); my $new_alien = $old_alien->alt($alt_name); Returns an L instance with the alternate configuration. Some packages come with multiple libraries, and multiple C<.pc> files to use with them. This method can be used with C plugins to access different configurations. (It could also be used with non-pkg-config based packages too, though there are not as of this writing any build time plugins that take advantage of this feature). From your L use alienfile; plugin 'PkgConfig' => ( pkg_name => [ 'libfoo', 'libbar', ], ); Then in your base class works like normal: package Alien::MyLibrary; use parent qw( Alien::Base ); 1; Then you can use it: use Alien::MyLibrary; my $cflags = Alien::MyLibrary->alt('foo1')->cflags; my $libs = Alien::MyLibrary->alt('foo1')->libs; =head2 alt_names my @alt_names = Alien::MyLibrary->alt_names Returns the list of all available alternative configuration names. =head2 alt_exists my $bool = Alien::MyLibrary->alt_exists($alt_name) Returns true if the given alternative configuration exists. =head1 SUPPORT AND CONTRIBUTING First check the L for questions that have already been answered. IRC: #native on irc.perl.org L<(click for instant chatroom login)|http://chat.mibbit.com/#native@irc.perl.org> If you find a bug, please report it on the projects issue tracker on GitHub: =over 4 =item L =back Development is discussed on the projects google groups. This is also a reasonable place to post a question if you don't want to open an issue in GitHub. =over 4 =item L =back If you have implemented a new feature or fixed a bug, please open a pull request. =over 4 =item L =back =head1 SEE ALSO =over =item * L =item * L =item * L =item * L =back =head1 THANKS C was originally written by Joel Berger, and that code is still Copyright (C) 2012-2017 Joel Berger. It has the same license as the rest of the L. Special thanks for the early development of C go to: =over =item Christian Walde (Mithaldu) For productive conversations about component interoperability. =item kmx For writing Alien::Tidyp from which I drew many of my initial ideas. =item David Mertens (run4flat) For productive conversations about implementation. =item Mark Nunberg (mordy, mnunberg) For graciously teaching me about rpath and dynamic loading, =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut __END__ __POD__ Alien-Build-2.84/lib/Alien/Base/000755 000000 000000 00000000000 14710030646 016163 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Base/Authoring.pod000644 000000 000000 00000003370 14710030646 020632 0ustar00rootroot000000 000000 # ABSTRACT: Authoring an Alien distribution using Alien::Base # PODNAME: Alien::Base::Authoring __END__ =pod =encoding UTF-8 =head1 NAME Alien::Base::Authoring - Authoring an Alien distribution using Alien::Base =head1 VERSION version 2.84 =head1 SYNOPSIS % perldoc Alien::Build::Manual::AlienAuthor % perldoc Alien::Base::ModuleBuild::Authoring =head1 DESCRIPTION This used to document the only way to author an L distribution, which was with L. You should now seriously consider using the newer more reliable method which is via L and L. Read all about it in L and L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Base/FAQ.pod000644 000000 000000 00000003305 14710030646 017277 0ustar00rootroot000000 000000 # ABSTRACT: Frequently asked questions # VERSION # PODNAME: Alien::Base::FAQ __END__ =pod =encoding UTF-8 =head1 NAME Alien::Base::FAQ - Frequently asked questions =head1 VERSION version 2.84 =head1 SYNOPSIS % perldoc Alien::Build::Manual::FAQ % perldoc Alien::Base::ModuleBuild::FAQ =head1 DESCRIPTION This used to answer FAQs regarding the only way to author an L distribution, which was with L. You should now seriously consider using the newer more reliable method which is via L and L. =over 4 =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Base/PkgConfig.pm000644 000000 000000 00000011450 14710030646 020371 0ustar00rootroot000000 000000 package Alien::Base::PkgConfig; use strict; use warnings; use 5.008004; use Carp; use Config; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_stderr ); # ABSTRACT: Private legacy pkg-config class for Alien::Base our $VERSION = '2.84'; # VERSION sub new { my $class = shift; # allow creation of an object from a full spec. if (ref $_[0] eq 'HASH') { return bless $_[0], $class; } my ($path) = @_; croak "Must specify a file" unless defined $path; $path = path( $path )->absolute; my($name) = $path->basename =~ /^(.*)\.pc$/; my $self = { package => $name, vars => { pcfiledir => $path->parent->stringify }, keywords => {}, }; bless $self, $class; $self->read($path); return $self; } sub read { my $self = shift; my ($path) = @_; open my $fh, '<', $path or croak "Cannot open .pc file $path: $!"; while (my $line = <$fh>) { if ($line =~ /^([^=:]+?)=([^\n\r]*)/) { $self->{vars}{$1} = $2; } elsif ($line =~ /^([^=:]+?):\s*([^\n\r]*)/) { $self->{keywords}{$1} = $2; } } } # getter/setter for vars sub var { my $self = shift; my ($var, $newval) = @_; if (defined $newval) { $self->{vars}{$var} = $newval; } return $self->{vars}{$var}; } # abstract keywords and other vars in terms of "pure" vars sub make_abstract { my $self = shift; die "make_abstract needs a key (and possibly a value)" unless @_; my ($var, $value) = @_; $value = defined $value ? $value : $self->{vars}{$var}; # convert other vars foreach my $key (keys %{ $self->{vars} }) { next if $key eq $var; # don't overwrite the current var $self->{vars}{$key} =~ s/\Q$value\E/\$\{$var\}/g; } # convert keywords foreach my $key (keys %{ $self->{keywords} }) { $self->{keywords}{$key} =~ s/\Q$value\E/\$\{$var\}/g; } } sub _interpolate_vars { my $self = shift; my ($string, $override) = @_; $override ||= {}; foreach my $key (keys %$override) { carp "Overriden pkg-config variable $key, contains no data" unless $override->{$key}; } if (defined $string) { 1 while $string =~ s/\$\{(.*?)\}/$override->{$1} || $self->{vars}{$1}/e; } return $string; } sub keyword { my $self = shift; my ($keyword, $override) = @_; { no warnings 'uninitialized'; croak "overrides passed to 'keyword' must be a hashref" if defined $override and ref $override ne 'HASH'; } return $self->_interpolate_vars( $self->{keywords}{$keyword}, $override ); } my $pkg_config_command; sub pkg_config_command { unless (defined $pkg_config_command) { capture_stderr { # For now we prefer PkgConfig.pm over pkg-config on # Solaris 64 bit Perls. We may need to do this on # other platforms, in which case this logic should # be abstracted so that it can be shared here and # in Build.PL if (`pkg-config --version` && $? == 0 && !($^O eq 'solaris' && $Config{ptrsize} == 8)) { $pkg_config_command = 'pkg-config'; } else { require PkgConfig; $pkg_config_command = "$^X $INC{'PkgConfig.pm'}"; } } } $pkg_config_command; } sub TO_JSON { my($self) = @_; my %hash = %$self; $hash{'__CLASS__'} = ref($self); \%hash; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Base::PkgConfig - Private legacy pkg-config class for Alien::Base =head1 VERSION version 2.84 =head1 DESCRIPTION This class is used internally by L and L to store information from pkg-config about installed Aliens. It is not used internally by the newer L and L. It should never be used externally, should not be used for code new inside of C. =head1 SEE ALSO =over =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Base/Wrapper.pm000644 000000 000000 00000032325 14710030646 020146 0ustar00rootroot000000 000000 package Alien::Base::Wrapper; use strict; use warnings; use 5.006; use Config; use Text::ParseWords qw( shellwords ); # NOTE: Although this module is now distributed with Alien-Build, # it should have NO non-perl-core dependencies for all Perls # 5.6.0-5.30.1 (as of this writing, and any Perl more recent). # You should be able to extract this module from the rest of # Alien-Build and use it by itself. (There is a dzil plugin # for this [AlienBase::Wrapper::Bundle] # ABSTRACT: Compiler and linker wrapper for Alien our $VERSION = '2.84'; # VERSION sub _join { join ' ', map { my $x = $_; $x =~ s/(\s)/\\$1/g; $x; } @_; } sub new { my($class, @aliens) = @_; my $export = 1; my $writemakefile = 0; my @cflags_I; my @cflags_other; my @ldflags_L; my @ldflags_l; my @ldflags_other; my %requires = ( 'ExtUtils::MakeMaker' => '6.52', 'Alien::Base::Wrapper' => '1.97', ); foreach my $alien (@aliens) { if($alien eq '!export') { $export = 0; next; } if($alien eq 'WriteMakefile') { $writemakefile = 1; next; } my $version = 0; if($alien =~ s/=(.*)$//) { $version = $1; } $alien = "Alien::$alien" unless $alien =~ /::/; $requires{$alien} = $version; my $alien_pm = $alien . '.pm'; $alien_pm =~ s/::/\//g; require $alien_pm unless eval { $alien->can('cflags') } && eval { $alien->can('libs') }; my $cflags; my $libs; if($alien->install_type eq 'share' && $alien->can('cflags_static')) { $cflags = $alien->cflags_static; $libs = $alien->libs_static; } else { $cflags = $alien->cflags; $libs = $alien->libs; } $cflags = '' unless defined $cflags; $libs = '' unless defined $libs; push @cflags_I, grep /^-I/, shellwords $cflags; push @cflags_other, grep !/^-I/, shellwords $cflags; push @ldflags_L, grep /^-L/, shellwords $libs; push @ldflags_l, grep /^-l/, shellwords $libs; push @ldflags_other, grep !/^-[Ll]/, shellwords $libs; } my @cflags_define = grep /^-D/, @cflags_other; my @cflags_other2 = grep !/^-D/, @cflags_other; my @mm; push @mm, INC => _join @cflags_I if @cflags_I; push @mm, CCFLAGS => _join(@cflags_other2) . " $Config{ccflags}" if @cflags_other2; push @mm, DEFINE => _join(@cflags_define) if @cflags_define; # TODO: handle spaces in -L paths push @mm, LIBS => ["@ldflags_L @ldflags_l"]; my @ldflags = (@ldflags_L, @ldflags_other); push @mm, LDDLFLAGS => _join(@ldflags) . " $Config{lddlflags}" if @ldflags; push @mm, LDFLAGS => _join(@ldflags) . " $Config{ldflags}" if @ldflags; my @mb; push @mb, extra_compiler_flags => _join(@cflags_I, @cflags_other); push @mb, extra_linker_flags => _join(@ldflags_l); if(@ldflags) { push @mb, config => { lddlflags => _join(@ldflags) . " $Config{lddlflags}", ldflags => _join(@ldflags) . " $Config{ldflags}", }, } bless { cflags_I => \@cflags_I, cflags_other => \@cflags_other, ldflags_L => \@ldflags_L, ldflags_l => \@ldflags_l, ldflags_other => \@ldflags_other, mm => \@mm, mb => \@mb, _export => $export, _writemakefile => $writemakefile, requires => \%requires, }, $class; } my $default_abw = __PACKAGE__->new; # for testing only sub _reset { __PACKAGE__->new } sub _myexec { my @command = @_; if($^O eq 'MSWin32') { # To handle weird quoting on MSWin32 # this logic needs to be improved. my $command = "@command"; $command =~ s{"}{\\"}g; system $command; if($? == -1 ) { die "failed to execute: $!\n"; } elsif($? & 127) { die "child died with signal @{[ $? & 128 ]}"; } else { exit($? >> 8); } } else { exec @command; } } sub cc { my @command = ( shellwords($Config{cc}), @{ $default_abw->{cflags_I} }, @{ $default_abw->{cflags_other} }, @ARGV, ); print "@command\n" unless $ENV{ALIEN_BASE_WRAPPER_QUIET}; _myexec @command; } sub ld { my @command = ( shellwords($Config{ld}), @{ $default_abw->{ldflags_L} }, @{ $default_abw->{ldflags_other} }, @ARGV, @{ $default_abw->{ldflags_l} }, ); print "@command\n" unless $ENV{ALIEN_BASE_WRAPPER_QUIET}; _myexec @command; } sub mm_args { my $self = ref $_[0] ? shift : $default_abw; @{ $self->{mm} }; } sub mm_args2 { my $self = shift; $self = $default_abw unless ref $self; my %args = @_; my @mm = @{ $self->{mm} }; while(@mm) { my $key = shift @mm; my $value = shift @mm; if(defined $args{$key}) { if($args{$key} eq 'LIBS') { require Carp; # Todo: support this maybe? Carp::croak("please do not specify your own LIBS key with mm_args2"); } else { $args{$key} = join ' ', $value, $args{$key}; } } else { $args{$key} = $value; } } foreach my $module (keys %{ $self->{requires} }) { $args{CONFIGURE_REQUIRES}->{$module} = $self->{requires}->{$module}; } %args; } sub mb_args { my $self = ref $_[0] ? shift : $default_abw; @{ $self->{mb} }; } sub import { shift; my $abw = $default_abw = __PACKAGE__->new(@_); if($abw->_export) { my $caller = caller; no strict 'refs'; *{"${caller}::cc"} = \&cc; *{"${caller}::ld"} = \&ld; } if($abw->_writemakefile) { my $caller = caller; no strict 'refs'; *{"${caller}::WriteMakefile"} = \&WriteMakefile; } } sub WriteMakefile { my %args = @_; require ExtUtils::MakeMaker; ExtUtils::MakeMaker->VERSION('6.52'); my @aliens; if(my $reqs = delete $args{alien_requires}) { if(ref $reqs eq 'HASH') { @aliens = map { my $module = $_; my $version = $reqs->{$module}; $version ? "$module=$version" : "$module"; } sort keys %$reqs; } elsif(ref $reqs eq 'ARRAY') { @aliens = @$reqs; } else { require Carp; Carp::croak("aliens_require must be either a hash or array reference"); } } else { require Carp; Carp::croak("You are using Alien::Base::Wrapper::WriteMakefile, but didn't specify any alien requirements"); } ExtUtils::MakeMaker::WriteMakefile( Alien::Base::Wrapper->new(@aliens)->mm_args2(%args), ); } sub _export { shift->{_export} } sub _writemakefile { shift->{_writemakefile} } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Base::Wrapper - Compiler and linker wrapper for Alien =head1 VERSION version 2.84 =head1 SYNOPSIS From the command line: % perl -MAlien::Base::Wrapper=Alien::Foo,Alien::Bar -e cc -- -o foo.o -c foo.c % perl -MAlien::Base::Wrapper=Alien::Foo,Alien::Bar -e ld -- -o foo foo.o From Makefile.PL (static): use ExtUtils::MakeMaker; use Alien::Base::Wrapper (); WriteMakefile( Alien::Base::Wrapper->new( 'Alien::Foo', 'Alien::Bar')->mm_args2( 'NAME' => 'Foo::XS', 'VERSION_FROM' => 'lib/Foo/XS.pm', ), ); From Makefile.PL (static with wrapper) use Alien::Base::Wrapper qw( WriteMakefile); WriteMakefile( 'NAME' => 'Foo::XS', 'VERSION_FROM' => 'lib/Foo/XS.pm', 'alien_requires' => { 'Alien::Foo' => 0, 'Alien::Bar' => 0, }, ); From Makefile.PL (dynamic): use Devel::CheckLib qw( check_lib ); use ExtUtils::MakeMaker 6.52; my @mm_args; my @libs; if(check_lib( lib => [ 'foo' ] ) { push @mm_args, LIBS => [ '-lfoo' ]; } else { push @mm_args, CC => '$(FULLPERL) -MAlien::Base::Wrapper=Alien::Foo -e cc --', LD => '$(FULLPERL) -MAlien::Base::Wrapper=Alien::Foo -e ld --', BUILD_REQUIRES => { 'Alien::Foo' => 0, 'Alien::Base::Wrapper' => 0, } ; } WriteMakefile( 'NAME' => 'Foo::XS', 'VERSION_FROM' => 'lib/Foo/XS.pm', 'CONFIGURE_REQUIRES => { 'ExtUtils::MakeMaker' => 6.52, }, @mm_args, ); =head1 DESCRIPTION This module acts as a wrapper around one or more L modules. It is designed to work with L based aliens, but it should work with any L which uses the same essential API. In the first example (from the command line), this class acts as a wrapper around the compiler and linker that Perl is configured to use. It takes the normal compiler and linker flags and adds the flags provided by the Aliens specified, and then executes the command. It will print the command to the console so that you can see exactly what is happening. In the second example (from Makefile.PL non-dynamic), this class is used to generate the appropriate L (EUMM) arguments needed to C. In the third example (from Makefile.PL dynamic), we do a quick check to see if the simple linker flag C<-lfoo> will work, if so we use that. If not, we use a wrapper around the compiler and linker that will use the alien flags that are known at build time. The problem that this form attempts to solve is that compiler and linker flags typically need to be determined at I time, when a distribution is installed, meaning if you are going to use an L module then it needs to be a configure prerequisite, even if the library is already installed and easily detected on the operating system. The author of this module believes that the third (from Makefile.PL dynamic) form is somewhat unnecessary. L modules based on L have a few prerequisites, but they are well maintained and reliable, so while there is a small cost in terms of extra dependencies, the overall reliability thanks to reduced overall complexity. =head1 CONSTRUCTOR =head2 new my $abw = Alien::Base::Wrapper->new(@aliens); Instead of passing the aliens you want to use into this modules import you can create a non-global instance of C using the OO interface. =head1 FUNCTIONS =head2 cc % perl -MAlien::Base::Wrapper=Alien::Foo -e cc -- cflags Invoke the C compiler with the appropriate flags from C and what is provided on the command line. =head2 ld % perl -MAlien::Base::Wrapper=Alien::Foo -e ld -- ldflags Invoke the linker with the appropriate flags from C and what is provided on the command line. =head2 mm_args my %args = $abw->mm_args; my %args = Alien::Base::Wrapper->mm_args; Returns arguments that you can pass into C to compile/link against the specified Aliens. Note that this does not set C. You probably want to use C below instead for that reason. =head2 mm_args2 my %args = $abw->mm_args2(%args); my %args = Alien::Base::Wrapper->mm_args2(%args); Returns arguments that you can pass into C to compile/link against. It works a little differently from C above in that you can pass in arguments. It also adds the appropriate C for you so you do not have to do that explicitly. =head2 mb_args my %args = $abw->mb_args; my %args = Alien::Base::Wrapper->mb_args; Returns arguments that you can pass into the constructor to L. =head2 WriteMakefile use Alien::Base::Wrapper qw( WriteMakefile ); WriteMakefile(%args, alien_requires => \%aliens); WriteMakefile(%args, alien_requires => \@aliens); This is a thin wrapper around C from L, which adds the given aliens to the configure requirements and sets the appropriate compiler and linker flags. If the aliens are specified as a hash reference, then the keys are the module names and the values are the versions. For a list it is just the name of the aliens. For the list form you can specify a version by appending C<=version> to the name of the Aliens, that is: WriteMakefile( alien_requires => [ 'Alien::libfoo=1.23', 'Alien::libbar=4.56' ], ); The list form is recommended if the ordering of the aliens matter. The aliens are sorted in the hash form to make it consistent, but it may not be the order that you want. =head1 ENVIRONMENT Alien::Base::Wrapper responds to these environment variables: =over 4 =item ALIEN_BASE_WRAPPER_QUIET If set to true, do not print the command before executing =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build.pm000644 000000 000000 00000204336 14710030646 016716 0ustar00rootroot000000 000000 package Alien::Build; use strict; use warnings; use 5.008004; use Path::Tiny (); use Carp (); use File::chdir; use JSON::PP (); use Env qw( @PATH @PKG_CONFIG_PATH ); use Config (); use Alien::Build::Log; # ABSTRACT: Build external dependencies for use in CPAN our $VERSION = '2.84'; # VERSION sub _path { goto \&Path::Tiny::path } sub new { my($class, %args) = @_; my $self = bless { install_prop => { root => _path($args{root} || "_alien")->absolute->stringify, patch => (defined $args{patch}) ? _path($args{patch})->absolute->stringify : undef, }, runtime_prop => { alien_build_version => $Alien::Build::VERSION || 'dev', }, plugin_instance_prop => {}, bin_dir => [], pkg_config_path => [], aclocal_path => [], }, $class; # force computing this as soon as possible $self->download_rule; $self->meta->filename( $args{filename} || do { my(undef, $filename) = caller; _path($filename)->absolute->stringify; } ); if($args{meta_prop}) { $self->meta->prop->{$_} = $args{meta_prop}->{$_} for keys %{ $args{meta_prop} }; } $self; } my $count = 0; sub load { my(undef, $alienfile, @args) = @_; my $rcfile = Path::Tiny->new($ENV{ALIEN_BUILD_RC} || '~/.alienbuild/rc.pl')->absolute; if(-r $rcfile) { require Alien::Build::rc; package Alien::Build::rc; require $rcfile; } unless(-r $alienfile) { Carp::croak "Unable to read alienfile: $alienfile"; } my $file = _path $alienfile; my $name = $file->parent->basename; $name =~ s/^alien-//i; $name =~ s/[^a-z]//g; $name = 'x' if $name eq ''; $name = ucfirst $name; my $class = "Alien::Build::Auto::$name@{[ $count++ ]}"; { no strict 'refs'; @{ "${class}::ISA" } = ('Alien::Build'); *{ "${class}::Alienfile::meta" } = sub { $class =~ s{::Alienfile$}{}; $class->meta; }}; my @preload = qw( Core::Setup Core::Download Core::FFI Core::Override Core::CleanInstall ); push @preload, @Alien::Build::rc::PRELOAD; push @preload, split /;/, $ENV{ALIEN_BUILD_PRELOAD} if defined $ENV{ALIEN_BUILD_PRELOAD}; my @postload = qw( Core::Legacy Core::Gather Core::Tail ); push @postload, @Alien::Build::rc::POSTLOAD; push @postload, split /;/, $ENV{ALIEN_BUILD_POSTLOAD} if defined $ENV{ALIEN_BUILD_POSTLOAD}; my $self = $class->new( filename => $file->absolute->stringify, @args, ); require alienfile; foreach my $preload (@preload) { ref $preload eq 'CODE' ? $preload->($self->meta) : $self->meta->apply_plugin($preload); } # TODO: do this without a string eval ? ## no critic eval '# line '. __LINE__ . ' "' . __FILE__ . qq("\n) . qq{ package ${class}::Alienfile; do '@{[ $file->absolute->stringify ]}'; die \$\@ if \$\@; }; die $@ if $@; ## use critic foreach my $postload (@postload) { ref $postload eq 'CODE' ? $postload->($self->meta) : $self->meta->apply_plugin($postload); } $self->{args} = \@args; unless(defined $self->meta->prop->{arch}) { $self->meta->prop->{arch} = 1; } unless(defined $self->meta->prop->{network}) { $self->meta->prop->{network} = 1; ## https://github.com/PerlAlien/Alien-Build/issues/23#issuecomment-341114414 #$self->meta->prop->{network} = 0 if $ENV{NO_NETWORK_TESTING}; $self->meta->prop->{network} = 0 if (defined $ENV{ALIEN_INSTALL_NETWORK}) && ! $ENV{ALIEN_INSTALL_NETWORK}; } unless(defined $self->meta->prop->{local_source}) { if(! defined $self->meta->prop->{start_url}) { $self->meta->prop->{local_source} = 0; } # we assume URL schemes are at least two characters, that # way Windows absolute paths can be used as local start_url elsif($self->meta->prop->{start_url} =~ /^([a-z]{2,}):/i) { my $scheme = $1; $self->meta->prop->{local_source} = $scheme eq 'file'; } else { $self->meta->prop->{local_source} = 1; } } return $self; } sub resume { my(undef, $alienfile, $root) = @_; my $h = JSON::PP::decode_json(_path("$root/state.json")->slurp); my $self = Alien::Build->load("$alienfile", @{ $h->{args} }); $self->{install_prop} = $h->{install}; $self->{plugin_instance_prop} = $h->{plugin_instance}; $self->{runtime_prop} = $h->{runtime}; $self; } sub meta_prop { my($class) = @_; $class->meta->prop; } sub install_prop { shift->{install_prop}; } sub plugin_instance_prop { my($self, $plugin) = @_; my $instance_id = $plugin->instance_id; $self->{plugin_instance_prop}->{$instance_id} ||= {}; } sub runtime_prop { shift->{runtime_prop}; } sub hook_prop { shift->{hook_prop}; } sub _command_prop { my($self) = @_; return { alien => { install => $self->install_prop, runtime => $self->runtime_prop, hook => $self->hook_prop, meta => $self->meta_prop, }, perl => { config => \%Config::Config, }, env => \%ENV, }; } sub checkpoint { my($self) = @_; my $root = $self->root; _path("$root/state.json")->spew( JSON::PP->new->pretty->canonical(1)->ascii->encode({ install => $self->install_prop, runtime => $self->runtime_prop, plugin_instance => $self->{plugin_instance_prop}, args => $self->{args}, }) ); $self; } sub root { my($self) = @_; my $root = $self->install_prop->{root}; _path($root)->mkpath unless -d $root; $root; } sub install_type { my($self) = @_; $self->{runtime_prop}->{install_type} ||= $self->probe; } sub is_system_install { my($self) = @_; $self->install_type eq 'system'; } sub is_share_install { my($self) = @_; $self->install_type eq 'share'; } sub download_rule { my($self) = @_; $self->install_prop->{download_rule} ||= do { my $dr = $ENV{ALIEN_DOWNLOAD_RULE}; $dr = 'warn' unless defined $dr; $dr = 'warn' if $dr eq 'default'; unless($dr =~ /^(warn|digest|encrypt|digest_or_encrypt|digest_and_encrypt)$/) { $self->log("unknown ALIEN_DOWNLOAD_RULE \"$dr\", using \"warn\" instead"); $dr = 'warn'; } $dr; }; } sub set_prefix { my($self, $prefix) = @_; if($self->meta_prop->{destdir}) { $self->runtime_prop->{prefix} = $self->install_prop->{prefix} = $prefix; } else { $self->runtime_prop->{prefix} = $prefix; $self->install_prop->{prefix} = $self->install_prop->{stage}; } } sub set_stage { my($self, $dir) = @_; $self->install_prop->{stage} = $dir; } sub _merge { my %h; while(@_) { my $mod = shift; my $ver = shift; if((!defined $h{$mod}) || $ver > $h{$mod}) { $h{$mod} = $ver } } \%h; } sub requires { my($self, $phase) = @_; $phase ||= 'any'; my $meta = $self->meta; $phase =~ /^(?:any|configure)$/ ? $meta->{require}->{$phase} || {} : _merge %{ $meta->{require}->{any} }, %{ $meta->{require}->{$phase} }; } sub load_requires { my($self, $phase, $eval) = @_; my $reqs = $self->requires($phase); foreach my $mod (keys %$reqs) { my $ver = $reqs->{$mod}; my $check = sub { my $pm = "$mod.pm"; $pm =~ s{::}{/}g; require $pm; }; if($eval) { eval { $check->() }; die "Required $mod @{[ $ver || 'undef' ]}, missing" if $@; } else { $check->(); } # note Test::Alien::Build#alienfile_skip_if_missing_prereqs does a regex # on this diagnostic, so if you change it here, change it there too. die "Required $mod $ver, have @{[ $mod->VERSION || 0 ]}" if $ver && ! $mod->VERSION($ver); # allow for requires on Alien::Build or Alien::Base next if $mod eq 'Alien::Build'; next if $mod eq 'Alien::Base'; if($mod->can('bin_dir')) { push @{ $self->{bin_dir} }, $mod->bin_dir; } if(($mod->can('runtime_prop') && $mod->runtime_prop) || ($mod->isa('Alien::Base') && $mod->install_type('share'))) { for my $dir (qw(lib share)) { my $path = _path($mod->dist_dir)->child("$dir/pkgconfig"); if(-d $path) { push @{ $self->{pkg_config_path} }, $path->stringify; } } my $path = _path($mod->dist_dir)->child('share/aclocal'); if(-d $path) { $path = "$path"; if($^O eq 'MSWin32') { # convert to MSYS path $path =~ s{^([a-z]):}{/$1/}i; } push @{ $self->{aclocal_path} }, $path; } } # sufficiently new Autotools have a aclocal_dir which will # give us the directories we need. if($mod eq 'Alien::Autotools' && $mod->can('aclocal_dir')) { push @{ $self->{aclocal_path} }, $mod->aclocal_dir; } if($mod->can('alien_helper')) { my $helpers = $mod->alien_helper; foreach my $name (sort keys %$helpers) { my $code = $helpers->{$name}; $self->meta->interpolator->replace_helper($name => $code); } } } 1; } sub _call_hook { my $self = shift; local $ENV{PATH} = $ENV{PATH}; unshift @PATH, @{ $self->{bin_dir} }; local $ENV{PKG_CONFIG_PATH} = $ENV{PKG_CONFIG_PATH}; unshift @PKG_CONFIG_PATH, @{ $self->{pkg_config_path} }; local $ENV{ACLOCAL_PATH} = $ENV{ACLOCAL_PATH}; # autoconf uses MSYS paths, even for the ACLOCAL_PATH environment variable, so we can't use Env for this. { my @path; @path = split /:/, $ENV{ACLOCAL_PATH} if defined $ENV{ACLOCAL_PATH}; unshift @path, @{ $self->{aclocal_path} }; $ENV{ACLOCAL_PATH} = join ':', @path; } my $config = ref($_[0]) eq 'HASH' ? shift : {}; my($name, @args) = @_; local $self->{hook_prop} = {}; $self->meta->call_hook( $config, $name => $self, @args ); } sub probe { my($self) = @_; local $CWD = $self->root; my $dir; my $env = $self->_call_hook('override'); my $type; my $error; $env = '' if $env eq 'default'; if($env eq 'share') { $type = 'share'; } else { $type = eval { $self->_call_hook( { before => sub { $dir = Alien::Build::TempDir->new($self, "probe"); $CWD = "$dir"; }, after => sub { $CWD = $self->root; }, ok => 'system', continue => sub { if($_[0] eq 'system') { foreach my $name (qw( probe_class probe_instance_id )) { if(exists $self->hook_prop->{$name} && defined $self->hook_prop->{$name}) { $self->install_prop->{"system_$name"} = $self->hook_prop->{$name}; } } return undef; } else { return 1; } }, }, 'probe', ); }; $error = $@; $type = 'share' unless defined $type; } if($error) { if($env eq 'system') { die $error; } $self->log("error in probe (will do a share install): $@"); $self->log("Don't panic, we will attempt a share build from source if possible."); $self->log("Do not file a bug unless you expected a system install to succeed."); $type = 'share'; } if($env && $env ne $type) { die "requested $env install not available"; } if($type !~ /^(system|share)$/) { Carp::croak "probe hook returned something other than system or share: $type"; } if($type eq 'share' && (!$self->meta_prop->{network}) && (!$self->meta_prop->{local_source})) { $self->log("install type share requested or detected, but network fetch is turned off"); $self->log("see https://metacpan.org/pod/Alien::Build::Manual::FAQ#Network-fetch-is-turned-off"); Carp::croak "network fetch is turned off"; } $self->runtime_prop->{install_type} = $type; $type; } sub download { my($self) = @_; return $self unless $self->install_type eq 'share'; return $self if $self->install_prop->{complete}->{download}; if($self->meta->has_hook('download')) { my $tmp; local $CWD; my $valid = 0; $self->_call_hook( { before => sub { $tmp = Alien::Build::TempDir->new($self, "download"); $CWD = "$tmp"; }, verify => sub { my @list = grep { $_->basename !~ /^\./, } _path('.')->children; my $count = scalar @list; if($count == 0) { die "no files downloaded"; } elsif($count == 1) { my($archive) = $list[0]; if(-d $archive) { # TODO: this is probably a bug that we don't set # download or compelte properties? $self->log("single dir, assuming directory"); } else { $self->log("single file, assuming archive"); } $self->install_prop->{download} = $archive->absolute->stringify; $self->install_prop->{complete}->{download} = 1; $valid = 1; } else { $self->log("multiple files, assuming directory"); $self->install_prop->{complete}->{download} = 1; $self->install_prop->{download} = _path('.')->absolute->stringify; $valid = 1; } }, after => sub { $CWD = $self->root; }, }, 'download', ); # experimental and undocumented for now if($self->meta->has_hook('check_download')) { $self->meta->call_hook(check_download => $self); } return $self if $valid; } else { # This will call the default download hook # defined in Core::Download since the recipe # does not provide a download hook my $ret = $self->_call_hook('download'); # experimental and undocumented for now if($self->meta->has_hook('check_download')) { $self->meta->call_hook(check_download => $self); } return $self; } die "download failed"; } sub fetch { my $self = shift; my $url = $_[0] || $self->meta_prop->{start_url}; my $secure = 0; if(defined $url && ($url =~ /^(https|file):/ || $url !~ /:/)) { # considered secure when either https or a local file $secure = 1; } elsif(!defined $url) { $self->log("warning: undefined url in fetch"); } else { $self->log("warning: attempting to fetch a non-TLS or bundled URL: @{[ $url ]}"); } die "insecure fetch is not allowed" if $self->download_rule =~ /^(encrypt|digest_and_encrypt)$/ && !$secure; my $file = $self->_call_hook( 'fetch' => @_ ); $secure = 0; if(ref($file) ne 'HASH') { $self->log("warning: fetch returned non-hash reference"); } elsif(!defined $file->{protocol}) { $self->log("warning: fetch did not return a protocol"); } elsif($file->{protocol} !~ /^(https|file)$/) { $self->log("warning: fetch did not use a secure protocol: @{[ $file->{protocol} ]}"); } else { $secure = 1; } die "insecure fetch is not allowed" if $self->download_rule =~ /^(encrypt|digest_and_encrypt)$/ && !$secure; $file; } sub check_digest { my($self, $file) = @_; return '' unless $self->meta_prop->{check_digest}; unless(ref($file) eq 'HASH') { my $path = Path::Tiny->new($file); $file = { type => 'file', filename => $path->basename, path => "$path", tmp => 0, }; } my $path = $file->{path}; if(defined $path) { # there is technically a race condition here die "Missing file in digest check: @{[ $file->{filename} ]}" unless -f $path; die "Unreadable file in digest check: @{[ $file->{filename} ]}" unless -r $path; } else { die "File is wrong type" unless defined $file->{type} && $file->{type} eq 'file'; die "File has no filename" unless defined $file->{filename}; die "@{[ $file->{filename} ]} has no content" unless defined $file->{content}; } my $filename = $file->{filename}; my $signature = $self->meta_prop->{digest}->{$filename} || $self->meta_prop->{digest}->{'*'}; die "No digest for $filename" unless defined $signature && ref $signature eq 'ARRAY'; my($algo, $expected) = @$signature; if($self->meta->call_hook( check_digest => $self, $file, $algo, $expected )) { # record the verification here so that we can check in the extract step that the signature # was checked. $self->install_prop->{download_detail}->{$path}->{digest} = [$algo, $expected] if defined $path; return 1; } else { die "No plugin provides digest algorithm for $algo"; } } sub decode { my($self, $res) = @_; my $res2 = $self->_call_hook( decode => $res ); $res2->{protocol} = $res->{protocol} if !defined $res2->{protocol} && defined $res->{protocol}; return $res2; } sub prefer { my($self, $res) = @_; my $res2 = $self->_call_hook( prefer => $res ); $res2->{protocol} = $res->{protocol} if !defined $res2->{protocol} && defined $res->{protocol}; return $res2; } sub extract { my($self, $archive) = @_; $archive ||= $self->install_prop->{download}; unless(defined $archive) { die "tried to call extract before download"; } { my $checked_digest = 0; my $encrypted_fetch = 0; my $detail = $self->install_prop->{download_detail}->{$archive}; if(defined $detail) { if(defined $detail->{digest}) { my($algo, $expected) = @{ $detail->{digest} }; my $file = { type => 'file', filename => Path::Tiny->new($archive)->basename, path => $archive, tmp => 0, }; $checked_digest = $self->meta->call_hook( check_digest => $self, $file, $algo, $expected ) } if(!defined $detail->{protocol}) { $self->log("warning: extract did not receive protocol details for $archive") unless $checked_digest; } elsif($detail->{protocol} !~ /^(https|file)$/) { $self->log("warning: extracting from a file that was fetched via insecure protocol @{[ $detail->{protocol} ]}") unless $checked_digest ; } else { $encrypted_fetch = 1; } } else { $self->log("warning: extract received no download details for $archive"); } if($self->download_rule eq 'digest') { die "required digest missing for $archive" unless $checked_digest; } elsif($self->download_rule eq 'encrypt') { die "file was fetched insecurely for $archive" unless $encrypted_fetch; } elsif($self->download_rule eq 'digest_or_encrypt') { die "file was fetched insecurely and required digest missing for $archive" unless $checked_digest || $encrypted_fetch; } elsif($self->download_rule eq 'digest_and_encrypt') { die "file was fetched insecurely and required digest missing for $archive" unless $checked_digest || $encrypted_fetch; die "required digest missing for $archive" unless $checked_digest; die "file was fetched insecurely for $archive" unless $encrypted_fetch; } elsif($self->download_rule eq 'warn') { unless($checked_digest || $encrypted_fetch) { $self->log("!!! NOTICE OF FUTURE CHANGE IN BEHAVIOR !!!"); $self->log("a future version of Alien::Build will die here by default with this exception: file was fetched insecurely and required digest missing for $archive"); $self->log("!!! NOTICE OF FUTURE CHANGE IN BEHAVIOR !!!"); } } else { die "internal error, unknown download rule: @{[ $self->download_rule ]}"; } } my $nick_name = 'build'; if($self->meta_prop->{out_of_source}) { $nick_name = 'extract'; my $extract = $self->install_prop->{extract}; return $extract if defined $extract && -d $extract; } my $tmp; local $CWD; my $ret; $self->_call_hook({ before => sub { # called build instead of extract, because this # will be used for the build step, and technically # extract is a substage of build anyway. $tmp = Alien::Build::TempDir->new($self, $nick_name); $CWD = "$tmp"; }, verify => sub { my $path = '.'; if($self->meta_prop->{out_of_source} && $self->install_prop->{extract}) { $path = $self->install_prop->{extract}; } my @list = grep { $_->basename !~ /^\./ && $_->basename ne 'pax_global_header' } _path($path)->children; my $count = scalar @list; if($count == 0) { die "no files extracted"; } elsif($count == 1 && -d $list[0]) { $ret = $list[0]->absolute->stringify; } else { $ret = "$tmp"; } }, after => sub { $CWD = $self->root; }, }, 'extract', $archive); $self->install_prop->{extract} ||= $ret; $ret ? $ret : (); } sub build { my($self) = @_; # save the evironment, in case some plugins decide # to alter it. Or us! See just a few lines below. local %ENV = %ENV; my $stage = _path($self->install_prop->{stage}); $stage->mkpath; my $tmp; if($self->install_type eq 'share') { foreach my $suffix ('', '_ffi') { local $CWD; delete $ENV{DESTDIR} unless $self->meta_prop->{destdir}; my %env_meta = %{ $self->meta_prop ->{env} || {} }; my %env_inst = %{ $self->install_prop->{env} || {} }; if($self->meta_prop->{env_interpolate}) { foreach my $key (keys %env_meta) { $env_meta{$key} = $self->meta->interpolator->interpolate($env_meta{$key}, $self); } } %ENV = (%ENV, %env_meta); %ENV = (%ENV, %env_inst); my $destdir; $self->_call_hook( { before => sub { if($self->meta_prop->{out_of_source}) { $self->extract; $CWD = $tmp = Alien::Build::TempDir->new($self, 'build'); } else { $CWD = $tmp = $self->extract; } if($self->meta_prop->{destdir}) { $destdir = Alien::Build::TempDir->new($self, 'destdir'); $ENV{DESTDIR} = "$destdir"; } $self->_call_hook({ all => 1 }, "patch${suffix}"); }, after => sub { $destdir = "$destdir" if $destdir; }, }, "build${suffix}"); $self->install_prop->{"_ab_build@{[ $suffix || '_share' ]}"} = "$CWD"; $self->_call_hook("gather@{[ $suffix || '_share' ]}"); } } elsif($self->install_type eq 'system') { local $CWD = $self->root; my $dir; $self->_call_hook( { before => sub { $dir = Alien::Build::TempDir->new($self, "gather"); $CWD = "$dir"; }, after => sub { $CWD = $self->root; }, }, 'gather_system', ); $self->install_prop->{finished} = 1; $self->install_prop->{complete}->{gather_system} = 1; } $self; } sub test { my($self) = @_; if($self->install_type eq 'share') { foreach my $suffix ('_share', '_ffi') { if($self->meta->has_hook("test$suffix")) { my $dir = $self->install_prop->{"_ab_build$suffix"}; Carp::croak("no build directory to run tests") unless $dir && -d $dir; local $CWD = $dir; $self->_call_hook("test$suffix"); } } } else { if($self->meta->has_hook("test_system")) { my $dir = Alien::Build::TempDir->new($self, "test"); local $CWD = "$dir"; $self->_call_hook("test_system"); } } } sub clean_install { my($self) = @_; if($self->install_type eq 'share') { $self->_call_hook("clean_install"); } } sub system { my($self, $command, @args) = @_; my $prop = $self->_command_prop; ($command, @args) = map { $self->meta->interpolator->interpolate($_, $prop) } ($command, @args); $self->log("+ $command @args"); scalar @args ? system $command, @args : system $command; } sub log { my(undef, $message) = @_; my $caller = [caller]; chomp $message; foreach my $line (split /\n/, $message) { Alien::Build::Log->default->log( caller => $caller, message => $line, ); } } { my %meta; sub meta { my($class) = @_; $class = ref $class if ref $class; $meta{$class} ||= Alien::Build::Meta->new( class => $class ); } } package Alien::Build::Meta; our @CARP_NOT = qw( alienfile ); sub new { my($class, %args) = @_; my $self = bless { phase => 'any', build_suffix => '', require => { any => {}, share => {}, system => {}, }, around => {}, prop => {}, %args, }, $class; $self; } sub prop { shift->{prop}; } sub filename { my($self, $new) = @_; $self->{filename} = $new if defined $new; $self->{filename}; } sub add_requires { my $self = shift; my $phase = shift; while(@_) { my $module = shift; my $version = shift; my $old = $self->{require}->{$phase}->{$module}; if((!defined $old) || $version > $old) { $self->{require}->{$phase}->{$module} = $version } } $self; } sub interpolator { my($self, $new) = @_; if(defined $new) { if(defined $self->{intr}) { Carp::croak "tried to set interpolator twice"; } if(ref $new) { $self->{intr} = $new; } else { $self->{intr} = $new->new; } } elsif(!defined $self->{intr}) { require Alien::Build::Interpolate::Default; $self->{intr} = Alien::Build::Interpolate::Default->new; } $self->{intr}; } sub has_hook { my($self, $name) = @_; defined $self->{hook}->{$name}; } sub _instr { my($self, $name, $instr) = @_; if(ref($instr) eq 'CODE') { return $instr; } elsif(ref($instr) eq 'ARRAY') { my %phase = ( download => 'share', fetch => 'share', decode => 'share', prefer => 'share', extract => 'share', patch => 'share', patch_ffi => 'share', build => 'share', build_ffi => 'share', stage => 'share', gather_ffi => 'share', gather_share => 'share', gather_system => 'system', test_ffi => 'share', test_share => 'share', test_system => 'system', ); require Alien::Build::CommandSequence; my $seq = Alien::Build::CommandSequence->new(@$instr); $seq->apply_requirements($self, $phase{$name} || 'any'); return $seq; } else { Carp::croak "type not supported as a hook"; } } sub register_hook { my($self, $name, $instr) = @_; push @{ $self->{hook}->{$name} }, _instr $self, $name, $instr; $self; } sub default_hook { my($self, $name, $instr) = @_; $self->{default_hook}->{$name} = _instr $self, $name, $instr; $self; } sub around_hook { my($self, $name, $code) = @_; if(my $old = $self->{around}->{$name}) { # this is the craziest shit I have ever # come up with. $self->{around}->{$name} = sub { my $orig = shift; $code->(sub { $old->($orig, @_) }, @_); }; } else { $self->{around}->{$name} = $code; } } sub after_hook { my($self, $name, $code) = @_; $self->around_hook( $name => sub { my $orig = shift; my $ret = $orig->(@_); $code->(@_); $ret; } ); } sub before_hook { my($self, $name, $code) = @_; $self->around_hook( $name => sub { my $orig = shift; $code->(@_); my $ret = $orig->(@_); $ret; } ); } sub call_hook { my $self = shift; my %args = ref $_[0] ? %{ shift() } : (); my($name, @args) = @_; my $error; my @hooks = @{ $self->{hook}->{$name} || []}; if(@hooks == 0) { if(defined $self->{default_hook}->{$name}) { @hooks = ($self->{default_hook}->{$name}) } elsif(!$args{all}) { Carp::croak "No hooks registered for $name"; } } my $value; foreach my $hook (@hooks) { if(eval { $args[0]->isa('Alien::Build') }) { %{ $args[0]->{hook_prop} } = ( name => $name, ); } my $wrapper = $self->{around}->{$name} || sub { my $code = shift; $code->(@_) }; my $value; $args{before}->() if $args{before}; if(ref($hook) eq 'CODE') { $value = eval { my $value = $wrapper->(sub { $hook->(@_) }, @args); $args{verify}->('code') if $args{verify}; $value; }; } else { $value = $wrapper->(sub { eval { $hook->execute(@_); $args{verify}->('command') if $args{verify}; }; defined $args{ok} ? $args{ok} : 1; }, @args); } $error = $@; $args{after}->() if $args{after}; if($args{all}) { die if $error; } else { next if $error; next if $args{continue} && $args{continue}->($value); return $value; } } die $error if $error && ! $args{all}; $value; } sub apply_plugin { my($self, $name, @args) = @_; my $class; my $pm; my $found; if($name =~ /^=(.*)$/) { $class = $1; $pm = "$class.pm"; $pm =~ s!::!/!g; $found = 1; } if($name !~ /::/ && !$found) { foreach my $inc (@INC) { # TODO: allow negotiators to work with @INC hooks next if ref $inc; my $file = Path::Tiny->new("$inc/Alien/Build/Plugin/$name/Negotiate.pm"); if(-r $file) { $class = "Alien::Build::Plugin::${name}::Negotiate"; $pm = "Alien/Build/Plugin/$name/Negotiate.pm"; $found = 1; last; } } } unless($found) { $class = "Alien::Build::Plugin::$name"; $pm = "Alien/Build/Plugin/$name.pm"; $pm =~ s{::}{/}g; } require $pm unless $class->can('new'); my $plugin = $class->new(@args); $plugin->init($self); $self; } package Alien::Build::TempDir; # TODO: it's confusing that there is both a AB::TempDir and AB::Temp # although they do different things. there could maybe be a better # name for AB::TempDir (maybe AB::TempBuildDir, though that is a little # redundant). Happily both are private classes, and either are able to # rename, if a good name can be thought of. use overload '""' => sub { shift->as_string }, bool => sub { 1 }, fallback => 1; use File::Temp qw( tempdir ); sub new { my($class, $build, $name) = @_; my $root = $build->install_prop->{root}; Path::Tiny->new($root)->mkpath unless -d $root; bless { dir => Path::Tiny->new(tempdir( "${name}_XXXX", DIR => $root)), }, $class; } sub as_string { shift->{dir}->stringify; } sub DESTROY { my($self) = @_; if(-d $self->{dir} && $self->{dir}->children == 0) { rmdir($self->{dir}) || warn "unable to remove @{[ $self->{dir} ]} $!"; } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build - Build external dependencies for use in CPAN =head1 VERSION version 2.84 =head1 SYNOPSIS my $build = Alien::Build->load('./alienfile'); $build->load_requires('configure'); $build->set_prefix('/usr/local'); $build->set_stage('/foo/mystage'); # needs to be absolute $build->load_requires($build->install_type); $build->download; $build->build; # files are now in /foo/mystage, it is your job (or # ExtUtils::MakeMaker, Module::Build, etc) to copy # those files into /usr/local =head1 DESCRIPTION This module provides tools for building external (non-CPAN) dependencies for CPAN. It is mainly designed to be used at install time of a CPAN client, and work closely with L which is used at runtime. This is the detailed documentation for the L class. If you are starting out you probably want to do so from one of these documents: =over 4 =item L A broad overview of C and its ecosystem. =item L For users of an C that is implemented using L. (The developer of C I provide the documentation necessary, but if not, this is the place to start). =item L If you are writing your own L based on L and L. =item L If you have a common question that has already been answered, like "How do I use L with some build system". =item L This is for the brave souls who want to write plugins that will work with L + L. =item L If you are concerned that Ls might be downloading tarballs off the internet, then this is the place for you. This will discuss some of the risks of downloading (really any) software off the internet and will give you some tools to remediate these risks. =back Note that you will not usually create a L instance directly, but rather be using a thin installer layer, such as L (for use with L) or L (for use with L). One of the goals of this project is to remain installer agnostic. =head1 CONSTRUCTORS =head2 new my $build = Alien::Build->new; This creates a new empty instance of L. Normally you will want to use C below to create an instance of L from an L recipe. =head2 load my $build = Alien::Build->load($alienfile); This creates an L instance with the given L recipe. =head2 resume my $build = Alien::Build->resume($alienfile, $root); Load a checkpointed L instance. You will need the original L and the build root (usually C<_alien>), and a build that had been properly checkpointed using the C method below. =head1 PROPERTIES There are three main properties for L. There are a number of properties documented here with a specific usage. Note that these properties may need to be serialized into something primitive like JSON that does not support: regular expressions, code references of blessed objects. If you are writing a plugin (L) you should use a prefix like "plugin_I" (where I is the name of your plugin) so that it does not interfere with other plugin or future versions of L. For example, if you were writing C, please use the prefix C: sub init { my($self, $meta) = @_; $meta->prop( plugin_fetch_newprotocol_foo => 'some value' ); $meta->register_hook( some_hook => sub { my($build) = @_; $build->install_prop->{plugin_fetch_newprotocol_bar} = 'some other value'; $build->runtime_prop->{plugin_fetch_newprotocol_baz} = 'and another value'; } ); } If you are writing a L recipe please use the prefix C: use alienfile; meta_prop->{my_foo} = 'some value'; probe sub { my($build) = @_; $build->install_prop->{my_bar} = 'some other value'; $build->install_prop->{my_baz} = 'and another value'; }; Any property may be used from a command: probe [ 'some command %{.meta.plugin_fetch_newprotocol_foo}' ]; probe [ 'some command %{.install.plugin_fetch_newprotocol_bar}' ]; probe [ 'some command %{.runtime.plugin_fetch_newprotocol_baz}' ]; probe [ 'some command %{.meta.my_foo}' ]; probe [ 'some command %{.install.my_bar}' ]; probe [ 'some command %{.runtime.my_baz}' ]; =head2 meta_prop my $href = $build->meta_prop; my $href = Alien::Build->meta_prop; Meta properties have to do with the recipe itself, and not any particular instance that probes or builds that recipe. Meta properties can be changed from within an L using the C directive, or from a plugin from its C method (though should NOT be modified from any hooks registered within that C method). This is not strictly enforced, but if you do not follow this rule your recipe will likely be broken. =over =item arch This is a hint to an installer like L or L, that the library or tool contains architecture dependent files and so should be stored in an architecture dependent location. If not specified by your L then it will be set to true. =item check_digest True if cryptographic digest should be checked when files are fetched or downloaded. This is set by L. =item destdir Some plugins (L for example) support installing via C. They will set this property to true if they plan on doing such an install. This helps L find the staged install files and how to locate them. If available, C is used to stage install files in a sub directory before copying the files into C. This is generally preferred method if available. =item destdir_filter Regular expression for the files that should be copied from the C into the stage directory. If not defined, then all files will be copied. =item destdir_ffi_filter Same as C except applies to C instead of C. =item digest This properties contains the cryptographic digests (if any) that should be used when verifying any fetched and downloaded files. It is a hash reference where the key is the filename and the value is an array reference containing a pair of values, the first being the algorithm ('SHA256' is recommended) and the second is the actual digest. The special filename C<*> may be specified to indicate that any downloaded file should match that digest. If there are both real filenames and the C<*> placeholder, the real filenames will be used for filenames that match and any other files will use the placeholder. Example: $build->meta_prop->{digest} = { 'foo-1.00.tar.gz' => [ SHA256 => '9feac593aa49a44eb837de52513a57736457f1ea70078346c60f0bfc5f24f2c1' ], 'foo-1.01.tar.gz' => [ SHA256 => '6bbde6a7f10ae5924cf74afc26ff5b7bc4b4f9dfd85c6b534c51bd254697b9e7' ], '*' => [ SHA256 => '33a20aae3df6ecfbe812b48082926d55391be4a57d858d35753ab1334b9fddb3' ], }; Cryptographic signatures will only be checked if the L is set and if the L is loaded. (The Digest negotiator can be used directly, but is also loaded automatically if you use the L is used by the L). =item env Environment variables to override during the build stage. =item env_interpolate Environment variable values will be interpolated with helpers. Example: meta->prop->{env_interpolate} = 1; meta->prop->{env}->{PERL} = '%{perl}'; =item local_source Set to true if source code package is available locally. (that is not fetched over the internet). This is computed by default based on the C property. Can be set by an L or plugin. =item platform Hash reference. Contains information about the platform beyond just C<$^O>. =over 4 =item platform.compiler_type Refers to the type of flags that the compiler accepts. May be expanded in the future, but for now, will be one of: =over 4 =item microsoft On Windows when using Microsoft Visual C++ =item unix Virtually everything else, including gcc on windows. =back The main difference is that with Visual C++ C<-LIBPATH> should be used instead of C<-L>, and static libraries should have the C<.LIB> suffix instead of C<.a>. =item platform.system_type C<$^O> is frequently good enough to make platform specific logic in your L, this handles the case when $^O can cover platforms that provide multiple environments that Perl might run under. The main example is windows, but others may be added in the future. =over 4 =item unix =item vms =item windows-activestate =item windows-microsoft =item windows-mingw =item windows-strawberry =item windows-unknown =back Note that C and C are considered C even though they run on windows! =item platform.cpu.count Contains a non-negative integer of available (possibly virtual) CPUs on the system. This can be used by build plugins to build in parallel. The environment variable C can be set to override the CPU count. =item platform.cpu.arch.name Contains a normalized name for the architecture of the current Perl. This can be used by fetch plugins to determine which binary packages to download. The value may be one of the following, but this list will be expanded as needed. =over 4 =item C 32-bit ARM soft-float =item C 32-bit ARM hard-float =item C 64-bit ARM =item C 32-bit PowerPC (big-endian) =item C 64-bit PowerPC (big-endian) =item C 32-bit Intel (i386, i486, i686) =item C 64-bit Intel (AMD64) =item C Unable to detect architecture. Please report this if needed. =back =back =item out_of_source Build in a different directory from the where the source code is stored. In autoconf this is referred to as a "VPATH" build. Everyone else calls this an "out-of-source" build. When this property is true, instead of extracting to the source build root, the downloaded source will be extracted to an source extraction directory and the source build root will be empty. You can use the C install property to get the location of the extracted source. =item network True if a network fetch is available. This should NOT be set by an L or plugin. This is computed based on the C environment variables. =item start_url The default or start URL used by fetch plugins. =back =head2 install_prop my $href = $build->install_prop; Install properties are used during the install phase (either under C or C install). They are remembered for the entire install phase, but not kept around during the runtime phase. Thus they cannot be accessed from your L based module. =over =item autoconf_prefix The prefix as understood by autoconf. This is only different on Windows Where MSYS is used and paths like C are represented as C which are understood by the MSYS tools, but not by Perl. You should only use this if you are using L in your L. This is set during before the L is run. =item download The location of the downloaded archive (tar.gz, or similar) or directory. This will be undefined until the archive is actually downloaded. =item download_detail This property contains optional details about a downloaded file. This property is populated by L core. This property is a hash reference. The key is the path to the file that has been downloaded and the value is a hash reference with additional detail. All fields are optional. =over 4 =item download_detail.digest This, if available, with the cryptographic signature that was successfully matched against the downloaded file. It is an array reference with a pair of values, the algorithm (typically something like C) and the digest. =item download_detail.protocol This, if available, will be the URL protocol used to fetch the downloaded file. =back =item env Environment variables to override during the build stage. Plugins are free to set additional overrides using this hash. =item extract The location of the last source extraction. For a "out-of-source" build (see the C meta property above), this will only be set once. For other types of builds, the source code may be extracted multiple times, and thus this property may change. =item old [deprecated] Hash containing information on a previously installed Alien of the same name, if available. This may be useful in cases where you want to reuse the previous install if it is still sufficient. =over 4 =item old.prefix [deprecated] The prefix for the previous install. Versions prior to 1.42 unfortunately had this in typo form of C. =item old.runtime [deprecated] The runtime properties from the previous install. =back =item patch Directory with patches, if available. This will be C if there are no patches. When initially installing an alien this will usually be a sibling of the C, a directory called C. Once installed this will be in the share directory called C<_alien/patch>. The former is useful for rebuilding an alienized package using L. =item prefix The install time prefix. Under a C install this is the same as the runtime or final install location. Under a non-C install this is the C directory (usually the appropriate share directory under C). =item root The build root directory. This will be an absolute path. It is the absolute form of C<./_alien> by default. =item stage The stage directory where files will be copied. This is usually the root of the blib share directory. =item system_probe_class After the probe step this property may contain the plugin class that performed the system probe. It shouldn't be filled in directly by the plugin (instead if should use the hook property C, see below). This is optional, and not all probe plugins will provide this information. =item system_probe_instance_id After the probe step this property may contain the plugin instance id that performed the system probe. It shouldn't be filled in directly by the plugin (instead if should use the hook property C, see below). This is optional, and not all probe plugins will provide this information. =back =head2 plugin_instance_prop my $href = $build->plugin_instance_prop($plugin); This returns the private plugin instance properties for a given plugin. This method should usually only be called internally by plugins themselves to keep track of internal state. Because the content can be used arbitrarily by the owning plugin because it is private to the plugin, and thus is not part of the L spec. =head2 runtime_prop my $href = $build->runtime_prop; Runtime properties are used during the install and runtime phases (either under C or C install). This should include anything that you will need to know to use the library or tool during runtime, and shouldn't include anything that is no longer relevant once the install process is complete. =over 4 =item alien_build_version The version of L used to install the library or tool. =item alt Alternate configurations. If the alienized package has multiple libraries this could be used to store the different compiler or linker flags for each library. Typically this will be set by a plugin in the gather stage (for either share or system installs). =item cflags The compiler flags. This is typically set by a plugin in the gather stage (for either share or system installs). =item cflags_static The static compiler flags. This is typically set by a plugin in the gather stage (for either share or system installs). =item command The command name for tools where the name my differ from platform to platform. For example, the GNU version of make is usually C in Linux and C on FreeBSD. This is typically set by a plugin in the gather stage (for either share or system installs). =item ffi_name The name DLL or shared object "name" to use when searching for dynamic libraries at runtime. This is passed into L, so if your library is something like C or C you would set this to C. This may be a string or an array of strings. This is typically set by a plugin in the gather stage (for either share or system installs). =item ffi_checklib This property contains two sub properties: =over 4 =item ffi_checklib.share $build->runtime_prop->{ffi_checklib}->{share} = [ ... ]; Array of additional L flags to pass in to C for a C install. =item ffi_checklib.system Array of additional L flags to pass in to C for a C install. Among other things, useful for specifying the C flag: $build->runtime_prop->{ffi_checklib}->{system} = [ try_linker_script => 1 ]; =back This is typically set by a plugin in the gather stage (for either share or system installs). =item inline_auto_include [version 2.53] This property is an array reference of C code that will be passed into L to make sure that appropriate headers are automatically included. See L for details. =item install_type The install type. This is set by AB core after the L is executed. Is one of: =over 4 =item system For when the library or tool is provided by the operating system, can be detected by L, and is considered satisfactory by the C recipe. =item share For when a system install is not possible, the library source will be downloaded from the internet or retrieved in another appropriate fashion and built. =back =item libs The library flags. This is typically set by a plugin in the gather stage (for either share or system installs). =item libs_static The static library flags. This is typically set by a plugin in the gather stage (for either share or system installs). =item perl_module_version The version of the Perl module used to install the alien (if available). For example if L is installing C this would be the version of L used during the install step. =item prefix The final install root. This is usually they share directory. =item version The version of the library or tool. This is typically set by a plugin in the gather stage (for either share or system installs). =back =head2 hook_prop my $href = $build->hook_prop; Hook properties are for the currently running (if any) hook. They are used only during the execution of each hook and are discarded after. If no hook is currently running then C will return C. =over 4 =item name The name of the currently running hook. =item version (probe) Probe and PkgConfig plugins I set this property indicating the version of the alienized package. Not all plugins and configurations may be able to provide this. =item probe_class (probe) Probe and PkgConfig plugins I set this property indicating the plugin class that made the probe. If the probe results in a system install this will be propagated to C for later use. =item probe_instance_id (probe) Probe and PkgConfig plugins I set this property indicating the plugin instance id that made the probe. If the probe results in a system install this will be propagated to C for later use. =back =head1 METHODS =head2 checkpoint $build->checkpoint; Save any install or runtime properties so that they can be reloaded on a subsequent run in a separate process. This is useful if your build needs to be done in multiple stages from a C, such as with L. Once checkpointed you can use the C constructor (documented above) to resume the probe/build/install] process. =head2 root my $dir = $build->root; This is just a shortcut for: my $root = $build->install_prop->{root}; Except that it will be created if it does not already exist. =head2 install_type my $type = $build->install_type; This will return the install type. (See the like named install property above for details). This method will call C if it has not already been called. =head2 is_system_install my $boolean = $build->is_system_install; Returns true if the alien is a system install type. =head2 is_share_install my $boolean = $build->is_share_install; Returns true if the alien is a share install type. =head2 download_rule my $rule = $build->download_rule; This returns install rule as a string. This is determined by the environment and should be one of: =over 4 =item C Warn only if fetching via non secure source (secure sources include C, and bundled files, may include other encrypted protocols in the future). =item C Require that any downloaded source package have a cryptographic signature in the L and that signature matches what was downloaded. =item C Require that any downloaded source package is fetched via secure source. =item C Require that any downloaded source package is B fetched via a secure source B has a cryptographic signature in the L and that signature matches what was downloaded. =item C Require that any downloaded source package is B fetched via a secure source B has a cryptographic signature in the L and that signature matches what was downloaded. =back The current default is C, but in the near future this will be upgraded to C. =head2 set_prefix $build->set_prefix($prefix); Set the final (unstaged) prefix. This is normally only called by L and similar modules. It is not intended for use from plugins or from an L. =head2 set_stage $build->set_stage($dir); Sets the stage directory. This is normally only called by L and similar modules. It is not intended for use from plugins or from an L. =head2 requires my $hash = $build->requires($phase); Returns a hash reference of the modules required for the given phase. Phases include: =over 4 =item configure These modules must already be available when the L is read. =item any These modules are used during either a C or C install. =item share These modules are used during the build phase of a C install. =item system These modules are used during the build phase of a C install. =back =head2 load_requires $build->load_requires($phase); This loads the appropriate modules for the given phase (see C above for a description of the phases). =head2 probe my $install_type = $build->probe; Attempts to determine if the operating system has the library or tool already installed. If so, then the string C will be returned and a system install will be performed. If not, then the string C will be installed and the tool or library will be downloaded and built from source. If the environment variable C is set, then that will force a specific type of install. If the detection logic cannot accommodate the install type requested then it will fail with an exception. =head2 download $build->download; Download the source, usually as a tarball, usually from the internet. Under a C install this does not do anything. =head2 fetch my $res = $build->fetch; my $res = $build->fetch($url, %options); Fetch a resource using the fetch hook. Returns the same hash structure described below in the L documentation. [version 2.39] As of L 2.39, these options are supported: =over 4 =item http_headers my $res = $build->fetch($url, http_headers => [ $key1 => $value1, $key2 => $value 2, ... ]); Set the HTTP request headers on all outgoing HTTP requests. Note that not all protocols or fetch plugins support setting request headers, but the ones that do not I issue a warning if you try to set request headers and they are not supported. =back =head2 check_digest [experimental] my $bool = $build->check_digest($path); Checks any cryptographic signatures for the given file. The file is specified by C<$path> which may be one of: =over 4 =item string Containing the path to the file to be checked. =item L Containing the path to the file to be checked. =item C A Hash reference containing information about a file. See the L for details on the format. =back Returns true if the cryptographic signature matches, false if cryptographic signatures are disabled. Will throw an exception if the signature does not match, or if no plugin provides the correct algorithm for checking the signature. =head2 decode my $decoded_res = $build->decode($res); Decode the HTML or file listing returned by C. Returns the same hash structure described below in the L documentation. =head2 prefer my $sorted_res = $build->prefer($res); Filter and sort candidates. The preferred candidate will be returned first in the list. The worst candidate will be returned last. Returns the same hash structure described below in the L documentation. =head2 extract my $dir = $build->extract; my $dir = $build->extract($archive); Extracts the given archive into a fresh directory. This is normally called internally to L, and for normal usage is not needed from a plugin or L. =head2 build $build->build; Run the build step. It is expected that C and C have already been performed. What it actually does depends on the type of install: =over 4 =item share The source is extracted, and built as determined by the L recipe. If there is a C that will be executed last. =item system The L will be executed. =back =head2 test $build->test; Run the test phase =head2 clean_install $build->clean_install Clean files from the final install location. The default implementation removes all files recursively except for the C<_alien> directory. This is helpful when you have an old install with files that may break the new build. For a non-share install this doesn't do anything. =head2 system $build->system($command); $build->system($command, @args); Interpolates the command and arguments and run the results using the Perl C command. =head2 log $build->log($message); Send a message to the log. By default this prints to C. =head2 meta my $meta = Alien::Build->meta; my $meta = $build->meta; Returns the meta object for your L class or instance. The meta object is a way to manipulate the recipe, and so any changes to the meta object should be made before the C, C or C steps. =head1 META METHODS =head2 prop my $href = $build->meta->prop; Meta properties. This is the same as calling C on the class or L instance. =head2 add_requires Alien::Build->meta->add_requires($phase, $module => $version, ...); Add the requirement to the given phase. Phase should be one of: =over 4 =item configure =item any =item share =item system =back =head2 interpolator my $interpolator = $build->meta->interpolator; my $interpolator = Alien::Build->interpolator; Returns the L instance for the L class. =head2 has_hook my $bool = $build->meta->has_hook($name); my $bool = Alien::Build->has_hook($name); Returns if there is a usable hook registered with the given name. =head2 register_hook $build->meta->register_hook($name, $instructions); Alien::Build->meta->register_hook($name, $instructions); Register a hook with the given name. C<$instruction> should be either a code reference, or a command sequence, which is an array reference. =head2 default_hook $build->meta->default_hook($name, $instructions); Alien::Build->meta->default_hook($name, $instructions); Register a default hook, which will be used if the L does not register its own hook with that name. =head2 around_hook $build->meta->around_hook($hook_name, $code); Alien::Build->meta->around_hook($hook_name, $code); Wrap the given hook with a code reference. This is similar to a L method modifier, except that it wraps around the given hook instead of a method. For example, this will add a probe system requirement: $build->meta->around_hook( probe => sub { my $orig = shift; my $build = shift; my $type = $orig->($build, @_); return $type unless $type eq 'system'; # also require a configuration file if(-f '/etc/foo.conf') { return 'system'; } else { return 'share'; } }, ); =head2 after_hook $build->meta->after_hook($hook_name, sub { my(@args) = @_; ... }); Execute the given code reference after the hook. The original arguments are passed into the code reference. =head2 before_hook $build->meta->before_hook($hook_name, sub { my(@args) = @_; ... }); Execute the given code reference before the hook. The original arguments are passed into the code reference. =head2 apply_plugin Alien::Build->meta->apply_plugin($name); Alien::Build->meta->apply_plugin($name, @args); Apply the given plugin with the given arguments. =head1 ENVIRONMENT L responds to these environment variables: =over 4 =item ALIEN_BUILD_LOG The default log class used. See L and L. =item ALIEN_BUILD_PKG_CONFIG Override the logic in L which chooses the best C plugin. =item ALIEN_BUILD_POSTLOAD semicolon separated list of plugins to automatically load after parsing your L. =item ALIEN_BUILD_PRELOAD semicolon separated list of plugins to automatically load before parsing your L. =item ALIEN_BUILD_RC Perl source file which can override some global defaults for L, by, for example, setting preload and postload plugins. =item ALIEN_DOWNLOAD_RULE This value determines the rules by which types of downloads are allowed. The legal values listed under L, plus C which will be the default for the current version of L. For this version that default is C. =item ALIEN_INSTALL_NETWORK If set to true (the default), then network fetch will be allowed. If set to false, then network fetch will not be allowed. What constitutes a local vs. network fetch is determined based on the C and C meta properties. An L or plugin C override this detection (possibly inappropriately), so this variable is not a substitute for properly auditing of Perl modules for environments that require that. =item ALIEN_INSTALL_TYPE If set to C or C, it will override the system detection logic. If set to C, it will use the default setting for the L. The behavior of other values is undefined. Although the recommended way for a consumer to use an L based L is to declare it as a static configure and build-time dependency, some consumers may prefer to fallback on using an L only when the consumer itself cannot detect the necessary package. In some cases the consumer may want the user to opt-in to using an L before requiring it. To keep the interface consistent among Aliens, the consumer of the fallback opt-in L may fallback on the L if the environment variable C is set to any value. The rationale is that by setting this environment variable the user is aware that L modules may be installed and have indicated consent. The actual implementation of this, by its nature would have to be in the consuming CPAN module. =item DESTDIR This environment variable will be manipulated during a destdir install. =item PKG_CONFIG This environment variable can be used to override the program name for C when using the command line plugin: L. =item ftp_proxy, all_proxy If these environment variables are set, it may influence the Download negotiation plugin L. Other proxy variables may be used by some Fetch plugins, if they support it. =back =head1 SUPPORT The intent of the C team is to support the same versions of Perl that are supported by the Perl toolchain. As of this writing that means 5.16 and better. Please feel encouraged to report issues that you encounter to the project GitHub Issue tracker: =over 4 =item L =back Better if you can fix the issue yourself, please feel encouraged to open pull-request on the project GitHub: =over 4 =item L =back If you are confounded and have questions, join us on the C<#native> channel on irc.perl.org. The C developers frequent this channel and can probably help point you in the right direction. If you don't have an IRC client handy, you can use this web interface: =over 4 =item L =back =head1 SEE ALSO L, L, L, L, L L, L, L, L, L =head1 THANKS L was originally written by Joel Berger, the rest of this project would not have been possible without him getting the project started. Thanks to his support I have been able to augment the original L system with a reliable set of tools (L, L, L), which make up this toolset. The original L is still copyright (c) 2012-2020 Joel Berger. It has the same license as the rest of the Alien::Build and related tools distributed as C. Joel Berger thanked a number of people who helped in in the development of L, in the documentation for that module. I would also like to acknowledge the other members of the PerlAlien github organization, Zakariyya Mughal (sivoais, ZMUGHAL) and mohawk (ETJ). Also important in the early development of L were the early adopters Chase Whitener (genio, CAPOEIRAB, author of L), William N. Braswell, Jr (willthechill, WBRASWELL, author of L and L) and Ahmad Fatoum (a3f, ATHREEF, author of L and L). The Alien ecosystem owes a debt to Dan Book, who goes by Grinnz on IRC, for answering question about how to use L and friends. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/000755 000000 000000 00000000000 14710030646 016350 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/CommandSequence.pm000644 000000 000000 00000011655 14710030646 021765 0ustar00rootroot000000 000000 package Alien::Build::CommandSequence; use strict; use warnings; use 5.008004; use Text::ParseWords qw( shellwords ); use Capture::Tiny qw( capture ); # ABSTRACT: Alien::Build command sequence our $VERSION = '2.84'; # VERSION sub new { my($class, @commands) = @_; my $self = bless { commands => \@commands, }, $class; $self; } sub apply_requirements { my($self, $meta, $phase) = @_; my $intr = $meta->interpolator; foreach my $command (@{ $self->{commands} }) { next if ref $command eq 'CODE'; if(ref $command eq 'ARRAY') { foreach my $arg (@$command) { next if ref $arg eq 'CODE'; $meta->add_requires($phase, $intr->requires($arg)) } } else { $meta->add_requires($phase, $intr->requires($command)); } } $self; } my %built_in = ( cd => sub { my(undef, $dir) = @_; if(!defined $dir) { die "undef passed to cd"; } elsif(-d $dir) { chdir($dir) || die "unable to cd $dir $!"; } else { die "unable to cd $dir, does not exist"; } }, ); sub _run_list { my($build, @cmd) = @_; $build->log("+ @cmd"); return $built_in{$cmd[0]}->(@cmd) if $built_in{$cmd[0]}; system @cmd; die "external command failed" if $?; } sub _run_string { my($build, $cmd) = @_; $build->log("+ $cmd"); { my $cmd = $cmd; $cmd =~ s{\\}{\\\\}g if $^O eq 'MSWin32'; my @cmd = shellwords($cmd); return $built_in{$cmd[0]}->(@cmd) if $built_in{$cmd[0]}; } system $cmd; die "external command failed" if $?; } sub _run_with_code { my($build, @cmd) = @_; my $code = pop @cmd; $build->log("+ @cmd"); my %args = ( command => \@cmd ); if($built_in{$cmd[0]}) { my $error; ($args{out}, $args{err}, $error) = capture { eval { $built_in{$cmd[0]}->(@cmd) }; $@; }; $args{exit} = $error eq '' ? 0 : 2; $args{builtin} = 1; } else { ($args{out}, $args{err}, $args{exit}) = capture { system @cmd; $? }; } $build->log("[output consumed by Alien::Build recipe]"); $code->($build, \%args); } sub _apply { my($where, $prop, $value) = @_; if($where =~ /^(.*?)\.(.*?)$/) { _apply($2, $prop->{$1}, $value); } else { $prop->{$where} = $value; } } sub execute { my($self, $build) = @_; my $intr = $build->meta->interpolator; foreach my $command (@{ $self->{commands} }) { if(ref($command) eq 'CODE') { $command->($build); } elsif(ref($command) eq 'ARRAY') { my($command, @args) = @$command; my $code; $code = pop @args if $args[-1] && ref($args[-1]) eq 'CODE'; if($args[-1] && ref($args[-1]) eq 'SCALAR') { my $dest = ${ pop @args }; if($dest =~ /^\%\{((?:alien|)\.(?:install|runtime|hook)\.[a-z\.0-9_]+)\}$/) { $dest = $1; $dest =~ s/^\./alien./; $code = sub { my($build, $args) = @_; die "external command failed" if $args->{exit}; my $out = $args->{out}; chomp $out; _apply($dest, $build->_command_prop, $out); }; } else { die "illegal destination: $dest"; } } ($command, @args) = map { $intr->interpolate($_, $build) } ($command, @args); if($code) { _run_with_code $build, $command, @args, $code; } else { _run_list $build, $command, @args; } } else { my $command = $intr->interpolate($command, $build); _run_string $build, $command; } } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::CommandSequence - Alien::Build command sequence =head1 VERSION version 2.84 =head1 CONSTRUCTOR =head2 new my $seq = Alien::Build::CommandSequence->new(@commands); =head1 METHODS =head2 apply_requirements $seq->apply_requirements($meta, $phase); =head2 execute $seq->execute($build); =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Interpolate.pm000644 000000 000000 00000014607 14710030646 021204 0ustar00rootroot000000 000000 package Alien::Build::Interpolate; use strict; use warnings; use 5.008004; # ABSTRACT: Advanced interpolation engine for Alien builds our $VERSION = '2.84'; # VERSION sub new { my($class) = @_; my $self = bless { helper => {}, classes => {}, }, $class; $self; } sub add_helper { my $self = shift; my $name = shift; my $code = shift; if(defined $self->{helper}->{$name}) { require Carp; Carp::croak("duplicate implementation for interpolated key $name"); } my $require; if(ref $_[0] eq 'CODE') { $require = shift; } else { $require = []; while(@_) { my $module = shift; my $version = shift; $version ||= 0; push @$require, $module => $version; } } $self->{helper}->{$name} = Alien::Build::Helper->new( $name, $code, $require, ); } sub replace_helper { my $self = shift; my($name) = @_; delete $self->{helper}->{$name}; $self->add_helper(@_); } sub has_helper { my($self, $name) = @_; return unless defined $self->{helper}->{$name}; my @require = $self->{helper}->{$name}->require; while(@require) { my $module = shift @require; my $version = shift @require; { my $pm = "$module.pm"; $pm =~ s/::/\//g; require $pm; $module->VERSION($version) if $version; } unless($self->{classes}->{$module}) { if($module->can('alien_helper')) { my $helpers = $module->alien_helper; foreach my $k (keys %$helpers) { $self->{helper}->{$k}->code($helpers->{$k}); } } $self->{classes}->{$module} = 1; } } my $code = $self->{helper}->{$name}->code; return unless defined $code; if(ref($code) ne 'CODE') { my $perl = $code; package Alien::Build::Interpolate::Helper; $code = sub { ## no critic my $value = eval $perl; ## use critic die $@ if $@; $value; }; } $code; } sub execute_helper { my($self, $name) = @_; my $code = $self->has_helper($name); die "no helper defined for $name" unless defined $code; $code->(); } sub _get_prop { my($name, $prop, $orig) = @_; $name =~ s/^\./alien./; if($name =~ /^(.*?)\.(.*)$/) { my($key,$rest) = ($1,$2); return _get_prop($rest, $prop->{$key}, $orig); } elsif(exists $prop->{$name}) { return $prop->{$name}; } else { require Carp; Carp::croak("No property $orig is defined"); } } sub interpolate { my($self, $string, $build) = @_; my $prop = defined $build && eval { $build->isa('Alien::Build') } ? $build->_command_prop : {}; $string =~ s{(?execute_helper($1)}eg; $string =~ s{(?{helper}->{$_}; $helper ? $helper->require : (); } $string =~ m{(?{helper} }) { $helper{$name} = $self->{helper}->{$name}->clone; } my $new = bless { helper => \%helper, classes => Storable::dclone($self->{classes}), }, ref $self; } package Alien::Build::Helper; sub new { my($class, $name, $code, $require) = @_; bless { name => $name, code => $code, require => $require, }, $class; } sub name { shift->{name} } sub code { my($self, $code) = @_; $self->{code} = $code if $code; $self->{code}; } sub require { my($self) = @_; if(ref $self->{require} eq 'CODE') { $self->{require} = [ $self->{require}->($self) ]; } @{ $self->{require} }; } sub clone { my($self) = @_; my $class = ref $self; $class->new( $self->name, $self->code, [ $self->require ], ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Interpolate - Advanced interpolation engine for Alien builds =head1 VERSION version 2.84 =head1 CONSTRUCTOR =head2 new my $intr = Alien::Build::Interpolate->new; =head2 add_helper $intr->add_helper($name => $code); $intr->add_helper($name => $code, %requirements); =head2 replace_helper $intr->replace_helper($name => $code); $intr->replace_helper($name => $code, %requirements); =head2 has_helper my $coderef = $intr->has_helper($name); Used to discover if a helper exists with the given name. Returns the code reference. =head2 execute_helper my $value = $intr->execute_helper($name); This evaluates the given helper and returns the result. =head2 interpolate my $string = $intr->interpolate($template, $build); my $string = $intr->interpolate($template); This takes a template and fills in the appropriate values of any helpers used in the template. [version 2.58] If you pass in an L instance as the second argument, you can use properties as well as helpers in the template. Example: my $patch = $intr->template("%{.install.patch}/foo-%{.runtime.version}.patch", $build); =head2 requires my %requires = $intr->requires($template); This returns a hash of modules required in order to execute the given template. The keys are the module names and the values are the versions. Version will be set to C<0> if any version is sufficient. =head2 clone my $intr2 = $intr->clone; This creates a clone of the interpolator. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Interpolate/000755 000000 000000 00000000000 14710030646 020636 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Interpolate/Default.pm000644 000000 000000 00000020202 14710030646 022554 0ustar00rootroot000000 000000 package Alien::Build::Interpolate::Default; use strict; use warnings; use 5.008004; use parent qw( Alien::Build::Interpolate ); use File::chdir; use File::Which qw( which ); use Capture::Tiny qw( capture ); # ABSTRACT: Default interpolator for Alien::Build our $VERSION = '2.84'; # VERSION sub _config { $Config::Config{$_[0]}; } sub new { my($class) = @_; my $self = $class->SUPER::new(@_); $self->add_helper( ar => sub { _config 'ar' }, 'Config' ); $self->add_helper( bison => undef, sub { my $helper = shift; if(which 'bison') { $helper->code(sub { 'bison' }); return (); } else { return 'Alien::bison' => '0.17'; } }); $self->add_helper( bzip2 => undef, sub { my $helper = shift; if(which 'bzip2') { $helper->code( sub { 'bzip2' }); return (); } else { return 'Alien::Libbz2' => '0.04'; } }); $self->add_helper( cc => sub { _config 'cc' }, 'Config' ); $self->add_helper( cmake => sub { 'cmake' }, sub { if(which 'cmake') { return (); } else { return 'Alien::CMake' => '0.07'; } }); $self->add_helper( cp => sub { _config 'cp' }, 'Config' ); $self->add_helper( devnull => sub { $^O eq 'MSWin32' ? 'NUL' : '/dev/null' }); $self->add_helper( flex => undef, sub { my $helper = shift; if(which 'flex') { $helper->code(sub { 'flex' }); return (); } else { return 'Alien::flex' => '0.08'; } }); $self->add_helper( gmake => undef, 'Alien::gmake' => '0.11' ); $self->add_helper( install => sub { 'install' }); $self->add_helper( ld => sub { _config 'ld' }, 'Config' ); $self->add_helper( m4 => undef, 'Alien::m4' => '0.08' ); if($^O eq 'MSWin32') { # TL;DR: dmake is bad, and shouldn't be used to build anything but older # versions of Windows Perl that don't support gmake. my $perl_make = _config 'make'; my $my_make; $self->add_helper( make => sub { return $my_make if defined $my_make; if( $perl_make ne 'dmake' && which $perl_make ) { # assume if it is called nmake or gmake that it really is what it # says it is. if( $perl_make eq 'nmake' || $perl_make eq 'gmake' ) { return $my_make = $perl_make; } my $out = capture { system $perl_make, '--version' }; if( $out =~ /GNU make/i || $out =~ /Microsoft \(R\) Program Maintenance/ ) { return $my_make = $perl_make; } } # if we see something that looks like it might be gmake, use that. foreach my $try (qw( gmake mingw32-make )) { return $my_make = $try if which $try; } if( which 'make' ) { my $out = capture { system 'make', '--version' }; if( $out =~ /GNU make/i || $out =~ /Microsoft \(R\) Program Maintenance/ ) { return $my_make = 'make'; } } # if we see something that looks like it might be nmake, use that. foreach my $try (qw( nmake )) { return $my_make = $try if which $try; } $my_make = $perl_make; }); } else { $self->add_helper( make => sub { _config 'make' }, 'Config' ); } $self->add_helper( mkdir_deep => sub { $^O eq 'MSWin32' ? 'md' : 'mkdir -p'}, 'Alien::Build' => '1.04' ); $self->add_helper( make_path => sub { $^O eq 'MSWin32' ? 'md' : 'mkdir -p'}, 'Alien::Build' => '1.05' ); $self->add_helper( nasm => undef, sub { my $helper = shift; if(which 'nasm') { $helper->code(sub { 'nasm' }); return (); } else { return 'Alien::nasm' => '0.11'; } }); $self->add_helper( patch => undef, sub { my $helper = shift; if(which 'patch') { if($^O eq 'MSWin32') { $helper->code(sub { 'patch --binary' }); } else { $helper->code(sub { 'patch' }); } return (); } else { return 'Alien::patch' => '0.09'; } }); $self->add_helper( perl => sub { my $perl = Devel::FindPerl::find_perl_interpreter(); $perl =~ s{\\}{/}g if $^O eq 'MSWin32'; $perl; }, 'Devel::FindPerl' ); $self->add_helper( pkgconf => undef, 'Alien::pkgconf' => 0.06 ); $self->add_helper( cwd => sub { my $cwd = "$CWD"; $cwd =~ s{\\}{/}g if $^O eq 'MSWin32'; $cwd; } ); $self->add_helper( sh => sub { 'sh' }, 'Alien::MSYS' => '0.07' ); $self->add_helper( rm => sub { _config 'rm' }, 'Config' ); $self->add_helper( xz => undef, sub { my $helper = shift; if(which 'xz') { $helper->code(sub { 'xz' }); return (); } else { return 'Alien::xz' => '0.02'; } }); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Interpolate::Default - Default interpolator for Alien::Build =head1 VERSION version 2.84 =head1 CONSTRUCTOR =head2 new my $intr = Alien::Build::Interpolate::Default->new; =head1 HELPERS =head2 ar %{ar} The ar command. =head2 bison %{bison} Requires: L 0.17 if not already in C. =head2 bzip2 %{bzip2} Requires: L 0.04 if not already in C. =head2 cc %{cc} The C Compiler used to build Perl =head2 cmake %{cmake} Requires: L 0.07 if cmake is not already in C. Deprecated: Use the L plugin instead (which will replace this helper with one that works with L that works better). =head2 cp %{cp} The copy command. =head2 devnull %{devnull} The null device, if available. On Unix style operating systems this will be C on Windows it is C. =head2 flex %{flex} Requires: L 0.08 if not already in C. =head2 gmake %{gmake} Requires: L 0.11 Deprecated: use L instead. =head2 install %{install} The Unix C command. Not normally available on Windows. =head2 ld %{ld} The linker used to build Perl =head2 m4 %{m4} Requires: L 0.08 L should pull in a version of C that will work with Autotools. =head2 make %{make} Make. On Unix this will be the same make used by Perl. On Windows this will be C or C if those are available, and only C if the first two are not available. =head2 make_path %{make_path} Make directory, including all parent directories as needed. This is usually C on Unix and simply C on windows. =head2 nasm %{nasm} Requires: L 0.11 if not already in the C. =head2 patch %{patch} Requires: L 0.09 if not already in the C. On Windows this will normally render C, which makes patch work like it does on Unix. =head2 perl %{perl} Requires: L =head2 pkgconf %{pkgconf} Requires: L 0.06. =head2 cwd %{cwd} =head2 sh %{sh} Unix style command interpreter (/bin/sh). Deprecated: use the L plugin instead. =head2 rm %{rm} The remove command =head2 xz %{xz} Requires: L 0.02 if not already in the C. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Log.pm000644 000000 000000 00000006222 14710030646 017431 0ustar00rootroot000000 000000 package Alien::Build::Log; use strict; use warnings; use 5.008004; use Carp (); # ABSTRACT: Alien::Build logging our $VERSION = '2.84'; # VERSION my $log_class; my $self; sub new { my($class) = @_; Carp::croak("Cannot instantiate base class") if $class eq 'Alien::Build::Log'; return bless {}, $class; } sub default { $self || do { my $class = $log_class || $ENV{ALIEN_BUILD_LOG} || 'Alien::Build::Log::Default'; unless(eval { $class->can('new') }) { my $pm = "$class.pm"; $pm =~ s/::/\//g; require $pm; } $class->new; } } sub set_log_class { my(undef, $class) = @_; return if defined $class && ($class eq ($log_class || '')); $log_class = $class; undef $self; } sub log { Carp::croak("AB Log base class"); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Log - Alien::Build logging =head1 VERSION version 2.84 =head1 SYNOPSIS Create your custom log class: package Alien::Build::Log::MyLog; use parent qw( Alien::Build::Log ); sub log { my(undef, %opt) = @_; my($package, $filename, $line) = @{ $opt{caller} }; my $message = $opt{message}; ...; } override log class: % env ALIEN_BUILD_LOG=Alien::Build::Log::MyLog cpanm Alien::libfoo =head1 DESCRIPTION =head1 CONSTRUCTORS =head2 new my $log = Alien::Build::Log->new; Create an instance of the log class. =head2 default my $log = Alien::Build::Log->default; Return singleton instance of log class used by L. =head1 METHODS =head2 set_log_class Alien::Build::Log->set_log_class($class); Set the default log class used by L. This method will also reset the default instance used by L. If not specified, L will be used. =head2 log $log->log(%options); Overridable method which does the actual work of the log class. Options: =over 4 =item caller Array references containing the package, file and line number of where the log was called. =item message The message to log. =back =head1 ENVIRONMENT =over 4 =item ALIEN_BUILD_LOG The default log class used by L. =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Log/000755 000000 000000 00000000000 14710030646 017071 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Log/Abbreviate.pm000644 000000 000000 00000005074 14710030646 021501 0ustar00rootroot000000 000000 package Alien::Build::Log::Abbreviate; use strict; use warnings; use 5.008004; use Term::ANSIColor (); use Path::Tiny qw( path ); use File::chdir; use parent qw( Alien::Build::Log ); # ABSTRACT: Log class for Alien::Build which is less verbose our $VERSION = '2.84'; # VERSION sub _colored { my($code, @out) = @_; -t STDOUT ? Term::ANSIColor::colored($code, @out) : @out; } my $root = path("$CWD"); sub log { my(undef, %args) = @_; my($message) = $args{message}; my ($package, $filename, $line) = @{ $args{caller} }; my $source = $package; $source =~ s/^Alien::Build::Auto::[^:]+::Alienfile/alienfile/; my $expected = $package; $expected .= '.pm' unless $package eq 'alienfile'; $expected =~ s/::/\//g; if($filename !~ /\Q$expected\E$/) { $source = path($filename)->relative($root); } else { $source =~ s/^Alien::Build::Plugin/ABP/; $source =~ s/^Alien::Build/AB/; } print _colored([ "bold on_black" ], '['); print _colored([ "bright_green on_black" ], $source); print _colored([ "on_black" ], ' '); print _colored([ "bright_yellow on_black" ], $line); print _colored([ "bold on_black" ], ']'); print _colored([ "white on_black" ], ' ', $message); print "\n"; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Log::Abbreviate - Log class for Alien::Build which is less verbose =head1 VERSION version 2.84 =head1 SYNOPSIS =head1 DESCRIPTION =head1 METHODS =head2 log $log->log(%opts); Send single log line to stdout. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Log/Default.pm000644 000000 000000 00000004015 14710030646 021013 0ustar00rootroot000000 000000 package Alien::Build::Log::Default; use strict; use warnings; use 5.008004; use parent qw( Alien::Build::Log ); # ABSTRACT: Default Alien::Build log class our $VERSION = '2.84'; # VERSION sub log { my(undef, %args) = @_; my($message) = $args{message}; my ($package, $filename, $line) = @{ $args{caller} }; print "$package> $message\n"; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Log::Default - Default Alien::Build log class =head1 VERSION version 2.84 =head1 SYNOPSIS Alien::Build->log("message1"); $build->log("message2"); =head1 DESCRIPTION This is the default log class for L. It does the sensible thing of sending the message to stdout, along with the class that made the log call. For more details about logging with L, see L. =head1 METHODS =head2 log $log->log(%opts); Send single log line to stdout. =head1 SEE ALSO =over 4 =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/MM.pm000644 000000 000000 00000035661 14710030646 017232 0ustar00rootroot000000 000000 package Alien::Build::MM; use strict; use warnings; use 5.008004; use Alien::Build; use Path::Tiny (); use Capture::Tiny qw( capture ); use Carp (); # ABSTRACT: Alien::Build installer code for ExtUtils::MakeMaker our $VERSION = '2.84'; # VERSION sub new { my($class, %prop) = @_; my $self = bless {}, $class; my %meta = map { $_ => $prop{$_} } grep /^my_/, keys %prop; my $build = $self->{build} = Alien::Build->load('alienfile', root => "_alien", (-d 'patch' ? (patch => 'patch') : ()), meta_prop => \%meta, ) ; if(%meta) { $build->meta->add_requires(configure => 'Alien::Build::MM' => '1.20'); $build->meta->add_requires(configure => 'Alien::Build' => '1.20'); } if(defined $prop{alienfile_meta}) { $self->{alienfile_meta} = $prop{alienfile_meta}; } else { $self->{alienfile_meta} = 1; } $self->{clean_install} = $prop{clean_install}; $self->build->load_requires('configure'); $self->build->root; $self->build->checkpoint; $self; } sub build { shift->{build}; } sub alienfile_meta { shift->{alienfile_meta}; } sub clean_install { shift->{clean_install}; } sub mm_args { my($self, %args) = @_; if($args{DISTNAME}) { $self->build->set_stage(Path::Tiny->new("blib/lib/auto/share/dist/$args{DISTNAME}")->absolute->stringify); $self->build->install_prop->{mm}->{distname} = $args{DISTNAME}; my $module = $args{DISTNAME}; $module =~ s/-/::/g; # See if there is an existing version installed, without pulling it into this process my($old_prefix, $err, $ret) = capture { system $^X, "-M$module", -e => "print $module->dist_dir"; $? }; if($ret == 0) { chomp $old_prefix; my $file = Path::Tiny->new($old_prefix, qw( _alien alien.json )); if(-r $file) { my $old_runtime = eval { require JSON::PP; JSON::PP::decode_json($file->slurp); }; unless($@) { $self->build->install_prop->{old}->{runtime} = $old_runtime; $self->build->install_prop->{old}->{prefix} = $old_prefix; } } } } else { Carp::croak "DISTNAME is required"; } my $ab_version = '0.25'; if($self->clean_install) { $ab_version = '1.74'; } $args{CONFIGURE_REQUIRES} = Alien::Build::_merge( 'Alien::Build::MM' => $ab_version, %{ $args{CONFIGURE_REQUIRES} || {} }, %{ $self->build->requires('configure') || {} }, ); if($self->build->install_type eq 'system') { $args{BUILD_REQUIRES} = Alien::Build::_merge( 'Alien::Build::MM' => $ab_version, %{ $args{BUILD_REQUIRES} || {} }, %{ $self->build->requires('system') || {} }, ); } elsif($self->build->install_type eq 'share') { $args{BUILD_REQUIRES} = Alien::Build::_merge( 'Alien::Build::MM' => $ab_version, %{ $args{BUILD_REQUIRES} || {} }, %{ $self->build->requires('share') || {} }, ); } else { die "unknown install type: @{[ $self->build->install_type ]}" } $args{PREREQ_PM} = Alien::Build::_merge( 'Alien::Build' => $ab_version, %{ $args{PREREQ_PM} || {} }, ); #$args{META_MERGE}->{'meta-spec'}->{version} = 2; $args{META_MERGE}->{dynamic_config} = 1; if($self->alienfile_meta) { $args{META_MERGE}->{x_alienfile} = { generated_by => "@{[ __PACKAGE__ ]} version @{[ __PACKAGE__->VERSION || 'dev' ]}", requires => { map { my %reqs = %{ $self->build->requires($_) }; $reqs{$_} = "$reqs{$_}" for keys %reqs; $_ => \%reqs; } qw( share system ) }, }; } $self->build->checkpoint; %args; } sub mm_postamble { # NOTE: older versions of the Alien::Build::MM documentation # didn't include $mm and @rest args, so anything that this # method uses them for has to be optional. # (as of this writing they are unused, but are being added # to match the way mm_install works). my($self, $mm, @rest) = @_; my $postamble = ''; # remove the _alien directory on a make realclean: $postamble .= "realclean :: alien_realclean\n" . "\n" . "alien_realclean:\n" . "\t\$(RM_RF) _alien\n\n"; # remove the _alien directory on a make clean: $postamble .= "clean :: alien_clean\n" . "\n" . "alien_clean:\n" . "\t\$(RM_RF) _alien\n\n"; my $dirs = $self->build->meta_prop->{arch} ? '$(INSTALLARCHLIB) $(INSTALLSITEARCH) $(INSTALLVENDORARCH)' : '$(INSTALLPRIVLIB) $(INSTALLSITELIB) $(INSTALLVENDORLIB)' ; # set prefix $postamble .= "alien_prefix : _alien/mm/prefix\n\n" . "_alien/mm/prefix :\n" . "\t\$(FULLPERL) -MAlien::Build::MM=cmd -e prefix \$(INSTALLDIRS) $dirs\n\n"; # set version $postamble .= "alien_version : _alien/mm/version\n\n" . "_alien/mm/version : _alien/mm/prefix\n" . "\t\$(FULLPERL) -MAlien::Build::MM=cmd -e version \$(VERSION)\n\n"; # download $postamble .= "alien_download : _alien/mm/download\n\n" . "_alien/mm/download : _alien/mm/prefix _alien/mm/version\n" . "\t\$(FULLPERL) -MAlien::Build::MM=cmd -e download\n\n"; # build $postamble .= "alien_build : _alien/mm/build\n\n" . "_alien/mm/build : _alien/mm/download\n" . "\t\$(FULLPERL) -MAlien::Build::MM=cmd -e build\n\n"; # append to all $postamble .= "pure_all :: _alien/mm/build\n\n"; $postamble .= "subdirs-test_dynamic subdirs-test_static subdirs-test :: alien_test\n\n"; $postamble .= "alien_test :\n" . "\t\$(FULLPERL) -MAlien::Build::MM=cmd -e test\n\n"; # prop $postamble .= "alien_prop :\n" . "\t\$(FULLPERL) -MAlien::Build::MM=cmd -e dumpprop\n\n"; $postamble .= "alien_prop_meta :\n" . "\t\$(FULLPERL) -MAlien::Build::MM=cmd -e dumpprop meta\n\n"; $postamble .= "alien_prop_install :\n" . "\t\$(FULLPERL) -MAlien::Build::MM=cmd -e dumpprop install\n\n"; $postamble .= "alien_prop_runtime :\n" . "\t\$(FULLPERL) -MAlien::Build::MM=cmd -e dumpprop runtime\n\n"; # install $postamble .= "alien_clean_install : _alien/mm/prefix\n" . "\t\$(FULLPERL) -MAlien::Build::MM=cmd -e clean_install\n\n"; $postamble; } sub mm_install { # NOTE: older versions of the Alien::Build::MM documentation # didn't include this method, so anything that this method # does has to be optional my($self, $mm, @rest) = @_; my $section = do { package MY; $mm->SUPER::install(@rest); }; return ".NOTPARALLEL : \n\n" . ".NO_PARALLEL : \n\n" . "install :: alien_clean_install\n\n" . $section; } sub import { my(undef, @args) = @_; foreach my $arg (@args) { if($arg eq 'cmd') { package main; *_args = sub { my $build = Alien::Build->resume('alienfile', '_alien'); $build->load_requires('configure'); $build->load_requires($build->install_type); ($build, @ARGV) }; *_touch = sub { my($name) = @_; my $path = Path::Tiny->new("_alien/mm/$name"); $path->parent->mkpath; $path->touch; }; *prefix = sub { my($build, $type, $perl, $site, $vendor) = _args(); my $distname = $build->install_prop->{mm}->{distname}; my $prefix = $type eq 'perl' ? $perl : $type eq 'site' ? $site : $type eq 'vendor' ? $vendor : die "unknown INSTALLDIRS ($type)"; $prefix = Path::Tiny->new($prefix)->child("auto/share/dist/$distname")->absolute->stringify; $build->log("prefix $prefix"); $build->set_prefix($prefix); $build->checkpoint; _touch('prefix'); }; *version = sub { my($build, $version) = _args(); $build->runtime_prop->{perl_module_version} = $version; $build->checkpoint; _touch('version'); }; *download = sub { my($build) = _args(); $build->download; $build->checkpoint; _touch('download'); }; *build = sub { my($build) = _args(); $build->build; my $distname = $build->install_prop->{mm}->{distname}; if($build->meta_prop->{arch}) { my $archdir = Path::Tiny->new("blib/arch/auto/@{[ join '/', split /-/, $distname ]}"); $archdir->mkpath; my $archfile = $archdir->child($archdir->basename . '.txt'); $archfile->spew('Alien based distribution with architecture specific file in share'); } my $cflags = $build->runtime_prop->{cflags}; my $libs = $build->runtime_prop->{libs}; if(($cflags && $cflags !~ /^\s*$/) || ($libs && $libs !~ /^\s*$/)) { my $mod = join '::', split /-/, $distname; my $install_files_pm = Path::Tiny->new("blib/lib/@{[ join '/', split /-/, $distname ]}/Install/Files.pm"); $install_files_pm->parent->mkpath; $install_files_pm->spew( "package ${mod}::Install::Files;\n", "use strict;\n", "use warnings;\n", "require ${mod};\n", "sub Inline { shift; ${mod}->Inline(\@_) }\n", "1;\n", "\n", "=begin Pod::Coverage\n", "\n", " Inline\n", "\n", "=cut\n", ) unless -f "$install_files_pm"; } $build->checkpoint; _touch('build'); }; *test = sub { my($build) = _args(); $build->test; $build->checkpoint; }; *clean_install = sub { my($build) = _args(); $build->clean_install; $build->checkpoint; }; *dumpprop = sub { my($build, $type) = _args(); my %h = ( meta => $build->meta_prop, install => $build->install_prop, runtime => $build->runtime_prop, ); require Alien::Build::Util; print Alien::Build::Util::_dump($type ? $h{$type} : \%h); } } } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::MM - Alien::Build installer code for ExtUtils::MakeMaker =head1 VERSION version 2.84 =head1 SYNOPSIS In your C: use ExtUtils::MakeMaker; use Alien::Build::MM; my $abmm = Alien::Build::MM->new; WriteMakefile($abmm->mm_args( ABSTRACT => 'Discover or download and install libfoo', DISTNAME => 'Alien-Libfoo', NAME => 'Alien::Libfoo', VERSION_FROM => 'lib/Alien/Libfoo.pm', ... )); sub MY::postamble { $abmm->mm_postamble(@_); } sub MY::install { $abmm->mm_install(@_); } In your C: package Alien::Libfoo; use parent qw( Alien::Base ); 1; In your alienfile (needs to be named C and should be in the root of your dist): use alienfile; plugin 'PkgConfig' => 'libfoo'; share { start_url 'http://libfoo.org'; ... }; =head1 DESCRIPTION This class allows you to use Alien::Build and Alien::Base with L. It load the L recipe in the root of your L dist, updates the prereqs passed into C if any are specified by your L or its plugins, and adds a postamble to the C that will download/build/test the alienized package as appropriate. The L must be named C. If you are using L to author your L dist, you should consider using the L plugin. I personally don't recommend it, but if you want to use L instead, you can use L. =head1 CONSTRUCTOR =head2 new my $abmm = Alien::Build::MM->new; Create a new instance of L. =head1 PROPERTIES =head2 build my $build = $abmm->build; The L instance. =head2 alienfile_meta my $bool = $abmm->alienfile_meta Set to a false value, in order to turn off the x_alienfile meta =head2 clean_install my $bool = $abmm->clean_install; Set to a true value, in order to clean the share directory prior to installing. If you use this you have to make sure that you install the install handler in your C: $abmm = Alien::Build::MM->new( clean_install => 1, ); ... sub MY::install { $abmm->mm_install(@_); } =head1 METHODS =head2 mm_args my %args = $abmm->mm_args(%args); Adjust the arguments passed into C as needed by L. =head2 mm_postamble my $postamble $abmm->mm_postamble; my $postamble $abmm->mm_postamble($mm); Returns the postamble for the C needed for L. This adds the following C targets which are normally called when you run C, but can be run individually if needed for debugging. =over 4 =item alien_prefix Determines the final install prefix (C<%{.install.prefix}>). =item alien_version Determine the perl_module_version (C<%{.runtime.perl_module_version}>) =item alien_download Downloads the source from the internet. Does nothing for a system install. =item alien_build Build from source (if a share install). Gather configuration (for either system or share install). =item alien_prop, alien_prop_meta, alien_prop_install, alien_prop_runtime Prints the meta, install and runtime properties for the Alien. =item alien_realclean, alien_clean Removes the alien specific files. These targets are executed when you call the C and C targets respectively. =item alien_clean_install Cleans out the Alien's share directory. Caution should be used in invoking this target directly, as if you do not understand what you are doing you are likely to break your already installed Alien. =back =head2 mm_install sub MY::install { $abmm->mm_install(@_); } B Adds an install rule to clean the final install dist directory prior to installing. =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Manual.pod000644 000000 000000 00000004613 14710030646 020275 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Manual # ABSTRACT: The Alien::Build Manual # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Manual - The Alien::Build Manual =head1 VERSION version 2.84 =head1 SYNOPSIS perldoc Alien::Build::Manual::Alien perldoc Alien::Build::Manual::AlienAuthor perldoc Alien::Build::Manual::AlienUser perldoc Alien::Build::Manual::Contributing perldoc Alien::Build::Manual::FAQ perldoc Alien::Build::Manual::PluginAuthor =head1 DESCRIPTION L comes with a number of manuals that are useful depending on how you are using L. =over 4 =item L General alien author documentation. =item L Alien author documentation. =item L Alien user documentation. =item L Overly-detailed contributing guide. =item L Frequently Asked Questions about L. =item L L plugin author documentation — or how to extend L with the plugin system. =item L Documents some of the challenges and configuration tools related to security of Ls. =back =head1 SEE ALSO =over 4 =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Manual/000755 000000 000000 00000000000 14710030646 017565 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Manual/Alien.pod000644 000000 000000 00000005527 14710030646 021332 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Manual::Alien # ABSTRACT: General alien author documentation # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Manual::Alien - General alien author documentation =head1 VERSION version 2.84 =head1 SYNOPSIS perldoc Alien::Build::Manual::Alien =head1 DESCRIPTION The goal of the L namespace is to provide non-CPAN dependencies (so called "Alien" dependencies) for CPAN modules. The history and intent of this idea is documented in the documentation-only L module. The C distribution provides a framework for building aliens. The intent is to fix bugs and enhance the interface of a number of common tools so that all aliens may benefit. The distribution is broken up into these parts: =over 4 =item The Alien Installer (configure / build-time) L and L are used to detect and install aliens. They are further documented in L. =item The Alien Runtime (runtime) L is the base class for aliens in the C system. Its use by Alien consumers is documented in L. =item The Plugin system (configure / build-time) Because many packages are implemented using different tools, the detection, build and install logic for a particular L can vary a lot. As such, much of L is implemented as a series of plugins that inherit from L. An overview of building your own plugins is documented in L. =back Additional useful documentation may be found here: =over 4 =item FAQ L =item Contributing L =back =head1 SEE ALSO =over 4 =item L Other L manuals. =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Manual/AlienAuthor.pod000644 000000 000000 00000061152 14710030646 022511 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Manual::AlienAuthor # ABSTRACT: Alien author documentation # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Manual::AlienAuthor - Alien author documentation =head1 VERSION version 2.84 =head1 SYNOPSIS perldoc Alien::Build::Manual::AlienAuthor =head1 DESCRIPTION B: Please read the entire document before you get started in writing your own L. The section on dynamic vs. static libraries will likely save you a lot of grief if you read it now! This document is intended to teach L authors how to build their own L distribution using L and L. Such an L distribution consists of three essential parts: =over 4 =item An L This is a recipe for how to 1) detect an already installed version of the library or tool you are alienizing 2) download and build the library or tool that you are alienizing and 3) gather the configuration settings necessary for the use of that library or tool. =item An installer C or C or a C if you are using L This is a thin layer between your L recipe, and the Perl installer (either L or L. =item A Perl class (.pm file) that inherits from L For most Ls this does not need to be customized at all, since L usually does what you need. =back For example if you were alienizing a library called libfoo, you might have these files: Alien-Libfoo-1.00/Makefile.PL Alien-Libfoo-1.00/alienfile Alien-Libfoo-1.00/lib/Alien/Libfoo.pm This document will focus mainly on instructing you how to construct an L, but we will also briefly cover making a simple C or C to go along with it. We will also touch on when you might want to extend your subclass to add non-standard functionality. =head2 Using commands Most software libraries and tools will come with instructions for how to install them in the form of commands that you are intended to type into a shell manually. The easiest way to automate those instructions is to just put the commands in your L. For example, lets suppose that libfoo is built using autoconf and provides a C C<.pc> file. We will also later discuss plugins. For common build systems like autoconf or CMake, it is usually better to use the appropriate plugin because they will handle corner cases better than a simple set of commands. We're going to take a look at commands first because it's easier to understand the different phases with commands. (Aside, autoconf is a series of tools and macros used to configure (usually) a C or C++ library or tool by generating any number of Makefiles. It is the C equivalent to L, if you will. Basically, if your library or tool instructions start with './configure' it is most likely an autoconf based library or tool). (Aside2, C is a standard-ish way to provide the compiler and linker flags needed for compiling and linking against the library. If your tool installs a C<.pc> file, usually in C<$PREFIX/lib/pkgconfig> then, your tool uses C). Here is the L that you might have: use alienfile; probe [ 'pkg-config --exists libfoo' ]; share { start_url 'http://www.libfoo.org/src/libfoo-1.00.tar.gz'; download [ 'wget %{.meta.start_url}' ]; extract [ 'tar zxf %{.install.download}' ]; build [ [ './configure --prefix=%{.install.prefix} --disable-shared' ], [ '%{make}' ], [ '%{make} install' ], ]; }; gather [ [ 'pkg-config --modversion libfoo', \'%{.runtime.version}' ], [ 'pkg-config --cflags libfoo', \'%{.runtime.cflags}' ], [ 'pkg-config --libs libfoo', \'%{.runtime.libs}' ], ]; There is a lot going on here, so lets decode it a little bit. An L is just some Perl with some alien specific sugar. The first line use alienfile; imports the sugar into the L. It also is a flag for the reader to see that this is an L and not some other kind of Perl script. The second line is the probe directive: probe [ 'pkg-config --exists libfoo' ]; is used to see if the library is already installed on the target system. If C is in the path, and if libfoo is installed, this should exit with a success (0) and tell L to use the system library. If either C in the PATH, or if libfoo is not installed, then it will exist with non-success (!= 0) and tells L to download and build from source. You can provide as many probe directives as you want. This is useful if there are different ways to probe for the system. L will stop on the first successfully found system library found. Say our library libfoo comes with a C<.pc> file for use with C and also provides a C program to find the same values. You could then specify this in your L probe [ 'pkg-config --exists libfoo' ]; probe [ 'foo-config --version' ]; Other directives can be specified multiple times if there are different methods that can be tried for the various steps. Sometimes it is easier to probe for a library from Perl rather than with a command. For that you can use a code reference. For example, another way to call C would be from Perl: probe sub { my($build) = @_; # $build is the Alien::Build instance. system 'pkg-config --exists libfoo'; $? == 0 ? 'system' : 'share'; }; The Perl code should return 'system' if the library is installed, and 'share' if not. (Other directives should return a true value on success, and a false value on failure). You can also throw an exception with C to indicate a failure. The next part of the L is the C block, which is used to group the directives which are used to download and install the library or tool in the event that it is not already installed. share { start_url 'http://www.libfoo.org/src/libfoo-1.00.tar.gz'; download [ 'wget %{.meta.start_url}' ]; extract [ 'tar zxf %{.install.download}' ]; build [ [ './configure --prefix=%{.install.prefix} --disable-shared' ], [ '%{make}' ], [ '%{make} install' ], ]; }; The start_url specifies where to find the package that you are alienizing. It should be either a tarball (or zip file, or what have you) or an HTML index. The download directive as you might imagine specifies how to download the library or tool. The extract directive specifies how to extract the archive once it is downloaded. In the extract step, you can use the variable C<%{.install.download}> as a placeholder for the archive that was downloaded in the download step. This is also accessible if you use a code reference from the L instance: share { ... requires 'Archive::Extract'; extract sub { my($build) = @_; my $tarball = $build->install_prop->{download}; my $ae = Archive::Extract->new( archive => $tarball ); $ae->extract; 1; } ... }; The build directive specifies how to build the library or tool once it has been downloaded and extracted. Note the special variable C<%{.install.prefix}> is the location where the library should be installed. C<%{make}> is a helper which will be replaced by the appropriate C, which may be called something different on some platforms (on Windows for example, it frequently may be called C or C). The final part of the L has a gather directive which specifies how to get the details on how to compile and link against the library. For this, once again we use the C command: gather [ [ 'pkg-config --modversion libfoo', \'%{.runtime.version}' ], [ 'pkg-config --cflags libfoo', \'%{.runtime.cflags}' ], [ 'pkg-config --libs libfoo', \'%{.runtime.libs}' ], ]; The scalar reference as the final item in the command list tells L that the output from the command should be stored in the given variable. The runtime variables are the ones that will be available to C once it is installed. (Install properties, which are the ones that we have seen up till now are thrown away once the L distribution is installed. You can also provide a C block for directives that should be used when a system install is detected. Normally you only need to do this if the gather step is different between share and system installs. For example, the above is equivalent to: build { ... gather [ [ 'pkg-config --modversion libfoo', \'%{.runtime.version}' ], [ 'pkg-config --cflags libfoo', \'%{.runtime.cflags}' ], [ 'pkg-config --libs libfoo', \'%{.runtime.libs}' ], ]; }; sys { gather [ [ 'pkg-config --modversion libfoo', \'%{.runtime.version}' ], [ 'pkg-config --cflags libfoo', \'%{.runtime.cflags}' ], [ 'pkg-config --libs libfoo', \'%{.runtime.libs}' ], ]; }; (Aside3, the reason it is called C and not C is so that it does not conflict with the built in C function)! =head2 Using plugins The first example is a good way of showing the full manual path that you can choose, but there is a lot of repetition, if you are doing many Ls that use autoconf and C (which are quite common. L allows you to use plugins. See L for a list of some of the plugin categories. For now, I will just show you how to write the L for libfoo above using L, L, L, and L use alienfile; plugin 'PkgConfig' => ( pkg_name => 'libfoo', ); share { start_url 'http://www.libfoo.org/src'; plugin 'Download' => ( filter => qr/^libfoo-[0-9\.]+\.tar\.gz$/, version => qr/^libfoo-([0-9\.]+)\.tar\.gz$/, ); plugin 'Extract' => 'tar.gz'; plugin 'Build::Autoconf'; build [ '%{configure} --disable-shared', '%{make}', '%{make} install', ]; }; The first plugin that we use is the C negotiation plugin. A negotiation plugin is one which doesn't do the actual work but selects the best one from a set of plugins depending on your platform and environment. (In the case of L, it may choose to use command line tools, a pure Perl implementation (L), or libpkgconf, depending on what is available). When using negotiation plugins you may omit the C<::Negotiate> suffix. So as you can see using the plugin here is an advantage because it is more reliable than just specifying a command which may not be installed! Next we use the download negotiation plugin. This is also better than the version above, because again, C my not be installed on the target system. Also you can specify a URL which will be scanned for links, and use the most recent version. We use the Extract negotiation plugin to use either command line tools, or Perl libraries to extract from the archive once it is downloaded. Finally we use the Autoconf plugin (L). This is a lot more sophisticated and reliable than in the previous example, for a number of reasons. This version will even work on Windows assuming the library or tool you are alienizing supports that platform! Strictly speaking the build directive is not necessary, because the autoconf plugin provides a default which is reasonable. The only reason that you would want to include it is if you need to provide additional flags to the configure step. share { ... build [ '%{configure} --enable-bar --enable-baz --disable-shared', '%{make}', '%{make} install', ]; }; =head2 Multiple .pc files Some packages come with multiple libraries paired with multiple C<.pc> files. In this case you want to provide the L with an array reference of package names. plugin 'PkgConfig' => ( pkg_name => [ 'foo', 'bar', 'baz' ], ); All packages must be found in order for the C install to succeed. Once installed the first C will be used by default (in this example C), and you can retrieve any other C using the L. =head2 A note about dynamic vs. static libraries If you are using your L to build an XS module, it is important that you use static libraries if possible. If you have a package that refuses to build a static library, then you can use L. Actually let me back up a minute. For a C install it is best to use static libraries to build your XS extension. This is because if your L is ever upgraded to a new version it can break your existing XS modules. For a C install shared libraries are usually best because you can often get security patches without having to re-build anything in perl land. If you looked closely at the "Using commands" and "Using plugins" sections above, you may notice that we went out of our way where possible to tell Autotools to build only static libraries using the C<--disable-shared> command. The Autoconf plugin also does this by default. Sometimes though you will have a package that builds both, or maybe you I both static and dynamic libraries to work with XS and FFI. For that case, there is the L plugin. use alienfile; ... plugin 'Gather::IsolateDynamic'; What it does, is that it moves the dynamic libraries (usually .so on Unix and .DLL on Windows) to a place where they can be found by FFI, and where they won't be used by the compiler for building XS. It usually doesn't do any harm to include this plugin, so if you are just starting out you might want to add it anyway. Arguably it should have been the default behavior from the beginning. If you have already published an Alien that does not isolate its dynamic libraries, then you might get some fails from old upgraded aliens because the share directory isn't cleaned up by default (this is perhaps a design bug in the way that share directories work, but it is a long standing characteristic). One work around for this is to use the C property on L, which will clean out the share directory on upgrade, and possibly save you a lot of grief. =head2 Verifying and debugging your alienfile You could feed your alienfile directly into L, or L, but it is sometimes useful to test your alienfile using the C command (it does not come with L, you need to install L). By default C will use the C in the current directory (just as C uses the C in the current directory; just like C you can use the C<-f> option to specify a different L). You can test your L in dry run mode: % af install --dry-run Alien::Build::Plugin::Core::Legacy> adding legacy hash to config Alien::Build::Plugin::Core::Gather> mkdir -p /tmp/I2YXRyxb0r/_alien --- cflags: '' cflags_static: '' install_type: system legacy: finished_installing: 1 install_type: system name: libfoo original_prefix: /tmp/7RtAusykNN version: 1.2.3 libs: '-lfoo ' libs_static: '-lfoo ' prefix: /tmp/7RtAusykNN version: 1.2.3 You can use the C<--type> option to force a share install (download and build from source): % af install --type=share --dry-run Alien::Build::Plugin::Core::Download> decoding html Alien::Build::Plugin::Core::Download> candidate *https://www.libfoo.org/download/libfoo-1.2.4.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.2.3.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.2.2.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.2.1.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.2.0.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.1.9.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.1.8.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.1.7.tar.gz Alien::Build::Plugin::Core::Download> candidate ... Alien::Build::Plugin::Core::Download> setting version based on archive to 1.2.4 Alien::Build::Plugin::Core::Download> downloaded libfoo-1.2.4.tar.gz Alien::Build::CommandSequence> + ./configure --prefix=/tmp/P22WEXj80r --with-pic --disable-shared ... snip ... Alien::Build::Plugin::Core::Gather> mkdir -p /tmp/WsoLAQ889w/_alien --- cflags: '' cflags_static: '' install_type: share legacy: finished_installing: 1 install_type: share original_prefix: /tmp/P22WEXj80r version: 1.2.4 libs: '-L/tmp/P22WEXj80r/lib -lfoo ' libs_static: '-L/tmp/P22WEXj80r/lib -lfoo ' prefix: /tmp/P22WEXj80r version: 1.2.4 You can also use the C<--before> and C<--after> options to take a peek at what the build environment looks like at different stages as well, which can sometimes be useful: % af install --dry-run --type=share --before build bash Alien::Build::Plugin::Core::Download> decoding html Alien::Build::Plugin::Core::Download> candidate *https://www.libfoo.org/download/libfoo-1.2.4.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.2.3.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.2.2.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.2.1.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.2.0.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.1.9.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.1.8.tar.gz Alien::Build::Plugin::Core::Download> candidate https://www.libfoo.org/download/libfoo-1.1.7.tar.gz Alien::Build::Plugin::Core::Download> candidate ... Alien::Build::Plugin::Core::Download> setting version based on archive to 1.2.4 Alien::Build::Plugin::Core::Download> downloaded libfoo-1.2.4.tar.gz App::af::install> [ before build ] + bash /tmp/fbVPu4LRTs/build_5AVn/libfoo-1.2.4$ ls CHANGES Makefile autoconf.ac lib /tmp/fbVPu4LRTs/build_5AVn/libfoo-1.2.4$ There are a lot of other useful things that you can do with the C command. See L for details. =head2 Integrating with MakeMaker Once you have a working L you can write your C. use ExtUtils::MakeMaker; use Alien::Build::MM; my $abmm = Alien::Build::MM->new; WriteMakefile($abmm->mm_args( ABSTRACT => 'Discover or download and install libfoo', DISTNAME => 'Alien-Libfoo', NAME => 'Alien::Libfoo', VERSION_FROM => 'lib/Alien/Libfoo.pm', CONFIGURE_REQUIRES => { 'Alien::Build::MM' => 0, }, BUILD_REQUIRES => { 'Alien::Build::MM' => 0, }, PREREQ_PM => { 'Alien::Base' => 0, }, # If you are going to write the recommended # tests you will will want these: TEST_REQUIRES => { 'Test::Alien' => 0, 'Test2::V0' => 0, }, )); sub MY::postamble { $abmm->mm_postamble; } The C that goes along with it is very simple: package Alien::Libfoo; use strict; use warnings; use parent qw( Alien::Base ); 1; You are done and can install it normally: % perl Makefile.PL % make % make test % make install =head2 Integrating with Module::Build Please don't! Okay if you have to there is L. =head2 Non standard configuration L support most of the things that your L will need, like compiler flags (cflags), linker flags (libs) and binary directory (bin_dir). Your library or tool may have other configuration items which are not supported by default. You can store the values in the L into the runtime properties: gather [ # standard: [ 'foo-config --version libfoo', \'%{.runtime.version}' ], [ 'foo-config --cflags libfoo', \'%{.runtime.cflags}' ], [ 'foo-config --libs libfoo', \'%{.runtime.libs}' ], # non-standard [ 'foo-config --bar-baz libfoo', \'%{.runtime.bar_baz}' ], ]; then you can expose them in your L subclass: package Alien::Libfoo; use strict; use warnings; use parent qw( Alien::Base ); sub bar_baz { my($self) = @_; $self->runtime_prop->{bar_baz}, }; 1; =head2 Testing (optional, but highly recommended) You should write a test using L to make sure that your alien will work with any XS modules that are going to use it: use Test2::V0; use Test::Alien; use Alien::Libfoo; alien_ok 'Alien::Libfoo'; xs_ok do { local $/; }, with_subtest { is Foo::something(), 1, 'Foo::something() returns 1'; }; done_testing; __DATA__ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include MODULE = Foo PACKAGE = Foo int something() You can also use L to test tools instead of libraries: use Test2::V0; use Test::Alien; use Alien::Libfoo; alien_ok 'Alien::Libfoo'; run_ok(['foo', '--version']) ->exit_is(0); done_testing; You can also write tests specifically for L, if your alien is going to be used to write FFI bindings. (the test below is the FFI equivalent to the XS example above). use Test2::V0; use Test::Alien; use Alien::Libfoo; alien_ok 'Alien::Libfoo'; ffi_ok { symbols => [ 'something' ] }, with_subtest { # $ffi is an instance of FFI::Platypus with the lib # set appropriately. my($ffi) = @_; my $something = $ffi->function( something => [] => 'int' ); is $something->call(), 1, 'Foo::something() returns 1'; }; If you do use C you want to make sure that your alien reliably produces dynamic libraries. If it isn't consistent (if for example some platforms tend not to provide or build dynamic libraries), you can check that C doesn't return an empty list. ... alien_ok 'Alien::Libfoo'; SKIP: { skip "This test requires a dynamic library" unless Alien::Libfoo->dynamic_libs; ffi_ok { symbols [ 'something' ] }, with_subtest { ... }; } More details on testing L modules can be found in the L documentation. You can also run the tests that come with the package that you are alienizing, by using a C block in your L. Keep in mind that some packages use testing tools or have other prerequisites that will not be available on your users machines when they attempt to install your alien. So you do not want to blindly add a test block without checking what the prereqs are. For Autoconf style packages you typically test a package using the C command: use alienfile; plugin 'PkgConfig' => 'libfoo'; share { ... # standard build steps. test [ '%{make} check' ]; }; =head2 Dist::Zilla (optional, mildly recommended) You can also use the L L plugin L: name = Alien-Libfoo author = E. Xavier Ample license = Perl_5 copyright_holder = E. Xavier Ample copyright_year = 2017 version = 0.01 [@Basic] [AlienBuild] The plugin takes care of a lot of details like making sure that the correct minimum versions of L and L are used. See the plugin documentation for additional details. =head2 Using your Alien Once you have installed you can use your Alien. See L for guidance on that. =head1 SEE ALSO =over 4 =item L Other L manuals. =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Manual/AlienUser.pod000644 000000 000000 00000015215 14710030646 022164 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Manual::AlienUser # ABSTRACT: Alien user documentation # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Manual::AlienUser - Alien user documentation =head1 VERSION version 2.84 =head1 SYNOPSIS perldoc Alien::Build::Manual::AlienUser =head1 DESCRIPTION This document is intended for a user of an L based L module's user. Although specifically geared for L subclasses, it may have some useful hints for L in general. Full working examples of how to use an L module are also bundled with L in the distribution's C directory. Those examples use L, which uses L + L + L. The following documentation will assume you are trying to use an L called C which provides the library C and the command line tool C. Many Ls will only provide one or the other. The best interface to use for using L based aliens is L. This allows you to combine multiple aliens together and handles a number of corner obscure corner cases that using Ls directly does not. Also as of 0.64, L comes bundled with L and L anyway, so it is not an extra dependency. What follows are the main use cases. =head2 ExtUtils::MakeMaker use ExtUtils::MakeMaker; use Alien::Base::Wrapper (); WriteMakefile( Alien::Base::Wrapper->new('Alien::Foo')->mm_args2( NAME => 'FOO::XS', ... ), ); L will take a hash of C arguments and insert the appropriate compiler and linker flags for you. This is recommended over doing this yourself as the exact incantation to get EUMM to work is tricky to get right. The C method will also set your C for L, L and any aliens that you specify. =head2 Module::Build use Module::Build; use Alien::Base::Wrapper qw( Alien::Foo !export ); use Alien::Foo; my $build = Module::Build->new( ... configure_requires => { 'Alien::Base::Wrapper' => '0', 'Alien::Foo' => '0', ... }, Alien::Base::Wrapper->mb_args, ... ); $build->create_build_script; For L you can also use L, but you will have to specify the C yourself. =head2 Inline::C / Inline::CPP use Inline 0.56 with => 'Alien::Foo'; L and L can be configured to use an L based L with the C keyword. =head2 ExtUtils::Depends use ExtUtils::MakeMaker; use ExtUtils::Depends; my $pkg = ExtUtils::Depends->new("Alien::Foo"); WriteMakefile( ... $pkg->get_makefile_vars, ... ); L works similar to L, but uses the L interface under the covers. =head2 Dist::Zilla [@Filter] -bundle = @Basic -remove = MakeMaker [Prereqs / ConfigureRequires] Alien::Foo = 0 [MakeMaker::Awesome] header = use Alien::Base::Wrapper qw( Alien::Foo !export ); WriteMakefile_arg = Alien::Base::Wrapper->mm_args =head2 FFI::Platypus Requires C always: use FFI::Platypus; use Alien::Foo; my $ffi = FFI::Platypus->new( lib => [ Alien::Foo->dynamic_libs ], ); Use C in fallback mode: use FFI::Platypus; use FFI::CheckLib 0.28 qw( find_lib_or_die ); use Alien::Foo; my $ffi = FFI::Platypus->new( lib => [ find_lib_or_die lib => 'foo', alien => ['Alien::Foo'] ], ); If you are going to always require an L you can just call C and pass it into L' lib method. You should consider using L to use the L in fallback mode instead. This way you only need to install the L if the system doesn't provide it. For fallback mode to work correctly you need to be using L 0.28 or better. =head2 Inline::C use Inline with => 'Alien::Foo'; use Inline C => <<~'END'; #include const char *my_foo_wrapper() { foo(); } END sub exported_foo() { my_foo_wrapper(); } =head2 tool use Alien::Foo; use Env qw( @PATH ); unshift @PATH, Alien::Foo->bin_dir; system 'foo', '--bar', '--baz'; Some Ls provide tools instead of or in addition to a library. You need to add them to the C environment variable though. (Unless the tool is already provided by the system, in which case it is already in the path and the C method will return an empty list). =head1 ENVIRONMENT =over 4 =item ALIEN_INSTALL_TYPE Although the recommended way for a consumer to use an L based L is to declare it as a static configure and build-time dependency, some consumers may prefer to fallback on using an L only when the consumer itself cannot detect the necessary package. In some cases the consumer may want the user to opt-in to using an L before requiring it. To keep the interface consistent among Aliens, the consumer of the fallback opt-in L may fallback on the L if the environment variable C is set to any value. The rationale is that by setting this environment variable the user is aware that L modules may be installed and have indicated consent. The actual implementation of this, by its nature would have to be in the consuming CPAN module. This behavior should be documented in the consumer's POD. See L for more details on the usage of this environment variable. =back =head1 SEE ALSO =over 4 =item L Other L manuals. =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Manual/Contributing.pod000644 000000 000000 00000021745 14710030646 022751 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Manual::Contributing # ABSTRACT: Over-detailed contributing guide # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Manual::Contributing - Over-detailed contributing guide =head1 VERSION version 2.84 =head1 SYNOPSIS perldoc Alien::Build::Manual::Contributing =head1 DESCRIPTION Thank you for considering to contribute to my open source project! If you have a small patch please consider just submitting it. Doing so through the project GitHub is probably the best way: L If you have a more invasive enhancement or bugfix to contribute, please take the time to review these guidelines. In general it is good idea to work closely with the L developers, and the best way to contact them is on the C<#native> IRC channel on irc.perl.org. =head2 History Joel Berger wrote the original L. This distribution included the runtime code L and an installer class L. The significant thing about L was that it provided tools to make it relatively easy for people to roll their own L distributions. Over time, the PerlAlien (github organization) or "Alien::Base team" has taken over development of L with myself (Graham Ollis) being responsible for integration and releases. Joel Berger is still involved in the project. Since the original development of L, L, on which L is based, has been removed from the core of Perl. It seemed worthwhile to write a replacement installer that works with L which IS still bundled with the Perl core. Because this is a significant undertaking it is my intention to integrate the many lessons learned by Joel Berger, myself and the "Alien::Base team" as possible. If the interface seems good then it is because I've stolen the ideas from some pretty good places. =head2 Philosophy =head3 Alien runtime should be as config-only as possible. Ideally the code for an L based L should simply inherit from L, like so: package Alien::libfoo; use parent qw( Alien::Base ); 1; The detection logic should be done by the installer code (L and L) and saved into runtime properties (see L). And as much as possible the runtime should be implemented in the base class (L). Where reasonable, the base class should be expanded to meet the needs of this arrangement. =head3 when downloading a package grab the latest version If the maintainer of an L disappears for a while, and if the version downloaded during a "share" install is hardcoded in the L, it can be problematic for end-users. There are exceptions, of course, in particular when a package provides a very unstable interface from version to version it makes sense to hard code the version and for the Alien developer and Alien consumer developer to coordinate closely. =head3 when installing a package the operating system as a whole should not be affected The convenience of using an L is that a user of a CPAN module that consumes an L doesn't need to know the exact incantation to install the libraries on which it depends (or indeed it may not be easily installed through the package manager anyway). As a corollary, a user of a CPAN module that consumes an L module shouldn't expect operating system level packages to be installed, or for these packages to be installed in common system level directories, like C or C. Instead a "share" directory associated with the Perl install and L module should be used. Plugins that require user opt-in could be written to prompt a user to automatically install operating system packages, but this should never be done by default or without consent by the user. =head3 avoid dependencies One of the challenges with L development is that you are by the nature of the problem, trying to make everyone happy. Developers working out of CPAN just want stuff to work, and some build environments can be hostile in terms of tool availability, so for reliability you end up pulling a lot of dependencies. On the other hand, operating system vendors who are building Perl modules usually want to use the system version of a library so that they do not have to patch libraries in multiple places. Such vendors have to package any extra dependencies and having to do so for packages that the don't even use makes them understandably unhappy. As general policy the L core should have as few dependencies as possible, and should only pull extra dependencies if they are needed. Where dependencies cannot be avoidable, popular and reliable CPAN modules, which are already available as packages in the major Linux vendors (Debian, Red Hat) should be preferred. As such L is hyper aggressive at using dynamic prerequisites. =head3 interface agnostic One of the challenges with L was that L was pulled from the core. In addition, there is a degree of hostility toward L in some corners of the Perl community. I agree with Joel Berger's rationale for choosing L at the time, as I believe its interface more easily lends itself to building L distributions. That said, an important feature of L is that it is installer agnostic. Although it is initially designed to work with L, it has been designed from the ground up to work with any installer (Perl, or otherwise). As an extension of this, although L may have external CPAN dependencies, they should not be exposed to developers USING L. As an example, L is used heavily internally because it does what L does, plus the things that it doesn't, and uses forward slashes on Windows (backslashes are the "correct separator on windows, but actually using them tends to break everything). However, there aren't any interfaces in L that will return a L object (or if there are, then this is a bug). This means that if we ever need to port L to a platform that doesn't support L (such as VMS), then it may require some work to L itself, modules that USE L shouldn't need to be modified. =head3 plugable The actual logic that probes the system, downloads source and builds it should be as pluggable as possible. One of the challenges with L was that it was designed to work well with software that works with C and C. While you can build with other tools, you have to know a bit of how the installer logic works, and which hooks need to be tweaked. L has plugins for C, C (successor of C), vanilla Makefiles, and CMake. If your build system doesn't have a plugin, then all you have to do is write one! Plugins that prove their worth may be merged into the L core. Plugins that after a while feel like maybe not such a good idea may be removed from the core, or even from CPAN itself. In addition, L has a special type of plugin, called a negotiator which picks the best plugin for the particular environment that it is running in. This way, as development of the negotiator and plugins develop over time modules that use L will benefit, without having to change the way they interface with L =head1 ACKNOWLEDGEMENT I would like to that Joel Berger for getting things running in the first place. Also important to thank other members of the "Alien::Base team": Zaki Mughal (SIVOAIS) Ed J (ETJ, mohawk) Also kind thanks to all of the developers who have contributed to L over the years: L =head1 SEE ALSO =over 4 =item L Other L manuals. =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Manual/FAQ.pod000644 000000 000000 00000051357 14710030646 020713 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Manual::FAQ # ABSTRACT: Frequently Asked Questions about Alien::Build # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Manual::FAQ - Frequently Asked Questions about Alien::Build =head1 VERSION version 2.84 =head1 SYNOPSIS perldoc Alien::Build::Manual::FAQ =head1 DESCRIPTION This document serves to answer the most frequently asked questions made by developers creating L modules using L. =head1 QUESTIONS =head2 What is Alien, Alien::Base and Alien::Build? Alien in a Perl namespace for defining dependencies in CPAN for libraries and tools which are not "native" to CPAN. For a manifesto style description of the Why, and How see L. L is a base class for the L runtime. L is a tool for probing the operating system for existing libraries and tools, and downloading, building and installing packages. L is a recipe format for describing how to probe, download, build and install a package. =head2 How do I build a package that uses I =head3 autoconf Use the autoconf plugin (L). If your package provides a pkg-config C<.pc> file, then you can also use the PkgConfig plugin (L). use alienfile plugin PkgConfig => 'libfoo'; share { start_url => 'http://example.org/dist'; plugin Download => ( version => qr/libfoo-([0-9\.])\.tar\.gz$/, ); plugin Extract => 'tar.gz'; plugin 'Build::Autoconf'; }; If you need to provide custom flags to configure, you can do that too: share { plugin 'Build::Autoconf'; build [ '%{configure} --disable-shared --enable-foo', '%{make}', '%{make} install', ]; }; If your package requires GNU Make, use C<%{gmake}> instead of C<%{make}>. =head3 autoconf without configure script A number of Open Source projects are using autotools, but do not provide the C script. When alienizing these types of packages you have a few choices: =over 4 =item build configure using autotools The Alien L is designed to provide autotools for building such packages from source. The advantage is that this is how the upstream developers intend on having their package built. The downside is that it is also adds more prereqs to your Alien. The silver lining is that if you require this Alien in the C block (as you should), then these prereqs will only be pulled in during a share install when they are needed. Please see the L documentation for specifics on how it can be used in your L. =item patch the package locally before build You can use the L directive to patch the alienized package locally before building. This can sometimes be challenging because Autotools uses timestamps in order to decide what needs to be rebuilt, and patching can sometimes confuse it into thinking more needs to be rebuilt than what actually does. =item build configure and tarball You can also build the configure script during development of your alien, generate the tarball and provide it somewhere like GitHub and use that as the source instead of the original source. This should usually be a last resort if the other two methods prove too difficult. =back =head3 autoconf-like If you see an error like this: Unknown option "--with-pic". It is because the autoconf plugin uses the C<--with-pic> option by default, since it makes sense most of the time, and autoconf usually ignores options that it does not recognize. Some autoconf style build systems fail when they see an option that they do not recognize. You can turn this behavior off for these packages: plugin 'Build::Autoconf' => ( with_pic => 0, ); Another thing about the autoconf plugin is that it uses C to do a double staged install. If you see an error like "nothing was installed into destdir", that means that your package does not support C. You should instead use the MSYS plugin and use a command sequence to do the build like this: share { plugin 'Build::MSYS'; build [ # explicitly running configure with "sh" will make sure that # it works on windows as well as UNIX. 'sh configure --prefix=%{.install.prefix} --disable-shared', '%{make}', '%{make} install', ]; }; =head3 CMake There is an alien L that provides C 3.x or better (It is preferred to the older L). Though it is recommended that you use the C (L) plugin instead of using L. use alienfile; share { plugin 'Build::CMake'; build [ # this is the default build step, if you do not specify one. [ '%{cmake}', @{ meta->prop->{plugin_build_cmake}->{args} }, # ... put extra cmake args here ... '.' ], '%{make}', '%{make} install', ]; }; =head3 vanilla Makefiles L provides a helper (C<%{make}>) for the C that is used by Perl and L (EUMM). Unfortunately the C supported by Perl and EUMM on Windows (C and C) are not widely supported by most open source projects. (Thankfully recent perls and EUMM support GNU Make on windows now). You can use the C plugin (L) to tell the L system which make the project that you are alienizing requires. plugin 'Build::Make' => 'umake'; # umake makes %{make} either GNU Make or BSD Make on Unix and GNU Make on Windows. build { build [ # You can use the Perl config compiler and cflags using the %{perl.config...} helper [ '%{make}', 'CC=%{perl.config.cc}', 'CFLAGS=%{perl.config.cccdlflags} %{perl.config.optimize}' ], [ '%{make}', 'install', 'PREFIX=%{.install.prefix}' ], ], }; Some open source projects require GNU Make, and you can specify that, and L will be pulled in on platforms that do not already have it. plugin 'Build::Make' => 'gmake'; ... =head2 How do I probe for a package that uses pkg-config? Use the C plugin (L): use alienfile; plugin 'PkgConfig' => ( pkg_name => 'libfoo', ); It will probe for a system version of the library. It will also add the appropriate C C and C properties on either a C or C install. =head2 How do I specify a minimum or exact version requirement for packages that use pkg-config? The various pkg-config plugins all support atleast_version, exact_version and maximum_version fields, which have the same meaning as the C command line interface: use alienfile; plugin 'PkgConfig', pkg_name => 'foo', atleast_version => '1.2.3'; or use alienfile; plugin 'PkgConfig', pkg_name => foo, exact_version => '1.2.3'; =head2 How do I probe for a package that uses multiple .pc files? Each of the C plugins will take an array reference instead of a string: use alienfile; plugin 'PkgConfig' => ( pkg_name => [ 'foo', 'bar', 'baz' ] ); The first C given will be used by default once your alien is installed. To get the configuration for C and C you can use the L: use Alien::libfoo; $cflags = Alien::libfoo->cflags; # compiler flags for 'foo' $cflags = Alien::libfoo->alt('bar')->cflags ; # compiler flags for 'bar' $cflags = Alien::libfoo->alt('baz')->cflags ; # compiler flags for 'baz' =head2 How to create an Alien module for packages that do not support pkg-config? =head3 Packages that provide a configuration script Many packages provide a command that you can use to get the appropriate version, compiler and linker flags. For those packages you can just use the commands in your L. Something like this: use alienfile; probe [ 'foo-config --version' ]; share { ... build [ '%{make} PREFIX=%{.runtime.prefix}', '%{make} install PREFIX=%{.runtime.prefix}', ]; }; gather [ [ 'foo-config', '--version', \'%{.runtime.version}' ], [ 'foo-config', '--cflags', \'%{.runtime.cflags}' ], [ 'foo-config', '--libs', \'%{.runtime.libs}' ], ]; =head3 Packages that require a compile test Some packages just expect you do know that C<-lfoo> will work. For those you can use the C plugin (L). use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-I/opt/libfoo/include', libs => '-L/opt/libfoo/lib -lfoo', ); share { ... gather sub { my($build) = @_; my $prefix = $build->runtime_prop->{prefix}; $build->runtime_prop->{cflags} = "-I$prefix/include "; $build->runtime_prop->{libs} = "-L$prefix/lib -lfoo "; }; } This plugin will build a small program with these flags and test that it works. (There are also options to provide a program that can make simple tests to ensure the library works). If the probe works, it will set the compiler and linker flags. (There are also options for extracting the version from the test program). If you do a share install you will need to set the compiler and linker flags yourself in the gather step, if you aren't using a build plugin that will do that for you. =head2 Can/Should I write a tool oriented Alien module? Certainly. The original intent was to provide libraries, but tools are also quite doable using the L toolset. A good example of how to do this is L. You will want to use the 'Probe::CommandLine': use alienfile; plugin 'Probe::CommandLine' => ( command => 'gzip', ); =head2 How do I test my package once it is built (before it is installed)? Use L. It has extensive documentation, and integrates nicely with L. =head2 How do I patch packages that need alterations? If you have a diff file you can use patch: use alienfile; probe sub { 'share' }; # replace with appropriate probe share { ... patch [ '%{patch} -p1 < %{.install.patch}/mypatch.diff' ]; build [ ... ] ; } ... You can also patch using Perl if that is easier: use alienfile; probe sub { 'share' }; share { ... patch sub { my($build) = @_; # make changes to source prior to build }; build [ ... ]; }; =head2 The flags that a plugin produces are wrong! Sometimes, the compiler or linker flags that the PkgConfig plugin comes up with are not quite right. (Frequently this is actually because a package maintainer is providing a broken C<.pc> file). (Other plugins may also have problems). You could replace the plugin's C step but a better way is to provide a subroutine callback to be called after the gather stage is complete. You can do this with the L C directive: use alienfile; plugin 'PkgConfig' => 'libfoo'; share { ... after 'gather' => sub { my($build) = @_; $build->runtime_prop->{libs} .= " -lbar"; # libfoo also requires libbar $build->runtime_prop->{libs_static} .= " -lbar -lbaz"; # libfoo also requires libbaz under static linkage }; }; Sometimes you only need to do this on certain platforms. You can adjust the logic based on C<$^O> appropriately. use alienfile; plugin 'PkgConfig' => 'libfoo'; share { ... after 'gather' => sub { my($build) = @_; if($^O eq 'MSWin32') { $build->runtime_prop->{libs} .= " -lpsapi"; } }; }; =head2 "cannot open shared object file" trying to load XS The error looks something like this: t/acme_alien_dontpanic2.t ....... 1/? # Failed test 'xs' # at t/acme_alien_dontpanic2.t line 13. # XSLoader failed # Can't load '/home/cip/.cpanm/work/1581635869.456/Acme-Alien-DontPanic2-2.0401/_alien/tmp/test-alien-lyiQNX/auto/Test/Alien/XS/Mod0/Mod0.so' for module Test::Alien::XS::Mod0: libdontpanic.so.0: cannot open shared object file: No such file or directory at /opt/perl/5.30.1/lib/5.30.1/x86_64-linux/DynaLoader.pm line 193. # at /home/cip/perl5/lib/perl5/Test/Alien.pm line 414. # Compilation failed in require at /home/cip/perl5/lib/perl5/Test/Alien.pm line 414. # BEGIN failed--compilation aborted at /home/cip/perl5/lib/perl5/Test/Alien.pm line 414. t/acme_alien_dontpanic2.t ....... Dubious, test returned 1 (wstat 256, 0x100) Failed 1/6 subtests t/acme_alien_dontpanic2__ffi.t .. ok This error happened at test time for the Alien, but depending on your environment and Alien it might happen later and the actual diagnostic wording might vary. This is usually because your XS or Alien tries to use dynamic libraries instead of static ones. Please consult the section about dynamic vs. static libraries in L. The TL;DR is that L might help. If you are the Alien author and the package you are alienizing doesn't have a static option you can use L, but please note the extended set of caveats! =head2 599 Internal Exception errors downloading packages from the internet Alien::Build::Plugin::Fetch::HTTPTiny> 599 Internal Exception fetching http://dist.libuv.org/dist/v1.15.0 Alien::Build::Plugin::Fetch::HTTPTiny> exception: IO::Socket::SSL 1.42 must be installed for https support Alien::Build::Plugin::Fetch::HTTPTiny> exception: Net::SSLeay 1.49 must be installed for https support Alien::Build::Plugin::Fetch::HTTPTiny> An attempt at a SSL URL https was made, but your HTTP::Tiny does not appear to be able to use https. Alien::Build::Plugin::Fetch::HTTPTiny> Please see: https://metacpan.org/pod/Alien::Build::Manual::FAQ#599-Internal-Exception-errors-downloading-packages-from-the-internet error fetching http://dist.libuv.org/dist/v1.15.0: 599 Internal Exception at /Users/ollisg/.perlbrew/libs/perl-5.26.0@test1/lib/perl5/Alien/Build/Plugin/Fetch/HTTPTiny.pm line 68. (Older versions of L produced a less verbose more confusing version of this diagnostic). TL;DR, instead of this: share { start_url => 'http://example.org/dist'; ... }; do this: share { start_url => 'https://example.org/dist'; }; If the website is going to redirect to a secure URL anyway. The "599 Internal Exception" indicates an "internal" exception from L and is not a real HTTP status code or error. This could mean a number of different problems, but most frequently indicates that a SSL request was made without the required modules (L and L). Normally the L and L will make sure that the appropriate modules are added to your prerequisites for you if you specify a C URL. Some websites allow an initial request from C but then redirect to C. If you can it is better to specify C, if you cannot, then you can instead use the C property on either of those two plugins. =head2 Does not detect system package even though it is installed This could just be because the alien requires a more recent package that what is provided by your operating system. It could also be because you do not have the development package installed. Many Linux vendors in particular separate packages into runtime and development pages. On RPM based systems these development packages usually have C<-devel> suffix (example runtime: C and development: C). On Debian based systems these development packages usually have a C<-dev> suffix (example runtime: C and development: C). =head2 Network fetch is turned off If you get an error like this: Alien::Build> install type share requested or detected, but network fetch is turned off Alien::Build> see see https://metacpan.org/pod/Alien::Build::Manual::FAQ#Network-fetch-is-turned-off This is because your environment is setup not to install aliens that require the network. You can turn network fetch back on by setting C to true, or by unsetting it. This environment variable is designed for environments that don't ever want to install aliens that require downloading source packages over the internet. =head2 I would really prefer you not download stuff off the internet The idea of L is to download missing packages and build them automatically to make installing easier. Some people may not like this, or may even have security requirements that they not download random package over the internet (caveat, downloading random stuff off of CPAN may not be any safer, so make sure you audit all of the open source software that you use appropriately). Another reason you may not want to download from the internet is if you are packaging up an alien for an operating system vendor, which will always want to use the system version of a library. In that situation you don't want L to go off and download something from the internet because the probe failed for some reason. This is easy to take care of, simply set C to C and a build from source code will never be attempted. On systems that do not provide system versions of the library or tool you will get an error, allowing you to install the library, and retry the alien install. You can also set the environment variable on just some aliens. % export ALIEN_INSTALL_TYPE=system # for everyone % env ALIEN_INSTALL_TYPE=system cpanm -v Alien::libfoo =head2 For testing I would like to test both system and share installs! You can use the C environment variable. It will force either a C or C install depending on how it is set. For Travis-CI you can do something like this: env: matrix: - ALIEN_INSTALL_TYPE=share - ALIEN_INSTALL_TYPE=system =head2 How do I use Alien::Build from Dist::Zilla? For creating L and L based dist from L you can use the dzil plugin L. =head2 Cannot find either a share directory or a ConfigData module If you see an error like this: Cannot find either a share directory or a ConfigData module for Alien::libfoo. (Alien::libfoo loaded from lib/Alien/libfoo.pm) Please see https://metacpan.org/pod/distribution/Alien-Build/lib/Alien/Build/Manual/FAQ.pod#Cannot-find-either-a-share-directory-or-a-ConfigData-module Can't locate Alien/libfoo/ConfigData.pm in @INC (you may need to install the Alien::libfoo::ConfigData module) (@INC contains: ...) it means you are trying to use an Alien that hasn't been properly installed. An L based Alien needs to have either the share directory build during the install process or for older legacy L based Aliens, a ConfigData module generated by L. This usually happens if you try to use an Alien module from the lib directory as part of the Alien's distribution. You need to build the alien and use C instead of C or install the alien and use the installed path. It is also possible that your Alien installer is not set up correctly. Make sure your C is using L correctly. =head2 I have a question not listed here! There are a number of forums available to people working on L, L and L modules: =over 4 =item C<#native> on irc.perl.org This is intended for native interfaces in general so is a good place for questions about L generally or L and L specifically. =item mailing list The C google group is intended for L issues generally, including L and L. L =item Open a support ticket If you have an issue with L itself, then please open a support ticket on the project's GitHub issue tracker. L =back =head1 SEE ALSO =over 4 =item L Other L manuals. =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Manual/PluginAuthor.pod000644 000000 000000 00000052341 14710030646 022717 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Manual::PluginAuthor # ABSTRACT: Alien::Build plugin author documentation # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Manual::PluginAuthor - Alien::Build plugin author documentation =head1 VERSION version 2.84 =head1 SYNOPSIS your plugin: package Alien::Build::Plugin::Build::MyPlugin; use strict; use warnings; use Alien::Build::Plugin; has arg1 => 'default_for arg1'; has arg2 => sub { [ 'default', 'for', 'arg2' ] }; sub init { my($self, $meta) = @_; ... } 1; and then from L: use alienfile; plugin 'Build::MyPlugin' => ( arg1 => 'override for arg1', arg2 => [ 'something', 'else' ], ); =for html

flowchart

Notes: The colored blocks indicate alienfile blocks. Hooks are indicated as predefined process (rectangle with double struck vertical edges). Hooks that can easily be implemented from an alienfile are indicated in blue (Note that [] is used to indicate passing in an array reference, but a subroutine reference can also be used). For simplicity, the the flowchart does not include when required modules are loaded. Except for configure time requirements, they are loaded when the corresponding alienfile blocks are entered. It is not shown, but generally any plugin can cause a Fail by throwing an exception with die.

Perlish pseudo code for how plugins are called: my $probe; my $override = override(); if($override eq 'system') { $probe = probe(); if($probe ne 'system') { die 'system tool or library not found'; } } elsif($override eq 'default') { $probe = probe(); } else { # $override eq 'share' # note that in this instance the # probe hook is never called $probe = 'share'; } if($probe eq 'system') { gather_system(); } else { # $probe eq 'share' download(); extract(); patch(); build(); gather_share(); # Check to see if there isa build_ffi hook if(defined &build_ffi) { patch_ffi(); build_ffi(); gather_ffi(); } } # By default this just returns the value of $ENV{ALIEN_INSTALL_TYPE} sub override { return $ENV{ALIEN_INSTALL_TYPE}; } # Default download implementation; can be # replaced by specifying a different download # hook. See Alien::Build::Plugin::Core::Download # for detailed implementation. sub download { my $response = fetch(); if($response->{type} eq 'html' || $response->{type} eq 'dir_listing') { # decode will transform an HTML listing (html) or a FTP directory # listing (dir_listing) into a regular list $response = decode($response); } if($response->{type} eq 'list') { # prefer will filter bad entries in the list # and sort them so that the first one is # the one that we want $response = prefer($response); my $first_preferred = $res->{list}->[0]; # prefer can sometimes infer the version from the # filename. if(defined $first_preferred->{version}) { # not a hook runtime_prop->{version} = $first_preferred->{version}; } $response = fetch($first_preferred); } if($response->{type} eq 'file') { # not a hook write_file_to_disk $response; } } =head1 DESCRIPTION This document explains how to write L plugins using the L base class. =head2 Writing plugins Plugins use L, which sets the appropriate base class, and provides you with the C property builder. C takes two arguments, the name of the property and the default value. (As with L and L, you should use a code reference to specify default values for non-string defaults). No B set this as your plugin's base class directly: use parent qw( Alien::Build::Plugin ); # wrong use Alien::Build::Plugin; # right The only method that you need to implement is C. From this method you can add hooks to change the behavior of the L recipe. This is a very simple example of a probe hook, with the actual probe logic removed: sub init { my($self, $meta) = @_; $meta->register_hook( probe => sub { my($build) = @_; if( ... ) { return 'system'; } else { return 'share'; } }, ); } Hooks get the L instance as their first argument, and depending on the hook may get additional arguments. =head2 Modifying hooks You can also modify hooks using C, C and C, similar to L modifiers: sub init { my($self, $meta) = @_; $meta->before_hook( build => sub { my($build) = @_; $build->log('this runs before the build'); }, ); $meta->after_hook( build => sub { my($build) = @_; $build->log('this runs after the build'); }, ); $meta->around_hook( build => sub { my $orig = shift; # around hooks are useful for setting environment variables local $ENV{CPPFLAGS} = '-I/foo/include'; $orig->(@_); }, ); } =head2 Testing plugins You can and should write tests for your plugin. The best way to do this is using L, which allows you to write an inline L in your test. Here is an example: use Test::V0; use Test::Alien::Build; my $build = alienfile_ok q{ use alienfile; plugin 'Build::MyPlugin' => ( arg1 => 'override for arg1', arg2 => [ 'something', 'else' ], ); ... }; # you can interrogate $build, it is an instance of L. my $alien = alien_build_ok; # you can interrogate $alien, it is an instance of L. =head2 Negotiator plugins A Negotiator plugin doesn't itself typically implement anything on its own, but picks the best plugin to achieve a particular goal. The "best" plugin can in some cases vary depending on the platform or tools that are available. For example The L might choose to use the fetch plugin that relies on the command line C, or it might choose the fetch plugin that relies on the Perl module L depending on the platform and what is already installed. (For either to be useful they have to support SSL). The Negotiator plugin is by convention named something like C, but is typically invoked without the C<::Negotiate> suffix. For example: plugin 'Download'; # is short for Alien::Build::Plugin::Download::Negotiator Here is a simple example of a negotiator which picks C if already installed and L otherwise. (The actual download plugin is a lot smarter and complicated than this, but this is a good simplified example). package Alien::Build::Plugin::Download::Negotiate; use strict; use warnings; use Alien::Build::Plugin; use File::Which qw( which ); sub init { my($self, $meta) = @_; if(which('curl')) { $meta->apply_plugin('Fetch::Curl'); } else { $meta->apply_plugin('Fetch::HTTPTiny'); } } =head2 Hooks The remainder of this document is a reference for the hooks that you can register. Generally speaking you can register any hook that you like, but some care must be taken as some hooks have default behavior that will be overridden when you register a hook. The hooks are presented in alphabetical order. The execution order is shown in the flowchart above (if you are browsing the HTML version of this document), or the Perlish pseudo code in the synopsis section. =head1 HOOKS =head2 build hook $meta->register_hook( build => sub { my($build) = @_; ... }); This does the main build of the alienized project and installs it into the staging area. The current directory is the build root. You need to run whatever tools are necessary for the project, and install them into C<$build->install_prop->{prefix}> (C<%{.install.prefix}>). =head2 build_ffi hook $meta->register_hook( build_ffi => sub { my($build) = @_; ... }); This is the same as L, except it fires only on a FFI build. =head2 decode hook $meta->register_hook( decode => sub { my($build, $res) = @_; ... } This hook takes a response hash reference from the C hook above with a type of C or C and converts it into a response hash reference of type C. In short it takes an HTML or FTP file listing response from a fetch hook and converts it into a list of filenames and links that can be used by the prefer hook to choose the correct file to download. See the L for the specification of the input and response hash references. =head2 check_digest hook # implement the well known FOO-92 digest $meta->register_hook( check_digest => sub { my($build, $file, $algorithm, $digest) = @_; if($algorithm ne 'FOO92') { return 0; } my $actual = foo92_hex_digest($file); if($actual eq $digest) { return 1; } else { die "Digest FOO92 does not match: got $actual, expected $digest"; } }); This hook should check the given C<$file> (the format is the same as used by L) matches the given C<$digest> using the given C<$algorithm>. If the plugin does not support the given algorithm, then it should return a false value. If the digest does not match, it should throw an exception. If the digest matches, it should return a true value. =head2 clean_install $meta->register_hook( clean_install => sub { my($build) = @_; }); This hook allows you to remove files from the final install location before the files are installed by the installer layer (examples: L, L or L). This hook is not called by default, and must be enabled via the interface to the installer layer (example: L). This hook SHOULD NOT remove the C<_alien> directory or its content from the install location. The default implementation removes all the files EXCEPT the C<_alien> directory and its content. =head2 download hook $meta->register_hook( download => sub { my($build) = @_; ... }); This hook is used to download from the internet the source. Either as an archive (like tar, zip, etc), or as a directory of files (C, etc). When the hook is called, the current working directory will be a new empty directory, so you can save the download to the current directory. If you store a single file in the directory, L will assume that it is an archive, which will be processed by the L. If you store multiple files, L will assume the current directory is the source root. If no files are stored at all, an exception with an appropriate diagnostic will be thrown. B: If you register this hook, then the fetch, decode and prefer hooks will NOT be called, unless you call them yourself from this hook. =head2 extract hook $meta->register_hook( extract => sub { my($build, $archive) = @_; ... }); This hook is used to extract an archive that has already been downloaded. L already has plugins for the most common archive formats, so you will likely only need this to add support for new or novel archive formats. When this hook is called, the current working directory will be a new empty directory, so you can save the content of the archive to the current directory. If a single directory is written to the current directory, L will assume that is the root directory of the package. If multiple files and/or directories are present, that will indicate that the current working directory is the root of the package. The logic typically handles correctly the default behavior for tar (where packages are typically extracted to a subdirectory) and for zip (where packages are typically extracted to the current directory). =head2 fetch hook package Alien::Build::Plugin::MyPlugin; use strict; use warnings; use Alien::Build::Plugin; use Carp (); has '+url' => sub { Carp::croak "url is required property" }; sub init { my($self, $meta) = @_; $meta->register_hook( fetch => sub { my($build, $url, %options) = @_; ... } } 1; Used to fetch a resource. The first time it will be called without an argument (or with C<$url> set to C, so the configuration used to find the resource should be specified by the plugin's properties. On subsequent calls the first argument will be a URL. The C<%options> hash may contain these options: =over 4 =item http_headers HTTP request headers, if an appropriate protocol is being used. The headers are provided as an array reference of key/value pairs, which allows for duplicate header keys with multiple values. If a non-HTTP protocol is used, or if the plugin cannot otherwise send HTTP request headers, the plugin SHOULD issue a warning using the C<< $build->log >> method, but because this option wasn't part of the original spec, the plugin MAY no issue that warning while ignoring it. =back Note that versions of L prior to 2.39 did not pass the options hash into the fetch plugin. Normally the first fetch will be to either a file or a directory listing. If it is a file then the content should be returned as a hash reference with the following keys: # content of file stored in Perl return { type => 'file', filename => $filename, content => $content, version => $version, # optional, if known protocol => $protocol, # AB 2.60 optional, but recommended }; # content of file stored in the filesystem return { type => 'file', filename => $filename, path => $path, # full file system path to file version => $version, # optional, if known tmp => $tmp, # optional protocol => $protocol, # AB 2.60 optional, but recommended }; C<$tmp> if set will indicate if the file is temporary or not, and can be used by L to save a copy in some cases. The default is true, so L assumes the file or directory is temporary if you don't tell it otherwise. Probably the most common situation when you would set C to false, is when the file is bundled inside the L distribution. See L for example. If the URL points to a directory listing you should return it as either a hash reference containing a list of files: return { type => 'list', list => [ # filename: each filename should be just the # filename portion, no path or url. # url: each url should be the complete url # needed to fetch the file. # version: OPTIONAL, may be provided by some fetch or prefer { filename => $filename1, url => $url1, version => $version1 }, { filename => $filename2, url => $url2, version => $version2 }, ], protocol => $protocol, # AB 2.60 optional, but recommended }; or if the listing is in HTML format as a hash reference containing the HTML information: return { type => 'html', charset => $charset, # optional base => $base, # the base URL: used for computing relative URLs content => $content, # the HTML content protocol => $protocol, # optional, but recommended }; or a directory listing (usually produced by an FTP servers) as a hash reference: return { type => 'dir_listing', base => $base, content => $content, protocol => $protocol, # AB 2.60 optional, but recommended }; [version 2.60] For all of these responses C<$protocol> is optional, since it was not part of the original spec, however it is strongly recommended that you include this field, because future versions of L will use this to determine if a file was downloaded securely (that is via a secure protocol such as SSL). Some plugins (like L) trans late a file hash from one type to another, they should maintain the C<$protocol> from the old to the new representation of the file. =head2 gather_ffi hook $meta->register_hook( gather_ffi => sub { my($build) = @_; $build->runtime_prop->{cflags} = ...; $build->runtime_prop->{libs} = ...; $build->runtime_prop->{version} = ...; }); This hook is called for a FFI build to determine the properties necessary for using the library or tool. These properties should be stored in the L hash as shown above. Typical properties that are needed for libraries are cflags and libs. If at all possible you should also try to determine the version of the library or tool. =head2 gather_share hook $meta->register_hook( gather_share => sub { my($build) = @_; $build->runtime_prop->{cflags} = ...; $build->runtime_prop->{libs} = ...; $build->runtime_prop->{version} = ...; }); This hook is called for a share install to determine the properties necessary for using the library or tool. These properties should be stored in the L hash as shown above. Typical properties that are needed for libraries are cflags and libs. If at all possible you should also try to determine the version of the library or tool. =head2 gather_system hook $meta->register_hook( gather_system => sub { my($build) = @_; $build->runtime_prop->{cflags} = ...; $build->runtime_prop->{libs} = ...; $build->runtime_prop->{version} = ...; }); This hook is called for a system install to determine the properties necessary for using the library or tool. These properties should be stored in the L hash as shown above. Typical properties that are needed for libraries are cflags and libs. If at all possible you should also try to determine the version of the library or tool. =head2 override hook $meta->register_hook( override => sub { my($build) = @_; return $ENV{ALIEN_INSTALL_TYPE} || ''; }); This allows you to alter the override logic. It should return one of C, C, C or C<''>. The default implementation is shown above. L and L are examples of how you can use this hook. =head2 patch hook $meta->register_hook( patch => sub { my($build) = @_; ... }); This hook is completely optional. If registered, it will be triggered after extraction and before build. It allows you to apply any patches or make any modifications to the source if they are necessary. =head2 patch_ffi hook $meta->register_hook( patch_ffi => sub { my($build) = @_; ... }); This hook is exactly like the L, except it fires only on an FFI build. =head2 prefer hook $meta->register_hook( prefer => sub { my($build, $res) = @_; return { type => 'list', list => [sort @{ $res->{list} }], }; } This hook sorts candidates from a listing generated from either the C or C hooks. It should return a new list hash reference with the candidates sorted from best to worst. It may also remove candidates that are totally unacceptable. =head2 probe hook $meta->register_hook( probe => sub { my($build) = @_; return 'system' if ...; # system install return 'share'; # otherwise }); $meta->register_hook( probe => [ $command ] ); This hook should return the string C if the operating system provides the library or tool. It should return C otherwise. You can also use a command that returns true when the tool or library is available. For example for use with C: $meta->register_hook( probe => [ '%{pkgconf} --exists libfoo' ] ); Or if you needed a minimum version: $meta->register_hook( probe => [ '%{pkgconf} --atleast-version=1.00 libfoo' ] ); Note that this hook SHOULD NOT gather system properties, such as cflags, libs, versions, etc, because the probe hook will be skipped in the event the environment variable C is set. The detection of these properties should instead be done by the L hook. Multiple probe hooks can be given. These will be used in sequence, stopping at the first that detects a system installation. =head1 SEE ALSO =over 4 =item L Other L manuals. =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Manual/Security.pod000644 000000 000000 00000021323 14710030646 022101 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Manual::Security # ABSTRACT: General alien author documentation # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Manual::Security - General alien author documentation =head1 VERSION version 2.84 =head1 SYNOPSIS perldoc Alien::Build::Manual::Security =head1 DESCRIPTION You are rightly concerned that an L might be downloading something random off the internet. This manual will describe some of the real risks and go over how you can mitigate them. =head2 no warranty L provides L authors with tools to add external non-Perl dependencies to CPAN modules. It is open source software that is entirely volunteer driven, meaning the people writing this software are not getting compensated monetarily for the work. As such, we do our best not to intentionally introduce security vulnerabilities into our modules, or their dependencies. But it is also not our responsibility either. If you are operating in an environment where you need absolute security, you need to carefully audit I of the software that you use. =head2 L vs. L I suppose you could argue that L based Ls and Ls in general are inherently less secure than the the Perl modules on L that don't download random stuff off the internet. Worse yet, Ls might be downloading from insecure sources like C or C. This argument falls apart pretty quickly when you realize that =over 4 =item 1 Perl modules from L are in fact random stuff off the internet. Most modules, when installed execute a C which can execute completely arbitrary Perl code. Without a proper audit or firewalls that L code could be making connections to insecure sources like C if they are not themselves doing something nefarious. =item 2 By default, the most frequently used L client L uses C to fetch L modules. So unless you have specifically configured it to connect to a secure source you are downloading even more random stuff than usual off the internet. =back The TL;DR is that if you are using a Perl module, whether it be C, C or C and you are concerned about security you need to audit all of your Perl modules, not just the L ones. =head2 Restricting L by environment Okay, granted you need to audit software for security regardless of if it is L, you still don't like the idea of downloading external dependencies and you can't firewall just the L module installs. L based Ls respect a number of environment variables that at least give you some control over how aggresive L will be at fetching random stuff off the internet. =over 4 =item C This environment variable configures how L will deal with insecure protocols and files that do not include a cryptographic signature. Part of the design of the L system is that it typically tries to download the latest version of a package instead of a fixed version, so that the L doesn't need to be updated when a new alienized package is released. This means that we frequently have to rely on TLS or bundled alienized packages to ensure that the alienized package is fetched securely. Recently (as of L 2.59) we started supporting cryptographic signatures defined in Ls, but they are not yet very common, and they only really work when a single alienized package URL is hard coded into the L instead of the more typical mode of operation where the latest version is downloaded. =over 4 =item warn This mode will warn you if an L based L attempts to fetch a alienized package insecurely. It will also warn you if a package doesn't have a cryptographic signature. Neither of these things wild stop the L from being installed. This is unfortunately currently the default mode of L, for historical reasons. Once plugins and Ls are updated to either use secure fetch (TLS or bundled alienized packages), or cryptographic signatures, the default will be changed to C. =item digest_or_encrypt This mode will require that before an alienized package is extracted that it is either fetched via a secure protocol (C or C), or the package matches a cryptographic signature. This will likely be the default for L in the near future, but it doesn't hurt to set it now, if you don't mind submitting tickets to Ls or L that don't support this mode yet. =back =item C By design Ls should use local installs of libraries and tools before downloading source from the internet. Setting this environment variable to false, will instruct L to not attempt to fetch the alienized package off the internet if it is not available locally or as a bundled package. This is similar to setting C to C (see below), except it does allow Ls that bundle their alienized package inside the L package tarball. Some Ls will not install properly at first, but when they error you can install the system package and try to re-install the L. =item C Setting C to C is similar to setting C to false, except that bundled alienized packages will also be rejected. This environment variable is really intended for use by operating system vendors packaging Ls, or for L developer testing (in CI for example). For some who want to restrict how Ls install this might be the right tool to reach for. =back Note that this is definitely best effort. If the L author makes a mistake or is malicious they could override these environment variables inside the C, so you still need to audit any software to ensure that it doesn't fetch source off the internet. =head2 Security Related Plugins There are a number of plugins that give the user or installer control over how L behaves, and may be useful for rudimentary security. =over 4 =item L This plugin will prompt before fetching any remote files. This only really works when you are installing Ls interactively. =item L This plugin will only allow fetching from hosts that are in an allow list. =item L This plugin will not allow fetching from hosts that are in a block list. =item L This plugin can re-write fetched URLs before the request is made. This can be useful if you have a local mirror of certain sources that you want to use instead of fetching from the wider internet. =item L This plugin can override the C on a perl-Alien basis. This can be useful if you want to install some Ls in C mode, but generally want to enforce C mode. =back =head2 local configuration You can configure the way L based Ls are installed with the local configuration file C<~/.alienbuild/rc.pl>. See L for details. =head1 CAVEATS This whole document is caveats, but if you haven't gotten it by now then, fundamentally if you need to use Perl modules securely then you need to audit the code for security vulnerabilities. If you think that the security of L and the Ls that depend on it, then I. =head1 SEE ALSO =over 4 =item L Other L manuals. =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Manual/image/000755 000000 000000 00000000000 14710030646 020647 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Manual/image/PluginAuthor-flowchart.png000644 000000 000000 00000565345 14710030646 026007 0ustar00rootroot000000 000000 ‰PNG  IHDRÜ“Q¤åôgzTXtRaw profile type exifxÚ­™i’#¹Ž„ÿós$¸‡«ÙÜ`Ž?R.UYÖý^w*S¡”"$àpwPnÿßÿ÷?ü$Þ%-5·œ=?©¥&Õ??ý>ŸîóýYÓëëÝoï»}¹¯„·"Çø|Pós ï÷_¼¡óJ¿ Tçëƒñýƒ–ž£Ô_zÝ(ڌĦøžÑk (Ïá5@–ås«åëÆ~-ñ5î Ξt†•üºÛ¯ÿ§Bô–rŸ(²cˆžg‰òL ÚŸ¸ØyQy‘OxÖûºðüœž€ü'ÿeVî׬Ìüqò·÷?^ý’”˜Ÿ÷o|fþ8þø~Пƒïnˆ¿Ü9Î;{?ŸðÛrÞç¬êÎÙÏêzÊ„4¿õ^Ê}ʼnƒÇ{YæQøS^—ûh<ª½“”/?ýà1C BZNHa…NØ÷8ÃdŠI¶Ž"Sâ}¯Æ"M&%B†’=‘[\dPâ$½‘wåc.áÞ·ÝÛ8–_3%0XxÒ/ÿÎãcÁ×'NÀ‚y‰!‹iXæì™³HH8oé ðûñëå5’A½a®,°ûñ 14¼°e8Š7Ñ‘•ãSk¡¬×„ˆ{+“ ‘ ø øC¾ˆ”ˆc%?ªÄ$ƒUYÌRRŒ™äT±{sM ÷\QyÞ†³H„ÆL!UÔÉU‚ØÀOI ušT5kѪM{Ž9eÍ9—lä×K,©hÉ¥”ZZé5ÖTµæZjuµÕÞ¤EÈQ[n¥ÕÖZïÜ´3rçêÎ ½q¤¡#2êh£Oà3ÓÔ™g™ÕÍ6û’<±ò*«®¶ú(í´uç]vÝm÷ÔN<éèɧœzÚéY î–]øíñ÷³ÞY“›);±|dKKyŒNÔrFÆ$2^,Z,g¾†”ÄYê,g¾ U¡Â,Õ’³‚eŒ ¦DOøÈÝgæ¾åÍ¥ôò&ïÌ9KÝ¿‘9g©ûCæ~ÏÛY[¦6ÓGw3dehAõ‘òã¤.•_4éËÑ(ˆL¬5giJ^Êh´çtöî0$Ÿq“³rW¿‘³¼%¤ÓKb=¾I6ËeÚ™e˜<ÄÛö•²J#màf²¨üþ“£ûჄºÝÇÙ…åleøh÷¯`i†]sQk ’•x¹ wžŠÄÃÂ×Ìñlm'† \=”ºhUãñ›kjZ|ª÷Æ÷èÞ/þÙQ¬Öˆ`1×1 ú°HBÎ-h-Îp4î–¶¬º}Ñ^W`#(t•‰³Ý4ÃÅÓÍOBFÐ 4”ªÀüX„~ÃÀŸî/O$x2SCßê ’m¸„µPQ­=‹n­­»"e1ýÔ I‹%{fô &ôøí¿rÃ1³r'&ŒŒv‰êg̽“3VÐ4Hiɽβ‰Â\šGnº±•ê)IpùRŠnϸ<õþ _˜Kë¤L°ü•Zë$|h*¯sWnÇÏz™~‰«Ôø¾ž¨ÿyèÜÅá\~š. )¾O]=!²Mªk‡7Ï`î ¨®X7Ìã€=)Vk¥  ÞiZ @Bj`¶ðÄÌeœáàVdZÖ«¯çX}Ê™k÷èŽõ ¹ÃRHFÍ™hÁ‰&àhbs¡>z×Ö¨ùºS.Ý€´©ú26ÿx«‘0\ǼqÕ–Cr‡æI’GTÊÞ,\—M8vŸÌZ;$¡ :óm¢@@jGÎÚj±±™ú7‹´R¥¤7L‰g#—,d!5ÄBG@½Ð~æ_z1db´&}˜˜ÛZtñ"^SëŠ q¥k ¡ôSÊ ñÌÝÇ(kÇ£½×fJéÖæ‚8×`êœË(†Ñ|çs%`Ŭb`ÁîHhNµ Nߥ âG È`>î´T Œxغn‘ÎÆ˜ÄÙĈÙãQ╺àÎÚQM}c{‰ƒkù¦qÅ0JËiÇê7вzA:ë® 7¯Òø¹W³õ²ÃÕ joD'ˆá)󋀆Àj¢¡*ukŽìÆ6Ò:º´ Ê{# ±‘ ÐP§Fë.%­˜Úš”ÑîÒÆ˜…¥qO¡þv\˜œªÑ–%X>Í€´cGÖQN(HôR#€Ä‰ÝW±é æLbi?Ô ƒ}©úµÜNt†5 똔à,†íUúŠƒùï|&ЯD’Ÿ%§¶iš‹ZWÙÃ4ôžHŤtÃÚ¢ºÉ„q9ëÔÜ”;ðBÒ¬TÅhÕÝnjA­x´dníÔ Ê†×<ó‚VÜKň_4—ew.kh<{à,ׯ9£*ašq˜mʗ芾b ;Q@ QH%œw§ªT"Jlêµ%3,âÝöMó]» LQ1G{”6²‘}3â¯``µºKarD{6f WuPR 4}4M#"\D„“ïÙåÄ#6› yªÐቇ¡OíäÓm¹È&ÌiP{`=ã.©=³‚;®hDÃ@ÔØ½(0œ„–› /÷Ø5n1ic±ÖgL l*ˆ‚“2Ö‚'–JÐû˜t_ÅúÚåcgO«ø/ðቅ~>e8¬*H8VÓb.pe†±'b{7 %F¸£jI:ÌA`¸á@µçÒ ð‡ðo%o?ú•ÂÞû:T±ÌÈ îPëø*<{‡ÏêBl‘õFÿ¶krŒÑö Ïlx†5qN„E:¢Ù!Ç%hV±!!42©‹„!c”¡›jø¥Ô¤ÕƒCθSEqè6`ÿ“÷1ãÆ]'—ÛP„'#ølěġÏhU…Ì^>á0BêôÙùÑ0b¦¢ñ!02|·Àk&•áL;a!šN+ùŠ puÓSèIÖ¬iB¼KG’ÓôÈZ°;”‡Lq£÷àh}MU&ÕiÚž54ƒU5UB‹€º!è{µÕ:–+` äÅ}‚ªÚ] k²ž^nnA9«Ä ‹f|èÀÑ{4µÉÄ-Âu j¢œAîMð+ÎBÜ€¡ S%ÈuLæ>"ôà+ÎÎ@‰³Ø ¬WÊíJ‚Ž2®Í!sl×ʴ͘dJ»§Øg¢‚£°6˜àÐÖ19ðd{pfåè‘á øq Á\‡§=è%:9Ä¢GpXƒ Sêþ°c%W³`-„iCCPICC profilexœ}‘=HÃ@Å_[¥EZ¬ â¡:YqÔ*¡B¨Zu0¹ô š4$).Ž‚kÁÁŪƒ‹³®®‚ øâèä¤è"%þ/)´ˆñà¸ïî=îÞþF…©f×8 j–‘N&„lnU¾"„Ї‰™úœ(¦à9¾îáãë]œgyŸûsD”¼ÉŸ@<ËtÃ"Þ žÞ´tÎûÄQV’âsâ1ƒ.HüÈuÙå7ÎE‡ý<3jdÒóÄQb¡ØÁr³’¡OÇU£|Öe…ógµRc­{ò†óÚÊ2×i#‰E,A„5”Q…8­)&Ò´Ÿðð9~‘\2¹Ê`äX@*$Çþ¿»5 “nR8t¿ØöÇÜšuÛþ>¶íæ x®´¶¿Úf>I¯·µØл \\·5y¸ÜŸtÉ)@Ó_(ïgôM9 ÿèYs{kíãôÈPW©àà-RöºÇ»C½ý{¦Õß‹Ùr±M˜¯«‹iTXtXML:com.adobe.xmp F=×bKGDùC» pHYs››Iuƒ”tIMEæ 4o IDATxÚìÝw|Ý¡ÿÿ÷ÉîÞ›Ò-вA½dÊ’%"â¾\×u{½¸'¢8‘=‘!WDeƒlDö¦ JgºÛ$mr>¿?ðò»|Ñ+§¡IžÏǃ´I“sÞŸÓ„¼òÉçTŠ¢(¼!5&€7Np€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;” Î$IQ©V«i^´8 ,ÌŠ+ò&8p@”Áƒ¦¦¦&•JÅ(ÐETŠ¢(ÌÐ3uT«yøáGóÈ£fÑ’å<°&N—ÆÆ¦455èMÐÚÒ’–¶Ö<óì´,_±*Æ Ì›ož©S6ß`'¸ô@sçÎË·Ü–Y3geë­¶Ìn»îœ¦¦FìƒV®\•oº%>òh6›:%;ïøÖ 6Ô0°Üz+VäÜ .I{{{Þ{â»Ò·oŸÔÖÖ¦ hoïÈ’¥Kò³_œ›‘#F丣LïÞ½ ëÁ ¨V«ùïkÿé3få˜wžÇ¥ ›ýâœ\tÉey˶[eÏÝwu©XGîÝÜœ¹óòËË®ÈöoÙ:;íøVƒt#×ßxsž|êÙÌ‘4h AàM&¸tSEQäùçgçÌsÎÏç>õñôíÛÇ(ÝÐâ%Kòõo}?ÿñ±däÈ€7‘àÐM]õÛßeaó¢œø®cR__on¬µ­-gžu^¦l²QöÙkƒÀ›Dp膮¾æÚT*•tÀ~©©©1HÐÞÞ‘_ÿæÊŒ9"{AàM Ât#EQäêk®MGGG>p±½©««Í;<,3gÎÊÍ·Þnx(1ÝÈC<šJ%9ìЃR©T ÒÃÔÖÖæÝï:63fÎÊÓÏøpúöëkÞá#†ç¶Ûï0”Lpè"æÍ›Ÿ#†§±¡Á¼!}ûôIcSS–.[f (‘àÐEÌœ5+;ïèr2”c]wNss³! D‚;@1cæóÙd“Ɇ ›m6%Óg-ZœË¯¸*GuD èߣö0 –,]ê/”Äî븢(ÒQ-zä}¿ùÖÛó‡nË'?úüúâ³òé$}èÑìsèñY¹rU–.[–ëþp}y쉴¶¶æ¯´°yѫΆommKkkÛ+þûɧŸÎ•×\—eË—gM{{Ú·R©¤¥¥-EQø‹%p†;À:®Z­¦W¯Þ=ò¾ÿöÚ?¦¶¶&뛉Æeâ„q5jTFžÚÚÚuÜIY²tyþúð¹ç¾¿æÒ ÏÌã?™S¿þÝ,^¼4 õu9ñ„£ó®cߙիWç3Ÿÿ¯,^º,ï8øíùÉ™çeÔÈá™1ãùT‹"Çœð|ó+ŸË.;ïÔ³_EÅ_2(‰3ܺ‚ÚD?þ‘÷gõê5ùè'¿o|ûû¹çÞ¿dò¤‰2xpræONË€þýrÈoËùgý(•$gŸwQÖ¬^žöõì¿ïž9ýGggö‹s’¼ôÓÓ¦ÏÊE—^žƒÞ¾o¾ýõÿÊ‘‡”>}zçÂs~œíÞ²­Çðº9ÀuÖV[m™Ó¾uj.½ìÊüêŠßåò«~ŸaCæý'½+GvHú÷ë—JM%MMéß¿_Š¢È÷¾õÕL›13•$MMMi¨¯Í­·Þžwux† œ¶Õkò±S>˜]wÞ!ùÛëÔT*é߯_{ÞÈNp€Òîë¸"ÉêÕkzä}ollÈöÛm›í·Û6mm«sÏ}÷çß>=ßúÞ³×»¥¶ö•?¨ÕÖ¶:ŸþüåÎ{ÿšöÙ=+[V¥¦¦&kÖ¬I¥RI¥¦&«ZÛ²ÃöÎdÿ-­­F€’¸¤ À:®’¤¾¾¾ÇÝï3gåÓ_ør¾ùï§££# Ùe§²ÅæSRWW—é3g½üºÿóä¨O>õtî¹ÿ¡|à=ÇæÔ/}6“'OzÕ‚ERW÷Êï7W‹¢Ç>qhSO<«Ög¸t•xÙ‘#Gäñ'žÊòe+Ò²ª%“7š”_œ“¿<ðH&Œ›­¶Ø,+V¬HC}}þpýÍÙlÓ)™ºÉÆ)Š"7ßúç 8 ×]w}zõî•[n¿3û¾mï¿{õ”ûgåÊU¹ø—¿Î;xGFÕ³[®)¥q†;ë¤¦ÆÆ\vñÙù(Í‹—æÊßþ>·ÝyoNz÷1ùÞ·¾œJ¥’>}úäý'½+ãÖ›gŸ›–ÁC峟üH–®X•§Ÿ~6?=ã»ù÷½7C‡˼ù 2`àÀl6eò+Þϻl³eV®\•ææE=oh½Êû2»è©?CÐE´··ç{§ÿ$ŸýÔGAé~ü³³ó‘¾7•Šòo”3ÜÖõÔ55©©øÞ(kG¿¾½Äv(‰à°® ®©Iß>½ÓÒÒj Jµ|ùŠ èßßPÁ  è׿–.[fJÕ¼hQúôéc(‰àÐŒ=:sçÎ3¥š>sV† b(‰àÐLœ0.sæÌ1¥šþÜ´Œ5ÊPÁ  »Þ˜,XØlJS­VÓ¼hqF f (‰àÐÔÕÕeá¢%)ŠÂ”¢½£#E¥655c@Iw€.bØÐÁ©V«† íkÚ3uÊF†€ î]ÄÄñã2múLCPЧŸ}.“6˜`(‘àÐEŒ»^n¿ã.CPŠ›n¹=C† 6”Hpè"Ö3&Ó§ÏÈšövcð†´¶¶eáüù{íf(™àÐ… 80øÓ ©V«Æàuiïèȃ=œÞ½zJ&¸t!½z5eê”M2sÖóÆàuyô±Çó–m¶N]]1 d‚;@sÈAûçŽ;ï1ÿ²¢(rË­wdÏ=v5¬‚;@Ó¯oß,Z´(+VzòTþ5K–,ÍðaCÒ«©É°î]L¥RÉÛÞ¶W®þíïŒÁkVEνà¢ìºËNÆ€µDpè‚6ž<)ó,Lk[›1xM–,]š>}ûf½1£k‰àÐEvÈùÍ•¿5¯É¯.¿2G¾ãCÀZ$¸tQÆË‚ÍYØÜl þOÓgÌLC]}† l X‹w€.ì¤Ë9ç_bþ¡jµš .¾,Ç{”1`-ܺ°þýúeƒ ãrßýƒ¿ëO7Ü”]wÞ!MÆ€µLpèÂ*•JŽ8ìÜzûY¾|…Ax…ææE™>cVöÜ}c@'ܺãŽ92§ŸñÓ¬io7I’–ÖÖ|û´3rôQ‡:I¥(ŠÂ ]ßSO=“¿<ôpŽX{¼¢H~qÎù9ðíûfÌèQ€Nâ w€nbÒ¤ 3tð üùŽ»ŒÑÃýî÷ȦS7ÉèQ#Hpè.Ðk*Ù{¯=òÐ#æ®»ï5HTE®¿ñæ,]¶,;í°}*•ŠQ  îÝéƒz¥’àä<ðàù÷þâªa=GQ¹å¶;2wÞüÌQ€7k¸tCííùŹd½Ñ£rðû¤¸ô²ß¤££#Ç}djj|?Þ ‚;@7UEîºûÞ<òØ9éÝÇ¥¾¾Þ(ÝPKkk~ü³³³÷»f«-77¼‰w€nî±ÇŸÌÕ×ü>ï:öȬ¿þXƒt#Ï<û\.½ìŠœø®c2α€7àд´´æ¬s/ÌÐ!ƒsäá‡8Û½‹kkkËý29ú¨ÃÒØØhXî=È´é3rée¿ÉÔ7ÊîŸúº:£t!­­­¹òêk2ë…99î‡gìØõŒëÁ zà¯åú›nÉÄqëg³Í¦fÒ†¤¶¶Ö0ë 5kÖä©§ŸÍ}(Í‹eŸ½öȦS71 ¬ƒw€ª(Š´¶¶åO7Ü”ûÿò@š­·Ø,m´aêêêR[S›JM%õuõIÅ^k÷`¼Ö‹¢HGGGV¯Y“Ç2>üh–/[švÜ!»ïºsêS©8°®ÜH{GGÚZÛÒÚÖš fÞ¼Y±rU67gñ’¥]ê¾Ì˜13MM9rd—ºÝÆÉÀ2`@ÿ :8ÆMSScýôt‚;ÝÊ/Î:7t@FŽa  SÕ˜€î¤( ±xSîPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€ît+•JÅÀ›¢REaº²æE‹óÁ,•šš,Z¼4ƒ H’ôjjÌÏø^úõík$`­s†;]ÞÁƒ2rô¨Ìž3?-­m™=g~^xq~Ö?Nl:à@·p±G½â×ÕjÇ«~`mÜèÆ­?6ô{ù×ãדQ#Gè4‚;ÝÂСC2rØ—=yÉéÝ»·a€N#¸Ð=>¡ÕÔäƒLGµš5íÙsÝRSS1 Ðiwº=wß%I%I%;î°½A€NUgº‹^½š²÷î;fذ¡©¯÷)è\jÝç“Z]]6ÞhRF‘JÅåd€ÎU)Š¢0@çzaöœ¬^ÝöF>|'ñáûï™={nê3ì=*kY‘¬7vLêëm@&¸t¢æE‹óƒ3~– ãÇfð!y=ѼÚQÍŒ™³2qâxƒþýOmû·Oo¯Õ²¥ËSS[“¾}û¼®?¿fM{fΘ‘Úú†üÛON½ð@%¸t’öööœúµïäSŸø· èßÿ ½z8Ûn³µQ)Åüù RWW—Áƒ½î·QEž6=üÓMù·lTz¤tŽ%K—åíûîõ†b;¬«*•J6œ8!K—.É’¥Ë @$¸t’›o¹=£Fì1÷wÎÜy™3g^þÞRU«ÕÌ›¿ 6{`t#•J%ãÆ­Ÿ•+W€©ÎcɲeéÓ§O¹¿>å?ÒÚÚ–+/¿0½šš^ñ²–ÖÖ|î‹_NcS¯üìŒïzpt#.T@O&¸tsE’E*•Ê¿þg_çŸK’s~qFR$M÷Fµ·w¤¶½£Ô÷ ðfܺ©ŽŽŽÜtó­™?AªE5£FŽÌ{ì––––Ü|ó-I*9ð€ýS©TÒÞÞžëo¸)9àíû¥½½#7ÜxSæÎ›Ÿ¾}ûd§wÈèQ#ÓÖÖ–›n¾5uuõ™cÖó¹ïÞû²jUK=÷Ø=ýúõu €.Cpè†Ö¬Y“ÿÄçòàÃe··OQùùÙçþÊg?õ±\síõyö¹éÙjË-³Þz£Ó¼hq¾ø•ïæ'—Õ«×äSŸûÏÜsÿÃy߉Gç¶?ß•ïýàÌ\ñ«s3`@ÿ\tÉåiìÕ”Ù/ÎÍ€þý²ÃÛçâˮʒ%K²dɲôêÕ+ûî»O~qÎEiimËÞ{ï•%K–æùdš/Í!ìs.øUV¯^“7š”$™¿`aN<ù”l8qýl·í–9ë¼Kr×½ä[_û’ƒ tž4 zö¹iyôñ'³Çî;ç_ýR¾öåÿ̦›l˜«÷Ç<ûÜôœtâqi]½&3fÎL’\}ÍïS_W—m·Ý:Í‹åþÍ'OyN8þØ|éóŸN]]]î¿ÿ¿]Ÿ&yòéçò±¼/—œÿó 4(I²`á¢|ý˟ϵW]’Þ½z½|[*»=ËW¬Ì·¾òù|þ3ŸÌEçþ$uuµ/¿Îÿ*«W¯Î¿ä9ñ„ãsÌчçú›nÏÃ<æ`]†3ܺ¡E‹§££È¾{ïžšššÔÔÔdƒ 7ÌC>9sæf‹-6ÍÈáCsûwgûí¶Ím·ÿ9½ûôΖ›o–{î»?I‘«®¹6¾óî´wt¤¶¶’ç¦ÏÈ^{ûmm«³Û®;§¡¡!Åßž%³oŸ>Ùf«ÍÓÐÐðÊS©äég§%IÆ›šššôï×/£F {ùUyäÑT*•œ~ÆÏÒ¯oŸÌ¿ õu™¿`ƒ t‚;@7T_÷Ò‡÷Õ«×¼ü{-«V½ô¿¾.}ûôÉÔM&åò«¯ËQGšyó›ó‰S>ššJz55¥HrÐûfÇÞš$©T*éÕ«é¥ÓÕ“T«EúôéýŠ÷9e£ ^ÛÿŸÛÓÖÖ–$é¨VÓÚ¶:}þv‰öÆÆ—þÜñÇ• &ŽÿÛõÝ+¯zë2—”膆’úúºüêò«²tÙ²Ì;/O>õLjëj3aܸÔÔÔä HŠj¾òÓR©©ÉÖ[nž$Yo½Ñij¨ÏSO?—ú§RIî¹÷þ,^¼äuÝ–¢(²Ù¦›¤R©äî{îÏòå+2í¹é™;oÁËÏ=vOGµš¶Ö– 28Ï<;-wÝs_šL Ëp†;@74aÂøÌáùåeWå½ï?%m«×¤µµ-_üÌÇ2räð$É6[mž!CæÙç¦gãÉ3rÔÈ$ÉàAƒrØ¡䊫®Íƒ?š+V¥w¯Æì¿ßÞ¯ûöŒ7.ǯ—s/üU®¿ñ–tT‹ôëÛ'ÏM{éò¸_n¾å¶|ûû?ÉÅ¿¼<ó,Êá‡Þ½{9˜@—Q)þç⻬UgwQ9pÿ 6ô ½ööö<øÐÃÙv›­ÿéëÎzþ…4/lN}C]˜õÖóŠ—?7mzV­Z™þýdÜúc_ñ²iÓgdù²eéÕ»wF•¾}údM{{žyæÙ´··góÍ6}ùuŸxâÉÔÔÔdÒ¤ SSóÒO=öØã)Rd“7Nmmm–.]–™³f¥¾¾>£GΜ9s²zõê—ßNk[[fLŸ‘U«Z2tØÐŒ52uu¾/ÜæÏ_ººº <è ¿­‹.ýuöÜ}—Œ=ʰô8J@7¶þØõ²þØõþáË7˜8á¾lâ„ñ¯ú½úººLÙdãWýþ&ç÷¦NòŠ_Ðÿ‘~@ÿ~¯xyScc6Þx# è²\ÃJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w€ÎR˜ ;Ü:ɈòrÅJCЭµµµ¥’Š!è‘w€N²ÅfS3gî\CÐmuttdÆôé1b¸1è‘w€N²Þ˜Ñ¹ö7dö‹sÞÐÛ©Tœ?L¹*•—þy#ªÕ"<øp&o´Qjkýï=ôkì¢(\U “´¶µå›ß9=ík²õÖ[gÈàAÿòÛèèèÈ´iÓ3iÒ†ý'ªÕêKß ¨øÅÿeÉ’¥©­­I¿~ýþå?[Ef½ðBì‰l¾ùfyç‘ïHmà@Ï$¸¼ Z[[3oþ‚T«Õ×÷Á;žƒõµlôÝýöÝ;›Nbµ¨±¡!LïÞ½Œ@Vg€Î×ÔÔ”që5ÄZ6rÄðtÀþ†:…Ÿù€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Ü ‚;”@p€îPÁJ ¸@ w\qÊÓ IDAT(à%Ü ‚;”@p€îPÁJ ¸@ w(à%Üè¶*&:Q èNVµ´äî{îOM¥&ÏÏž“[o»3Õ¢š†††¼u»mR[[k$`­¨EQ˜€î¢Z-²û¾ïHkKKêêjÓÞÞ‘"É»lŸï|ó+Ö—” {}b«©äß?ôžÔ××¥R©¤¾¾.EQää“Þm`­Üèv&m¸AjjþÿOq#‡Íøqc ¬U‚;ÝΤI¤WSãË¿Þ{ÏSWçiK€µKp ÛéÝ«WvÝe‡$IGµšM§NyÅïkƒú@·tü1G¦(’ööjvÙiGƒkŸ¯ [2dpÆ•­¶Ü< Ö:g¸Ð-õëÛ7L—=wßÙ@§Üè¶öÙ{¯Œ3Æ@§¨EQ˜€î¤¹yQνðÒ´¬\‘Õ«WgÒäÉ9ô ·gÀ€þÆÖÁ€n£Hò§ëoÌ´3sÌQ‡gà€éèèHó¢Åùîé?ÊÇOùPFi(`­Ü芢È7ßšÅK–æðwœšJå/oiiÉégü,Gvp&OÚÐ`@éwº¼¢(ríuL{{G=ø€øzÕ¢È7¾ýýñŽƒ²ñF“ ”Jp KkooÏe—_™#Fd¯=vMåÿ9³ýU¯ßÑ‘ /þU6Ùxr޺ݶÿôõ^«ÐU­ioÏ™g— 6˜˜½÷Üí5ÅóºÚÚ¼ûø£óècOäö;î2"Pg¸Ð%­X±2_zYvÙyÇL²ñëz×ýñú,Y²4Ǽóƒo˜3ÜèrV­jÉé?úYö}ÛÞ¯;¶'Éþûî“‘#Gä‚‹•ööÃoˆà@—²båÊ|áÔ¯ç#|o&Œ_ÿ ¿½ÝwÝ9Û¿e›|çûg¤Z­xÝ\R€.£yÑâ|ýÛ§å ŸþD† \êÛ~âɧò§oÉß÷ž464ø— ît /Ì~1§ýð§ùæWÿ3Mkå}<ûÜ´œÑ/ó…Ï~2½ššŒüKwÖiEQä…Ù/æÌ³/È~þ?ÖúÙçsçÍÏO~N>ñ±gà€ðš î¬Ó{âÉ\{ÝŸò±û`:éR/ 6çô3~šO|ì#2x°ƒ¼&‚;ë¬[nûsfÏ~1GñŽ4Ô×wêû^´hq.¼øW9ð€ý²á àŸÜXçE‘?ÞpSš6ç˜w‘ššš7åv¬X¹2?<ãg9öè#3aÂ8ø? î¬SªE‘sλ(›l4);ì°}jߤØþ?ÚÚVçG?=3{ï¹{¶Üb3ø‡wÖEQä¢K/Ë„ñã²óŽ;¤RY7nW{{{νà’l¶é”¼u»mSYWn°NÜX'´wt䬳ÏÏÖ[o™íß²Í:yÏ¿èÒl0qBvÙi xÁ€7]KkkÎ<ë¼ì¶ëÎÙj¾lKQ¹üÊk2bØì¼ÓŽ©­­qð€— î¼©V®Z•ïžöÜpü1™8aü:{‹¢ÈµøSV®X™£Žx‡ËË/ÜxÓÌ7?W^}MØoߌ7¶KÝö{ïûK~ä±¼û]Ǥ¾¾ÞÁâgáxS,lnÎO~~vŽ:â°.Û“d»·l“í·Û6güôik[í€Îp ó½8gnÎøÉ/ò¥Ï*½{÷ê²÷£(ŠÌ›¿ ß;ýÇùúW¾˜Æ†z0Á€N5}ÆÌœyöùùÒ>Þ½zu‹ûôÂìó“ŸŸ/}þÓéÕ«ÉA€Jp Ó<òèã¹öÊg>ùÑn÷d£Í‹翾úí|åKŸÉàAƒlèwÖºjQä™gžÍU×\›Oò£©éf±ý,_±"_ûÖiùÄ)ʈÃxèawÖº[oûs¦Í˜™wLjjº÷óu·´´ä[ßûANz÷ñ·þXzÁ€µêŠ«®IŸ>½³ï>{u»ËÈü#+V®ÌåW\©S6ÉvÛníA=D XªÕjÎ9ÿâ <(û½mïÛ“¤oŸ>9þ˜£rϽ÷徿üÕƒzg¸PºöŽŽ|óÛßÏ;<,“6œØ£bûÿÖÑÑ‘+®º&½ûôÎû½­Çî=…à@©Š¢È7¿sz;ôÀl¼Ñä¿Gµ(òß¿».IrÈAo÷€nLp 4-­­ùÚ7OËÉï9>Æ3ÈÿrÃM·dÑ¢Å9âðCSãLwè–wJ±tÙòœöƒç}'±ë1Èÿ£HrÝ®OKKK:`¿444ºOš À¶pas¾ñ­ïåã§|Hlÿ*IÞ¾ß>?~ýüøg¿Èš5kŒÝíëg¸ðF<7mz®¿ñæ~èÁ6l¨A^ƒÇŸ|*7ÞtKÞ}ü±éß¿ŸA ›p†;¯ÛsÓ¦ç²Ë¯Ì»Ž=ZlÿLÙx£zð9í‡?ɲåË Ý„3Üx]~ô±üéú›rʇ?ÆF×#=–/_‘ÿüÊ7sê?“úº8Á€ÙÝ÷ÞŸûÿò×|ð}ïI]]AÞ€%K—æ‹§~#_ý¯ÏeÐÀ€.Lpà5+Š"7Þ|k,lÎÑGžJÅ&ehmkËW¾þ¼ï¤wgÂøõ ]”k¸ðš´wtäλîÉìÙsrÌQb{™šó•/}.ç]xIfÌœe袜áÀ?U­Vóëß\•d¿}öJEm_+Ú;:òãŸþ"{ì¶K¶Ø|Sƒ@#¸ðjooÏy\’M§NÉo}‹AÖ²Õ«×äªßþ.C† ÎÞ{îfèBwþ¡¶¶¶|ÿŒŸåàöÍÔ)›¤“E‘+®º&õõõ9ä ·ºÁ€¿«¥¥5_ûÖiùðNʘѣ ÒÉŠ¢Èm·ß‘g§Íȉ'›ÚO»ë:_½ð*m«Wçó_úZNùðÉÝ:¶E‘jµÈ?úÞsQ©¾Iß—®T*Ùm׳ùfSsæYçÅwÇ`Ý'¸ð ‹-Îçþó«ùâg?‘‘#FtëûzÇ]÷äï:9÷Ýÿ׿ûòÛþ|gŽ?ñƒYØÜü¦ÝÆ·l³UvÞé­ùá~–ööPX‡ î¼lÞüùîé?Η¿ø™ 2¸Ûßß1£GåØ£Þ‘Q£þþ7ÚÚÚ2}ƬÕê›z;7ßtjvßuçüü¬sÓÒÒâ ë¨:$ÓgÌÌùý2§~ñÓillì´÷»rÕª<ÿüì¼0ûÅŒ¿~Æ]/õõõYØÜœU«Z2bÄð464$I–-_‘%K–dÈàÁéÓ§w–¯X‘'Ÿz&«Vµd³M§dÐÀ©T*Y²tY–-[–‘#†gÉÒ¥iiiÍàAƒ²xÉ’ :4K—-K}}}†’m¶Þ2ƒ J’T«Õ<ÿÂìL›>3›o6åU¡½Z­fþ‚…yú™çÒ·Oïl¼ñäôîÕ«SvÚr‹Í2xð |í›ßÍg?ý‰ôëÛ׃Ö1µ§žzê©fèÙ~ä±Üq×ÝùÀÉ'¦W'ä$yüɧò™ÏšŸŸsqî¸ç¾\òË+óäSOe÷]wÊm·ß™“?ôÉ :(›NÝ$Iò©Ï)?ÿÅ9`ÿ}2wî¼¼ïCÏ­¾3÷?ð`.¼ä² 68“7Ü 7Üts>pʧS[[ɇ?ö…Œ94Í‹—ää}2Ï<óL¾þ32iƒñ™¿`AŽ{Ï)Ùz‹M3~ÜØ\ó»ßç#ÿ|®¿ñÖüòò«³dɢ̛¿0ÇõŽôéÓ'ç]xiþãs_É /¼ /½"·Þz[öÙ{4uÒ7( èŸ7šœó.¸$“'m˜>½{{ðÀ:Ä%ez¸»î¹/wÝsoN8îèôéÓ§ÓÞoµZÍ%—þ:Óg½sÏü~n¿áš|úãÌ}y8¿ýïë²Û®;§¦¦&·Ýöç´wt¤yÑâüåG²Ñä‰3zT¾÷ƒŸ¦¦¦’‹Îùi®üÕùÙ|³Mrñ%—¥­­-•J%½šsåo¯Íùg~?ûï·o*•Jš²lÙòœùãïd×wHQ$½šR©$Õ¢È~|vƯ?:W]v^~÷› Ó¶ºýåÛ;oÞüüüì ³óÛäÜ3ÏÈå—œ•9óäêß^Û©ÇkÌèQ9ù¤ò“ŸŸ•çÌñ€uˆàÐCE‘o¾5Ï=7-'¿ç„Ô××wúûÿóÝÉä &fê&§’dÛm¶J]]m~ÿÇÒ¿_ß~ÈþyáÅyY¶lYyôÑ´·wä½ïyW’äîûLkÛê|çû?Ê¿üÍÌz~v6/É¢ÅK^~ûÇsdÞ²íÖ>|èËïwß}öÈöoÙ&ôÿ_·¦’Å‹§yñÒlµùÔŒ=*Æ ÍN;l÷òkL›>#uµµyvú¬|é«ßÊ?9+kÖt䊫þ»ÓÝ óÉþ[Î9ÿ’<ÿÂlfXG¸†;@TE®¸ú¿ÓØPŸc9*5•Jç߆$-­mil¬OòÒû¯««K%IÛßžô÷Ëo¸%³gÏÉO<±ëʦS7IQ)Šd`ÿ~9òðƒÓ«©)IR©T2hàÀ$/±¾íÖ[¼êýNœ8á5߯¿w©˜IÇçø£HQyÏ G§R©Iñò=è<ÿ{÷E¹¶qüšÙ’B€„Ð ¡&ª"RDÄ(EŠ( DôØ@lVDä=XP) Š Ò«B'½g“Ý÷C4Žž£b€„ü_ 3³3³÷3ÙÙ¹òÌ3AAšpÿh=6ói ¾ë6Õü ï \ôp€2Æëµôî⥪T1\=ºu¹$a»$2Ô¼I}íÙwHg%I{÷ÛãQ›«ZK’ªÆD«\P€Þ]ü¾þõñçjݲ™ü|}e†Õ¯£Ü¼<ÅDG«nÚJOÏTZZºl¶_Om†ñÛÓœiþÞ©ÏRHH9™¦M{ü¤üü¹\ùÚüíwEKTލ,¯e)++SuëÔVåÊ•”œ’*Ã0d\¢¶ôõõÑ#?¤_¬Õwßoåà€b°aÃíܹ“B༸£LÙ½{·¾ùæ 2«  @ï/ûHÃÃÕîªÖ2 ã’í‹ÍfêηÈkyuëC5ú‰š2ý)EGEhð$I!åÊ©åÍôåúÍJLJU—.×íóc†+)9MÝn ;†ŒÔð1içî=…CãX…X(ìG_Ȳ$¯å-üϯSåõZ²$Ùl6 |«þtD7ö½]ýo¿[™òþ¼|õ˜ªêݳ‹¶mß«ÁÃÆ¨ïmC4ù‘™çü—‚ÓéÐÈaC´yË÷úqûNYç¼?À_5uêT-^¼˜Bà¼Ø¦M›62 4p¹\Úµk—’’’(Ó4• Ç#y½^%$$ÈëõÊét*55U›6mRpp°|||”™™©¹sçêäÉ“ªQ£†‚ƒƒ•——§Ã‡Ëf³ÉétÊ0 ©õë×+??ŸA©³áëMêÞµ aûå~R7Muëz½>¬“§NSø/,ËÒþýû®!C†hþüùêÙ³gÑ|Ç£'žxBóæÍÓÁƒ•ššª*UªhöìÙ3fŒz÷î­Í›7ËãñÈ4MÅÇÇëÇTLLŒÖ¬Y£.]ºhĈ2MS7n¤àecc@n·ÒRÓäñxJæRXùòš3gŽÞ|óM5J6›M .Ttt´êׯ¯hÞ¼yêÔ©“Õ§OÅÇÇköìÙJHHÐСCÕ¿ÿ¢±Ýn·öîÝ+Ã0ôé§ŸÊn·«wïÞJJJ’$Õ¨QC>>>ŠU•*U¨ÀÀ@åäd+''G™™™…;”6›©›¾ÑÓ&PŒ2¢_ï›4oþ›tç@Š¿{n´iàÀ:{ö¬ž}öYÅÇÇkÈ!©víÚiÇŽª]»vÑúzõꥠ  ¹\.}÷Ýwª]»¶ ÃPƒ ”˜˜¨ÓgÎüûcEüÅß×rÜe (5Ü˸””T=ñÌ,EGE©yÓÆ2Í’wÓƒa2 SYYYzôÑG•››«.]ºhóæÍêÞ½»Ú¶m«yóæi÷îÝš3gŽ$éÈ‘#êÑ£‡ÆŒ£wß}W«W¯VïÞ½eš¦ÒÒÒd†Ú´i£o¿ýV&LPjjª’““.IÊÎÎ>ç Þ¯ãnÊw{tôhcq¢Ô°¼Ò,c¼^K™Y:|ä(ŸUð;|||”šš¢®]»jĈzæ™g4oÞ<ÝyçEß? ?O ÃvIzùå—Õ´iS?^S¦L9g^Ñŕݮk®¹F111ºóÎ;µcÇ…„†êp|‚ø8þ:·Û­>\.C–žxìùúúP@‰Gà^Æýãáéš:y‚¢"«”èýÌÌÌÔ /¼ S§N)**J¡¡¡jß¾½$©oß¾š={¶®»î:•+WN’tèÐ!3FÝ»w×—_~©3fÈßß_ݺuÓ¨Q£dš¦úõë§M›6©W¯^Ú»w¯&Ož¬zõêÉívëÌ™3’ o7NIIQ~~¾,ËRZZšÊªM«–<(UrssuðÐaÅÖ­M1Ê€ÕkÖièÝw©zµŠÿÅúõëÕ¡C 2D;vìЄ d³Ù”——'·Û]ô]0//O’Ô²eK½ð òz½êÞ½»úöí« Ȳ¬¢àÝf³é†nÐ#<¢Í›7kíÚµZºt©Ú´º‚‚ç©ÝU­µ{Ï^MŸù”2Q1 dã¡©eØ7[¾WRR’ztëR*öײ,:uJ¹¹¹ª^½ºLÓ”eY:sæŒ:tè 9sæ¨sçÎEËgeeéøñ㊈ˆ( â%)--M6›MAAA’¤Ó§OËÏϯh™ììl¹Ýn•+WN.—K.—KAAAr»ÝÊÉÉQPPP‰¼ø_rsóôìó/iÈ]Q¹ùG?lýQqõbPj߇eYújý×:~ò”ÞÚ†€?àr¹tèÐ!EFF*$$D’”žž.‡Ã!œóýïØ±cŠŒŒ”iÞ}i³ÙŠÆq÷÷÷?gÝPõêÕ(&/¼^¯Wó^[±uj«}Û62MÂv.w(cœN‡†Üu»öî? ¯6l,ñûëõZ:špL›¾Ù¢ûF “¯¯¯Þ~g‘Ž×ÆÕëóeïêpü-zo‰¼^¯>þäSÕ©]C _Iï¿÷†öî߯½ûÊ’¥ƒ‡âåµ lWøPäTeffmËãõè­Wç¨jT„^xv†ZµlQ¢kSPP ÇŸ|VWµ¾R­y˜3—;”Av»]·¸Egõñ§ŸË[ÂçaÈP¯»«~½ºòx¼Z¿ñ[ èßW–eÉ0 uïÚYûþ$·Ç£ à ­üâK%§¤ÊôÐøû[§Ö_ؘqî¿%Tn^žž™ý’ÜÒGõãb9¨(ì”Ê&Ó4Õ»WOmøz“½·Dú÷•iš%t_ EEFJ’,Ë«„ã§ôÜœWXô^*”•,K}ûôRŊạϪ]E¯í ;ï¸í²j;—+_3ž|VC‡Ü©ªÑQÌ”îP†™†¡í®ÒªÕkõáÇŸªç Ýd³ÙJä¾Z??âÔ0 EEVÖ˜{ïVë+;ŒŠÓéÔ Ý»ê†î]µwß=8išjת©ÆÊ0 yÜžŸ×'íÝH®n_ªÚ,99E/½úºF ¬È*Ä” )Ðõ×vRTdÍÿ†ò Jô¾ÚívµnÙLÛ¶mWFf¦òòò´ì£O´hñûr¹\;~’¶nÛ.—Ë¥˜ªÑªW·¶ ÜnÙm6Õ©YM?ÅQNn®Ö¬ùJ'OŸùí‰Ñ4dY–222TPÂj‘˜”¤>3[#‡!l ¢‡;@’ÔòŠæòõõÕœ^Ñè‘ÃäããS2v̇ Ž©nš¦†Ý3XS¦ÍÔà{F«RÅ 2mv=þè$ùøøèž!whÒÔЉ®"·Û£ÐµoÛF†aè–¾7é‘éÿT…°5¨§«Ûµ–a®Ùn·Ë¡ À@ ¸¥ñ´†¾]×_wM‰(þýõéç+5yâx• 怠2,«„?)ÌWë7)0Ð_Í›5¡Š;~B¯¾ö¦&<0¦D»–eÉårÉÇÇGÆ<È4==C6›M¿y]rrŠ||}pî¼¼<—¼^¯üýýäråËf³Én·)Ïå’Ó)Ã(ìáž—ç’Ýn“Ãá¸ä5Øà >ùl¥FÜ3Xþ¤ Ì™ÿÆÛêÕ³‡*„…Q @‰Æ2€sDGEjØ=ƒ5wþ[JJN¹äûc†|}}¶KR¹rÁ¿¶KRXXùß„í’äëë#?I’Sv{á˜õ¾ÿè†!??ß¶oß¹KŸ¯\­ûG l „#püFtd:X>þ”Ò32(È%`Y–~Øö£6|½Y#GÜSbf ~Eàø]ÁAšùØÃzú¹uüø rY–¥U_¬Õ¾ý5rÄ=rØyä ¥;à¿ ÔÔIã5çåùŠ?r”‚\nGk×}¥Ì¬,ÝÖ¿¯ J@©AàøŸœN§ž||ª–}´\?nß)žµ}áx<}ôñ§rå¨ÏÍ=)¥ ;àO¦©1#‡éË µcçn rx<½òêëªS»–ºv¾–‚P ¸þ»Ý®1÷Õáø#úhùg¤èɧg«c‡¶jØ N†Á@2”Fî€?Ò0MÝtcwÙMS|ø Ã˃¬ìl=òø?uÇÀþjP?Ž‚PЏþÃ0Ô½[EFTÖKs_“×ë¥(ç)/Ï¥G¦?©±£†+:*’‚PʸÎË•-[¨SÇvzeÞër»Ý%»a IDATä/JKÏДGgêá‰ãT1¼à2@à8/†a(®^¬Ú¶i­^žGèþœ7Ëá°s€p#p;§ž8^KÞÿP;wï)“5ðz½Z°ð=• Uï^=eš—9wÀáëë£ñ÷ÒšuëõýÛÊÔ{·,Kï-ù@11UÕîªÖ2 ÂvÊwÀc†î5\»öìÓÆMßÈëõ^öïÙåÊ×Ës_SÝ:µÕ±}[ÊwÀeHºã¶[t$á˜Ö~¹^–e]¶ïÕår饹ótU›VjѬ @Cà¸ð'ÓÔ€[úÈÇé£ ß»,ßczz†f<ù¬nés³š4nH£P¸. Ã0Ô®mkÕªYCs_{Sn·û²yoIIÉzéÕ×4|è`EFV¡±(£ÜÕUmZ©óµ4íñ§”_PPêßOJjšò99\U"*ÓÀ”a®zµ ¾ó6=ùôl”âÐýø‰SšýÂ\=>m’üiXÊ8wÀ%Q£zaèþð´™ÊÉÉ-uûÿÓáx½øÊ|MþÇ  A;àÒ‰Š¬¢ûÇŒÐ̧g))9¹Ôì÷Ž»õá'ŸiÆ£“åãtÒ@;à«\©¢|`´žzvŽNŸ9[¢÷Õ²,mýq‡¾Ü°QcGÍf£@wÀ%¤ÉÓÇË?ÓŽ]»Kì~~¼üs:uZ÷"›É)œ‹´P"”+¬Ûô׫×iϾý%jß,IË>Z.Ëòª[—ëd·Ó³ü; ÄðóóÕ}£FhíºõÚòÝ%bŸ<^xéUEDTVϺË0  ü.w@‰b·Û4bè`mß¹Kë¿Þ$˲.Ù¾X–¥—罡ömÛ¨UË„íà"p”86›M÷ ¾SIÉ)úôó•—$t/p»õô¬tÍÕíÕ¤qCü!w@‰usÏÊËsiÝWTàv_´íffeé幯©[çk[—† ; DëÝëFY–¥÷¿/ÇsÁ·—‘™©ÇŸxZ½{ݨõãhð§¸J4Ã0tÍÕÔ A=½<÷5\°má„¢££þ—dêàü•+$ÿ åää\°m¸ࢳ¼^…„ÿéå7müZ/¿ø‚ò].Šàü®C,É××W–èá€ËŒÓéøÓߊ‰×+/¿,×Ká”Xî(1,ËRrR’rrrdYÖYÆ«ŒôôßÌ·,KÙYYÊËË=gžeYòz½²,K–׫üüü¢é¹99JNJ’Çã¡øþ6w@©ñî»ïjݺuÿs™híÚµÚ¹s§néÓKQQn|h˲´lÙ2­_¿žB—Ⱦ½{Ôû¦T'&\Ñá3r¸ÒRS‹ow:úáûïte‹æjÔ¨‘úpÑØ‹'OœÐÈáCU­ZmU«VK?:Uyyy2 éÕW^R»6Wê½wßQíZµôѲ”““£Çª¨ŠQª®ë;uÐÞ=»i ; Ô˜5k–6mÚô_ç{<½õÖ[zÿý÷eY–7n¤ðð zý‹/ÖÖ­[%I .Ô²eË(:p‘X–¥E ß‘Í4u<)GûžUtT”V­ü¼¨·ºÓéÐKkîü×4èŽÛ´âóÏX¦)-^ô®üµjÕr-ý¿wõéòOõÃw[d’Íf“,K ¼­G¦>¬†šèÅçgiù'ËõÉÊt<)G 4Єq÷ËË5þw@‰eY–’““õì³Ï*##ãœy.—Kk×®Õ[o½¥œœ¹Ýn½òÊ+Ú°aƒ ”––¦ŒŒ -]ºTÏ<óŒ8 ˲¯§Ÿ~ZÙÙÙ’¤5kÖèí·ß–ñsZÓ4µbÅ -^¼XŸ|òÉö¨P|»N:¥Ç¦MÑþ½{5|Ô}êÓ¯ÿ/Üåråkؽ£Ô¬Ysõ¹åV9}´ìIÒˆQ£5zìÊÈÈPBB‚l6S_}µîœÏ“{GÖƒ«f­ZúéÐIRjJª6müZ¾~~:z$AÇ£!œ7w@‰¯îÝ»Ë0 -X°àœ1™ ¤—_~Y§OŸV»vítæÌ5iÒD¦iªiÓ¦ ÕC=¤yóæ)..NC‡Õ™3g”––¦ ÈívK*‚æ—^íRa(¥¬¬,Õ®]ûOIàï1 C#ÇŒÕà»ïÖ—ë¾Ô¨‘#ÔëÆîúô“$&în·bbªI’BBBå°Û•Ÿ_ Gzâ±iêuCmÛúƒN:)Ã0t,áè//•$5kq…,KòxÜ*((i:q⸎%U\ý7a¼ìv;à¼qEQ†y-¯,Y@‰uôèQEGGkèС²Ùlzë­·$ñ›7oÖ«¯¾ªråÊiéÒ¥Úºu«®¿þzªqãÆjРzè!¥¤¤(==]’tìØ19™æ¯o6 £¨w»T¸×©SGÁÁÁŠUíÚµià"°,KG=n¸Iƒ† Õþ}{u×íõÅÊÏu}—nú·_ZIRn^®}Z>>>2MS‡£hzJJŠüýýµmÛ6………éÞ{ïUppð9=à=æÌ™#¯×«ªU«þüðDC–eÉ0Œ¢qšwíÚuÎÏ. ¯×«iORNNŽÆŽ› ];wÊív+¶^}9Îß,ŸïrýÞV« Ã4uèÐ!Íõ}¹v¢¢"uêÔimýaÛ9T“$»Ý¦þ·Ý¡·ïЃãï×õ»èí7ßP½¸zš5çeÀycH™²Ì¢w;€’-..N :qℾÿþû¢@½I“&ÊËËSTT”n¼ñFy<ùøøœóÚÔÔT}ýõ×êÕ«—6l(Iúé§Ÿ.§Ó©E‹iÇŽÚ´i“\.WÑ3Ra¯÷€€={V‡†.›Í¦)ÓSë6WiÚ”Iú×ûKôÐÄI2t˜ ÃÝfSD¥ŠE=Ö ÃPùò¡r: ô×ìç_PLL5íÞ¹S?ñ”þùÌ,u¼º“N:)‡Ã¡°°òE¯µ,©CÇ«õϧŸ‘Ãn׿Þ_¢þ·Þ¦iÓgžs üUôp”X5kÖÔ AƒÔ¾}{Mš4IÉÉÉr»Ý²ÙlZ²d‰-Z¤{ï½W3fÌP³fÍäõz•““#˲¨®]»jüøñzî¹ç4eÊÍ›7OíÛ·×Ýwß­_|QÇŽSÏž=/IÊËË“Çã‘Ãáн÷Þ«1cÆ(99Y“&M¢1€‹ rD„†Ý;RÃFŽ”å-=æ—þýn [ Ð/7£ÄÕ¯¯O>_)Iòz¥6mÛêªvmeY¿¾fúŒEÿ4dˆþýFÃ0ÔñêNººS'y<–LÓ /€¿Í°,.-ʪe.Wd•ÊjÙ²ÅP¢ý2 Lqr»Ý<¸„Ün·Þ\´L}úö%èü¡… ÞV×î=F1çÍ0¤×çÏÓ°ÁxA¶Á=³€RpB4Š}„í ¸¸P Ü(î€ËÖÔiëÇ·SpQ¸.[nG<\,îwŠ;Å€À€b@à@1 p ¸P ì””4III:qâ„ I))©Ú¿oŸƒåñxÔ¨QcÙl6Š(qÜ@‰“¥)“'« À-Ó4µbÅ IRåˆÊzó­·dYÔPò0¤ (q"#£!»Ý&Ó4d³Ùd·Ûuã 7R@‰EàJ‡Ã®k¯ï,¯×[4ÍÇ×Oš4¦w; Ä"p%ŽeI]ºtU``@Ñ´À?U®Aq%;(‘|||Ô¸q£¢Ÿccë) ÀŸÂJ,wP"Ùív]ÑòJy<y½^õîÛ‡ád%;(±:t¼Z…‡WP•ˆ*P¢Ù)(©œN§úô¾Y'Ž—¯/”hî€ËŠ×ëUA[†!y<åÈåÊ— ÉépÈ0 ŠPÊ4mÖLá+Ên·1¤  D#p\VNž:­é3ž’ÝnÓÁCGtüÄ)•+¬ò¡!šü òó£W(ii©úpÙ¿”šœtžk0Tà.ÃÎ¥ùÉÊÊ–ËåÒÞ];(Æp{¼²ÛÎoaË’¢cª©UëÖŠŽ®J1àN§êÖ®¡‡&< ??_¥¤¦jòÔÇu4á„Â+„ªc‡v|_\6èá^U¨¦Æ ë˲$¯×Ò•-›Ëy o‡€ !0 @M›4T§«ÛS Pjè•W_×±“g4~ì 4P«Ö¬/šŸ››«<<]gÎ&kò?î×Ó'+)%M3žxV)))jP?V{öP~~¾vîÜ­3‰ÉÚ½÷ ÒRÓ”Ÿ_ /×oRPP°üü}uàðQ­]¿Y5jTרCtà§£zýÍwäÊÏÿÍ~½»x©V­Ù ~½oÔ¬§SÓÆ õöÂ%ÚôÍåh܃Sôõ7Û4üž»t×íýµæ«Í:š IzvöKÚ±kŸnë³&<0Zk¿\/›xpy ‡{uSÏîZ·a³\ùjÝêJ \Dyy.?qB.—ë¼×a¨ðaüï•/ª¤Ä$íÞ³—‚üA­ô7Ž)Ó0T¾|y…‡‡Ÿ3døûÜn·¾ß¶[ýzuS‡öm%I=º\£w/“$íÞ»_ÇNœÒ ]:©UË+$Iû÷Öss^UbR²Z4k¬•«¿RžË¥#GÔ·Ww}÷Ãvmúö{µlá•ÇëÕ=º 1[»†ºv¹N>N§,ZªÔ”Tefdþf¿^ž÷Žb¢+ëºk;)4$Dw ì¯?ûB_mؤí®Ò‚7^Öñã'”“­3gÎÊ0 mÜ´E5kÔÐÛwÉ×שn]¯WhHˆôï«i?Mc. îeTƒ¸XU SùÐPÕ¨CA€‹äìÙD=ùìóêzýµŠ«W÷¼/ºöìÙ«FRÐ?pýµ(Ÿ””,»Ý¦óz}JjšÞ_ö±NŸ>­‰Ž“¿¿E ˜¤¥¥Ë4M…‡‡N0 …•=çû¥!C‘Q‘EÓ~Y6++[111r¹\:~ü„¶üð£úÝ|ƒªU«¦¹¯-PdD%ù8jÔ NnW’\ô@ØŽmÛè½¥ËäÊ?·£HNN®l¦¡à øûK’L›)?_<}Fn?QûöRÍêUeY^y<†!¯×+˲d3Í¢×Ö®Y]žŸ·@iGà^Fùûû«Y“jÞ¼ Å.·Û­—潩Ç™$ÿŸ/.·ÇãQbb¢"«DPT ‡Ã.»Í®òÿvñþWDV‰PÃúõ”pì¸^{sÆŒFQ(&¡åCåµ,í;ð“,Ë’!éäé3眇-ËRüáxy½^™¦©}û¾6¤œ¢¢¢ät:ôæ‚EÚ½÷ š4i,_=:ãY}´|…7¬'§Ó)÷ÏV•ñëÝjûýô_®'ýdIJMÏPVv¶Ê;r¹ò••“£ØÚµ” ]{ö«Qƒ8Í~f†:¬!ÃÇJ²äpØeš¦ÜnRSÓU©R¸6nÞ"‡1Ü—I+« ošjueKÕ©U‹bÉ™³‰êÞ¹Óß Û%Ýî ›b:¤ªFGÉãñ(-=ƒšPLì6›®n×R›¾Ýª¥|¨w/Ñâ>-šß°A}]Ѽ‘6mÙ¦÷ÿõ‘>üx¹,z_•+†©bÅŠr:jݪ…6»UaåCY%B~þ~ªY£ª¾ýn›jT¯*‡Ãñ»Ûv¹òÿë~MýÇXMLÕ¬ç_Ñú õà¤G%Kêtu;ùùûËéphÛö]údùçšñÔ,É0´â‹u:špL×\Ý^y®|½³è=}úùJ-]¶\¦I<¸LÎÝ%ig¼^¯vîÜ£å+VÉë.8¿ÌÀ²tòÔiz~þÉZmÙò ƒñvÿW~¾ Ü 8¿ÔUP š5jªCÛÖªV­*_$˰ßlQ«+š—ÚýÏÉÉQVv¶ŠnÿþS… ”­rÁ€â¸h·Ûu÷ ;ät¼§_¬UøX=ñèCúׇËe·Ûeš†¦O¨×Þx[ë7lRž+_=:_­!ƒîP``€$©× Ý”žš¦«Ú´’$ùúø¨uËæ P›Ö­d†l¦©–MªbxxѶ£"#$¯G6›]N§SÄ­³{·ÎÊÌÊÖwßoÕÛ «ZÕ*v÷jÔ ¾$éÖ~7éÛï¶jË÷[5nÌåæåiåÊ/”pLÃï¹Kùù.íÙ{PYYÙšüàX½½`ÃÒ.swIÙ˲´pÑÿ)¢J„ÆÝw¯çy®Ç«õ¾V‡öíi]‹ŒŒtegç("âüþˆãµ¼*È/ÐûË>Rn^žêÇÅRÔ2*==C¾¾¾¥vÿ·mÛ®i3ŸÕcF¨kçkhP€‹¤~\¬fLŸ"·Û-§ÓG^¯GÛ·“ÓYØ3½B…0=8þ~¸ dy-9Žs:ú´hÞT5”ÍV8l‹išvÏ y½…C¼HR``€^˜ýÔ9²ÆŽ&ïÏë«^AÏ==SöŸ‡~±ÙlºíÖ¾êÛû&y½^Ùí6Ùí¿F ƒïº]·ÝÚO6›]v»M–¤–-šÉ0L™¦¡ñ÷VAAŽÂ}mÖ¤‘l6:'J¿¸ççȲ¤ë:uü[ë±,C¦ir¢F±1m¶¿uLÙdÊa·ë¶[ûé±ÿTlÝ‹¾è¥‰×ò*++[‡b\ì‹w»½(Ð6M»ìÿq5ošFÑÃNsMcšòñ9wÞ#cÆÿ\æ÷æK* ýϯ¯—ι²Ùlçüü{ë Tž³KÊŽìÚ³WÆÑ"¸lÙLS±uëêØ±ªV­*Áuæl¢>üøSÕ©]SþþZµzÂÊ—× =º(*²Š’SRµdé2µ»ª•Î$&êÌ™³п¯’SRôõ×›õí÷?*¤\Zµl®VW¶<çBÊ•Ÿ¯U«×jãæ-ªW·Žnº±›|}}åµ,íÙ»Oë¾Ü „ã'ծ͕º¦S†ŸeF‰ Ü÷î; «;´-µ…Üà /ýP×_ÛQ­¯¼‚# ¿ÿ ç°ví.°¬¬,½·d™,ËR\lmøë‹µëõñç«ôÉïÊôÖ»KôéÊÕ2 CMÅÉ•Ÿ¯!ÃïSFF–Z6o¬'OjâÔ•ºöê«4mÊDI…½£æÎ{S-š7RRb²Ö¬ûZ‡ÇëáŒÓƒ‡4jìD5m§Úµkéù—æëÓÏWéÕ—fÑ  L(Qc¸—f9ÙÙZ±j0>7€ÃišõôL9õ€¶ïÚ§C‡«bÅ ’¤Ô´L}ú¯…ò÷÷ÓÊ/Öê䩳|G ½û.yÜnÝÜÿ.mù~»“’Š>«[^ÑL=2QYÙٺ펡Z½f½7F/Ï}C~¾N=8î>ET®¤àÀ@Í{ãŽ?¢Õ«Ñà²g/‹o:??_'OQppüuøð9U¯VM¦iÈåréä©Ó ‘ÓéTRRŠk‹!N IDATªFGJ’RSÓtìø 9EGG*0  h½¿<[&+;[ñGŽ*¬|yU‰¨\4ß’DiiéªZ5JÂÂ8\~~~r:ìªS§¦|} ÇάS·Ž¶ïÚ¯3gÏîýûÞ r’¤“'OÈòZjP?N¦aÈt8tMÇvúàÃåÊwå~ŽY–®hÞT¦i*8(H>>Nedf+--]?lÛ!˲ԺÓMÊv¹U>ÈWþ¾>ÊÈÈ A@™P&÷Ĥ$Ý=ü>U¯#Ó4µc×^’në³F¿[®ü|õp ì£Åï¬ð°-[ºPŸ­X¥'žž#·Ç+›i*88P3§OV“F ^³¡ÃñGÔ»ÿ ¥¤¦ËßÏWÏ<9MW4oªÜ¼<=üÈcÚòý…•QZZ†¦M™ ŽíÛr(v»]¦iêìÙÄ¢i™’qîïjT‹ùõ5‡ ÃPfVVÑ´# Çdÿy]¿på†ïùòx<2 Cþ U^nžV,{^+†Ëøù¯þ~¾4(Ì2ûÎ C»÷ì×í·öÕ‡KÞV­Uõæ;Ktüä)™¦)Ã-ùP·ÞÒK3¦OÑC?é±'f©zÕ(-û¿·ôúÜÙÊÊÊÖ´éÿTJjÚ/«Ôêµëõê Ïè­y³e·ÛôÐäé’¤Eÿ÷¾¾ýn»ž˜>Y‹ß™¯Íjêô§”––ÎQà‚9u:QÛwìÒ©Óg´s×Y–õ_‡wiذ¡dHü©ÒÓÓµwßmùþGEGF($$¤ð¤ašúøÓJNNÑž=û”šž© áa ð÷×­}{)7Ï¥³‰‰²Ûlzvö zíJÏȤ!€R*>>^Ï?ÿ·+7ץ𠡚üäïï'I*p»Õ©ÃUêsÛÝÊÈÈT€¿Ÿ¦N'Iº¡{g­ûjƒÆN˜ªàà åääêŸOVÅð 4PJeggëÃ?Ô€(ü e2p÷óóS€¿ŸÂ+†M ’$å¹\EÓÚµ¹²èÿî‚Y–¥r劦լQM›¾ù^·§hZ¥Ÿ×i˜…¡¾$åå¹”þKÏ0ÃÍnWý¸XÕ‹UP€?G!€ &2²Š^õÚ½{¯ÂÂÂ%I Ô{ ^UùÐÐs–ïß÷fuhw•Ž=¦  @U‹©ª€Ÿ?§6h EoÍUTdõ¼¡»âã*&&º(P ÔÜ—féðáx¥§g*6¶¶üùŒJ‹Ã‡kïÞ½??§&ZõêÕûù«‹!¯×«¯¾úJAAAjܸ±l6›Nž<©ƒ*??_uëÖUÕªU•––¦7*66VIIIºâŠ+”˜˜¨}ûöÉßß_ 6”¯/ÃL¸|ÙËò›ß¹kŸò\.9þé'Y–¥*EóyР$•« Ó4´cç.]Ý¡­¼^¯V¯[/?_ùùû+++K†aèÛï~P¯žÝ•­ìœ\¦©Ðµo×F«V©k:uTýz±JMK“!C….(§SÍš6>gšÃáP­šÕwùˆÊ•Q¹Òo¦‡„”+zÀª¯¯*„•ÿÍ2¦a¨VÍ(erss5qâDEDD(""BK–,Ñc=&©°—û3Ï<#Ã0´jÕ*½ÿþûЉ‰ÑèÑ£¦ˆˆÍœ9S«W¯VZZšzè!5iÒD­ZµRll¬:wî¬ë®»NgÏžÕñãÇõÅ_œó\¸œ”éÀÝf35îÁ‡U>4DßmÝ©  @5¨_Oyyy¿Y¶}»6 .¬>Y©ììl¥¤¦éäÉ3êØ¾µ"«D(ñìYIÒ¶wꉧžÓ™Ógtòt¢ºwé$__ ¼µ¯¾X³^ÏÍzQqq±ZñÅ—ªV^ï¼ñ G!€âg ô—Óé þÄG†!§Ó©¼¼<]yå•:t¨‚‚‚”œœ,Ã04vìXU®\Yk×®Õ|  &hÖ¬YÊËËÓ¾}û´páBíÛ·O²,KwÝu—:uê¤Ï?ÿ\999êÖ­›ÒÒÒ4}út?~\U«V¥è.Ke:poܨ¾ôë¥ÏV­Qÿ>=ÕóÆî²Ûl²ÙlºãÖÞŠŽŠ*ZÖ×ÇG‹¼ª•«ÖèÛï¶),,TL§ŽÚÉ0 —Sÿ>=uݵWkßþJNMרáƒÔ£[IRLÕh½8û ­ß°IñG4~ìµ¾²¥;G!€b^!LKß{‹BøS|}}õè£jåÊ•š8q¢ ÃÐÒ¥K%Iþþþr:²Ùlòññ‘Ûí–ÛíÖƒ>¨jÕª©Zµj²Ûír»Ý’$¯×«êÕ«Ë4MÅÇÇËáp(77WN§S3gΤØ.ke:íµÛíºªM+]Õ¦Õ9Óý|}5fÔ°ß,_>4T·ÞÒG·ÞÒç7ójÖ¬®Ñ#‡J’bëÖÖM7v?g¾ajX?N ëÇqÔ€%==][¶lQ×®]Õ¹sg 2DGUppð9˹~~ÖÍêÕ«µmÛ6MžÉ.ó÷Ý•í×ÅO¥é®i{•]8âóëËж=¾¾^¿þéÑðK·E>Kw¼›¥ÕÛ‹ylcšWížËÐó õÚ"Mþ­@õÆe(¿èàÄ!m¯Ow¿‘¡«^ØÍF •@¥ìá¢çž+Ófc •žÓéÔwÞ©ììlùý~EEEÉ0 Õ®]['N, Éßxã 9…„„è­·Þ’ÇãQXX˜êÖ­«+¯¼Rv»]Ó¦M+y¾iš0`€úõë'¿ßOØĶ Ÿ¢‚ M§`—Q©kQÕ.=ri¤$©ÐпòœÔªNMVEç<¶Kvû”ËвP‘Uʽ¼ÝnWJJ2­°aŠˆˆ8è>§Ó)§sÿeù‘‘‘‡}Ìårö9 ¦ÀpŒ,I+Öjê/ùš½Ý§©õ;#D5«ïƒMCújn®Þ˜_¨¶I6]Ú>T)U’¤Ek ôñ‚ý´Õ¯«;Õ³M°â£Ê÷Xznz–º7vë_óôÈeQòÒdzsôÊBª‡™êÓÌ­‹Û‡Ê' î© ê¦ØðâdΊ|ýßòBÍÞê×u§9u~›ÅF?¶f‡WŸþš«¹Û}º¾m"\ÿÒ>tfüË¥ô¦!U7åós½=Tt @9åõYñ^–ÎjìÖìÛâÔ¦ž[÷ºØ”ÏÖis¦_¯‹–ì¦îù8K’”[ÐèOrÔ­i¦ß£ÝKÿû²øuþ€¥·êÙorÔ¹qìC?Û«ïVzôCcôÄ呚:+OoÏÊ9ì:ü–Â\†ŒÃäí»süj4n·ì†4þªHM_´¿Ç·%©ï¤ ¥gøôþ€(]Ñ2H·|’£e›=²9M}½¸@–U¼~ÏÍ.п”Ô“gç)"Ü®[½ê÷v–Ò²z½´² ,½úCî!ë±f‹Gƒ>ÌÖm‚ôÙÍ1*̨볻eIÚ“ã×ý_åêâ6!úlpŒÖeôÈçŵIÏòëš—öÈdjRÿh-ÚP¤O7–Îp8†¤´ ?5TpîHÚµk—¾þzºrssÊÍz¹l†²öú$KêvZ&ö)yÌ/i@·E›êwF¨Þ\êÑÞ‚€‚œ¦>£¶uÜrÚ ]Õ!Dãç*»pÿ纩sˆ.j,YÒÄåEºõ‚…¹M%FÚÔÿÌ`Í^Q(ïßzdûü–Vo*RD©ÃõoŸ³Æ£óíx^„ªFÚu{ïýW>­ÝéÕ½z¨_´â#ìêÙ&D·œ¬g>ÎRçÆAzri‘–¥M»}êVÛ¡šUìÊ+ Èç·4yi‘Înà’%)!ÌÔÍçE(*Ħ>g„ê‘à ãòø79º¢Uz´QL˜Mc.‹Òâ=­ÛåUD°©÷†Ä¨I²SÁC7uÕøE…Ê/²´u·Wò[ºéœpEÛ4¼g¤‚?:±Û %‡™ÊÎöýkOxÀ©Ãäñê¥^Ô“?©Î;©ÉiMÔ¬Y U¯QC¦i4|HYqÚ =Ù'\·’£¿ÍÓM\º°}ˆš¥sÒ«ŽS¶}ÉwLˆ)Y’? y}Mþ.[o­ò*ÌiÈ&I¦!@²Å?‰Uö ÃbYZ›P¿©™ ìCfWa@=âm‡|æßÉвt¿ÞwØîY{¼ªe–L¸º€jÇÙä>`(šÉý¶¤@‘A¦ÎM²kí.Ÿ¾_Z .uòIúa¥G)±6 nî’ÛY|_ßÜ]òú*a6É{èz¬ÜàÕMg„ì?l†šF™JËô+!ܦW¦gë­µ^E9 KÑ’–¥¼"KÁ6)ØY¼Žv»¡ºáÇ?N½Í”n:/\Ý'fèÞ,¿®íÁ/TPî(s†aJFñp†A=”¦aÊf³)88HsçÎÓܹóä÷O’ËåRß~Wªy³æŠ«_&—•†5ÜúòV·Òrüzëûl3)S;Š—tðâVÉ>VúnE¡ü¥@s†Å¨aŠKs×{Ôö™Ýÿ´W–œÒ[×E©Uªë_×¥÷¡Úòi––o(TÛzA‡<î 6•Q`É’%ÉÐÞüý=êvCë2:0Ãߔᗱ/äÐÚ­™+ µzm¡º6‰”]Ò;Ÿe©I’CÝê9öÿ¡Ãyl„©%Û|êØà¯âXÚT`)&¦Ë 4y~¡¾»5VÕãšµ²PçLÌ(^»ä³ŠÇc7 Éï·´1÷øÏ´X–4{•GVµ©ýiÌm;@9”™¹Wo¿÷¡¶nÞ"©â]{XúsÓ6ý±|™NJ—Q8ŒÜ¼<ù|×m³™òù¼zãõ7ô®ã]Õ¬YCaẮï%e²NëvyõàgYšt}ŒbCmºþœpúa—r=ÿ¼ï4$íÊ ¨E»êUs)·  ·fåJC¯%ûß&;µÙ¤AuœZþG%9e·Iß/ÎWÀ4Ô£yðACÇ4¯áÒ%§ëÇEùj]7èIUS“œzï‹\=–éSt¸]Kþ,,y¬~‚C²K?­*TÇzny}–Þ˜W «Û÷D¯YÍ©ÿMÍT¨)¥Ä9TPdiÿÖgôt¿¨£ªÛõCõÊOyº¦Cˆ\C¿­óÈmIÕ¢m𾨝&IvU‹s(§  W~ÈQ¬MÊ-´”e׿´f{‘R«8´z[‘VæÿðBKZ¹Þ£ÞBU7ÁÁ/T`î€2cð%ÐÚ÷‡Z³îO½3íCÝ2è&…‡‡UÈߟϧ©Ó>SïK.¡Á”Ö¨‘#åõî£Ä´Ù¢«®î§æÍ›+""R«W­,³}sjœ]uB ]ùlšÄØ4w‡_S. QT°)ÃÐ!·Œâp·O›`=;#W·NL×âÝ=~I¸âœÒà‰»5鿨ƒ&t³Û é¡ã÷è“U 5õÕN¿æŠ=ì§t:ÍsI{íû÷…-ƒõýÂ|]ôdšR#MÍÞî×¢ê2Õ·]°&ÿœ§¯¤kNš_/õP•¹ºuÒ½1–%í-´Šëñ·ç˜†4¬g”.h*Ó4T#Ö®kºúJÆr?½¾[‹Œ×–Ý>E‡Ù”¹Bœ†¾{иï/Š•?`ɾoen<;ô ˆ 5µúÁ*’¤³¸Õ¼zq=\C¯ ŽÓÖLŸ2sz6ή0wqÝâ£ìZüp‚Vm÷ꩇ\vCj¸å XrØ ».FÃÒ‹¯tHµkk¦OÑ!Ç7qªeI{=–‚ÝîPѸþUV~@ÙùÇmn¥^õ~^ñQWføtÕ”L üMAA|«B‡íP^ë¶ÛG«uë6r»Ý=v²OÆ„šŠ =x|õð SáAûƒ`ÃêÄï®Ä4¤ÆÕöòn»!·½8ðM;4pÙ ÕùÃ4®áÒudéâ5jYÇ-‡íàÙ4¤Ú¬GRÔÁïd*"ÙyØeתrðû'„Ûº]%ìàÛv›¡ºûÞ+Ìm–„ê©eWµÃŒFc7ƒjä0ô×ÙCRÍê“ýÏщϒÒöúeÚ¤œ<ÿa/|(, hîšBÍË (>Š*:öôPeæ´`£Gmjº4kU¡veÔ«EbÂlò,Íø£Pmkº´r{‘j'8jÓÚ^ýºÆ£|¯¥®ÜªïaHK6{U-ÊÔ¶ Ÿ¾\R¨ÄHSç6 ’cß—µÂ¢€f­öhÙ¯ÎlàR‹êNÙÌ#÷Ü¡opx……µhÖ”BÀI§3Έ£GP-ʦ—z‡ëµßòU#Þ¡„J"ÛL)%ØÐ /¤ë´Ú.-[W¤.Q‡ånÞáÕcŸdëí¾ªac€ ŽÀý8mØíÓÞ\¿š×p×r6íñiá:$)&¦=Ù~…¸Mu;-ˆ"8j»2}üæ^…êÛÌ­_6z5öëý|[¬"Ãìºó½j’hW†_špU”Vn-Ô9“2ôhÇ`…¸ Õ}<]Ó¯ŽÐ¹-BTä·ôÃ’B½ü{nï¬Aïféêeúß51Ê÷tå„Ýj‘hW»ºNÝñÞ^µ¯jףׯÐÀ1³d³ñeP¾õj¢^­B*u &»ôýƒUø¼ºÕ]ú¿{Øh ’ p?N˶iÍ6ïqîË·zõѼ|]Ù>DvSÊ)è‰òÜÃrý–>¸:JMkº5ÜoéòÇwiÉ:7-/¹Q §n¿ Bþ€4ô¥Ýúàò]غøKSÕx‡ú|˜¥ìÅ·¿ßæÓÖÇæ2uN³`%Þ½S£zûõËšBí-´t_ßh’În¢–ïÒ[ŠÔä.¨¨*eà°$×’Ûa¨ÐkÉï·ì6K&„)(²äròú‹'f±™Å3Š{¼––äv%cÔeædì[f¾§xÆñ`×Á—YòúŠ—ér~CRãd‡Îo,IªïÐs¿°…8f1.SU÷7é°Š‹²iÕ.¿:ïÛg]Õ¦x“]P¶OjTuÿŸ„Ö©NådTä+¬´}ŠCa®âñ0cÃLÙÂLíØë×Ì•EÊ“4ôÍLYVñ>2»ÈÒöÝ>wPéTÊÀ}G†O÷NËTëº.Í\R¨´BKªÛuoßh,iÔ”ÝêÞ&Dþ˜«[zE¨i5§|/C‹·ø”ï—E™Ý'J5âìZ¿Ë'»)Ýÿn†ælô*Ø&ÝÙ3Lí˲¤Ï~ÏÕ{¿äkK^@µ#LÝÒ#\-ë¸Ùòœp†!8Rºi:p®/Ç_öÝyàéÀ¿N@Z»ý·YüXÀ’NK°ë¾¡%‰=p~˜BCT>feüÐþ€¥™›}ÊÎð鱫£ôXŸýô§Wsÿ(%iÕŸŸž£[/ Wã$§žþt¯ò ,M¸>Zï Q|œ]º·xa†tßÌ|5Ouêí¡±ºª}°NŸ¸WE~KÓ½ê5-[czGèë;âus·0µz)C™ù¶<'\zA@{s}Åû=KÚ“éW³¤Cϳ†™Š 2´j—¯ä¾Y«=ªk“kßĨ¿nòÊ·oוë (oo@IQ6u®ïÔŒµEŠv(!Ö¡ø‡vå[r:™T>feýàvCº¬c¨jÆ;Ô®®[Íãm𻩍¤‡ç#=ÃÔ¢–[6SZ²¾H—· R­‡#íêuzˆ^^à)éÍå6Ô»}¨ª„ÛtiÇ0É/­ÜîÕ×Ë Õ#Õ¡Øp›öæøU5Æ®óíš±”¡bœxQC}'eê£_suçÛZ˜PÝjNY–ä; «»Í”nï¡þÓ²õÂô,½>3[7|¥7ú„K’,KjgÓeÒõãÒ|u›¦{Î RLˆMÝ©~”©KŸM×Ò? ôÄ{õÂY%ûG€Ê¤ÒNšê0ätí?ߟèT~ÑþžçµâŠKãñZÊòIÑ‘Ž’ÇRc‹ËÈ÷K’N¯vp›T±Éã³´y·_+·û4bÒžâa,Éá+;N´äPS¯ ˆÖ¼ EJ‰wèçóÕe—/`é‘> Ú?ìËéuÝš=*Vß./T^@ZsgœcŠ÷{}Ú+¤SˆB†>_\¨/GÄ*1¦x¿â6õéÈ8ÍZU¨O–zÔ³Yn=/BN;û9PùTÚÀ=Ïg©È³?`ßµ½HuR÷Oð÷WTä´ ·K™Y>i߀kvy%IQÁÅaÕÜm¾ƒ–½,ͯP·©jÑ6%EšzÿŽx¶4'ET¨M—µ 9xÇoêµo‚æ’}ž!ÕNp¨v‚ãe´«é*ù÷ðn‡>ä4uîiÁ:÷´à#®q`O&*˜J;¤Œ7 }» OiÙ~ý±µH+Óýj™âÐßGAp; µkàÒ‡sóµ)Í«]Y~}>'_wœî.™D0½ÀÒìåùÊóôÝÂ\ÉQÜCþÜ&ný¼Ë¯_þ(7`iCºWCßÌPN!c¸8±,«øÄ¢ÊÑÐ.ËÒ¤¹…ºïýLMš•£>Ê:hh€S]¥íážd(Û45ø•ÝÚ]h©M5»š× ’eI)Ñ6™œŠ|^„y/S^Í%©v¸¡1}£%IQÁ¦ÆŸ¢Ïhìç9J 3´bd¬\vC©Uú O˜Æ}™­Œ²T=ÌÔug…(Ìm²å8¡ê%95ëÞxÙÌòÓ¼w«õj±¯¼aèú޽Ü@…Riw»)]f¨†t “Ï/…ºMÙöåà/Ü+·c(îvz o´ò ²$…¸ Ù÷…X7w “aÑ[PˆËÝVü˜iH—ž¦­Bå) (ØeÊÅøíÊ€aH6£|íoLC’1e@Åe¯ÌÞâ:´·ùáî³›Rxð¡÷8jDðá{®; ;mG\Ÿ-™~ý±Ý«—¡u»|"›€SG¥ ܃œ¦®mé–Ó^~íÄHS ýø[Ž"bÊÞíÕMÍ]l¡pЍ”{\„M7œY®Ö©Yu—šU'`€S³wP Ü(î”wJ;¥€À€R@à@) p ¸P Ü(î”wJ;GóEÚ4•_P@!P¡”Ží8ðßÅÆÆéÏõë)*´ÜÜ\ÅÆÄP8Jî…¤¤$-^²\‡b Âš¿h©ª%'S8JîÃ0tÝ5þùW´dÙrû²Lî@é2c›òÚºu»ž7Aµê6–Íf£ p”씀£S­Z².½ò-^´H_~=SEEEǼ¬û}š‚ÁöíÛµcÇNµlÙ‚bü?ÿ¾ø˜^g³Ù­÷Q||<… ¨x IDAT€c@àÀ1ˆŒŒTç³ÎÒ™;˲, rýúólµlÝF.—‹bœ`¦É`p<Ü8†aÈ0æDרívSg@¹ÇiKJ;¥€À€R@àe$©jUåææRTh999²™6 ¨”Ü Œ4oÖDkÖ®£¨°|>¿vîØ©¸¸XЍ”Ü ŒÄW‰Óê5ë´aãfy½^ ‚ Åëõjæ¬ÙjÔ¸¡l6/•“½¼¬ˆËéTQQ- Â2MSú_§ogÌÔo¿«˜¨H™¦qÔË ,mß¾Csçͧ¨G`È%Iûþ‹ÃËÍÍ“iš :¦×[–¥´Ý™êÑýsö™Pi•›À½QÃúJKKWjê´ *$˲´mëVué܉bTbAAn]tÁyºè‚óTPP @€ ø„1¤«‹/<_Íš6¥'XHH0ETzå&poP¿®û¤Z4o*‡ÃAË ÂÉÊÎQVNž¢¢")$IAAAá  S‡ÓÛSP&ÊMànš¦.¿äb=ôè:·{WµlÑTv›í¨—cY–ü~¿|>­‹RáóùäóûŽy› X–æ/X¤ÿ›þ­F DA€ Ê^žV¦aƒz9b¨¶mÛ¦_~#ÿ1œ†a臙³hÝ#xÿÃOÕ ~]5iÜby£ÒªUkŽé¥–¤ª ñsûH†\*0{y[¡¨ÈEEF¨q#çD[²t™.ìÙCuj×¢pœLJP‰ß0 Û ”¸P Ü(î”wJ;¥€À€R@à@) p ¸P Ü(î€ Ë0¨(;î€ +>¡*Ee†ÀPa¹Ý.ŠÊ ;¥€À€R`§*“îD@…e˜†LÓaP ‡gYÅ?ÀÉFàà”æóù4Þ\ý<ûg¹)PmݺE‹.”Dâà0Ç~¿“’tæ™U¥J ‚“ŠÀÀ)í½wßUrJ²FŒ)“nî@…ôëϳվCGtqp–e©°°P/½ð¼n¸ñ&EGGSœ4îNY>ŸO§CÎìL1€ Ì0 ™¦Iàà…„„¨ÿM7éÛo¾ÖåWô¥ 8ièþà”µbÅr¥¦¦R èèhåäæËb0wœDîNY[6oV|BU dY’Ý΀8¹ÜœÒaå;¥€À€R@à@) p ¸P Ü(î”wJ;¥€À€R@à@) p ¸P Ü(î”wJ;¥€À€R@à¨À JÊ ; ÂJKÛE@™!pTXùyù”wJ€ò&33S}ø¡ü~Ÿ¶lÞ¬eËWÈ0¤ääÁù²,j(Ü@¹®óçiëÖm’¤%K–J’Fß>š°Pn1¤ (wìv›ºvë¦@ pÀ}v%''S@¹EàÊË’ºœÓU†a”ܪø„ªPn¸€r)88X-Z4/¹œœ¢ÐÐ` (·Ü@¹äp8Ô AY–¥@  žödüv@¹FàÊ­®Ý»« Ð#›Í®†¸Ê5;%åUllœš6m"Ó0är¹) \£‡;(×zö쩚5Sår¹( \£‡; Bùk|OÉÝn?à¶d³Ù(À)Æï÷+,,\5kבÏç“Íf“aP.¸*§H÷>ð¨ìv»ìv›îº÷aIRlL”n>D¦ÉÅ]§Š æë›¯§ëŠ^ç+&,AS'OTÕj)êqþP.¸*·Û%¿? _ÿ½ä¾@  ý¯&l8E†4ãûïå+ÈÒcŽ‘Ý^_´lÑ\¿ü:G“'½ªúßHOw@¹Cò¨p.¾ð¼ƒn{}~õ¾ˆ^P§‚@  />ÿ\n›_}.íU¶ÿ¥ÃéítA×Nš0þy< (WÜN­Z5šPë¬NíLaʹ@  iï¼­I1º G÷¼B±AƒzºæÊKô„ñòz½Pn¸*œ¤ÄªŠ‹‰’$Y–Ô¬I£CzF |ñx?^ÙÙÙP.¸*¤o¸Z–e©ÈçSûöí(@9VXX¨÷§½«Ó[7U«Íþóë’«%©ÿ5Wèí©S´{÷n 8éÜR³¦år9£š©Õ)@9•ŸŸ¯gŸyJ—\ØM­Z6?ê×§$WÓÐA7hò+/hÇŽípR¸*¤ˆˆ5jPG7÷¿šb”SÙÙYz~³1äFUKJ<öc¿ðpÝsç(Mÿü­]³†ÂNw@…ät8Ô¢ySÕ­[›b”CééiÿÌSº{ôp%VM8îå………jø-5kÆ×Z³f5œî€ )3s¯7j(§Ã¡ÜÜ< Pޤ§§iꔉzøþ1 )µå:ìv1Dó~ûI+V,§Ð€2Gà¨P|~¿&¿þ¦^}í UONR‘׫ /¾ªÏ¿œ.˲(ÀI¶}ûvMzå%Ýw×h…†—úòm6›¸A‹æþ¢… æSp@™"pT^¯O÷>8V§·k£ÛGS||¼êÕ­£;GWPPÞÿðŠp’†´lÙR}?ýs=òÀ¹]®ö^6›M· ¨œŒúîÛoèx(3î€ !+;[}RƒÜ õëýíË¡®]:«jÕM™ú–ü~?(c ,ÔÒù¿iøÐr9'üý I½.º@NÓ«ßÇ1 PÆþY– Ã(þ7p¸Ny99¹ºÿ¡Ç4rø`%WKúÇçuêxº5¬¯—&NQQ‘—”˲ô埫0g·† ºIF§`÷<_µ«'èµ×&+Ð @cÒ¢E‹5sæLÍœ9SQQ‘úqæLý8óGeeeQ ”9;%œÊ¶mߡɯ¿©î¹C‘‘G|~ÛÖ­¥§žyN#†VpPE8¦ÿßWŠҹݺÈ4˾ߟajÑì4Ùm6M|åeÝ4` l6 T–%y‹ª°ý/ ê×Õ¥½/ÒSã&hï^.3(M^¯WS&OÒé­›¨ãéíÊÍzÕª™ª‘CoÔsÏ>£œœ ¨ bcãT=%¥ävÀ²tiŸ>b¾dœ î€SŠ%iÞ‚Eú}î| ¿e\®cŸp«J\¬n5\?=^»ÒÒ).@)ðz½š0~œ.:ï,µiղܭ_µ¤DÝ6üf=ýÄcÊÏϧÁ€ À4 ]vÅòù|’¤ ·[5j¤¸ãäl”p*™ñÃ,­[÷§ú_œNçq//22B÷Œ¹MO?û‚6mÙJŽCNNަLš¨ë®ºLuj×*·ë©ûï¾MS&½¬;wÒpÀ)β¤F )>¾Š$©nÝÚ ¦08)ܧȔ¥3g)33S—_Ö[¦i”Ú²C‚ƒ5ö¡{ôþ‡ŸhÕêµàäääèõÉuÅ%¨v­Ôr¿¾1ÑQ>èF}4í-mÛºU†A§2‡Ó©¶mÛȲ,¥Ö¬Y*´€cAà(÷€>ÿrºöîÍÒ¥½/:!nÙív6XÓ>øXë7l”ŵ‡ÿYZZš^š0NÃ÷Wjê§ÌzGD„ëöQ·èÛ¯>Õ²eËhHàfš¦Zµn«¼üu9§ÁÉÛ) <óù|šòú›Š‰‰Ö%½.”q»Ùl6Ýsç(Íøq¶~ýíwŠðlß¾Mï¼ùšÆŒ¡¨ÈÈSný].—† å‹æiÉâE4(p kÙª•ªT©¢êÕ«S œ4vJ(¯…8‚Ÿ~úEgžÙñ˜C÷œœ­_¿Qçœ{š5oAA@à(wò ôô³/¨ß•e¶¨ËÙ5wþBMzí-Ýx}?BwGdY–^záyÒ_UâbkY߆‡©[·s(*JEn^ž2öd(%%ù¸¶ïM›·èµÉ“uóàAôf«ä–-]ªy¿ý¤ÛG“Íf«0ŸËfšê{ùeúüËéúê‹ÏÕゞ⸬^µJ‹ü¦{ÆÜv\'+ýmŽÚµmÃöˆR³7#C}.¹ø¸–QTäÕÔ·Þ‘i³é´ÓšRÔ}ø-”+YÙÙºý®4hÀõª™zrÇÝ3 Cm[·T»6-õÌø¹„Àååå©}ëÓŽ;l—¸l¥Ì:þ­Ê0 UOIVx°M{¸¢ 2ûiÖÚ¶qµF\¡Âö·õ‹zöPjr}ðþ4ù|>ÇlãÆ ºêŠË¸2’Óéеýújîœ9Ç5ŸÆ¿øš"##õðƒw)(8è_Ÿÿã¬Ùzô±§åýÃ&üåääÉåbhàH˜4pR-_±Rß͘©¡ƒn”Ëå*÷ë[%.Nn¼N¯½þ–®îw…â«ÄшNŠÜÜ\Íù}ž"##®eËVÈåv©U‹æŠ¯¢‚‚BÍþùgÕ®UK;vîRNNŽÎíÞUyyùúmÎedìUppZ¶l¡ª ñZºt™–¯X)»ÝÔöíÛ•œœ¤`-Z¼T6n”°”’RM­Zµ”!iÅ+µcÇÖ¤‰–-_®˜˜X5kÚ„†*ŸÏ§§ž|B7^ÓGuëÔ®´u¨™ZC#‡Þ¤û¼_£ï¸S‘l(WòòóõóÏ¿Ê0¤¨ˆP­^µF111*(òê·9¿+3s¯BB‚Õ¦MkÅDGiÎïsõÕôo•–¶G?ü0SíÛµSxx˜ 4ûç_ewØ¥æM›tÒÀïè§Ù?+}÷5jØ@uëÔf"WàoÜ'Í7ßý ôôt zó)uV5!A7¸AO=;A×_s•ª§$Ó˜Ê\n^¾žxæ»åvº”\­ªæÌ[¬¨¨H}òÞTI–î¼ïq5kÒ@+׬S­ÉêÚµ‹®p‹öddè‚s»hÑ’zkÚGzõÅgµyë6mÚ²U–%-]ö‡êÕ««·è®ûÇêì3ÛËáphÜó¯êÞ1#Õ½ëÙZ°p‰^ó=¥¤$iÍÚ >äFw ‚ÉÏÏ׋/LÐÍ7\uÒ'³/bc¢5öÁ»4ö‰g5pÐPEEG³‘ Üðz½Z¼d™ì6Si»3´tùjÑ¢¹n¿ë~mݺC]»œ¡ÅK–küKSôÑ»S´fÍ:-Y¾Z.§C /U‹͵|ÅV q‡âãbäÖêutÅeiØ’$»Ý¦ /½ªÛwhùªµ2dèÝ7^VRb" €SP€2gY–þï›ï”››{ÊN¸¢Ñ·Þ¢·Þy_kÿ\O£8ivìÜ­Ÿ{Rÿ{ä~Õ©vìLÓÊU«K_´ì}ùÑ[zõ¥ñúmÎ\mÜ´Uo¼V· ¹Y£F Ñæ-Ûµ`Ñ]Ðã\uéÜIÁÁAºeÈ@5lÐ@}Jq1Q9|¨î}«’’ôÜ åÛwé¹§¨H.§S3¾þH½/¾€Æ*üü|=6öºeaû"#ÂõÐ}wè¹gŸÖž=»)ÊѶ¡Ã+¯À£³:®¡ƒhþ¢ÅZ°x….é}† ¨Q#‡)=}¾þv†®îw¥âT¿n->Tq±±5æ……†êùñOhü¸ÇÕ ^-­\µZ™™{‹¿ÇIJHˆ×sã×3?¨@  3gS|àoèá(so¾óžjTOQî]OéÏ¢Ûo®_ž¤§·U«Íi\eÆa·Ëív©QR¢bbŠ{YV¯^]6ÓÐú U»Vª$é‚îg+::J†a(=-M‡]ú¥æÎ¯ìœ<ýôó¯êÜ©ƒLÓ”!É4Meçä¨ÐS$ŸÏ¯‡}B¦i*33KGÌcqãõýävÓ @²k×.}òÑûºoÌ­Š‰Ž¢ ãv¹4öÁ»õÒ«¯éŒÎ]U·^]æF¹ðWG&Ó4eš¦Ö¯ß ‡Ý¦ïgü¤+V© °PN‡CË–.Ó¥½.”!C†iÈ4MåææiÇÎtuîÐZ‘ár:š2ñùƒ–ðÔ­ËYr8ª–˜¤à ·–ÿ±ŠÂCà(3~¿_Ó>øX)ÉÕtF‡öâ39ìv t“Þ|{šü>¿Ú´n¥J6€“u ïpÈåt4ŸÏç•eé 91ê×­U2öªašòûêrö™:«SÇâû CN§ãÐåÛm’¤ˆˆPÝÔÿZ9Ž’åDÀÅÄÆ…aH;wîÒÔÉuû¨¡ŠŽâ÷ûŸ„„kØzò™çä󟧆 º£Üq:] ,Ù©ƒºœÕiÿß}‡CÖ¾ Ö!ÉPP[¦Í&ŸÏWòXnnžl6[ÉD©–e):*bßq‚½øD=_~€C0¤  Lx}>=ÿÒ«ª]«¦:wêX¡Ìì6›®»º¯-Y¦ßçÍ/9@€²ðçúMZ³v²³s´víŸòùýMlxà©zJŠ,ËÒ¶­Û•˜˜ ŸÏ§¥ËVÈá84p SÕøXy|GÜ3š°ý?p:ºsô­Ú´v…f̘Á1 ʆ ê)`YÊÈØ­ª ñ*ôjÉÒåòüÅßcì6ý¹a³rrrd†zž{–V®ùSÛ¶ïPn^ž.¿ú& Š ;à„ËÏÏ×Óã&è¼îç¨më–ò3†¡ý¯UZún}üé|áPf’ãuç½è¦A#ôûü%º°Ç9J­‘rØç6kÚD=Î=[?ÌúEƒ†ŒÔàá·kú×ß)4$ä°Ïô¡{dYÒàáwè¦A#ôôø—Io6 Z¾|™~þñ[Ý:l°Ü õŸÙLS—_Ö[òæé‡ßS”+-›7Ó5WöÖÿ}ó£n:RÃn½K_üß7ª+Ã0Ô¡]+edîÕ°‘wjËÖ­ºêŠKå°ÛuóÐÛ4pÈHåææêÊË/QdDq¯vCRNnž¤âN6“ðÀá0¤ à„ÊËÏׄ^Ñ%½.TÚµ*ôg5MSž®¾ùn†¦½ÿ‘.¿¬÷)9!,€SKbbU=òÀ­]»NN§SuêÔ–ar8zù¹ÿ).6¶ä¹†aèž1·©Ï%)##SQQQJNNRhhqà~öYg¨Eó&%·ëÖ©­)ŸÓÎ;åóùU­Z’«&H’:vh§õë(6&–FNa†!ýúË/ÊLߦaCn.N ÿÍfÓ¥½.ÔÌÒG~ K/»ŒáepÒ¶ÅIÏ?Q2w‹aHCÐYÏPVV¶¢¢"•’œ¬àà`IR¿¾W茎§K’bcb¬·_Y›6mVÀ²T½zŠâ«ÄI’Z´hªçŸyDUªÿÝ Ó£Žápî€f÷ž=?áe z³âbc*ÍçîÞµ‹–.[¡gž{QÃÓédcpBEFD¨u«ƒ¯ ²ÛíjÓºÕ¡_ÆMS ê×;ìrjתyÈ}I‰U•”Xõûk¦ÖPÍÔ8…Y–¥ùóæ)mÛ]{u_: §Îgž!ÿÌYúø£táE3üÊœišjÓæà¿ý¦a¨q£†‡}~HH°6¨Ð}qq±Š‹;ôdzJr²R’“Kn¹Õªe Šîw‘N„=zzÜó^ÉÂö¿œÖ¤‘ºwí¢'N‘×ËØ†JŸaH‘á%½ÑàhX–¥ï¾ýF{Ó·éÚ«¯"l/•ý²¡sÎî¬fjëÕW^’ÏÇ1 TFôp”ºM›·è…—'ë{îPppP¥­C“F ®1÷>¤±ß+ça&%€cª§X¦ ÀÑñûýúü³OT#)N]Î:—‚”²–Í›ÊíréÍ©¯éò+¯*¾P9pt(U«×®Õ´>ÖC÷©Ôaû_’«%éÖa7ëÁGŸPVV6€Rc†""ÂJ1üg>ŸO¼ÿžê¦&ªËYgR¤QÃúº {g½6e’òóó)T"î€R³fí:}ðÑç=r˜Ü.Ù')1QwŒ¦»îT™{³(8) 5yâ+:³} Ñát r‚Õ«[Gý¯î£—_xN{÷î¥ PI¸JÅ/¿þ®_æÌÕ· —iäoÂÃÂôø#÷éù'jÓæ­”)oQ‘&Œ§Ëz§F ëS2’X5A#†Ü¤ Ï>­ŒŒ •;à¸ýðãOZ½f­®½ê ÙíLòOBCC4â–Aš2õ-mÚ¼…‚€2‘››£GyXÃß ÚµjR2£‡ï»SS'¿¢Í›7Q¨àÜÇ,è÷>”eYºáº~2Mþ¬IXX¨î¹s”>ûâ+Í_¸ˆ‚€*3#CÆÓwTB||¹\Çììmß±³ÔS·nݦü‚‚R[æÆM›UèñH’6lØ$˲þókCCCtÏ#õÅ'h ¡;Th$#€câ÷ûõÆÛï©Zn-‡Ã¡AoÔ¼y 4gîü£ú²ð_eìÙ£ñãžÒÃ÷ݡ訨Ã>'--]×Ý8XW^Ý_ý®¨—_}]«V¯Qa¡§ÌÖsîüEzrÜ ¥ºL§H<ö´6l(½pûšþCµc߉n÷“ß8ª×»\.Ýuû­úìã÷µaýz6P¨ ÜGͲ,=ù̵mÓ’ ·Ž‘Ãn×ÀýµcÇN}ñÕ×”ª-[¶èÓ¦éÑïú×Éì–¥¬ì\ÝuÇ(=öè}jÓª¹^~uª ®U«×–ѱe@>¿¯Ô—ëóù$•^ǧHõ“Ø›WxL˶Ùl3z„/øU‹-dC€ ˆvG¥ÐãÑ /MRÏÝÕ ^] rLÃÐÅž¯éß|§éß~¯î]»0á,8.†!­^½ZßMÿ„KÅ IDAT\£o&·Ûuä`ÀfSbbUÅDG©ZR’Z4oª·ßý@wÜý Þ{k’Ün·vïÉÐ3giã¦-ª«¶m[©^Úšýó¯J¬š :uj+hæ¬ÙŠŒˆPËÍ$I .V àW ÅÆFkë¶íš7o¡7®¯vmÛ(2"â u š;¡.\,OQ‘ê׫£ÎÎPP[’4Á"­]÷§vïޣƨ]›6%mݶ]¿ü6G™{Õô´Æÿzáæ-[µ`á"ù}~Õ«WGM7’T<¼Íœßçjù«”Z=E ÖW½ºuþµ~‹—,Ó‚…‹•‘‘©ÆèÌNôÏw8êm?M™ú–rsruF§Nl¸P‘¾ëSÀ•Ÿ_ û«K{_¨FPRùRl¨Ç¹Ýä÷ùõñ'Ÿ+PpÌæÏ›¯å çè®ÛGþ§°ýŸô¾¸§¶nߥy ËhØÈ1Z½f­z_|¿n¾åvíÉÈÔŸë7jÎÜù’Š{”¿øÊëúä³/å÷ûeY–^}íMÙìý>o­?×oPÝôÅ—ßêû?ò¾ -ѽþOÑÑQêØ¡¾øòk=õìó’¤´ôt=ü¿§•Z£†ºžs¶>üès}7c¦$iWZš† ­ŒŒ½jÙ²¹¾øjºÖ¬ÛxØÏ¶uûºã^zT«v-ÝýÀÿôÛïó$I>>N«Ö¬SŸK{)'/OO<ýœ ÿéHN;w¥iÈ­cÔªes]qù%Z¼d™¾ýî‡ÿTã®í'—éÕ×ÓÿO~¿Ÿ*wÀ²{O†ž7A£F Uõ”d RÊÎ?¯»ªUKÒÄÉSåõz)€ã°¤“yþÎ_ïm•Ògô,ù–üýÿ>\§X·¢¼³,K?ÎüA»wlÒõ×ö“Íf;®å¹U¯n-jõ굚¿øÝ9úVÕ®US7\wµ7¬§?þLgvê ogü$˲ôçúºðünÿÏÞ}†IQ¬}¿{fvfsf—œsÎ(¢ AP‚ ‚ä ‚¨ˆ bQIÁð¢"̨L ¨(9çÌæ8±ß‹ + Hàÿ».ÏYf{§»Ÿ®™ªzººŠ}àõúÈv:ùrÅjªW­Œ ,OïžÝ©X¾íÚ¶æ‹å+NÛïSÏNb@ŸžÜÝé.êÔªÉCŒä“Ï¿&33‹è¨(½6“ÚµªSºT îíÙ¯Î`ÿþƒ:èß§'ujÕ`Ôˆ¡øÎ2Â}ÅŠï¨S»&]:w Fµ*Ì›5…¢E ðÈC#зùããhÕâ6Ž=NJJÊ™ƒd䌈ÏÎvAÁ¸ÿ¾¡4¿­É9ǹy³ÆÉÅ»ï,Öº>rÉëæ+UÄþ©Î6ÍœvË•8Ï¿ê}Ÿyòç³µ«Dþ M)#""ÿêxB"S§ÍbèàþÄå‹U@.ÀêÖÆÀŒWç1¨ìöFDÎËû?§“”iÒïÖ°ËÜ™7Y¶*Û]LìM€íÒL“•å6™³,™„LÃïŒ$&ìü‹N#ç'â3Mʱ³e¯ ›lAéö<ÛŽ]xœª…¸«Q8ŽMÿ%þ׎ø`éRJÊÇ--Ú^p²røÛwî¡`üìٷۛ݌Õz2…Тé­|³bûõbçžýdddòÕ7ßÒ°A};wí&19™¡}»`±äŒõktóɵBCCq¹ò2ðz½dddQµJ¥Ü×òÅFÆÑcljfé‡ñóšµì;p‹Å‚Ëå`ûŽ]”*U2÷Ü æ;ã¹}öå× Øç”}Ääþ¼ú—5¬üîG¶lÛ‰Ëã!)%íì‰pÓ¤l™RŒÒ›]ûÑò¶†T«R‰Í›ý‡kgРþ DF„3kæL„¡)å"KÍòñÌ{I mAá˜Ë› <˜ìåí/S‹  ã°3Öç./ lAhà… v{M&}L³êÁÔ.õÏOø¸=&fšÔ⛵Y˜À‹=£‰ 9ùš–åãÕORˆ 5èÕ"R…IΉF¸‹ˆÈ?Ú¹k7óæ/dôÈaJ¶_5kT£uËæ¼4e:©©i ˆˆœ_ç6ÉËÎc—z‚å³™ÿ]&nÁf½t £6g³d“›«tþ]¯ s6ºxâî(7 ãåÞ1üo§›,×éɵþ­#yje;»TÀįx½^–}ü1ñÑ¡4jØà¢$Û¶mß=ÀFÑ"… aûŽÝœºHèÎÝ{À0 5¿þþ;¶í$_l,ʕ᫯W°æ—5Ô>1—;€ù/‹Œþuì§Ž(÷x¼$§¦èpðÙçËyûûÐ(>zoCöÆ{bØlP` Êý;Ÿ×KZzú÷ÆÎ]{Nnëóár»Ù³w?5‰*•+òΛó˜7s2a!Áÿ«Ýîæû¯?¢UËæ|öÅrÞ^üî­nU*W¢uó[˜5sN§S[.î÷„~ÙíÆé¾¼CµM&.MÆi1h]óôÏÒò_3øp£‹šå ´ÿs»aÙÏé¬Ýçú×ým>à!-óK3aþ:/÷Ž¡]í`^èÃwÇ|¸ÿö§!ZÕeÖêl6T@Îî""rVÛwìä·3tpÂÃÃˤTÉtíÒ‘—¦L'=#C‘³Êr™ì?îfóÉéÞ&¸s;¯)é^Öïur(ÁM¶ëìõG<Ô/çàÆ²ü}€f¶Ë$%ÃK¦ÓÇãn'œìø›&$§zq¹MS=¸<9¯'§{Ù´ßÅÁãn29'—í69žè¦z~+5Š`³€ÇÇS¯©;ªU©LÏ.íxþÙ§ÉÊʺ&ÊhJJ2Û·nÁé<9~Âñcìܾ ·[ÉË‹Í4!-ÓǶƒ.vq–xv{MRúÏó)måí=nÌI™ûU O,Ïd@ƒ`~Úá$x©o ±g˜Æ%#ËG¹¸3§¬¿Þ”ÍÃ¥R.ÄÀdá§Ýnš—°1{`>\nQæ¡úA|³ÕÅç£óñçölî}7•6•IJö”ìeÆ X\“åëL÷±ô÷,:Ö aÁ7)Lý!‹^7ñ¿N GX˜3 «Å ÉÔîªä`î™|6$šrÅÎI‹ÅàHš6ÿàt:Yôú|Z4¹9Ï,ÿ•ddfñü /HBb2›¶ìàÞ{:Ó¹c;, … àù ÒýÞÜP·›·n§Tñb4o–3Wy‰%ص{·7o‚Íf#>.ެ¬lRÓ3r×þ1Œœ}åÙwî ãÄoûöº‡AÃF³mÛBC‚ù}Ý&&>=À®ïbĨ‡INNbóÖÜߦ͘Í+3^¥ŸžÄÆÄ0|äC/Z˜}‡ŽP¸Pþ3žóõjóöâ÷>ê! ÌÏŸë61ó•IDFFpìxÏ>ÿ".·›R¥J0¨ß½¼>^›E§B™ýeN}>¢Qý–E‰( 3ûÅòýV'ïmscÚØlM*1哬ʤAyG÷»Û%’Ê…í`ÀŒåéø,é`d¤y™=0–’ù. j@°¦““ÿ@ w9­a»jõ/lÙºÁú\´Ç’¯4·ÛÍokÿ¤VÍêØ®’sŠŠŠä‰ñóÂKÓÔÿ^ ,¨*"¹“½ütÀÃWÄ‘?ÒJÿF¡ü±õäBgЇÆÄdá«?3yú£Tn­DJš—Nu‚hY/»Í áÚLžÿ0wG‚;Ó}LìÁ[‚8žæå³øp`5KâõÁ W޲òLÚ78ýɧ£‡Ý”‹qœ­¯Êº£ŒŒ¥fI“<zâ(w;©\0¬óÛx®[4>†.McnçpšV˹0ëÓdæ~žÊã]£iQÞÎŽcú6 c×17÷-ÏdçØ8JÄÙxèhöÂQVl̦I• ‚­šàfó³ù±_à47ùB-|¶![…O®¸¬¬,æ¿6—w6§|¹²ô^L|z<>Ó&DD„ChHHžíÚµ¹ƒš5jpôØQîîÔÒ¥Jä¶ããò1õŧ)?'Ám³YyjÂ#œ´Ñ¦uK¬Ö“Ù—/[š‡F Fõ*+š³hitTófMeÏÞ½¸ÝFÞW wZÃ2¥J²`ît8ÈÐAʼnˆç™'Çáóù aÚä‰lÞ²«ÕJéR%Ù½g 8휃ƒƒ™ñÊ‹lß±¯ÇØGá°ç¬ÛðÑ’7Ù´y++Z¯×G£†7ìW^ ..Ÿ¼3«ÕBtT$ çMgï¾}dddз÷½Äž2'üù(X ?Cúõ`ÊÌéôî;€èèè«¶¬‡„ðôÄ©L|zí;vá·_Vcú|Œ¸ ¿­Yͺ?ÖR¢TiêÝØ‡ÃAÂñãüðÝ·:p€Š•«pcƒ†Ølþ™¾²XrîøËz·ó¿N£YYãÚæÌ5¾vK>·ì|>hY-® Ãp{MúN=Æ–ÝÙ䫞ƒn^ïEõhNÏ—²u“:僰0é§Lv=žŸè ï¬ÎÀí3ù`T¡ƒvµƒ)úØZÔ!.Ç Kp_û(Y”Àªu™”l|þ7¯ Àf¬LÝt—s£„»ˆˆä2~ZͶí;èÕ£Û5unN—‹¡#Dzâ˥؂ƒ¯šãŽgü£2vÜS Ô"E © ŠqÑ6ªÇÛ²0‘á·†Pº@7U;™ «PÔNø‰ùÍ+ àXŠL—Iþ誗2ùrm&»¼ìOðp ÁCÖ‰iXJ‡Y(_$§Ãš™áåH¶ÉÁD/YÙ™ØÃ,üqÐCû¿ÏŠ?2XyÐàÖÿС5 ªÏyï‘6n/bcÝnWNÂÝgÒ´vÎñ§eyÙà%%Ëä‡9ûÅcrä¸×ÌMnøLذßM‰P ޹8xÜ… ³ðý'M«áöAÃÚ!œl¨U<€—>Mcýn'•‹;TåŠðù|¼¹pÝ:¶¡Dñ¢ü~ªT®xNÛ+Z871ž÷£mPµJå<¯U(_ö´¿=Udd‘‘9OðÅÆDs2©B¥ŠÎüÝ—/6ϺB§þìpØ©VõäqüÓÍ{@Ë—;ýu{Þ÷°Ù¬.”3èáÔ×kT«šûsHH0Îð^">>ŽîÌó/¾Â°ûî'((èª-³uêÕ§d©²<ÿÔ8vnßJŸÃ‰ˆŒâ³e0gÆÚÜu7 _{•­›7Ò»ß`ž7†Ä¤ºt¿—/>û˜ÐPjÕ©ç7IíÕï¾ó.Ë¿úŠ>}ûP¤hQòå‹Ãf³^ÑãÖ*‚ò/#"Ø mµ@Šql!)ÇÅuN,$`5(bp4%gº•¦5BؼÏÉ•i$eúØfr$ùäj£ê’Ó¦Xñk&±aVþÜ‘³È¨iB|¤…mGÜyîN·ÉCo&r-ùBÏ<àéÔúü·]njE[O¯Ï·:iX!0w_{ves{ÙB9ÇtKå`n©Lî”t•J:rß¿P¸…ÃÇ=g{✕-æàå/Ò¸µ²‹ìèá ù'šÃ]DDr;oŸ~úÉ)©ôìÞÅŽë¯ù}M<Ož¨LÓÌýÏwÊÄÅ>ŸǓ絓^¯¯×{ÚbVíÃëõ¯‘ 6O=>–¥}ÂÖmÛUXE€ÀƒÙcÓ*œ7ʤÅËÇ™òyjîï#O™òå¯A¥†¿lɤÉË ¸<&-ªRûDü/AVë_S!˜éƒi>f˜Ì0iT%ˆVµO¿qùʲ4ŠÇÚ(÷ÓÙ l§L³P$Ìr²÷kBð‰Ó2O$ÿØçÁ “˜vÚ4 ;mJФ4NŸ™»í “;ëQ¿¼ðAî‡ •?:€’1F¼‘¤(WÌÊ•ÿãÖ›ë^”d»ø·¨È†îËŸ}vU'÷¬V+<<žÍ×_€–w´Åçõ²iÃzÂ#"IOOÃ4M>\²‹ÕJ™råIIJäè‘#tíÑ›ªÕkùU²=—à‰ O0tð5’9³g“œœŒÛí¾"‡T6‰â)cã¡7’iÿÂQ6îÏ™wÜj€å”9ÊÿªÝ^“3qï¼$ª³Ó¬r‚ò¸|¡'ëQŸÛdï)í‚C™&SÛ†Sêoõf–—Ÿ¶»hSûÜnedû8’í;­>¯[Úžg¹eÓ„lXÎö¡09máöp‡qÁŸ¡ÚeIðÂsï&ãõË)þD#ÜEDŸÏÇÛ‹ß#&&†·5ñ«c›=wuj׿§U?³gï~J/B×»;Á’¥S <6m$2<‚wµåç5¿ñí·ÿãxB ÄÓæÎÖ”.U"÷ýVÿ¼†ŸVýLVv6õêÖâŽV·–žÎ¢7ÿ;vFýêÑ´I#¿‰ƒÃng`¿^L›9›Æ²¨^­Š ®Èu.=ÛGj¶IRê”r°fsw/H¦ï­¡gÏ 0ï§,š• MÝP¬XüóÙæ³Ù-DØ¡Yy% ä$æS³}„:NO`/~8ž!3óÃúLn©ræ7Ìö‘˜áË%gÀ‡{=t¬ú¨·¸P+X ª  AÙÀœýfù ´œÖa®PÔÎÁmkp"‘îÌ9Æ‹ÝÞ´×ÉÑ,“Ïί(WÌÚ_×ÐbôPâ:—/–m›ÿÄbiÏwužƒiBDd¥Ê”£Õí±Z­x½^œÎl*T®Jó–wp{«6¹‹÷:’šµë±ü‹O˜;k cÇ?CË;ÚøÝwã”[ÀN§“mÛw°eëvÞ{w åÊ—áÆn¤\… —mzӄé^"ƒ,ÜÓ ”®õC9ók6gqÇagý»£É^Vóòzß(ªsšéã¨óìÁ.^ÂÁö-N:Ô9Y×ÿUïž**ÜÆÇÄÿÄQ2Ÿ "è_æ@/[(€ýéæÙës0rbeeãAOîkîÈfë>­ê‡]²ø~¾*FqÆvÉ3x@äŒmh…@Däúæt:y}ÑÛÔ®Uƒš5ªùÝñ}ýíw,ùð3ÆŒN“&˜2íU²_“Q#³nã&^óÿè|×TªT‘£ÇŽ3üþGyäaT¯^•ï¾ÿ®½³âó÷O4BM–ó-îjÇáÃG˜‚£–¦1ú– Zÿ-iP«˜®e¾ ‘>·„àqûhüf* ¡tüÅ]ô{ËU‹;°ªüÉ•Brr ÁWñ#rîÜnŸA…J5±Z®¾I Ó²8°kÉé@LŒç`µZ)S®+¾þ¯×Ëæ­°Z¬.R”¥ï¾MBE¸·ß`~]³š ëÿäxB/¼4ͯÎ-.&’ÀÀ¿O/fâñz±ZmDDFè¼lÇã3aÞç)DÛá¦jÁxMƒ})&=ŠÚÿñïb#¬ä 0ØsÀ…Ïkòêw™Ô(ÀOÛ\Ô(í9mûþC™õS&3?M¦~… 6îuòΪ,ÞGÀßF–dž[©e!Ýé#è_*Ïz%t-i˭ϳœ^𽯿Q±µÑ®´%ߦ­ê‡Ñã±ÃÄG%Ó ¬ƒ)Ÿ¥qgí ¬—è#bGS|/êP²]Ήî""×1—ËÅ+3çвy3*V(çŸiB³&hrkCºwéÄ‘c5b0V]ïî„Åbaá[‹)]²(mîl@¡NyïƒOYõóêÖÉIœßÝ©U«TÂçó±víŸlذbE‹ðËïë:x‘áDD„Ó¸Qþ\·žÚµj\¶Q)çÂb±Ð¹c{>øh~ü)w´jÅ¢âD®GŠ8˜Ñ7še«2HNôP¡\OwÉY ¬@¸• ÛÉ$¶Íjв¤ hP%˜Ã™& >Ká†Z!ÌlÁ›ß¥ñón7ëØ¨_Ä–ÛaµZàù{¢y}eo“Fh„•‰=¢¨^ÊqÖ/m¯yöïÌlŒ¼=ŒEŸ§b¶°tH .7 -À_ýtÀa­"‰ŒHcéYwG8·VÈI\D‡[púrÎÇ0`î|¼òI o|•Jl\¿ ަLþLš¶â¸8ßãÇ3|x¼zŒ\®¬÷öbé»o1x@o¿j£\)^¯Ã0®ÉöÏ4ùêëoéÚ½'>üèÕ{¾œé?J–*ChÈɧ°îhÛ¬ÌLfϘBhX8÷ôìC`` ‘Q1|þÉGd¤§Q½fú FhX8]ºÝã7çdï½÷.‹^_ˆišQ¹rEJ”,Eû»:œ[&×­]sYŽÉj1¢ø¿Ÿ2XøuV †´ §f™ Ò³}4(jÃqÊ”2%âmD…XpØ æ‹eþç)ü¶×Ãfa”/ÀÔ/RÙzÈMé+ñá'?_Ñ¡V¾¾/–ËS™ÿy*¥J:˜=8ö´dû_}¹¿ÊÀ™ü[}þÛhŠÇæ¤.»ÜÎÛ?¤³3ÑK¥bvÉǼ/Sy÷‡ z5ç–²9SÉU)`%4ð¯ä´^”ä§ËklÓw®œ%ÜED®S.·›GÆ?ͨáƒ(PÀ7F·ÔÏýwñbEðx¼degc`P¡B¹ÜÆì±£Ç¹µá͹ÛZ,•Ê—Åétæ6Œ XôÊ0 ÌOZZ: ‰‰8NžzörFC&%§P­J¥œ‘8~Ö™5 ƒ6w´â×ßÖòêÜ ì×Kn‘ëTÝ’ê–tà3áÔWëçV&:ÂÆ³ýóåþ»{ƒPº78¹M†'Gï“çol}‡Cãð=žØp+kö¹hs–…ÉL j1/ È—çu{€Á+Ãâþö]=nƒ›O<¼Iݼ¯<Ø6ò´Ñ ž¾'úœë›û&]³Çíåí*xrEQ¦B^ãmºwé„ÍæÿÝú¬¬l,z“CѤqCÞró?O<õòoí›ÌÌ,žøåÊ–¡{×Ng}¯ƒ‡sðÐa*U(OPPàUÓnúâ‹åOÉ¢~Ñ¢Wý G` #F?œ'ö‡ƒ{zõ£S×{°c±äLÒ¢Õ4mÞ·Ë…#0Ð/ÏÝ0rÖY*Y²½ûô¡XñℇG\ñcµY º7¥[ƒÐ(žÏÆÃm#OùwÎ1üÝèŽÑ§îžö ÃÏ)væ)ÿûw>ŸÉ¶ucTÉ9~‘ëOJJ*“&OgÄÐ~lÿ«‘´oßAêÖ®•Ó±ÊÊÂgšR®liÒÒÒN&lìv:œ§ƒuôu\Ç IDATøñÜN›iš$''Ó¸LÏÈ "<œ¨¨H,†ÁÃŽ¢P¡¹<‹añÛÎÅb¡v횸Ün¾¹˜nwwÄfÓ"×+yºù®:Á„MåXZÓzEçífbâ¾Äóÿ×Ú_ëyŸ¥?ÞFR¢‡Í®3w·{Ï<Ʋ]žh®'W\ºuù˜·`½{ÞC@€wí¿ÿá'¾ùÍßLlLì?n›ít2{îš7kL¹²eþq[ŸÏÇÚu‰ŒŒ8ógÜ4™øâTÞ^²Œ6·7á¾ÇÓ¿Wzvïâ×ñ2M“÷ÞÿÃFÛví¯™rkµž¹­ê8ô+6›Í¯o&™&ÜÙ¦-í;Ü&~·¨ëåjü[½k1 k­@ÎJäÎát¼!ô’ÔçâÕ“(UÜÁö]NþHðžÖÈÈö1dA"¯ïrs¸}¤* 9·¶¹B "r}IHHä‘ñO3zäP Ÿíí× øê›ÿ‘’šŠÓåâ»ï¤E“› $&úä†[ÝÌ˾àÈÑ£˜¦É¾ýûYñïԨ^5w››¶àöx8zì8¿þ¾Žòã°Û)]ª[¶l%àDãþ˯¾aïþýþnº±U*W`ÊôY¸Ýnp¹¢Â-dO,ÀÃí"°þí.À ¥LíáWÇj7X52–zÕ‚©Tø„Ý»÷püxBîûdddpàà!“’ñ6?…ËåfÏÞ½=z,÷ÕÍ[¶òå7+Y½â&ŒÃÊ/—òÖâ¥lÛ¾Óoãåñx˜þê<"ó¡IÓ¦*ì~Ìjµbúü/ÙîoîjFâÓù©]:п®ŸÍ`Õ±T¯L™‚vjVfÕÐ"ƒó¦JíÃn'i|<ñà$çF­E‘ëȃ‡˜5gÏ==žÐ૤G +”eøÈ1ø¼^œ.Ï<ù‹Ó<¹O…reèÓ£3ÃGŽ!$8ˆôÌ,^xr òÇ“‘‘AHp›6oáÃ?%##“zukѰáÍØ¬VF Èó/Ná½¥`³ánkÚøªQÍêÕ eâ‹S¹oø B‚ƒUØEäŠqØ ŠŸ!)j%&Ô¿:ªV‹A½’ŽsÚö†R]\ñ¯&’ ¥Ë”!Ànçù§òÈC#q8ü¯œþoåw|öå·x<^&¾4~½ºQ­ZUF?4ŽôŒ ö,+Ï>õn·‡Ç&<‡×ãeú¬ùÜÑj?½ïíÁ«Vóò”x¼> jÕ¬ÎØGæî#33“AÃîgמ}:ìôëÝvmî ::šwßœ‹Ã‘3”Õj¥Jåò$&&ùå5u{<.ŽAÃîçéç_fîÌÉ<8j(£žÀ葃©U³6nâþ1Ó¥ÃtìÐŽ^šÊ²O—S¯v nª#K>üœ×çL&00Ñ?ÎGŸ|É­[—w½ˆßÿXÇÚ?71~ìƒ~Yÿ?ñôDÚwìJ±âÅU°ED®bê͉ˆ\Ž;ÎÒ?æ¡û‡xõ€ ‘DFäŠ ,,ô´Ä²Åb!_ìé«ÙX­ Ì™Ÿ=>. !44䪽ÎE‹¦ß{™óÚëŒ1-£zuÓä‹/¿¡ùmM 9gùòåcаû˜ðìKÊÌY3éß« …N<ÝçOÂÂB±Ûs&ußp;ž@xxII9ó«»=^jըʻK>Î}}˶íÌ›·€F oæ–›伩ñoû ãÙ§ÆùÕÈ€C‡0yúîõaaa*À""×%ÜED®YNZöïj£`œ…ÛíÆgšØ°X®ÞQá™™,Yú1£î¢‹*""rr8 2Œ·ß|ƒ´´4n¨WçŠOÝZ5(Y¬AA9O\¶¹£%6mÞ‚×çeÜÃ#h~[S  (ÀÈ¡}INIÁírÈ‹ŸäãeŸ²c×nZ5oJýú7MVv6­[4¥páB@Î@÷2eJÓ·GÇÓ‡×çÅf³ƒé3éÞå.|>N§‹»;µ§PÁü¬[¿‘ï~ø™o¼KÓÆ7óäø±”/WŸÏÄbÉéì8®«²ãcë×oàËå+x`äPuÞDDD俵%L(Q¢$M[´æõE‹éx×ä‹U`.¢ÌÌL¦¿ú›µ¤d©’œá¡J¹†i„»ˆÈu.&:ŠgŸÇ‹“§sìØq¿;>«Åš›T &2<ŒãÇ“hsG+Ú¶iMíÚµhÖ´ v{IÉÉ”.UŠ!ƒúñêô—¨R©,_,_IzF»“Ý»÷àv»YþÍ íÿ¸ïÔ´tÜnÿ™ãÔ4M~øq¿üú;£F V²]DDDÎ[™2eiÖòNž›ôJî¢òrá²²³yiêLßÖŠ%•l¹)á.""„…†0ö¡‘L›5—=ûöûïq†…Ò®mk,ƒ¡#ࡇÇÓµç ~üi5ï½ÿwuíÍÄI“yiÊ+ìÙ{þ½»B­ZÕ dÒäY<0æ1>ù|9V뙫A‹Å >>–¤¤ÿÉÉþÑ ýêëoÙ·ï=»wQ²]DDD.XLL Ã&Ï`ßþ ÈÊÌÊbÌ£Oй[OJ”(¡€ˆˆ\§4¥ŒˆˆÌ#‡±øÝ%T¯^•Z5ª_ñcêØ®5n— {€=÷µÎÚS®L)6oÙ†Ý@·n¨Y½:†aЯwªW­Äž½ûIOÏ`ÜØ†T®T€°ÐP^6‰?ÿ\ODD8õo¼ÿ­üž¸¸X0 ÜTŸ²eˇÅb¡[—N”+[†°°PìvÇÅ‚…oR¤Haºt¾K…UDDD.šððp†ŽÅä—^dPßî”(^LA9Ç'ð”™ q?Ñ11 ˆˆÈuL wÉBî]˜ñê\Lj×¼²I÷&·6<í5ÀÕ«Q£zµÓ~g±X¨W·õêÖ9Ãß”-Sš²eJç¾ÖòöÛr®c½<Ûç§uËWüš¸Ý½µ˜²¥KÑà¦THEDDä¢ ä¡‡Ç2í•©tn×’òåÊ((ÿÁá#Gyâ¹É<6nG ""rÓ”2""’G@@Cöc×®Ý,ûô LMùìKä p:]ówwjO‰bšGUDDD.«ÕJ—®Ýصÿ_.ÿFmÀ³øiõ/,ÿßj¦d»ˆˆä¡„»ˆˆü£Ûš6&0ÐÁû|ŒÛíV@.±„„DÆOx†ÃP²DqDDDD®ˆ¶íÚã2í,Xô6>ŸO9Á4M–û?֮߯Ý]ºb³ii<ÉK wùG†aÐêöæ/V”i3f+é~ OHàÅÉÓóÀHòÅÆ* """rEÝXÿ&ÊT¬Æì×âÓHwLÓdÑ[‹ÉöZéЩ3‹R*""r:Õ""rNjÕ¬NÓ¦·2wþBRSÓ‹lË¶í¼¾èm3šèè(DDDD®8Ã0¨X±•«×aÒKS¯û¤û»ïHxt~n¼ñ&¬V« ˆˆˆœ‘î""rΪTªH«–-xqÊtÒÒÓ‹dë¶í|òÉç ì×›`DDDDüJÅŠ•hÔ¬%ÏNœLfVÖuwþ^¯—9¯-$,*ž[6Â0  9+%ÜEDä?)Z¸£F á± Ï’š¦‘îjíëøðãÏ6d€’í"×ͺ "×¢Ò¥ËЮãÝŒòùë*éîr¹™9û5J”©H½nTAóh¨a r½QÂ]DDþ³ˆð0Æ?ò c{ŠÄ¤dä<Þ?ü¸Š?þ\ÏÈáƒPPD®ÑÑѤ¤¤(rMÓz.ׯüù ÐoÀž›4•ã ‰×üùffeñÂKS©× 1µj×Vó+GÙ.A®y.—Êù©”p‘óÁ‹Ï?ɤ—_a÷ž½ È´bå÷ìÚ½—ž÷tÁf³) "׈²e˱ÿÀ~B®Y¦i²{÷n *¬`\§bóå£ë=½xõµE9rôš=ÏÄÄ$^c1M[ÜAéÒ¥ôô’œ·ðˆH23³¹f¥§g¡…¤O¡HˆˆÈys8ìL÷0s^[Ⱦýô¸ä9ðz½|þÅr“’éÖµ“"r‰ÏŸŸïWýÁƒ‡.ø;QSËÅ”Sž.¬P™¦É–­Û1mÁØíºY|=‹‹‹£g¯~L™9]»÷\sç—œœÂó/½B“æ­(S¶¬’írAjÕ®Ãäi³ÈÌÌT0äšãtºø¿wß§BÅJ Æ)ÔJ‘ `³ñøcc˜6sMÝBÕ*ªhÏÆçóñî’§}›Ö(—&rí1 ƒ¡Ã‡3mê¬x¨Q£qùòý÷72aÓæí„„†+¨ç«œà+ÿ$++‹ÔÔ4ö8t^1>xø0ë×o 26?=ïí¥¤Ì¡#˜7w6Úµ¢|¹2×Äy9zŒ§ÌdÐÐDDDèBË+^¼8·ßÑŽÇ&—½ûö3yú\F~à`-f/ù;Ø€„ã $&ßújœ›¬Ì,6nXO­:uŒ-“Æ=‘Fl¾|ØlÖ«ªm`0oÎlôîJXhè%Ù‡F¸‹ˆÈEa·Ð¥sÞ{ÿ>Zöw¶¾]A9!Ûéä•s¸ý¶&T®TA¹ø|àp8(^¢„‚q‰ýoÅ·DFV té2 Æe d»üÕj¥GÏ{ygñÛÔ©]ã*œkËÖm¼ûáçŒû¨ÖבKöýCtLŒ‚q <°_íµ ®(=‡"""±qcС}["ÂÃx{ñ¼>ßu“l§“±ãž¢g÷»•l¹ÈœÎl~ÿíw¶oÛ¦`ˆ\AV«•»»tcÕoøþÇUWÕº>¦i²s×n¼õ>V²]DD.˜î""rQ†AÃ[Pªdq澶𺎅Ëåâñ'Ÿcô}CˆË«Â!"r‘:t˜;vññ²O´p·ˆ´»u¿‡C é¼·ä|WÉÀ‹ZͲ/W2rÔýX­V]H¹`J¸‹ˆÈ%Q§vMêÖ®ÉôYsñx¼×Ýù'&&qÿ˜q¾¹˜äL/:vº*çœÿ¥„»ˆˆ\R5ªU¥]›Ö<ýì$ÒÓ3®ùóݵg/ÓfÍeÂcc.ÙŠç""öï#99ȹɻwÏÜn·#â'Ê•/ÏÍšñòÔ™x<¿9.¯ÏÇ[‹ß#:¾0·4l¤ %""î""rÉ+Z„þ}ïeÆ«sI:‘¹ýúûüðÃO<8j8]x‘KÄ0àƒ>È3oûºup: Žˆ)W¾<­ÛväÁ±“íŸO˜øŒ5¿ý~Éö³wß~^ž6‡þƒ‡)Ù.""—•î""rÅÀ}Ãñçú |»â»«"éîr¹™6c6¥J• ÅmMtEDDDþ£€€zõîË?ÿÁ÷?®ºèmÀ»v3cÎBúBHˆ³‘ËK w¹²‘ÅB—ÎHLJâ‹/¿öëcÍÊÎfúÌÙ4¿­ 5«WÓÅ9O6›nÝ{pàh -û좽ïšßÖ²äã/¹oÔh%ÛEDäŠPÂ]DD®|edth߆ÐfÍ™×ëó»cLNIåÙ‰/Ó±C;*V(¯‹&"""r¡m@‹…¦Ín#ÃeòÅòoðùο hš&¿ÿñ'ß­ú{{õÁn·+À""reê7…@DDüÅÍ7ÝHõjU˜÷ú¸Ýn¿9®¤äd¦ÏšKÿ>=)\¨ .”ˆˆˆÈEbÍ[´$=Ûäíw–œWÒÝ4aõ/¿²â‡_éѳV«U‘+F wñ+7Ô­MÓ[oáÉg_¼ QNKRr2Mx–¡ƒú)Ù."""r †Á­›¯`qæ¼¶ð? ¼0M“Ï¿üŠMÛ÷qOž†¡€ŠˆÈ¥„»ˆˆø’%ŠÓóžÎ<3ñe²²²¯ØqìٻɯÌâÙ'#"}€°ÐP]‘KÌ4¡rå*ÜpK¦ÏšGjjÚY·u¹\,|c1a1…¸­ysLSñÿ „»ˆˆø­B 0øÒTŽ=vy:zÀï¬ã£eŸñÔã`Ó """"—UéÒehÞº ÏL|™ÌÌÌÓ~ïõz™:c6e*V£^½zJ¶‹ˆˆ_QÂ]DDüZdD#‡ bڌٗ%éþÛïkYùÝ êß[Év‘+¤@‚ô4”'ž}‘u6æ¾¾aãð4ÍZÜI…Š(ñ;6…@DDü]TT$¾9óp{‹f”/Wö’ìçãO>Çív3|È-¸%"""rÅÛ€ÑÜwÿC|ÿÝJ¾^¹ðÏᣠV€DDÄ/i„»ˆˆ\BCC8 -û”›·\Ô÷öù|,ùàcÀ¤]›ÖJ¶‹ˆˆˆø »ÝNã&M &59‰Ûš·P²]DDüšî""rÕ d䈡|÷ýO|ÿÃOå=MÓdÚ¬¹/V”Ö-[(Ù."""â‡BBB05Y»ˆˆ\”p‘«J€ÍFßÞ=Øà+¿ÿñ‚:^‡ÙóÐàÆzÔ¬QMÉv¹ J¸‹ˆÈUÇj±pw§öKtL,¯ÎœÍkoȬ™ÓÙµs‡‚&""¥†î"""""""Rª”+_‘kn¸•çžzŒÝ»w••Éúu«iÛ± N§“ø2e‰ŒŒbó¦_0)5”p‘RŶmÚuìLNN_ñ)†aàó…_–m[6áp@^n.ééûp8œ ˜ˆˆ”J¸‹ˆˆˆˆˆˆHé`C0 22’ 7Lbëæ_±, —ËEÏÞý™õÖÜ:ñ:F^0„­ÛS§n}ÅMDDJ ½‘R!*:š'¦¼Bl\¶ ÍZ¶fÚ›³1Œ¢qÜÏ8«mÚwdùÒÅŒ¹òZ¢cbp»= œˆˆ”J¸‹ˆˆˆˆˆˆH©àv»©RµZñgÓ4©X©r‰Ïáá´nÛÛV¼DD¤ôÑ2"""""""rRQ²]DDJ+%ÜEDDDDDDDDDDŽ%ÜEDDDDDD¤Tûáûïøà½Y „ˆˆ”zJ¸‹ˆˆˆˆˆˆH©–––ÆæM›)õ”p9 ”p9 ”p9 ”p9 ”p9 ”p9 ”p9 ”p9 ”p9 ”p9 ”p9 œ ˆˆˆˆˆˆˆˆˆœ¬ °, €ÂÂBòòòðx<8HŽ+%ÜEDDDDDD¤T²mûà_°ùl†‚#"®ðÞ»³˜÷õ×dîÏä“O>ÁétrÓ-·˜˜¤ Éq¥„»ˆˆˆˆˆˆˆ”:Û¶måë/¿`õêÕ¤§§1ýÕW°,‹ó.¸PIwÀ¶¡U«ÖLmzq+÷̬,âãâHHHT€ä¸SÂ]DDDDDDDJ—ËÅûïP<4ÀŒ3hÔ¸1¦ip°ñ»ˆHBb"‰ eÙ¹k7PÔ¦G¯žºVÈ ¡ISEDDDDDD¤ÔILL"µ\J‰e¶ ½{÷VMDJðù¼´ëС¸…;@ÇNt­B w)u Î>{8¡P¨x™/ÜGRR²‚#"%½ŒëC0 %%™ÈÈ(FN%ÜEDDDDDD¤Ô±mhа!ÑÑÑÅ˼a^“4¢ˆ.*:šV­[PµJ|>Ÿ‚"'„î"""""""R*y<ZµjÉÜ®};ÂÂ< ŒˆÆétR¿~‚Á Mš7×ÄÊrÂ(á."""""""¥’iš´nÓŽ@ ˆeYtïÑSc2‹È:ó¬nddfÓ¦M[CN§B """""""¥U“¦Mq‡yH(O\\œ"rœœŒ Äcb¢¹hÄø|¾RüzyxêRÂ]DDDDDDDJ-§ÓÉÙC³kçN‘c̶mÖ¬^ÅŠ+0Ì“opŒ˜˜hÞ~û­R}ŒVÈ¢zõjT¨X‰øøxt§Úï-…@DDDDDDäôbÛ6~¿ÿ¤9ÞÚµëA 8)Ž×0 Ün·N49éX–ÅÔ—_¤QÝê\rÞ äX]ƒ;wñÜ‹Ï1ê²±DFE)(§%ÜEDDDDDDN#¹¹¹¼:íeü……„G„ŸÇì/ôcÙ¯½òr©?VÈÎÉÅ4 úH… uÒÉI##=z5«pFçŽ Æ1V¡|9ƽ”'žÂ•W]£I^O!J¸‹ˆÈ)+`k`<‘bû÷ïgÊ3O2~ÌH’’c(c&ÏNy‰}R¾|DJ=ÀU«VÒ¾ecã8)[&‡iPPP€×ëU@N¦B ""§ªﻋ:uj“——§`ˆˆˆˆ›7mbÔÅç)Ù~ÄÆD3vôH>ùø#5‘“‚aÀšÕ«óxŒã(""B׈SŒî""Rª…B!,Ë*þlYV‰›‘C?Û¶M0,þlY³gÏfÖ¬Y%¾ …Jìã`¶m¶/‘S…aÀ²¥K)Ÿš¢`'‘‘º¯”“ˆÃ45´‰È¿¤!eDD¤Ôš5kK—.ÅëõÒ¹sgêԩôiÓhÖ¬-Z´ ''‡^xnݺËÌ™3Ù¶m•+Wæâ‹/fæÌ™¼þúëÄÄÄM=øôÓOùᇨQ£ýû÷ÇétòÜsÏQ³fMÖ®]KVV^x! ,à—_~¡K—.´jÕJ•!"""§+XˆiªíÝñ¤x‹ˆœf×}…@DDJ£M›6qÝu×Q¹rej×®ÍìÙ³q¹\ìØ±ƒ'žx€ 6ðÆoϳÏ>ËçŸNß¾}ÉÊÊâ£>¢U«VƒAêÕ«G³f͘5k=öÍš5ãƒ>`òäÉØ¶Í‡~È-·ÜB¹rå˜7o^x!yyyìܹ“—^z ¿ß¯ ‘S# àP@DDä˜þ®UDD¤4JMM¥U«V̘1ƒììl.¿ür<_|1?üðÛ¶mãù矧E‹”-[–3Î8ƒ]»vñá‡Ò¹sgÎ<óL*V¬ˆ×ë%11‘2eʰdÉÜn7 ,  ñÊ+¯/Ó¹sgúõëGÛ¶m‰ŒŒdøðá 2„ììl€*DDDDDDDDþ’î""R*¹\.ž|òI&L˜ÀܹséÙ³'{öì¡B… œyæ™|ú駬\¹’+®¸€–-[2uêT’““9r$O?ýt‰ò ÃÀápЬY3®¾újüq¾ùæ›â±ÝëÕ«@¥J•p»Ý¸Ýn"""T"""""""ò·)á.""¥ÒòåËyôÑG1M“Aƒ±{÷nòòòp:téÒ…gŸ}–¤¤$’““±m›ÇœùóçÓ¡C7nLzz:–e‘œœÌúõëÙ»w/õë×gáÂ…¬]»–Y³f1gÎ|>.—«xlÍßÏÿûIZEDDDDDDDþˆî""R*Õ¯_Ÿ *ðù石xñbž~úi*Uª@‡HOO§iÓ¦„‡‡c --^x 0~üx\.cÆŒ!22’ü‘0bÄ>úè#rrrèÚµ+gœq©©©”+WŽöíÛIÇŽq:5Ǹˆˆˆˆˆˆˆü5eDD¤Ôºè¢‹ŠÇXw8ìß¿Ÿ÷ߟäädF]¼m¥J•¸öÚk …B8N ànݺԮ]Ã0Šó}úôÁ4ÍâVícÇŽ-Þ¾S§NtìØ€jÕªQµjÕâíDDDDDDDDþŒî""RªL´tÇwP¶lYyäÂÃÃK¬;4‰þûå%~ùý®Åú¡ë&æÿw‘¿¢„»ˆˆœT~øaADDDDDDDJ%õ‘9 ”p‘SÖ³S^`õšµ „ˆˆˆˆˆH)òîûs˜üÈãkÛP(„eÛÇõølÛ.žOLäŸRÂ]DDNY›·l£ ?_)Eö¥¥³f݆¿Üζmî¼û~–-[q\ïûñâ˯¨¢äÿ¢1ÜEDDDDDD䨺ýîÉÎÉaò½·ÿå¶6üJJj Þ°°ãv|û …B”)¯Ê9Á xuúLôïÅüo¾Ã²,Z¶hJjJ /M΢ŸWbÙ–mÓ¤Q¶lÝÆ·ßÿÈ–-ÛhÞ¬1-[4Ãçõ’–žÁç_~M‹fMX÷Ëz:´kÃ˯¼Á þ½Y¼d)›6o¥s§vÔ¨^ €`(ÄÒ¥ËY´x)n·‹Í›R§vMÖý²7f¾Mæþ,bcb8 ¦©6Ëò÷él‘£Êt˜8$¨,ËÆïƒÅÛåäär罓ٵk7–e/÷–XfYÁ`Û¶‹ÿôûýƒÁâ¿ʲ, ýìCR„B!æ|ô)?üøS‰c‘# ñÌ ¯0éö{‰g_Z:CÏEȲèÔ±-ÑQ´iÝ‚ªU*³o_޼‚ˆðp ìËì9sÿäÇ\Orxà᧸ãîØ—–Ža<þÌË\wÓÈÎÍ¥bÅòœÉìÞ³Û¶yã™ü÷©)têØ–Š+pÓ¤;ùâ«y¤¦$S¹B9jÕ¬FÛ¶­0 C•$ÿˆZ¸‹ˆˆˆˆˆˆÈ1³k÷.ž|úy:wjχÍÅëõÒ«G7Ú´nÁ5×ÝÌÆÍÛ¸ëÞÉŒ3Šúuëðú›o³xñRrrs©^µ2—]z1ÑQQ¬ûe=¯M“:uj‘••Ͱ¡¹ùÖ»>l³ç|Lnn>­[·`øÐAdìÏäégžg˶í„û¼´mÛŠýúðÅWóycæ;xÜn2ögrîð¡J¨‰”ã.IZ5iݲïÍþ„+VQ«fu"#ÂIJL :*’û|„áCúÑ»g7î¼íj7?ƒñãFE/ø&^ Õ«U)z1‡Í€¾½è×§'óæË7ß~O¿Þ=xë½¹íæë©Q½5ªW#ðóõ×ßб}[bcc…,’t}L w9fBÁóüHíÚ5¹öš+Y»î&Nº‹OæÌäÖ[n`ü„‰ÜxÝUT©\‰ßýÀì?åáîÄë ã­·ßcÒí÷ò߇ÐÏó¾£jÕʜѥ#?.ZF¥ŠåyñòóówõD:´kCÙ2ñÜ<évš7oʸ±—±k×n~ô Ê–‰§sÇv|úéç´nÝ‚žÝÏR2M¤0 ƒJ* ó›—‡ :]êæM[øæ»…|1ïÛâe^[·n#&&˲¨^­Jq™µkT¡Eó¦ÅÛÆÅÅâ/ôcÛ6ëÝÊ=<Šé(ê“C¹”Ä¢ÉRmÕ‰üÿ”p‘c*:*‚ÝÎ$>.–ˆpÑ1Qlݺ2eÊàt8ðù¼8ž{a*CõÃãq …8ëÌ.¼8mééÄFG2°_¢¢"ÉÊÊ&,ÌCîgQµJ%‚Á ëÕbý†_ ÷ùøuÓ6ÆŒEaa±±ÑÔ­S‹%K–Ѿmœ.'áááx<UŽH)a’å¶m›¸ØØÃ¶1Lƒ3:·ã‚sÏÆ¶½ÆD±cçÎö·,¯×{Äý™¦Áøq—R³Fµâe‡—Ë¥ÊE w9¦|Þ0"#‹?‡%µlÛfïÞ4^š6·g½_¼,%© 9¹y@Q«×¨¨HLÓ$>.†J+—êñ¸°l‹ý™ÙÜ~÷¸œE©@ @ËæM‹Çr‘ÒÏ8p½°ì¢ùš6m‚ï~$6&Ó4)(,äÇŸÑ®më?,ãH?ó¦iÒ¦ecöíÛKë–Í0 ƒU«×ât9‰‰Æ0 °m[½`äSÂ]DDDDDDDŽ+÷Ûý»e–e3p@Î6¤8Ifàr¹ÈÈÈ8rYæáÉ0Ÿ7Œ»ï¸…ŠåË—c˜fqòL)4‘ǶmB'E¶!(9q(daÛE?ûõêտ婝±gÏÎ6˜%?/eÔ˜«èÜ¡ ß~¿ˆ¶­ša´k@aà÷!Ûlß¾ƒØ˜è¢O–…mÛ8.5‚Ë®¼‘uëÖËÛïÌß @›6­¹pÔx½^†B˜zÃÈ? „»ˆˆˆˆÈ1 ÆPÇ)Îb­x{j,Ç‚iضENN¡PˆÑ£F0ûùôêÖ•ÄÄÖ¬ý…%K—O„z$……~|¿2ÂëõRµJ–/[NùÔTo¾=‹† êS¿nm<›·l#hø‘ oïtíÒ (ê¹òÆ´gð†…Eú›6m!<ÜGXX?xËW¬";;›[oêBbbY 1!Y¯?ÈõÅdò½·‘œœT¼ìœáCŠ_ö5lPŸ9o¿ÂÒå+‰ŽŽbð Å=hªU­ÌËSþ{ÄÞ8"E w‘£,;;›U+W’›—û—aY¦i*˜aïyꉧ¨^³¦‚ñg좱qÿßnñ¶eS³VMâbãð…‡+žò—¢"#p¸†™¦IBÙx¶)7 ƒ¤Ä²˜¦ItTgÙ…û'?Êùç ¥WϳX½f5ã'L$Ìã!<ÜÇ5WÀétP¶Lñ> à 1¡ ùyù†€(ÇÙíræá†ë®â¾aæ;NTT$gÀe£.æª 7‘™™ÅUW^ŽÃáP¥‰G‰ e‹ÿît:©U³z‰ŸíjU+óxJ¬w»\4mÜð°2ÃÂ<‡•SµJåÛ¤¦$—øG—NíxŒÕ«VQEÉÿE w‘£hÕª•|õéÇ\táp<îÿ¿ûñ—_}M§Nпоy= ÃÔˉ¿›—KFÆ~Ê¥¦þ_ß·±ÉÈØÏsÏ<ɰs/ ))IA•?ué%w‹HJJä¾{nÇí.j%Áäûï,n•~Ñç0lÈ\.7›‰×_KVV¶m^ܵfêáÆëÆãtþ»[í¨¨(Ê”‰WPå¨Ë ÀuN•-S†&Œãžûe 7)¨ò§ E‰ðˆCzF†Qâ³Ãá ""âÏ&±±1‡•ét:‰8äÚúûr ( _âÜóvä—Ÿê­!""Ç€šˆˆÈ)Ë(zS Dä¸Ù±c;íÚ´ø×Év‘Ò*Üç£V*lß¶MÁ9= ˆÈ1ãX¿þWvïÙËÁñEŽÀ»ö°hñRögæ( r Ù4lP—ȈM¨$,^¸¶-ž˜3Ѷùiá²²sèЮUñ ÇêÕkÙ¹kmZ5Çë Ó‰pŠ‹ŠŠ" *""""G „»ˆiéÜõÀdzíBT¹HDŽ?ÃÀá3ñ$¸ð•STŽ˲™·â~µœ›&\}XWv9½„, Ç}‚ÎE‹™o¿ÃìOæñí—ïׄûÜϾ`ÚôwølΛJ¸‹ˆˆÈß Ùðë&*”/§{9e(á."ÇÄ]NæÒëÎ'2*BÁÀð/ ‰ñ¤VHQ<ä˜*_9•Š•Ëóà£ÿå?7Ý €Èqq˜E‡œ”ðP…8†±mÛ0ü–eÛøý~Âú„[o¿—)O=Bxx8¶m“M0ÂérŽišXVÑòȨHrss …BDFDàp8ÈËËã›o¿£jåÊ$%&îò,rrr…B¸\n""‹srˆ'77˲ˆˆŒÄašäååññÜÏiP¯.å˧þaã‘#QÂ]DŽº_Öo V½Z „ˆœV âÊÔ¸ÆrœìߟÉuÿþ´ýŒ}1;wïæçe«Š×çæå1fü T¯V‰I¯åÅ©¯1þÚ[˜ñÊs$&$pë÷2jÜ(>žû<ôA¿Ÿúòä3ÏñÖ¬èÕ½3]»tâ?w=Șñ×óÖô‰câ¤;صk/W»”ôŒ f¼õÁoÇ•™Å%£Ç“X6ž)O=Âg_|ÍÝ÷?J½ºµIMIVʼnœ&–/_Éý“#µ\* ë×庛n#';—›n¸ŠÖ-›ÿ«²ßÿàC7nHÕÑ Ö¶mÞy÷}š4nDêUUa"ÇÑæ-[Ù²m=|®C&šïٽ͚4Æã)ZæåiÓy÷ƒ0L§Ã¤w39ÿÜaääæÑwðù\såhf¾ý.Ù9¹Ô¯S“I7ßÀÌ·gñÚ³÷yéÒy×^5–)/LããO¿ °°˜è(† êG¿>=ÉÍÍcô¸kéß·ï¾7‡¼ü|Z5oÂUWŽåÕéoòÞìOøü«ùøz÷½zvã­w?dþüoèÔ±_Îûž‹ÎÂð³Ñ¿oO–/_‰×ç%7/Ï¿\@bRY&Ýt=c.Á}“Ÿàµ7f2tðV¯ÛÈ9Cú0x`_ Ãà§EKY¾r5?ý´¼¼š6mL ¢zõjX–Å3g1aüUœÈi`Óæ-ÜpóíÜw÷­4¬_€s‡ 拯æqßäÇyóÕ)x< ùiá"rrrHLL¤aƒz8òó X¸x -š5aÙòUƒš4nˆÇãaÑâŸùâëùøƒAlÛ¦ZÕ*äåå³hÉÏäçåQ®\9êÔ®  §µrõêÖ©Å’Ÿ—ašM5Äét²xÉR>žûÁ`ˆèèHTq"ÇɧŸ}Å]:6ߌÓé åÀËùµëÖóÚŒwøïC÷P§vM6üº‘ó.KÇ퉋!#3›UkÖò³ÿ% Ò¦sF^2‚ Ï?—/æ}ÇØK/¦Eó&,Zò3ïÍù˜Ç¾—ªU*óëÆMŒ:´Ãáp°bõ/´oÛŠ©/>MNvÝûcÔÈ\:r?,\Â%#ΣM«æª4ùG”p?Í„B!²²²Á€ü‚2³²°B†a¥n¾rÔØØ%E­? ñ¸=`”3Ö¶Ûþ÷Ë Ã bš‡£ø{éû2¸ýºûyä…»‰‹)ÚÞì¢n¦çˆåBQ÷Q·ÛU\Ö¡ŸEDDNûö¥Р~íâ‡Ô˜è߆jX³n¦Ã䓹_°hÑÏtj×—Ûî={q˜&)ÉIx½^Z´h@VVûÒ÷3|pßⲪV©LȲس{[¶nÇåtYü»µAÝZÅ ÷œœ“Ÿ.aû¶í´hÚ@À¯J9M¬Zµ†¦Р^½Ë»tê@Çömq8úýŒ¾âÜ.Í›6bê«3hÖ´®GfV£¯¼‘óÎîO„ÏËž½û˜tÇ|:g&6l`í/IIJ$1!Ô”d.=ž”äjV«Âë3Þ¦SÇö\pÞ0²²³¹õŽûiÕ¢ q1Qlݶƒg¦LeÊS°aönßɆ ¿Ò¨a}%ÜEŽ£]»÷иaý?ÝfåªU4oÚš5ªß‹$”‰cÕê5´kÛšÜüBÎ6ǃÇã¡Sû–ü²~•*–»h€Í›6Ó¸~lËbï¿bš&ÁÅÎ]»)W.…ü?CõÃåtCÅŠåøñ§%ôèv6`[–*Lþ1%ÜO3¶msþÅ—ãt8ÈÌÊfá’e`CrRO=þ$Ç„aÀòÅ+™úÌkdîÏ"*:Š! ¤e»fÌzã}>›ý·=t eâ1 ƒn}„­›¶rÝíWÍ OcÍʵ˜¦AËö-9÷’¡¬Y±–Çî}мœ|îž8™>ƒ»Óoh–/YÉs½ˆ¿ÐO…rìš IDATTt$WÝ<ŽrSIOËà?WßÉÙ#ñë/[øö«ïH)—Âw]à Océ¢etêÖÁçöÇéÒ¥QDDJ¿ø¸8Öýò+Úµ%’™™}à¦Ô«ËÌ·g3lèÎêz–m †p:dfeac³{ï^B!‹¥Ë–“˜˜@ddq±Ñ,_½¶øÅô¶íÛ1 ƒääd*W,O "33˲0M“e«ÖWl\ÁPˆ.ÚsɈs±,«hìU§C•&ršøpîçtîØŽ#µçr8Š®~ô)†éàÉÇÄår1üì!4l}ýûö&""Ã0hѬ ]:w  Q§Yg6nÚÌÀýxãíš4jÀ²«2¨ßaë.— ¿ßO¹”¤s,T®\‘í;va…)ɉÅëŽÔtβ³sX·a#ïÎþ¸¸¡@÷3;ƒeYür©É¨-ªü[šä4ãt:éÖµ3{Ó2ð‚ìÝ—Áî½itëÖU­Ûå˜ÙŸžÉ¤«ï!"2’[¸‘&-qÇu÷³uó6êÔ¯Í/«7óÉ{ŸaéûYüÃÏäåú©P¹<3_™Å¼ÏpåÄ1\4öf¼üoN{‡ÔŠ©´ëÒ€~g÷¤a³ìÚ¹›‰ãn'¾L<7Üy …….v5™û³°-‹UK×óü_aýÚõdgå2ï³ï¸fäD¶oÝInvÏL~™o¿ú^&""'_¸Ø˜(f¼õß|û=¯½1ƒuë7?`6mÒ·Çų?bÅÊÕ¼ðâT&Þr;+V®":*’–MðÞŸðñÜÏyö‡\<ú¾üêk¼aa4ªW‹5k×óæ[³øî‡Ÿxsæ, ýúõíEl\,Q‘á|5ÿ;>žû9o½ó+W­+>®ºujc…,>ûâ+–._Á˯Lç¦Iw°fÝzUšÈi¢¨÷¨ûO·Y½z5íZ5ÇårN£z5ؾc'Ùy…´iÓ Ã0p:´hR´´Œeض͞={ø yñ¥©<ûÜ ¼ýλ¸œvîÚ @f^Íš4Â0 ¼Þ0Z6®Ã:]DN¨¦Mòý ‹NÊÎÉẉ·²}ÇN¢££Y¶b ¡CZ˜/[¾Š åSù«~é×@tt$©)I\}Åh&ŒSôßUciX¿.ü­îÊ•É?§„ûi¨c‡¶%’ë†aÒ¹C;FŽ™´½éä°uÓvrsòè5¨;3?ŸFjùªÖ¨L\™Þ}c6……~vïØMÚÞLFO¸ˆP(Äì·æRP`ç¶T®V‰×?z‘! $.>–FÍ‹º ÕmX‡ª5ªðÁÌñ8£gGÂÃÃ|^r²óX½ì·Vwn‡»¹•Ç^ºŸÂ‚6p×£“xàÙ»(,°uË6 +#""'…2ññ\~éò {Íͤ§í§zÕŠìJËÛ&.6–îšÄž´ý :ï2¾þæ:´oC“Æ q»ÝŒ=ŠjU+1þúÛxqÚ\1zû÷Ãår1þŠ1ôíy&÷?ò Œºš|'¹›òåRp»\Ü{ûD‚!›ën¾›µëÖsö Þddæ‚ eËÄóìâõz|Þæ|ü-Z4¥N­ª4‘ÓD»6-Y±bå×L°ƒ|>oÉ…i’Ÿ_@Ȳñ†yŠ×Ù6ü¾Ù©mC0"!±, Ô§AÃÔoPŸ'¹›èClÙvQóƒ|^/j¾*rb•/_޳ºvdüµ7³pñ6nÚÌ?-â¾!9)‰Ä„²4kÚ„ÅËW3÷ÓÏÙ³w/ï}0§ÃA›Ö-ð¸Ý„¬?~noÖ¸>_}=Ÿ;wѼys¾úæ'æÏ_@zzK~^Æàá‘“›û—ÇY½J%ÿü3iéª4ùG4nÂi¨b…òÄÆD‘ž‘ @‡¶Íñ…û9f*U«Hß¡ÝùzîÆžw^Ÿ‡îýºrÉàõywÃ(î¼a2Û6ogÑ÷?_6†*Õ+ãp8˜ôàõ<ûÈ ÜwËc¸=.ÊUJaÒ}7P¾Rêo/£üeëÆmL{öu"£"°m›†Íj Š¥EÛÆØ€×çö¡u‡f`@™„x‹€?  ‘“F¯ÝèÑíL‚Á .WÑ\$OCq÷ëÖ­ZðÖôf„, ‡i–è–]»V {ø¾óù}ç`£Œ””$n¼î*®Ÿp%–möÝvm[óÑ{-0 £ø;W޽¬x›&òò”'Š÷{èv"rêkÕ¢)×Þø>7m¦r¥ŠE·ìÀêÕk¹òš‰Ìxíyj֬ŗópö˜¦Iaa! —®fÒ¹%þŒišÅs<ÅÆÆ°aãZµlŽaX–Ezzññqì=0×Ų)ÑzVDާÃÁ5ãÇ2磹¼ûîlö¥¥Ní:µ¸àÜa8NÊ–‰gú‹OðâK¯0{Î'ÄÄDñà}·Y4üË^KÜ[T«R‰ÈˆúöîÁ³S^äù^æÖ[ndÆ´gxyÚk¼ùÎûÄÇFsÓ WNNn.}»µ/QN•JŠ÷1tpžq*³Þ›ÍÈ‹ÎWÅÉß?Ç‚ÓOttU*W"=c)¶mS³Fu\N rì†Á¥ã/漑ÃHۛΫSÞàÝ7>¤Mç–4nÞúëR&!–¿läµ)3iÒª>qeb‹æMëñÐs÷Ÿ_ÀüϿ噇^âþIñä«v·Y4ÖãåFR·amlÛÆ¶m\.Y™YŽ¥ä·"£"JÞq‹ˆˆœdLÓ,ºáHImówÉòë óÆV7Œ¢ÉÊÿhäõƒã0ºýßݯˆœÚªW«J¯g2~ÂMtêЖš5«óýw?°tÅjn™8ø¸8zõ<‹)/½Æ÷<@ŸÞ=yþÅ©ôíÖ‘ºuj  Cxí騶%ï¼÷>~¿ŸóÎNŸçrß3p@?>úä32Ò3øÏ¤þòÚÙ²y#fÏù¯7ŒêU«¨âDŽóýKŸ^ÝéÕã,ü~?N§³Do”ƒ×’;ï˜D0P4LÕ¡÷L¾·Ä½È¸Ñ£0Í¢{‘J+p×퓊×Õ¬Q»n¿…@ €Çã)¾g‰ç¡î.QÎå—]‚y`}Õ*•¹ëöIj4 ÿ˜²¬§©K.:ïZL¡?H·³ÎP@ä˜ÚøË&^i&Îê@ý&uiÔ¼>ó>ûû@°ÈèHê6ªÅCw7íº6gÜõ—b*U Nƒ|øö§¸\Núë˸/á…ǧóòSïдuzêF¹J©dìËÀÀ :ØeÔfÏöl¬CºîÞ™…R—R‘£¡fêÔ¬Q3ºt<âúÄ„²ôì~ÖaËMÓ¤{·3K,ëЮM‰ïÕõŒŸ{t?ó°rÂ}¾ÃÊiH9©)ɤ¦$«¢DDä¨RÂý4åóyiѬM›4R0ä˜s8LF¿ˆ‹Ç^@~~aÞ0œæ7ÐVÈb×öÝ8œ&ÝúžËå80¤L}{ùAü…~N—£¸›Y\™Xšr¶mcš&§ƒþÃúÒkPOü~?§Ó‰mÙDÇF3ëëW1LÛ¶ñ…ûX±ïóâcp¹\lÈþ¦Äøµ"""""""""ÿ„î§)Ó4iѼ)•*VP0ä¸s¦ÛÄåv•Xž¾/—žz…ïç-¢výjôؽÄzÃ0p¹œ¸\G¾\9·Ü0 ÜnîßíÇ0 Ü÷~û,""""""""òO(á~šZ¶|%éééøý…ÔªYCA‘sr¹p»Ý :·7]ztÆ£¤·ˆˆˆˆˆˆˆˆœ¤”p?ÍdfeñäÓÏS±B*C‡ "//9ÍeÎGŸ1îò‘JvÊqɸ.G£¸ˆˆˆˆˆˆˆˆÈÉÎTN¹yyÜòŸ{¸lÔEœ;ül\N'ÑQQœsö`ìÃ÷>H0R ä¸S²]DDDDDDDDNJ¸Ÿ&víÚÍ÷LæÎÛn">.ö°õ+”gÌe—0é¶»ÉËËWÀDDDDDDDDDDþ!%ÜO›·lå¿O?Ïn¹ž˜è¨?Ü.%9‰+ÆŒbò£O°w_š'"""""""""ò(á~Š[µf-¯½1“;&݈7,ì/·OINæê+FsÿäGÙ¹k·("""""""""ò7)á~ [²t9ß}ÿÆÃétüíïEFFrëM×óæ[³Xµz­)"""""""""ò7(á~Šúôó/Y½z #ÎŽÇãþÇߊŠäÒ‘#øôó/X¾r•*"""rÙ›bgfè„ìÛ6ì `ٽ횂!û¸—eÆ=ABÖ?Û_AÀfÝ®ëvØbÝ®kwޏ]V¥“ODDDä4§„û)ƶmæ|<—¼¼|† ŒÃáø¿Ëò†…1vô(|û=?.\¬àŠˆˆˆœ$^_Ã?É>îûÝ—bÄã{™8c?¡¿H¤Û6Ô¾méyÇ'I Úô{jûrþÙþ¶ì ÐõÑ}¼üa&_­ÌçÅÙ™Ôº{ÏaÛed¹è‰}ŒŸ¦¹DDDDNgJ¸ŸB,Ëâ¥iÓñy½ôíÝÓ4þu™N§“Q_ÈÏK—1ÿ›o±m[)El›?mMþG·oöŸ¬;¸¾Ä½¦}ø²ßûi“Ÿ eL]—ÓøãýþÙ=­}tc`rÜÃ`oVèï¯Ew_\†!­"¸í‚8¾MR¼‹—Ɣṕ~¶eubŠˆˆˆœ¦œ Á©! ñü‹ÓhÞ¼ 6À0Œ£V¶Ãá`ÔÅ2ûÃOx÷ý9ôïÛ먖/""""ÿŸ%› ™¿0—|¿Mbœ“!# +jSShÙ|øS«-¤\²›¾­"ðº‹îá¬-`Ùê|r -*•÷зE8n§ÁŽô ß,Î%)ÕÃâåy\54Ž@Ðæõ/²Ø¶/Ht˜AÇæáÔ+ï9âñ¬Ù r¼“0בï·g„xÿ›l¬€E¿‘pÈfy3>Í$#×"ÖkÒ­M•]Åë?Z˜Ë¶m~\açœÛa`߬ÊgÑÊ|ü!›„CºD~àß¹}·¿ÊÆ ´kΡïöçYLÿ$“Ì|‹øp“Þí"H‰wñ¸ ÃÀ £(iämÀë1”ê$#×¢\¬ÎO‘Ó‘Z¸Ÿ/N}† ëѤQÃc’ 7 ƒ>½ºc˜&s?û’P(¤À‹ˆˆˆœ@{³BŒ}!ƒ”T7][ES`q׬ýÅë¿\[È–]AšÖóñÅÊžÿ¢hˆ™íi.ŸšArª›Ö }|¼$Ÿ7¿Ï ;ßâö/ó˜± ‡¤8A F=·õsFË] }*µÛüG<¦¼‹„È#ß‹îÚ¤Üí»qº *UðpÅ+p ¿íØ\ôÄ^6¤‡èÚ*‚ÈH“Ú§‘™o²àÉ3yÿ§<*Vö´`èc{ÉóÛ¬Ýî§Ã DDš4¯çc é²+#H¹;÷àtﻮ ¯ïgÕqíóý6—<¾—Ì€MçøÂMRØÇ¾ìwknGQò]DDä¤dÿODþOjá~’ËËÏç‘ÇždЀ¾ÔªYã˜ï¯Ÿž|ñÕ<¦¿ñÃÏŒÓéP%ˆˆˆˆœ¿EnȦf²‹ZåÜ4©äÁ:d|”Jnƒ‘½¢qšq>ƒK¦d0æ¬(b"||}YâÂX;ÙügF&ÃÛDP‚ûDS>ÑÅŽ´ «w‡xóŠ2¤Æ9hZÉÍ¢5…|±<ŸšåÜ%'d³m‹Ÿfå}G<Þ©ósZÃͨîÑ$—uñîý{ظ/À{;B^“€i@à n¾Ù`Ö‚†uˆäÉoóywL<5’\Xõ}TªT@ ds׬Lnmëcd÷ê–w‘xÓnîÊ ñÉŠzWt1¦wѺʉNªÜ¹ ض/Àò´Ó®.‹ÇaШ¢›…¿úùay½ÚDþ«zñ:aǾ õRÝ:IED䤲lÒ32Hõ&ŸÒÿμ¼| ظi ;wí!/¿Ÿ7ì·aïlHNN *2‚¸¸X\NnÇ£×ò—”p?‰egçððcOrÁyè\©âqÛo—NX´øgž~öyF_v .§N#‘ã-9ÞŰ>.y!ƒÆeLÕôp~ÇH"EÕ*¹q˜Ó'1Ê߂ aLû,›õ;dùm2 lüøLrZ%Â$2²¨QEÐo±%×âŽ×Òñ&fù¾¾èÃ]\ýô^v†ñx·oõÓ¾ÊoIè:).°ŠÚЭÝÄç€kŸÛWô kÃÚ}!êÇ™ìÉ ²z¿EÕÃ˘&t­Sô@œ–bT§ßöî F¼ƒ!nеÆoCß$E;ÀƒeÛü¤aâóiÅcÙÿ¼;H«*ÿnW§Ã`xÇn™¾Ÿ<¿Mÿæá:Q¥ô9ͦåú«yÈ4\ªÈo, †ŸsÏ=ÿ½ÎìHófMN©Ÿ˲X¹j ³?ü„‚€E»©P¡"µœS ƒCA–­ÙºukÙôë/DøÂhÔ°­[6'&&ÓÔà!r„{B…àä´{Ï^ê9ÆMÙ2ñÇ}ÿM›4"22’»îÌ×^…צJ‘R!²(È/À0 ‚ùù…äåæàõ…é¡JDN†ûEsY×H6n÷3nf&ßlðÚ˜2E7ú£Ä¶ÿ|ÿ‡f,*à+â)_ÖÅÜŸóxཬâmMãŽäD¹ FõŠ&9Öqp>Ïá×Òþ-}<1?ŒìIq‡?f„G:HÏý-¡žkïȶ!φkÏŽ-΀×eà4² ,b¼¿=ÔþKË-™$_—cátØ6lÝÿÛ1…ûÀþl’¢LbpÕXæoå…{þýï§eS%ÁID—NR)•üA‹Å?/¥yÓ&§ðý`ˆ5k×±iÓf¶nÛNÈvPè/ÄãöpèËÄç #::š2eËR©Byt’Èi-""‚+Ç_Í×_}ÉOOaÄùçqRÿ›ögf2oþ–¯^O‹–­9û¼‹ˆ)¾ù+III4jÜÀÜÜ|¶oßΗß.fÓÆ ”KŒ§IÓÆT¯ZE'üv?¨œ|¶mßÁëo¾}Â’íÕ¨^•‘σ<Áøq—¥Ê‘nÏ®½\vöx>ÓTƒ 9½†A§Î]ؽ«÷N~œÁzÒ¨Aý“®5÷Î]»ùöûY¹æWúD».=K\ÿɵóàŸ^¯—jÕªQ­Z5 ã öíKcþ¼¯™þæ{ôîÖ™jU«­üØéN ÷“̮ݻyä¿Os×m7—ŠVååË¥2îò‘Lºý^î»ëV|^¯*IDN¨äÔDš·©ÇŠŸ×Ý,šEÉ•Ví›áõ…ýe·b‘“Ex˜É³s³™:?—êÜü°²€;zGöÇÖ £Úø¸xê~®y5u›ý ëAÆþ×¾žÁUg–L”ÇG:¸¬kW¿¾ŸúI9„ Ø“âå+˱üØX'þà‘¯³ý›øxá«\úMÞCÙp“˜(´ÂOŒqòø^.y&ºåœæYäo^†Óa0²½k^ßOýÔÒ²,&wôQ>ÎÉågF1àѽ |pñ‘&¿ì ñîð(|nƒÖÕ<ø è?y‰QlÔ‰)ŠM¹x#{¸tJ: +ºÈH âw̸âßßËZ6$Äé1KJ/Ó4zöp6lØÀ­wÜÏ5WŽ&)1á¤íX¶|o¾óš4§K·>ôðxþVbжÁét’˜˜Hbb"mڶŲ,iiiL{6Û·l¢oï4mÒ0G½%å´’˜”Äøk®eî'óõ¼o¹tä…„û|¥ú˜mòóóyiÚtr œ=ì:víuL^Ø6ÄÇÇÓÀ@‚Á Û·mãÁGŸ¦~ÝôëÝ£h¼w]3NKº<‰¬Z½†÷fÌÝ·ßLX)j…÷Nä¶;ïçºk®8¡­îED:woSœp-ºôl¯d»ˆœRâ"t0Γh~®@ À‡ÊŠ5¿Ð¦]G®špaaþíížišx<RRR¸àÂäåå³{÷.¦L‹ Ý»u=®s¨‰œh.—‹Þ}ú°wï>ž|îªW)Gß^Ýq8¥îXý~?¯Ïx‹ÝéÙôê݇ää”ã¶o§ÓIÅJ•¸úÚëÙ¾mS¦Í$Ìiqîð¡jœzRÂý$±lùJ>þôsn˜pe©ìÂÅ­7_ǽ>ƘKGš’¢J‘¦|¥ò¸ÜNþ µêW!&FÝúDäÔí3‰ö>tÉïÇPw» ª”ûm¸”äX'ɱ¿m“rÈö•S//5Þ ñýèТª‡Ç?Ê¢U-/U“]ü>}á 6â·ôª©¿íË*&¸€#}^îŽ!&Ü$&üÈ÷”v'窤–ܮŸìïP…!›ü€Ã€<ÿ‘³yÍâulαˆtè䔓BDDÃÎ9—%‹sßCO0¸OjÕ¬Qª9 ±xÉÏÌþäËÿ±wßáQT_Ç¿3Û³›Þ@B•Þ{o"J)Ò¤wå'* ¢ ( *APD¥Q¤#ExEiÒ{Iï[çý#Œ`¥%á|ž‡‡lvwöΙ›Ù™3wÎ¥^ýF&LžF\²‹Š•«P¸ÈÃK¶ÿž¦ADd$ý ÂâÊ˯Nä·'q»ÝÒ‰’}ÈÆn&Û/\¼Dg;猥×óâ¨a,X´ »ÝA¹ÇJˆBwÔ,-l`ùðŒc]t©iãN—‚ ,‚Å(µZEýûÕéhÓ®±±1Ìœ»‚ùBèÒ©ÃÑéÑ49ƇͧvýÆ õ&“é¡¶Éh4Ò¬y jծæÍßsåüi<ß o›M:’xdηêÕo@ÕjÕ9üë/Ì™·€Ç[4¥Vªè ·ßávÏ÷ ›·lcã¦-tìÜ•‘£_$úúuNœ<™-cUºtiŠ-Êæï¿ã³U_2bèÀl1/£¸$áž-\ò)ò磮2ké IDATSÇvä¤Ãv£ÑÈs=žå³U_C£uec !(MӨݰŸ/[‡_€/¥‹”úíBñÀN,É5ÉvU%KMû?;ƒÒ©àe’d»ÈùWišÆ©ÓgxgúLvì=Ä3ÝûP¿ACüýü²m¬òäÉCï~ýðò eìøIœ={N:‘x¤öF£‘ÇÊ–åùþ¨Y¯[và•7¦òõÚ œ³O0C‡¢té2Ùºìò_î/úôãâµx>^°„Ĥ$ëõ¹ŽŒpÏf\n7“Þ™F‡¶OR¢xDŽ^NG›'Ÿ êÛïXº|%;¶Ëq;C!î§ÓuïguY(ŠB¹ÊYªN‡Sr¿( úl5âL!„wïfâ½ïóýIIN&*j';F«©T¡&“ îÞÌYàp88{îó-#<¢]»÷yè¥cþm¬*U®L¹òåø|åJ¼L*;¶Åh4JGÔ>Ãßߟ¶íÚãv»q8þõW>Yò{:%ŠGP²x$ùó…àïª*Ü)Ûìñx¸v=šÍ[¶qôØ Š•(IË–­¨ßÄ’+òJŠ¢Ð¢e+bccyeÂd$ãž Ï%Ù‡Ýîàí©ïÑ­k' ,+ÖIQš5iÄþ™ûÑ|úöêqÏȄș _¯Œâôoç ùÏËHJJÄÇÇWú7R’ÓØ½éû¶’`üå ®EQ0þÛ ¡ÝnÇîN¡LùÒÔnXM*„Bä2ªªâíãC‡ŽIKKçÚµ«,]¹–KçOQ,œêÕª^¤ÐZv||"ë£6røØ êÖoD¿Cñööα±Òë <Ýù~ûí8oNžF¿ÞÝ¥‰G’N§Ãb±P©re*W©ŒÃá$)) {z:×ÒøíÜ1®]»†Ëykp”ÓéÄ`0 Ó鉌Œ vƒf´n×½^—+Ç«ðÂØqlŒÚ(&—‘„{6‘n·3ñ­wéÞ­s®I¶ß¤( •+VÀét±pɧ<Û¥½t=ñèñx<,ýèsšÔ¨Ï€.½ïj9þ+V Š{"::½^ß]ܪm·;Øðí&öî<@ÕZ¥ŒB‘ iZFâ‚ Q¨P!< ÎóóÑSlüa©É‰øûX  ÀÛfÃj³¡ê²ŽFU€¤¤d.]ºÌ±S版,Nxñ²4{¢=Š’{nˆˆ¤ï€!,X0Ÿ¸Øé<â‘ßw ²î”¿~Ï~ÎmL&3­Ÿl-7Àç2’õÌbbb™<õ=F DHHp®]ÏÕªàm³1ýýÔ¿¯ÌÈ,9»ƒÇ —¤ò]&Ê=Ï}¯)-†Çsw}Êd2òx󦌟0‘òUÊÈdaB!D.§iƒ« (Hoü.ãx"==””®\¹ŒËîÎ|ÓáÀ`4bó ¡a¹j4Ñé²”¤Ëm‡¸‹…çûàÀÒa„ø“ýˆ8äF’pÈ¢£c˜:}&/ŽF@€®_ß2¥Kb6›˜2í}†ˆÍj•N öüBÙˆÒ9²íMÓ¤$”øëƒ ½žˆbňŽ'4,X"„B.œ¾tW%;§Óɬ9ñâ˯I™ñ·ä¢ŒB!„BˆG™$Ü’ÃGŽòÝ÷?0¨¬V¯GnýCB‚>¤? –|ʥ˗¥CˆGƒª’3fßðíwL|{qkðñã'XûíÖþ}?¤ß ‘Ò…B!„BqßHI™‡àç_~eý†MŒ6ý#¾™ó4$'§ iL&iiéX,ŒÆ?¯ï­iiiiÄÄÆ¡iþ~xyYÑ4äädEÁÇÇÈ(u“”œŒNU±ÙlØívRÓÒ¸~=†ÐÐ`¬^^èõz’SR˜;o>GŽ$)) /«ª’’’B\|‡ƒà l6))©¸\.¼¬^¤$'ãr»ññöF§Ó‘”œŒÝn'0 à‘Þ‡ !„B!„âv’)x€4Mcó–mœ¿pé‘O¶ßd±˜yãµ—yçÝtîØ–ˆbE¥£q8œN&Nz‡ußnE¯ÓñXéHÎ_¸ÄÅ+Ñlÿn &£‘·§¼GÔw[AÓ°y[éÕ£ íÛ´¦ó³}HJN ^³¶lݸo/3ï͜˗_oÀåvÓ¸Am^÷:ŽÍ?låÍ·ßÇétàryˆ,V˜÷ß} ooÓÞû€ŸþïÅŠ°yënV,šKxxá?m{Ll,ÃF¾Ì™sPooãǦb…r´{æ9¼LF–.úo› /Ñ®s/FëGÛ§Z3þõIìüñ'%c"Цêò¿—Fó⸠>z€:MžbÓÚ•œ8yЉ“§ªf|λ“_§DñHæÍ_ÌÂ%+y®ÛÓ¬úòÒÓì´oó8… dÖœùØNºvjÀ~½²Lô%„B!„BˆG›””y€¾ÿa+—._¡{×N’lÿ‹ÙÌK/Œ`ÙŠÏ9|ä¨Dˆ{àìÙslÞ¶›JåËðùòOx®{ÜnFCƾçzL //ôíNÔÚUøù0mÆÏuããKPU•jU+K©!þ£´ôtÐÈLnëTz}FÂYQ¶nßÅø “)V´Û=‰ÃáþúïÍíÑð²X°Ù¼ñܸ0–’’Šªª˜-f‚…—Ç Ãl6e.1_X(yBCþQÛëԪδw^gÙò•|¹f-Ÿ,ü”*•ÊòîÛoH©’‘Ìýh1U+W"9%‘á( ¡!!,þx~²Ÿþ•-ÛváçëÃŒioœå34†ÛãÁh0€¦eì<N§+ó5™ïq8]D GQ»”„B!„BqG2Âý>r¹Ý¼ûÞ,"#‹ñx‹¦’<þ'RUéÝóY’SRXº|¥DˆÿÈß×UUØôýDGÇpùj4‘p_ùùÜnúö¤Aý:¨h7òí·öS—¯\ýŸ¤Q¸pAì'~4mÜ€¦ëS ^J@w#1­êTøû@ 8áz½žÓÞfÑüÙä aßO?sýz4Š¢Ðû¹n$&¥ðñ‚Åx{[)_® IIÉ\ºr•1#†²tᇌ>k×c8{îümŸc2›ð÷ó&&&žfMÒ¬I‹¢TÉâ wN¦ëu*×®GKçB!„x@ÒÓÓ9vìGåü…ó=z”£GræÌ ŽBˆlK†èÝ'©iiÌšó·hJ©’%$ ÿ‚¢(4nXŸ­Ûw0Ñ2ºw턪ʵ!!þ P ›¾ßÎ/‡»‘˜˜ˆz#á­i·hžýyÖ<ÒìvêÖ¬Âés™üÎtÞ›ö^3G;Å„IS1¤ÿ_~V€¿Ý;·eùç_ãr{¸xá»~ú…ß›xÛÈò¿ýû~غ>\ÄÐÏáv{¸té*ukW'88€¢áE¨Rñ1¶lÛMý:Õðõñ2&[2|,­Z4¦T©â,^¶ N%¢XQôzf³ ·ÛÍËãßäÅÑÃhÕ¢)SÞûçÄh4òýÖ]Œ9€Â… üÙÎ —Ó)K!„âq8¼þêxbbbÑét,˜¿€îÝ»S¤Ha¤©BˆìHî÷AZz:ãÆ¿É £†þëd“¸¥níZøùù1yê{Œ>XJ8ñ/ØlVæÍ~/¾ü—ËIÝ:µ˜8i G~;Á` qÃz8NöîÛGãF ©S«:áá᜿x £Ñȸ±£Y¿qSƤ§ŠBD±p,fSæò½mVš4¨‰Õj`İä/C‡~¡T©¼ôâH"Š…P _^@ËLøÿ.:P¸P!¶mßAJJ*C÷ãñæ·Jréu:*–/ßÓö©'3/È)\ˆÓ&±c×n¶oßIZUyò‰Ç3÷ÃS&¿Á7ë¢p¹\( t~º=… bCÔ·èõzæÍšBµ* ¦Q½êF ÈG“ú50›ÍѼa-ô7ê !„Bˆ{Ï×ׇ%Jðã{PUUQ… +H²]!D¶%Ì{,11‰IS¦óÒ˜áJ@îRÙ2¥ñõñái31t ¦É/!Ä_‹Ž‰eî¼IO·3°_._¾Â…KWiÖ¸^æßÑS­[òTë–™ïiÙ¼IæÏùóç¥ÏsÝ2ô|–åW«Z™jU+g>VU•NÚÒ©CÛÛÚÒ½Û3Yúå©iiwlwXh æ§~ÝZÔ¯[ MÓ²”ãJKOçô™s|µî[Z6­O…òey¹²e(W¶Ì Y—ÄsÝ»dù]­Õ¨U£ÚmíèØ¾ Û·É|Ü£û³YžoóTkÚ<ÕZ:šB!Ä}¤iðl÷îìܹ+s–——A!„Ù–$Üøx^ð6¯¼<šÀ È=R¨`:´}’ÉïLçÅÑÃ2Gœ !þœ¿¿+”gÒ;3ˆú~;ÉÉiÔ©Y‰>=Ÿ}èm ÂårÝñ¹›#æoúãÜ+W­á­w?Àl1ó\®èþd„¹L™!„B‘;äÉF¾|y¹zõÞ6Á!!!„Ù–$Üï‘ÓgÎ2ñ§¼ùúËØþ0w¯XÑpžëù,oL~—aƒž'ÀßO‚"Ä_Щ*-š5¡Z•Êœ¿˜1 i‰âè²Á|wSjëÉ'ZP¡|YŠ+‚åFy!„B‘{™L&*UªÈºuÐ4¢(HI!„Ù–ÌDyœ>s–‹—ñò˜á’l¿òç cpÿÞ¼3õ=bbb% Büþ”{¬4¥KÏÉö»åëëÃceJJ²]!„â¡( •«VÃétáñxhÔ¸‰$Û…Bdk’p¿K;výÈ–­ÛyiÌHL&“ä>  bì˜|øñBNœ<%B!„Bˆ\®bÅJŒòäɃ···D!D¶& ÷»°uûNΞ9Ë3;b2I]ñÅÇÇ›Aú°>ê[Ž=.B!„Bˆ\L§ÓñôÓˆŒ,&Ý„Bd{RÃý?Zõ- ñ tzº=ª*×-4o›çûöbê´™€FÉÅ%(B!„B‘K•(Y ƒÁ€^¯“’2B!²5ÉÿKn‡eËWbÔxºCÛ\“lw:Ì™·»Ý‘cÚlÐë9l[·ïb箥s !„B!Dn;w»Ù¾m_~¾Šû÷±léRRRR$0B!²-I¸ÿ MãÓå+É—//ÕÏU#Û=Sf|„ÃéÈQí6ôôë݃c¿dó[¥“ !„â¡Ò4 ·Û-¹›"!Fll,ï¼ý¡þfN›ÄœShѨKæÏãøñc !„Ù’$Üÿ!»ÝÁ¢%ŸR¼x$õêÔÊ6ír8œhš†Ëå&66‡Ó™ùœËåÂívãñxHMMÍü}jj1±q¤¥¥gY–^§‚)©©ÄÇ'àñx²<ïñxˆ‰#))-›ÝÃ׳Û3¤¤¦µñ;9ÉB!ÄCS°`!¢££%"WKJL’:Úâ¾‹ŽŽæÃÙ37f(ÕªVFUUTU%¼HaF ÈÖï¢8uò„J!D¶#5Üÿ»ÝμOR½ZU*W,Ÿ­Úöâ˯P³Fu¾^…Š‚Ýag«/S4¼Ìý„ À6mþ‘Œ6ˆ¯×n`é§+ñõõ!11‰¾½{иa=tªÊšoÖñí¦HII¥\ÙÒ¼ôÂt:W¯^cÄ ÿÃj1c·;(_þ1ì‡^§Ë6±x¼ES¾úf=k×oäñMÑe£¶ !„âÑPºLi6­û’J+ (2 Xä>N§“ã'Nòx›§¥Ž¶¸o®^½ÊÇs?`â„q †Ûž7 Œ>ˆ©ï}€ÝÞ€’¥JKЄBd2Âýo$''3qò»´nÕ2Û%Û’X¸ô3^e,Ó§N¢BùrLŸ1€Ô´4æÍ_€~½èݳçÎ_à¦ðÆk/3}Ê$þ÷Ò(z…ËW® ×ëˆgÊä L›ò&Gà»ï·àt:™øö»´iÝ’iS&1õí7¸võ:ëÖGe«X(ŠÂ“O´¤@|ÌøàÃÛFè !„BÜof³ƒ—k¾^—åÎC!²ƒ»Í;>üx! ·d»¸oNž<ÁêUËy}ü‹wL¶g&3T•CúsæÄ¶nÙ"B‘mÈ÷¿Ǭ9Ñ·wòå ˶ílT¿…  ÕãÍhþTwfLËx.oX(•+VàëuQT®P†â‘”)]ŠUʱ{Ï>Z6kŒÇã¡N­Z¢iukWçäɓԩ]ƒm»öÓ­kgbãâ(^¼ÇŽÿ†ÇãÉvµì+”+‹NÕñîû0¸_L&£tf!„B<0Í[´`ïž½,Z¾†øØh|¼mÿi9çÏ_àì…+п * š¦!¹ß¿çt:IOOÇÛÛû?½?)%ƒÑL¥Ê5)Uº”$ÜÅ=§(ðóÿýÌž?0fø@ôú¿OWèt:ºtjÏŠ•_ðíÆ(7i*w !„xè$áþ'bbcyã­w™0~,6«5[·µJ¥[#ïýýüPU…䔌F¡¡!™Ï¥¤¦R¥R…,ï-Z¤PfÍs—ÛCÞ°Ð; Aœ9{–è˜X`ùŠUxyY2Þ¨iäÏŸ/ÛÕr¿©ìc¥ ä¥ñoðÆø±X,éÔBäi½¿¥‘æQhöØýù»ýtw 5#L ¼·_;Kç—óN4ÀÛ¬œ®aÒC÷ºY‡ÎÙÑ\EÂŒx[äF3!r#MƒÊUªP¹J•l{¬”(ŠBTTU«VÅÏÏOò€b~³ qo÷›ûöîåÒÙŒ6UýwIó§;´eë¶|¶üSÚuèø’õB!Äý"ßBwpéòæÌ[Àkÿ{!Û'Û~9|”Z5«Ÿ€ª*جVŠGDàÿ»“o«Ý{÷eyï±§(Y²xFgЩ\¼t™àà 4M#>>›ÍJ``г{WŠGÈÙžë¤ç ËèaykÊûŒ6ð?.BÀoWÄ'º©a¾¯Ÿó¿Ïâøí’“7:ûßÃ8X°5™nulèT˜±%…¼þº{žpß}ÜÎÑ+.†7óF¯ƒGí,Ø”|[ÂÝjV™÷}2‰)ÉÌê$Kˆ\NFZÞÏØBÔúu,P ˆ9؆ ëñ6)tëÚé_'ÛoªS»‹™%‹Ò½Çs²ÿBñÐÈк?8söÓfÌaì˜aøüÇÛ-´õQßqäè1“’ùlÕjz?ÛNÍRó®i“lÙ±;wãv»ù~óö8LÃúu3:ƒª²qÓ÷$&%óëá£|³a%K–Äh0Ьa-Ö®"--‡Ãɇ/d×{³}lÂò„2x@oÆ¿>‰ÄÄ$éà÷ˆÝnçܹsˆ Ý©‘˜þïæ3°»4âR³¾'jO q1Ykk@|šçOoã×€t×­g=¸þ¦)[.¸˜Ù;Ç üy)¨„´?_ˆÃ­‘æÌÚ¢³1.¶ý’vÇ×'ÛLT‡FÒ_Äí÷ë•eŸã¯£d~#aFÊä¿sÍÑðƒÛø¿s.b’e® !„ø¯®\¾ÂÅ‹—X°`>ªœÕ‘#) ¬Xþ)EòѪe³»*Wª( U*W¤UÓzL2EæôBñÐÈ÷ßù¿ŸaÓæ-Lz}\Žº­c»Ö,^ö;vï§fÕ ôГɌË}ë #$8ˆYS_gùÊÕ¼øÊDªU*ǹSñóõÁnwP0%ŠG2täXžïÓ:µj ( ƒú÷cñÒOéܽA~Ô¨Z™šÕ«æˆø2~Ü L™>“>Ïu£@þ||_OIIÁåráëë d$ÐUUÅpãÝnGQŒF#‡ØØXüüüÐëõ¸ÝnÖ¬YáC‡7n&“ €´´4L&SæA²ËåÂaw`4IIJÁæ“q‡ARBÞ¾Þr‹ý}fwjL[›Àª_ì¶©ì‰w³e@ G/8¿6‰]/‡¢»q>³vo2Kw¤òÑ€`Þ\ÇæÓN‚- ñ.Xòœ?ǯº˜¾#bÞ*¿^q1¸µÛ~M£á¢Úçӱ꼋ÏÚúС– »S£èëW™ØÐÊ ß§p%ÉÃÂ'løZUFmHáD²‡ÏúÒ¤œ×Û½ï”óO´Î]sRaz4E½Tü¼Tz•7²í;3‡„êÐè;?–óqnÓ=”Ë«gF·¼ ÏÌŽærŠÆ€¢™ð´?*pàŒƒ+âqº q!=;à륛äfÜgql=ï"Ì¢bU5fõ $_€ž5[ÙzÔαd Õ¬òÕÀ¿þW…UAQÁíÉxML¼‹ ñ×H~' «QFc !Ä?MZZ‡=ÌùóÉ—OŽñ„ÈI<Ÿ­XNÉb¨Q­*÷j@zdD1žëÚŽ÷¦¿ËóýJyQ!„œ$Üɨwðç_غmÃ÷Ïv“€þ¢áEèÔ±n·UU2˼ԫS#KRSQêÕ­MíZ5ðx´,¯5™Œ¬^±NGËæM3:‡þV¹˜|ùÂ3jØQ :š£nÑóóõaì˜á¼ùÖTúöêNÁùÙþ¾bÅ –.]Š¢(„„„0{ölFމÃáàÃ?$))‰AƒÑ¡C*W®ÌÀ%%%ñÊ+¯––ƬY³˜={6 `ñâÅ|ùå—øúúòꫯ¢¨ Ë>XBJrE‹åÀhúdSâØ»}/õšÖ£Û€nÙº$QNwò¢ƒ?§³ax0þV•Ãgì,ܘÈÿž  å’xœµS¹HÆÅ’±ëSø¨‹/ÛŽ¥³ë‚‹ÍcBЩµ'™ï÷¥Ð¹±/í# Ô+i¢iuo’ÓÜ4\ÏξT)fâýD7…']§Ta#!B —¢œÊÙh‘“®3¥‘¿¼ÂîvF}ž@£Ç¼nxswås‡ºæš/­L`T#žòçbœ‹ïÇÐ6,ãµ»¥PØózcÐÁËËãX±3…Þ ½÷¸«v¥ð~Ï@Œ½ û§³cd06³Êˆeq¬Ü“Jïú6VoO¤ÁÞ—B1èàãM‰¼õi,Óû‡ *ðÞ1';P¾é®¶Ù¤âkT2×Ùbѱ®—?fùVBˆDQ`ÕÊ•™ÇºGÿ* w!r§ÓÉœfÒæ‰¦ÊÀþ}r\²=sCª*ƒ>KóÏj¬ëtºÛ^  ×ëQ½^—%Ùþûåéõzôz]ެ‡g1›÷âH,þ§ËõHöu‡ÃÁ[o½EÓ¦M™={67æúõëôë×C‡qéÒ%bbb¸páåË—gÛ¶m8¦NÊ‹/¾Hzz:Õ«W§víÚÔ«¤& IDATW>}úpôèQ^{í5Þ}÷]š4iB§NHIIÁžn'æj -Úµ ÙSÍX9%ÕëU§}·ö|õéW8Î\Û¦|Ìÿíÿ·Ë-& òדèÐX¾3…ëInÊ1ój×@tªÂ²Ö6VmÎ(±ôË:([ÀDåÂF6_v±hKq©¯áM÷æ~èTU:vžrPÆWGÑ<¢“< (ôŒ0°óH:Q:¦^y/Œz…"Ázph4«ä…É P2¿}\ð‡Ñß.ÌߘÀS%ÿ¼”ÌÒ_íФWP5¸pÍ€—I¡EY :UF· !Ä?a·;Ø¿ÿ§ÌÇ_ýÜ='D:'ùpîlžn׊²÷!Ùžy<Èø—F²ð“yÄÆÆJà…B<0’pæ/ZFÛ§Z¡Ï£m;¶а°<²ÿ!³ÙL×ÎXöéÊGrýF#£GfÆŒ¼õÖ[X,üüü§P¡Bœ>}š={ö7o^BCC©W¯×®]£GüüóÏäÉ“£ÑˆÉdÂl6cµZY¾|9ùóçgÔ¨Q|þùçÄÅűÿüCü‰,I©r¥ !²T$‘¥"IMJÍ]U`ÝêmLc]Z fþ¬¥ìÝù—Î_AU•‡r*ÄWǼçÐÂ&^§Í´kì9‘‘¯ZÜž‹.âSÜ<’FûÇŒ˜Œ Þ: >ÉMÈë×è:ó:‡Ï;n[öék.âS=Lû&éß$ðÞ7 YUüLëé¼oŒRW@ƒ<¾º[ïàÄe½¾Næµv¾w¼ØáÒÀ¡Þ·öÓ• ܾ÷h:¶1Wغ?•Kí$&¸o¤ôoO¾¸4ˆø]}u“<wĸùz*Óo¬ÛÚŸR©iÌ\L~õž$Å­&…WŸñ£ò´X6L•³BüKü”ebÅ_ý•“'OJ`„Èæ’““™óÁLºthM‰ÈˆûþyÁAAôïÓOæÍæÚµ«È<ªB!¹yHMIÆ`0æÈ¶7kÚX6à¿ÂÒåŸ3sî‚GnÝMF¾ZN:uغu+¯¿þ:z½ž–-[R£F vïÞMTTÇÇ`0àííÍÚµk9yò$ .dß¾}Ì™3ȸ  dÉ’¬[·Ž5kÖàv»IKKã—ÃGØ{`7nA‡ÁhÀËÛ N‡ÉlBÓ44MË‘wJÜ‘šG#5%cbΨ¯¶²ñ›mè : ‡ E›D”ÇéxpwV8Ý% ©nbð~¼ùY,¯­L`Í &Іð5)œ¼ìdñ;³{ ÜxOñ&Ê…›ù$Œ]òï“x¥Kh·R×yô\°kL|& sD’Ë£¡WNí?R*ž×ÈwÏPoN ±o†Ýv2dÔ+ ‡s1n‚o$Ý¿;áÄå—[cÖæd^­n¦ïã~èTøéR,©ñ7â}‡6²a°ŽÆÅMôiê€[Ë3§s¯ÆNÚ]“¿H`ó€ê—‘º¢BñohšÆéS'q»Ü™¿³˜ÍD­_KÑACrÏñ…¹LLL «V,¥G—.Tà}n`€?/ÆûÌ¥iË')Z´(rCŒBˆûIIIIøûûI0§OŸ¡ÏsÏÒ²ù£w±"))‰=zP´hQJ—.ªª„††Ð¥KêׯO@@õêÕ`õêÕ|ùå—´mۀ… £×ëÉ“'K—.¥E‹´jÕŠ™3g2qâD._¾LZZÏty–<ùÃ8{òÔŸ¶Åžng SrMw«-kMoͣᴻøíèi.½…â¥Ã±Zm¬=»§±fg z¢×)T)fâÐEºIˆWÚûÒãã8ª1œñU°ê‡DÎÆyÖÚEÒyô\Œv¡SÁßWeû)'õ+iÔ*f¢ˆEaÅŽdžªbÅíÖèòþuƶ÷£BÁÿvñRQ Ai ñÑ~»ïÀ &>Þ@x—v·³á°¦y3J\ñÓâ£âtil<œÆ÷Gí” Ð‘îÐðõֱ邋Ôt6¯¿îo«šYøc­«xágÓñýöµ3¶KÀ=Ý>)v{ÆE€T»‡ïޤӢ¬½”•Bˆ¿äñxøaó–Û~ÿÓOHKKÃËËK‚$D6Íì™ïñÊØ‘å¼Ûf³2rè@¦Ï˜Mzý&”*UZ6ŠBˆûFî@¿ÞÝùhþbF ck¸ßo))©8]N¬^V †œÛm¢cbYùÅWŒ{q$ƒá‘ÛŽV«•éÓ§søðabbbX°`%K– 00ÈÈHªW¯ŽÙlà©§ž¢D‰:tˆ.]º^¯§gÏž”)S½^¯¯/«W¯æ—_~A§ÓQ¶lYΜ=OÙÊeiزh–?Œƒz`4 dœ xY½è=¸+¹á¾NÞëuLæ[}ÊírS´da:õhMBùÉÌgó×<°6U/iáÈ¥'_Ǩ”OÏÛÏd†;"ÌHE¡ksæ{Ú×÷anT"‘¯â«(Ô,¤ç•'|Ñ© Ï5÷¥éÌ’VÅóV?6 dèg ô_›D…@=/µð¦ZQv§FŠ[Ë:Üukd¸vãñãx£mM˼0ðûçÆ>éËk_'QûýhF×°ðJS+?IG§Bφ6F¬LàÕWQÕÌÚÑ! ^Çü) nèMç²&z,Žgv'?Ò=dÕ¤iàödü¢y o’ÜgÂ5Bl*Ï•61²F]ƧϽe·{Hth™ëœ–î¡ïâxNL² 7"„â/¸\.Z?ù$ªNåì™3*\Xj¸ ‘M:y’M×òêË£ñõõyhí0™L 2€•_¬!.6–ZµëÈÆBq_HÂðóó¥y³F¼?k.}{÷ÀË"·÷ÿÑâ%˘6{! æN£FµÊ8].âââ  Ì1·íÆÄÄ2}Æl=ßû‘L¶ß”?~òçÏŸåwgÏžeýúõœBd'§OŸbÃÚÕŒ1£ñៃF:wlÇÂ%Ÿ²ß^*Vª,e¨„BÜs’p¿¡L©’(Àœ?¡_ïžX­r+êï©ªŠ·Õ’y0òÖm|²ðS}<+G$¯Ïž;ÏüK3b>>Þ²AÿŸ³g±Z­|ñÅYçwãA&—: š=Y›F-ëQ²LªN½qÒŸ=bðûd»Ë­ñÚ—ñ¬ÙŸÎòþÚî|WÏ?=íÐÝãò'sZzÑmf4SºúQ¡pÖ2=©#–ÅÓµ–—b\¬ýÕÎ/†d«®p!ÆÅ¡³vô:8xÖqÇ¢ïG.:°(ŽÂ¾*6sFüœ.ÞM}ÐÉùžBü³¯^íÆQZƇ$Ú…È~Ž;Æ–ï£xé…‘¨Ù(©­ª*=ž}†åŸ}Á›©ß ¡$Ý…BÜS’pÿÒ¥JÈÄÉS5|p¶¯é¾.jÉIÉÔ­]“-ÛwвySlV/ýz˜;ÄétиaJ•,~ãÄDãÔé³lظ ÛMµªU¨X¡z½Ž»öðÛ‰“Ô®YbE‹àñh,X¼ŒBóÓ°~ÝÌÏT€oÖE±n÷\ŽaÑÒ<õDK²mœŽÿv‚+W3zÔP¬RÓóŽêÖ­+A¸Kƒ_ì“#Ôn–e, nèMoöû x¶#ħߞ9)_ØÄ²üßYþV•AM}ð¶dŸ2`µJ˜ñ÷VÙ{ÆÍ¬¢3(ôn~û¾”tÚhòØ­zí~6JéäI!„¹ÂÁƒ8ôÓF­’í™çµŠB§Žm‰úö{Ö~ý-[=!åe…BÜ3òòyBC:¸?3fÏãÊÕ«Ùº­6~ÏsçÓwàú~ƒÔÔTÖmØH÷>C9sö‡‹NÝûóý[8yê OtèA|BV›•Qc_eñ²åìÛ€YsçsñÒ¥Kט·Çmc´wÿ¾ÿa/Œ&ÉvqßÚs‹Q¥Fq3!þz²ã9…—Y¥J13 J˜ï¼öÓÓ¬œm*[ñ³e¯uµ¢&zÖõæ¹zÞt¬f¥g=oºÔº}¢ÜÊEÍ´¯fÅ×K¾‚…B‘û|ÿÝ&.Ÿý¡ƒú¡×gß1~Š¢Ð¼i#Šäfù²¥¸\.ÙxB!î á~!ÁAŒ1˜×Þx›!û’7,O¶=@pº\´oÛŠåK>Mcåçk äÕq/¢iW®\áãËhX¿.Ÿ,\‚ÍËLãõ¨X¡¥JÇr3 ­(èþ}ÓëÔÛjk@Çm9zô79Æà}³eIMÓøåðvìÜÍà}Ñédä¨B!„BÜ/n·›íÛ¶bÀAûÎsL»ëÔ®‰Ífã‹UŸñÄ“m°ÈœnB!î’ ¯û³™W^Í' —ræì¹lÛNƒAO½Ú5ñ²˜±;ì\Ž#-->ý‡Ð§ÿ~:ø ÅãñвY¼m^¼4~"=û d÷žýäË€·7š¦a4ÿþCµ[Õ¹µlX0SÓ4¶mßÅ{ö3x@?I¶ q<¤;´{^W#c¹üçrK^!„BˆwÌèñ°l邼iݪeŽk…òei\¯:Ì|§Ó)T!Ä]‘îÁˢƒyã­wyæév”(‘íÚèçã ªªèÏ„W_Êœ¬OÓ4<µkUgéüÙœ8ušõQß±rõ7ütðg}ü… ÀãÑp8$&%¡Óý“ë1Ù«Œ†¦i¬[¿‘4»^=ºÊä7BÜ¥³×œŒ\Ç'ý‚ð»‡%PRìz͉ápœ›¼Þ*×S4Ü©Ûh\Å&B!„È!4McÖ¬™<ݦÅ#Š‘SOÁŠ g@ŸnLy{2C‡ÀKJ’ !„ød„ûß0Œ7†Í[·³oÿl×>EQ¸yDãåe!_XgÎ]D¯7àçïÏñ'¹z튢°gß~~=|”Ú5«óú+c©YµGŽŸ"9%•  4`Ïž}įűbåx™MuXEll< ‰ Ù&n·›•Ÿ‰ªÓѾMkI¶ ñýðk ·%#Ü’=÷~„»)©Vô jdû_ ¥UA=—ŒpB!„È)\.SÞy›ŽO6£DdDŽ?Ë—7Œ1ÃûóÎÛ“Hˆ— ,„â?‘„û? SUú÷éÉOfçî=Ù¦ŒÊÍ‘ë7FztïBžàºôxž¶Owçíwg¡i ÓéHNNᵉSiùd'Z´îÀî½=´6«Å#‹Q²xQ>_³vzŸˆ^¯ãfñ ·Ûš†ªª”,AjZ:÷âü… =‡ƒ•_¬!00ÍK§ˆIróÍO©¬Ù—BL‚‹U?¦p)6c2(§[ã—³vflLdû‘4¢2~ÿó9;s¶¤°á×t¶OG!ãf™¸d7_ïKaéö$b’nM”ìpiì=‘Τ¯Xõc2×n=·x{2×Ýì<šÆÏçwlãÍ]˜Ç“ySŽB!„ÈRSRxãõñ y¾%KÏ5ëÈä ã˜>õm¢££eC !„ø×¤¤Ì¿Ð«GW¶íØÅ²«èÒ©ÃCoψ!Ïãp8ñ¶Y3W½jeV,ù˜“§N£êt*___Ö¯KÅòå8á"±±q”.Uo #Y?gÆTΞ;‡Õj%_Þ0Úµy£Ñˆ¢ª´jÙ‚zuë7,£æ{›6­©R¥ÞÞÞøû=Ô8¸ÝnÞ}ïZ=ÞŒ2¥JJGHHóÐuF4n jâM§éÑœJö°v@yôÌŒJdë o¶ñá³=©¼¹:‘•#ƒÉã«#Ñî¡B~#…t8]p>E£çœFµòæ×Knm‰æóQ!ØL /.ˆa×%³»ù³åH:OL»ÎÊ60s]ßþœF²^nã+E!„"—HKKcê”·÷ÂpB‚ƒrÝú™M&&NÇ„IïÒý¹>„††ÊFBñIÂý_ÐétÔ«S‹MßýÀ²å«èÜ©ýC­`^¸PÁ;þÞÇÇ› åËÞñ9??_üüîœø²Z½(U²DæãbEÃ3Η/o–ךŒFІyèÛ$=ÝÎ;ÓfðÌÓí²E{„È.Î_rìÔøjhþV•òù Ôž’1BGÓ A„‘çêÙðµêjäÉ_¯r-ÆEx^#y|õ”È«§@“Wœ¸4XØ7€ÂaFê•òÐnê5.\u`4©ì>ïbõð òøé)_ØÄñ N¶I§s°°ZT ” "„B‘K\¿~…ŸÌcܘ¡äÚõ´zy1þåQL>‹&-Z&·d !„ø$áþ/)ŠB“Æ Øà S¦Í`Äèt: ÌC’’Êø7&3bHò†å‘€ñ;ñ)n y)ØÌ—ý}t”°)7öc`µêX¼-™5G˜M*G’W'Ûo²˜Í¼0rÍ_Drr+V”¤»Bˆ¿% ÷ÿ¨R…òX̦NŸÅð¡0è%”R|B"¯¼>‰7_—¥¤Ž"ƒ¸52O\nH¿Q/ýJ‚›§gÅP½¨‘o’˜®Ñnêõ?ÿ¢P@½1ÖÏ/ò[T¦´õÁ×zkJ£þÖ½?&Ù5 !„Bä Ç'ê›/3rf³ù‘YoƒÁ@¿Þ=Yòég$%&R§n½?9¬BˆûK&M½ ¥Jçém˜0ñ§äIHLâÕ “yí/J²]ˆ?áoÓq>M#9=#Ež˜äâdJFÆ=&Á^¯ðZ;?LF•¤7gÒ4ìÎ[éôÇßÝñóÕ“æÔµ© 6P$ØÀéknLz9B!„ÈMvïÞÅ‘Ÿ÷=rÉö›TUå™§ÛãgÕ³zõçÒ!„Büõ÷†„àî*X€n]žfÖœyÄÅÅK@î³ÓgÎ2eÚ Þxí%üýdF!þLá¼Ft…À Wy÷Ëxº-ˆ#Ä‘3çÔøbk"s×ÅóÊÊxž­hâ½I\ŒvÑ»¦…ñQɬù1pz².Ûå4Ȩgp]/òN‰fÑ· ,ˆJ`Øòx\7Þ`wËvB!„ÈÉöïÛË¥³'èÖ¥Ó#™l¿I¯×S¯N-ò‡øñÕWkAîB!þŒ$ÜïbEÃéÔ±oM™N¬$Ýï›ßNœdÅÊ/xù…ج2²]ˆ¿b3«DagŸê–³ðõÐ`òYT½‚Å ðó«¡ç1R<ÜÌÇ‚ù_;:×÷Æ`T¨afMßòç1â¯crWÿÌZðzUaD?ò†è×Ü—ýqêUBÃŒì|9„<föò§p¨A6†B!D¤iÛ¶nåêÅÓôîù,ª*éEQhÞ´1E „°háÜna"„âvR]÷ ËÊØ1Ù5{Ÿî@x‘B”{hûÎÝ9zŒQã—zùBü­Ät¯Ì¡oKo"ó›Ø"d„f$À-F•¶U²^¸ª_âÖˆ¥êEM™?×øÝϪÕÂM¿;é€ò…Œ”/d¼­ µ#ÿz”¸=nOÆÿ™€J!„"[ðx<ü°ù;© <Ó©ƒäêÔªÙdbÁ'ѽg/9GB‘…|+ÜC~¾¾ ÔŸ÷gÍ¡cû6+.A¹¾ýn3IIItïúŒÈñù˜U^ììO÷b8릱äY?ü¼²ÏÈ$»Kcüç  Ö‘œ¦±ñ´“%M²ñ„B!"·ÛÍg+–S:²õŸh"ùU*WÄÇÇ›9̤WŸ~X, ŠB@î÷œÍfå…QÃxoæš6iH™R%%(w!êÛïHHH¤C»§d&x!þ¥<~z¢^ ÍžûJ“Êç£Bðh£ä5 ÞÌù;B!„xXìv;Ö¯¥LñÂÔ«SKò7ŠGFЮu3V¯ZAóÇ[ AB!5ÜïNÇàýX».ŠÃGŽ¢iR'áßr{<|þå׸ÝI¶ ‘ ) øZTü½Tünüïï¥b‘„»B!ÄCát:™óÁ,jV){O’íSß›ÅëßùG¯=sæv»ý®ojZ1±qw½œÒ¥JÒ¡ÍãÌžù‰‰‰Ò‘„BHÂý~1ôŒ1„»÷²eÛ È¿àñxX¸xþ´lÞD’íB!„BqÙív¦Ny‡^Ý:R<¢Ø=YfjZ:))©™oDÓ4-Ë 4§ÓÅkoNæztL–÷ÿñuwZÎ_-÷ï–µnÃ&öîÛOÖ54$˜ÿ½8‚9³ÞçêÕ+Ò¡„â'%eî#UUéÝóYV¬ü‚ï6o¡A½:2³û?8Ð[¼tåÊ=F•J$ B!„Bq¥$'3q⛌;œ<¡!÷å3®^»ÆŠÏVS­j%Öþ?{÷EÙ¶qøšmÙM!=¡„Þ¤H¯Jï‚X"Ò›tQÀEŠ4AQT@DD±!véH¯!! i[æûÌ+НŸÈ&ùÇÁA¶dö™{f³»×>sÏ{år¨UËfªY£š}ì)>rBsŸ]¤ž÷tUùre´ùó¯ôκ÷u15Mõj×Ð]wÞ¦à  <ø‹Ö¼³N5jTÕáÃÇÔé¶vzvábµnÙLú™N>«6-›ªy³&’¤ó ‰zûíµúzË*Z¤êÖ©©–Í›ê—ÃGôÆ›kät:•ž–®ŽÚýë‰^aa¡š8~´}|šîéÙWEââØ¹ Ÿ"ý½î¾ëv]¼˜ªµëß—×ç£ "==]/¿º\U«T&l€kìܹszfæ4=5å¡k¶KRfF¦Þxk­6}þ…ì£Ê•+jÜ#Säv»Õ«g7…††¨G·»U¦tIíúy¦Ï~V}zu×c“Ò¹øx==s®$)9%E«ßyO[øQU«V–išZ÷þGZ¾òMµoÛF:¶×Ä)OëÄÉSòx¼zrÚL;qRS§<¬Û:´Óâ%¯ê˯¾Q‘Â…W(VmZ6SóæM²í¨êÀ@—¦>6Qï¬~]‡d€|ŠÀý:¹µ]Œ-¨ç_xI^¯—‚üNjjš›:]·´n©ÚµjP¸†5oöLM™8^BB®ùãª×=ÝT¨`¬7¼I.—~9|D‘rØí •ÃáГ3æ¨ï*_¶ŒB „¨OÏ{´ñãϳú­‡ªWnªV¥²¬«ÂÃCuo÷.*_®ŒêÔª®ºµ«ëÀCJIIÑö»Õ½kg©\ÙÒjÕ¢‰¾ýn«ìv›œŠŒ WHpp¶®§Å0ôÀ˜Z³úu>ü çt€|ˆ–2׉aªS»†»f<3O£G “•ö2—Þè]HÒôYó4¨oÅÅ¡ pÍ>›JÔ†uoëÉ)(0Ðu]7$8Paa¡’$»Ý¡˜¨Hedfþá~çΞӂç_Òâ——IºtŽ/·Û­”äIRP KáY÷·Z,*Vì×ö-†lV‹|¦O>Ó§Ä É1fBÖ ö¤ä5kXÿš‡àv›M“«—¾¦“'Ë©~ýú"w€üƒÀý:«VõF(¢©Óféþ÷)ÐåÊ×õ8}欞š>GN|0ÛgþË0¤;vhÛw_jôˆÁr:97‹¡Ðþp½ÅjÕˆ!Ô¦Uó?Ü–¸ýÂU—eúþ˜f’\Î-œû´Š.tõ1\Ãõ³ÙlЧ§–­xC›6mR£FÙ Ÿ`Šu(U²„úöºG“›¦´´ô|[‡øó š=ÿ9ýgÒ8Âv¸Æ¾øüsíýé Ô/GÃvéRØmµZe1 ™¦©ôô ™¦ÔíîÛµòÍ5JI¹(ŸÏ§'OiÉÒåºÓ4•työûo¨h\Aíúy·222•évë­·×iÇO»$I»]ç廯çYëÖå.;L½ñÆë×ü±þÀ=‡*«ñcGhÂäÇ•œ’’ïÖÿØñzrúlM|h¬‚ƒ‚Ø!à1MSë×­•áIU¯ÝdµZ¯ùcZ-Y~ó86Û•ùëBC ¨fªzrÚ,}ñå—º³S…QÿÁ#4éÑ'4rôCªS«º¤K3ôm¶ß¨ùòogª[,VN©ü¶ IDAT†¡ÀÀ@Mœð€žœ1OcÇ=¢ñ&ëÕkTºdIIÒ ý´èÅWµè:œg­Y“FªSµ‚^Zò"=Ý  ¥L  Óø±#5}Ö|Ý7 ·b¯áYáýÉŽ?iãÇ›4eÒx9Øà1 iÝÚµŠ u©M«æYý̯µAý{˼<£;66F3¦=.»Ý.Ir:4é‘qм܋}ôÈ!:s朂ƒƒär¹4ëé'tüøIedfªp¡Ø¬ÙøåʖѬéOd=F Ë¥yÏ<¥¨ÈI’ÕjÑèQC(I*Sº”Þ~ã>}F.—S… Æf­Á‚1Zöòs²X,²\ãó«Y,U¯VE’´pÁ³|ßvLÈÃÜsXtT¤¸˜¦L}ZƒôQñbEóôú~¿u›6mþB£†ßwÝÞèþÁT€ÓqÕCy‰—C¥ð>ŸO«ß|CeŠRÓ& ¯ëg°ˆð°¬Ÿ‡ ŒÍºl†bc¢³.Ûl6.\ðŠß/Rä}×N§ üo+‹Å¢‚¿™¸f†¢£"¯øà @—*qÕ1þv ×CõjUèÒ¬Okða9ÞÖpmÐRÆjòÃã´rÕ[Ú·ÿ@ž\GÓ4µþý:uúŒF DØŽ|Ç4¥R7”PBBÅ@ÞÏM;vL¡a(9ÌãñhÙ«KU±lq5kÚˆÏ`~¢|¹²êß««fÏš®ôôt y»Ÿp:4bè`}ºés}ýí–<·~kÞY'ŸÏ§[Z·¸.ý¿|s]¡´V¾õ¶23ÝyÒ™³çt!-EA.Š@JOO× ‹ªe“újpS= âgŠÓýÃjÁü9LÈ€<ˆ–2~Äá°ëÞ]õö»ë•žž®&ä‰õzñå×TºT 5jx³˜SüÌî°«Õõø´™jÙ´‘ *$—Ó)SïÄI^¯WgÏÆëø‰“Ù">þ¼¬V«Òþá,«ääd|T%JSLtT¶´5M3[Þß™¦)ÉPN¾U ÖøFiμEjÖº­Ê–-ÇÎ ¹=ÜýuÃX,jÙ¼© .¤×W½%¯7÷ž15U -Ñ:¶È1¦y©OnûÂàï:yò¤æÍ™©‰ãï÷›°ý—ÃGÔõÞþš;‘öîÛ¯‘cVÛNÝ´ëç=ÿzÙëßÿ@GŽû—ïM½³ö=>r$Çk¨±÷Õ×›?Ööí?²C@.Ç w?׬I#}óí½øÒ+êÙ£«‡_799E³æ<«{ºÝ­R%‹³€«p»3eúLÉ0pé=¾y¹Ã—iš:zä°bbcåtþûQÆ—¼çÐÁƒúà½wôøä t9ýbL§NŸÑ°Qã4iÂXÕªY]’Ô³GW­£ÆŒTkV¾,‡Ã®ôô ?qB[G€Š“Õj•ÛíÖñ'U¸P!?~\^¯WqEãä ÐÑcǵù‹¯ätºèr)**R©©©:yê´<·œN—Š+zùyæÑ™³g¥£—ú¸¸"rØí:vü„>úx“\.—"#"œ£5³Ùl2¨¿^YöºÜn·jÖ¬ÅÎ ¹{.P·N-9-yù5õìÑUN§Ó/Çy>!Asæ.Ô }U06† ü‰93§iǶ­’!«uÛjѺ­åõxôÄ£ôà„GU²t™õ8 çÏëÈáCªR­-ÖòÓ4uüø1­^µ\>2N¶lhÕ’]¶nݦ+WPÍÕ®¸¾M«æjÞ¬±ìv›Ün·ÆMxT§NŸVÅ åõãöŸÔ²y# ìßGñçtW÷þêÞ¥“Ž9¦¤ äõ™zqÑ\mþü+}ûývÙìÙl6Ý\¿Ž«à@—J—)¥/¿üVwÝÑAï줄ÄD >V7”+#»ÝªãÇO),,LÓŸ|T›¿øJ;wïSpH°Š+ªò!er¼n6›U=ï颅Ï/‘LS5jÖây ¹{.Q½ZED„kò”'õÈ„èWã;vü„<·XcGWXh( ø†!¥^LÑþ½»´òuèà~½°`Ž6¼÷ŽþóÄ EDFiòãO+2*Z·[III Srr² „†Ê0 %ž—,………g-×4M%%]PPP°l6›233õþº·uôÈa-^B‘’¤ä¤$ÅÇŸUá"qr8dú|J¼¨àà`]LI‘iš2MS‘—Z“$]H”Çãɺ ÿ؇¾ÿþ{íß½C“'<àWa»$}òÙ—º¹~?„Å‹E—Ú^¿áC<}FÏ/xFBBt.þ¼ê4¾UíÚ¶‘ÝnWZz†Ê—-£C*33S¥«6ÖÁC‡Õù®NZµf­ztí¬òåÊè7×(*2\Oüç¨Ë]·«íí=Ô¡}[IÒÞG4fä5jP_’’Uí¦6zèu¹ëv­~{½º_^Ž¿°X,< Ö®ß µï¾£ö·v t€\†Æ¶¹HñbE5ô¾zfîB‹÷›qíÞ»Oo½½Vcï'lÀõcÊTnΡ<·ŠÄÅ©A£&šöÌý¸õ;múx£<*—)¢Cöéð/‡Ô¦qM êÛ]¦´´4Íšö¸Z7ª©w¶×ª¯Éëñ(11AM¯á{©t¤]7¬ÓÁý{µî7õã¶-zkÕ y<Íœö˜îh×T#õV»:èä‰ãJMMUï®4jH?u¿³Ö¯}[ ª—Ò…ÄKAûÔ)µlév8?òÍ×ßèÄ/û4°oOÙív¿_Zzºl¶ÿ=¿o÷îÝjܰ¾ „„H’¢"#T±|Ií?pH’”’–©F n’a P“›jè|BBV¤_¿Ú·o¿b¢"õÍ·ßé³ÍŸëàƒ—fÿŸ8!IJº˜¡úukK’B „¨zå²:pèðå¦Ê/û-†¡[ÛµQ¡È­_·V>ŸïOî'¹ÝníܹC«W½¡­[·òä@¾åqg*,,”jð î¹L\‘Â>d€›:S ‰‰9>ž_ÑŠ•«5°o……¶àú0M©Lé2:pàÀŸ†Q¹i]¢cbU¹Juöˆ&OyJ#‡ R¡‚±92ŽmÛwè£O>Ó„G_ñ¸‚CB”œœ¤Ï6}ªÊ7VQDDD. Ò ý~žÏçÓÙS§T¡RÆ•!ªÅbUZuàЇÖÉé ÒÂy³$I11…”p^ëß~KA Tã¦-Õ¸iËK¥qéñ$é§ÛU©J 9’¤µëjÏÏ?©e›v’¤&Í[)00H¦iªÃíwkçöm²Ùí²•-_á¿3‚‘£V¾¾L÷õ»×¯ÇX§v ä19sV11Ñ’.…ã{öî×C§hÞ3ÓT¼xq}³åÝÝùv†!Ç«-?ìÒƒ£‡ÿõ3È0äóùd±X.·×§.——cš¦233 3gÏýå²ü}¿¾¥u =úØ4~p‚Ž;¦U+_×tôè±?ŒÝç3åõúx®"_ñù|Úðþ{’¤?=ç!òRÒ\ÊåtjÒÃè‘ÉS5rØ@+r]ÿ›ï¶èëo¶hÔ°Á~;«y›aêÙ«¾ßò è¯V-šËà÷ãŽŽŠ–;3S2MY,Rjj†Þ^ýºNž<¦›6¾êz‡È4¥†MškÑü™zzöëÄñc*T¤ˆÚu¸]o­Z¡´´4<~\[·|«6í;J¦tñâ¥ÅeËÝ ×–<'¯×+‹Å¢?þ ò*e}Ia½ÜÜ0 Õ¿©~`¤اÎÝzÊívkÙ«¯ü~‚1®3«Åª=»÷dÍÞöWn(¯[Z5×=}îSÿ^ÝT 4TÇŽÓ»ë>Р½T¸PAÝÖ¡–¼ò†ž{a‰jÖ¨® |¤–Mê©rÅ”™™)·÷êG®X,Õ­UM+V®R›Ö-Õ­ëÝjݱ«Ê•Y®Õ«kë¶õãözò±Éù÷£Zå Z»~ƒ ÃP¥Š7øé6·ÈëõhÆô§õî»ëT äê3ô­V«>ùäcíÛ·W"oG>áñx®jÕ«©l¹ò~ƒÀ= t¹4í‰IzfÞB5kÒPÕ«V¹æéóùôÁ‡+1ñ‚F ÄF@Ž«Y«¶–/_¡óçÏçŠñÚívmùæsÙU,!‹Õ¦°ˆh >VµëÔ—ÛíÖ™ã'.õ¡5¥´Ô”¬«%K–VË[:êþ!ýtþÜYEÆÄjÆœEª{SmXÿަ=6I›>þ@:w—ÓéTÉÒe´xál*TD·Ýy·j×o¨nw´U€#@Á!Ô¢u[Y ‹23Ò¯˜[±ò*X¸°¶ÿ¸UcÆORpp°niמ-‡¥¥¥Éårê›ï¶¨Y“F~;NÃ04h@oU©RIöPüùór8zxühÕªY]’T $D/<;]_|ù•¾ßò½Ê”*¡!ƒûËb±Èn·kˆ>W,³M‹ÆŠ“ÅbQç;;é믿хÄEF„kÕ«‹´yóúüó/¥Ñ#‡Ên·) À¡ #¯\NËf .‹Å¢»;ß®ï¿ßz©7¼Ÿ:~⤪֨«víÛª_ÿþúúË/µcç}òñ&Æ¿(óz½jѼ…6j@kä;ìóð»×A“cr=ŸÏ§ÙóªYÓFªR¹Ò5;ŒÖëõêÓÏ>×Ùsñêr×íêÛï¾W‚‘¨JUù†9ëÇïw©Z­JV‹ë.¼þÒÛêѱ³¢££(È_ðxW÷}PAAAWdéúäãõùæÍ:xð/èቫaƼ®ÀÿüÜ&-~~‘öé¦Ëï{²3Üó‹Å¢áCjýûèðá£êÐþ–kò8‹¿¬Õ«øõL 7ˆŽ‰ý .—u¹Pá+ÛGZ­V‰+úÇw6›*W©ö‡eýö÷­V«bbbó›Ç·X,Š-X(ëòÙ3§µ`îL}öÉF½²ò]Âv¿ ÝÛ³—<·@]îh¯òeËäŠ1ÿÝÛÝÿ'$Ï®åøƒÓgÎjæÜç4|Ôè+Âö_Ÿ³.W Úµo¯6·´UbB‚Pªd ÐWOÏœ£!ƒû©àŸœüèÇí;õégŸëáñcHá —©S·ž"""5㙹1t°\.§ß1<<,ë瘨(8Љ–$­zë9sV÷ ì+éR»•å+VªHáÂ*T¸6~ø©b£#õÅWßÈårªO¯*W¶Œ$iûÎ]Z¾b¥’^@ƒöS±¢q~¹¼>Ÿ^ym…ÂcŠªuóF츇ÐÃ=ŸˆŠŠÔý#†èÅ—^Óñ'ÿpûŽ»´ióЯa;äbeË•U³Víõìs‹•’rÑÏG{å´î›êÕÑ;kßWâ…$IRFF¦6|¸I… TFz†V¼±F^¯WÆ RZ5uoßaJJNV|üy=<éqµiÝR“~PmZ·TÿÁ£töÜ9¿[ãôŒ =÷ü/SI¶@^Càž„‡‡įazuÙëÚ°ñ#;v\‡ÑÂEKôýÛ4dp¹œN ¹˜iJeÊ–UûNõøÓÏè|BB®{Td„J–(ª}ûöI’>,Û­Ê—“$E„ЭíÛªLé’jݪ…âŠÔ¡C‡µoÿ9ªR¹’œ.§*”/§’%Šê—C‡ýjýÒÒÒ5kÎÕªßXÕªW£ äA´”Ég»ÆÜ?\çãÏkÚ̹*_®ŒzÜs·]®?ôÉä^ÑÑÑêÕg€fÌY¨û‡ TdDD.øÌêÐ-mZií{U»VM½øÒ«ºoP߬Û ’$YmVEF„)==M¿>ªÓgãõð¤)2MÉ”©ÔÔTy¼^¿Y·´ôtŸ8ECGŒVDDa;äQîùÕbQtt”¢#ÃtCÙÒ ¢… äIÑÑÑtßpýgêTyŸâŠöû1·lÞD=5[Ýî¾S§NQ¥Š7dÝæõzåv{d·Ûäóú”’’*§Ó¥"… ª`L”fL{BËåƒùKŸýAZZºùÏT 2B¹à‹À?GK™|Î_©@^¤Ç?¬ÅKWêÀÁC~?^g@€úö¸K³æ,PÙ2¥žuÛ…ä‹Ú¾ó'™’~Þ½Ggãã£Å‹)5-M{÷Ãa—ÇãÑëo¬Ö…¤ä_Ÿ3gÏjÔ¸É6rŒ¢cbØ! c†;yœÓéÔaÃ5cúÓêwog•.UÒ/Æe·;är¹®¸Î0 Õ¯_OϽ¸LË_^xåm’ÞZ³VOMŸ#·Û­¾½º«`lŒLÓTç;oÓOΔ×4èRÍU–£ëwúÌYM1O'M–“s¦@¾@à@>`±X4êþÑz}Å2Õ®zNõêÖÎñ1ÝÖ±­Ú·mõ‡ëSRRT·fU•.UâŠëÃà hò#*åâEY,…KºÒ÷èv·:uh'·Û#‡Ã¡À@WŽ®ÛþõòòÕzpÜC `€|‚À€|Âf³©k·{ôÊ+/Ëív«aƒ›rt<.§SúÍÄïää}¶ù -_¹ZÇ Íf»ê:„…†^uyÁ—øœöí–­Ú¾ë€ º°òz¸X,õìÙ[§Rõêò•òùüçÜ^çtæì ì×Suj×¼â¶`µlÞØïë»ùó/õÕ–êØév¹Ùá ¿½ÎRòŸ¦Íš«@D!-{ý y}>¿SñbEÕ»g«Î¼/Y²„ôëí·õ4MSkÞY§Ã'Ï«û==dµZÙÉ "p 2 C 6T©r7jÖìù2ý}¼—Çì¯^_õ–L[ niÛN q äW¼ÝP¡‚ê7l¦9óŸSFf&ù›|>Ÿ^]¶R¡Q…Õ¸IS¿þRpí¸ÏU¨XI ›¶ÒäÇžRZz:ùÊÌtëÕe+U ªêÖ­GAî@*Q¢¤îíÕ_OMŸ«ó ‰ä/¤gdhÆ3sU¦bU5hЂ$¸€Ëb T—{îÕÌ9 Ýÿ‡‹S5Á jÞæVU¨P‚²¸€,11±ê;à>Í]ð¢9JA~ç|B¢žxúµ»íN•)SV¦IMÿEப>ýjáâWÝ#>!A³Ÿ}^=zöULL,ü;øƒ   5F+Þ\«­Û¶çûzœ>sV“¦LSßþƒKظ:wpU‡C}ú Ð'Ÿ§­?ü(3ŸöO9pðæ?¿Tã'<¢àà`v ÀŸ"pÊjµªwŸ¾ÚüÍ6}ûÝ÷ùnýüEϽ´BÃGŒ’ËÈøŸÜÀ_ê~Oý´ïˆ6lü8ßÌtÿîû­zwÃ';v¬,"À_ãÕü%‹Å¢Û:Ý®ó)™zãÍ·ò|èþÕ×ß곯¶ª[÷²Zmì€ÿßë%%ÿ_mÚ´QÈ"Z¶b•233óä:®^ó®Ÿ<¯Þ}úÉf#lüÿ¸€ÿ7Ó”êÔ­«âe+jÞÂÅr»=yfݼ^¯–¯|S¦=H­Z·acþ6wð·U¨PQ­ÚvÔ¤)OÊíÉý¡»išš=o¡Š•® &Mš²ÿ;øÛ ÃPáÂ…Õ¥{OM|tªRSÓríºdºÝZøÂKª]¿‘*T¨(Ã0ØÀ€„ÀücqE‹jÀàa=~²sÝø322ôÄS³T£ÎͪTùF6(à_!pÿJhX˜ÆOxDSžzFññçs͸““SôØS³tÇÝÝT¶l96$à_#pÿZpp°F£™óéÈÑc~?Þ„Ä zrÆuïÑ[EŠÄ±Ù‚ÀÀ5áóú(ÏkÐ}ôúÝ´cçO~;ÎÃGŽjñËËÕ³ÏÅÄÆ²áÙ†À@¶‹ˆב_ŽRùÎÅäY¬V Èׂ‚‚Ôµ{­Ý°I[¶þàwã;~â„æ/zIwu鮨¨(6 [¸ÈvÅŠÕ¡}‡åõz)€|#=-CgOžSdD8Åä{v»]}úõ×Ïûjíú 2MÓ/Ƶs×ÏZòê*5F!!!l(@¶³QÙÍá°«]ÓÖúhýgjÒêf8( r„a2 ƒBàšËÈÈÔš×שW·î€Ëìv»Ú¶»Uë×­Õ†©M«9:ž·ïÔ{mÖ€A÷Éf#\¼Â¸&Þ|“ÜŸzôÞÒ•˜‘¢ÈØ‘{âz;~씎Ýé»-?¨N­êì¸æA‚Õj•ÅB§>þL‹–­ôчµêÍ5ºý¶[¯Û sŸÏ§­?ü¨M_nQï>ýÛ×;€kÊ0 Ùív a·ÙØÿüäsAËV­´mÛ6Í[°HCõ¿æïÓLÓÔÛï¬SŠÛPŸ¾ýi5¸.˜Š®9Ó”ªU«¦jµoÖK¯,WJÊÅköX^¯W«V¿-„¨}ûö„í€ë†À\¦)U©RUu4EH"õ IDATÓS3çèâÅÔl ·Û£¹ žWL‘Rjܸ md×;¸®âââtoïþšüø4%§¤dÛrÝžxz–7k£Ê7ÞH¡×;¸î"#£4xèH=øðÅŸ?ÿ¯—çöxôÈäÇÕñöÎ*^¢md9‚À䈰°0=<ñQÍœû‚Ž9ú—“x!I>üõê7XÅŠ§°€CàrŒÓéÔð‘£4sþb8yJ·åú…¤$=òŸ§4|ähÅÄÄPP@Ž"p9Ên·kÜø‡´tÅíØùÓÿû÷Ž?¡§ŸY 1ŒS¡ãÜ@Žs8êݧ¯>Þü¾úú»¿¼ÿ¾ýôÊŠ·ÔoÀ …„„P@€_ p~Án·«Ç½=µûà1½»î}™æÕÌlÛ¾C+ßZ¯Þ}û3³àWÜ€ß0 C·vè( ·×¾'Ç›u›ÇëÕ·[¶êãÍߪ߀Ar8 àWl”ø‹Å¢ÆMšjÇŽízbÚLU½±¢ ‹E?lÛ¡:õéÞž½e±0‡àÜ€_ºñÆ*ªT©²>úðC¥_LÓ}ÃGËjµR€ßâë`à·,‹Ü™:|è a;Àÿ_·(ðk†A ¹;Ù€À€l@à@6 p ¸ò¬Ý{÷Rpݸò,Ã0(¸nÜÈîù˜×ë•é3)d÷¬ùóç«fÍšjÞ¼¹vîÜ©ôôtIRdd¤–.]ªªU«jñâÅÚ´i“.^¼¨õë׫xñâª[·®æÌ™£ÄÄD]¼xQË–-Ó¾}ûT¥J9rD“'OVíÚµåt:5nÜ8¥¥¥Qpøf¸çEŠQõêÕµpáBuìØQݺu“Óé”$%&&ª_¿~r:zíµ×túôiiøðá:pà€<¨””]¸p!kyC† QÁ‚µjÕ*¹ÝnmذAIIIÚ½{·RSSår¹(:ü3Üó«ÕªéÓ§kâĉڻw¯:tè sçÎIºÔ×=((H†a(..NÒ¥Þîƒ ’ÓéTÆ %)«G{äp8$Iv»]EŠÑĉ5{ölmܸQaaa~‡À=Ø¿¿ž|òI?^mÚ´QffæZ¿˜¦©={öÈb±èçŸÖ… túôi­^½Zn·[_ýµ,‹ ÃÈúªU«êôéÓúä“O´fÍ-\¸P™™™~‡–2yDÙ²eU¥JíØ±C†aèé§ŸV\\œŠ+¦qãÆIºtòÔŽ;*..N5kÖT¿~ý¯aÆ©zõê:zô¨êÖ­«Î;gÍp/V¬˜f̘¡O?ýT.—K7¦ \{Ò¹sgù|>I’Åréà…ºuëªnݺ2 CV«U½{÷–t)|ŸBCCU´h1U¯Qö=ð¸ð7ý¼k—¾þâÝ7°¯œÿ°Í‰aš>s¶†ô@A‘m>Øø¡Zµlñ?ÓíÖº÷>Ð{ëOªÍ-m)(üMîü †EZ÷ö›šôȃ p8þݲdÈ0 ŠŠìÜCÿÕ>àp¨S‡vZ¶ü ¥¥¥ÉårQRø,” ñz½JJJVRr²223•šš¦¤äd%'§ÈäX1øK'ŽŸTéR%þuØø+Ã0T©RíÙ½›bÀßÄ ÷|æì¹x5is§‚\rØíZûÞ'òx½*¥×_]¬  @Š Ïà‹Dp-œPåÊ•µî½Z÷ÞúðãMòz½d ‡Ýž+Æ9oÁ ÚðÐ5YvBâM™:]„²üŠîùÐ=]ïÔ„IS³.{<^uïÒ™ÂÈ\.§æ-|QIIIY×™¦©M¨E³ÆäJ¦iêüù¹\.¹\άÝ¿ÑwµËÇOœÔì/©Níš2Kš2 ãŠ#½^¯l6[Öï%$&*<,ìªý¿ÝnwÖ}½ýÝuïkýûiÔðÁ  ½3Üó¥âÅŠ^ñf¨h\!Œ¡0òÃ0t߀{e±X²þ¹=^õí}/ŹҮŸwëÎn}tcý[T±vs=ôÈ””œ¬¤¤dÝÕµ·îí3X™JOOW÷žÔíÞþÚöã5lu‡b"CÕsÀ=üèTíÙ»_E+ÔÓü…‹Õ¥GMŸ5O>ŸO¯-_©Æ­nSõ›Ûê¶Î÷jÓæ/²ûðá£zz敨Ü@·ÜÖE“¦<©ää-|þ%Í[ø¢,‹"Êݬo¾ýž €Üó¥bEãžuù¦º5ätPyFÙ2¥eµZ³.—)ULE ¢0 ×q»ÝšñÌ|™>ŸölýHï¯~Y_}»U¯-_©`¹¨vï;¤9ójÆìùÚwðˆF¢Ê•*èá±C”‘‘©YONÒ¸1#dš¦ G‡éÍ5kU£jE5iÜ@§NÖ7ß~¯›êT׿ o("¨/¿Ú¢µ¯?¯F7ÕÑú Ÿêý>TÏ{º¨d±"2 C{¾|G5ªWac ZÊäKV«UM5ЫËWÉçó©r¥ÊW=dr«reË*(Щ¤ä‹’¤æÈnç%ä>™n·¾ÿq—ß\Gß}÷ƒ$)®HaíÛwPWõêÔÒ˜5oáIÒä ÷«VÍê’¤Bäõ™ŠŒŒTHpPÖ2Ë”,¦‘Ç* À!¯×«Ç}X{÷ÐÁC‡%CJOÏÔÁC¿H¦t>ñ‚ô¹GÕ«UQ•+iø²X,r¹œ²Û.Mpˆ‰Ž’=—ô´àZc†{>ug§[%ÃiXÔ¤q  O±Ù¬êÔ±$Éëó©JÕùbäJçÏ'Èj±()9YÒÁC¿¨i£›U§vMýúö¦|ù²’.õh/U²Äÿ\žÏgªB…²ÚŒîÙ»_wtí­!÷?¤ƒQJrŠÌË÷KMK“$*TPÒ¥É[ÁÁÁ dÃð'Üó©`•+]B­›5ää6ò¤[Z·¸ô¡Ò4U³z5 r¥˜èhy}¦ *¨þ}îU¿>=ÔáÖ[Ô¦UsÙl6%'§hÚŒy*Z¤ ÆFi¤©JI¹t”ŸLS‹¡”””ß,Ñ”Ëå̺´vý¥¦¦iáì'Õ§W÷ßœtUŠŽŠ”ÝfÓÛ¶K’R.^Ô«ËVêëo·\1F·ÛÆà2÷|Êår©FµÕ¦USŠ OŠSé’ÅÔ£Ëí´“¹–ÝnÓ=wwÐ'›¾Ô´™sõðäÇt÷=ýôÞ†òz½Z¼d©~9|L<4V«SgÎêÅ—–Êçó©`ÁXY CK_]¡uï}pÕ#þ*Wª Ó”æ?÷¢}|š „Ë0¤¥¯½®¨è(U¬PFï¬û@‹¿¬YsjÁó/ËyyÒVTt´|>Ÿ/yE§NŸac z¸ÿm¦$™¦|>ŸâÏ'èÌ™³ºx15÷­ˆ!¹ƒtúL|®=›|DD¸ÂÃÃ&‹aÐ.À‚‚‚T¾\)5¸©Ź–ÅbÑà}©•«Ö(::RãÇŽP³& õÅWßè½>ÖÐ=Uá†r2MS}ztÖ«ßUÕU¯N- ì×C9¢mÛwª\Ù2 ºâäòÞ¬½ûhíúÔ¬IC9TK_[¡C‡Êçõéñÿ<¢ÅK^ÕÊUo«bÅrš7kª*Wª(I7v¤¾ð’Μ‹WRR² ÆÆ°Áùžaþz¼þ'¯×«m?îÐΟv)áB²"#ÂT²xQ8åtäÊu2%2.ÿ”û¤¥¦)-=]{öPjZºb£#T­jUÝpC9½Ù#åâE%&^PfFf.|…“öì= ˜è(…‡…æÊú‡QpP \.;#òÇ£%ËÞÒwÝ%ÞÈm¶ný^‘ÁU¯vã¿^ÖŒ™s4úþáÙfêu«ÿz9;~Ú¥SçÓT³fMŠ Ï0 iñó‹4°O7…_“Ç`†û_8qò”6~ô‰N<¥š5««Kç;éyîg7ºtÒ×äämüè½¾jµjÕ¨®úuk+22‚ÿO>ŸO§OŸÑƒ‡´kÏ~9}Jáa )¢!”[ó°£Çëèñã¹rìçãÏ)55Uñ T¦LiUº¡œŠ-ªÈˆpvXüûŸHJJÖ K–Ên·«W® ’ÕBË{¬Ûo»UÚߢøó šóìs*Y¢„î¾³Ó'p¥´ôt}ôñgúâË/uã•Õ¶uKÕ®UC6›íŠÃ‘3LÓ”Çã•×ëÑÙ³ñZòòkºtAwÝÑIÊ—•Ýn§Hø ÷ßñú|zkÍ»:}ú¬zt»[ÑÑQ%·íÔ6›bc¢5ùáq:vì¸f<3OM5ÐÍ7Õ¥Ï;ð™™n½õö»:tøˆ:ßÞQ­Z4‘ÃÁ<þÆ0 Ùí6Ùí6-ZDcF Õ… IÚà &MyR­Z4Uã†7ó÷ ?À”íß8vü„fÍ~VEãŠhÈà~„í¹œa*Z4N£¤ä$-|~‰’’’) ò=Ó”¾ýî{=5ýU¹±’Æ©R¥J¶ç"¡¡T³F5M™ôdšš:m–Ž=FaÈaÌp×¥ÃõýrX/¿úº=\œœ.¯iÛ¦•΋×äÇžÒø±#ù2ùVRr²^}m¥Š)¤ ãFËB«¬\ÍjµªIㆺ©~=Í[ð¼Ê—+«V-šÐf€BÒ"iå›kôÙç_é‘ñ£ Û󰨨H=þè½üêrmÚü%A¾sö\¼¦<1CwÝÑQomKØž‡8v6H¥J×cSg(##“¢ò}Úòú«U $X=ïé"› ÿyËåÒˆ¡ƒuèÐ/ú⫯)òM›¿Ð+¯½®G'>ÈyõÝbQ…Ê©ß{5㙹ÚðEàz>ϯ+nš¦V¼±ZÁAAº¥uKN6—Øí6ý{÷Eõ¶qü;ÛÓ+z¯Ò¤#½  ¨ `ADô¬ ¨ *¢`/±Ð»€JïEz/©¤—ÍîÎûG0Š€‚è$ܟ늸ٙٙçÌžÍ>sæ9½îêɶí;ùeÍ:D ¼%ËVpäÈQü þ~º‹§ +Q¼ƒz€/¾œÁ‘£Ç‘ÿ¡k6á¾aÓBCBèÜ©½Î‚kÍfcÀ½}Ù²u;Q@¤@2M“‹—K¯»nW ™kHP` ?ò“§LSÒ]DDDDDDäèšÌ¾>|” 7Ó®MKl¿†Ù¬Vú÷íÅ—_Ï"--M‘g÷¯{IINáöÝ•l¿ðôð¡|üé$œIT@DDDDDDDþ®¹ Ì™3‰¼?õîë׫ժ3àçt:yð¾¾¼ðÒX²²²)0Nœ8É÷sçsK×Õ×]ÃôàÞ{*Gù]S wÓ4ùü« }dv»]­/DD„óÀ}÷°dÙ C „ôŒ Þzg Q_'N[oá͉ïáõù‘ÿÐ5•p_°h)µkU'""\-/ç(W¶ 'Nžbçî_ É×|>“O?ûŠGÝÓáP@€ŠÊÑ䆆lݺ]Á)@Ž%xøùÀÕ¹S×í1Yº+ƒ´¬üyAß4aÝÁ,æmË`Ꭰ–îÊ`ÞÖ öžÎ>o¹Ý'Ý$¦yñ™:çDDäï]3 ÷ä”Ö®ßDㆠÔêrÃ0ès÷Ìúæ|*ùغõ)[® Å‹U0äõë^Ï·?Ì#::FÁ)(ûÌâÕy)ÿó×=qÆÃoÆ2eEÙÿRÕ:×äç½™üÛ9ímG²ˆNöž÷{Ó„—¦°óPdzñeù˜·&eÛ3Ï]8tÒM‹×cY°5]'ˆˆü­k&á>cæw 4@µŒå¢\.]:·gáâe †äK)©©|?w>-›5U0ä<6›G~Yßþ `ˆˆˆäC&™}n:ÚÀÀzö[½÷/Æ eyÌ¿Ýöo2³Í¿ÜÀéD/¡þŸ?IhÀÅÓ ™žKOŸïñ0ý§4Œ íß6ã3ùÛýû£¯W¥r$þW 0 h]ËŸõiw}M+90þ´:× äõÎü²9]£ÜEDäo] ÷C‡àÎÎ""ÍÝãbhùÜi~Ù—‰i‚iÜùV,Yg/ì<î¦ã‹§9ŸMßwã™·ÇÍÐãHÉôÑõõVîΠã¨Óv“í1þÕº¿Í/žæ­ÉxÎf¿M`×áL:¾xšÎ/žæÛ5©df›¼øy<ŸlÍbħgX¼#ã"ñ½´ º_ ¯ynò_DDäB®‰„ûÜù‹èÓëNµ¶\’¾½ïb銕 „ä+G'::ZåoµiÕ‚Yß}Ovv¶‚!""’dg› þ<‘·óÁC…{G(?;“›ø]yÄMd •©EÒ­žþN 5ÝËs3“xªk0>Ië*N^þ>ÈIPïO5ùqg&Ÿ Çé0x}v"¡V“iE2í¡H~Üãæ«Éܧ¬L~6¸PÆ=%ÓÇuoÅ3¸K<\ˆ±½Cé9å )Ú×  j”•÷æ&âóÁëß%qwó¢ÂíÜÛ"€¶å팼3?»At–É›óSÓ+”"vlH#96›ÉFòÉHfnÍdíþœ ëw§ÓçãDÆõ cÚC‘ÌÚœÉÔÅÉ éFD°•§n ¡E×¶„¡“QDD.IO¸=vœ°ÐüýÕÚrIJ•,Áš5ëHJNQ0$ßX´d÷ô¹ ÃÐùkv»î]»°}Ç.CDD$0 (d°í·Ï¤j)'kGFå–>qÚ ºÔ 2ØJ§Ú~|÷«›”Lþ. ËGFQ©¸¸4eŠØùps&©g'95€ÛêûQ®¸Ÿ omË¢[‹ ü\þzÔu±zû¼Qî™Ù&~Í$8ÈzÁôÊ]™ÜXÔJ£*~Ølp]i'Õ‹ÙXµßÅ€BølKæ&á2èÝ<‹N—Ý ØÏ‚aä\èYÇEÍr.vƒvu{$n$g™4-mç‹%9ßÙ¶qsG;וqR$ÌÆÄ{¹©Q. V ûYpØ®ìïäB¡VV÷áÖœ_""ò×lùàLÓä»ïçp÷]w¨¥å’Y,Ü{›6m¦UËæ ˆäyqñ úû¢`È%©Q½ÏŒMõëªâp8‘<Ìn3vK(³–'Óvl,E‚-ŒëBÍÒN—°c9›KtYÀ·¬Ù&Ã?Kàà)5‹ÚHv›`3Èö‚Í«‘aöß¾<“fòüôœ$8ä$¼+9?e0|r,«“M6ÜÉ…Æzœ‰q³3ÆËÀ÷ârò!&ŒÎ©£^(ØÊðNÜ÷u2+ޏèqgû Bgîã½'ÝÜ:%›JÚpÙ ÖôP!(g ᆖÿ}ÙP ¡þ|ÿbn¼rQ;]êøQû¹h– +D©H›NN¹ ý ‘–žA@`áa¡ji¹,¥J–à“Ï¿¦Eó¦X,Dò,Ó4ùâËéÜÞ³»‚!—ÌápгGwöí;Àu×UU@DDDòòß{@½rNê–+ÄH·É “iñ^q/E]tÀ…Û3øl—›õO¢l!;+÷fòÎÎø?-øû ~~û†Ð¤’3÷u ìÖs³ê£úF0òë3|¿6•›ž÷ÚÁvJ‡f1e`dîº>l֜磓½ŒŸŸÊ5]¼³4…÷Ê:s/ü•á³’é^ÆÆè¾‘Ø¬}?ˆ‡4/­ÄGÿ^.Ïã5ñùÀfý÷îþLHó±dk&ŸÝFñp%ÛEDäâ t&qÁ¢%´i¥Êrù¬V+Íš4bæ- †äiiééØNŠ.¬`Èe©U³:3¿ýAÉãNñ0òÓx|¦I€ËÂÝ-ƒHL5Iwÿõì>”±P¡ˆä /Ó–¤€Ã #ûüõlVƒ‡+ÙY½=Œœ25K6¥±bCêySІZi_Ó=‡³ð]`UrñãI›¹qÚ 0àíÙg8Ÿ3Â}â÷‰t©åbBï0Ìl“é«R0ÉÉ¿õ”ç¢ÇczLêÕôÇa3X·?“¯ö»ÉöåLyZ«ŒƒÕ³9”³þÓ_œáí…9õçƒí1‰Þ+n‡ïÍâ; IDAT}'Ý”³P·¼«Æd‰ˆÈ_(°YYY¬_¿bE‹ª•åiX¿kÖ¬ÃÔ4ô’‡­Zý ]»tP ä²9ìvªT*Ïþ ‘<,*ÔFÙ¢6JŒŠ¦ëÄ8:¿Çì^Á¹,øL“Ì?ç’Ý9wAvªéGÃÂ6¢FžæÖ‰ñ hÄkÍü¸mjnI¬‡Üï:V ¸1„ý±^\Oœ¢è¨hælɤNuÿ Öi·Ù &Û ‡X™×/”¡3“¨ýR4µ^‰!(ØJ©H;ó6¤±ó„‡á]C°[ †ÝÂóR9ë¡{°@§Iq$¦ùˆóÀ¿Š=Õ1Ñ R©ôr43W¥²î¡{ Æ,H¦uíšVvPôÙŒ§°™&uÆb¡ÍýyrN /ÍIº¢vÈö@˜ËÀ¢9“DDäoØû bbbiѼv»nõ’& À§Ë…ÛÓ©Ç’÷x<Vü¸’Öº“Gþ¡Ö­Z²tÙr*”/§`ˆˆˆäQú· ¡o›`’2|ûY°ž­ÁÒ½n·Ôñÿý ¾Õ ûýbX­ðÎý‘Lðø°Ù ¬ƒ&•\>›oëƒÏç¥l™R<þÔH/]‘«#ÇõÒX< «ÅÂî_÷ðèÐdff’™•Å /½ÎÐáÏGjjwõ¹ŸÔÔ4¾šñ ƒšÅ¢8yê$½û âð‘£X­bbâ°Ûíœ_Ög÷î=t»½/V‹ÁÎÝ»ynôk¹ÏŽŽážûâ›ïæPýº*üߨWxñ•±dg{®Z;Öªq‡ŽUo!yÊ–­Û¨]«f¾Ü÷'O±`á2Ê•-ÍǼô)“xñù§Ø³ÿË\Àž½ûÙº}'^¯€ä”T¶nÛItLì9ÛÚ»ï'Nœº` «C‡²gï~ÒÓ3Îù½ÇãaóÖíÌ[°ø¼r]>Ÿ½û0oÁbŽ;NΔa¿;|äó,fÏÞýx½¿ß>}ìø çã~¢v­šçÅIDDDDDDD._ánš& g’±^íQŸ†Al\<»vïÉánÊ—%99™!ƒî¥páÂÔ«{=­;ÜÂ~J‡¶mrÅf…‹”Y8gæïv»yeÌ›|õé¢¢ŠžžÁ‚E‹ñxŸI£ Üiðé—3èÚ¹wô¼€ð°0fÍþ غu;ʕ浗_Àb±P­jî{ðbcc)V¬èUiJ—Ëź ›¹¡Qõ’gú¹cÇŽÓ¶M«|¹ÿ¿%ÑOœüt:Ú¶`üÄÉ”)QŒ‰o¾†Ëåbþ‚E¤¤¤ðØ#ƒ±Xò_eÏúõjsâä)BCCô¹.áîóù(Uèªï‡¬Y·‘»÷äþÎépð΄±”(^Œí;vóýÜ…¼õöûd¹³q8<$'§üã׋މ%4,üýýè~KWÜ~nŽ?Á /eïÞý¤¥¥S¼h|fÎèÌ몔Ç? g½À€0ML_ÎsÙ/5k\—sL†aX8xèN§“ȈŠù=Ö74ªÏÒe+r˜¹ÿ9ϱã'¹±SûÜÇU+WÌÙž½û‰ŠÊ)w‚ŸËAzÆÕyép:HˆSo!y¨Ÿ3ILIÃnËŸ]x©’%hÕ¢1 —¬¢ï}S¨PݺÞH›Ö͉Àjµ`±æ\ü½S5r{<Þœð.k6láÛ¯§‘––ÆÛïNáÛæQ»VM>ùô ¾š5‡7Ǽ@íZ5ø¿ç^dÑ’ÜÔ¥3ÓgÌbíú-¼2úZ·lFZ_3iʧtïÖ•={÷³xÙjîï7÷õëM§Ø´e11±„†„0yÚ—Üu[{ôaâââ™>s6[¶í qÃúÜ×ÿ€|™l bÁâå\W­ŠÞ`"""""""W À%Ü?ATT‘«¾¦iÒ®M pN ÷à  Þ~レþ-ý﹓‡èϽü¶Ö¼¢æ¹ëû|&‹Á«~bÔ+oðá»ã‰*R˜M›·òõŒÙ¹Ë`ù‹IYÏ}ʤl™œúÊî¬sK8dee]⮞»¯îììsžËþCiŸ×‡Ïgr5猵Y­r&1‘°ÐPõ’úåËäï:ç#†e@ÿ{øjæ·,]º‚I“§1eÚg¼ôü_än’œrUÑx½^~üi=êצl™RX,&¼ñ>ŸÃ0ؽg?Yîlš5i„ÍfcüØ—ðy½Øív¢£c±Ùl,X°ˆ+~äÄÉÓx=¶ïØEõjU°Y­|=ã[:DÍÕés÷áõz)_¦s,#&6–jÕªq×=(\( ÷"a~åïïÇÁõæ¹B®†û‡(t6rµ¹œN‚ƒ‚ Îý1 ƒ…K–ãr:iÛºéd{¼x½^²þ˜x¾L…"#HLL&.>€ôô Æ¿5‰¸øxöîÝO÷›ÚS©b‚ƒƒYýóZÜn÷Ù²—Ÿä·Ùl”.]Ÿ™Ssý7?ý²Ž’¥J`b’––vÁõK•(Æú¿×¨ßº}çÙu VjÄ'œÁ{v„}bR™nü\~Wµ-+U®Ll¬F¹KÞpâäiJ–(–¿?| ƒ¢E£x|È@~˜ý%£ž}’Ì,7ß|;'wÃø½üLRR‹‘ûØÏÏI``À9ý­¿Ÿ†‘s7NáȰÜ$¸ÓáÀÏϋłÏôáõy©S§6Í›5áÎÛoåÅ瞤hT‚ƒƒ˜þù¸¯ÇOÅ0nÂû´ìx+IÉ9eÊÞ{{Ï<ùV&½÷­:õ`˶íâœr88ì6ÒÒÒõ¹.á~ìøq"Â#®îN˜&Ù/>óÂÉì÷ô")%•Þ÷>ÌÀ!OòÐýÈÈÌ¢g¯X,<oîpÓ4sŸÕ®swfÌúþ¼mº\Nž|âaîî;ˆ™ß|Çä¦qôØ1‚ƒ‚¸¾v Ö®ßÌêŸ~aàà'(R¤0'Nǰzõ/ø|¾s¶õÇ×sÿi²ÒœçLì6O=>0÷õ^~mK—¯âÉÇШA=~Y³!wÄ?êuÇmLŸ5‡ “Þç¥×ƱrÕÏ9w˜P¥JeŽŸŒæ¡Gžäû9óéÕ­ZÜ@‘"…¯j“–+SšÄÄ$õ’'ì?pÐа|»ÿS?úŒÍ:±tù¸Ýn, U*W$$(çÙ²1a¡aجVvíÞCv¶‡Õ?ýœ[BÇjµr}jìÙw€ä”LÓäµqxò™ðz}T®TŽø„¤ÜIL¿üz&ƒÎéÓ1„cúLJ•*Iûvm¨Zµ Ê—£hÑ"ÄÄÄ’™™Á­ÝºòÙÔwöèØ,?ý¼–ÄÄ$’iذ>ã^ÍcGàç`þ‚Å漪T¹2gõ¹®¤L\l,!!ÁWuÊ—/Ëk/>KѨ '‰oêÒ‘J•*°k÷Ú·kE@@eË”&*ª0áaaŒ~î)Ê”Î)ѸQ}Š+JxXNrí™§†æ–tù³NíÛRµr%Vÿ¼–íÚR¡|6 X±b¬ß¸…çG§Pd$7ßÔ™'NR²DqúôºÛÙD–Ýnç™áã€Óáàíq/b³Ùs_ãÙ§Ÿ H‘œ’=·Ýz µkÕdýÆÍ\_»ƒ=@PP 5k\LJÀçõ·ŸU«Væ‹ßeɲ•´nÙŒ’%‹³cç¯ØlVŠ.Äï¾ÉÆM[8|ôǽL¥Š®ú$¸E£Š°mûõ’'>r”êù¸ÖvÛ6-ùqÕOŒ~å ¢ }ŒÝa'1)¯×›;¿Ã­Ýoæ‡ËxþÅ1D„‡R¨PDîÅA›ÍF—;ðò˜·0ðQüýØð(÷ßÛ —ËIÇö혿p9CAñâEÙ³÷7wiOTTaßÍ]̨—^§r¥rìÚ½*U*òæØ—HMKcÀ '¨R©×U«ÆÂÅK ¥UËf†ÁÐÏàOÃúuY»n¦ }ûÜiš|5}&éiéôï×ÃÈŸuÜË•-CJJŠÞ`"""""""WÀ0MÓ,(ãõúxñ•1<÷O©eå_>·¼|÷ý\ºwëª`ÈU÷ÂèWxrØcø¹\ùö223Ù³g/{ö`ïƒ4ª_‡×U£páBgK¿˜8p9óѨ~]ªV­ÂsPªTqZ4k‚išìÝ·ŸŸ×¬ÇåtÒ ~J/ž;BþØñ,]¾’ø„3ÜØ¡-Å‹˽ Ãú›Ù¾s7Ú·¦LéÒ„††püÄIvíÞÃò•?ѼI#ê×­MddN™²3gΰ}çnV®^Cµª•¨S»fîÅѵë6âv»iÚ¤Q¾M¸ŸŸ/w2P‘“Õj##3S¹ÊÚˆˆä#nw6ágKœˆü› Î$+"""""""W@ w‘Kd(’W:nC]·üGýœ¡žNDDDDDDäJ¨¬é3Éö¨ìÇ¿aϾýìøÕòMLLâ§_Öàõù8uê4ë7n—gOKÏÈЉ!"""""""""U î†ÅÀnµøFóx¼lÚ²í?}„„3œŽ‰½¢mìØõ+ÉÉ)ÿZgxwòT¼/Gcæ¬o1}¾<÷ü>I¥ >Ó‡×çU þÑ1±D_a?w©RSS9|ä(¦i’pæ ÇOœÄÔ…E‘§àÕ%ÈÃwÛ¦™ûóÇß]h¹¿Zgï¾ý,_±êo·ýÇm]èuÿ*ÙÓ¸a}Ú¶jñ§mp‘׸ðï_?ÔÔÔKÚÏüqn©Ô‚äNÛ°\“¦ú|>9öŸ¾ÆšuX»nãmãÈÑcdeeýír‡á•ׯãñzÙ´i Ó>þ4Oöƒ.§So2‘+ BÀÿ#ó.¦Ý=¸£Ïô¸»?+WýLJJ*7÷¼‡3gs—Ûà ÃFJ³v]ùjú¬ îïìïæ2í“/˜öÉÌ™¿WÆŒ£í=ñì(Ž;䔃yuì´î|­:vgÂÛï‘‘‘Éœy‹8xø8/ÀŠU?áóù˜öñçÜÝÿAnì~7£_K\|B¾jC¥Û%ÿlÜwà ó,þO_ãæ.èÚ¥ãmcä¨Wɸ”Qᆑ{¡Ä0ÀÈ£uø¯…‹9"""""""ÿéwëu0†qÞˆê¼ ))™ñ&óù´wøúÓ÷ycÌh6nÚŒÅb¡qýÚ,X¼4wٟ׬£d‰¢€Éƒä»é3ë‹©<8 /Ë–ÿHPP 7vhK»Ö-ø¿á0îÍI´jÞ„9³>ãûŸðËšõ,^²HNNfÅŠ•Œ9‚«æ2ñrÞŸòoŒ}‘Ù_}ÄðÆ‘’r~Ì’SRHJJàÌ™D^3·vcñœ¯‰ŒŒà‡¹ øjælRÒÒX>KæÎÄårrôØ1ÚµiAXhÏ<9„–Íšîݿ2áõW˜3ësŠ-ÆÓ>Í_'X~•/SÍ·ïÜõ+·÷º[zöa؈‘§}—t¿ý~˜»¯×ËwsæsðÐ^;õ7cš&sæ-dУø¥go>ýbºJ´ˆˆˆˆˆˆˆ\c TÂÝjµâÍvç¹ý ¢p¡¦Lý„䔢¢¢xdð@üiÕ¢)kÖ¬ÇívçŒHï#zßuN§“UÊðù_“ššÆõµj2ð{Ï}èñxX»a­Z6ÇívãpØiÛº9ûöÈ­ƒ~ËÍ)AP`µ«W£U˦NƒÚU9pèðßÃÚP±B9, êÖeÓÖíÔ®YM›¶±qÓ|>/÷öëC¥Šþ°fNf°HáÂ<ÿì\N''O¢x±(–._Iæ…J1äÁ¼¶iBhh°z ¹ê ÒÒÒóÜ~%'§ðà'ûÊó|ññdnëÞ•w'@`@6‹ÁªÕ¿ä.»~Ã&ü]N|>½î»ÆòÅGïQµRE&½÷ááaÔ½¾&­Z4eЀ¾x<^xñ5J—,ÆŒÏ?dÌKÏñêØ·Ø´i ˜&GáÉÒ¯÷]Lü&oNzŸ1ã&0ä¡ûyáÿ†swÿÁ¸ÝÙçíóÉ“§8}*€CGŽòܨW©Q½3¾ø²pQÎÅЯgÎæ×½ønÆ'|8ù--Z¡CGhÙ¬ v›GºÚ5«sôè1¾ž1›O<ʧ¾ËáÃG™õíùêüòz5?€ˆˆˆˆˆˆÈ•(X#Ü­Vüü\—TO÷º_ƒñ¯¦H‘´êx+Áü…‹¨Y£[¶ï&%5•›¶Ð®UBBB°Z­¼?i}óÖ]Üvë-øûûSªd ºÝÔ‘]»vçô!& è׋²eJQ¼x1*–+ÃÚR4ª+”§\éâ:|äo¡nÝÚÔ­S›à  Z4kʪŸ×Ì™„âÎÊ›ã_¥|ù²8œ0 üüü°ÛíDEE1ñ×(…ÏôÑ ~¾ýn.ÙO¾8·LŠEÒ›LDDDDDDä Ø ÒÁ@Pp0)©i8óØÄo‘ è߇ûúõaîü|ôÉW4iܘÐÐîë{Ÿ~>?—ƒæMcµæ\)U„ôcÀ½÷0}ælƾ1‰/?™’s¬g“Ò‘‘¸³=Œù¥J?ç5}gén·ûœ(eg_~òçbƒÎ­V+MnhLÓ&‰‹‹çÑaÏpÝuÕhÔ þï|óí²=žþ8AAÌüæû|unÅÆÅãïï¯C®:«ÕŠÍnÇãñ`³å.Üår2ö¥ç˜>óžxöUö»ƒ[nêDÅŠhP¿¯Œ}›Çy˜}ûP÷úê*ÀøWžcÖ·?0xØó ºï.zt¿™¢E£ÎÙvtL,Ùw÷˜{—Ýn£C›˜&†AxxXn—ãçrQ(ò÷ı¿¿žKHz_W¥rîÿûùù‘íÉíÝ©C[8xV«•ÇßO£†õÏ[?55•ׯM$>!ž¨Â…ÉÊÊÄëñâË'£ÆSSS Ô›LDDDDDDä ¸ÙÑJ–,Il\\žÚ§Ý¿îað£OKVVåÊ–ÁåraµYhß®ó.eÆìy´hÞ€WýÌ#CŸ&99·;›²eʈaŠŒ`æm$§¤`³ÙhÖ¸.?þ¸Š””RRR÷ÆD–.ûÈI”»Ýÿ͈ÇÃð§Ÿc݆ dddàçç"2"‹ÅÀf³àïÏÁC‡q»Ý„…†P¸PV›•#G1ñR, ©)©ùâ¼:pðÐ9wˆ\-†aàr:ÉÈÈÌsûV«fu^õ,»Ö/Åá°3füD223)ÁÚ0gþ"V¯þ™NíÛ`†aР~]^}ñ96þ4Ÿ””^}ý­?lÎ?áX-ÞŸ4Žo¾šÆ7_MãëO§po¿ÞX,&œw·Læ?¸ÓébÓ48].ú÷íÍw3>aÌKÏ2füÛ,Å5sö;vŒ±/¿À‹/!?½ÉDDDDDDD®@K¸WªPžøØ¼•p¯Z¥27ÝØ‘Á?ÅÐ'ŸáÕ±ø@‚ÎŽ$ŒŒˆ B¹RÜswü\.š7mÌ êsïƒCúä3LšüèÅb¡]›–„†Ò§ÿ |^/<ûËWþÌ}eÐaØNZ4o€ÍjÁ0~¯Ñb³ZÏylwØ.ÿÇÃbÉio±ZÏ©oì66›áO<ʇ}Á#CG0ä±§ ¢në±Z­<3b(£_Çâ¥Ëéܱiié ü/y“WG¤vª¼1ñ= ÃÀn·ƒ‘“L´Y­yî¼Ú³g/… EªÇ<¡l¹r$œ9“§öiÛöLz÷}²=œN'Û·!33 ïÙQâ=ºÝÄÇŸ}Åâå«hРËV¬dòaþ~~tìÐŽ'OàïïÏž}0§ÓIÉEÙ¹k7†aÁ4á˯g²é·ÉPMó?+%–íñ0fì;~‹ÅBÅ å)U²8 ñ ØÅÔ¼ IDAT¬V¬ ññ ¤¤¦R£úu„‡‡‘˜”Ììïæá3M<žü1Âý×½û Ré,‘+a+hT¦tIvìØ™çö«sÇvtîØŽÄÄ$BBBÎÉqgddp&1™Æ~/Q`wôìÎ=»Ÿ@DDxîsv»‰oŒÉ}ìççbêä ddfâ°;rå=2ËÙÇ9Ið'rGÖ†Áû“Æã°ÛÏÛß;ztÏ1úЃ÷bü¡°zÃu©[§&ááa¼?iÎÊr_p¾¯Ï—;ŠÞëñæ–ႜóÙÙÙØm6ºÝÒ•?Iƒ:5HIIÅj³Q«fuìv;CD¯{óÚ¨ÜzK{òYö ûeÌKÿÇó£^å÷§Ò¹}k²³s&n5}fžœœtÏž½4ª_Wo0‘+`˜¦i¤2M“‰ï|À‡ä‹ý]õÓ&MžJ“FuyxàýçŒ>—¼!##“·ßý€a?¬`Hž’’ʆ›hÕ²yžÛ7¯×ˉ“§)^,êœ giiéÜûÀ`^yq$eË”>gìlÇŽŸ l™RÙš@â™Düýýq:¹¿ONNÁétàt:1MHIIÁårâpä,“””L@€ÿy5ïÓÓ3€œï©iiX­ÖÜ»ŒÜn7™Yn‚ƒ~¯i‹Ãá ,4ä/?ƒ“ ;·•Ûí&##“à`233ÉÎöœ³í«Íçó1òù—xá¹gιh+ò_òxúì+ê5l‚Å¢’ƒ""—«@&Ü- … &3+‹µ²ücÇŽ§Aýúª¯/yNõêÕ˜SwwŠˆHžW`3Ñ”/WŽÓÑ1jeùG6mÞBÃúõtÁFò¬Å‹1}ælBþ1ŸÏǾñ÷S9‘CÎ$v¿¥ ¿¬]¯V–ËæóùX¶bMnh¨`HžU(2›ÍFbb’‚!ÿȦ-Û¸¡¡æ©ù·è„{hHûöí'##C--—%>á U*WÄép(’§õ¼­»~Ý£@Èeóù|,^²Œúõë*"""""""ÿ’p·X,tîØž…‹—ª¥å’™¦Éä)S¹¡±F·KÞW¼hQæ-XŒÏçS0ä²$§¤P¦tiüý ‘I/N]³Æuüº÷ÙZ[.ILl,ÅŠ£HáB †äy‡Íš°vÊgÉåù`ê'´jÙLù]³AÞÜ¥#ß}?W­-—äë³¹­{WBò6­šóãê_¹d11±¸\.¢ŠV0DDDDDDDþE×D½j•ÊÄþsÊÔ®A§ítK~>“žžÁÌo¾%:6Ž;{Þª #Eȹ›§ÛÍ]8vü£^Ë-]:Ó ~&Ÿ3M“Ùßþ@l|ÃLhhˆ‚""""†a´i×é3fá°ÛiÖ¬™ê·‹ˆHž¦„ûE>Ð+V(Ïȧ‡±nÃF^7ª•+P½Z5Ê—/«[ôó(·ÛÍž½ûX¿q3©©i´kÛŠª•+)0"R²DqFÁÂEK?á:whK½WòeŸ·aãf-]ÁM;н[WEDDD ¤råÊQ¦tiüñP@DD$OSÂýo4¨W—úu둑ɼ…‹ùä³/‰,\˜º×פBùrØm6,V ÂͮpþçLÈÎÎÆÄÄëõâv»Ù¶}Ûvì"-%™æÍ›ÑëΞØív Ýg(rQV«•Î:Юm63gÏg_ÎàŽÛºQªTI‚‚õþÉ£¼^/III¬Y·‘U«¦KçŽ<;bV«.‹ˆˆHÁvç]w°sÇœN§‚!""yš2Ä—À0 üýý¸­[Wn¹©3™YYdefÇ©ÓѤgdKrrŠ‚õ3M(R8’à`ÂÂBˆŒ§A½:4ozN—«î>¹,v»;{ÞJZz: gøè³/ILH BÅŠÔ¯w=eJ•̽«GIøÿe_÷û}Ònw6;vîfÓ–­=z”ÚµkÓ²ù ´m݇á`‰ˆˆäÏmMJÿß+Yª46›Cñþ0 Cû‹ˆ\%Ü/7`66DD„SµŠÊ0ˆHþàïO€¿?CÝOzz±qqÄÆÆ²xß~ââÏàó™$§¤h>‹ÿŸÏ‡ÕjÅßÏ!ÁA.\ˆ®7v"²Pv›>ºEDDòŠm[·²nÝZìÿðngƒ3gΪ`^âßI‡P þFZjÿ8Æv»R¥JÓ¢eKÕËùô­]DDÎáïïGéR%)]ª¤‚!"""r†7näð¾<6¨v»ýokÜxlPUþ5‹/¡}»¶ÿx}×˲å?òͬYtë~«*"r™TCDDDDDDä2­X<Ÿ{zÝyEÉv4‚XþeW:*ÝfµÒ®M+‚\ÒÒÒP‘ˤ„»ˆˆˆˆˆˆÈe8vì8Ê—½òd»He•+UdïÞ½ †ˆÈeRÂ]DDDDDDä2ÄÄDS­Zµw\û÷`Ü›“8zô¸Y°X-ø|>BDärûO…@DDDDDDäòä—‰Ì;ÎèWÆ‘‘‘ñ·Ë¦¤¤0óÛ¹¤¤¦¨EDDþ!%ÜEDDDDDDò°ìlŸÏGbb‰IIx½ÞÜçMÓ$;;›˜˜X²²²rG%{<¶ïØÉÚõÏù½ ¤§gÇã¹àkz½^bbã.ú¼ˆˆˆ\˜M!É›Ün7ÝnŸ“š×Uáó™sqÚmthÓ”—G=‹ÝngɲŒŸ0™ý‡OP¬p8½ïº~}îâ­‰ïðåÌ98ì6ê5ïÂìÏߣlÙ2Ì™·)Ó>':.‘šÕ*r÷·rc§öÀ¶»xvÔkì?x”uj0úù§)UD!""r 4Â]DDDDDD$s¹œ;vŠ å˱ä‡/éÚ©+V®aï¾de¹Yºl%Ôá—eßÒ£ÛLžú9‰‰I<øÀ}ÜÔ© ¡!Á¬\8“ªU«ðí÷syû½iÜ{Ï|9ímââ;~Ñ1±@Îd™_MŸÍ3O>ÊãßËž}Y¶|¥ADDä)á.""""""’W6«›ÃNÏÛºQ²DqZ·lŽÍfeÑÒ8F ŒîÝnbÝúͤ¦¥c˜&Ûvì"ÀߟÀÀ¬6+ÁAAØl6ÞxûCÂBCèØ¾-5ªWcîì/X4w&…"#œò4}{ßIÝ:µ¹¹k"ÃCY¿i«ÚADD䩤ŒˆˆˆˆˆˆHe1 J–( †a¸üüðù|?q’!=Ebr*}îêAJJ*9‰ó ñú|øcwذÛíçwR©bN²ÜbœýºoBFFgsõtéØš˜¸xÒRÓ˜·p Óg~C\|üï‰KÎÂîl7n·‡“'£Õ """—H w‘<.,$ˆ¾3é½yiÌüýhvC#Ê•-ƒ;;›å?þÄ#žc㦭¸œNÞœø. gˆˆ#--‰ïNáÄÉSôéu;™Ynú=ð_͘Íè—DZrõ/„„„\àU ŒœDDD䩤ŒˆˆˆˆˆˆHUˆžÎoN¢^šôësAAÔ®U“Ñ#‡óå×3(Y¢8úõfëö¬XùÙžlnêÒ‰Ó1q˜¦IVVË—cÊ;ãÿæ$æÎ[È“?Dû¶­±ÛlXm6Ê”,ŠÕjr&P-R8§Ó®¹DJ¸‹ˆˆˆˆˆˆäyËÿ?{÷&Uy¾qü>çLÛ^YXŠô&`Eƒ  "*ŠšhìŠ1jŒ½÷ò3ö^£&±¬1**DAPlX@A”Þ¶—ÙÝéçýý18,ÈÂhFóý\3sÎyÏ;Ïœ‹aî}÷™žzð¾;ÖÔ’Æí?Zì·oªÇû»Ñ»IísÑyg­wLÿ~}õðwmt† ÔÓ?’º_X¯Òд” c¹®«D"¡äWš¶îû°üw±Â€ å8ŽŽ9úHEc1Ù6kæÈtîd(˲´ã)¿üx€4 p ÜHwÒ€À€4 p ÜHwÒ€À€4ðP~yWŵ¸:¦‘ý³~ös7‡]Mû:¬ýÊ ü|kùŒ¤¿ «4ßQÏ2ïæ÷5Òë_†ÔvÕ¾ÐQE}BFÒž}üêT¸.I¸ÒW+£*Ï·UZ@LØ6¬pàhÎÒ¨îœÚü³ŸwIu\‡ÞZ©W> ɘô»¸"¦E6¿“‘fÎiѼ¥ÑÏé’We»F>Kr-=7«EóWÅ7ÚwYUL}oªÒË£\X€mBà@†3’š£§Û¶•ü;æn:ùn‰™û{ÍQ£¸»ùý+ê\äèJ”ŸµéXÁ5R4ÑúX¡Væôå·a}°0ò£µ°¬äŸ-yn #ýf`–vìæ×°í³5 ãÆ+Ø[·KŽî•­Ír±¶ ¿+@†2Fš67¤óŸoP\KKZŒî:¢PÃú$Iñ„Ñ]ÿ®×ËŸEäz¤»*ÒÀ.>#½ôQ³n}»I%Žd¶nšX ~| †\ís¥Î›§ãžmPåuís¥IÕª¦ÑU(ftØN~1®P¯µÑœê‚ m—o§Bïú|yT§ÿ½NgŒÌÑ_¦4©>äê´=²tÞÁE²méÛÕ1÷Ïz9W‹[Œ.Û?O‡ ÉÑoÖëÿÞ ÉoKÁ°Ñ%hqeLÇÜS-ËcixOŸ.8¤PÙÉ€YmBão­ÔêFW#zyuñ„B•ä:OhÃ9n&Ÿ/Ïwôí²`›°Â€ ýñÙzÝ{t¡þqf™žÿC‰.¾!ÕÊeêÒ˜lç×Ëç¶ÓŸGåêìgê%IÁ–„î~=¨{.ÔÓn§ã†fëê—Sã6Ä¥ÏE´ø²v ømÝöb½¶/¶õÒ9íôÆùí4u\O¾ÝÐêœÂ-®üNëó5FšY“ÐG‹¢zûÜvšü‡b]ù^HsW$[µ\ÿR½Ú! ÇÏ*ÓS'ë¼—Žºúí¨:ȯcöÈÖyãòµ¤:®Cî®ÑuGêµóË4¤“GWdp¶Ú{•p¥[æF5f÷\%ŒäZ–öß! ÅÛ %LsÄÕ;_†T\èiu…»$)–\¡^’ïh×ÚΫ—ç„$I÷Ÿ\ªÃ÷ÈÑ⪸®´¸ÉhU]B>%¯“üãóXúfETÛ9Ú«_@yY¶öß3O—Q$ÏÚ ÿØ>unçU~¶­¾iV$nd[–&Ïê•éÅÚÙ~[û hñʨÜMeÞŽ¥ûßlT(j´`ULS¾‹jÂÎYÉ4F·s¶Â1W7¨€#}W—$åø-UUÄdŒ´kï€þµ$¦7>Ééõ›tþ£5Š»?]»—5«£^˜µ‰€­Ç»ªc‘Gû옥7TªoŽ¥–¸ôæ …ÊòYrQˆÁ{ÄÈ£QÛtÀ—aY¯Ñ¸2G×N(Ð^sC:êñz½|b‘ÖÄ$³¶?‹cK“,Ð/Ö+çÜ5R±­ z{uñ¡E­v|qu{ìÎÙªÞ9[ ×ÈùÁ çY¼Þùö–§ý†åmYA7ó¼jZ i;`Ûß»)™//°.lßR߇í[ʶ6¶KÒ.=ýzfAT·¿Ö H|+Ë­uãm´ÉR›ž‡co} oÖĵº>®%U1­lظ¥Ž1Ò¿ç´èŽ·šÕ³W€ °MXá¶XIŽ­7ÿX¬Å•q5‡]ùsÔ¶Ò<[–%Ûúï/·,é{d뽯CZÚΫå•1õíà¨K±³Þ~ רª1¡«Ë×>;fó¶ ;h“AÝÔ}ãÇ;ytÚ¾ù1GË’&üñV3ÇÒñ¿ÉãE¤-eHwÒ€À€4 p ÜHwÒ€À€4 p ÜHwÒ€À€4 p ÜHwÒ€À€4 p ÜHwÒ€À€4 p ÜHwÒ€À€4 p ÜHwÚÀ±555QüºC `+¸Ðeeeš¿à _µ`0¨ŽååÚˆÀ€6(ïØQ‹–®TccbàW)kÚ»3Õ¾CŠmä¡´ÍI“NÕ·Ý£#=PeeeÊ Ú<†mÛ …ê¯o  H›æææ­¾¦b±˜‚MA=ùÌó9æÙ6ë4 ­Üh£ââyÖ9jhhпß|WÁÆ6aIr¹zìÉÉ¢[öæ…C!²²(ĈÅbZòää­º}>¿úôí«'®,ê […À€­à÷ûUVV¦Ã?œbüÄæÏ_ ¾}ûÊëÔsf IDAT²¨ÅÏïK€­GàÀ6 œüéeggË£ä:l2͸HwÒ€À€4 p ÜHwÒ€À€4 p ÜHwÒ€Àd´ÚšŠøE pÍ—"~Ü@Fkjj’Œ¡€Œç¡ ÓÔÕÕé™§ŸR"žÐŠË5gÎY²Ôµ[7tðAäDà2NAA¾üâs-_¾R’4oÞW’¤ /º°±h)2ŽãØ»ßþrÝuýÛ=:uîLq‹Àdc¤}FŽ’e¯‹.òòrÕ¡C9Åd,w‘²²²4x×S÷»v릜œ, ÈXî #y½^õ뿽Œ1r]WãÇóe©€ÌFà2Ö˜1c GäñxÔ¯w@FóP©ŠKJ´Ë.;É2F~¿Ÿ‚2+Ü@F7nœºuïNàÈx¬p`+% zœüä:uî,Ç«xzº&|à6…íߤ“»•mYÚsÝÕ¹]‚Á €¶þ;J ØrË–.Uï^=åñü<¿4nŒÙ¦ÕuÝTŸycŒ\×Ýü¹6³ÿ;zöì®ï¾ý–B@¸ÐÕ5ÕêׯßÏr®D"¡Çþþ¤î¼û­ «ªªuÝ ·èÙÉ/I’^ãm]{ýͪ®®iuÿ§Ÿ{^×ßx«jjjy¡ÿÇY¶½Í«åà;mäÙÆV2[Êiþ‚…šýѧ©UêmúÐoÛêÒ¥\ù¹’¤+WiÊÔw‹ÅZÝÁÂï4í÷‰Fy‘Øšÿ#P2_<WccPÑXL…òû}r]£P¨E¶í(++ Ij …dŒQV  ÂÂB1ñ0ÙNëëí\×U°©IÁ`“ÊÚ•J,h`›¸áÂá°®¿ñV½ñÖ»rÑîƒwÔí7_¯æ– Ùû@ý~âºêŠK$Iç^x…¾ž¿PÏ<þb±˜ûÝI·ÿ(]yÉùûÀÃéñ§žW,W¿ÞÝäÊ’dQp¶-eÈp«VWjÈ®;ë•ç×ă÷Ó‡Ÿ|®¯ç#K–r²ü²íuïǑϻn}ßç]oû÷**«ôä3/¨¤8_/<ó¨.<ïϪ¨¨$o`¸áÇÑþûV‡öeÚ}·Áò8½ýŸé­†ã޳eõ—-_!cŒ† ÞUÛué¬A·WiI1Å`¸±ŒÂ‘ˆºté(ËJ¦ë~¿_’‘õƒ°Ý5nêv"á¶é €?u»° Ÿ>îlw2”ëºZ¹j¾^ðšš›%IUUÕr]£ýû)++KñxB+W®Q$Quu>øðÓ-;/7W–eiÞ¼¯$IápDË—¯¤¥ Û€/M “Y–JŠòõ»cOÕAŒÑC=¥²Ò" Ûc7ù}>ývâú÷ëSuÜÉg(j—¶×’e+~tØÞ½z¨W®úvÑRÝð—ÛôÍ·‹åx½R$JÍØJîd(˲ԯwuúÍž:`ÿ1ºÿÁ¿jôÈa:bâ¡ÊËÍ•$ýé“Ô¾¬-Z¬ãŽ9J_½@ï0[ŽãÈ£Á; Pûv¥’¤¢Â ÙeÇ‘ã8ºíæët×=ª¦¶VÇs¤-^ª¹sçÊqŠÀV p Cy½^]Íå©û¹ášö)(Èפ“ŽKÝï߯0>uÿö[oLÝ>|â!:|â!©û%ÅźúŠ‹S÷Gì½E`ÐÀ4 p ÜHwÒ€À€4 p ÜHwÒ€À€4 p ÜHwÒ€À€_ oÖÄôêç-ÿ•s×5%ôÌûMj ¹ë=^٘г³›•pÛ>æ 7kiM\®‘ž›Ý¬5 ‰öqôúç-Z°:¶ñœšztzP¾Ôûß…õØô y7¸Ñ~Á«¿ «6˜à"¤;¿@sWÄôÈ{?àþmELÝ\¥Åd[ëo[UŸÐõo4É5¦Íã~¶"®úWÆÝðf“VÔÅ7ÚÇéåZ´`et£mõÍ®îšÞ¢!Ý|êTèh§Î^ütãFûylKŸ,‹i›«ä®#@z¸á\#5†7½l<7j-;6’‚‘Mg” ±¿×vo>…®ºêÓÞÑM¿+Rn`ãXÁ²$KR$nÔÝòDûšC ´c_rŒVæÙ5²Ön°ZÀ’:æ;ÔÕ¯íJ¼Ú±[@­%Ëoé”}òTê·4¯•à€má¡d&c¤Ú¬Ó_jÏ[Óª]=uD¾FÊ–$EbF×M®ÓÔ…QUÅŒþ~t¡ví1Ò33ƒú¿ÿ´¨O¶¥5qé¾# ´C7¿‚-®vÿ¿J]8:GÇ?Ó¨à-Ô6úý#µrãF5a£Cúùtþ„ÂVõ†¦„ºæÛ©ð{C–1zlZ£®ŸÒÒ&W—ïЕGÉq,Y§¬TìŽò8ɃÇßS­ã‡fé°Á9ú—J]?>_#úùSc¹FúdaH'<Ó¨B[Ú«§WM›ùÁÃú ë7öïÜÞQ$Îw@z±Â€ :¹QÏ_¤¿ŸÑNŸŸ[ª§SÁò›Kc9(KSÎ/Ó­‡äëôg$IÁ–„þ9³EÏT¬§ÿÜNÍÕe/¯m¯bIŽ%-«ˆ«þæ ømÝþJ½FwóèµóÊ4ûÒöªmvõ7Z¬CÍ ùœMÏùó:W+ê\ͽ´LóÎ-Õ­‡µpÍÚžëç±$kízuß …¥d¸¿ÿÃõzèˆM½°L#¶èÉEñ´Õ×u¹ÆéEà@†rli|&ÏjÖ²š¸Ê îîÓäC[±šÜÒ7•1Õdžõ Èïµ4j@–J³­m®«%©O‰£æ…dXäH#ZÊ©ÚKçZ¨ésšuèµ %Œî™¯1;%[ÊìØaÝÇú€/Ù<=îJÁPB'=P£,I#ûûT2’-%ÜäªrÇ’ ó¿_nn¤°ÑoÕ!/¹.ϱ¤ºù6ê•~ÞUú,$=:º`Ó“öZÊûA+š=ºyUt“ýÜ7psѹeIKªÚ³£g½Çv*r¶¹®–%>2_¯ªPEÜÒ5 ¸Øéyï¦d&×HJ<:aÿB¿ŸôÜ{AýG½B²$µÞ¥Ü²¤—> é“Ê„f]\¦òGS¾ IÓZZ?‰e©<ÏÒFåjïþÉqÆÈ¶¬V±ßsf™®}¦VOLkÔïGæ·>^̨1äª$/Œ¸4¦}úúåY›ÁC®Šr“ÛæVnº=Œ1Òv%ŽÞ__ï±·«úÓ6ÖÕHzíý ®ÞͯKÎçB¤ -eÈP+kã:êÖJî®Ñà>ÉÒ¦Û¹H’‘::òx-µÏs´¢&¦¦U’m«®9±QJïõXúã@Ÿ^ø YÁPBñ„Ñ£Sôô[õú>¥aý³´²"&wS­XK7¿Ò `ÈÕçK"š¶8ªƒw (/`kâŸ^ú$¤XÜèå›TÜÌ Êhûr¯|ŽôÊì&µD\=85(o¾èÔiΊ¸Æ ɕǶ¸ÐiCà@†ê\ìщûæjèmÕþ—JòD½fžR$ŸÇ’kŒ"‰ ˆ&ƒê½útÌŽ~9­ÖÏ5è/Gê†Q9:õÙEFuq¥z—Û–4éÀBeùm\T¡¼k*T2:ø7ù­¶|±ÖWÖKÉÇÛçÙÖÓ§ük+uös š:©H‹½’¤k.Ðë_†UtM…j:{¯l¹k'’üY@òv]"9¿Ü,GÏþ¶@?רœ+*䣣zz7öo!c¤†°‘‡ßû¤o-d(Ë’œ£ç(3Êò®‹À'ÉÑÄ!9ë>à;–Ì#R÷¯˜X¤ËSê VûtôiÒØäí%×wXï=¿T‹+ã ÇŒÞÌX%^eëäݲ4íë°nçÕ¼e1Ý;1o£ýbqiPWŸÎ> _¹~Ö!Ò‹À´I·ö>ukï˨9ç::mßüÔýá}²Zݯ ÇÖ)#óx? ~” @¸î¤;i@à@¸î¤;i@à@¸î¤;i@à@¸î¤;i@à@¸î¤;i@à@¸î¤;i@à@¸ÐG ¿nÆPØ î´AYY{Í_°€BàW­¡¡A]ºt¦ÐFî´Ayy-[Q©ººzŠ_¥H4ª·¦ÍPii;Šmä¡l9c¤I8M7ÝqŸößwouêØQ¹¹¹’Õ¶qlÛVSs³**«(*ÒvqÖ×7lõ5‰DT[[«ç_zM‡v„l›ušÐVî´Q~AÎ9ïƒAÍšùžÚ<†%©¨¬“&¿ò&ýË—.ÕªÕ«4t袳øæ¹®»Õ×TÀïWï>}uÆŸÏ•×류°ÜØ Žã¨°°PŒ;büÄ-Z¤â¢"ñ]ž€ŒÆï€ŒæõzUPXHØÈxî¤;i@à@¸î¤;i@à2šeQÀ/ƒ‡€LÇÕÔÔ$cŒV,_®œœ\I’ã8ÊÏϧ@€ŒDà2Ncc£.¹èB577¯÷øèÑctÜ ÇËjÈ<î ã””«´´T+W®Zïñ]vÝ…°±èá2Ž1Òñ'œ¨X,žz,''Geí;P@Æ"p©s—.êѳ{ê~aA¾ÚµkGa‹Àd$¿ß¯ ’$¹®Ñè±ceÛ…d,w‘,ËҨѣ‰DeŒÑoFŒ ; £ñ¥© cõîÝG;–+/?O¹¹¹ÑXá2Úï´zõì!¿?@1î £uíÞ]ŸO–Eÿv@f#p`+,X°@Ÿ|ü‘Ì64ƒÊËË£˜?Æ%Ü„ž|âqj±ùB) +++k«Žv]W¹¹¹Ún»í4xÈúåÀV p æÍ«O?|O§žr‚~ÿVsëmwêÌIÇPP¤…1Fo¾5UcÇì»ÕcDc1½þÆ[zõÕW5nÜÚˆî´eI¯¿ú¢N›tâ6…íkG£ Hãµ¹íדÏëÕAî/'R¨¥…¢@¸Ð+W®R¯Ýäóù(~•,ËÒ€íûiÁ‚ÚˆÀ€6X³fµð‹œûô÷féþUm]ÝuÁ&Ý{ÿ_õúomS|ütlÇQÂu)´õßOJ@Ûx½Þ_ÄF:A«×TH’&¿ðŠv6F÷>øˆ ©wÞù£ó¿õŽ{µý®ûhûÝ÷Ó¾ã×SÞ^o{UM­Î¹àr q &þî½3}FjÛ]÷>¤áû¬ÁÃÇéÈcNÖ»Óß“$Í_°P=í¥ /»Zgžs¡Ž>á’¤·Þž¦á£ÒÃÐC÷Õ}üUÑhŒ‹ð³"p CÅãqÝûàc*/+Ö7]¥Ë/>G3g}¤Ò¢\Y–¥h,¦É/þKúõ҇LCÆÖ]÷?ª†Æ Nt’Æï?JùšõöóêÛ·OjÜ©ïL×Ý·]¯£¯™ï¬o-’${áeš¿à;Mû÷Óúüý7äÆºû¾‡’‚m+;àÓÞ™¡ ÎQ×ÎuⱿ՚ŠJÝ|û}¶ûÎZµ`¶¸ãz=ýÏ—5ç³Ï¹ˆ?+% 3Å }µà;2n´F!˲´ï¨½õ·'&K’¼®¿æR­\¹Z_}µ@qוq]}þÅ\Ø{OåççÉãqTTX˜ê;oŒÑ™§OÒ€þýÔ®¤X¯¾>U_~ù•z÷쩊ÊjY¶¥%K–KZ¦ìœM{g–ZZB©9sÔ:ä q?:÷¢â"9Ž­Gÿþ¤šZšµÏÞ{iÜûÉçó©1”$ ²³>p9Ž£—_¢o¾[¢––nßOW]v¡-Yª¯ç£„›Ðœ¹ó‰D”Ÿ—'×5*o_ªSO9IùùyšóÙjn ©]i©þóî 577Ëëõè“O?×î» æBülÜÈP ²-[íJKdY–,ËRQAAjûê5:÷‚Ë´bU…Ž:r‚*ÖTJ–6êñ¾¡âÂÂd(àõ*+Ë/×5 …ÃJ$\¹®«å+VȸFcFdRýÕÇQï^=·hîú÷Õí7]£ÇFwÜý°n»óA¹—n¸öŠÔ>ååíå8Ž$iÐöý´jõIF}ò©Î»øåådëÈÃQ0Ø,7±þsêTÞ^ùùy’Ö=ߪš-[¾B2ÒqG©ž=ºq~Vîd¨¢ÂBy<޾úú%®,ËÒÇŸ~‘Úþþì´xéJqØx6éD=þäÓzwælÙÖÚ²FŠD¢²¬Íœdíw‹ä˳6üþí‡*à÷«²ªZ£¼¼\I’eI³EsojnÑv]:ë‘ûïP]]½î¹ÿ!½ø¯7uÜ1ߪ¤¤X’ÔÒÒ"×5²mëûiÈufÍš­H$ª¿Þ»ú÷í­·¦M_{~Kߪe¯{RßïC‡ ÖaÆËu]UVU+í¼ø¹¸©Ú=ŽÆ¡)S§ë·¿?I–m©¹¹%µ½KçNŠ'š9k¶êµfÕ*ü~Ý÷à_µãŽTXX `°Y?ö¸~{ø¡›=WÀï×Aã÷×OOÖµ×ߤ®]·Ó3ÿ|I#³§.»ø¼6Ïý?ïL×M·ß§SOü½ú÷ï«%KW¨}Y©zôè–ú’ÖDÂU2ñ_ž[–¥òòòy=ú¿›îPqQly<Žn¹ã>ùÇS6:Wy‡êÙ};ÝyÏCª­«ÓÔÿÌPUUµn¿ùZí0h àç{ï¦d&ÇqtÎÙg¨SçNúbî<2þ-]ºL÷>ôù|> Þe']|þ™úûãÏ(';K·Ý|ƒ>™ó™¦¾3C‘pDãÇí§e+V©¦¶NÍÍÍÉ~îy©ï–%åçå¤V­Ÿrâ1*))Ò?ŸI ¿]¬³N?EcÇŒJÍ¥0?OÖf—˯3~Ü~ÊËËÓsÏ¿¤§Ÿ{A»î²“.:ÿ,ù}>Y’J‹òS}å¥d?ú¼Üœµ}ê÷Ñ’eËõáGs4~ÜxÀXÝ}ïÊD#jiiQIQ¾~êØÜÜÝqË zè‘¿ëùÿ¥wÚAw¦ ÀEøYYÆ|ÿËXÀÏ#ë±§^ÔÄÃÿðKóé§Ÿ¨$×§w´ÍcÝzÛ]:÷œ?mr{ÂuõÎ;ÓUßР݆ VA~¾®û¿›µxér=ñØò¯ 1[„§Ëê5jjjnu›ÇãQ·®]RsŠÇ[ÜŠÛfÊ›okì˜}·yœ/ç}¥5µ!íºë®À¯†eI<üN=ñ(ååþ4mÇXá@†²-K±x\>ò„n¹ãAIRnn¶Îüà òù|©ý~î°]’b±¸Âáp«Û¼^ßz÷ Ûÿ+ÜÈP–eiìèQÚmð®ú싹2F8 ŸÊÚ•þWBöÚ®K'©K'^$~€À€ fY–Š‹‹4rÄpŠ@†³)ÛŽÀ€4 p ÜHwÒ€À€4 p ÜHwÒÀC øåYVײš¸öêøÙωM_Ö½ýÊõ§-_}‹«G4ª–œ4w¦|’1RA¶­úW’4¸›Oå…ëG$.Šh`G¯²ü¶,‹ë °eXáÀ/ÐG‹"ºiJÓÏ~Þåµqy{¥þö^³‰4Ž[×Ë¢©süé¹%&­sÄ¥Ó¯W¤1.;a”å]ùlƒ–¬Žm´ïü¥õ½¢BË«b\l€-Æ w2œ‘Žey×-µ¶dÉY{7îyìÖ—a‡ãFµÙ±¿ßŠyKžÍ,Ï«hH¨$×ÖC“J7¹úÜH2FÚÄ”‰ù7˜Ó CZÔh´Ãv>Y’|¶%ËJŽ•pÕêœB±ä8›:OÂ(U£ïy-iŸ³U\ŒDÊ_ ¶zì±ûäkq«wæGtl™—‹°EÜÈPÆHï-ëÊçTä•‚ é†Ã 4¸W²ŒëJ¿Ý¨—> É—eéÆ# Õ·£OFÒësZtÏ[Aù])§ÀÑU Ô«ƒWÁ«ßÝY¥Icòtõ?ôîåí%KúÓ?jµª:¡„k4ap@'.¯• ¾¦!¡.y¶6áOû¢EWOn”Ï+=.OÏ~Òeå«w¹O‹+cºâ…µ4&Ô˜ÎÚ/Oì”­'§Ôë–!9–Ô2š°[¶½öY‹žÚ¤æ¸tõ¡Þ/ Ë’–TÅõ‡û«åñZ †Nß/O‡Í‘eIï®Öäêªgtåø\í>(g«ë߻ܣúf7uÿô»*µ}_¿N[ÀÅ h;*7:ã©zÝý»íØÕ¯5µ1ÿhf]ÞA’ôÎÒ¨&í‘¥ÇÏ,Õ[_†tÞ³õú×ÙejjIèÚuç±Éþߟ¶èúWõؤIÒÒ£™_‡õÂY%òû-Ýðl­ÊüÒMg–ÊuÎy¼N¹žF;zã`9rðH­%î«êõ·z½y|¡vêê×ä™Aýãë¨.•ô6 IDATŸÜ~ÝóõÚ£§_¿ž«E1ýµ}@Gh^«â|GgŒÍעʘ>¯wµ`u\?­T VEuæSõzçâ2|–ÆßQ¥“÷ÊÑq{種ÉÕžwVkpŸz´÷*7ºñ¥FÝ|TºwðmSý-ËÒ'Ëâ©û#vËV—R¢À¦ÑÀ eYRÿ[Ÿ|Q(nÔ·³_ï_Ñ!õ%žÙ^Kû⹮tÇQ4Ÿ¥@ÀÖa»4saT± z¨‡bF³¿« ßiu…ûìù!ØÑ£‘³Ô®ÀѸ¡¹ëm¿û¤R?"W•Á„ü~[óVÖ%”å³ð&ÿdû’#Kúè<•ä;Ò' Í®ªâúlYTF:vï\ÙŽ¥v…µC@Mo–$¹FÞׯÝÊl[ì1x;¯æ,‹*º¶WýáCs5´W€ °IüX€ åõX:ÿ½8=¨}o©R»\[·^ »û%IC;{SýËs¶dIÑ„äÄŒÎýG­–WƵK'#Éf汄䱒}ÍK‹ÖFƨ¾ÅèšÖ«4k]ŒÞ«ýÆ‘ÁTiVÐèãJS¡ÿ5×ÅÕ«ÈÖ÷ËßË õ¶?7½Q7½Ý¢Cúxås$mºµ¼v(pXÛ³Þk[ò(Ù~MM\ñˆÑéW¯×»½KYr¾®‘tó¥¥þ]˼ڽ“GþóVÉÜÞ‘ ð£ÜÈPÆH;u÷k§î~]sõЛþ`­êoè°Éc,Kzý‹ž›ÕG¶S·v^½;?¬;¿¬Ùä¹Y–._ =û&ƒ|wížz7øÆÑëO,ÑÏÖ饚4a܆Ê/ñªòÛ˜ŒI~kup]ÿó%5qðJ³ž<2_Gî‘«ª¦„®þ¤¢Í5éÜΫ:WzèÔRùÖòîf¾ u[Ôš¹$¦”r1¶-eÈP«êãºä±j%ŒQ–ßÖ‘{穹Å(3?úa¿s­e^Õ7'ôÈÛAÉg©%ºñqÇÒé}½z÷‹I>¥)7éí›´áÞù9ŽFÊÒÂ¥¹­L¡g'¯^ZÓŒùa%\£'ß ¦¶¹nrbG ÍQÂ5znf“dIËj“=Ò³¼–êªc?Z“><’%½ñY‹ےDZtÏËuš·"šöú/®Žk×>õ)O®˜ÿ|YTËjâ\˜€Í¾€ T^èQÿn>u¾¶Rãî¬Ò¸{ªõÊ1ÊõÛrQ(±Á#cŒö”¥=Ë=Ê»|ޏ¯F›§›÷ÎÖáÕ*7ªŒií*tɱ¥SÆhi]BsW«øê ½5/¢ÝvÈnµã‹Çkµ¶KÒ€N>Ý9&G'>Û ½n­R·vÉ_¬7’z´óèºáYò^¸F½®­Py¾£Y,Ò•¯7iIEL ÎÒ?Æ´ïÍ•²lKkbf½ÀU,¹â?ÇoëÓÓ‹uû´få]±Fݯ©ñØÔ%Šf“ók«%ÕñTÿvIºî‰Z=÷~3&`“h)@†²-鸑ù:vŸ|5†Ê˲e¯írèàMØ5gÝ|ÇRüáNrÖ¶¹çäRÝ7ò8–l[Ú; ³M2`_v]{Ù?hÂÞ³½WœÖN»ÉÛ±­M¶h±-KU-Fk»Æ¬'ž0:d÷\;2_ÛR}È•wr£:­íå~É¡Eºèdn¯ç;½³’粤o®l/)yîU×´—óƒIÄï(OÍyçžM¿8 HÌ•ßkɶ¬TOù÷Ïk'ËJO™%5®ú”­‹N®?¾X³¿‰pa6ýÞM È\–%Ù¶T˜ãȱ­TÆm[Éðü‡œô\·-ÉçM†íîïØÖF_zj[ÉÐÞëX›í‡¾cŸ&/ˆéᩊÆÍsµtÕË ºêéZ}µ*ª+Ÿ­ÓYý} øíÔsqKŽ“|–’s²¬ïo[©ûΓØpÎŽ-eûíVßüü-I«êªlŒkU}\áDëû½=7¤>lўݽë›ш.JÀ&±Âl±²íµc¶<Ž•s÷ØÒIò5ùÕ—x´ª:®;øUœïl´ï»óºpLŽöꟕzì#󸛯¡ -†öÏÒÐþ­oË Ø:h<”óö{,]<¡p‹ö½öÈ"^h@›ÑR€4 p h)À¯\³Es+âš¾ ¬DbÝX‹*cúçGÍŠl¾Wzõ³½2§E!7õøgK£Z¸&¦Uuq}¶<Úê-K²­äß–ÅkøßEà@†rtßkõpKµ¾]ш+uó³uš1»I’4gqD…WW¨¾6¦7ç´(ëÒ5ª &”pV¬ŽÊ$¤x(!#ÉcI×<_¯{Þ jî⨺_]¡ê¦d?ã‹fµ»ªB- }·"ª¢k+õÉw‘ä¶ÙMúËäzuº®R,Œð¢°ôp CÅâFç¾Ò{§kÏ>?*_]®X£:yd$ƒ ½L†ÌÖa’¡½õI‹Ž‘§Á½üÊYÕÈrKY’&lïÓqûJ’ª‚5š2'¤#†å让Ízùˆ|´{®$©ka£^˜ÔNÝý²l郪„â7—˱Y¾À渡šÃ®¢-®töI’|Ž¥ú%o[’v럥™ß„uöSu2–ô鲸ºçÿà—ÙM²»$%ŒÔ§W µi÷.­Z‘ëæèµ5 y> kÚ·1IÒÒš¸²QÂM}ÊÎ~ÙôŠàG¸¡¾ïÉnÿ C÷{’ÁwÜ5ºöÙZ=1?¦wN+’ÇkëîHÃ&Çr%eùÖ ”Z¬n¤–¨ÑØþ~õ/_8Ž%gíî9>+™ð€Í¢‡;ÿÏÞ}†GQõa¿g[²é•NhÒ{ŠHU,/öн7Š‚‚Eì¤#ÅJ‡ô²Ù>ï‡`  0Àó». ›=sv2³óÌ™ÿˆˆˆˆ”QñV°lÛçŠF«ÏÝTtãR¿¾Üêgâ•QÔ¨B¥?î Ø?¤Ý4ÁüçœÜb•m$„´­ë¤m]'ÕÊ;H*gW ‘c¤À]DDDDDD¤Œ²Ùàî¦!t›Ág« èùÊ^*Ø 0Án3¸¸ª•u›Ý¬Ù\HWöѲ‚•ï·øHÍðÓºv¯­õ°bc!>¿YÄÿÉ4)žÏÀvNúÏËcúÂ<~ÞæfФ –¬w˜NDDDŽnß­.)›¬ƒ'®‰åÒÍR³LÇ» ò°ZÁj‡ûÄñÉZó7û˜0 –rÑ6f¯r‘’ MÍ~KJ^ƆÁÓ="©g-žwÓº¡ä%¥é=ÚE²(ÉÁÌUnvåyyùšêT,ªߪi!vCeDDDŽ‚w‘2*hÂç+òIŒ²rý¹d»‚ÌþÙÃkýbˆpZ¸¦]D‰×\svxñ¿/¨ç,þw¯a%¦kZ-¤øßV Ô¯ÂãUCiC»:¡ÿØÎƒï§ª{«ŠˆÈ™L»ˆˆˆˆˆˆHe1 C‹ÎC߸X¼×ÏKç8iU=¤Ì´1`¬ՅìË b°pƒ—¸ êЈˆÈ™I»ˆˆˆˆˆˆHnaòðD‚AMBìeëvlwõˆ¦Ðk‚Qt‚àÊ¶áØ¬úÜDDä̤À]DDDDDD¤Œ³Z ¬°—ÁJê ‘J×EDDþdQˆˆˆˆˆˆˆˆˆˆˆ?î"""""""""""¥@»ˆˆˆˆˆˆˆˆˆˆH)Pà.""""""""""R ¸‹ˆˆˆˆˆˆˆˆˆˆ”î"""""""""""¥@»ˆˆˆˆˆˆˆˆˆˆH)Pà.""""""""""R ¸‹ˆˆˆˆˆˆˆˆˆˆ”î"""""""Çr m±Pàr©#äôfª DDþÕ÷uˆˆˆˆˆˆÈÑ+—XŽ 6¨#ä´–ŸŸOùòåÕ""ÇH»ˆˆˆˆˆˆÈ1¨T¹2[¶í$?¿@!§% ÀÂÅK©T©’:CDäÙÔ"""""""Çæ†ƒyþ•±ô½ö âãqØÇ<‹Õ‚×ç%¿ @å;¤Ô¸Ýî}2(à*tñÎô÷9ûÜöX,§)"r¬¸‹ˆˆˆˆˆˆ£Ärå¸éæádee2ó£/päÿ«ùxVÆOš¡ý~Ÿ›Ý®Ž8 n·›MÛSÿÕkív;µÎªCŸë¥Îù¸‹ˆˆˆˆˆˆü ááᄇ‡s͵ת3N°_ý† ¨#NSW\ˆˆük ÜEDDDDDDŽƒÂÉ/22’`ÐÄ0 u†ˆˆ”i*Æ%""""""""""R ¸‹ˆˆˆˆˆˆˆˆˆˆ”î"""""""""""¥@»ˆˆˆˆˆˆˆˆˆˆH)Pà.""""""""""R ¸‹ˆˆˆˆˆˆˆˆˆˆ”î"""""""""""¥@»ˆˆˆˆˆˆˆˆˆˆH)Pà.""""""""""R ¸‹ˆˆˆˆˆˆˆˆˆˆ”î"""""""""""¥@»ˆˆˆˆˆˆˆˆˆˆH)Pà.""""""""""R ¸‹ˆˆˆˆˆˆˆˆˆˆ”î"""""""""""¥@»ˆˆˆˆˆˆˆˆˆˆH)Pà.""""""""""R ¸‹ˆˆˆˆˆˆˆˆˆˆ”î"""""""""""¥@»ˆˆˆˆˆˆˆˆˆˆH)Pà.""""""""""R ¸‹ˆˆˆˆˆˆˆˆˆˆ”î"""""""""""¥@»ˆˆˆˆˆˆˆˆˆˆH)Pà."""""""eZNv¶:ADDN ÜEDDDDDD¤L ê9%(p) ÜEDDDDDDDDDDJw‘R À]DDDDDDDDDD¤(p) ÜEDDDDDDDDDDJw)ÓÌ ©N‘S‚w)Ó òÕ ""rJPà."""""""e›©î""rjPà.""""""""""R ¸‹ˆˆˆˆˆˆˆˆˆˆ”î"""""""""""¥@»ˆˆˆˆˆˆˆˆˆˆH)Pà.""""""""""R lê)‹LÓ,þiƒ`)7h†:GDDÊ$î"""""""Rædff2õ)øý~v§¦²lÙ20 jÕ:‹ÞWôf/""R¦(p‘&hšlܸ‰µë‚ê‘Rä uÒ°A}ª%UÅn·«CDDä´Ƕ­[غu;7n }ûö ÛED¤ÌRà."'„ÏçãõñhÜ(ŒžÝê‚®ø)U_~]Ƴ?â{îÒ¥õ""rÚ1 ¸æÚëyâñDZZ­„„8¨P±¢:GDDÊ,î"rB$ïLáì6±´i]§¸î¢ˆˆ”"´i]¯ÏÏŠ•«iÛ¦•úDDDN+¦ ›4!.>Žœì"#"¨X±’:GDDÊ,‹º@DN„ŸÖ¬¥aƒ¤£ÛO¥‘™†a”h¯ahÿ_Ÿ9ÑÎ9».¿ÿ±A!""§%§ÓI‹æÍ€¢§¶i{6v»ÆŠˆHÙ¥À]DNˆ]©[±Ù¬G5íî=™Ìx÷;’“ÓÊürefå1ï“%,\´·Ç˲åðɧKÉÍu1çãùìóå(s‘“Å0 |:BDDNK‹…sÏ¿ŸÏO0¤[îªß.""ešN ‹È q´ß Ò÷eóä3ï3ã$%•ÿoÚkšM«åÈç!sr] ¼ñ%6mÙKlL(‹¼ÂSOMcöÇ+ˆŽ eÆÔj|öù¬6ݺ¶=†^‘#iÕª5V«•råHHHP‡ˆˆH™¦î"rÒ†ÛíÅåòRvåà’,ùù…‡}Þïàv{ÿRÎÅÀb1ŠþYÂÆ0 ‚A“œ×Q•xY³v wß3þo§-,ô¶7‡³ÛÔféâÑøýA6lLÁ4áûo_ଳ*ñöÄûxküª[/""""RJ¬V+7ÜЗúõëêT‡ˆˆH™¦À]DNŠ‚7wß7ˆ„DÅ dÐWIÝQbš”]éô¹îY·¸•Ûï|ƒÌ¬<<O?;ƒ Õo$©ÎP}ìöîÍÆ0à˯VâˆëËè±Óæœ;xoæ|‚A“9sR«þMÄ—LͺCX¿~Ëß^zš•Ϙ·—±LVV>U*!/ßÃË6`ØúàŒïϯìÆf³y56¦Ðó²‡é}Õ“ªã.""""RŠê5h@ºõ°XcˆˆHÙ¦=•ˆœp†aðö”¯øæÛµ¬]þ$i»Çá°Á¨Q³K„௼ö1W_yW\Ö’o¾[ÇâÅë˜þîw,]ú=Ћ/ç>ÀÇóVðã’Ÿ‹ç]µ\(Óģu‹êÔªU‰…‹ÖñÀ#3rc'ò³'sE¯Ü÷ÀÛäæÒ¶¼<yy.\…nB–âÇn··ÄtQQa|õõX­Î9».;¶Žâ÷ÕÏQ#)¿?Èöí“(—ÝnÃn·êC)%‡ˆˆHêÕ¯ËåÒÕ¤""R¦)p‘Î0 ?ß…ÏdÚ´oØ´9•çžÂÓOÝXbDùm·ô¤÷åçòøÈþX­6~þy¦irõ•ðÆØÛ9÷œ&äç»IˆàÃÙ?–ë»]Ú‚Ñ£n£m›zlÚ”‚?¤UË:¬ÿy×`[r:i{²i[lì šµ¾»ï›LõŠa4iyM[ßά٠KŒR·Z-TªaÄÄDPµj9ªU+OX˜ƒ  IIå°Ûu[ ‘Ò´pá<ÿìSD…IŒr0çƒwyæ{ ÝED¤ÌR:$"'\0h2lhO `Ú{‹yýíÅTˆå¹§®çê«ÚOW£FyLÓÄ0,$&F 1Møú›U ¸åm:_P“úõª’“ë"66¢øu¦iÒªe £¨†ûŽä}Øl-ZÕfÅ0 ®¿æ|\…^ ƒAý’%bX V®ÜÀ3/~ÌÇÞišT¨w„/ñæ_~ŠˆˆˆˆHi3 øxÎ*ÄGðò³cµ¬}V-Ö®û™Ñ£Gqë­·©ÄŒˆˆ”9 ÜEä„3M«Õ›zpß½}øõ·ÜvÇë<Ú´®K0¨0]DDDD俘=ëCêÕªBûóÏ=äþHÍš6&**’—^x–[oÓ©©ŠˆHÙ¡SÁ"r†Á##'sÀçY·~+™Yù& ëW!$Äþ·¯µÙ­DD„â°2uÚ7Ü{ÿxì6 ›6§òÕ×+ Ð 5ªIx˜GF¾Í_®dðЗ:l¹¹G|«ÍB»¦‰ú°DDDDDþC~¿Ÿ·'N UÓºt¸à¼CÂö?Õ¬QÛ‡ â•—^Àív«ãDD¤ÌPà."'ÅÈGúqÎ9 é?h}û¢ý3j–ý%^2²=i1)tû‚„‡…rÛðË©W·ÌZÌUWv`æŒhØ ‰S¤ìs—ß¼ymÆFzº‹+û!*2’G¹ŽØØÈ#¶ïüóñÍ—ÏÿýèvÓ$7ß‹ß(þ•×ëgo¦g«Áçóãóô‹ˆˆˆˆ£ÂÂB&NO¯®hÕ¢ù?N_±Byîq ¯yŒŒ u ˆˆ” †©;ˆÈ ðꘗ:莕«þ¬±±Y­Å!¹aüùܲ2KÉÇæQÐÿùüÁ¿ûë´‹A0h¿ïqo0÷·(æ-–¿,"r¢™¦Éäi¿0xÀÀSªÝ~¿ŸÉïÎáÊ«®BßFED¤  €÷ß›A׋/ AýzÇôÚ=i{™:ã.íqUªTÑ~EDDŽÈ0`Ò[2ðZ"#"NÈ{h„»ˆœ4†ÞV‹¥DnšEõÁ¿ûëョ=øyÓ48ퟡwiWü³‡éÿôXDDDDDþ^nn£_}‰~×\~Ìa;@…òå¸eè@>xw*Û¶mS‡ŠˆÈJ»ˆˆˆˆˆˆˆü'222xó±Ü×­”Kü÷÷T  ãÁ{ïäÇß°~Ý:u¬ˆˆüg¸‹ˆˆˆˆˆˆÈI—²s'“Þ|GA||ÜqÏÏét2lÈüþójÖ¬ù õ±ˆˆœ| ÜEDDDDDDä¤JNÞÁ¼?ేï#Ìé,µùZ­V†@ʶ¬\¾ݶNDDN6î"""""""rÒlß¾>|ûïºÐÐRŸ¿aô½öjR¶odé’º‹ˆÈI¥À]DDDDDDDNŠË—³jÙ"yànl6Û {‹ÅÂý¯ÇaxùxÎGƒAu¾ˆˆœ ÜEDDDDDDä„[¼x»wnæ¦ý°ŸÀ°ý`/êHµJñÌ›û1>ŸO‚ˆˆœp ÜEDDDDDDä„ ƒ|ðþL"ì&ú]wÒßÿ¢Ž8»EC&¼9N¡»ˆˆœp ÜEDDDDDDä„0M“fÏ¢þYU¹°ÃùÿY;Ô¯KŸÞÝ;f´Bw9¡¸‹ˆˆˆˆˆˆH©3M“qo¼N›fõiþ¹†ñŸ¶§öY52àž|â1Ün·> 9!¸‹ˆˆˆˆˆˆH©òx<Œ{},—uíH³¦ËL»ªT®Ä£÷ßÉè×^&33S”ˆˆ”:î"""""""RjÜn7/½ð7\Û›F ”¹ö•KLàáûî`Ô+/’““£LDDJ•M] "RöíLI'3+_!§Ó„jUˆPgÈi¼ž›lß¶—K!§ËZM5 WWÈßÊÊÊbÚ”IÜ}Û*V¬PfÛγO<Ĩ×ߢ[¯+HJJÒ‡'""¥B»ˆH™>`Éç™çqáùIH¬þ¯æa1,|0kW^ÑK*¥Â4MÖ®]OóæMÿÝëƒ&‹ïeùêo¸cxG¢Õ©rZÙ»7)“&Òáü¶ÄDGcþ»¿V¬XE›6­Õ¡R* ÉÍÉ¥|…òÿêõÁ@€å ¿fõú Ü|Ëp""tÒT÷ݵ(l¿iàõe:lÿSDDw ¿‰q&Óþ¢.œuÖY˜¦>G9> ÜEDÊ(Ã0xö¥/yräÓ„‡…×¼–¯XA»¶ m¤t˜¦‰×ã>îuªóÅyyÔ³ªá."RFíÛ—CšuŽ;l)»¸a´mÝ´½Ùê 9mdggÓ±ýÙǶ‹”U‰ ñT«\Ž={ÒÔRlÛ¶m|2çCî¿ûŽS*lÿ“ÍfcÈ ¤&obÙÒ%˜:›$""ÇA»ˆHµu[Íš7;í–+##“ 7ãrþëyìLIe÷Aú™YÙìHÞ‰?`ÇŽlÛ¾&Ê%&’²+C!§Ë—QµJu„œÞÛîòå),,TGëÖ®áÇ_sÿÝ·ŸÒ'm67\ w._õ¥®¾‘M»ˆHå÷ûq††žmu¹ Ù‘¼“`0øÓ.[¾‚ë #yçÎc~Ÿ@ ÀÈ'Ÿãòÿõ§Z«Kðûý,X¸˜ö/ç®ÿcëÖí¼øÊFÜ7ó(Ú""RÚ O‰ÚÖÁ`ääx<Þ2ÿ—‹ä)G%jš&óæÍcìØ±'äýÇÏo¼ñ·ÓL˜0éÓ§k¥ý74úWöÿÿòËÏløu ÆÂf³žòËdݺ^B¤ÓàË/¾8ªï¶"""¥À]DD4Í#†$‡;ðX¶b%wÝ÷(ç±ÃÉì? 3Ž8¿#ÉÌÌb媵”+—@Φ¥†Á_~Ýfå»OgrV­¼úÒÓ¼?m‹vq"ræÇT!;'‡ëÞž´½‡}þ¯ó:ÖÐé›oçóÔ3/â÷ûû|zz:>ú(—]vÙ é+®¸‚«®ºêo§éׯÏ?ÿ<«W¯Ö $rŒLÓdÕÊ•ü¶n7 €Íj=m–Íbtër Ñ¡Ìþð€>p9&ºiªˆˆàõúxkÒ*T(ÏYgÕäóÏ¿Â0 ã…hÓº%©»÷ðåWß²+uåËѽ[*WªÈÇs?aî'_ž‘Åëã&Ð÷ºk(_¾99¹L›1“@ÀOõêÕéÚ¥3vûÝN `ÊÔwÙ¹s'­[·â¢Ží±Ù޼[Ú“¶—·&N&¿ €¸ØÆO˜D0ä÷ ›qØíÌþh×ô¹šïçÿ€Ëåâ¦A0t-°ˆœæ<^/ïLÁîÝ{ sÒ¥Kgê±Jš IDAT7lÀ–-[™÷Ég4mÚ”Ž^€Ûífêô÷ÈËË£C‡ xoæ,ü~?“Þ~‡N:ËW_Cç‹/æÇ%K¨_¿>.8—õ¿üÆüù ÈË˧n½:ôèz)¡¡!@Q¿`áb~úi ‰‰‰4mÚ„¦2köÇL{o6›QcÞàú뮡BùrÅm6M“»ï¾›qãÆQeù—ËÅ¢E‹HMM¥S§NT­ZµxžššÊ×_M½zõhܸ1«W¯æ¼óÎÃb±ššÊÒ¥Kñx<\rÉ%ÄÇÇ••@bb"Ë–-£I“&üôÓOlß¾ž={Ehh(£GæÕW_åí·ßÆáph…9 ¦iòÅgŸnã¦Aý±œ†ß· ÃàâN²fíz&Oz‹~ýj!""GMÃÿDD„ äÛ‹™4å]}üyââãøèÓo¹÷¡'q¹ <úø3Œys Õ’ª²tùJ{ò9qqqìNKÇb1¨R¥2v‡ƒÕ?­¥û׳dùjÒö¦óôó£¸ý®û‹G:Z-ù i{÷òíKx쩗ذqÓß¶ÑápP©RE àB…r$%U¥J•*„8ƒAªW¯†ÍfcÍÚŸùañrÝìJDN{n·‡ACncòŒY´;» ¯ŸA7`ë¶íT­Z•»vsÏCO’¼3…/¿þŽ)Ó?¤E‹æÄÅÆ²/# Ã0(_¾111deåðþìÏxøñg™4íC\®B¶mÛεý‡ñѼ/©T¹/šÀ¸7'““˃<ÉC#Ÿ#""’Ñã§pÏý#Ù½'rå˱w_6›*•+R%''³}ûvêÖ­ …íݺucÛ¶m$$$ЫW/V­Z…í­Zµ"==¥K—ò¿ÿýaÆa±XHKK£S§NÅ£ïÈÌÌ`æÌ™Ååb®»î:yäþøãòòòˆŽŽ.¾"ëÜsÏeÆŒdgëæÍ"Gõ1dÞ܉‹ ¡g·KO˰ý`Í›5á’Žç1cÚ;ºoˆˆ5p‘bé™Ùüøý'Øl6"#Âyuì$Ö®ÿ…Æ ë3ô¦±Z,Ô¬Y` Èèñï°#9…óÏ;‡„É3ÈËË£gn„9ôéû4‘áaŒ}í9¢£¢¨Q}:.W¹¹y@ÑȨœÃ·åê+/gàÛùäó¯iØ þÛC·®]xÖ<Ú´lΗ÷ÂðÓOkùmãv®ì}>ŸS·K‘3ÄÞ}{Ùº}'ý¯»ŠvíÚÒ°a–­ø‰E‹—pCßkyúñ‡éÛ(#î}„=iûèÖ¥#¶?€úõê°ióvºuíBõjUY¸h µkU㣙“±Ùl¤¤¤2åÍ׈ˆ§råŠ,üq9+W¯!?¿€%Ë–³`ñ2n|7\߇¶mZ1þV®ú‰^=ºâóû)_.+z÷Ân·—hwNN•+W&22(ºgɈ#èܹ3‹ÇÃðáÃY¾|9ßÿ=^x!wß}7n·›={öïKž{î9zöì‰ßïç‹/¾`Ò¤IÜsÏ=X­Öâ >22’5j0hÐ ~øaÖ¬YÃÙgŸÃáà²Ë.ã‡~øÇ4"g:ŸÏˤ·Þ¢G— iܨÁ³ÜM›4"!!ž±£_åæ[n;%îÓ!""ÿ-î""R¬M«¦X­V àb…ŠX ƒÍ[¶rv›–¬X¹’ŸÖ¬#à²/=«ÕBJÊ.jTO*1¿?Àž½´mÙ˜0§«ÕÊào(1MÐ4éÜ©P„„9CÙ—žq -5ú¿ˆÈ™)#£¨lÊç_~Ëòå«öÌ&É)©„‡…1ô¦þ<òÄ ÔHªÂ­Ã†üÃMÚ¶nQ\Þ+$ÄÁ{ÌbßÞtlvÛ¶%†×ç%++‹@ H«Í€¢Q Í›59ªv^ÄGDDàv»¹ùæ›ñù|¤§§“›› À÷ßOóæÍ‹_Û©S'Þÿ}‚Á 111lݺ•ÁƒãõzY¿~=N§ó÷óz½4jÔ¨øñ!CŠG´k׎7j…ù@€·&¼I¯®hô7$NW•+UdøŒ}} ÆßFxx¸V 9"î""Rl×®=ÅÿÎË/ ;øä³/™<íC.¹è|n6„gÍáwg~Çb³M^^>>ŸŸÐPØ—žÝf#"âÀÁ‰uÿ͵ ÃP­u‘!rÿ6õ²ž]éÙ­ ¦ †–ýÛW¿ßÏ7ß- 9%•ïæÿÀ彺—˜ÇÁ›ß`Ð$.®¨ºišL™ú.‹—¬âÙ' YÓ&\uýà¢×`Žadf•b)t»Ù»7Ä„xœû§;²ƒ·ûëׯ§ÿþ|þùçÔ­[—Ï?ÿœçŸ( ã.ãàñxðù|x<&MšÄôéÓy÷Ýw‰‰‰aèС‡}/Ó4KÜHû¯#îm6Û!¿‘¼^/Ï<ý÷ÜvU«V9cû¡r¥ŠÜ?âzì)n»ó.´rˆˆÈa©†»ˆˆKNIeÉÒåìHÞÉKVàiP¿™™™X-âãÉÎÎaíº_°X Rv¥â÷û‰Œ'3+›ÔÔÝx½^ú\Ù‹Ô={Y»~={öìåÚþC¸¦ß`ò ÔÉ""¥$::š¨Èp–.[I¡ÛÍŽÉÌš3ääf͙ǂ…ËxùÙ‘\ÚùBF}‹­Û¶à L~þåW²²s;ÿ={÷aµY‰Ž‰fËÖmìÛ—×ç#%5• &S¦½Ëž´½|þå×ôî3€%ËV`µÙÈÈÊfGrJñý;þät:ÉÎÎ.®£¾nÝ:.¾øbÚ·oOdd$³fÍ*ž¶]»v,_¾—Ë…ËåbòäÉÅaýâÅ‹éÛ·oq-ø?þ·Û}Ìý8þ|ªU«¦Jä0rssyõå¹ïΛÏè°ýÀv7Šçžz˜iS&’šºK+ˆˆˆ–w)Ö¨AÞ™ö7½e+×2°ïUT©R™N;P©B"³æ|ÆÃ=ÍàAý¨_÷,¦¿7‹ŒŒLzu¿„ˆ°0î¾$;’wÒ»WwÖ«ÍC#Ÿã†AÃ(ˈۇ &˜Aªµnš&G{SÓ4KÔi7)*Qsð/TÅ]DΉ‰ \íUìÞ“F¿oáþ‡Ÿä知fÍjlÚ¼…7'N¥g÷Μwn;†ß<˜˜˜(yü9<—^Ò‰¸ØhÆOœÊôïÆþ›MmA àû¥Á÷<Êëã'2öÕgp††ðÄÓ/Rµr%†Üx=))»¹~ÀÍL™:“ž];qÞ9mèý•x¼>îyàQvïI+ÑîØØXvíÚE^^Ñ}=:uêDZZ7Ýt=zô ÿþ”/_žçŸžŽ;b:tàšk®¡~ýú8œN'#FŒ`úôéôíÛ—~ýú±bÅ Ö®]ËÊ•+‹÷@q-÷ƒ÷#òx<|úé§\pÁZ¡Dþ"77‡ž{š‡ï»Ê•*ªCö‹gäƒ÷0mòDRSSÕ!""rÃ4Må"Rê^ó2CƒÃ¡ÊUÿÖ’¥¿Ý’&÷¼FÇmÃo>âón‡kúÝDB|£^z†ìœ¬V q±±Å—Ùçæå‘Ÿ_@X˜“è¨h\….Ün7ÑQQä쯷ÃáÀíö“›CÀ *:Šˆýµ.óòòq¹ ˆ‰‰!$$¿?@FfV‹•„„xþn·äÈÌÈ$$$„˜˜hLÓ$##¿ßO… å‹Í åµ ¦iòÃÂEthüÕšµëñú~£U‹ZêØãø<&Oû…ÁžRíöûýL~wW^u§Ó·Ñç|ÄÅíÛRµJåãž×W_Ë%/úÇé²²²q{ÜØl6¢£¢p8deeãõzŠ·µééø~¢¢¢p††’“C0Äf³a³ÚÈËÏ#"<¢¸üW0$3+›€ßOdT$aN'™™Y˜˜ÄÅÆbš&YYYx¼^BCB‰ŠŽÂ¶¿œÏç#w U\þÏuöÿû}ûö¥GÅóq¹\„……KVV¦iOvv6n·›ÐÐP’““¹í¶ÛX°`@€¬¬,|>ááᄇ‡“™™Ixx8n·»øõ{öì!22²¸ærFF‡ƒÈÈH¾ýö[¦L™ÂÛo¿Ãá8­·ùùdff””tÜóšûÉçT­Õ€êÕ«k#|šJIIáÓ¹³>d QQ‘êÃðx¼Lx{*MZ´¡qã&ê‘S„aÀ¤·&0dàµDž a+ ‘b.BCC¨Váç¢"#‰Š8íÃv‘c !’“w2kætîqk‰ïlRRHˆƒ›÷g츷ðûü´hÙ gPà.""€Å0hP·6vÇ{Ó¸fMѬI#} ""§¹øøxî½÷^–/_NÕªU8]åÊ•Y¼x1£GÆ4MÈE]T*møôÓOyüñÇ©_¿¾>ŠÂöõëÖ³nÕ}ðnÝLø(Øl6n>”¹Ÿ|Æ'Ÿì¢[·î%n -""gèþA] ""‡ƒÇ¹(Ñ(""r¢õîÝ›£©n™Àc=Vêû¨>}ú(ÙÏ4MV­ZÅ–?ÖsóÐAØmŠ Ž–aôêÑ/¾ú–O?ý„îÝ{hÛ""r†Sª"""@ÑåÿÉ$""'‹aG [,–R?!l±XЉì÷Í×_Q˜³›n °ý_nϺv¹˜†gUeÊ”·Õ!""g8î"""""""g Ó4Y0ÿ{B,~zv¿«UÁñhÕ²9ç·iÆôiSñûýê‘3”ö¦"""""""g˜`0ȼ¹s±ø¹¬g7]ñQJÚ´nI§ Ú0fÔ«x½^uˆˆÈH»ˆˆˆˆˆˆÈÄçó1}Ú;4¨D·K;+l/e ë×c`¿ÿ1aüäåå©CDDÎ0 ÜEDDDDDDÎ^¯—©S&sÁÙ-hÛº•:ä©Q-‰þ×]ÉÄ ãº‹ˆœa¸‹ˆˆˆˆˆˆœòóóyküôîq1-š7U‡œ`IU«pûÍ™f0ƒ7¨CDDNs ÜEDDDDDDNS{vïfâ›oðôÈû‰‹U‡üGœÎPî»ë6–-šÏ¿ÿ¦9ÙÔ""òw¼~_ÂCŒ“þÞ&ïbÁr˜·Ïwq:,X-àö™X-`àöšD„ùœrÑë ¬–“»Lž¢6†Ú£˜6H X´<¦ v«ÓQòµ.¯I¨ÝàH‹âñ›Ø­G~^DNOnŸ‰irÈ6ãdn»#B-œŠ›Ó,ÚM°EMŠúÒn5J,§ÛW´ Ö&Vʪݩ©¼óö›<ýÄ#ØmÇ~ø¿eë6Þxóm¶lÝF `Ò£[g®¾â2bb¢ËÌ2ffeÝn?ê×øý~îè1Öýüûþ¿æêÖ9‹çžÉÐ[ï"-mß!ÏW©\Éo½Á9ºrNÛ<÷ôcØŽ²oív;·ß:”×F#4iа¡VR‘Ówù[_ý\È7¿º}}ÜI}ß@ÐäÕOsX¾É˸Áñ$DYK<ÿùŠ|Þø®€AGP¯’ÇgdQ%ÆBïŽQŒù2éÃ2õSc¿Êç•þ±Ô®è(•¶š&M°þÃucoÎÍ¢fe;—ù·Óù&¾›Åæ4?ÑaA² L®iÂõ—Ä”˜öÅ™™¤f¸ùòhšU )y00yavÛwùx}x"¡]Ø&r¦xwq>ûòƒÜ×ãä†bŸÉØO²YêgÊжã¢M üçmì¿ÙÏX,‡†åÞ ·OÌ Ë$1ÚJnA·ÉÈ«¢i[;ôÀ²úM%h2r@<‰V­xR¦lÙ²™¥‹æóÄÈÿUØžº{×õÆÄq¯”T3h2eú{ ¿ã^Ƽú<±±1û¿™˜¦‰aÆA'¥öÿîHσAÀÀr„‘¾îà÷±X,}× 0jô8nxIU+—xݑ޳øµ~?ù®B.8ïlœÎâß—KŒÇb±àñúð‚\pÞÙ%Þ322€¼‚Bü~ÿ1÷«ÜzËMÌúh.99ÙœÝîœ#¶QDDNM ÜEDäoúLò¼'ÿ}Üèañï^ìG\ä¡!F·ws™vE6tòñ¹”‹´0üòXbÃ-««¯¼œÊ墙=ëÃ5Z^DDÊ&p<>“AãÓ©SÑNËÚ!Lÿ2¦Inîè^t©ðÜõn~XçæœF¡Ì››G¿óÂè×! —'ÈS2©VÁF³j›ÅCÝ#éÜ"œ|W€Öc3¹¼–pF á­¯²xk™›/Œ e¯/¦ç0gD"ÕÝå¦{ µqÈ¥þ&°«Ð6dÙëƒ].ÃÉ&?·½ŸÍÊÊödäi}øJ¦ GeÒ=ÉFµx+ÉÜ­9,¿/‘‰v¾X‘Ï«ßЯ}8_®)à‹9¬y´<¾ ÉúÌ Q6H)0©mÂû?äòÎ’Bº·vòåš\.oÊ‹F—¿8ßE³_Ü´¨çdäì îìÎåçG×çöõõV]¦,r:ÊqüF:Mj9hPÕÁÄsèÔÔÉÔüq›‡={¼4­ʼ9yÜ~i$½Û„“U`ÀéœÛ0”òü(‘WFsQ#'»2ýô”EX ¶€ÉôúaŒ|?“…¿{pq_ýVÈÊ÷ry÷öªÄºí.ô˜ÔO°q_sõ˜}T´ÐµMoÎË£J‚‹—úÆãtZh÷Ü>–ÞŸH…/ÎÊ¢J¢kËÛY½ËODˆ… Ita+'fS%Ò ÖSîå³5.Æ|GŸóÂùy£›/6g³ö‰ 8»³üôx-5íLX—’Ãä¡ñlË5ÙYh²-Ϥ…y|i›Ýfá?MìDö ƒ|õå„;àW_qÜeJ"##?æE¦¿÷>òn·‡Ö­ZÐ÷ÚÿQ±byv¥¦ðûé{m¢££8ÿ¼v|óÝ|Ö®û™Ê•+&×õ¹’Îu`ó–íÌýì+.½äbZ·lÎŒÉãƒø¸j֬Ʋ嫨U³FÑw›PÃn.oš&ïLzÓ4 ƒ\Úù"z\5€[†&22›ÍJLt!!Ƽ>žá7 M«æ˜& ¾ñ𶻄»î¼•ØÃÔw†„ðÂ+c ;PR¦ZÕ*\uE/ö¥gòì‹£J”¼iØ >½ºw)µÏí‚óÎ!̹†éÓ¦Ò·ß ¥>š^DDN>î""B0`2;ÅÏú«bh\ÕA·¦Nöeݽp§ŸŒç+âtœW7„‹ÇeÒ¯C¦ #ºEÒ²v(6‹AÅ8+Ãgäðk‹¢Ú–Fû¦áx¼AÆ­ô0öúί_T&¥Æ§Y|´ —;¯ˆ;$÷LâÂ,‡üÞj‹8Á=š;©k£ ÃG¡+HçFN–o=òHîÔ,?mËÿÍÅ]&\Þ:ŒFâ ˜ÄÍÌbò繟¯d=w€‚ΞËÂ…K(Íž´½‡ Ü-ƒ--ñíé ÎÞÿ ¼^/_}3¿øù ibµZK5phÙ¢qq±¼òòKÜu÷=%–KDDN= ÜED‡Ã“íœôŸÉýç†Ò¤FÍÏ:˜ oŠÓQt¨‘i-¾t>,Ä‚%o•ÃæŒ iyA~Ë=pY}9+œU5ƒ¢3볃ü²ÕÃŽýe~ÝÀå3 Íâ/Aæý˜Ç‡|Œïÿ7j5Küø[KþpóЬ^ïÍApný¢å¶[ Z&ÙX¼Î]¼Ü+u1á»||Á¢² S}\ÒÄYbË7{éVÏA´³è@©bŒ[.:Ju­ç(^Öj•<»ÀUtPwƪ؉uÌZ˜GÏs" )yV¥r[<ùÌ]˜KÏó£Jýƃ'‚ÅbPèö²qã.’“÷òÝ‚ßxí¥ƒE*ò§ ñ6:Ôtpåø †µ ¥^5-Úv×­î(Þv×J´‘ë6)ôšD…[)pyxó‹¶gÙ› « ˆ{I°Ú‘•‹‚.Oa€Ý.“ï~r±â·B `ÏdãÞCËÊLý:›59Aî¯çX!ÞÆÒõ.Þþ>|¯É/{\œéÇë7Ù–¤ûAåmº·,:!œ]8úÈ?¸´™“Ë_/ õª|:4?lÉ2‘Éï÷óÑìY´lR‡V-[PZ÷ßÜóZ]g IDAT»/Ã0HLˆ'*2’¨ÈH®ís /á—_#66š˜è(yðb¢‹ÂlÃ0°Ú¬˜Á ‘‘EjÕHÙ•J­êU0M“;îyˆ:gÕ`⛣qØíÜ4ì4pp)œ¥ËWðÆÄi¼7eµk×â ›¸¬Ïi­ÍfÅf³qyÏn\Ö«[ñß·a@HHÈa—±ÀåfÑ·s‰ŒŒ8¤O*WªÀÌioðÜ0 j֨΀ë®d̨׸ièPœÎ0­Ü""§(6¬xøªX~¼'lø ‡Ç>Ì*~¾|ÔÑ_y¿à·BΟE¥;wõŒ¦{+g‰ œÄî9øg0’PÞAµ¤ª%…pEû†uÆzаkؽχ+áŽÒ -R²ü„!<üïG2ðØ-E'®›ÁŒ•nnîÅ]=£8"Òí3)ô9ÁqÚÌßf=Òxôcýü z5 áÇM<‡yïØp -’ì¬Üä9rÍøÿahz½~ö¥çðó/Û¹÷Á©téþ Ãï|‡ç_ùœÅK·èUä/ìVƒ1ã™18Ž\Iÿ©Ù<ôavñóa¡–gþüa}¦gÓ¨F÷ôЦw›’¡ŽÃb”¼Æ€òжÝII!Üri×µ?ô¡Ûwû‰³á<ü!†/`b µïªU ábhV£èæ‹^¿ÉʽA"­…î#׉·àØ_SÝã3¹cRSt1´K4#zDSgIÓOÀäDvZè˜dã‡?<ŵð念ñßÙ´áâQÊ›Ÿ×­!%%ù´[VŸÏÇ›ãßàì 9ÿÜsJ-l7M“ÙÍåÕQcÉÎÉÁ4M»v¥²k÷^âã㈉ŽÁëõ‘žžŽÃaÇá°óé_‘••]´áÀ`á¢%¸=<^/‹/¥S‡óp 6äFlV[¶ncOÚ>ö¦ï;üw¸]»iÕ¢ µk×"¿ €÷>˜MT„׋aØí6rr² œsN[¾™¿€ßOX˜“‚BßÍ_täsk‚GþÃ5)*Õs²Ô©]‹[nê˳O=I~~¾þ˜EDNQá.""乃ìÍ P«œ!£¸¤¹“OìãÁÞE«R©üg?»¹¥µ“n­ÃÁ„Ÿ6{À08\9\«Õ N”ABˆÁùuŠF`¦fˆ 3JZ zYÌÍâóó¸î’˜RYÆ«ÛEnaê‚|ž¾.îðA·–nôPõl˜ð[šŸ¨Xù$ûÙñdyªÄÙÈvXºÛOŸæûÕŒ¢›¹œ];„Þ“³ðùMvƒä ?¿Á[·'ž°Ïï÷]>îþÆÅo—;dt;À¯[Ü$ïô2é¶r„ÚËÞÈËÔ=Ù¼üÚ\6lØIJj.yù‡–2 ðzýá~„P$ààõzO©vûý~üþ^¯¯8;Õ@ 8iï—™`_^ºíÜÚ#†®-œtɽŽL_å¦[ƒ.Ø_Bfñæ#¯;ŽP Ñv¨_ÎJý¤¢¢»³ýÄæäåÃý11¥¿Òqi±ƒ5­Êô/òø°v(£(OËñS.Ú†iÂôïrèVÃÆeç„Ó÷­,æÝ™H…+†ÁƒlŸÏäã~ßO…h+.wRüt­mÇa3¨k%=Ó‡i:1IŸfQ1ÖÊyÍŠÚWkÞܤ»MÆ HÀ¦áLÅ~¿‡ÃQjåMŽVÊÎÿ³wßáQÔkÇï™íé=@Bï½)"ŠDDEEEEŃíXõÕcGD,¨(*V,€Ç† J‘Þ›RÒHo»;óþ bB„ðý\——ÉîìÌoŸf3÷þö™-zò±ÿèõw>VTt´~Yø³žxè^MšúVéqÓ¶í2³–-+(Ã0ùxW~~¾¦L~A—^4P ë׫Øã™ahø—êêknÔ¸[nWTd„þ€Òwgiè…T¯n™¦©[Æ]«»ïT5ª%Èá0eÙRÿ¾g—þë2LC×û—lÛVVV¶®u¥BCB4ðü~º÷G%Ótè©ÿ{P×ß|›Z4m\2Kþ/_Ç;·ÏYšñîº~Ü­*((Ô°K‡*<4D·Ýq¯&=ÿ_qZw=ñäó:ãôºhð -[¾Rc®¯¸Ø(íÎÌÖUW^¶§åÍßÿ65åõ¸÷;ùÁåGç´Ü·¥€×mê†n!ºÿý,mÛY,§ÓÐóÿËפ+£Ô²Ž·L nÊ_T±!\ûº=ùUnÉ9`ygW¦4ñ›\e§û•šk鮟 µñöxÅ…9Ô¯žKoÌÍVÍX§¦.,Ћç„è‹e:«•WMêzôØGÙ ÏÒ€îặ›OžHѰ.>ý°²Hí¸åv•BÖ<ÚÔ‘Îs/Ú:'Ù)Ï~¶am%úŒý¶g8Þ¢"BtnßöªQ=Zϼ0W¦aïsq2©¤ÅÌÚu¿Ë&p/Ö­ÔÔt­]·þ„w0PjjŠ6¬_W¥^”]»ŽÙ¶r , {.Mc{†(.Þ¥ùKóueg¯¢|û€l[uŠO·¾“­÷ÌÕ¯« áÓièíïrÔ­ñ¾ÇãÄ(§µõé¦é™ÖÑ«€-=óu¾fŒUÃî}ÿRr ·òŠÊOÇ/îª×¿ËÓ-SÒÔ£¥WÛ¶ûµbW@O]§5Û‹5r^Rÿ èP‡ú6÷è…ÙYºïâ]ÔÁ§6ϧ«F¸©Ó[ým6¾ÛÐÐ:.}8?O+7é­_ uK;¯¾Z]¬fMŠtEŸ5ûošžK ÊmH£þW ”{åó˜jiê9Ù:»}ˆ:6ôöë°ig@Ýë¸Û÷¼ïÞ©Ÿ~üA ,Ôú 4ù¥)ûmçq´ô8í Íœ1]O<ú€n½ý=rßrÉåŠOHÔ¶-›õÝ·_+;+S½zŸ¥&M›+èËÙŸjù²%ŠŽŽQ‡N§¨mûªÌŸæææê¥Iuõð‹U»VÍ£² Ÿ×«7¦NRJJªò $ÛVTtô>½ÐÏèuªÚ´n©ÌÌL…„„(!>N‡CEEE²eëâ I†¡ÜÜÅÆÄ*:ºd"ÅÕW^®þýÎQqQ‘åv»ôú+/ÈívËï÷ë”.K·®·^Iü±]qqqŠŽŠT‡vmTPX(§Ó©á—Ó çÉãñÈãqëáîÖÎ])*,,P\\¼¢"Ë^oÂáphÜ ×é:¿_aa¡åÞÿÈÿ.ý¹<3^Q.—ë¨\ä4&:Z·Þt­j¢†]q•9ÀÀ „À ¸p‡Þ§E« ´ý"õléS—=¡K£§.i³÷D9Ükèõþ%'&-j{õÞˆhmÞX¨^CÕ¥Wê{•žgÉã6ôà™!¥„aH×õ‰T«:nmÛR$§ÛÐÔ1±jTÍUî˜Â"Z¿¹HûkoþZÿP…zJîhUÇ­ÀžV*‰áMèæ+÷1¶-¥ iâe1Z½±P>SZ:.VuJÆ7ut¬æ.Ì“ËeèÍ1%½…“«ÊaêÕ2D»³-……™r: Ý94Z³ÉWv†_ƒO S·¦^†Ô½¹WQQ{Oʺ´£ïˆ/dššuàµY•»ÇÏçV£†IjÜ(Y ìªE‹7h鲚õñ¥gäÉãv(´Õ¢yf¸«¼ýÚÖ‚_sÕ¢y³jÜ@@ –®QÓfÍdW¡—uõêÕÇl[µã]zë†8-Y[¨¿é´¶!êѬäÃÎöµÝ*øË‡–>©;Ï‘Ô:6õé‘‹MmÙ\¨þÝÃtJC¯z5)Pv¥¨P‡Fwó•¶l1 é®AQúzy¾þø½X¡!¦fܧ†‰®ýîEòjn—¡÷oŽ×ÜEùÊΨq].?'R>—¡­[Š´üºÅ…—#ï¥wædé÷Œ€š×rë³K"åv›òº ÝÚÓ§Ð=ßæq; =tEŒ¾Yœ/Ó&]«Ø0Ss—ÈaJM“ÜZySœ-Ï—7Ô¡÷&*~O›´Ei[Š_QáG–æ~ò¦í†!eîÎÔæÍ›õÁïëçŸÊa2 C11ÑÇeL.—Kîº_㮡Ç\©ɵtÉe#$ÙºíæëÔ²M{µnÓNW¬io(Ù¶žyâa]7îVèó¾Rã¦Í*mí`0¨7_Ÿ¦1#/WêÕŽòëk(11á€ËÄÆD+v?¯µmÛª^-QúÛ: Cªö·Û´¿„ø|jØ þÞ¿ÃBKƒr¯×#¯wï7 N§’“jôyÕLN:àýµj%põêÖ9ªµŽŠÒmãoÐ#ÿ÷ŒÆŒ½Q!¡¡üÑ'w@IpçTíîáe&·©ãQ›:{÷˜0‡†õ)™ä4¥î½êþ—‘mëí]vèYeÛÁôhꓚú:ž°SÒ-eç[Š5ËÌ¿¬ïÞuwj¶÷„¸N¼SuN‹(w>·¡%;ÊÈ (:ÜY6è¶¥øpSÍ»‡—yl|¸CCOßw½}ÛíÝî nûö3îß©ìIQ¯Žû.S+Ö©Z±aû?¡¶l,[¶½§B9yNqÀVZfPQžò®Âb[)Y–¼aŽJ¿Ú¶-—ˡΩSdžºòòÞZ²t³>øp¾V®ÞÉ?R  ]jè*sìîö·ãlx¨CCÎŒü˱ثM÷»{6ß»ü ¿C C:½eˆÔòàácÝD—¾[Q ¾¬r[\ExM ìZö¸w~Ï}·évvÎÞã|Ÿ¿´¨rzä>Ë&F84¤ç¾Çís;ìkÓd·š&»Ël³m·ÚÖqï÷¹¬’coÀ²÷ÛÒ&¿ÈÖ®]~%EzNº}¯  @Û¶mÕË/OÑš•«•—_rpç_ZlX–¥ììl¹Ýîc:6¯×«Úµë¨S—nšû姺ÿá§äp:µuó&mÚ¸NµëÖÓ¢_(4,\›6nPÇN]Ÿ Ï?ùP}úÐå#FÉëõUÚÚÏó•úœÙó¨‡íGÂ0 5nXï¨Ìþ>™„‡…iÜõ£4ó£4ôâ‹«ÔÔP•¸ö=Aª$ãèÞØ«±3²tá3©zklœbÃü„-Ükê‘Ó|êùHª>¼!Võ«ý-¨D焦)Mú"G_þš/Û–l èòveÿ›‘¡çiÚeQú{Ñ€eëwwëé%…úíÖøk?Üs´Ž¨C‡ÊÊÊcv;p»ÏmãÓ=gk×ät½>&N.§qBÖ3hK¼™¡1åå[ú~k@çuÛw™¢€­1“Rõóö ®uRío–-}ýõ×úéÇù*(,Ta~A¹ËeffiÔÕWóýó_·MÐ)]»ªÛ©½ôɬwÔ²uÉEW‚–¥¢Â|]xñåJJ®©«¯¹^¾EDDê‰g'ë—?jÖ{34ýÕ—ÕóŒ>*,,¬”õ_±b…^{eb¥ÞGÜn·zà÷ ¥m›ÖÉØsí @åGਔ\CËî­¦´Ü "B*î«ú.ˆÖ5}-yÿ†´áÞDÅ„š•â¹ÿçÒhö¶Ó¹ÖVi ¿º¢O¤®9ßTlX93 ]×7R.ˆ*íÇ"2$EEò5jàDàuúí¾jÊ̳ätœ˜a{¨ÇÔó#c´$§£d–ûõ¶”±ïqÔí0tߥ1Š 7æ9¹Zʘ†Ô¯_?]{íµÚ¶m«~ß¶M?þø£æÌ™'·Û¥€ß/IŠÑ”W¦Éã9¶§¥¡¤ýç{|ɾX§n]ÕkÐDKý¢ââ"ý4ÿ{?hˆ~ß¶E_ÍþT½zŸ­\¤©“'ªQ“& «”õ/,.VZZºjÕL®Üaƒ“¸¡"ûýrûÂ(œ@xTêú„ðŠŸ¹Ÿ ÖK¨o‹†!%EÚX’cö¿œ!©F43Ë[Cå~x"½÷ÔŠ=ø1Ø0¤:q'ï锽'Õ®Y³–jÖ¬¥SºvÓãnÒÏ?ý¤5«WiÝúõÚ¶u«,+(Ë:>uŠŠŽÖ€ ‡•β6 S>ù‚¾˜ý±fò¡5iª:uë)??_QÑÑš9cº<†]9R½Nï]ikߦm[½ýúTÝpÝ(™æÉña-Éï÷Ëírɲ,Y–Un oÛ¶ü€Ü.W•xÞÁ ¥>ž­ ‘e p‚ p1‡Ã¡®Ýºé”®]U\\¬¢¢¢cÞ¿ý¯Z¶n«­ÚìJ×kÐP׌½IÁ`@NgI(¢+®ºF¿_†aÈQÉgf»ÝµíxŠ&¾ø²F]uÅq­ñ?±}ÇNƒ{.ônK¡¡! —ëê™™©£®×û3^Ó‚…‹ôñì/ôà½w–Y.77OW_s½fLŸ*©$¤ß¾c—¶lݦ6­[*,4ä„ù²lÍúøÙNŸj$%q€€; Â†!Ç#ÇsÜÇñg;™¿ßþgؾÏÉñ 4+ºUëÖ2=;q²ÆŽ%§ò‡î÷=ð°BÃÃU+9Yk7lÔ²å«Õ²Y#Ý÷튋‹=àcCCCõèî–a*..Vjjz¹Ë¹Ý.-Z¾^’T\\¬ûü?};Î<½‡xäIßïL3²Ò×ʲ,M}õ %Õi¬^;sP€ ;'Û–Z´h¡ˆð=÷Â]uå¥ŠŠŒ¬Ôcv:ºàüsÕ­k—=ÏÁÖøÛþ­¯æ~­‹/¬´´tååç«v­š’¤`0¨5k׫Iã†2dÈÿçìø2µ°µråjy¼%'Õ(½}íú úeñR}þÑÛ ñùä4òš´dé2µiݲÒÖ©¸Ø¯§ž}A§ô8]-Z¶àB©p2)'Û–jÖª¥súÔãONTNNnå³ö¦ÇÅÅ~Ù¶­°°’ ‚Îÿy^Ÿ>£ôúùºèò1òûýÊÉÉÑ9ƒ®,½ïOié6|´¦L{]“^|Y'¿¢PoÉlÿä¤$Í|sªB|>I{®mS=Q……•¶>……ºÿáÇÕ§ÿ 5oAØ'*f¸p‚ª^½º®}­þ}ÿ#ºûŽñŠ‰Žª´cýìó9Z½f½~ß¶M»3³T¯^=}æé’J>@ø{ îJî“TX(³¾7ßž©-šiü¸ëdš¦^}ã-†¡¢âbEEFì³ì‚…‹´|ÕzÝy{óJY¿ß¯»î}HWºV‰Õª±cÀ ŒîœÀ"##uÓø zôɉÚöû•vœõëÖRë–ÍÔçìÞêzJgmÚ¼U‹/9ìõ}óí÷êØ¾­\.—‡:wì @0¨âââ}–›ñîûzùÕézåŧRéê’™•­»î{D£ÆŒ%l€*€îœàÂÃÃ5þÖ zøá‡tý¨+T·N­J7ÆÆ©c‡ö’¤Î;©fÍ$½µ³Ú·kSiÆöí÷?*-=C¶¤ÌÝ»5ïßé´§Èív«k—N{Ë¿õÎ̪/çÌ“Ã4¸¾Ñ#‡küm÷Êív)苹_Ëápì³ÌŠ•+µrÕZ]véP9ŽJS‹uë7hÆ{Ÿèúo’×ëeÇ€ªô^L ¨:\.—®ºz¤>š5K»wëÌ3z÷1svoåäæ)??O¦aªzµÝyÛ-jÒ¸‘$Éçójæ“ôë¢%r9š0~œ:ÿï[™‡¼ž¸ïf†¡5ª«ß³$Im[·Ò=wÜ¢¥¿-WêÕôä£êÓÙŸËår•n744T‰‰ñ2ŒÊóú,üu‘¾ûq±F^sí>cT îT1¦iêüõùìÏôÞ¬5ð¼~2Íã×U¶ÿ¹}ºLófMÕ¼YÓÒ߇]:T’är:uù°‹%I ê×UƒúuKŸãi={¨ç©ÝeìIÔ‡]2tŸu¶hÞL-š7«4¯ËüŸhÑok4ì²Ëå$l€ªùL ¨z ÃÐÙçôQ\õÚzî…)•¾§û‘<ÏÊζm}ôÉl­ß¼CC/¹”°ª0wªêI¿iªeËVjÖº½^zåU rX–­>üX¶3DýúŸw\¿i8ï½”€ª­]»öjÖª£}âiûýä±í’°=húÔãÔž'Äl|À‘!pà$ЬysõêÝG=ñŒ )ÈQæ÷û5ñÅ)ŠŒOҽϤ p’ pà$ѰQ# ¼ðýç‘'”CAŽ’âb¿ž›8YÍÛtRûöí)œDÜ8IضT½zu ¹är½:ýmûýŠRÁ²³³õèϨwßóÕºukUÑkÕöƒÀ€“LÍš5uî€ÁznÒTíܵ‹‚T¬ìl=ùÜd ŸÆÞ0N¯½õV®ZMAÓö;õðãÏjü„;AAà$FàÀIÌívkÜÍ·è³¹ßë×EK(È?´yËV=öÔ$ÝtË­Š l€“;ЕW^¥/¾ž¯ß–¯eYä lÛÖê5ëôÚ[èŽ;ï’Ëå¢(w †¡Q£¯Ñ¯¿­Õç_Ì¡ ñÛ²šõés­œN'H"p{˜¦©ó TžßÐÌ÷?d¦û~|5gž¯X¯«FŽbf;`ß÷RJT[¶eSTm%8ô>óLEÆ'iâäW(ÈŸGyÛÖGŸÎÖ©ÙêÞùr8°w¨¬ç²¦©üü *-//O!>…@•‘˜X]»3(ª´ÂÂ"™&§’UmKíÚµW—î§ë™ç_’ŸÐ]–eéù_Vhd‚Îíž ƒOŸeñWTRM'kÁÂ_dÛÌ”DÕµqÓ5jXB ÊhÒ´©6oÞB!PeY–¥ ë7(99™bœ ÃP½zõtZïstÿƒ)x’·—yåÕ7Ô¤E[µmמûÅ;TRÑÑaŠŽÉÓ¢%Køä†É7¨è“o£ú üºh‰ ‹6Éé䫨¨JÇîh­Û²K¿-[qĘ2s~ì>Â}ʶm}ûý|%Õi(‡ƒSÉ“IºuuáÐËtïSNnîI÷ü€ž|ö5lÖFíÚµg‡—Ñ€Jʶm ¹ ›Þ}ïk½;sšê×o­êÕjüólÓЦÍ[ôÉg_PTTؾ¹fíZåäåÖãÓ3ÒµvÝojß¶¦®Þ›‚¢ÊqÕUzíÕizãí÷Õ¨a=UKˆÿçÿÎ$­X±RÅþ E…(,*Rnnžâbckܾc§Ö®ß¨¶í:èÜþç‰/à|’kÖÔWŽÔ¿ïT÷Ýu«"#"NŠç_P ‰/¾¢.ÝNS³æÍÙEà•ù ítè⋺+8EùE²‚‡wvÛ¥ã9ó|÷ý2%×LTÝÚ ã ºviuØ5Í$y½uåvógª&Ã0tÅð+”ŸŸØ3Ý[´íL1Qi´joê|Gn·›bœÄbbcuÓÍ·ê‘ÇŸÓ ×^¥êÕ«ôóÍÉÍÕÃ=©‹/¡¤¤$vÀ!áLN„ƒµÓ¡ˆð q”y<.µm]—B¨ c·S'É P'ðˆ¼fŒ¦MS—9_µjVÍ~þ;w¥hÆ{ê¢K‡+99‰ou÷À!‹ŠŠÖðWkÚô÷´rÕê*÷üvíJÑÓ§¨ÿ€ U³fMÂvÀ?BàþÇ£Q£¯ÑÇŸ­ÅK—U™çµõ÷?ôÔÄ)ºîúqŠŠŠâ…ücîàs{<ºjäh-X´Bs¿þæ„>k×mÐÄɯé†q·($„vŽ€ÃCà‹išºàÂ!Úžš­9sÿwØŠ>Þ-^ª¿øŸÆÿk‚</,àðß)8\¦iªß¹ýµug†¾œ3O–e0c·m[+V®Òì¹ßkø•#dšÄ$€#|_¤àH?` ü†WÓ^›®`0xBŒyî¼o4ÿ×å}͆Á‹8bîàˆ†¡nݺ)©nc½2í •;tÿøÓÙJÉ,РAƒ™Ù¨0¼£€ aÛR§NԮ˩zè±'•Ÿ_PéÆ 5é¥WäôE«Oß>ÌlT(wPal[ª[·®úþûÌDVš±ùý~½üêt5hÚZ»tÑ zW@%Fà*\ݺuuÑ¥Ã5þö{•—ŸÜÇcY–|ô uèÜCíÚµçža{þûëÏ|µàHÅÆÆê¦ñÿÒ}ýW))©Çmùzè±'uþ ‹T§n]^ÀQ㤀“YQ‘_ŸÌþE€¥•+·(p¯ÛÇ IDAT#³ä+϶mkàyåñ¸(ÀˆŽŽÑM·Üª{ï¿O÷Ü6N‰‰ Çtû¹¹yºãÞ5溕˜˜È 8ªÜ'5¯×­¹ó–iÙŠí2 éëo×J’j׊ÕÅCzȦ±'Àóx<ú÷Ý÷hÊË/iðyç¨q£Çd»»RRôÔs“uÓ-ÿRdd/ਣ¥ à$gëš‘g)hYûÜ:fdoÂv€ äñxt别õÖ{kõšµG}{»RRõôóStõèëÛÇ ;à¤fÛR½º‰Š‰ )½-ÄçRíÚ  ‚y½^]7öÍùv¾ù¶5k×iÊ«okì7+::šÂŽw'~^Ú¶J.ý½Zb¸ªW‹¡0GÃáÐЋ/Ñš諹_Wø· W®Z£·f~¬+¯)¯×KÁÇ;à¤çtšêØ©±AKAËÖÐ!=äpð p´˜¦©A V‘åÒëoΨ°õ~óÝš÷ý];öÂvÀñy£H§÷l©¢bK.§C]»4¦;ÀQfš¦NéÚM1 ÉšùÁG ­Ã^—mÛúæ»ïµ~Ë ½øR9N 8>ïo”)4Ô«óú¶T®õ⡠ǀaêÚ­»B#ôò´× ÿñ:lÛÖ¼ÿ}«u›wjà Á2M¢Àñû’ CêÑ­±š6©%§ÓAAŽ¡Î]º¨Y«ŽzêÙI*,*:äǃ–ÞŸõ±Ò² 5pÐpÜñ+8ü±=C»3s)ÄQfNÕ¬¯å+·RŒ£É–’“cFëPªy‹æòz½úïSÏkÜ câópù`0¨i¯¿©„¤º:½{wñg 2 p€J,++O?þ‘:·?U ‰Õ¥Ã8‰0LSï½ÿ¡ ìX?™¸ÝÕKêžI-Ä–­¥K—©MëV‡õx˶µjÕN-]ñ¥nº¾·bcÂ)*mKõê×W¿êÙ‰/ëª+.V\\l¹Ëè•WßT‹6Õªu+Âv@¥Aà•”azèÿfëž;PxXè­kñâÅ:µ{WŠŠ :¶e[AÚãÈö©~¹gë©gÕí·ž'à® DÍš55ð¡züétÛøë¹ÏýEEEúï3/謾ç«~ýú„í€J…îPI¥¥e«A†G¶•UxX˜:¶ë©”T¾Rö§k¯§‡{Z þ*˲ ZúeÑM¸ó> z™êׯO¡•;TR6íT›¶mŽÉ¶,ËÒæ-[µeëï‡õøÜ¼c–,ËÖoÏÔoË–Òìùåææ•ü¢ððp¹\.Ù¶¡ÐÐPmÞ²U/¿ö®²srxÀqÅ w@©´ŒLýüÍgr¹\JNª®ÇŸ™¬%¿­PãFõ{ËV¬RFÆnuéÔN·Üt½ ‹ÔÐ%‡ôØ.;(*2LEÅ~ pžj&')$$Ds¾þA§÷꩞=ºéÕ7Þæ…•3Ü¥5¨+§Ó)Ã0Ÿ/Ó0´~ÃF©¼Ž™¶}HëÌÌÌ”eÙ:¥sGI’×ëQXxÅU; T~~~éÏy¹¹’¤Ø˜ýÙpÝ”^Puý†Í‡´N¯Ç#ÃþرC’dY–ò÷´‰¨JÜ¥¶ý±S+W®Ööí;´hñR-KM›4RDx¸BCC´rÕ:­]»^Ÿ1GÙÙ9*öûe­®³zõj’¤üY))©úå×Å*,.¦Ø Ê¡‡; „-õ8¥£ž›4E›·lSAa‘.ºà\Õª™$‡Ã¡Ñ#.Õ[ï| kÇMP»6-u~ÿ³õí÷?Éï÷ëÏðY•ì=·5¨_O§zŠ~øñ 9VõëÖQÓ&´~ýÆCWyëßç÷Clop4¸äv¹ôÜSËår),4Liéér8LÅÇÅËápH’†]2DçœÝ[€_±11ÊËË×ðaC©fMë7^’Ûã‘$]4x€ôï£ð=½Úï»ûv¥¦¤Ê²,ÅÄÄ(77W@@±1ÑÛÓÿ}X–m+>>^’Ô¡}Íš1U‘‘‘’¤þ}ÏÖ§õPLL /$8®Ü2MSI5j”þ^+$¹Ì2‡C‰ ñ¥¿{½ÞÒŸ].§BCCK‹‹Ýç±n—KII{×"IÊÊÎÑs¿Qyeµe«Û)Tã/ã’¤ˆðpE„‡—þ­˜CîŽ6wÀq®¾çô¦ JࢩTw*;€À€ @à@ p ¸PܨîTw*;à€üA[ÅöqÙ¶-)¿È–µŸÍÿõ¾â€-ÐVÐ’ò2Þüâ’åþ.·Ð’}OµÈ_²í?×ØÏ€ Š÷.÷W–-åYÊ+²”_l—þü÷Õ-)Üÿm[*Úì´'î€úrYîš™yÌ·kY¶žý,KW½ªŒœ`Ùqýš§ËžNÑ'‹ò´v‡_£ŸMÕ=¯¦káæ"]óJú~Cú¹KóuÙS)Ú¸«xŸÛm[êýHŠÒó‚ÿhœ¶-½ýu¶¾ú­@Å[wMO×âEe– ZÒã33´`E~™û²r‚òßT]ñLªî˜±[W>›ª‹þ›ª)þ}–û=ݯ›'§éöWÒÊKn~PcŸOÕóŸf²ãp¸(¯ØVzuÌ·ûÃÚ"}µ´Pÿ¥˜pG™ûÏ~#Kçv Ñ©M}úé·<…z ]Õ/RMª¹4¡_„ £ì:-[êýünÝ5(Ru\eîÿyGp¿Aýþ†tZÛµ¯ç‘mK;3-ùË_vwŽ%9³ïmÛÖŠŒ ž¿&NÖ ×Äic-ÿß²ÿšq.Ý0(J¿î jéæ²¡~hˆCw\£±óòµ+;ÈÎ À1æ¤IÊ.°´uG±2ò,%F:T»š[^wIjݹ–K)™mÚQ¬Ø§jWsÉå(¹/%+¨ôÝ~íγT=Æ©¤x—ÜNCþ€­-Û‹áPfvP ’Ýr˜†6n/Ö¶´€"¼†’ÝŠt”;žÌ\KÝë¹Ô$É-ó/á¹eK›þ(’ü¶Ä8”’Z¬miAÅx$[²m‡µªëQ‹º{Û•\×Á«POIPáÐö¬’¤9Ôc*Ìmhú¼l­Kjg¶­%™{Sè‡Ô°–G†¤b¿¥Å»-mø½X©i%3Å×¥•]d+hÙrîiQcÛÒg?çè­•Åš4<æ€ã¶÷d·Òv}áºBÝ53KO‰Üo;¥nͼ’J‚ý޵]úá·ÂCÛÀßûmy )aOËœ0¯©æÑóŲîíBôÐg9ªçTÛÆ!û<CÒ¹m|zqvŽêÄ:ÔúomgÀÑCK€¦t÷hÍ»9N9~éÆé™z`æîÒû“¢÷ö0±ÿ>·ºP§¾°[Ñáí¡³Ûx÷Y ÄbÂJûgöÐh—âÜŠKp«ß)aÝ'BŽ¿4i·liÝV¿Šl)º[£¬Ù#`+&òÀ}ÍÃþÒÞã4´¿`†¹¤€eË”öynN³bžO‹ÚE‡˜Z¸¶¨Ü‹¼6«íÑÆ[ Ö³sp ¸”[hiKz@É1NÝÐ/R¯‰Õƒ?*»°d¶úÂmå÷ÿhi®nïSÿÎaªéÔÒMÅ’a”;!Üá0T/ÜPµPC½šzÕ«©WMk¸Ô¬†kŸÚSºñÂ]ÐÀ©¿Ï©°ç8¬G˜n©iór÷?aÝ”~ZWҒƶ¥U»ò†”´µiajë®@é}OüP°ßmÙ’|nSù¶´;¯¤µKA‘­_R+¦ÍË+Ÿfªw=—Fõ–Ã,»í‰³³4¬£O#{‡³sp ÑR üb[ƒŸOÓÍ=|ŠskþŠÝyŠWÞ’4×ÚOB}qGŸúMÞ­SëæhÝï~%E8Ô5ÖÔ»ósuúžÖ,òºMë¢ÿ¼Ÿ¥”T¿œNCOÏÉÓS—E©mý}—5 )&Â!‘]¡Ï³c}ž—W’J—7ÙÜ”¦ü§Â¬€våZºã‡mº-^†!õoäÒÌïrå´-ýº¡XuÂ<[=&Ò©F1¦nšš¡ ÛyõîoEÊ*>òçcK*(´Õ4ÉÜokœœb[½yÙ±8ÆÜJˆpè1qúyE¾V¯+Pû†õhî“$Õsê‚æîÒeC=†&Ÿ"Ij]×£·®ˆÒ†u…êØ2D={Õ±G©¹–Ü.Cÿîé“sÏ lîï©fµÝÚ¼±PîS/ŒŠU³®rÇéÔúÍE²m•,¿xvˆBÜ%w4­éR`O˜fêÆNÞrcÛÒÎÂý‡Þ“ÎðiÈ™‘úlažâBM¥ß_M1¡%O`HïH%V+ÐÖ­E:¯k˜[–¶ïòËÔ²¶[aáN™¦4°W‰‘¦<.CSÇÆkÖ·9ÊÌ ê¦s•›áWµØ#{ëµ,)»ØÞÿ,}[Z›níÓúîIR½§ê%D” ¸Û×ó¨}½½ÞŒ whä€è’7ÓP¯f>õjæ+½¿cý3«‡Ÿ]f;g´ðI-|O¨ÏÔ¦ K¹…–Â|f™ é£ì]w·–¡¥?×Op©þ™‘å®Óë6´dG@YyAE†:ö½Ø¨!Xr‘ÖK{E”y¬ÛaèÌÖ!RëÒÛÚ4,y§¶Ù»ý ÿòØp¯©ËÎúëXö?ëÜ–´l-CAË.70·m)§À҆ݖúF9Ë]G^¡¥­¹–Â+°ÿ=84ôpìè$9m÷&^}¸5 AO§jwNÅô>ðšúÏ©^uz0E›Rü•ªîéAéßÓÒõîÖ=¯¥+%Ï*Óöæô€.y.U¿¤Õ¦®§Ì:róƒêñPŠê‡›j¾Ÿo€£‡î€JÉí0´ñjJÍ *<¤â>¾óÂ]ÛÏ’ÏUyf€‡‡9ôË„ø’çí4äØ-©ÖßÚÏÄE:ô܈XÕˆrÈ[Îø}SïŒUx§&3ÜQùùýŠà;ºçËî€JËaHÕ"¾ÞèÊõ/—ÃPÃăÏH÷º Õ‹ßÿ[·ó×TŠ?q CÙ»Ó)€c*''K¦qôrZÊà˜3MSÕ⣔–FèàØÈÎÎQ ¨@¡¡!GmÌpÀ1g†Î=·¯{ò q•ªW¯FQ{ó¨4לxrsóôê´©1|ØQÝ;Ž‹¸Ø¿q´æÍûZ³¶nWTL¼œNþ<”µbÅ ¥¥¦êÝwÞ•dSÀ!³,KÙ™»êÖ%ƒû«~½ºGu{œÑà¸IˆÓЋ.Tвd[”ëÃ=Z·nƒF\:bþ1Ã0dš¦ŒcðU)wwÓ”L./Øßû„C¦iðM(@¥ÇY €À€ @à@ p ¸PܨîTw*;€À€ @à@ p ¸PܨîTw*;€À€ @à@ p ¸@%e˜†ò )ª´¼¼<ù|n ¨Ü ’jÜ(Y þ"Û¶)ª¬M›·ªQƒP%¸@%®Ð°,-[¾R–eѺ ƒz¢â†!CG¾S-]¶\¹yëät9(* JpR¨œlÛÖ¥COÕ›3fëõéSÔ¤I[Õ¨þÏg¦¡M[¶jös(**lß\½zµò ‹ëñééZ¹j‰Ú´ª®‘#Οª w¨Ìi§C—_ÚS@P9¹²‚‡7Ó½]ë3%Ñšæ`¾Ÿ¿BII ª[;žb¡íšö£M3AƒÎï/ÇE)U ;œk§CÑQaâ(óyÝêЮ>…‡…îTw*;€À€ @à@ p ¸PܨîTw*€“Nv†aìùÿÞŸ%ɶmŠ;à¤VTä×ç_-V `iùŠÍÊÎõK* ÛÏíÓA^¯‹"€CBà8©y½nÍž½H+Vïaš3oµ$)99FêÊ,wpÈèá8ÉÙ=ê,YVI°^ÒVFºnÔ„íà!pœÔl[jX¿º¢"}¥·ù|.Õ©“HqÀ?Bà8éy½nµi•\ú{µ„pÕ¨KaÀ?Bà8é9uêØHÁ %˲5dp79¼E€†4I§ŸÖJÅ–N‡ztkJÿvð9)RX˜OýÏi¡€ß¯ÿ;’ C:µ[íÜ•)§ÓAAÀ?Fà•œaHÛwìVfVÞá¯C†lÑ"å`.—jש¦Uk~§GYRõEF†ÒºP¥¸@%–“¯GÿX­šwRµj‰:œlÒ4MÍúð׿/=¨ù‹¥;©Äض­eËW¨UˇùxK¿þº]kÖ/ÓÍ7œ©è¨0Š ¨Ü ’2 C?ö™îºýE„‡Ѻ–/_®Þ§÷¤¨¨¶mËå4uZÏS’²³ÏÕ³ÕmãÏ—aPWÀ‰Ï¤P9¥§ç¨n­G¶•‘!)2"\íÚôTjZT îPImظCmÚ¶9!Çž–ž®-[W 8fÛLMKWjZziOð¼¼|ý±}‡Á 6mÞª­Û~W0dǪdªWKÔÖmiP%¸@%å÷rBŒµ°¨H»RRdY–$éwgiÌõã•““{Ô·mÛ¶¦¼òšÎ|™®9V™YYúaþO:»ÿ 2\+–¯P¿A—醛oWn^;8jÜû°reÖòîÿùç…ºá–;TTTôÖiÛöA·w(ã}nòkjÒ¨¾Þ˜ú‚¢"#õÆÛïÉ0MÍxíE5oÞL ¿ûLo¾ú"íyÀQÅES’¤´ô Íúðc¨^½zª^-A‹—,ÕåÃ.‘ËåRJJª¾ýþmß¾Cñññ:½WO%&Äë˯æhÖGŸ)55]o¼9Cô/]g^~¾>ùìseggë”.Õ¶M+†!˲ôù—_iÓ¦-²m[ ê××Ùg!Ã0ôÑ'Ÿ)33S]:wÖüTÇÔ¼Y“rÇœ_P ™3?ÇåTqQ‘f}ô‰|^Ÿ¶lÝ&·Ë©/¿š£>}ÎÒܹÿ“×ëÑ€óÏSHˆîùý=øðÿiþϋիç)Z·a³~[¾J™Y¹vÉPƒ–îðÿ4Áb]}Å}òé—úþ‡ŸôÌ“J2´~ã6Ù¶-Ã0dÈTÒfææÝ­õjëëï~ÒÌYŸiúÔT£Fu½ûÞ,=ùÜKvÑ9L‡þóèS S÷n]ôÃO¿èç¿jöó´õjÚ´Ù~ÇmH2LS¶$˶e¦d²‚–\N§L‡C†aèù—^W½ÚÉêׯ//68jÜÊ/È×w?þª¾g¦{îš Ë²4vÜýüËRIRn^®.¾h°®¸ìb5mÚH¡¡!zú…iúýí:³÷ézí­™ÊÉÎÕ%C/TÈž¾ó…EºmüõjÛ¦•þ²H7ýën­Z½Vaáaš2uºâ¢#5bøå²lKÿûn¾~â}Ú­‹¤’NíÑU£¯.Ã0ö;nŸÏ§K†^¨Gþ;Im[7×°K†Êá0õÅœodØ–†]2”íà˜!p(33K’Ô ~™¦)Ó4Õ®M‹ÒÀ="<\6nÐ’¥Ë”››§»Rå0MmÞ²Mµj&K2öL7ߎ»].Õª™,Ã0T­Z¢\.—þؾCõ3vË侮¨XãÆß.IÊØ%˲TXXÒÞ0 uïÚY¦yðKì ä ýåÇ¿Ýpô¸ät:%[ÊÏ/,½mWJZéÏö…ž}aªN?­«î¾k¬Þÿà#½þö:Pœâ“Ãá$99%?{<¦¡ðÝw÷ÒžV4’-¯×³g<ŽÒ™ò' “bc¢©/ç}«5k×kᯋ4ïÛù¥÷§ìÚ%‡Ã¡Z5“eY–V¯Y'Ó0”š–®`0¨Ð¯vïÎRZZºüþ@™õª  $Ì‹U|\¬üþ€rss4gÞ7Z´d™$ɶm^pB"pÈíöèªá—¨ ?_7Þr‡ž}~²ÚµnQzÿ§Ÿ¦¨Èp͘ù‘Æ¿C_tj×JÒäW^WZZºÎís¦Ün—Æ¿S[¶n=à¶œN§þsßòú¼ºöÆiôu7ëÃO>S“& $IÔã'$ZÊdš†.›ýF (»Ã!CRbb‚*Ÿ£Ø˜˜ÊÛuê¤VþÛå:4,w»ÝjܨÑ!÷%%%*))ñ°¶$%&*)ñ×ûW®^«ýûÓUÕ„ñQ^¯úõ驯]wÅ…\õûåÇ;@N§S=rŸ^|ùu-üö;É04þü3tõ_.“ÝvbgëÔ¡­:uhû‡ËÕp¢¸$UŒX¿ãÖ›TîóI’\‘‘af¨€ê‚ÀPÉf³ÉírQ€£`£üyî„;!@àÂZdd„ …„=.š ÂBYY™6lØ øøx5jÔH’´oß>Õ«›ªÇQ @Øc„; ………š4i’Ư¢¢"IÒâÅ‹õÐCò8Ó4eY„F¸€°a†LÓÔ´iÓtÅW²ÌçóiÁ‚Zºt©âââÔ«W/uíÚ•¢Â#Ü@Øðx<ºöÚkõüóÏ+##£ò~Ã0ôæ›oê¹çžS=d·Ûuå•Wª¤¤„¢Â;àˆAKåþsº®%©ÔgéÎ.ó[2.ó-LKA³âþ#)ó[2Íc×îß±©W¹ßR©Ïªü»Ôg)<üµüÁ_ëRåz–8„+Ã0tê©§jäÈ‘zì±Ç$IÅÅÅúî»ï4vìX 6LãÇ—eYZ·nE„ wÀ}½®Tû8︿®iI¯~U ¿¼œ¥ìÂàaËç­*Ö¥S25{e‰¶¦ûuýK™zøÝl-ÛU®kÿ™ý‡óµ%ºô¹LmÏð…´½¿=(0âñt‹)Eïú0W—<—©>ÍÓ%S2uá³úòçÒCÛ!éÕ9ºëµL–«\Ï5/fê¡·³”Udaëꫯ֚5k´xñâƒý-KÁ`P^¯WRE0o³ÙTVVF±aƒÀpD…e–›Çýu¿Û\¦éËJuÛ™1Jˆ¶¶|È[ùÜÉ­Þ-]Z²ªX†¤ ÃbÕ¢¶S׋–QÅ:-K8%W7Ÿ­†µœ!këòíåzûëüÊÛ‹ÒŽM½1ÛÔÝçÇéogÇiê µÔ§[…e‡~6†¤ E+1Ù©)s «\Ïc“’´6ÇÔŠ­ìœ€ðÕ¨Q#~úéZ²d‰ ÃPTT”:vì¨O>ùDË–-Ó§Ÿ~ª²²25lØbÂMH’ŠÊLíÍð+§ØTJ¬]uj9鬈­{6p*» ¨Ýé>ÅGÛU¯–S{Ųì róÊ+6•œàPJ‚CN»!ÀÒ¾ ¿¼QvÕ0%Bv›”–áWZ¶_±.›R“œU†é’”Whj@§Ú5ˆ”í7é¹iI{Ò}’ÏR»T» òüÚ›TŠ×&—,ÙlR¼ÛPU‰{fQPе©{K·Œ*–—ø,íK÷É´”’ä”ÿàÔ4Éñ™–´/˯=Y%DÙT+Á©x¯MyŦ~XQ¬Â2Ki|ª›!Iò,íI÷©Ôg©^J„â<Ǹ-KÚîÓþ¼ b" ¥ü¦û²ür8m*+ *ÚkWüïjcYR¬ÛëàçiT95L¬Û¦³:»uóÔ\éì×׊²i\ß(mÌðëT6}N!…á‘#GÊé¬qùå—«¸¸X^¯W–eéšk®ÑÌ™3õ¯ýKuëÖÕ´iÓÔ A Ÿß2J(÷[ºæµlÅÅØÔ£y¤žœS¤¡­"tÕˆXIÒœõåúze©º·riÖŠRÝ8Ô«±}£Uê³tó?³cW—†zýý|=zv´uôª°8¨¶Odéì¦*/7õöuµôμ|M^Xª‰ý¼ÚuÀ¯;|úðæZª—pøÏQA¶Onçá¹¹eI?§$»ôCZ@qÙ¦6æZ²M­>PB±©>È×Ò»’eüî<®œbS]ã«ø-KzàÃÍÛäÓ¹=Ų=™Íø¾bnñÝy¦rJLM«rŠË’¾^^¤·×úôÊÄ„#¶û— “þ7×']¹½\÷}”§ÇΉ©r:™½yA%%Ù•W‘°7Lr¨^œ]¥¾Šµ7NvjÍ–RýûÇùM)°´6ͯAmݲ¬ßµ!(î⩼9<Õ¡=¹AÅxmR¹¥Y~ÍÈòK’ò ‚ÚPÀ¬XIŸ–:l—¤Ø‡<Ñ6ÍXT 3úFËa;ôM·«!³8¨9K‹tj·(18 €?‹¦d·I÷KÐ7$i_©«¦æêÑOó*—7Júuë7Éòw›ÊÔÿùEFØtùh iï:äCJ<8ù/®Íc—;Ö!w¬Cƒºy4ixŒl¿ ƒMKZ¹©\ACªºŸ©U»} ”WÌÍþGê»Mc" mÝeI_ÍÖ3óJ4¾o”.­DïÚfIÑ.ÛooVÌcUü±G9*kУ£G“FÇÊfTÌÇîöØCò~£Ý6õmåÒG?”ªÔø! w„¡~œzwqÉ!Ÿ)8zŒp¨¸ÜTv‘©†IÝ~fœÎíéS³G²tËés¸ÿ”VõÔ#ÓW•êâÎ.Ý;J6CZ³«P2ª¾§Ãn¨a”¡16õoS17yFAP±nÛ!EµÛ¤Û'$ÊûiŽf|[  †Ç…ä=^:0Zµbìúç7…zhBÂasÃ'xmZ¹7 RŸ)w„M¹%¦ÖgdÉRvQP_lókûµÕ¸¶S…e¦ï èüN¿>ÿ?fÖ–”k—HèÞ8R’”ST´ëЄ¾LŸfüP¬™w&+ºŠóiÙ½·Õ¯M÷¥ÈÆáwæ.Z¬ýûökÜØó) ¬±‹ Pa©¥ÑS²ôñ¢-\_ªëŽ‘•£´ƒpmÍ1]Ýú`m¹¾ZV¤)Ÿæ*Ém¨g‚MÓ*–ù»:2¦›z»õ÷O 4ã»B}þc‘Æ?“©Ÿw”¶^Ãcì Cû>{6Ôªô`•éxÛº:§™S<›©èê©9joWR´]‰Qv nèЬ‹5sI¡Î{.KÏ vëÇ eÚ‘áW‹ú|£O³–ªÄ÷ÇÑ{¤ÓÐó§yu×{¹š¹¤P³*Rçdjå¶²¦–)Å8 Åyªþ©ßœPϺN9è €j 7'O»ÓöP@Øc„;@)qv}|M¢¯.ÑöÕ%jÑØ¥!*F¡7L°ktË_çs÷Dzf`Ų.M"5uBœ6m,Uë6n jãRf.¥åtºµ·Köƒ®Ín:=N­ê—hëÖ2EzmzfR‚Ú׋¨²MQqmÝY.ËR•ó‹?=Ð%wDÅ‚æuœ ”WHðØte§È*ŸcYÒÞÒªq›!½u]-Íø¡H%¦¥.Ž×è²Õ¨¶C†!½wu’¦/*Tf©7.K'Ò¦äU%*õ[ÚÙ«ÝYAùl#ÕŸì:dÝcÛD*5®¢׎ŠSÓz%Ú¾­L»f_• 6u"dYRŸ¦JM ÍOs~©yÄQ÷9Ŧìlú„;@’Ô<Ù©æ§Æp÷læRÏf¿ȵbìºqLÅÅLvC§vpëÔƒá¼$õnõëc¯>çð‹žŽèä‘:yþc{<.›vå™*ñ™òV1%ÊMc+ÿ= “÷×÷‘âTóQUOCãrZµ? ¢Ò ¢ÜöCÞ§eILÏÓ6. hãRA‰©öÔ£qÅ”X»®}èzÇõ‰ªü÷¤a1•ÿ¾y\â!›tjÌ¡5èè‘:ZÃÎí}ÄšFÅÙ¦U1%¼iY’?²ZÊ* ÊUõðõ@ÐÒª>õlèdà „܇0ŒðhGßV.3-OëžÎÒ×&*!úÏÇŽqÛt—:<”¡y7%©q²ó÷}ý°h|6KÝkiÙ¾€Þ:'Zîˆð™sÅnH“?ÊSû&ÊÌðkQZP—ñòKÒ‹_èÆ¯‹µì†„*×sù ™Z¸7¨/oHdƒ „Üa)Òa(çáT(*ʺÐû¾q ºþtSnçáGê$8´ôoÉÚ•Pb”] Þðšàü¹ q*óYrG*õY/)9æÐ†¤sz{5~@”jEU}âŽóãõD´]IQLà@(¸–Ý&Õ ýLãG Ò#솚'‡çT+ÿ»Ÿíz G~\ëT¦’àX`h!@à@¸î„;!@à@¸î„;!@à@¸î„;!@à@¸î„;!@à@¸î„;!@à@¸î„;!@àaÊ0 •–•QÔh%%%r¹"( F p€0Õ¢y]-]¶\–eQ ÔX;v¦©eóT ¨Ü L%%ÅÈéÌÖ†›ešæŸZ—A9B†aÈÁVµ~ÃFåæoÃá ¨€=\S–eé’ éi3ôæÔj×®«ê¤ÖùŸ×c³Ú¹;M_ÍOQ²msý† *÷ŽêùYÙÙZ»n¥Úµ©¥«.!ƒ#B€‚À˜Ói×eÉç *¿ XÁÀÑœmZ’¬ý–­Ø¢r_P}zµ¢ÿAûv-Žz›²ÛãuÆèÓäqGˆ“5 ;„9˪Þ“c(Æ1V»Vœœ%'ÇQŒã´mP“0‡;¿A Ž;!@à@¸î„;!@à@¸î„;!@à@¸î„;!@à@¸î„;!@à@¸î„;!@à@¸î„;!@à@¸î„;!@à@¸î„;!@à@¸pPzz®""w*,*Q›Võ(8*îü†aÕE ¸8&v‚A“BÀ1æóäõÄRS‡ÕªÕÛ- ÇØOK7«Eó&ÂW†pL4oÖTsæÎ•?°N]»4Q„Ó!‰ðáÌR0hÊï°­¢zl¯¦©Õ«wêÇ¥¹ºõ掔Â;€cÂf³éê¿\¡´´=š¿`½vìÚ &FX³¤uëw*7ÏNÞŽ°˜jÒ¸µÚ·ë­[on(»“ ¸8fœ‡š4n¤&I:‚ ì½ÿÁG?ö< Ž Ã¡8Ȳ8 =wB€À€ p ÜwB€À€ p ÜwB€À€ p ÜwB€À€ p ÜwB€À€pPÀÉβ,YVÅߦeÉ8x¿aà„öÓ$É’%ëû覕aY–E'«´={õö»ÿ’išÚ¼u›Z4k*IªW¯®.½x8ý´… I’Vý¼V™YÙ6x€‚¦©‹./©; 1ÂpR‹‹‹Õ?-WNn¾$iûŽ4IÒãßCqN ‡Ã¡wÞÿXEÅ%•÷mßù®ú÷;…°¶˜ÃpR‹ŽŠR›Ö-õÛÓ½Ün—6l@qN Ô”dµjÑôû,K:}ä0Š[Þe/T0¬¼”«Ô”d p‚]qÙ%ò•·SRk«nÝ:¶Ü'½ºuR”R;I’dZ–† $‡ƒY×N´fM«I£ú•·#Õ#p„1wÀIÏív«{׎’¤`ÐÔ¨Ó†S€0©þ}{ɲ,ÉFœ:Tó·Â;€C›M;uT TÛVÍKQ€a2h Ê}~24ŠùÛaŽÀIôU¹? íZ)2"‚‚„‰–-š©}»VjÕ¢‰×éºæÊËåñ¸) TSî€#îÀÍøìséÌÓOS||E©ŸéŠ•«5wÞM¼ø¥¦$Sª© 7kÚ‡ëâ cÔ¼YS RìÙ»Oo¾5MC÷×)½zP¨†ÜUÊÉÍÓÛO^=»©WÏ),*Ò”ç_ÑÐÁÔ³G7 @5bY–fÏ™«ìœ9÷,EFFR”öù~ùÕ7Úµ;M—M¼HN§ƒ¢@5Bà8LFf–rŠî¹óÅÇ1ª½¦2MSŸ}>[%¥åsÞY²sú9a¯´´Lo¿û¾Z¶l¡ýNa¾ïlë¶ízûÝ÷uó ×r¦)T#î€C¤íÙ«÷?øD×_s…Ün©á,Ik~^«—­Ð“.¦ „±’’R=ðÈãºòò‰jÒ¸9 dfeé©g_ÐuW]¡ºuëP¨Ü•¶ïØ©>ýL·ÜpµN]=™¬þy­V¯Y«‹/G1C……šüÔ]1é5¨_‚œDòòòõì ¯hÒ%¨~½ºÂçŽ$I»ÓöèÕ7ÞÖ-7^CØ~êØ¡Úµm­7¦¾#Ó4)aÄç÷ëÉg^ l?IÅÅÅê†k¯Ô+¯OU^~>€0GàP~A^yý-=xß]rØíä$Õ¥SGµiÝJ3?ŸM1Á ©×ßxKãÎ?‡°ý$«¯»JO>õœJKK)„1w8É•–•é±ÉÏèö[®W„ÓIANr½zt“ßç׿-[)aà‹ÙsÔ¡c;µnÕ‚bœäj%%jÒ¤‹5õ÷)„1w8É}þÅ]|Á8ÅÆÆP È0 uæh½1õ=åæåQN ;w)7/O§ôêI1 IjÔ ¾š7k¢…‹¾£¦Üà$öóšuòûýjÕ²9Å@%§Ã¡;n½Qo½ó¾L®­À QîóéÅWßÔ˜óÏ‘Í0($U Ž:x ~Z¶RyùÂ;œ¤ü~¿>ž>KçŸw¶ vâð; ñqjß®~Ëè)N„é3féÊË.‘+2’bà0“.ž )Ï¿¤@ @1 ̸ÀIêƒ?Ñø1gs‘Tü¡AúiÉ?©¤¤„bp¥íÙ«rŸOÍš6¡¨Rbb‚†¤Ÿ×®§fÜà$”•­üµjÉÅ·p„N‚ͦ‰Ž×'3>§'Á`Po½3M£FœJ1pD];wÔ‡ÿþT%¥¥Âi_šÀÉçí÷>Ðø1çQüG©©)JKÛ£ýÒ)ÇÁô õîÕC‰‰ G©‹/§ËWR #îp’Ù¶GN‡Cññqÿ‘aºöªË5wÞŠÀ1fYÒko¼¥^=ºS üWZ·l¡Ÿ–­T0¤&Üà$³`ábM¼hJÅ-::JùùÊÍ˧C›·lQ‡ömåõz(þ+†ahà€>úâ˯(„ w8‰«¬¬LQQ^ŠÿiGî´§jö—s(ÇÐç_ÎÕé£FPüOºtÖÈï÷S îp2íÄ}ñ¥ÀèvüÏš4n¨½û3(ÇÀô %ÄÅÈápP üÏN5\[¶í Üà$´+m¯š5mL1pTè«õ7SŽE‹¿×€þ}£Ò¤qc}ôñt a€ÀNé™êÛ»…ÀQkÞ¬©>øðcY–E1¡@0¨õ7«q£†G%.6FÞ(¯²²²)œ`îp’øà£OÕ´ £Ûqôbb¢«¼|.ž @(egçhðÀ~ÊØóÎVÚž½N0w8 ””–*ý@º’“kWÛ÷`Y–²sr•››ÇzBwäÎbä!6sÖl5jØ Z¿‡ÒÒRåäæÊ4M>Ð$)1Q_~=ŸBÀ Fà'¼¼| <°ZÎ jš¦æ|õÆ]|…ºõ¥.}OS§ÞÃ4}æ,A>Üã¬VR¢æÎÿ–B"þ@@Û¶mWÝ:©Õ²ý[¶m×Ý÷>¤N½OUÇSFªeçþúûãOjï¾ý|¸ÇYdd„"œ6—”P 8Üà$°cç.õîÑ­Z¶=??_“ŸyQµã5gú;újæ»êß»‹|ôY}2ã3IRqq‰ŠŠ‹+ç÷ùý*,,R0xh _\\¢²²ò*ç /))UiYÙa£²LÓRAA¡²srHtN IDATTVV~Øó •“+ŸÏWå:³³sTRRzØý~¿¿Z~.—KöíSÑk„¬¯ÓªU+ÙlÕo÷< êwß×â%KõÜjÙ‚™úÛí×é“™sôðß'+¨Üç;¤_f𦠋ŠTZzhÿ¨¬¼\%%¥ PáóùTTT¬@ pزâ’eç䨸øð¹¼¼\ÙÙˬÃÖéWNN® eþ¦oTTT\-·%Ã0Ô±Cmذ‰/œ@J5ßOËVª[—NÕ²í;vîVQQ‰âÔ´q#Ùív=|ÿ=òûýr¹]2MSwÿí!•—ûôì“Wdd¤Öü¼V“Ÿ~^Ý·š7kªÒÒR½ýÞZ´x‰"##T·NŠnÿëMŠŠò* ê‹9sõá¿?•ÓéP|\¬þzóõª“š"ŸÏ§Ç&?­u6Ëï(.6ZŸV­^£‹~ÐõW_®çž~\½{õЬÙ_)//_ÛwìÒ[ï~¨®]:ëù§×9gÖÂÅ?è@z†$iü˜sÔ¶M«j»MõèÖUûöïãË@¬\½Fµ’ªeÛ].—ú÷í©`À¯¿\{³¦½ÿ¡~øq™RSS-Ã0äøµs÷^ƒgÇ™¦©½ûÒUPX$Iúú›ºîæ»Ô­K']6ñB­X½^W]›22³´qÓf»èJEDDêö¿Þ [wé©g_Ñ–­Û´{wš|ôI%&&êÙ'Õùçž¡Wßx[ÛwìT~A¡î}ð1™–¡¦LÖ“.ÒòÕkµfÝIÒ#?¥ÝiûôÌäGt×í7kÖíúòëy’¤zuëè¦ë¯’ÃQ=Ç'ÆÆÆhçî½UžÑ 8>á5\Úž½JN®]-OS–$·Û­{î¾U‹}§ùß.Ñ_-”ÃaWÇö­õÔ?RtT”$):Ê[åõ[·íÐêµÔ¾m õíÓ[}Né¥þ}ûÊf3TXT¬·¦}¤ö­›éÔaCäõxÔ©Cûƒ§+[šõå\ÅÇÅ(&:J…êØ¡>øh¦222U^^15ÍS^Ò=wܬá§Ö¤‰J’2³²dYÒôÏf«kçêоÎ}Zeûš7kZ­·©† êéÇ¥ËtJï^|Áø“¶lÙªˆˆÑÕ²í†aè²K/VÝÔT-Xô½ž~á ɲäõzôÀ=·i@ÿ>ôDí?8ÇûC=£Øè(qúHÕIMÕôßVn^ž\‘‘š·`±l6C—_z¡Z4o¦éLÕþéJJLÔ¦Í[ä5°_oåçç+>.N‡Ck×mÐÀýä+÷kë¶Zºl¹Z¶h®iS_©±nI™Ù**)Õ·‹¿W×.ôΛ/*Êë•$ÅÆÆ*66¶ZoSÑß àÄ p€î@z†:wîT­ßC«ÍÕºe ]véÅ**.Ñ£ÿxJ ý¨?š®Ë†Üq1Ѳ ´Íà¯ó‹çççK†¡¤¤DÙthÕ²™$©°¨H6Ã&¯Ç­ˆƒg4mÒ¨ò¹6nU„Ó¡×ß|GNgÅOf«æeY¦ºuí¢ñcÎÖòå+uÛÝÊÔ©c[=òà½jÞ¬©î¹ó&}2ý3=ð÷'ä÷Ô¼iC=ñ‡]ý;‡rróùrð'•—ûá´WÛ3%Éãv뜳ÏÐYgŽV0Ô‡O×K¯¾¥¾ýžºwïRù¸_F\[–%Y–öí?PqÛ Ê㉖Ëå–$%'×Rrr-IÒÎÝir»]Š>ØŠQllŒ$©´¬L†¤>𮄸ØÊ~šÏçWlL´ž}ò½øòëzùµ·TPX¬Z‰ñzjòÃjØ ¾žú1=ùÌóúdúçzéµ·­‡î»K:¶¯ÛUƒúu”_P ¸j~àªí>3%€š-+3Sýúõ©–m·,K/½òº22³tñ…ãÕ¤q#ÅÅÆèÚ«®ÐÜùßiË–-²,K[«ÖnT ÓéÔÏk7T®£i“Æ2ƒ¦23²d³ÙôÁGÓe·Ûtƨ‘òz=*,*Qy¹ON§S³f¥¢¢"6DíÛ¶Ôî´½zøÁ{•_¹£èú~ÉRIJVFF¦æÎ_¨¶mZ+6¦"„¿pÂ>T–iʲ*^K’Úµm­gŸz\EEEÚ¸i³n»ûAÍùzžþrÙ%JIIÖã@EEÅÚ²u«n»ëA=ñì‹z÷Í—jÄv•˜˜¨;v«s§ö|Éà°ßÿý÷S¨¹}ÿƒz÷ìQ-Ûn†22³ôÆ[ÿÒÆ›dÚµ{·Þ˜ú®v§í×]·ß¤zuëÈç+ÓwK–jÃÆÍ:pà€Þû÷tüuúHÕ¯WW999ZòÓ ÅÅEkÙò•zî¥7Õµs{uíÜQñ±ÑúbÎ<9ì–23³tÿ#OJ–¥3O)¯×­/¿Z Ó ¨¸¸H×ßr·¾™ÿ­Fž:T_|ùµ.»ú5kÜP…EEÚ³g¯òòò5vÌÙÚ°q³†Ž§Æ ë* jßž½Ú°i«.wžâãâ´ä‡Ÿä÷ûWm·«´´45lØ ZÈàDÛ±s—<6¨W-Ûïõzõìó¯iÎ7 ä÷—+7'Wó,Ò쯨G·:óôQ2l6}:ã -_¹Z^·K¯¾ùŽòò áÔ…Æ())A3gÍQnNŽl†ô<¦uë7jâE¥™³¾Ôüo¿S½:)zñÕ7õå×óuÉ…c«éŸ}¡ 7«Vb¼ÞÿàcÝqï#Я·ü~¿ ;[‘N›<¶mß®•«×j̹g*11Agœ±V¬X¥õë*==C?-[©sΩŽÚ+==CK—-Wýzõªí”ŒeååZ¿a“Ú´nÉ— Nw¨Á,ËÒKWª{×ê;¥L‹æÍÔ«GíÛ·Oë7lÖ¢ï~T£õtÁ¸s5°_†¡øøx™A¿vîÜ-;RW]~‰2ÒÓÕ·O/ÅÇÇ©C»¶*).Ô÷K–*'7WÇЄ±çÉáp¨YÓÆ ýZýózmÚ²MCöÑõ×\)Ç£õëËíŽÐ† ›µtù*õèÖQ7_ãÕ¬ic|eZ¶|•æÎÿVI‰ñ9|¨:wê ÔÔEy"ô󚵚1kŽ ÃÐè‘CÕ÷”Þ2 C}:S1Ñ1jP¿^µý\ö8 ˆˆHÅÅqª2GkÓ¦MjÖ¬©¢££ªeû]®H>j¸Ì€_[¶n×OËV*7/Wgœ6LWLš(Ç­ø¸8ÙŒŠiþrrrtñEãTXP ZI >lˆR’k+&Ú«mÛwjÉËÔ·w7]Í_”šš¢Ø˜5oÖX™š·ð{5mT_ƯíÚÊëõªsÇöÊÎÎÒ‚o—(.&Zg1Rû÷Utt”Z·lª5k×iƬ/•““«¡ƒújÔiÃåv»5d@mÙ²U_ÌùFÛvìÔ)=»jÌyçÈíviÏÞ½úè“4 Ÿìv{µü\‡¾™7ëíÀ bX\ºj,˲ôÚ›ïê/—]TíßK0<øÇTD„ó° ˲*æA=8ÕI Ãᨙdš¦ü~¿ ÃVù˜ß>×ï÷K’œNça§uûü~™¦©§ó°‘N~@Á`ÅT6¿oS ßÓéÃá8ä96›Mv»­Ú~K—­ÍfW×.ù¢p”f}>[C’Ûíªö}Î@   iÊfŠˆˆ8ì1ååå²Ùír:òù*ú]¿í“ùý~MS‘‡õÅü~¿‚Á œÎˆÃúO`Pƒý­ß÷Å‚Á ü~¿l6Ûam2MS>¿_†a(â7ý?Ó4ë/V¯~³©Çþñ¤îºã¯Õv”>TgÌá5œ×ãªïÃn·q”‘ar¹"+oÿ~§Êf³)22òŸ[ÕŽa庎0mŠÓ騼 êa?²ŽCƒöß>§ºKHˆ×ÏkÖ¸ð'”•—Ò©® ÃÓéÔ‘"êßöê ³ô|§Óù‡ÓØ9ìv9þ x¤þ£Íf“«Š¾aE8_½Cj»Ý& ÆWÀ‰Á¡N¨á"#™cÇ`GÎf—ïàYàèdeçQo”ü…€€Àj0Ÿßÿ‡#~€?£V­$e¤§Sþ»ƒ“ÎqléìMÀ±Eà5XaA¡âãâ(Bϧ)ð;îP“Õÿ-ƒ¦ŠŠ‹ûë—”È4ÍãóZÅ% ƒ’¤¢¢bÓë€Ë_¦g+))=n}¦_”••«¼¼ü¸÷E}>¿ÊŽÓëþév›¦Äà8!ÜamûŽ>zÌqßù½þæ;µsWÚQ¯Ã4MåçüW3áRmÜ´Y’Ôkà(íÙ³—€“@u?[Ìçóéö»þ¦Ýi{kͦýëCÍú|öŸZOAaáu à·}Ñ<]OOy©ºl\|Áà!p„9Cvûñý¹r:ziÊd5jXÿ¨×‘“›§»î}à¿û1¶Ù*OF`Î}N5ažmÃ0Žûë]tÁ8qúè£^G0hê©gžWVVöÿÖ5Œãþ~–Ýn— ƒ/œ\¡j0¯×«üÂÂjÑÖ@  Y_ÌQúŠOHа¡ƒ[¹|ÿt}õõÜŠeCÉírIª8ùÛÅßi÷®Ýjܤ‰úœÒS·[~¿_ ¾ýNíÚ¶Öâï–hðÀþJLLÐÚuôãOK Õ³gwul߮а æ/\¬Ý»Êãqkþ‚Eêݳ»¾š;O¥¥¥1|˜’k×’$•—û4}ægÊËÍSÝúõ4dÐùý~}>{޶nÛ¥Ÿ}¡ÇÊn³é§e+´aÃÅÅÇë”^=•š’ÌF ª…µë6èûï—Èátªw¯žjݪEå²²²2ÍúbŽ2³²4lÈ Õ«[§rÙ?-ׯMåñxÕ»WÊe‹¾[¢”ädí?®ÒÒR 6X™™YúfþBåçç©vrŠÎ5¢"8þ Ë’V¯Y§§Sí۵Ѣï~PÓ&´uÛvmÞ¼E=ºwS‡öm+ƒñ…‹kã†Mr¹]ê×·¯š4n¨éŸ}®Ÿ×lÐs¾V¿>½Õ´Icmß±SK~øIåååêÕ³‡Zµl!›Àð¿c„;Ô`®ÈHù|¾°og0Ô=¦»v©}ûv’,Ýuσ*+«˜#Óç èå×þ©Ô”mݺ]W]w«$Éïèî¿=¨M›6«M›Öúé§ezøÑ'>ǯ÷¦}¨¿?þ´¤§Ën·ëÛÅßkâ•7«~ýzjÔ¨¡yô)}»èû*ÛóÒkS••-_y¹žù =øèdEy=ŠˆpjøãUPX¤²²2]yíM***VÛvm•‘ž¡G}Rv»]†$‡Ã®Úµ’d·Ù4{Î×úç[ÓÔ²E éêëþªÂ¢¢j»mefd©v2 ø³} ê`Þ‚oõøϪYó¦ªW¯®î¹ÿïZ³v]åòç_~C¥%%ŠÕE“®­œ–ï›ù õÒ«oªaƒrØm:ÿ‚+”››'Iš?oxd²¾ž;O^¯GÅÅ%:sì¥**.VÛ¶mõóÏkõÀÃWQ#KK—.Óúõëeš¦¾þz®®»ùNmݶ]uëÖÑÃ>©¹óH’^zõM}õõ<µiÛFIIIštÕÍÚ¿?]1ÑQ*)-Sbb‚\.—²³s4ñŠU+)Iuë¤êo>ªµëÖUëmËïð€„îPÃá¿#ç´wÿÒ§—zõì.Ãè¡ÁƒÈ劔$Ùí6]uù¥JMMVÿ~}Õ{à(edf).6FŒ£öm[Ëáp¨Cûv8üÝrã5r»\2-KCõÓYgŒ’Ïï×§3fiò#ÿ§AúU¬×f×GŸÌPŸSz6zÊf³Už†k†.{žºvé¤òrŸfÏ™¯M›·¨yÓ&Ê/(T÷î]Õ¾mÒ«§ åõxÔ±C{Íœõ¥z÷ê!IJIIÕ?þ~¿bccÔ¡C;}õÍíÚ¦vmZWËíÊ´,E8|Áø’âc«E;wïNS»6-Õ»WO¹].õîÙC‘‘‘’*æ =bˆF &Ó4µ~ã&­Z½Z ÔSríd=òнJ©]K@@+V­Ñ’Òi#N• C…Ezð¾»e†Þö/ÚO—M¼H†a¨{·.êÖw„n¾áÅÇÇÒÃ0é§Ò³›&]r¡ ÃPff–6mÚ¢Áû+33S;uPïžÝåp8tJòF©[—Îr»]êÞµ‹R’kkÏž}zùù¨uË2MSÛw¥éãé³Ô¡Š3!«‹’¢9D>p"ð¿/Ôp…%aßFWd¤Fª_~Sóç/T¯^=5âÔ!•Ëív›RS+FSÛl†Ô¯£üüÕJJT ÔCŸ¬òòr™¦©ÈH§ äv¹d³ÙÔªesIR0Ðî´}úàÃOôÍ7ó%Iyù…ÊÌÎý,sØíJIþõõâä÷û£Áúê¾S‹fM4 _ 2°Êu4iÜP/¼üš å÷´o†òŽðªŽrrrT¿^=¾`ü ‘òù|ÃëðuîÙgjÌ…—kÇ®Ýjܨ.7Vuë¦Êï÷K’5j$©"üNˆSYY™ ÃPƒúuõÒ«o(;;Gf0¨M[¶«K§ö•ë½ô¢12 C–e)?¿@ëÖoÔ=÷=TqmÃPL”Gë7nVŸÞ=ŽØ¾î];UN!S«V-mß¾K†ahâÅhâ×kñw?¨E‹æ7æ\9‡Ç Éɵ´àÛEzëí÷dM¥í= ¸ß…üÕ‰iZg\2‡;œîPÃÕãtÒóÏ=KC‡ Ô®]»õñôÏõÂ+S5gæU>ö—ù4H×-wüM·Þt•úöÒ2-ºðŠC{ÈŽ†ahð þêØá—ÑJ† C²Ùþó…J*æð4 C×_{¥Æœw¶öìÝ«)/¾®/¿š§)O=zÈã uÑ¥W«]Û–ºåÆëT^V®;þïþj½]«;Jlt´rróÂþº.ÑÑQšñïw´k÷nmÞ¼UGÕSŸWû¶gêýrmßòù|ºóÿîWdd¤n½åzIÒ䧦è·=ª_/kÈÔ´i]4alåµ>/º`œ’“kÿÇöU^Ôôw}¿õëiÖ'Ó´mû­Y·N=ŒÖ¼/>P”×{ÈóŸžò¢þõÑgš6õEÅÇÇëíwÿ¥m;vUÛíª¤¤D®ÈÈŠ36Çÿû@ f†œÎðÿ¯ÞçóiÅÊÕŠŽŽV§ŽtïÝ·Êf3´aã¦#¾·m;v)ÊãÒYgŒVrrmmÞ²U–iVÌõù»|ÜétªYã’,µlÑ\-[4WLL´<÷Qþ1$jåꟕœ\[]»tÖ3“ÑÒ?+3+[6›­rä|Nn®$éö[nPJrm‚AeåäÉü#ëÃY~A~å…cÀщ‹ÓŽá욦©7+/?_Í›5Õ¨Ó†ë¶ë.Õ²å+ôKWÆúƒþÝ®´½ºâ²KT·Nª"#"ôóÚ šfý:©Nݺ:ž¡Æªe‹æjÒ¸±L3(¯Ç{TíZ·~ƒ‚Á Ú·k£±ç£sFѪU«+ÚlYòûü²,K«ÿ¿½;²0ð8þ›Édr_“9HB °E@‹E+rŸ‚Ö¥.ØGV°û¸}vŸ}öxÜõ©[ÝeÕâb¡ ‡Øª• x 幯$$ä$ É$B&“y÷\Ö.–È$óýü3ÏæÉûþòÎû<¬ÿégÊËÍQB|¼Ž?¡ÖÖÖÿ;èëbjj딑ًt®p€n.ÅéPS“Gqq±AûM&³Ö­ß¨ßý~½î¾ëN}ñå~e¤¥ê¯ôÓ©ÓEWþãÒIÒ€~¹ŠŠŠÒÛ+VëÈÑã²ZÃ5~̽úÝšušõäãúÏbÑôiSôâK¯èˇ4ø¶ú`ÍZýhÖJëÙó[_ãj Iaf³/Y®Ì¬^:x>Z¿AcGÝ#‡=Y&“Im¾výÿ¼¤æ?«—]‹—®”ÕjQUÕ9}ŸV¬ú­úöé}=/4ªªkà €HN¶éèöúî°;‚ö=šÍf<]¨Õ/ýBN›,Ãohý¦½ü¯ÿ¨«]³©;o¤e+V+/·¯vïÙ«LŸ¢5ë6)¿_þvÂø1zÿÃ4gî|M™4A»öì•Ý–¨ù?é{Cï;,,LÛwîÖk¿ü•ƹ_çëëuìd¡~úܼKÏÔ§{ùU=8m²&M¯·W¾+Ç£uë7ê¡éèßÿã ýqÇ.9ö.w V__¯ì¯oóè„Ã0ºðåu€¿hÇ®ÝJˆOPÿ~yAý>=êêÎëTa±²2Ó•âr)&&FMNž:­!ƒn“té*«ƒ‡¨wv¶bc¢USS«ªêsJHˆW©jjl”§¹Y»]§N)³W†âãã.¿Nmm*«ªd2™”l³)55åŠ÷òÍ׈Œ°êÈÑãÊÍ髨¨Hùý~;~R.—Söd›ܪ©­UIi™rúdËét(22R†!UUUªÍçSÏ=äñ4«¤ô¬""¬Jq9¥êêj%&&éta‘²²2•˜¯½ûö+??W1ÑÑAûoe†~¹èך7g60: ¥å¢^{}¡þö…ùA}¿mÃ0TYU¥ÒÒ2EDD¨G¹œÎ¯‹N(³W/ÅÄ\:v),*–ÅbQ¯Œt55yT^Q!Ir¹œŠ‹SyE…¢£¢U[W§øø8õHM½ü:ZZTQY)wC£ìödÙ““/ÿ½ßô¿¯‘‘ž¦ã'NÊf³]þæ]eUµÜîFåæô‘ßïWUUµŠKJ•§—Kޝtwc£ÝŠŽŽRbb¢Ê+*åv»åt8äpØUU]-³É¬è˜h:]¨!ƒnÓÙ³åºèmUßÞÙAýÿêÓÏ 4xð %Û’ø@'`p€n®°¨XÛwìÒÌÇ%Âçóéß¼¯™3!ôÏ/þ\ÿ³ŸÊj 'bÉÒ•šõä š „{¸@7—‘‘®êªjñûUJYY…²33@degÉëm%¦Þí&t"wèæÂ-),\^o1_|¹_©ßøú7¸q·¨úR†ÇÓ¬Ìôž\݈ÁBÀÐ!åmóÖÞîב#G•‘‘N Àé´kÛöÝ„@@ìÛÿ•ÒÓÓˆÁB@ß>ÙÚ»ï!Ða­­•””|é› ÃâtðÐ!nÿ‡3 CûP~~1 1¸@HLHÔ§ŸV_ïÖèQ÷€±ZÕž–¦ÊÊ*b C¼^¯š/\T|\,1 1¸@ˆ‰‰V||¼ÎÕÔòþšär8@Mž8V¥gË©opëþï t2w<4MgΔ7¬¹ù‚*+*•˜˜@ (5Å¥O7o%:äƒ?RVV/B@'cp€ѳgª¶íà\¸q§ õÀ”I2›9| ,‹úde¨¬¼‚¸!MMUWŸ“Ãn't2Θ D„‡‡Ë‘œÄוqÃ6oÝ®Áƒ¾Cn‚»‡×Öm$nHIi©˜:I&“‰ÐÉÜ „L?VŸl‘aÄÀu)/¯Tb|¬, 1¸ ÒÓzèly•|>1pÝ֬ݠþýòA€ÁBˆÍ–$o[»ZZ.×Ì0 ­Û°IãÆŽáª)n¢IãF«` ÷rÇõ9rô¸òrúÈN  îbî¿o„V½û!pÍZZZd6›år:ˆÀM”——£­Û¶«å"GàÚ†¡Ï7oÑä‰ã‰A‚ÁBLïì,ÕÔÖÉín$®Éâ¥+4vôHBp³OÐÍfÍzò }¹ÿ+bàšŸ)Q¿¼\Y­\ÝAóóœ÷²ÔÐIDATzfýp†Ö~¼‘ø‹ªÏÕ(22Réi=‰À-žž¦MŸ|®ÆÆ&b઼mmZüëåºcèíÄ€ Âà!Èåt¨ÙãQaQ11ðg†¡å«~£GžN n‘p‹EOÌxDŸl!®êø‰“š0nŒâããˆA„ÁBÉdÒÌ'ÓÊÕïÉoÁ·Ú¹kòsû*.6–ÜB}zg©©É£²² bà[¹õþk4tè`b@ap€©q£Gêã7Whòx´c×?v1¸ÅL&“¦O›¬×ß|KÞ¶6‚à +W¿§gæüHÖpîÝÁ†ÁBØC‡¨º¦F%¥g‰ËÚÛÛõê‚7ôøc?ÙÌ¡!6&F³fÎІ ŸÈà‰ø†Ý{öªwf/¥¸œÄ€ ÄY4„¸‡š¦7-Qss31 Iúä³Íš>u'qt²Üܾr75éÀÁÃÄ€¤K´ß¼u»ÆŒI R îâbcbôüsó´àõEòûý q_:¬ºóõп1=ü 6ÿAÅgJ‰âÜîF-xm¡æÎ™-“ÉDR î9vM›:Q?e£{;yê´6oÙ¦GžÎIAÂb Ó3OÏÖÒå«T}®† !ÊÓܬ…‹ëùçæò@{r îIR~^Ž&O§ÿþÕ2µ3º‡œâ3%Úøiž{öoÆ}Û*QQQúñܧõŸ¯-dtAÍÍôÆÂ·4mêd9ìv‚@ãŒpÙ€þù5ò^½ùÖRµù| EEgôÁ‡k5wÎSÄ HÙ“mú»æë¯þ—ªªª "ššÞ¸IÒç=­¤¤$¢@Åà¸Æ“€6>rL®]¯ß¦aÃîàþî]ÄÑc'ôyÁfeefjèÐ!r9D ›9SRªµë7*.6F÷Þó=eöÊ Jpþ|½6ÿa«Nœ*Òô)•“Ó‡_˜@Çà¸n{÷íמ/ö©µÍ§Ãï”Ãn—ÓéPdd$q:Y{{»êܪ­­ÕÑc'tâäiåçåhä}÷(.6–@tseeÚ¾s§Î””ë®;‡(55EÉ6›’lIbÆí|MMª­­S]m¶íÜ#»-QC† Rÿü<â@7Áà¸!†aÈçó©¤ô¬öí?¨CÊ×Þ.[²]rØ“eã«°7ß0TTT,¿a¨¼ì¬,aaJv84ü®aÐ?O‘‘‘ 3› @ˆioo×ùú:rT»víQcc£,áár:]2™Lê•)3Ç7÷xY†ÊÊ+ÔÒrQçÏ×éâ…EEGéö!ƒ5ð;”’â’%,ŒPÐÍ0¸¦Íç“·µU~Ã×ë•ßϘ›þƒ\’Õj•Éd’5ªp‹…“gpŸÏ'ŸÏ§6ŸOþv¿¼mmD¹,aa²„[f“Õ. ÏB€îžÎà@Çq Àà@0¸ îƒ;Àà@0¸ îƒ;Àà@0¸ îƒ;Àà@0¸ îƒ;Àà@0¸ îƒ;ð?¯Í¥s¯êœ%IEND®B`‚Alien-Build-2.84/lib/Alien/Build/Manual/image/PluginAuthor-flowchart.svg000644 000000 000000 00000276373 14710030646 026022 0ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin.pm000644 000000 000000 00000014651 14710030646 020153 0ustar00rootroot000000 000000 package Alien::Build::Plugin; use strict; use warnings; use 5.008004; use Data::Dumper (); use Carp (); use Digest::SHA (); our @CARP_NOT = qw( alienfile Alien::Build Alien::Build::Meta ); # ABSTRACT: Plugin base class for Alien::Build our $VERSION = '2.84'; # VERSION sub new { my $class = shift; my %args = @_ == 1 ? ($class->meta->default => $_[0]) : @_; my $instance_id = Digest::SHA::sha1_hex(Data::Dumper->new([$class, \%args])->Sortkeys(1)->Dump); my $self = bless { instance_id => $instance_id }, $class; my $prop = $self->meta->prop; foreach my $name (keys %$prop) { $self->{$name} = defined $args{$name} ? delete $args{$name} : ref($prop->{$name}) eq 'CODE' ? $prop->{$name}->() : $prop->{$name}; } foreach my $name (keys %args) { Carp::carp "$class has no $name property"; } $self; } sub instance_id { shift->{instance_id} } sub init { my($self) = @_; $self; } sub import { my($class) = @_; return if $class ne __PACKAGE__; my $caller = caller; { no strict 'refs'; @{ "${caller}::ISA" } = __PACKAGE__ } my $meta = $caller->meta; my $has = sub { my($name, $default) = @_; $meta->add_property($name, $default); }; { no strict 'refs'; *{ "${caller}::has" } = $has } } my %meta; sub meta { my($class) = @_; $class = ref $class if ref $class; $meta{$class} ||= Alien::Build::PluginMeta->new( class => $class ); } package Alien::Build::PluginMeta; sub new { my($class, %args) = @_; my $self = bless { prop => {}, %args, }, $class; } sub default { my($self) = @_; $self->{default} || do { Carp::croak "No default for @{[ $self->{class} ]}"; }; } sub add_property { my($self, $name, $default) = @_; my $single = $name =~ s{^(\+)}{}; $self->{default} = $name if $single; $self->{prop}->{$name} = $default; my $accessor = sub { my($self, $new) = @_; $self->{$name} = $new if defined $new; $self->{$name}; }; # add the accessor { no strict 'refs'; *{ $self->{class} . '::' . $name} = $accessor } $self; } sub prop { shift->{prop}; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin - Plugin base class for Alien::Build =head1 VERSION version 2.84 =head1 SYNOPSIS Create your plugin: package Alien::Build::Plugin::Type::MyPlugin; use Alien::Build::Plugin; use Carp (); has prop1 => 'default value'; has prop2 => sub { 'default value' }; has prop3 => sub { Carp::croak 'prop3 is a required property' }; sub init { my($self, $meta) = @_; my $prop1 = $self->prop1; my $prop2 = $self->prop2; my $prop3 = $self->prop3; $meta->register_hook(sub { build => [ '%{make}', '%{make} install' ], }); } From your L use alienfile; plugin 'Type::MyPlugin' => ( prop2 => 'different value', prop3 => 'need to provide since it is required', ); =head1 DESCRIPTION This document describes the L plugin base class. For details on how to write a plugin, see L. Listed are some common types of plugins: =over 4 =item L Tools for building. =item L Tools already included. =item L Normally use Download plugins which will pick the correct Decode plugins. =item L Tools for checking cryptographic signatures during a C install. =item L Methods for retrieving from the internet. =item L Extract from archives that have been downloaded. =item L Normally use Download plugins which will pick the correct Fetch plugins. =item L Plugins that modify or enhance the gather step. =item L Plugins that work with C or libraries that provide the same functionality. =item L Normally use Download plugins which will pick the correct Prefer plugins. =item L Look for packages already installed on the system. =item L Plugins useful for unit testing L itself, or plugins for it. =back =head1 CONSTRUCTOR =head2 new my $plugin = Alien::Build::Plugin->new(%props); =head2 PROPERTIES =head2 instance_id my $id = $plugin->instance_id; Returns an instance id for the plugin. This is computed from the class and arguments that are passed into the plugin constructor, so technically two instances with the exact same arguments will have the same instance id, but in practice you should never have two instances with the exact same arguments. =head1 METHODS =head2 init $plugin->init($ab_class->meta); # $ab is an Alien::Build class name You provide the implementation for this. The intent is to register hooks and set meta properties on the L class. =head2 has has $prop_name; has $prop_name => $default; Specifies a property of the plugin. You may provide a default value as either a string scalar, or a code reference. The code reference will be called to compute the default value, and if you want the default to be a list or hash reference, this is how you want to do it: has foo => sub { [1,2,3] }; =head2 meta my $meta = $plugin->meta; Returns the plugin meta object. =head1 SEE ALSO L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/000755 000000 000000 00000000000 14710030646 017606 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Build.pod000644 000000 000000 00000004664 14710030646 021363 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Build # ABSTRACT: Build Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Build - Build Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS For autoconf: use alienfile; plugin 'Build::Autoconf'; for unixy (even on windows): use alienfile; plugin 'Build::MSYS'; =head1 DESCRIPTION Build plugins provide tools for building your package once it has been downloaded and extracted. =over 4 =item L For dealing with packages that are configured using autotools, or an autotools-like C script. =item L For dealing with packages that are configured and built using CMake. =item L For dealing with packages that do not require any build, and can just be copied into their final location. =item L For dealing with packages that require MSYS on Windows in order to build. This plugin is typically a no-op on other platforms. =item L For dealing with packages that require Make to build. Several flavors of Make are supported, including GNU Make and BSD Make. =item L Add other Ls as dependencies. =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Build/000755 000000 000000 00000000000 14710030646 020645 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Build/Autoconf.pm000644 000000 000000 00000022647 14710030646 022774 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Build::Autoconf; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use constant _win => $^O eq 'MSWin32'; use Path::Tiny (); use File::Temp (); # ABSTRACT: Autoconf plugin for Alien::Build our $VERSION = '2.84'; # VERSION has with_pic => 1; has ffi => 0; has msys_version => undef; has config_site => sub { my $config_site = "# file automatically generated by @{[ __FILE__ ]}\n"; $config_site .= ". $ENV{CONFIG_SITE}\n" if defined $ENV{CONFIG_SITE}; $config_site .= ". $ENV{ALIEN_BUILD_SITE_CONFIG}\n" if defined $ENV{ALIEN_BUILD_SITE_CONFIG}; # on some platforms autofools sorry I mean autotools likes to install into # exec_prefix/lib64 or even worse exec_prefix/lib/64 but that messes everything # else up so we try to nip that in the bud. $config_site .= "libdir='\${prefix}/lib'\n"; $config_site; }; sub init { my($self, $meta) = @_; $meta->apply_plugin('Build::MSYS', (defined $self->msys_version ? (msys_version => $self->msys_version) : ()), ); $meta->prop->{destdir} = 1; $meta->prop->{autoconf} = 1; my $intr = $meta->interpolator; my $set_autoconf_prefix = sub { my($build) = @_; my $prefix = $build->install_prop->{prefix}; die "Prefix is not set. Did you forget to run 'make alien_prefix'?" unless $prefix; if(_win) { $prefix = Path::Tiny->new($prefix)->stringify; $prefix =~ s!^([a-z]):!/$1!i if _win; } $build->install_prop->{autoconf_prefix} = $prefix; }; $meta->before_hook( build_ffi => $set_autoconf_prefix, ); # FFI mode undocumented for now... if($self->ffi) { $meta->add_requires('configure', 'Alien::Build::Plugin::Build::Autoconf' => '0.41'); $meta->default_hook( build_ffi => [ '%{configure} --enable-shared --disable-static --libdir=%{.install.autoconf_prefix}/dynamic', '%{make}', '%{make} install', ] ); if($^O eq 'MSWin32') { # for whatever reason autohell puts the .dll files in bin, even if you # point --bindir somewhere else. $meta->after_hook( build_ffi => sub { my($build) = @_; my $prefix = $build->install_prop->{autoconf_prefix}; my $bin = Path::Tiny->new($ENV{DESTDIR})->child($prefix)->child('bin'); my $lib = Path::Tiny->new($ENV{DESTDIR})->child($prefix)->child('dynamic'); if(-d $bin) { foreach my $from (grep { $_->basename =~ /.dll$/i } $bin->children) { $lib->mkpath; my $to = $lib->child($from->basename); $build->log("copy $from => $to"); $from->copy($to); } } } ); } } $meta->around_hook( build => sub { my $orig = shift; my $build = shift; $set_autoconf_prefix->($build); my $prefix = $build->install_prop->{autoconf_prefix}; die "Prefix is not set. Did you forget to run 'make alien_prefix'?" unless $prefix; local $ENV{CONFIG_SITE} = do { my $site_config = Path::Tiny->new(File::Temp::tempdir( CLEANUP => 1 ))->child('config.site'); $site_config->spew($self->config_site); "$site_config"; }; $intr->replace_helper( configure => sub { my $configure; if($build->meta_prop->{out_of_source}) { my $extract = $build->install_prop->{extract}; $configure = _win ? "sh $extract/configure" : "$extract/configure"; } else { $configure = _win ? 'sh ./configure' : './configure'; } $configure .= ' --prefix=' . $prefix; $configure .= ' --with-pic' if $self->with_pic; $configure; } ); my $ret = $orig->($build, @_); if(_win) { my $real_prefix = Path::Tiny->new($build->install_prop->{prefix}); my @pkgconf_dirs; push @pkgconf_dirs, Path::Tiny->new($ENV{DESTDIR})->child($prefix)->child("$_/pkgconfig") for qw(lib share); # for any pkg-config style .pc files that are dropped, we need # to convert the MSYS /C/Foo style paths to C:/Foo for my $pkgconf_dir (@pkgconf_dirs) { if(-d $pkgconf_dir) { foreach my $pc_file ($pkgconf_dir->children) { $pc_file->edit(sub {s/\Q$prefix\E/$real_prefix->stringify/eg;}); } } } } $ret; }, ); $intr->add_helper( configure => sub { my $configure = _win ? 'sh configure' : './configure'; $configure .= ' --with-pic' if $self->with_pic; $configure; }, ); $meta->default_hook( build => [ '%{configure} --disable-shared', '%{make}', '%{make} install', ] ); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Build::Autoconf - Autoconf plugin for Alien::Build =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Build::Autoconf'; =head1 DESCRIPTION This plugin provides some tools for building projects that use autoconf. The main thing this provides is a C helper, documented below and the default build stage, which is: '%{configure} --disable-shared', '%{make}', '%{make} install', On Windows, this plugin also pulls in the L which is required for autoconf style projects on windows. The other thing that this plugin does is that it does a double staged C install. The author has found this improves the overall reliability of L modules that are based on autoconf packages. This plugin supports out-of-source builds (known in autoconf terms as "VPATH" builds) via the meta property C. B: by itself, this plugin is only intended for use on packages that include a C script. For packages that expect you to use Autotools to generate a configure script before building, you can use L to generate the C script and use this plugin to run it. For more details see the documentation for L. =head1 PROPERTIES =head2 with_pic Adds C<--with-pic> option when running C. If supported by your package, it will generate position independent code on platforms that support it. This is required to XS modules, and generally what you want. autoconf normally ignores options that it does not understand, so it is usually a safe and reasonable default to include it. A small number of projects look like they use autoconf, but are really an autoconf style interface with a different implementation. They may fail if you try to provide it with options such as C<--with-pic> that they do not recognize. Such packages are the rationale for this property. =head2 msys_version The version of L required if it is deemed necessary. If L isn't needed (if running under Unix, or MSYS2, for example) this will do nothing. =head2 config_site The content for the generated C. =head1 HELPERS =head2 configure %{configure} The correct incantation to start an autoconf style C script on your platform. Some reasonable default flags will be provided. =head1 ENVIRONMENT =over 4 =item C For a share install, this plugin needs to alter the behavior of autotools using C. It does this by generating a C file on the fly, and setting the C environment variable. In the event that you already have your own C set, that file will be sourced from the generated one, so your local defaults should still be honored, unless it is one that needs to be changed for a share install. In particular, the C directory must be overridden, because on some platforms dynamic libraries will otherwise be placed in directories that L doesn't normally look in. Since the alienized package will be installed in a share directory, and not a system directory, that should be fine. =item C If defined, this file will be also be sourced in the generated C. This allows you to have local defaults for alien share installs only. =back =head1 SEE ALSO L, L, L, L, L L L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Build/CMake.pm000644 000000 000000 00000013335 14710030646 022170 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Build::CMake; use strict; use warnings; use 5.008004; use Config; use Alien::Build::Plugin; use Capture::Tiny qw( capture ); # ABSTRACT: CMake plugin for Alien::Build our $VERSION = '2.84'; # VERSION sub cmake_generator { if($^O eq 'MSWin32') { return 'MinGW Makefiles' if is_dmake(); { my($out, $err) = capture { system $Config{make}, '/?' }; return 'NMake Makefiles' if $out =~ /NMAKE/; } { my($out, $err) = capture { system $Config{make}, '--version' }; return 'MinGW Makefiles' if $out =~ /GNU Make/; } die 'make not detected'; } else { return 'Unix Makefiles'; } } sub init { my($self, $meta) = @_; $meta->prop->{destdir} = $^O eq 'MSWin32' ? 0 : 1; $meta->add_requires('configure' => 'Alien::Build::Plugin::Build::CMake' => '0.99'); $meta->add_requires('share' => 'Alien::cmake3' => '0.02'); if(is_dmake()) { # even on at least some older versions of strawberry that do not # use it, come with gmake in the PATH. So to save us the effort # of having to install Alien::gmake lets just use that version # if we can find it! my $found_gnu_make = 0; foreach my $exe (qw( gmake make mingw32-make )) { my($out, $err) = capture { system $exe, '--version' }; if($out =~ /GNU Make/) { $meta->interpolator->replace_helper('make' => sub { $exe }); $found_gnu_make = 1; last; } } if(!$found_gnu_make) { $meta->add_requires('share' => 'Alien::gmake' => '0.20'); $meta->interpolator->replace_helper('make' => sub { require Alien::gmake; Alien::gmake->exe }); } } $meta->interpolator->replace_helper('cmake' => sub { require Alien::cmake3; Alien::cmake3->exe }); $meta->interpolator->add_helper('cmake_generator' => \&cmake_generator); my @args = ( -G => '%{cmake_generator}', '-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true', '-DCMAKE_INSTALL_PREFIX:PATH=%{.install.prefix}', '-DCMAKE_INSTALL_LIBDIR:PATH=lib', '-DCMAKE_MAKE_PROGRAM:PATH=%{make}', ); $meta->prop->{plugin_build_cmake}->{args} = \@args; $meta->default_hook( build => [ ['%{cmake}', @args, '%{.install.extract}' ], ['%{make}' ], ['%{make}', 'install' ], ], ); # TODO: handle destdir on windows ?? } my $is_dmake; sub is_dmake { unless(defined $is_dmake) { if($^O eq 'MSWin32') { my($out, $err) = capture { system $Config{make}, '-V' }; $is_dmake = $out =~ /dmake/ ? 1 : 0; } else { $is_dmake = 0; } } $is_dmake; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Build::CMake - CMake plugin for Alien::Build =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { plugin 'Build::CMake'; build [ # this is the default build step, if you do not specify one. [ '%{cmake}', @{ meta->prop->{plugin_build_cmake}->{args} }, # ... put extra cmake args here ... '%{.install.extract}' ], '%{make}', '%{make} install', ]; }; =head1 DESCRIPTION This plugin helps build alienized projects that use C. The intention is to make this a core L plugin if/when it becomes stable enough. This plugin provides a meta property C which may change over time but for the moment includes: -G %{cmake_generator} \ -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true \ -DCMAKE_INSTALL_PREFIX:PATH=%{.install.prefix} \ -DCMAKE_INSTALL_LIBDIR:PATH=lib \ -DCMAKE_MAKE_PROGRAM:PATH=%{make} This plugin supports out-of-source builds via the meta property C. =head1 METHODS =head2 cmake_generator Returns the C generator according to your Perl's C. =head2 is_dmake Returns true if your Perls C appears to be C. =head1 HELPERS =head2 cmake This plugin replaces the default C helper with the one that comes from L. =head2 cmake_generator This is the appropriate C generator to use based on the make used by your Perl. This is frequently C. One place where it may be different is if your Windows Perl uses C, which comes with Visual C++. =head2 make This plugin I replace the default C helper if the default C is not supported by C. This is most often an issue with older versions of Strawberry Perl which used C. On Perls that use C, this plugin will search for GNU Make in the PATH, and if it can't be found will fallback on using L. =head1 SEE ALSO =over 4 =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Build/Copy.pm000644 000000 000000 00000007517 14710030646 022127 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Build::Copy; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Path::Tiny (); # ABSTRACT: Copy plugin for Alien::Build our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->add_requires( 'configure', __PACKAGE__, 0); if($^O eq 'MSWin32') { $meta->register_hook(build => sub { my($build) = @_; my $stage = Path::Tiny->new($build->install_prop->{stage})->canonpath; $build->system(qq{xcopy . "$stage" /E}); }); } elsif($^O eq 'darwin') { # On recent macOS -pPR is the same as -aR # on older Mac OS X (10.5 at least) -a is not supported but -pPR is. # Looks like -pPR should also work on coreutils if for some reason # someone is using coreutils on macOS, although there are semantic # differences between -pPR and -aR on coreutils, that may or may not be # important enough to care about. $meta->register_hook(build => [ 'cp -pPR * "%{.install.stage}"', ]); } else { # TODO: some platforms might not support -a # I think most platforms will support -r $meta->register_hook(build => [ 'cp -aR * "%{.install.stage}"', ]); } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Build::Copy - Copy plugin for Alien::Build =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Build::Copy'; =head1 DESCRIPTION This plugin copies all of the files from the source to the staging prefix. This is mainly useful for software packages that are provided as binary blobs. It works on both Unix and Windows using the appropriate commands for those platforms without having worry about the platform details in your L. If you want to filter add or remove files from what gets installed you can use a C hook. build { ... before 'build' => sub { # remove or modify files }; plugin 'Build::Copy'; ... }; Some packages might have binary blobs on some platforms and require build from source on others. In that situation you can use C statements with the appropriate logic in your L. configure { # normally the Build::Copy plugin will insert itself # as a config requires, but since it is only used # on some platforms, you will want to explicitly # require it in your alienfile in case you build your # alien dist on a platform that doesn't use it. requires 'Alien::Build::Plugin::Build::Copy'; }; build { ... if($^O eq 'linux') { start_url 'http://example.com/binary-blob-linux.tar.gz'; plugin 'Download'; plugin 'Extract' => 'tar.gz'; plugin 'Build::Copy'; } else { start_url 'http://example.com/source.tar.gz'; plugin 'Download'; plugin 'Extract' => 'tar.gz'; plugin 'Build::Autoconf'; } }; =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Build/MSYS.pm000644 000000 000000 00000007323 14710030646 022003 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Build::MSYS; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::Which (); use Env qw( @PATH ); # ABSTRACT: MSYS plugin for Alien::Build our $VERSION = '2.84'; # VERSION has msys_version => '0.07'; sub init { my($self, $meta) = @_; if($self->msys_version ne '0.07') { $meta->add_requires('configure' => 'Alien::Build::Plugin::Build::MSYS' => '0.84'); } if(_win_and_needs_msys($meta)) { $meta->add_requires('share' => 'Alien::MSYS' => $self->msys_version); $meta->around_hook( $_ => sub { my $orig = shift; my $build = shift; local $ENV{PATH} = $ENV{PATH}; unshift @PATH, Alien::MSYS::msys_path(); $orig->($build, @_); }, ) for qw( build build_ffi test_share test_ffi ); } if($^O eq 'MSWin32') { # Most likely if we are trying to build something unix-y and # we are using MSYS, then we want to use the make that comes # with MSYS. $meta->interpolator->replace_helper( make => sub { 'make' }, ); } $self; } sub _win_and_needs_msys { my($meta) = @_; # check to see if we are running on windows. # if we are running on windows, check to see if # it is MSYS2, then we can just use that. Otherwise # we are probably on Strawberry, or (less likely) # VC Perl, in which case we will still need Alien::MSYS return 0 unless $^O eq 'MSWin32'; return 0 if $meta->prop->{platform}->{system_type} eq 'windows-mingw'; return 1; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Build::MSYS - MSYS plugin for Alien::Build =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Build::MSYS'; =head1 DESCRIPTION This plugin sets up the MSYS environment for your build on Windows. It does not do anything on non-windows platforms. MSYS provides the essential tools for building software that is normally expected in a UNIX or POSIX environment. This like C, C and C. To provide MSYS, this plugin uses L. =head1 PROPERTIES =head2 msys_version The version of L required if it is deemed necessary. If L isn't needed (if running under Unix, or MSYS2, for example) this will do nothing. =head1 HELPERS =head2 make %{make} On windows the default C<%{make}> helper is replace with the make that comes with L. This is almost certainly what you want, as most unix style make projects will not build with C or C typically used by Perl on Windows. =head1 SEE ALSO L, L, L, L, L L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Build/Make.pm000644 000000 000000 00000010233 14710030646 022057 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Build::Make; use strict; use warnings; use 5.008004; use Carp (); use Capture::Tiny qw( capture ); use Alien::Build::Plugin; # ABSTRACT: Make plugin for Alien::Build our $VERSION = '2.84'; # VERSION has '+make_type' => undef; sub init { my($self, $meta) = @_; $meta->add_requires('configure', 'Alien::Build::Plugin::Build::Make', '0.99'); my $type = $self->make_type; return unless defined $type; $type = 'gmake' if $^O eq 'MSWin32' && $type eq 'umake'; if($type eq 'nmake') { $meta->interpolator->replace_helper( make => sub { 'nmake' } ); } elsif($type eq 'dmake') { $meta->interpolator->replace_helper( make => sub { 'dmake' } ); } elsif($type eq 'gmake') { my $found = 0; foreach my $make (qw( gmake make mingw32-make )) { my($out, $err) = capture { system $make, '--version' }; if($out =~ /GNU Make/) { $meta->interpolator->replace_helper( make => sub { $make } ); $found = 1; } } unless($found) { $meta->add_requires('share' => 'Alien::gmake' => '0.20'); $meta->interpolator->replace_helper('make' => sub { require Alien::gmake; Alien::gmake->exe }); } } elsif($type eq 'umake') { # nothing } else { Carp::croak("unknown make type = ", $self->make_type); } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Build::Make - Make plugin for Alien::Build =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; # For a recipe that requires GNU Make plugin 'Build::Make' => 'gmake'; =head1 DESCRIPTION By default L provides a helper for the C that is used by Perl and L itself. This is handy, because it is the one make that you can mostly guarantee that you will have. Unfortunately it may be a C that isn't supported by the library or tool that you are trying to alienize. This is mostly a problem on Windows, where the supported Cs for years were Microsoft's C and Sun's C, which many open source projects do not use. This plugin will alter the L recipe to use a different C. It may (as in the case of C / L) automatically download and install an alienized version of that C if it is not already installed. This plugin should NOT be used with other plugins that replace the C helper, like L, L, L. This plugin is intended instead for projects that use vanilla makefiles of a specific type. This plugin is for now distributed separately from L, but the intention is for it to soon become a core plugin for L. =head1 PROPERTIES =head2 make_type The make type needed by the L recipe: =over 4 =item dmake Sun's dmake. =item gmake GNU Make. =item nmake Microsoft's nmake. It comes with Visual C++. =item umake Any UNIX C Usually either BSD or GNU Make. =back =head1 HELPERS =head2 make %{make} This plugin may change the make helper used by your L recipe. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Build/SearchDep.pm000644 000000 000000 00000012556 14710030646 023052 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Build::SearchDep; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Text::ParseWords qw( shellwords ); # ABSTRACT: Add dependencies to library and header search path our $VERSION = '2.84'; # VERSION has aliens => {}; has public_I => 0; has public_l => 0; sub init { my($self, $meta) = @_; $meta->add_requires('configure' => 'Alien::Build::Plugin::Build::SearchDep' => '0.35'); $meta->add_requires('share' => 'Env::ShellWords' => 0.01); if($self->public_I || $self->public_l) { $meta->add_requires('configure' => 'Alien::Build::Plugin::Build::SearchDep' => '0.53'); } my @aliens; if(ref($self->aliens) eq 'HASH') { @aliens = keys %{ $self->aliens }; $meta->add_requires('share' => $_ => $self->aliens->{$_}) for @aliens; } else { @aliens = ref $self->aliens ? @{ $self->aliens } : ($self->aliens); $meta->add_requires('share' => $_ => 0) for @aliens; } $meta->around_hook( build => sub { my($orig, $build) = @_; local $ENV{CFLAGS} = $ENV{CFLAGS}; local $ENV{CXXFLAGS} = $ENV{CXXFLAGS}; local $ENV{LDFLAGS} = $ENV{LDFLAGS}; tie my @CFLAGS, 'Env::ShellWords', 'CFLAGS'; tie my @CXXFLAGS, 'Env::ShellWords', 'CXXFLAGS'; tie my @LDFLAGS, 'Env::ShellWords', 'LDFLAGS'; my $cflags = $build->install_prop->{plugin_build_searchdep_cflags} = []; my $ldflags = $build->install_prop->{plugin_build_searchdep_ldflags} = []; my $libs = $build->install_prop->{plugin_build_searchdep_libs} = []; foreach my $other (@aliens) { my $other_cflags; my $other_libs; if($other->install_type('share')) { $other_cflags = $other->cflags_static; $other_libs = $other->libs_static; } else { $other_cflags = $other->cflags; $other_libs = $other->libs; } unshift @$cflags, grep /^-I/, shellwords($other_cflags); unshift @$ldflags, grep /^-L/, shellwords($other_libs); unshift @$libs, grep /^-l/, shellwords($other_libs); } unshift @CFLAGS, @$cflags; unshift @CXXFLAGS, @$cflags; unshift @LDFLAGS, @$ldflags; $orig->($build); }, ); $meta->after_hook( gather_share => sub { my($build) = @_; $build->runtime_prop->{libs} = '' unless defined $build->runtime_prop->{libs}; $build->runtime_prop->{libs_static} = '' unless defined $build->runtime_prop->{libs_static}; if($self->public_l) { $build->runtime_prop->{$_} = join(' ', _space_escape(@{ $build->install_prop->{plugin_build_searchdep_libs} })) . ' ' . $build->runtime_prop->{$_} for qw( libs libs_static ); } $build->runtime_prop->{$_} = join(' ', _space_escape(@{ $build->install_prop->{plugin_build_searchdep_ldflags} })) . ' ' . $build->runtime_prop->{$_} for qw( libs libs_static ); if($self->public_I) { $build->runtime_prop->{cflags} = '' unless defined $build->runtime_prop->{cflags}; $build->runtime_prop->{cflags_static} = '' unless defined $build->runtime_prop->{cflags_static}; $build->runtime_prop->{$_} = join(' ', _space_escape(@{ $build->install_prop->{plugin_build_searchdep_cflags} })) . ' ' . $build->runtime_prop->{$_} for qw( cflags cflags_static ); } }, ); } sub _space_escape { map { my $str = $_; $str =~ s{(\s)}{\\$1}g; $str; } @_; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Build::SearchDep - Add dependencies to library and header search path =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Build::SearchDep' => ( aliens => [qw( Alien::Foo Alien::Bar )], ); =head1 DESCRIPTION This plugin adds the other aliens as prerequisites, and adds their header and library search path to C and C environment variable, so that tools that use them (like autoconf) can pick them up. =head1 PROPERTIES =head2 aliens Either a list reference or hash reference of the other aliens. If a hash reference then the keys are the class names and the values are the versions of those classes. =head2 public_I Include the C<-I> flags when setting the runtime cflags property. =head2 public_l Include the C<-l> flags when setting the runtime libs property. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Core.pod000644 000000 000000 00000004202 14710030646 021200 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Core # ABSTRACT: Core Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Core - Core Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; # core plugins are already loaded =head1 DESCRIPTION Core plugins are special plugins that are always loaded, usually first. =over 4 =item L =item L This contains the default machinery for downloading packages, if no other download plugin or commands are provided. =item L =item L =item L Add interoperability with L =item L The machinery which allows you to override the type of install with the C environment variable. =item L =item L =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Core/000755 000000 000000 00000000000 14710030646 020476 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Core/CleanInstall.pm000644 000000 000000 00000004262 14710030646 023411 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Core::CleanInstall; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Path::Tiny (); # ABSTRACT: Implementation for clean_install hook. our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->default_hook( clean_install => sub { my($build) = @_; my $root = Path::Tiny->new( $build->runtime_prop->{prefix} ); if(-d $root) { foreach my $child ($root->children) { if($child->basename eq '_alien') { $build->log("keeping $child"); } else { $build->log("removing $child"); $child->remove_tree({ safe => 0}); } } } } ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Core::CleanInstall - Implementation for clean_install hook. =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; # already loaded =head1 DESCRIPTION This plugin implements the default C hook. You shouldn't use it directly. =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Core/Download.pm000644 000000 000000 00000012676 14710030646 022617 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Core::Download; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Path::Tiny (); use Alien::Build::Util qw( _mirror ); # ABSTRACT: Core download plugin our $VERSION = '2.84'; # VERSION sub _hook { my($build) = @_; my $res = $build->fetch; if($res->{type} =~ /^(?:html|dir_listing)$/) { my $type = $res->{type}; $type =~ s/_/ /; $build->log("decoding $type"); $res = $build->decode($res); } if($res->{type} eq 'list') { my $orig = $res; $res = $build->prefer($res); my @exclude; if($build->meta->prop->{start_url} =~ /^https:/) { @{ $res->{list} } = grep { $_->{url} =~ /https:/ ? 1 : do { push @exclude, $_->{url}; 0; } } @{ $res->{list} }; } if(@{ $res->{list} } == 0) { my @excluded = map { $_->{url} } @{ $orig->{list} }; if(@excluded) { if(@excluded > 15) { splice @excluded , 14; push @excluded, '...'; } $build->log("These files were excluded by the filter stage:"); $build->log("excluded $_") for @excluded; } else { $build->log("No files found prior to the filter stage"); } die "no matching files in listing"; } my $version = $res->{list}->[0]->{version}; my($pick, @other) = map { $_->{url} } @{ $res->{list} }; if(@other > 8) { splice @other, 7; push @other, '...'; } $build->log("candidate *$pick"); $build->log("candidate $_") for @other; if(@exclude) { if(@exclude > 8) { splice @exclude, 7; push @exclude, '...'; } $build->log("excluded insecure URLs:"); $build->log($_) for @exclude; } $res = $build->fetch($pick); if($version) { $version =~ s/\.+$//; $build->log("setting version based on archive to $version"); $build->runtime_prop->{version} = $version; } } if($res->{type} eq 'file') { my $alienfile = $res->{filename}; $build->log("downloaded $alienfile"); if($res->{content}) { my $tmp = Alien::Build::TempDir->new($build, "download"); my $path = Path::Tiny->new("$tmp/$alienfile"); $path->spew_raw($res->{content}); $build->install_prop->{download} = $path->stringify; $build->install_prop->{complete}->{download} = 1; $build->install_prop->{download_detail}->{"$path"}->{protocol} = $res->{protocol} if defined $res->{protocol}; return $build; } elsif($res->{path}) { if(defined $res->{tmp} && !$res->{tmp}) { if(-e $res->{path}) { $build->install_prop->{download} = $res->{path}; $build->install_prop->{complete}->{download} = 1; $build->install_prop->{download_detail}->{$res->{path}}->{protocol} = $res->{protocol} if defined $res->{protocol}; } else { die "not a file or directory: @{[ $res->{path} ]}"; } } else { my $from = Path::Tiny->new($res->{path}); my $tmp = Alien::Build::TempDir->new($build, "download"); my $to = Path::Tiny->new("$tmp/@{[ $from->basename ]}"); if(-d $res->{path}) { # Please note: _mirror and Alien::Build::Util are ONLY # allowed to be used by core plugins. If you are writing # a non-core plugin it may be removed. That is why it # is private. _mirror $from, $to; } else { require File::Copy; File::Copy::copy( "$from" => "$to", ) || die "copy $from => $to failed: $!"; } $build->install_prop->{download} = $to->stringify; $build->install_prop->{complete}->{download} = 1; $build->install_prop->{download_detail}->{"$to"}->{protocol} = $res->{protocol} if defined $res->{protocol}; } return $build; } die "file without content or path"; } die "unknown fetch response type: @{[ $res->{type} ]}"; } sub init { my($self, $meta) = @_; $meta->default_hook(download => \&_hook); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Core::Download - Core download plugin =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; # already loaded =head1 DESCRIPTION This plugin does some core download logic. =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Core/FFI.pm000644 000000 000000 00000003353 14710030646 021444 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Core::FFI; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; # ABSTRACT: Core FFI plugin our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->default_hook( $_ => sub {}, ) for qw( build_ffi gather_ffi ); $meta->prop->{destdir_ffi_filter} = '^dynamic'; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Core::FFI - Core FFI plugin =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; # already loaded =head1 DESCRIPTION This plugin helps make the build_ffi work. You should not need to interact with it directly. =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Core/Gather.pm000644 000000 000000 00000012642 14710030646 022253 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Core::Gather; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Env qw( @PATH @PKG_CONFIG_PATH ); use Path::Tiny (); use File::chdir; use Alien::Build::Util qw( _mirror _destdir_prefix ); use JSON::PP (); # ABSTRACT: Core gather plugin our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->default_hook( $_ => sub {}, ) for qw( gather_system gather_share ); $meta->around_hook( gather_share => sub { my($orig, $build) = @_; local $ENV{PATH} = $ENV{PATH}; local $ENV{PKG_CONFIG_PATH} = $ENV{PKG_CONFIG_PATH}; unshift @PATH, Path::Tiny->new('bin')->absolute->stringify if -d 'bin'; for my $dir (qw(share lib)) { unshift @PKG_CONFIG_PATH, Path::Tiny->new("$dir/pkgconfig")->absolute->stringify if -d "$dir/pkgconfig"; } $orig->($build) } ); foreach my $type (qw( share ffi )) { $meta->around_hook( "gather_$type" => sub { my($orig, $build) = @_; if($build->meta_prop->{destdir}) { my $destdir = $ENV{DESTDIR}; if(-d $destdir) { my $src = Path::Tiny->new(_destdir_prefix($ENV{DESTDIR}, $build->install_prop->{prefix})); my $dst = Path::Tiny->new($build->install_prop->{stage}); my $res = do { local $CWD = "$src"; $orig->($build); }; $build->log("mirror $src => $dst"); $dst->mkpath; # Please note: _mirror and Alien::Build::Util are ONLY # allowed to be used by core plugins. If you are writing # a non-core plugin it may be removed. That is why it # is private. _mirror("$src", "$dst", { verbose => 1, filter => $build->meta_prop->{$type eq 'share' ? 'destdir_filter' : 'destdir_ffi_filter'}, }); return $res; } else { die "nothing was installed into destdir" if $type eq 'share'; } } else { local $CWD = $build->install_prop->{stage}; my $ret = $orig->($build); # if we are not doing a double staged install we want to substitute the install # prefix with the runtime prefix. my $old = $build->install_prop->{prefix}; my $new = $build->runtime_prop->{prefix}; foreach my $flag (qw( cflags cflags_static libs libs_static )) { next unless defined $build->runtime_prop->{$flag}; $build->runtime_prop->{$flag} =~ s{(-I|-L|-LIBPATH:)\Q$old\E}{$1 . $new}eg; } return $ret; } } ); } $meta->after_hook( $_ => sub { my($build) = @_; die "stage is not defined. be sure to call set_stage on your Alien::Build instance" unless $build->install_prop->{stage}; my $stage = Path::Tiny->new($build->install_prop->{stage}); $build->log("mkdir -p $stage/_alien"); $stage->child('_alien')->mkpath; # drop a alien.json file for the runtime properties $stage->child('_alien/alien.json')->spew( JSON::PP->new->pretty->canonical(1)->ascii->encode($build->runtime_prop) ); # copy the alienfile, if we managed to keep it around. if($build->meta->filename && -r $build->meta->filename && $build->meta->filename !~ /\.(pm|pl)$/ && ! -d $build->meta->filename) { Path::Tiny->new($build->meta->filename) ->copy($stage->child('_alien/alienfile')); } if($build->install_prop->{patch} && -d $build->install_prop->{patch}) { # Please note: _mirror and Alien::Build::Util are ONLY # allowed to be used by core plugins. If you are writing # a non-core plugin it may be removed. That is why it # is private. _mirror($build->install_prop->{patch}, $stage->child('_alien/patch')->stringify); } }, ) for qw( gather_share gather_system ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Core::Gather - Core gather plugin =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; # already loaded =head1 DESCRIPTION This plugin helps make the gather stage work. =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Core/Legacy.pm000644 000000 000000 00000004724 14710030646 022247 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Core::Legacy; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; # ABSTRACT: Core Alien::Build plugin to maintain compatibility with legacy Alien::Base our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->after_hook( $_ => sub { my($build) = @_; $build->log("adding legacy hash to config"); my $runtime = $build->runtime_prop; if($runtime->{cflags} && ! defined $runtime->{cflags_static}) { $runtime->{cflags_static} = $runtime->{cflags}; } if($runtime->{libs} && ! defined $runtime->{libs_static}) { $runtime->{libs_static} = $runtime->{libs}; } $runtime->{legacy}->{finished_installing} = 1; $runtime->{legacy}->{install_type} = $runtime->{install_type}; $runtime->{legacy}->{version} = $runtime->{version}; $runtime->{legacy}->{original_prefix} = $runtime->{prefix}; } ) for qw( gather_system gather_share ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Core::Legacy - Core Alien::Build plugin to maintain compatibility with legacy Alien::Base =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; # already loaded =head1 DESCRIPTION This plugin provides some compatibility with the legacy L interfaces. =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Core/Override.pm000644 000000 000000 00000003344 14710030646 022617 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Core::Override; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; # ABSTRACT: Core override plugin our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->default_hook( override => sub { my($build) = @_; return $ENV{ALIEN_INSTALL_TYPE} || ''; }, ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Core::Override - Core override plugin =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; # already loaded =head1 DESCRIPTION This plugin implements the C environment variable. =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Core/Setup.pm000644 000000 000000 00000016525 14710030646 022145 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Core::Setup; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Config; use File::Which qw( which ); # ABSTRACT: Core setup plugin our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->prop->{platform} ||= {}; $self->_platform($meta->prop->{platform}); } sub _platform { my(undef, $hash) = @_; if($^O eq 'MSWin32' && $Config{ccname} eq 'cl') { $hash->{compiler_type} = 'microsoft'; } else { $hash->{compiler_type} = 'unix'; } if($^O eq 'MSWin32') { $hash->{system_type} = 'windows-unknown'; if(defined &Win32::BuildNumber) { $hash->{system_type} = 'windows-activestate'; } elsif($Config{myuname} =~ /strawberry-perl/) { $hash->{system_type} = 'windows-strawberry'; } elsif($hash->{compiler_type} eq 'microsoft') { $hash->{system_type} = 'windows-microsoft'; } else { my $uname_exe = which('uname'); if($uname_exe) { my $uname = `$uname_exe`; if($uname =~ /^(MINGW)(32|64)_NT/) { $hash->{system_type} = 'windows-' . lc $1; } } } } elsif($^O =~ /^(VMS)$/) { # others probably belong in here... $hash->{system_type} = lc $^O; } else { $hash->{system_type} = 'unix'; } $hash->{cpu}{count} = exists $ENV{ALIEN_CPU_COUNT} && $ENV{ALIEN_CPU_COUNT} > 0 ? $ENV{ALIEN_CPU_COUNT} : _cpu_count(); $hash->{cpu}{arch} = _cpu_arch(\%Config); } # Retrieve number of available CPU cores. Adopted from # # which is in turn adopted from Test::Smoke::Util with improvements. sub _cpu_count { local $ENV{PATH} = $ENV{PATH}; if( $^O ne 'MSWin32' ) { $ENV{PATH} = "/usr/sbin:/sbin:/usr/bin:/bin:$ENV{PATH}"; } $ENV{PATH} =~ /(.*)/; $ENV{PATH} = $1; ## Remove tainted'ness my $ncpu = 1; OS_CHECK: { local $_ = lc $^O; /linux/ && do { my ( $count, $fh ); if ( open $fh, '<', '/proc/stat' ) { $count = grep { /^cpu\d/ } <$fh>; close $fh; } $ncpu = $count if $count; last OS_CHECK; }; /bsd|darwin|dragonfly/ && do { chomp( my @output = `sysctl -n hw.ncpu 2>/dev/null` ); $ncpu = $output[0] if @output; last OS_CHECK; }; /aix/ && do { my @output = `lparstat -i 2>/dev/null | grep "^Online Virtual CPUs"`; if ( @output ) { $output[0] =~ /(\d+)\n$/; $ncpu = $1 if $1; } if ( !$ncpu ) { @output = `pmcycles -m 2>/dev/null`; if ( @output ) { $ncpu = scalar @output; } else { @output = `lsdev -Cc processor -S Available 2>/dev/null`; $ncpu = scalar @output if @output; } } last OS_CHECK; }; /gnu/ && do { chomp( my @output = `nproc 2>/dev/null` ); $ncpu = $output[0] if @output; last OS_CHECK; }; /haiku/ && do { my @output = `sysinfo -cpu 2>/dev/null | grep "^CPU #"`; $ncpu = scalar @output if @output; last OS_CHECK; }; /hp-?ux/ && do { my $count = grep { /^processor/ } `ioscan -fkC processor 2>/dev/null`; $ncpu = $count if $count; last OS_CHECK; }; /irix/ && do { my @out = grep { /\s+processors?$/i } `hinv -c processor 2>/dev/null`; $ncpu = (split ' ', $out[0])[0] if @out; last OS_CHECK; }; /osf|solaris|sunos|svr5|sco/ && do { if (-x '/usr/sbin/psrinfo') { my $count = grep { /on-?line/ } `psrinfo 2>/dev/null`; $ncpu = $count if $count; } else { my @output = grep { /^NumCPU = \d+/ } `uname -X 2>/dev/null`; $ncpu = (split ' ', $output[0])[2] if @output; } last OS_CHECK; }; /mswin|mingw|msys|cygwin/ && do { if (exists $ENV{NUMBER_OF_PROCESSORS}) { $ncpu = $ENV{NUMBER_OF_PROCESSORS}; } last OS_CHECK; }; warn "CPU count: unknown operating system"; } $ncpu = 1 if (!$ncpu || $ncpu < 1); $ncpu; } sub _cpu_arch { my ($my_config) = @_; my $arch = {}; my %Config = %$my_config; die "Config missing archname" unless exists $Config{archname}; die "Config missing ptrsize" unless exists $Config{ptrsize}; if( $Config{archname} =~ m/ \b x64 \b # MSWin32-x64 | \b x86_64 \b # x86_64-linux | \b amd64 \b # amd64-freebsd /ix) { $arch = { name => 'x86_64' }; } elsif( $Config{archname} =~ m/ \b x86 \b # MSWin32-x86 | \b i386 \b # freebsd-i386 | \b i486 \b # i486-linux | \b i686 \b # i686-cygwin /ix ) { $arch = { name => 'x86' }; } elsif( $Config{archname} =~ m/ \b darwin \b /ix ) { chomp( my $hw_machine = `sysctl -n hw.machine 2>/dev/null` ); HW_MACHINE: for($hw_machine) { $_ eq 'arm64' && do { $arch = { name => 'aarch64' }; last HW_MACHINE; }; $_ eq 'x86_64' && do { $arch = { name => $Config{ptrsize} == 8 ? 'x86_64' : 'x86' }; last HW_MACHINE; }; $_ eq 'i386' && do { $arch = { name => 'x86' }; last HW_MACHINE; }; $_ eq 'Power Macintosh' && do { $arch = { name => $Config{ptrsize} == 8 ? 'ppc64' : 'ppc' }; last HW_MACHINE; }; warn "Architecture detection: unknown macOS arch hw.machine = $_, ptrsize = $Config{ptrsize}"; $arch = { name => 'unknown' }; } } elsif( $Config{archname} =~ / \b aarch64 \b | \b arm64 \b # arm64-freebsd (FreeBSD can have either aarch64 or arm64) /ix ) { $arch = { name => 'aarch64' }; # ARM64 } elsif( $Config{archname} =~ m/ \b arm-linux-gnueabi \b /ix ) { # 32-bit ARM soft-float $arch = { name => 'armel' }; } elsif( $Config{archname} =~ m/ \b arm-linux-gnueabihf \b /ix ) { # 32-bit ARM hard-float $arch = { name => 'armhf' }; } unless(exists $arch->{name}) { warn "Architecture detection: Unknown archname '$Config{archname}'."; $arch->{name} = 'unknown'; } return $arch; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Core::Setup - Core setup plugin =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; # already loaded =head1 DESCRIPTION This plugin does some core setup for you. =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Core/Tail.pm000644 000000 000000 00000003270 14710030646 021727 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Core::Tail; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; # ABSTRACT: Core tail setup plugin our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; if($meta->prop->{out_of_source}) { $meta->add_requires('configure' => 'Alien::Build' => '1.08'); } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Core::Tail - Core tail setup plugin =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; # already loaded =head1 DESCRIPTION This plugin does some core tail setup for you. =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Decode.pod000644 000000 000000 00000004771 14710030646 021506 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Decode # ABSTRACT: Decode Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Decode - Decode Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Decode::HTML'; plugin 'Decode::DirListing'; =head1 DESCRIPTION Decode plugins decode HTML and FTP file listings. Normally you will want to use the L plugin which will automatically load the appropriate Decode plugins. =over 4 =item L Default decoder for FTP file listings, that uses the pure-perl L. =item L Another decoder for FTP file listings, that uses the XS module L. =item L Older decoder for HTML file listings, which uses the XS module L. This used to be the default decoder until L version 1.75. In some cases, this will be used as the HTML decoder if you configure with L prior to 1.75 and but upgrade to a more recent version for the build stage of your L =item L Newer decoder for HTML file listings, which uses the pure-perl L or L. This became the default decoder at L version 1.75. =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Decode/000755 000000 000000 00000000000 14710030646 020771 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Decode/DirListing.pm000644 000000 000000 00000005547 14710030646 023412 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Decode::DirListing; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::Basename (); # ABSTRACT: Plugin to extract links from a directory listing our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->add_requires('share' => 'File::Listing' => 0); $meta->add_requires('share' => 'URI' => 0); $meta->register_hook( decode => sub { my(undef, $res) = @_; die "do not know how to decode @{[ $res->{type} ]}" unless $res->{type} eq 'dir_listing'; my $base = URI->new($res->{base}); return { type => 'list', list => [ map { my($name) = @$_; my $basename = $name; $basename =~ s{/$}{}; my %h = ( filename => File::Basename::basename($basename), url => URI->new_abs($name, $base)->as_string, ); \%h; } File::Listing::parse_dir($res->{content}) ], }; }); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Decode::DirListing - Plugin to extract links from a directory listing =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Decode::DirListing'; =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate decode plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This plugin decodes a ftp file listing into a list of candidates for your Prefer plugin. It is useful when fetching from an FTP server via L. =head1 SEE ALSO L, L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Decode/DirListingFtpcopy.pm000644 000000 000000 00000006433 14710030646 024752 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Decode::DirListingFtpcopy; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::Basename (); # ABSTRACT: Plugin to extract links from a directory listing using ftpcopy our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->add_requires('share' => 'File::Listing::Ftpcopy' => 0); $meta->add_requires('share' => 'URI' => 0); $meta->register_hook( decode => sub { my(undef, $res) = @_; die "do not know how to decode @{[ $res->{type} ]}" unless $res->{type} eq 'dir_listing'; my $base = URI->new($res->{base}); return { type => 'list', list => [ map { my($name) = @$_; my $basename = $name; $basename =~ s{/$}{}; my %h = ( filename => File::Basename::basename($basename), url => URI->new_abs($name, $base)->as_string, ); \%h; } File::Listing::Ftpcopy::parse_dir($res->{content}) ], }; }); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Decode::DirListingFtpcopy - Plugin to extract links from a directory listing using ftpcopy =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Decode::DirListingFtpcopy'; =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate decode plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This plugin decodes a ftp file listing into a list of candidates for your Prefer plugin. It is useful when fetching from an FTP server via L. It is different from the similarly named L in that it uses L instead of L. The rationale for the C version is that it supports a different set of FTP servers, including OpenVMS. In most cases, however, you probably want to use the non C version since it is pure perl. =head1 SEE ALSO L, L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Decode/HTML.pm000644 000000 000000 00000006063 14710030646 022100 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Decode::HTML; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::Basename (); # ABSTRACT: Plugin to extract links from HTML our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->add_requires('share' => 'HTML::LinkExtor' => 0); $meta->add_requires('share' => 'URI' => 0); $meta->add_requires('share' => 'URI::Escape' => 0); $meta->register_hook( decode => sub { my(undef, $res) = @_; die "do not know how to decode @{[ $res->{type} ]}" unless $res->{type} eq 'html'; my $base = URI->new($res->{base}); my @list; my $p = HTML::LinkExtor->new(sub { my($tag, %links) = @_; if($tag eq 'base' && $links{href}) { $base = URI->new($links{href}); } elsif($tag eq 'a' && $links{href}) { my $href = $links{href}; return if $href =~ m!^\.\.?/?$!; my $url = URI->new_abs($href, $base); my $path = $url->path; $path =~ s{/$}{}; # work around for Perl 5.8.7- gh#8 push @list, { filename => URI::Escape::uri_unescape(File::Basename::basename($path)), url => URI::Escape::uri_unescape($url->as_string), }; } }); $p->parse($res->{content}); return { type => 'list', list => \@list, }; }); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Decode::HTML - Plugin to extract links from HTML =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Decode::HTML'; =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate decode plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This plugin decodes an HTML file listing into a list of candidates for your Prefer plugin. =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Decode/Mojo.pm000644 000000 000000 00000010440 14710030646 022232 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Decode::Mojo; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; # ABSTRACT: Plugin to extract links from HTML using Mojo::DOM or Mojo::DOM58 our $VERSION = '2.84'; # VERSION sub _load ($;$) { my($class, $version) = @_; my $pm = "$class.pm"; $pm =~ s/::/\//g; eval { require $pm }; return 0 if $@; if(defined $version) { eval { $class->VERSION($version) }; return 0 if $@; } return 1; } has _class => sub { return 'Mojo::DOM58' if _load 'Mojo::DOM58'; return 'Mojo::DOM' if _load 'Mojo::DOM' and _load 'Mojolicious', 7.00; return 'Mojo::DOM58'; }; sub init { my($self, $meta) = @_; $meta->add_requires('share' => 'URI' => 0); $meta->add_requires('share' => 'URI::Escape' => 0); my $class = $meta->prop->{plugin_decode_mojo_class} ||= $self->_class; if($class eq 'Mojo::DOM58') { $meta->add_requires('share' => 'Mojo::DOM58' => '1.00'); } elsif($class eq 'Mojo::DOM') { $meta->add_requires('share' => 'Mojolicious' => '7.00'); $meta->add_requires('share' => 'Mojo::DOM' => '0'); } else { die "bad class"; } $meta->register_hook( decode => sub { my(undef, $res) = @_; die "do not know how to decode @{[ $res->{type} ]}" unless $res->{type} eq 'html'; my $dom = $class->new($res->{content}); my $base = URI->new($res->{base}); if(my $base_element = $dom->find('head base')->first) { my $href = $base_element->attr('href'); $base = URI->new($href) if defined $href; } my @list = map { my $url = URI->new_abs($_, $base); my $path = $url->path; $path =~ s{/$}{}; # work around for Perl 5.8.7- gh#8 { filename => URI::Escape::uri_unescape(File::Basename::basename($path)), url => URI::Escape::uri_unescape($url->as_string), } } grep !/^\.\.?\/?$/, map { $_->attr('href') || () } @{ $dom->find('a')->to_array }; return { type => 'list', list => \@list, }; }) } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Decode::Mojo - Plugin to extract links from HTML using Mojo::DOM or Mojo::DOM58 =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Decode::Mojo'; Force using C via the download negotiator: use alienfile 1.68; configure { requires 'Alien::Build::Plugin::Decode::Mojo'; }; plugin 'Download' => ( ... decoder => 'Decode::Mojo', ); =head1 DESCRIPTION Note: in most cases you will want to use L instead. It picks the appropriate decode plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This plugin decodes an HTML file listing into a list of candidates for your Prefer plugin. It works just like L except it uses either L or L to do its job. This plugin is much lighter than The C plugin, and doesn't require XS. It is the default decode plugin used by L if it detects that you need to parse an HTML index. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Digest.pod000644 000000 000000 00000004273 14710030646 021537 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Digest # ABSTRACT: Fetch Alien::Digest plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Digest - Fetch Alien::Digest plugins =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'http://ftp.gnu.org/gnu/make/make-3.75.tar.gz'; plugin 'Digest' => [ SHA256 => '2bc876304905aee78abf0f7163ba55a2efcec803034f75c75d1b94650c36aba7'; plugin 'Download'; }; =head1 DESCRIPTION Digest plugins checks the cryptographic signatures of downloaded files. Typically you will probably want to use SHA256 via the L. =over 4 =item L Negotiate the most appropriate plugin to calculate digest. =item L Use the XS based L for computing SHA digests. This is the default since L comes with recent versions of Perl. =item L Use the pure-perl based L for computing SHA digests. =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Digest/000755 000000 000000 00000000000 14710030646 021025 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Digest/Negotiate.pm000644 000000 000000 00000007451 14710030646 023311 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Digest::Negotiate; use strict; use warnings; use Alien::Build::Plugin; # ABSTRACT: Plugin negotiator for cryptographic signatures our $VERSION = '2.84'; # VERSION has '+sig' => sub { {} }; has check_fetch => 1; has check_download => 1; has allow_listing => 1; sub init { my($self, $meta) = @_; $meta->add_requires('configure' => 'Alien::Build::Plugin::Digest::Negotiate' => "0" ); $meta->prop->{check_digest} = 1; my $sigs = $meta->prop->{digest} ||= {}; if(ref($self->sig) eq 'HASH') { foreach my $filename (keys %{ $self->sig }) { my $signature = $self->sig->{$filename}; my($algo) = @$signature; die "Unknown digest algorithm $algo" unless $algo =~ /^SHA(1|224|256|384|512|512224|512256)$/; # reportedly what is supported by Digest::SHA $sigs->{$filename} = $signature; } } elsif(ref($self->sig) eq 'ARRAY') { my $signature = $self->sig; my($algo) = @$signature; die "Unknown digest algorithm $algo" unless $algo =~ /^SHA(1|224|256|384|512|512224|512256)$/; # reportedly what is supported by Digest::SHA $sigs->{'*'} = $signature; } # In the future if this negotiator supports algorithms other # than SHA, we should probably ajust this to keep track of # which ones we actually need when we are looping through them # above. Also technically you could call this plugin without # any sigs, and we shouldn't in theory need to apply Digest::SHA, # but stuff won't work that way so that is a corner case we # are not going to worry about. $meta->apply_plugin('Digest::SHA'); $meta->around_hook( fetch => sub { my($orig, $build, @rest) = @_; my $res = $orig->($build, @rest); if($res->{type} eq 'file') { $build->check_digest($res); } else { die "listing fetch not allowed" unless $self->allow_listing; } $res; }, ) if $self->check_fetch; # Note that check_download hook is currently undocumented and # may change in the future. $meta->register_hook( check_download => sub { my($build) = @_; my $path = $build->install_prop->{download}; die "Checking cryptographic signatures on download only works for single archive" unless defined $path; $build->check_digest($path); }, ) if $self->check_download; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Digest::Negotiate - Plugin negotiator for cryptographic signatures =head1 VERSION version 2.84 =head1 SYNOPSIS for a single file: use alienfile; plugin 'Digest' => [ SHA256 => $digest ]; or for multiple files: use alienfile; plugin 'Digest' => { file1 => [ SHA256 => $digest1 ], file2 => [ SHA256 => $digest2 ], }; =head1 DESCRIPTION This plugin is experimental. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Digest/SHA.pm000644 000000 000000 00000004406 14710030646 022002 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Digest::SHA; use strict; use warnings; use Alien::Build::Plugin; # ABSTRACT: Plugin to check SHA digest with Digest::SHA our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->add_requires('configure' => 'Alien::Build' => "2.57" ); $meta->register_hook( check_digest => sub { my($build, $file, $algo, $expected_digest) = @_; return 0 unless $algo =~ /^SHA[0-9]+$/; my $sha = Digest::SHA->new($algo); return 0 unless defined $sha; if(defined $file->{content}) { $sha->add($file->{content}); } elsif(defined $file->{path}) { $sha->addfile($file->{path}, "b"); } else { die "unknown file type"; } my $actual_digest = $sha->hexdigest; return 1 if $expected_digest eq $actual_digest; die "@{[ $file->{filename} ]} SHA@{[ $sha->algorithm ]} digest does not match: got $actual_digest, expected $expected_digest"; }); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Digest::SHA - Plugin to check SHA digest with Digest::SHA =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Digest::SHA'; =head1 DESCRIPTION This plugin is experimental. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Digest/SHAPP.pm000644 000000 000000 00000004564 14710030646 022247 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Digest::SHAPP; use strict; use warnings; use Alien::Build::Plugin; # ABSTRACT: Plugin to check SHA digest with Digest::SHA::PurePerl our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; $meta->add_requires('configure' => 'Alien::Build' => "2.57" ); $meta->add_requires('share' => 'Digest::SHA::PurePerl' => "0" ); $meta->register_hook( check_digest => sub { my($build, $file, $algo, $expected_digest) = @_; return 0 unless $algo =~ /^SHA[0-9]+$/; my $sha = Digest::SHA::PurePerl->new($algo); return 0 unless defined $sha; if(defined $file->{content}) { $sha->add($file->{content}); } elsif(defined $file->{path}) { $sha->addfile($file->{path}, "b"); } else { die "unknown file type"; } my $actual_digest = $sha->hexdigest; return 1 if $expected_digest eq $actual_digest; die "@{[ $file->{filename} ]} SHA@{[ $sha->algorithm ]} digest does not match: got $actual_digest, expected $expected_digest"; }); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Digest::SHAPP - Plugin to check SHA digest with Digest::SHA::PurePerl =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Digest::SHAPP'; =head1 DESCRIPTION This plugin is experimental. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Download.pod000644 000000 000000 00000003122 14710030646 022057 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Download # ABSTRACT: Download Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Download - Download Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile share { start_url 'http://ftp.gnu.org/gnu/make'; plugin 'Download'; }; =head1 DESCRIPTION Download plugins download packages from the internet. =over 4 =item L =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Download/000755 000000 000000 00000000000 14710030646 021355 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Download/Negotiate.pm000644 000000 000000 00000022223 14710030646 023633 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Download::Negotiate; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Alien::Build::Util qw( _has_ssl ); use Carp (); # ABSTRACT: Download negotiation plugin our $VERSION = '2.84'; # VERSION has '+url' => undef; has 'filter' => undef; has 'version' => undef; has 'ssl' => 0; has 'passive' => 0; has 'scheme' => undef; has 'bootstrap_ssl' => 0; has 'prefer' => 1; has 'decoder' => undef; sub pick { my($self) = @_; my($fetch, @decoders) = $self->_pick; if($self->decoder) { @decoders = ref $self->decoder ? @{ $self->decoder } : ($self->decoder); } ($fetch, @decoders); } sub _pick_decoder { my($self) = @_; if(eval { require Mojo::DOM58; Mojo::DOM58->VERSION(1.00); 1 }) { return "Decode::Mojo" } elsif(eval { require Mojo::DOM; require Mojolicious; Mojolicious->VERSION('7.00'); 1 }) { return "Decode::Mojo" } elsif(eval { require HTML::LinkExtor; 1; }) { return "Decode::HTML" } else { return "Decode::Mojo" } } sub _pick { my($self) = @_; $self->scheme( $self->url !~ m!(ftps?|https?|file):!i ? 'file' : $self->url =~ m!^([a-z]+):!i ) unless defined $self->scheme; if($self->scheme eq 'https' || ($self->scheme eq 'http' && $self->ssl)) { if($self->bootstrap_ssl && ! _has_ssl) { return (['Fetch::CurlCommand','Fetch::Wget'], __PACKAGE__->_pick_decoder); } elsif(_has_ssl) { return ('Fetch::HTTPTiny', __PACKAGE__->_pick_decoder); } #elsif(do { require Alien::Build::Plugin::Fetch::CurlCommand; Alien::Build::Plugin::Fetch::CurlCommand->protocol_ok('https') }) #{ # return ('Fetch::CurlCommand', __PACKAGE__->_pick_decoder); #} else { return ('Fetch::HTTPTiny', __PACKAGE__->_pick_decoder); } } elsif($self->scheme eq 'http') { return ('Fetch::HTTPTiny', __PACKAGE__->_pick_decoder); } elsif($self->scheme eq 'ftp') { if($ENV{ftp_proxy} || $ENV{all_proxy}) { return $self->scheme =~ /^ftps?/ ? ('Fetch::LWP', 'Decode::DirListing', __PACKAGE__->_pick_decoder) : ('Fetch::LWP', __PACKAGE__->_pick_decoder); } else { return ('Fetch::NetFTP'); } } elsif($self->scheme eq 'file') { return ('Fetch::Local'); } else { die "do not know how to handle scheme @{[ $self->scheme ]} for @{[ $self->url ]}"; } } sub init { my($self, $meta) = @_; unless(defined $self->url) { if(defined $meta->prop->{start_url}) { $self->url($meta->prop->{start_url}); } else { Carp::croak "url is a required property unless you use the start_url directive"; } } if($self->url =~ /^http.*github.com.*releases$/) { Alien::Build->log('!! WARNING !! WARNING !!'); Alien::Build->log('!! WARNING !! It looks like this alien is using the regular download negotiator'); Alien::Build->log('plugin on a GitHub release page. This will typically not work due to changes'); Alien::Build->log('in the way GitHub release page works now. The Alien should instead be updated'); Alien::Build->log('to use the Download::GitHub plugin, which uses the GitHub API to find available'); Alien::Build->log('releases. See: https://metacpan.org/pod/Alien::Build::Plugin::Download::GitHub'); Alien::Build->log('!! WARNING !! WARNING !!'); } $meta->add_requires('share' => 'Alien::Build::Plugin::Download::Negotiate' => '0.61') if $self->passive; $meta->prop->{plugin_download_negotiate_default_url} = $self->url; my($fetch, @decoders) = $self->pick; $fetch = [ $fetch ] unless ref $fetch; foreach my $fetch (@$fetch) { my @args; push @args, ssl => $self->ssl; # For historical reasons, we pass the URL into older fetch plugins, because # this used to be the interface. Using start_url is now preferred! push @args, url => $self->url if $fetch =~ /^Fetch::(HTTPTiny|LWP|Local|LocalDir|NetFTP|CurlCommand)$/; push @args, passive => $self->passive if $fetch eq 'Fetch::NetFTP'; push @args, bootstrap_ssl => $self->bootstrap_ssl if $self->bootstrap_ssl; $meta->apply_plugin($fetch, @args); } if($self->version) { $meta->apply_plugin($_) for @decoders; if(defined $self->prefer && ref($self->prefer) eq 'CODE') { $meta->add_requires('share' => 'Alien::Build::Plugin::Download::Negotiate' => '1.30'); $meta->register_hook( prefer => $self->prefer, ); } elsif($self->prefer) { $meta->apply_plugin('Prefer::SortVersions', (defined $self->filter ? (filter => $self->filter) : ()), version => $self->version, ); } else { $meta->add_requires('share' => 'Alien::Build::Plugin::Download::Negotiate' => '1.30'); } } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Download::Negotiate - Download negotiation plugin =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'http://ftp.gnu.org/gnu/make'; plugin 'Download' => ( filter => qr/^make-.*\.tar\.gz$/, version => qr/([0-9\.]+)/, ); }; =head1 DESCRIPTION This is a negotiator plugin for downloading packages from the internet. This plugin picks the best Fetch, Decode and Prefer plugins to do the actual work. Which plugins are picked depend on the properties you specify, your platform and environment. It is usually preferable to use a negotiator plugin rather than the Fetch, Decode and Prefer plugins directly from your L. =head1 PROPERTIES =head2 url [DEPRECATED] use C instead. The Initial URL for your package. This may be a directory listing (either in HTML or ftp listing format) or the final tarball intended to be downloaded. =head2 filter This is a regular expression that lets you filter out files that you do not want to consider downloading. For example, if the directory listing contained tarballs and readme files like this: foo-1.0.0.tar.gz foo-1.0.0.readme You could specify a filter of C to make sure only tarballs are considered for download. =head2 version Regular expression to parse out the version from a filename. The regular expression should store the result in C<$1>. Note: if you provide a C property, this plugin will assume that you will be downloading an initial index to select package downloads from. Depending on the protocol (and typically this is the case for http and HTML) that may bring in additional dependencies. If start_url points to a tarball or other archive directly (without needing to do through an index selection process), it is recommended that you not specify this property. =head2 ssl If your initial URL does not need SSL, but you know ahead of time that a subsequent request will need it (for example, if your directory listing is on C, but includes links to C URLs), then you can set this property to true, and the appropriate Perl SSL modules will be loaded. =head2 passive If using FTP, attempt a passive mode transfer first, before trying an active mode transfer. =head2 bootstrap_ssl If set to true, then the download negotiator will avoid using plugins that have a dependency on L, or other Perl SSL modules. The intent for this option is to allow OpenSSL to be alienized and be a useful optional dependency for L. The implementation may improve over time, but as of this writing, this option relies on you having a working C or C with SSL support in your C. =head2 prefer How to sort candidates for selection. This should be one of three types of values: =over 4 =item code reference This will be used as the prefer hook. =item true value Use L. =item false value Don't set any preference at all. A hook must be installed, or another prefer plugin specified. =back =head2 decoder Override the detected decoder. =head1 METHODS =head2 pick my($fetch, @decoders) = $plugin->pick; Returns the fetch plugin and any optional decoders that should be used. =head1 SEE ALSO L, L L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Extract.pod000644 000000 000000 00000004435 14710030646 021732 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Extract # ABSTRACT: Extract Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Extract - Extract Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile share { plugin 'Extract' => 'tar.gz'; }; =head1 DESCRIPTION Extract plugins extract packages that have been downloaded from the internet. Unless you are doing something unusual you will likely want to use the L plugin to select the best Extract plugin available. =over 4 =item L Extract using C. Typically also works with compressed tarballs like C. =item L Extract using L. =item L Extract using command line tools like C or C. =item L Extract a local directory. =item L "Extract" a single file. =item L Pick the best extract plugin based on the extension of the package archive. =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Extract/000755 000000 000000 00000000000 14710030646 021220 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Extract/ArchiveTar.pm000644 000000 000000 00000011415 14710030646 023610 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Extract::ArchiveTar; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::chdir; use File::Temp (); use Path::Tiny (); # ABSTRACT: Plugin to extract a tarball using Archive::Tar our $VERSION = '2.84'; # VERSION has '+format' => 'tar'; sub handles { my(undef, $ext) = @_; return 1 if $ext =~ /^(tar|tar\.gz|tar\.bz2|tar\.xz|tbz|taz|txz)$/; return 0; } sub available { my(undef, $ext) = @_; if($ext eq 'tar.gz') { return !! eval { require Archive::Tar; Archive::Tar->has_zlib_support }; } elsif($ext eq 'tar.bz2') { return !! eval { require Archive::Tar; Archive::Tar->has_bzip2_support && __PACKAGE__->_can_bz2 }; } elsif($ext eq 'tar.xz') { return !! eval { require Archive::Tar; Archive::Tar->has_xz_support }; } else { return $ext eq 'tar'; } } sub init { my($self, $meta) = @_; $meta->add_requires('share' => 'Archive::Tar' => 0); if($self->format eq 'tar.gz' || $self->format eq 'tgz') { $meta->add_requires('share' => 'IO::Zlib' => 0); } elsif($self->format eq 'tar.bz2' || $self->format eq 'tbz') { $meta->add_requires('share' => 'IO::Uncompress::Bunzip2' => 0); $meta->add_requires('share' => 'IO::Compress::Bzip2' => 0); } elsif($self->format eq 'tar.xz' || $self->format eq 'txz') { $meta->add_requires('share' => 'Archive::Tar' => 2.34); $meta->add_requires('share' => 'IO::Uncompress::UnXz' => 0); } $meta->register_hook( extract => sub { my($build, $src) = @_; my $tar = Archive::Tar->new; $tar->read($src); $tar->extract; } ); } sub _can_bz2 { # even when Archive::Tar reports that it supports bz2, I can sometimes get this error: # 'Cannot read enough bytes from the tar file', so lets just probe for actual support! my $dir = Path::Tiny->new(File::Temp::tempdir( CLEANUP => 1 )); eval { local $CWD = $dir; my $tarball = unpack "u", q{M0EIH.3%!62936=+(]$0``$A[D-$0`8!``7^``!!AI)Y`!```""``=!JGIH-(MT#0]0/2!**---&F@;4#0&:D;X?(6@JH(2<%'N$%3VHC-9E>S/N@"6&I*1@GNJNHCC2>$I5(<0BKR.=XBZ""HVZ;T,CV\LJ!K&*?9`#\7new('xx.tar.bz2')->spew_raw($tarball); require Archive::Tar; my $tar = Archive::Tar->new; $tar->read('xx.tar.bz2'); $tar->extract; my $content = Path::Tiny->new('xx.txt')->slurp; die unless $content && $content eq "xx\n"; }; my $error = $@; $dir->remove_tree; !$error; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Extract::ArchiveTar - Plugin to extract a tarball using Archive::Tar =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Extract::ArchiveTar' => ( format => 'tar.gz', ); =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate Extract plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This plugin extracts from an archive in tarball format (optionally compressed by either gzip or bzip2) using L. =head1 PROPERTIES =head2 format Gives a hint as to the expected format. This helps make sure the prerequisites are set correctly, since compressed archives require extra Perl modules to be installed. =head1 METHODS =head2 handles Alien::Build::Plugin::Extract::ArchiveTar->handles($ext); $plugin->handles($ext); Returns true if the plugin is able to handle the archive of the given format. =head2 available Alien::Build::Plugin::Extract::ArchiveTar->available($ext); Returns true if the plugin has what it needs right now to extract from the given format =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Extract/ArchiveZip.pm000644 000000 000000 00000006170 14710030646 023626 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Extract::ArchiveZip; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; # ABSTRACT: Plugin to extract a tarball using Archive::Zip our $VERSION = '2.84'; # VERSION has '+format' => 'zip'; sub handles { my($class, $ext) = @_; return 1 if $ext eq 'zip'; return 0; } sub available { my(undef, $ext) = @_; !! ( $ext eq 'zip' && eval { require Archive::Zip; 1} ); } sub init { my($self, $meta) = @_; $meta->add_requires('share' => 'Archive::Zip' => 0); $meta->register_hook( extract => sub { my($build, $src) = @_; my $zip = Archive::Zip->new; $zip->read($src); $zip->extractTree; } ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Extract::ArchiveZip - Plugin to extract a tarball using Archive::Zip =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Extract::ArchiveZip' => ( format => 'zip', ); =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate Extract plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. B: Seriously do NOT use this plugin! L is pretty unreliable and breaks all-the-time. If you use the negotiator plugin mentioned above, then it will prefer installing L, which is much more reliable than L. This plugin extracts from an archive in zip format using L. =head2 format Gives a hint as to the expected format. This should always be C. =head1 METHODS =head2 handles Alien::Build::Plugin::Extract::ArchiveZip->handles($ext); $plugin->handles($ext); Returns true if the plugin is able to handle the archive of the given format. =head2 available Alien::Build::Plugin::Extract::ArchiveZip->available($ext); Returns true if the plugin has what it needs right now to extract from the given format =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Extract/CommandLine.pm000644 000000 000000 00000032531 14710030646 023750 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Extract::CommandLine; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Path::Tiny (); use File::Which (); use File::chdir; use File::Temp qw( tempdir ); use Capture::Tiny qw( capture_merged ); # ABSTRACT: Plugin to extract an archive using command line tools our $VERSION = '2.84'; # VERSION has '+format' => 'tar'; sub gzip_cmd { _which('gzip') ? 'gzip' : undef; } sub _which { scalar File::Which::which(@_) } sub bzip2_cmd { _which('bzip2') ? 'bzip2' : undef; } sub xz_cmd { _which('xz') ? 'xz' : undef; } { my $bsd_tar; # Note: GNU tar can be iffy to very bad on windows, where absolute # paths get confused with remote tars. We used to assume that 'tar.exe' # is borked on Windows, but recent versions of Windows 10 come bundled # with bsdtar (libarchive) named 'tar.exe', and we should definitely # prefer that to ptar. sub _windows_tar_is_bsdtar { return 1 if $^O ne 'MSWin32'; return $bsd_tar if defined $bsd_tar; my($out) = capture_merged { system 'tar', '--version'; }; return $bsd_tar = $out =~ /bsdtar/ ? 1 : 0 } } sub tar_cmd { _which('bsdtar') ? 'bsdtar' # Slowlaris /usr/bin/tar doesn't seem to like pax global header # but seems to have gtar in the path by default, which is okay with it : $^O eq 'solaris' && _which('gtar') ? 'gtar' # See note above for Windows logic. : _which('tar') && _windows_tar_is_bsdtar() ? 'tar' : _which('ptar') ? 'ptar' : undef; }; sub unzip_cmd { if($^O eq 'MSWin32' && _which('tar') && _windows_tar_is_bsdtar()) { (_which('tar'), 'xf'); } else { _which('unzip') ? 'unzip' : undef; } } sub _run { my(undef, $build, @cmd) = @_; $build->log("+ @cmd"); system @cmd; die "execute failed" if $?; } sub _cp { my(undef, $build, $from, $to) = @_; require File::Copy; $build->log("copy $from => $to"); File::Copy::cp($from, $to) || die "unable to copy: $!"; } sub _mv { my(undef, $build, $from, $to) = @_; $build->log("move $from => $to"); rename($from, $to) || die "unable to rename: $!"; } sub _dcon { my($self, $src) = @_; my $name; my $cmd; if($src =~ /\.(gz|tgz|Z|taz)$/) { $self->gzip_cmd(_which('gzip')) unless defined $self->gzip_cmd; if($src =~ /\.(gz|tgz)$/) { $cmd = $self->gzip_cmd unless $self->_tar_can('tar.gz'); } elsif($src =~ /\.(Z|taz)$/) { $cmd = $self->gzip_cmd unless $self->_tar_can('tar.Z'); } } elsif($src =~ /\.(bz2|tbz)$/) { $self->bzip2_cmd(_which('bzip2')) unless defined $self->bzip2_cmd; $cmd = $self->bzip2_cmd unless $self->_tar_can('tar.bz2'); } elsif($src =~ /\.(xz|txz)$/) { $self->xz_cmd(_which('xz')) unless defined $self->xz_cmd; $cmd = $self->xz_cmd unless $self->_tar_can('tar.xz'); } if($cmd && $src =~ /\.(gz|bz2|xz|Z)$/) { $name = $src; $name =~ s/\.(gz|bz2|xz|Z)$//g; } elsif($cmd && $src =~ /\.(tgz|tbz|txz|taz)$/) { $name = $src; $name =~ s/\.(tgz|tbz|txz|taz)$/.tar/; } ($name,$cmd); } sub handles { my($class, $ext) = @_; my $self = ref $class ? $class : __PACKAGE__->new; $ext = 'tar.Z' if $ext eq 'taz'; $ext = 'tar.gz' if $ext eq 'tgz'; $ext = 'tar.bz2' if $ext eq 'tbz'; $ext = 'tar.xz' if $ext eq 'txz'; return 1 if $ext eq 'tar.gz' && $self->_tar_can('tar.gz'); return 1 if $ext eq 'tar.Z' && $self->_tar_can('tar.Z'); return 1 if $ext eq 'tar.bz2' && $self->_tar_can('tar.bz2'); return 1 if $ext eq 'tar.xz' && $self->_tar_can('tar.xz'); return 0 if $ext =~ s/\.(gz|Z)$// && (!$self->gzip_cmd); return 0 if $ext =~ s/\.bz2$// && (!$self->bzip2_cmd); return 0 if $ext =~ s/\.xz$// && (!$self->xz_cmd); return 1 if $ext eq 'tar' && $self->_tar_can('tar'); return 1 if $ext eq 'zip' && $self->_tar_can('zip'); return 0; } sub available { my(undef, $ext) = @_; # this is actually the same as handles __PACKAGE__->handles($ext); } sub init { my($self, $meta) = @_; if($self->format eq 'tar.xz' && !$self->handles('tar.xz')) { $meta->add_requires('share' => 'Alien::xz' => '0.06'); } elsif($self->format eq 'tar.bz2' && !$self->handles('tar.bz2')) { $meta->add_requires('share' => 'Alien::Libbz2' => '0.22'); } elsif($self->format =~ /^tar\.(gz|Z)$/ && !$self->handles($self->format)) { $meta->add_requires('share' => 'Alien::gzip' => '0.03'); } elsif($self->format eq 'zip' && !$self->handles('zip')) { $meta->add_requires('share' => 'Alien::unzip' => '0'); } $meta->register_hook( extract => sub { my($build, $src) = @_; my($dcon_name, $dcon_cmd) = _dcon($self, $src); if($dcon_name) { unless($dcon_cmd) { die "unable to decompress $src"; } # if we have already decompressed, then keep it. unless(-f $dcon_name) { # we don't use pipes, because that may not work on Windows. # keep the original archive, in case another extract # plugin needs it. keep the decompressed archive # in case WE need it again. my $src_tmp = Path::Tiny::path($src) ->parent ->child('x'.Path::Tiny::path($src)->basename); my $dcon_tmp = Path::Tiny::path($dcon_name) ->parent ->child('x'.Path::Tiny::path($dcon_name)->basename); $self->_cp($build, $src, $src_tmp); $self->_run($build, $dcon_cmd, "-d", $src_tmp); $self->_mv($build, $dcon_tmp, $dcon_name); } $src = $dcon_name; } if($src =~ /\.zip$/i) { $self->_run($build, $self->unzip_cmd, $src); } elsif($src =~ /\.tar/ || $src =~ /(\.tgz|\.tbz|\.txz|\.taz)$/i) { $self->_run($build, $self->tar_cmd, '-xf', $src); } else { die "not sure of archive type from extension"; } } ); } my %tars; sub _tar_can { my($self, $ext) = @_; unless(%tars) { my $name = ''; local $_; # to avoid dynamically scoped read-only $_ from upper scopes while(my $line = ) { if($line =~ /^\[ (.*) \]$/) { $name = $1; } else { $tars{$name} .= $line; } } foreach my $key (keys %tars) { $tars{$key} = unpack "u", $tars{$key}; } } my $name = "xx.$ext"; return 0 unless $tars{$name}; local $CWD = tempdir( CLEANUP => 1 ); my $cleanup = sub { my $save = $CWD; unlink $name; unlink 'xx.txt'; $CWD = '..'; rmdir $save; }; Path::Tiny->new($name)->spew_raw($tars{$name}); my @cmd = ($self->tar_cmd, 'xf', $name); if($ext eq 'zip') { @cmd = ($self->unzip_cmd, $name); } my(undef, $exit) = capture_merged { system(@cmd); $?; }; if($exit) { $cleanup->(); return 0; } my $content = eval { Path::Tiny->new('xx.txt')->slurp }; $cleanup->(); return defined $content && $content eq "xx\n"; } 1; =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Extract::CommandLine - Plugin to extract an archive using command line tools =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Extract::CommandLine' => ( format => 'tar.gz', ); =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate Extract plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This plugin extracts from an archive in various formats using command line tools. =head1 PROPERTIES =head2 format Gives a hint as to the expected format. =head2 gzip_cmd The C command, if available. C if not available. =head2 bzip2_cmd The C command, if available. C if not available. =head2 xz_cmd The C command, if available. C if not available. =head2 tar_cmd The C command, if available. C if not available. =head2 unzip_cmd The C command, if available. C if not available. =head1 METHODS =head2 handles Alien::Build::Plugin::Extract::CommandLine->handles($ext); $plugin->handles($ext); Returns true if the plugin is able to handle the archive of the given format. =head2 available Alien::Build::Plugin::Extract::CommandLine->available($ext); Returns true if the plugin is available to extract without installing anything new. =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut __DATA__ [ xx.tar ] M>'@N='AT```````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````#`P,#8T-"``,#`P-S8U(``P,#`P,C0@`#`P,#`P,#`P,#`S M(#$S-#,U,#0S-#(R(#`Q,C`H````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` 7```````````````````````````````` [ xx.tar.Z ] M'YV0>/"XH(.'#H"#"!,J7,BPH<.'$"-*1`BCH@T:-$``J`CCAHT:&CG"D)%Q MH\B3,T#$F$%C1@T8+6G(D`$"1@P9-V#,`%!SHL^?0(,*!5!G#ITPO8,.*'1I0P=BS:-.J7//JWD#0)SI*Z'R%H*J"&3@H]P@J>U$F5BMHOC`$L-"8C!(V I"`'?*WA:(9*4U)@4)+"(V%.G]#W(_E6B'J8G]D`/Q=R13A0D%(,+ID`` [ xx.tar.gz ] M'XL("!)'=%P``WAX+G1A<@"KJ-`KJ2AAH"DP,#`P,S%1`-'F9J9@VL`(PH<" M8P5#8Q-C4P,38Q,C(P4#0R-S`V,&!0/:.@L"2HM+$HN`3LG/RM#J@L E+0V/.1"/*,#I(0(J*K@&V@FC8!2,@E$P"@8````U:,3F``@````` [ xx.tar.xz ] M_3=Z6%H```3FUK1&`@`A`18```!T+^6CX`?_`&!=`#Q@M.AX.4O&N38V648. M[J6L\\<_[3M*R;CASOTX?B.F\V:^)+G;\YY4"!4MLF9`*\N40G=O+K,J0"NF M0VU7J%NN(A,R^DM8@/(_YGR5CAO+1CS_YNHE:,1!G%6L1\GT``"[$^?"O*"! 9`P`!?(`0````:OY*7K'$9_L"``````196@`` [ xx.zip ] M4$L#!`H``````%5V64X:^I"B`P````,````&`!P`>'@N='AT550)``,21W1< M$D=T7'5X"P`!!/4!```$%````'AX"E!+`0(>`PH``````%5V64X:^I"B`P`` M``,````&`!@```````$```"D@0````!X>"YT>'155`4``Q)'=%QU>`L``03U >`0``!!0```!02P4&``````$``0!,````0P`````` Alien-Build-2.84/lib/Alien/Build/Plugin/Extract/Directory.pm000644 000000 000000 00000006620 14710030646 023526 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Extract::Directory; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Alien::Build::Util qw( _mirror ); use Path::Tiny (); # ABSTRACT: Plugin to extract a downloaded directory to a build directory our $VERSION = '2.84'; # VERSION has '+format' => 'd'; sub handles { my(undef, $ext) = @_; $ext eq 'd' ? 1 : (); } sub available { my(undef, $ext) = @_; __PACKAGE__->handles($ext); } sub init { my($self, $meta) = @_; $meta->register_hook( extract => sub { my($build, $src) = @_; die "not a directory: $src" unless -d $src; if($build->meta_prop->{out_of_source}) { $build->install_prop->{extract} = Path::Tiny->new($src)->absolute->stringify; } else { my $dst = Path::Tiny->new('.')->absolute; # Please note: _mirror and Alien::Build::Util are ONLY # allowed to be used by core plugins. If you are writing # a non-core plugin it may be removed. That is why it # is private. _mirror $src => $dst, { verbose => 1 }; } } ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Extract::Directory - Plugin to extract a downloaded directory to a build directory =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Extract::Directory'; =head1 DESCRIPTION Some Download or Fetch plugins may produce a directory instead of an archive file. This plugin is used to mirror the directory from the Download step into a fresh directory in the Extract step. An example of when you might use this plugin is if you were using the C command in the Download step, which results in a directory hierarchy. =head1 PROPERTIES =head2 format Should always set to C (for directories). =head1 METHODS =head2 handles Alien::Build::Plugin::Extract::Directory->handles($ext); $plugin->handles($ext); Returns true if the plugin is able to handle the archive of the given format. Only returns true for C (for directory). =head2 available Alien::Build::Plugin::Extract::Directory->available($ext); $plugin->available($ext); Returns true if the plugin can extract the given format with what is already installed. =head1 SEE ALSO L, L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Extract/File.pm000644 000000 000000 00000006212 14710030646 022436 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Extract::File; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Alien::Build::Util qw( _mirror ); use Path::Tiny (); # ABSTRACT: Plugin to extract a downloaded file to a build directory our $VERSION = '2.84'; # VERSION has '+format' => 'f'; sub handles { my(undef, $ext) = @_; $ext eq 'f' ? 1 : (); } sub available { my(undef, $ext) = @_; __PACKAGE__->handles($ext); } sub init { my($self, $meta) = @_; $meta->register_hook( extract => sub { my($build, $src) = @_; die "not a file: $src" unless -f $src; $src = Path::Tiny->new($src)->absolute->parent;; my $dst = Path::Tiny->new('.')->absolute; # Please note: _mirror and Alien::Build::Util are ONLY # allowed to be used by core plugins. If you are writing # a non-core plugin it may be removed. That is why it # is private. $build->log("extracting $src => $dst"); _mirror $src => $dst, { verbose => 1 }; } ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Extract::File - Plugin to extract a downloaded file to a build directory =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Extract::File'; =head1 DESCRIPTION Some Download or Fetch plugins may produce a single file (usually an executable) instead of an archive file. This plugin is used to mirror the file from the Download step into a fresh directory in the Extract step. =head1 PROPERTIES =head2 format Should always set to C (for file). =head1 METHODS =head2 handles Alien::Build::Plugin::Extract::File->handles($ext); $plugin->handles($ext); Returns true if the plugin is able to handle the archive of the given format. Only returns true for C (for file). =head2 available Alien::Build::Plugin::Extract::File->available($ext); $plugin->available($ext); Returns true if the plugin can extract the given format with what is already installed. =head1 SEE ALSO L, L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Extract/Negotiate.pm000644 000000 000000 00000010537 14710030646 023503 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Extract::Negotiate; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Alien::Build::Plugin::Extract::ArchiveTar; use Alien::Build::Plugin::Extract::ArchiveZip; use Alien::Build::Plugin::Extract::CommandLine; use Alien::Build::Plugin::Extract::Directory; # ABSTRACT: Extraction negotiation plugin our $VERSION = '2.84'; # VERSION has '+format' => 'tar'; sub init { my($self, $meta) = @_; my $format = $self->format; $format = 'tar.gz' if $format eq 'tgz'; $format = 'tar.bz2' if $format eq 'tbz'; $format = 'tar.xz' if $format eq 'txz'; my $plugin = $self->pick($format); $meta->apply_plugin($plugin, format => $format); $self; } sub pick { my(undef, $format) = @_; if($format =~ /^tar(\.(gz|bz2))?$/) { if(Alien::Build::Plugin::Extract::ArchiveTar->available($format)) { return 'Extract::ArchiveTar'; } else { return 'Extract::CommandLine'; } } elsif($format eq 'zip') { # Archive::Zip is not that reliable. But if it is already installed it is probably working if(Alien::Build::Plugin::Extract::ArchiveZip->available($format)) { return 'Extract::ArchiveZip'; } # If it isn't available, then use the command-line unzip. Alien::unzip will be used # as necessary in environments where it isn't already installed. else { return 'Extract::CommandLine'; } } elsif($format eq 'tar.xz') { # The windows version of tar.exe (which is based on BSD tar) will try to use external # program xz to decompress tar.xz files if it is available. The default windows # install does not have this in the PATH, but if it IS in the PATH then it often # or always can hang, so the pure Perl Archive::Tar is more reliable on that platform, # but will require a newer version of Archive::Tar and IO::Uncompress::UnXz if(Alien::Build::Plugin::Extract::ArchiveTar->available('tar.xz') || $^O eq 'MSWin32') { return 'Extract::ArchiveTar'; } else { return 'Extract::CommandLine'; } } elsif($format eq 'tar.Z') { return 'Extract::CommandLine'; } elsif($format eq 'd') { return 'Extract::Directory'; } elsif($format eq 'f') { return 'Extract::File'; } else { die "do not know how to handle format: $format"; } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Extract::Negotiate - Extraction negotiation plugin =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Extract' => ( format => 'tar.gz', ); =head1 DESCRIPTION This is a negotiator plugin for extracting packages downloaded from the internet. This plugin picks the best Extract plugin to do the actual work. Which plugins are picked depend on the properties you specify, your platform and environment. It is usually preferable to use a negotiator plugin rather than using a specific Extract Plugin from your L. =head1 PROPERTIES =head2 format The expected format for the download. Possible values include: C, C, C, C, C, C. =head1 METHODS =head2 pick my $name = Alien::Build::Plugin::Extract::Negotiate->pick($format); Returns the name of the best plugin for the given format. =head1 SEE ALSO L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Fetch.pod000644 000000 000000 00000005152 14710030646 021346 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Fetch # ABSTRACT: Fetch Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Fetch - Fetch Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'http://ftp.gnu.org/gnu/make'; plugin 'Download'; }; =head1 DESCRIPTION Fetch plugins retrieve single resources from the internet. The difference between a Fetch plugin and a Download plugin is that Download plugin may fetch several resources from the internet (usually using a Fetch plugin), before finding the final archive. Normally you will not need to use Fetch plugins directly but should instead use the L plugin, which will pick the best plugins for your given URL. =over 4 =item L Fetch using the C command. =item L Fetch using L. =item L Fetch using L. =item L Fetch from a local file. This is typically used to bundle packages with your L. =item L Fetch from a local directory. This is typically used to bundle packages with your L. =item L Fetch using L. Use of FTP should be discouraged as of this writing (August 2022). =item L Fetch using C. =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Fetch/000755 000000 000000 00000000000 14710030646 020637 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Fetch/CurlCommand.pm000644 000000 000000 00000020311 14710030646 023376 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Fetch::CurlCommand; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::Which qw( which ); use Path::Tiny qw( path ); use Capture::Tiny qw( capture ); use File::Temp qw( tempdir ); use List::Util 1.33 qw( any pairmap ); use File::chdir; # ABSTRACT: Plugin for fetching files using curl our $VERSION = '2.84'; # VERSION sub curl_command { defined $ENV{CURL} ? scalar which($ENV{CURL}) : scalar which('curl'); } has ssl => 0; has _see_headers => 0; has '+url' => ''; # when bootstrapping we have to specify this plugin as a prereq # 1 is the default so that when this plugin is used directly # you also get the prereq has bootstrap_ssl => 1; sub protocol_ok { my($class, $protocol) = @_; my $curl = $class->curl_command; return 0 unless defined $curl; my($out, $err, $exit) = capture { system $curl, '--version'; }; { # make sure curl supports the -J option. # CentOS 6 for example is recent enough # that it does not. gh#147, gh#148, gh#149 local $CWD = tempdir( CLEANUP => 1 ); my $file1 = path('foo/foo.txt'); $file1->parent->mkpath; $file1->spew("hello world\n"); my $url = 'file://' . $file1->absolute; my($out, $err, $exit) = capture { system $curl, '-O', '-J', $url; }; my $file2 = $file1->parent->child($file1->basename); unlink "$file1"; unlink "$file2"; rmdir($file1->parent); return 0 if $exit; } foreach my $line (split /\n/, $out) { if($line =~ /^Protocols:\s*(.*)\s*$/) { my %proto = map { $_ => 1 } split /\s+/, $1; return $proto{$protocol} if $proto{$protocol}; } } return 0; } sub init { my($self, $meta) = @_; $meta->prop->{start_url} ||= $self->url; $self->url($meta->prop->{start_url}); $self->url || Carp::croak('url is a required property'); $meta->add_requires('configure', 'Alien::Build::Plugin::Fetch::CurlCommand' => '1.19') if $self->bootstrap_ssl; $meta->register_hook( fetch => sub { my($build, $url, %options) = @_; $url ||= $self->url; my($scheme) = $url =~ /^([a-z0-9]+):/i; if($scheme =~ /^https?$/) { local $CWD = tempdir( CLEANUP => 1 ); my @writeout = ( "ab-filename :%{filename_effective}", "ab-content_type :%{content_type}", "ab-url :%{url_effective}", ); $build->log("writeout: $_\\n") for @writeout; path('writeout')->spew(join("\\n", @writeout)); my @headers; if(my $headers = $options{http_headers}) { if(ref $headers eq 'ARRAY') { @headers = pairmap { -H => "$a: $b" } @$headers; } else { $build->log("Fetch for $url with http_headers that is not an array reference"); } } my @command = ( $self->curl_command, '-L', '-f', '-O', '-J', -w => '@writeout', @headers, ); push @command, -D => 'head' if $self->_see_headers; push @command, $url; my($stdout, $stderr) = $self->_execute($build, @command); my %h = map { /^ab-(.*?)\s*:(.*)$/ ? ($1 => $2) : () } split /\n/, $stdout; if(-e 'head') { $build->log(" ~ $_ => $h{$_}") for sort keys %h; $build->log(" header: $_") for path('headers')->lines; } my($type) = split /;/, $h{content_type}; if($type eq 'text/html') { return { type => 'html', base => $h{url}, content => scalar path($h{filename})->slurp, protocol => $scheme, }; } else { return { type => 'file', filename => $h{filename}, path => path($h{filename})->absolute->stringify, protocol => $scheme, }; } } # elsif($scheme eq 'ftp') # { # if($url =~ m{/$}) # { # my($stdout, $stderr) = $self->_execute($build, $self->curl_command, -l => $url); # chomp $stdout; # return { # type => 'list', # list => [ # map { { filename => $_, url => "$url$_" } } sort split /\n/, $stdout, # ], # }; # } # # my $first_error; # # { # local $CWD = tempdir( CLEANUP => 1 ); # # my($filename) = $url =~ m{/([^/]+)$}; # $filename = 'unknown' if (! defined $filename) || ($filename eq ''); # my($stdout, $stderr) = eval { $self->_execute($build, $self->curl_command, -o => $filename, $url) }; # $first_error = $@; # if($first_error eq '') # { # return { # type => 'file', # filename => $filename, # path => path($filename)->absolute->stringify, # }; # } # } # # { # my($stdout, $stderr) = eval { $self->_execute($build, $self->curl_command, -l => "$url/") }; # if($@ eq '') # { # chomp $stdout; # return { # type => 'list', # list => [ # map { { filename => $_, url => "$url/$_" } } sort split /\n/, $stdout, # ], # }; # }; # } # # $first_error ||= 'unknown error'; # die $first_error; # # } else { die "scheme $scheme is not supported by the Fetch::CurlCommand plugin"; } }, ) if $self->curl_command; $self; } sub _execute { my($self, $build, @command) = @_; $build->log("+ @command"); my($stdout, $stderr, $err) = capture { system @command; $?; }; if($err) { chomp $stderr; $build->log($_) for split /\n/, $stderr; if($stderr =~ /Remote filename has no length/ && !!(any { /^-O$/ } @command)) { my @new_command = map { /^-O$/ ? ( -o => 'index.html' ) : /^-J$/ ? () : ($_) } @command; return $self->_execute($build, @new_command); } die "error in curl fetch"; } ($stdout, $stderr); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Fetch::CurlCommand - Plugin for fetching files using curl =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'https://www.openssl.org/source/'; plugin 'Fetch::CurlCommand'; }; =head1 DESCRIPTION This plugin provides a fetch based on the C command. It works with other fetch plugins (that is, the first one which succeeds will be used). Most of the time the best plugin to use will be L, but for some SSL bootstrapping it may be desirable to try C first. Protocols supported: C, C C support requires that curl was built with SSL support. =head1 PROPERTIES =head2 curl_command The full path to the C command. The default is usually correct. =head2 ssl Ignored by this plugin. Provided for compatibility with some other fetch plugins. =head1 METHODS =head2 protocol_ok my $bool = $plugin->protocol_ok($protocol); my $bool = Alien::Build::Plugin::Fetch::CurlCommand->protocol_ok($protocol); =head1 SEE ALSO =over 4 =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Fetch/HTTPTiny.pm000644 000000 000000 00000014320 14710030646 022620 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Fetch::HTTPTiny; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::Basename (); use Alien::Build::Util qw( _ssl_reqs ); use Carp (); # ABSTRACT: Plugin for fetching files using HTTP::Tiny our $VERSION = '2.84'; # VERSION has '+url' => ''; has ssl => 0; # ignored for compatability has bootstrap_ssl => 1; sub init { my($self, $meta) = @_; $meta->add_requires('share' => 'HTTP::Tiny' => '0.044' ); $meta->add_requires('share' => 'URI' => '0' ); $meta->add_requires('share' => 'Mozilla::CA' => '0' ); $meta->prop->{start_url} ||= $self->url; $self->url($meta->prop->{start_url}); $self->url || Carp::croak('url is a required property'); if($self->url =~ /^https:/ || $self->ssl) { my $reqs = _ssl_reqs; foreach my $mod (sort keys %$reqs) { $meta->add_requires('share' => $mod => $reqs->{$mod}); } } $meta->register_hook( fetch => sub { my($build, $url, %options) = @_; $url ||= $self->url; $url = URI->new($url) unless ref($url) && $url->isa('URI'); my %headers; if(my $headers = $options{http_headers}) { if(ref $headers eq 'ARRAY') { my @headers = @$headers; while(@headers) { my $key = shift @headers; my $value = shift @headers; unless(defined $key && defined $value) { $build->log("Fetch for $url with http_headers contains undef key or value"); next; } push @{ $headers{$key} }, $value; } } else { $build->log("Fetch for $url with http_headers that is not an array reference"); } } my $ua = HTTP::Tiny->new( agent => "Alien-Build/@{[ $Alien::Build::VERSION || 'dev' ]} ", verify_SSL => $build->download_rule =~ /encrypt/ ? 1 : 0, ); my $res = $ua->get($url, { headers => \%headers }); unless($res->{success}) { my $status = $res->{status} || '---'; my $reason = $res->{reason} || 'unknown'; $build->log("$status $reason fetching $url"); if($status == 599) { $build->log("exception: $_") for split /\n/, $res->{content}; my($can_ssl, $why_ssl) = HTTP::Tiny->can_ssl; if(! $can_ssl) { if($res->{redirects}) { foreach my $redirect (@{ $res->{redirects} }) { if(defined $redirect->{headers}->{location} && $redirect->{headers}->{location} =~ /^https:/) { $build->log("An attempt at a SSL URL https was made, but your HTTP::Tiny does not appear to be able to use https."); $build->log("Please see: https://metacpan.org/pod/Alien::Build::Manual::FAQ#599-Internal-Exception-errors-downloading-packages-from-the-internet"); } } } } } die "error fetching $url: $status $reason"; } my($type) = split /;/, $res->{headers}->{'content-type'}; $type = lc $type; my $base = URI->new($res->{url}); my $filename = File::Basename::basename do { my $name = $base->path; $name =~ s{/$}{}; $name }; # TODO: this doesn't get exercised by t/bin/httpd if(my $disposition = $res->{headers}->{"content-disposition"}) { # Note: from memory without quotes does not match the spec, # but many servers actually return this sort of value. if($disposition =~ /filename="([^"]+)"/ || $disposition =~ /filename=([^\s]+)/) { $filename = $1; } } if($type eq 'text/html') { return { type => 'html', base => $base->as_string, content => $res->{content}, protocol => $url->scheme, }; } else { return { type => 'file', filename => $filename || 'downloadedfile', content => $res->{content}, protocol => $url->scheme, }; } }); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Fetch::HTTPTiny - Plugin for fetching files using HTTP::Tiny =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'http://ftp.gnu.org/gnu/make'; plugin 'Fetch::HTTPTiny'; }; =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate fetch plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This fetch plugin fetches files and directory listings via the C and C protocol using L. If the URL specified uses the C scheme, then the required SSL modules will automatically be injected as requirements. If your initial URL is not C, but you know that it will be needed on a subsequent request you can use the ssl property below. =head1 PROPERTIES =head2 url The initial URL to fetch. This may be a directory listing (in HTML) or the final file. =head2 ssl If set to true, then the SSL modules required to make an C connection will be added as prerequisites. =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Fetch/LWP.pm000644 000000 000000 00000010411 14710030646 021634 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Fetch::LWP; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Carp (); # ABSTRACT: Plugin for fetching files using LWP our $VERSION = '2.84'; # VERSION has '+url' => ''; has ssl => 0; sub init { my($self, $meta) = @_; $meta->add_requires('share' => 'LWP::UserAgent' => 0 ); $meta->prop->{start_url} ||= $self->url; $self->url($meta->prop->{start_url}); $self->url || Carp::croak('url is a required property'); if($self->url =~ /^https:/ || $self->ssl) { $meta->add_requires('share' => 'LWP::Protocol::https' => 0 ); } $meta->register_hook( fetch => sub { my($build, $url, %options) = @_; $url ||= $self->url; my @headers; if(my $headers = $options{http_headers}) { if(ref $headers eq 'ARRAY') { @headers = @$headers; } else { $build->log("Fetch for $url with http_headers that is not an array reference"); } } my $ua = LWP::UserAgent->new; $ua->env_proxy; my $res = $ua->get($url, @headers); my($protocol) = $url =~ /^([a-z]+):/; die "error fetching $url: @{[ $res->status_line ]}" unless $res->is_success; my($type, $charset) = $res->content_type_charset; my $base = $res->base; my $filename = $res->filename; if($type eq 'text/html') { return { type => 'html', charset => $charset, base => "$base", content => $res->decoded_content || $res->content, protocol => $protocol, }; } elsif($type eq 'text/ftp-dir-listing') { return { type => 'dir_listing', base => "$base", content => $res->decoded_content || $res->content, protocol => $protocol, }; } else { return { type => 'file', filename => $filename || 'downloadedfile', content => $res->content, protocol => $protocol, }; } }); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Fetch::LWP - Plugin for fetching files using LWP =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'http://ftp.gnu.org/gnu/make'; plugin 'Fetch::LWP'; }; =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate fetch plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This fetch plugin fetches files and directory listings via the C C, C, C protocol using L. If the URL specified uses the C scheme, then the required SSL modules will automatically be injected as requirements. If your initial URL is not C, but you know that it will be needed on a subsequent request you can use the ssl property below. =head1 PROPERTIES =head2 url The initial URL to fetch. This may be a directory listing (in HTML) or the final file. =head2 ssl If set to true, then the SSL modules required to make an C connection will be added as prerequisites. =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Fetch/Local.pm000644 000000 000000 00000010263 14710030646 022231 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Fetch::Local; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::chdir; use Path::Tiny (); # ABSTRACT: Plugin for fetching a local file our $VERSION = '2.84'; # VERSION has '+url' => ''; has root => undef; has ssl => 0; sub init { my($self, $meta) = @_; $meta->prop->{start_url} ||= $self->url; $self->url($meta->prop->{start_url} || 'patch'); if($self->url =~ /^file:/) { $meta->add_requires('share' => 'URI' => 0 ); $meta->add_requires('share' => 'URI::file' => 0 ); $meta->add_requires('share' => 'URI::Escape' => 0 ); } { my $root = $self->root; if(defined $root) { $root = Path::Tiny->new($root)->absolute->stringify; } else { $root = "$CWD"; } $self->root($root); } $meta->register_hook( fetch => sub { my($build, $path, %options) = @_; $build->log("plugin Fetch::Local does not support http_headers option") if $options{http_headers}; $path ||= $self->url; if($path =~ /^file:/) { my $root = URI::file->new($self->root); my $url = URI->new_abs($path, $root); $path = URI::Escape::uri_unescape($url->path); $path =~ s{^/([a-z]:)}{$1}i if $^O eq 'MSWin32'; } $path = Path::Tiny->new($path)->absolute($self->root); if(-d $path) { return { type => 'list', protocol => 'file', list => [ map { { filename => $_->basename, url => $_->stringify } } sort { $a->basename cmp $b->basename } $path->children, ], }; } elsif(-f $path) { return { type => 'file', filename => $path->basename, path => $path->stringify, tmp => 0, protocol => 'file', }; } else { die "no such file or directory $path"; } }); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Fetch::Local - Plugin for fetching a local file =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'patch/libfoo-1.00.tar.gz'; plugin 'Fetch::Local'; }; =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate fetch plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This fetch plugin fetches files from the local file system. It is mostly useful if you intend to bundle packages (as tarballs or zip files) with your Alien. If you intend to bundle a source tree, use L. =head1 PROPERTIES =head2 url The initial URL to fetch. This may be a C style URL, or just the path on the local system. =head2 root The directory from which the URL should be relative. The default is usually reasonable. =head2 ssl This property is for compatibility with other fetch plugins, but is not used. =head1 SEE ALSO =over 4 =item L =item L =item L =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Fetch/LocalDir.pm000644 000000 000000 00000007565 14710030646 022703 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Fetch::LocalDir; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::chdir; use Path::Tiny (); # ABSTRACT: Plugin for fetching a local directory our $VERSION = '2.84'; # VERSION has root => undef; has ssl => 0; sub init { my($self, $meta) = @_; my $url = $meta->prop->{start_url} || 'patch'; $meta->add_requires('configure' => 'Alien::Build::Plugin::Fetch::LocalDir' => '0.72' ); if($url =~ /^file:/) { $meta->add_requires('share' => 'URI' => 0 ); $meta->add_requires('share' => 'URI::file' => 0 ); } { my $root = $self->root; if(defined $root) { $root = Path::Tiny->new($root)->absolute->stringify; } else { $root = "$CWD"; } $self->root($root); } $meta->register_hook( fetch => sub { my($build, $path, %options) = @_; $build->log("plugin Fetch::LocalDir does not support http_headers option") if $options{http_headers}; $path ||= $url; if($path =~ /^file:/) { my $root = URI::file->new($self->root); my $url = URI->new_abs($path, $root); $path = $url->path; $path =~ s{^/([a-z]:)}{$1}i if $^O eq 'MSWin32'; } $path = Path::Tiny->new($path)->absolute($self->root); if(-d $path) { return { type => 'file', filename => $path->basename, path => $path->stringify, tmp => 0, protocol => 'file', }; } else { $build->log("path $path is not a directory"); $build->log("(you specified $url with root @{[ $self->root ]})"); die "$path is not a directory"; } } ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Fetch::LocalDir - Plugin for fetching a local directory =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'patch/libfoo-1.00/'; plugin 'Fetch::LocalDir'; }; =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate fetch plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This fetch plugin fetches files from the local file system. It is mostly useful if you intend to bundle source with your Alien. If you are bundling tarballs see L. =head1 PROPERTIES =head2 root The directory from which the start URL should be relative. The default is usually reasonable. =head2 ssl This property is for compatibility with other fetch plugins, but is not used. =head1 SEE ALSO =over 4 =item L =item L =item L =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Fetch/NetFTP.pm000644 000000 000000 00000012767 14710030646 022312 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Fetch::NetFTP; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Carp (); use File::Temp (); use Path::Tiny qw( path ); # ABSTRACT: Plugin for fetching files using Net::FTP our $VERSION = '2.84'; # VERSION has '+url' => ''; has ssl => 0; has passive => 0; sub init { my($self, $meta) = @_; $meta->prop->{start_url} ||= $self->url; $self->url($meta->prop->{start_url}); $self->url || Carp::croak('url is a required property'); $meta->add_requires('share' => 'Net::FTP' => 0 ); $meta->add_requires('share' => 'URI' => 0 ); $meta->add_requires('share' => 'Alien::Build::Plugin::Fetch::NetFTP' => '0.61') if $self->passive; $meta->register_hook( fetch => sub { my($build, $url, %options) = @_; $url ||= $self->url; $build->log("plugin Fetch::NetFTP does not support http_headers option") if $options{http_headers}; $url = URI->new($url); die "Fetch::NetFTP does not support @{[ $url->scheme ]}" unless $url->scheme eq 'ftp'; $build->log("trying passive mode FTP first") if $self->passive; my $ftp = _ftp_connect($url, $self->passive); my $path = $url->path; unless($path =~ m!/$!) { my(@parts) = split /\//, $path; my $filename = pop @parts; my $dir = join '/', @parts; my $path = eval { $ftp->cwd($dir) or die; my $tdir = File::Temp::tempdir( CLEANUP => 1); my $path = path("$tdir/$filename")->stringify; unless(eval { $ftp->get($filename, $path) }) # NAT problem? try to use passive mode { $ftp->quit; $build->log("switching to @{[ $self->passive ? 'active' : 'passive' ]} mode"); $ftp = _ftp_connect($url, !$self->passive); $ftp->cwd($dir) or die; $ftp->get($filename, $path) or die; } $path; }; if(defined $path) { return { type => 'file', filename => $filename, path => $path, protocol => 'ftp', }; } $path .= "/"; } $ftp->quit; $ftp = _ftp_connect($url, $self->passive); $ftp->cwd($path) or die "unable to fetch $url as either a directory or file"; my $list = eval { $ftp->ls }; unless(defined $list) # NAT problem? try to use passive mode { $ftp->quit; $build->log("switching to @{[ $self->passive ? 'active' : 'passive' ]} mode"); $ftp = _ftp_connect($url, !$self->passive); $ftp->cwd($path) or die "unable to fetch $url as either a directory or file"; $list = $ftp->ls; die "cannot list directory $path on $url" unless defined $list; } die "no files found at $url" unless @$list; $path .= '/' unless $path =~ /\/$/; return { type => 'list', protocol => 'ftp', list => [ map { my $filename = $_; my $furl = $url->clone; $furl->path($path . $filename); my %h = ( filename => $filename, url => $furl->as_string, ); \%h; } sort @$list, ], }; }); $self; } sub _ftp_connect { my $url = shift; my $is_passive = shift || 0; my $ftp = Net::FTP->new( $url->host, Port =>$url->port, Passive =>$is_passive, ) or die "error fetching $url: $@"; $ftp->login($url->user, $url->password) or die "error on login $url: @{[ $ftp->message ]}"; $ftp->binary; $ftp; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Fetch::NetFTP - Plugin for fetching files using Net::FTP =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'ftp://ftp.gnu.org/gnu/make'; plugin 'Fetch::NetFTP'; }; =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate fetch plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This fetch plugin fetches files and directory listings via the C, protocol using L. =head1 PROPERTIES =head2 url The initial URL to fetch. This may be a directory or the final file. =head2 ssl This property is for compatibility with other fetch plugins, but is not used. =head2 passive If set to true, try passive mode FIRST. By default it will try an active mode, then passive mode. =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Fetch/Wget.pm000644 000000 000000 00000012344 14710030646 022107 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Fetch::Wget; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::Temp qw( tempdir ); use Path::Tiny qw( path ); use File::Which qw( which ); use Capture::Tiny qw( capture capture_merged ); use File::chdir; use List::Util qw( pairmap ); # ABSTRACT: Plugin for fetching files using wget our $VERSION = '2.84'; # VERSION sub _wget { my $wget = defined $ENV{WGET} ? which($ENV{WGET}) : which('wget'); return undef unless defined $wget; my $output = capture_merged { system $wget, '--help' }; # The wget that BusyBox implements does not follow that same interface # as GNU wget and may not check ssl certs which is not good. return undef if $output =~ /BusyBox/; return $wget; } has wget_command => sub { _wget() }; has ssl => 0; # when bootstrapping we have to specify this plugin as a prereq # 1 is the default so that when this plugin is used directly # you also get the prereq has bootstrap_ssl => 1; sub init { my($self, $meta) = @_; $meta->add_requires('configure', 'Alien::Build::Plugin::Fetch::Wget' => '1.19') if $self->bootstrap_ssl; $meta->register_hook( fetch => sub { my($build, $url, %options) = @_; $url ||= $meta->prop->{start_url}; my($scheme) = $url =~ /^([a-z0-9]+):/i; if($scheme eq 'http' || $scheme eq 'https') { local $CWD = tempdir( CLEANUP => 1 ); my @headers; if(my $headers = $options{http_headers}) { if(ref $headers eq 'ARRAY') { my @copy = @$headers; my %headers; while(@copy) { my $key = shift @copy; my $value = shift @copy; push @{ $headers{$key} }, $value; } @headers = pairmap { "--header=$a: @{[ join ', ', @$b ]}" } %headers; } else { $build->log("Fetch for $url with http_headers that is not an array reference"); } } my($stdout, $stderr) = $self->_execute( $build, $self->wget_command, '-k', '--content-disposition', '-S', @headers, $url, ); my($path) = path('.')->children; die "no file found after wget" unless $path; my($type) = $stderr =~ /Content-Type:\s*(.*?)$/m; $type =~ s/;.*$// if $type; if($type eq 'text/html') { return { type => 'html', base => $url, content => scalar $path->slurp, protocol => $scheme, }; } else { return { type => 'file', filename => $path->basename, path => $path->absolute->stringify, protocol => $scheme, }; } } else { die "scheme $scheme is not supported by the Fetch::Wget plugin"; } }, ) if $self->wget_command; } sub _execute { my($self, $build, @command) = @_; $build->log("+ @command"); my($stdout, $stderr, $err) = capture { system @command; $?; }; if($err) { chomp $stderr; $stderr = [split /\n/, $stderr]->[-1]; die "error in wget fetch: $stderr"; } ($stdout, $stderr); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Fetch::Wget - Plugin for fetching files using wget =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'https://www.openssl.org/source/'; plugin 'Fetch::Wget'; }; =head1 DESCRIPTION B: This plugin is somewhat experimental at this time. This plugin provides a fetch based on the C command. It works with other fetch plugins (that is, the first one which succeeds will be used). Most of the time the best plugin to use will be L, but for some SSL bootstrapping it may be desirable to try C first. Protocols supported: C, C =head1 PROPERTIES =head2 wget_command The full path to the C command. The default is usually correct. =head2 ssl Ignored by this plugin. Provided for compatibility with some other fetch plugins. =head1 SEE ALSO =over 4 =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Gather.pod000644 000000 000000 00000003311 14710030646 021522 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Gather # ABSTRACT: Gather Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Gather - Gather Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Gather::IsolateDynamic'; # just as an example =head1 DESCRIPTION Gather plugins enhance L recipes at the gather stage, either during a C or C install. =over 4 =item L Isolate dynamic libraries (C<.so>, <.DLL> or <.dylib>) so that they aren't used by XS. =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Gather/000755 000000 000000 00000000000 14710030646 021020 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Gather/IsolateDynamic.pm000644 000000 000000 00000006505 14710030646 024271 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Gather::IsolateDynamic; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Path::Tiny (); use Alien::Build::Util qw( _destdir_prefix ); use File::Copy (); # ABSTRACT: Plugin to gather dynamic libraries into a separate directory our $VERSION = '2.84'; # VERSION sub init { my($self, $meta) = @_; # plugin was introduced in 0.42, but had a bug which was fixed in 0.48 $meta->add_requires('share' => 'Alien::Build::Plugin::Gather::IsolateDynamic' => '0.48' ); $meta->after_hook( gather_share => sub { my($build) = @_; $build->log("Isolating dynamic libraries ..."); my $install_root; if($build->meta_prop->{destdir}) { my $destdir = $ENV{DESTDIR}; $install_root = Path::Tiny->new(_destdir_prefix($ENV{DESTDIR}, $build->install_prop->{prefix})); } else { $install_root = Path::Tiny->new($build->install_prop->{stage}); } foreach my $dir (map { $install_root->child($_) } qw( bin lib )) { next unless -d $dir; foreach my $from ($dir->children) { next unless $from->basename =~ /\.so/ || $from->basename =~ /\.(dylib|bundle|la|dll|dll\.a)$/; my $to = $install_root->child('dynamic', $from->basename); $to->parent->mkpath; unlink "$to" if -e $to; $build->log("move @{[ $from->parent->basename ]}/@{[ $from->basename ]} => dynamic/@{[ $to->basename ]}"); File::Copy::move("$from", "$to") || die "unable to move $from => $to $!"; } } $build->log(" Done!"); }, ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Gather::IsolateDynamic - Plugin to gather dynamic libraries into a separate directory =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Gather::IsolateDynamic'; =head1 DESCRIPTION This plugin moves dynamic libraries from the C and C directories and puts them in their own C directory. This allows them to be used by FFI modules, but to be ignored by XS modules. This plugin provides the equivalent functionality of the C attribute from L. =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/PkgConfig.pod000644 000000 000000 00000004311 14710030646 022160 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::PkgConfig # ABSTRACT: PkgConfig Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::PkgConfig - PkgConfig Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'PkgConfig' => ( pkg_name => 'foo', ); =head1 DESCRIPTION PkgConfig plugins use C or a compatible library to retrieve flags at probe and gather stages. =over 4 =item L Use the command-line C or C to get compiler and linker flags. =item L Use the XS L to get compiler and linker flags. =item L Convert .pc file to use static linkage by default. =item L Choose the best plugin to do C work. The best choice is typically platform and configuration dependent. =item L Use the pure-perl L to get compiler and linker flags. =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/PkgConfig/000755 000000 000000 00000000000 14710030646 021455 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/PkgConfig/CommandLine.pm000644 000000 000000 00000016332 14710030646 024206 0ustar00rootroot000000 000000 package Alien::Build::Plugin::PkgConfig::CommandLine; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Carp (); # ABSTRACT: Probe system and determine library or tool properties using the pkg-config command line interface our $VERSION = '2.84'; # VERSION has '+pkg_name' => sub { Carp::croak "pkg_name is a required property"; }; # NOT used, for compat with other PkgConfig plugins has register_prereqs => 1; sub _bin_name { # We prefer pkgconf to pkg-config because it seems to be the future. require File::Which; File::Which::which($ENV{PKG_CONFIG}) ? $ENV{PKG_CONFIG} : File::Which::which('pkgconf') ? 'pkgconf' : File::Which::which('pkg-config') ? 'pkg-config' : undef; }; has bin_name => \&_bin_name; has atleast_version => undef; has exact_version => undef; has max_version => undef; has minimum_version => undef; sub _val { my($build, $args, $prop_name) = @_; my $string = $args->{out}; chomp $string; $string =~ s{^\s+}{}; if($prop_name =~ /version$/) { $string =~ s{\s*$}{} } else { $string =~ s{\s*$}{ } } if($prop_name =~ /^(.*?)\.(.*?)\.(.*?)$/) { $build->runtime_prop->{$1}->{$2}->{$3} = $string } else { $build->runtime_prop->{$prop_name} = $string } (); } sub available { !!_bin_name(); } sub init { my($self, $meta) = @_; my @probe; my @gather; my $pkgconf = $self->bin_name; unless(defined $meta->prop->{env}->{PKG_CONFIG}) { $meta->prop->{env}->{PKG_CONFIG} = $pkgconf; } my($pkg_name, @alt_names) = (ref $self->pkg_name) ? (@{ $self->pkg_name }) : ($self->pkg_name); push @probe, map { [$pkgconf, '--exists', $_] } ($pkg_name, @alt_names); if(defined $self->minimum_version) { push @probe, [ $pkgconf, '--atleast-version=' . $self->minimum_version, $pkg_name ]; } elsif(defined $self->atleast_version) { push @probe, [ $pkgconf, '--atleast-version=' . $self->atleast_version, $pkg_name ]; } if(defined $self->exact_version) { push @probe, [ $pkgconf, '--exact-version=' . $self->exact_version, $pkg_name ]; } if(defined $self->max_version) { push @probe, [ $pkgconf, '--max-version=' . $self->max_version, $pkg_name ]; } push @probe, [ $pkgconf, '--modversion', $pkg_name, sub { my($build, $args) = @_; my $version = $args->{out}; $version =~ s{^\s+}{}; $version =~ s{\s*$}{}; $build->hook_prop->{version} = $version; }]; unshift @probe, sub { my($build) = @_; $build->runtime_prop->{legacy}->{name} ||= $pkg_name; $build->hook_prop->{probe_class} = __PACKAGE__; $build->hook_prop->{probe_instance_id} = $self->instance_id; }; $meta->register_hook( probe => \@probe ); push @gather, sub { my($build) = @_; die 'pkg-config command line probe does not match gather' if $build->hook_prop->{name} eq 'gather_system' && ($build->install_prop->{system_probe_instance_id} || '') ne $self->instance_id; }; push @gather, map { [ $pkgconf, '--exists', $_] } ($pkg_name, @alt_names); foreach my $prop_name (qw( cflags libs version )) { my $flag = $prop_name eq 'version' ? '--modversion' : "--$prop_name"; push @gather, [ $pkgconf, $flag, $pkg_name, sub { _val @_, $prop_name } ]; if(@alt_names) { foreach my $alt ($pkg_name, @alt_names) { push @gather, [ $pkgconf, $flag, $alt, sub { _val @_, "alt.$alt.$prop_name" } ]; } } } foreach my $prop_name (qw( cflags libs )) { push @gather, [ $pkgconf, '--static', "--$prop_name", $pkg_name, sub { _val @_, "${prop_name}_static" } ]; if(@alt_names) { foreach my $alt ($pkg_name, @alt_names) { push @gather, [ $pkgconf, '--static', "--$prop_name", $alt, sub { _val @_, "alt.$alt.${prop_name}_static" } ]; } } } $meta->register_hook(gather_system => [@gather]); if($meta->prop->{platform}->{system_type} eq 'windows-mingw') { @gather = map { if(ref $_ eq 'ARRAY') { my($pkgconf, @rest) = @$_; [$pkgconf, '--dont-define-prefix', @rest], } else { $_ } } @gather; } $meta->register_hook(gather_share => [@gather]); $meta->after_hook( $_ => sub { my($build) = @_; if(keys %{ $build->runtime_prop->{alt} } < 2) { delete $build->runtime_prop->{alt}; } }, ) for qw( gather_system gather_share ); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::PkgConfig::CommandLine - Probe system and determine library or tool properties using the pkg-config command line interface =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'PkgConfig::CommandLine' => ( pkg_name => 'libfoo', ); =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate fetch plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This plugin provides Probe and Gather steps for pkg-config based packages. It uses the best command line tools to accomplish this task. =head1 PROPERTIES =head2 pkg_name The package name. If this is a list reference then .pc files with all those package names must be present. The first name will be the primary and used by default once installed. For the subsequent C<.pc> files you can use the L to retrieve the alternate configurations once the L is installed. =head2 atleast_version The minimum required version that is acceptable version as provided by the system. =head2 exact_version The exact required version that is acceptable version as provided by the system. =head2 max_version The max required version that is acceptable version as provided by the system. =head2 minimum_version Alias for C for backward compatibility. =head1 METHODS =head2 available my $bool = Alien::Build::Plugin::PkgConfig::CommandLine->available; Returns true if the necessary prereqs for this plugin are I installed. =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/PkgConfig/LibPkgConf.pm000644 000000 000000 00000016747 14710030646 024010 0ustar00rootroot000000 000000 package Alien::Build::Plugin::PkgConfig::LibPkgConf; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Carp (); # ABSTRACT: Probe system and determine library or tool properties using PkgConfig::LibPkgConf our $VERSION = '2.84'; # VERSION has '+pkg_name' => sub { Carp::croak "pkg_name is a required property"; }; has atleast_version => undef; has exact_version => undef; has max_version => undef; has minimum_version => undef; # private for now, used by negotiator has register_prereqs => 1; use constant _min_version => '0.04'; sub available { !!eval { require PkgConfig::LibPkgConf; PkgConfig::LibPkgConf->VERSION(_min_version) }; } sub init { my($self, $meta) = @_; unless(defined $meta->prop->{env}->{PKG_CONFIG}) { # TODO: this doesn't yet find pkgconf in the bin dir of a share # install. my $command_line = File::Which::which('pkgconf') ? 'pkgconf' : File::Which::which('pkg-config') ? 'pkg-config' : undef; $meta->prop->{env}->{PKG_CONFIG} = $command_line if defined $command_line; } if($self->register_prereqs) { # Also update in Neotiate.pm $meta->add_requires('configure' => 'PkgConfig::LibPkgConf::Client' => _min_version); if(defined $self->minimum_version || defined $self->atleast_version || defined $self->exact_version || defined $self->max_version) { $meta->add_requires('configure' => 'PkgConfig::LibPkgConf::Util' => _min_version); } } my($pkg_name, @alt_names) = (ref $self->pkg_name) ? (@{ $self->pkg_name }) : ($self->pkg_name); $meta->register_hook( probe => sub { my($build) = @_; $build->runtime_prop->{legacy}->{name} ||= $pkg_name; $build->hook_prop->{probe_class} = __PACKAGE__; $build->hook_prop->{probe_instance_id} = $self->instance_id; require PkgConfig::LibPkgConf::Client; my $client = PkgConfig::LibPkgConf::Client->new; my $pkg = $client->find($pkg_name); die "package $pkg_name not found" unless $pkg; $build->hook_prop->{version} = $pkg->version; my $atleast_version = $self->atleast_version; $atleast_version = $self->minimum_version unless defined $self->atleast_version; if($atleast_version) { require PkgConfig::LibPkgConf::Util; if(PkgConfig::LibPkgConf::Util::compare_version($pkg->version, $atleast_version) < 0) { die "package $pkg_name is version @{[ $pkg->version ]}, but at least $atleast_version is required."; } } if($self->exact_version) { require PkgConfig::LibPkgConf::Util; if(PkgConfig::LibPkgConf::Util::compare_version($pkg->version, $self->exact_version) != 0) { die "package $pkg_name is version @{[ $pkg->version ]}, but exactly @{[ $self->exact_version ]} is required."; } } if($self->max_version) { require PkgConfig::LibPkgConf::Util; if(PkgConfig::LibPkgConf::Util::compare_version($pkg->version, $self->max_version) > 0) { die "package $pkg_name is version @{[ $pkg->version ]}, but max @{[ $self->max_version ]} is required."; } } foreach my $alt (@alt_names) { my $pkg = $client->find($alt); die "package $alt not found" unless $pkg; } 'system'; }, ); $meta->register_hook( $_ => sub { my($build) = @_; return if $build->hook_prop->{name} eq 'gather_system' && ($build->install_prop->{system_probe_instance_id} || '') ne $self->instance_id; require PkgConfig::LibPkgConf::Client; my $client = PkgConfig::LibPkgConf::Client->new; foreach my $name ($pkg_name, @alt_names) { my $pkg = $client->find($name); die "reload of package $name failed" unless defined $pkg; my %prop; $prop{version} = $pkg->version; $prop{cflags} = $pkg->cflags; $prop{libs} = $pkg->libs; $prop{cflags_static} = $pkg->cflags_static; $prop{libs_static} = $pkg->libs_static; $build->runtime_prop->{alt}->{$name} = \%prop; } foreach my $key (keys %{ $build->runtime_prop->{alt}->{$pkg_name} }) { $build->runtime_prop->{$key} = $build->runtime_prop->{alt}->{$pkg_name}->{$key}; } if(keys %{ $build->runtime_prop->{alt} } == 1) { delete $build->runtime_prop->{alt}; } }, ) for qw( gather_system gather_share ); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::PkgConfig::LibPkgConf - Probe system and determine library or tool properties using PkgConfig::LibPkgConf =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'PkgConfig::LibPkgConf' => ( pkg_name => 'libfoo', ); =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate fetch plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This plugin provides Probe and Gather steps for pkg-config based packages. It uses L to accomplish this task. This plugin is part of the Alien::Build core For Now, but may be removed in a future date. While It Seemed Like A Good Idea at the time, it may not be appropriate to keep it in core. If it is spun off it will get its own distribution some time in the future. =head1 PROPERTIES =head2 pkg_name The package name. If this is a list reference then .pc files with all those package names must be present. The first name will be the primary and used by default once installed. For the subsequent C<.pc> files you can use the L to retrieve the alternate configurations once the L is installed. =head2 atleast_version The minimum required version that is acceptable version as provided by the system. =head2 exact_version The exact required version that is acceptable version as provided by the system. =head2 max_version The max required version that is acceptable version as provided by the system. =head2 minimum_version Alias for C for backward compatibility. =head1 METHODS =head2 available my $bool = Alien::Build::Plugin::PkgConfig::LibPkgConf->available; Returns true if the necessary prereqs for this plugin are I installed. =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/PkgConfig/MakeStatic.pm000644 000000 000000 00000006547 14710030646 024054 0ustar00rootroot000000 000000 package Alien::Build::Plugin::PkgConfig::MakeStatic; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Path::Tiny (); # ABSTRACT: Convert .pc files into static our $VERSION = '2.84'; # VERSION has path => undef; sub _convert { my($self, $build, $path) = @_; die "unable to read $path" unless -r $path; die "unable to write $path" unless -w $path; $build->log("converting $path to static"); my %h = map { my($key, $value) = /^(.*?):(.*?)$/; $value =~ s{^\s+}{}; $value =~ s{\s+$}{}; ($key => $value); } grep /^(?:Libs|Cflags)(?:\.private)?:/, $path->lines; $h{Cflags} = '' unless defined $h{Cflags}; $h{Libs} = '' unless defined $h{Libs}; $h{Cflags} .= ' ' . $h{"Cflags.private"} if defined $h{"Cflags.private"}; $h{Libs} .= ' ' . $h{"Libs.private"} if defined $h{"Libs.private"}; $h{"Cflags.private"} = ''; $h{"Libs.private"} = ''; $path->edit_lines(sub { if(/^(.*?):/) { my $key = $1; if(defined $h{$key}) { s/^(.*?):.*$/$1: $h{$key} /; delete $h{$key}; } } }); $path->append("$_: $h{$_}\n") foreach keys %h; } sub _recurse { my($self, $build, $dir) = @_; foreach my $child ($dir->children) { if(-d $child) { $self->_recurse($build, $child); } elsif($child->basename =~ /\.pc$/) { $self->_convert($build, $child); } } } sub init { my($self, $meta) = @_; $meta->add_requires('configure' => 'Alien::Build::Plugin::Build::SearchDep' => '0.35'); $meta->before_hook( gather_share => sub { my($build) = @_; if($self->path) { $self->_convert($build, Path::Tiny->new($self->path)->absolute); } else { $self->_recurse($build, Path::Tiny->new(".")->absolute); } }, ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::PkgConfig::MakeStatic - Convert .pc files into static =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'PkgConfig::MakeStatic' => ( path => 'lib/pkgconfig/foo.pc', ); =head1 DESCRIPTION Convert C<.pc> file to use static linkage by default. This is an experimental plugin, so use with caution. =head1 PROPERTIES =head2 path The path to the C<.pc> file. If not provided, all C<.pc> files in the stage directory will be converted. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/PkgConfig/Negotiate.pm000644 000000 000000 00000012523 14710030646 023735 0ustar00rootroot000000 000000 package Alien::Build::Plugin::PkgConfig::Negotiate; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Alien::Build::Plugin::PkgConfig::PP; use Alien::Build::Plugin::PkgConfig::LibPkgConf; use Alien::Build::Plugin::PkgConfig::CommandLine; use Alien::Build::Util qw( _perl_config ); use Carp (); # ABSTRACT: Package configuration negotiation plugin our $VERSION = '2.84'; # VERSION has '+pkg_name' => sub { Carp::croak "pkg_name is a required property"; }; has atleast_version => undef; has exact_version => undef; has max_version => undef; has minimum_version => undef; sub pick { my($class) = @_; return $ENV{ALIEN_BUILD_PKG_CONFIG} if $ENV{ALIEN_BUILD_PKG_CONFIG}; if(Alien::Build::Plugin::PkgConfig::LibPkgConf->available) { return 'PkgConfig::LibPkgConf'; } if(Alien::Build::Plugin::PkgConfig::CommandLine->available) { # TODO: determine environment or flags necessary for using pkg-config # on solaris 64 bit. # Some advice on pkg-config and 64 bit Solaris # https://docs.oracle.com/cd/E53394_01/html/E61689/gplhi.html my $is_solaris64 = (_perl_config('osname') eq 'solaris' && _perl_config('ptrsize') == 8); # PkgConfig.pm is more reliable on windows my $is_windows = _perl_config('osname') eq 'MSWin32'; if(!$is_solaris64 && !$is_windows) { return 'PkgConfig::CommandLine'; } } if(Alien::Build::Plugin::PkgConfig::PP->available) { return 'PkgConfig::PP'; } else { # this is a fata error. because we check for a pkg-config implementation # at configure time, we expect at least one of these to work. (and we # fallback on installing PkgConfig.pm as a prereq if nothing else is avail). # we therefore expect at least one of these to work, if not, then the configuration # of the system has shifted from underneath us. Carp::croak("Could not find an appropriate pkg-config or pkgconf implementation, please install PkgConfig.pm, PkgConfig::LibPkgConf, pkg-config or pkgconf"); } } sub init { my($self, $meta) = @_; my $plugin = $self->pick; Alien::Build->log("Using PkgConfig plugin: $plugin"); if(ref($self->pkg_name) eq 'ARRAY') { $meta->add_requires('configure', 'Alien::Build::Plugin::PkgConfig::Negotiate' => '0.79'); } if($self->atleast_version || $self->exact_version || $self->max_version) { $meta->add_requires('configure', 'Alien::Build::Plugin::PkgConfig::Negotiate' => '1.53'); } my @args; push @args, pkg_name => $self->pkg_name; push @args, register_prereqs => 0; foreach my $method (map { "${_}_version" } qw( minimum atleast exact max )) { push @args, $method => $self->$method if defined $self->$method; } $meta->apply_plugin($plugin, @args); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::PkgConfig::Negotiate - Package configuration negotiation plugin =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'PkgConfig' => ( pkg_name => 'libfoo', ); =head1 DESCRIPTION This plugin provides Probe and Gather steps for pkg-config based packages. It picks the best C plugin depending your platform and environment. =head1 PROPERTIES =head2 pkg_name The package name. If this is a list reference then .pc files with all those package names must be present. The first name will be the primary and used by default once installed. For the subsequent C<.pc> files you can use the L to retrieve the alternate configurations once the L is installed. =head2 atleast_version The minimum required version that is acceptable version as provided by the system. =head2 exact_version The exact required version that is acceptable version as provided by the system. =head2 max_version The max required version that is acceptable version as provided by the system. =head2 minimum_version Alias for C for backward compatibility. =head1 METHODS =head2 pick my $name = Alien::Build::Plugin::PkgConfig::Negotiate->pick; Returns the name of the negotiated plugin. =head1 ENVIRONMENT =over 4 =item ALIEN_BUILD_PKG_CONFIG If set, this plugin will be used instead of the build in logic which attempts to automatically pick the best plugin. =back =head1 SEE ALSO L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/PkgConfig/PP.pm000644 000000 000000 00000017543 14710030646 022344 0ustar00rootroot000000 000000 package Alien::Build::Plugin::PkgConfig::PP; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Carp (); use File::Which (); use Env qw( @PKG_CONFIG_PATH ); # ABSTRACT: Probe system and determine library or tool properties using PkgConfig.pm our $VERSION = '2.84'; # VERSION has '+pkg_name' => sub { Carp::croak "pkg_name is a required property"; }; has atleast_version => undef; has exact_version => undef; has max_version => undef; has minimum_version => undef; use constant _min_version => '0.14026'; # private for now, used by negotiator has register_prereqs => 1; sub available { !!eval { require PkgConfig; PkgConfig->VERSION(_min_version) }; } sub _cleanup { my($value) = @_; $value =~ s{\s*$}{ }; $value; } sub init { my($self, $meta) = @_; unless(defined $meta->prop->{env}->{PKG_CONFIG}) { # TODO: Better would be to to "execute" lib/PkgConfig.pm # as that should always be available, and will match the # exact version of PkgConfig.pm that we are using here. # there are a few corner cases to deal with before we # can do this. What is here should handle most use cases. my $command_line = File::Which::which('ppkg-config') ? 'ppkg-config' : File::Which::which('pkg-config.pl') ? 'pkg-config.pl' : File::Which::which('pkg-config') ? 'pkg-config' : undef; $meta->prop->{env}->{PKG_CONFIG} = $command_line if defined $command_line; } if($self->register_prereqs) { $meta->add_requires('configure' => 'PkgConfig' => _min_version); } my($pkg_name, @alt_names) = (ref $self->pkg_name) ? (@{ $self->pkg_name }) : ($self->pkg_name); $meta->register_hook( probe => sub { my($build) = @_; $build->runtime_prop->{legacy}->{name} ||= $pkg_name; $build->hook_prop->{probe_class} = __PACKAGE__; $build->hook_prop->{probe_instance_id} = $self->instance_id; require PkgConfig; my $pkg = PkgConfig->find($pkg_name); die "package @{[ $pkg_name ]} not found" if $pkg->errmsg; $build->hook_prop->{version} = $pkg->pkg_version; my $version = PkgConfig::Version->new($pkg->pkg_version); my $atleast_version = $self->atleast_version; $atleast_version = $self->minimum_version unless defined $atleast_version; if(defined $atleast_version) { my $need = PkgConfig::Version->new($atleast_version); if($version < $need) { die "package @{[ $pkg_name ]} is @{[ $pkg->pkg_version ]}, but at least $atleast_version is required."; } } if(defined $self->exact_version) { my $need = PkgConfig::Version->new($self->exact_version); if($version != $need) { die "package @{[ $pkg_name ]} is @{[ $pkg->pkg_version ]}, but exactly @{[ $self->exact_version ]} is required."; } } if(defined $self->max_version) { my $need = PkgConfig::Version->new($self->max_version); if($version > $need) { die "package @{[ $pkg_name ]} is @{[ $pkg->pkg_version ]}, but max of @{[ $self->max_version ]} is required."; } } foreach my $alt (@alt_names) { my $pkg = PkgConfig->find($alt); die "package $alt not found" if $pkg->errmsg; } 'system'; }, ); $meta->register_hook( $_ => sub { my($build) = @_; return if $build->hook_prop->{name} eq 'gather_system' && ($build->install_prop->{system_probe_instance_id} || '') ne $self->instance_id; require PkgConfig; foreach my $name ($pkg_name, @alt_names) { require PkgConfig; my $pkg = PkgConfig->find($name, search_path => [@PKG_CONFIG_PATH]); if($pkg->errmsg) { $build->log("Trying to load the pkg-config information from the source code build"); $build->log("of your package failed"); $build->log("You are currently using the pure-perl implementation of pkg-config"); $build->log("(AB Plugin is named PkgConfig::PP, which uses PkgConfig.pm"); $build->log("It may work better with the real pkg-config."); $build->log("Try installing your OS' version of pkg-config or unset ALIEN_BUILD_PKG_CONFIG"); die "second load of PkgConfig.pm @{[ $name ]} failed: @{[ $pkg->errmsg ]}" } my %prop; $prop{cflags} = _cleanup scalar $pkg->get_cflags; $prop{libs} = _cleanup scalar $pkg->get_ldflags; $prop{version} = $pkg->pkg_version; $pkg = PkgConfig->find($name, static => 1, search_path => [@PKG_CONFIG_PATH]); $prop{cflags_static} = _cleanup scalar $pkg->get_cflags; $prop{libs_static} = _cleanup scalar $pkg->get_ldflags; $build->runtime_prop->{alt}->{$name} = \%prop; } foreach my $key (keys %{ $build->runtime_prop->{alt}->{$pkg_name} }) { $build->runtime_prop->{$key} = $build->runtime_prop->{alt}->{$pkg_name}->{$key}; } if(keys %{ $build->runtime_prop->{alt} } == 1) { delete $build->runtime_prop->{alt}; } } ) for qw( gather_system gather_share ); $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::PkgConfig::PP - Probe system and determine library or tool properties using PkgConfig.pm =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'PkgConfig::PP' => ( pkg_name => 'libfoo', ); =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate fetch plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This plugin provides Probe and Gather steps for pkg-config based packages. It uses L to accomplish this task. =head1 PROPERTIES =head2 pkg_name The package name. If this is a list reference then .pc files with all those package names must be present. The first name will be the primary and used by default once installed. For the subsequent C<.pc> files you can use the L to retrieve the alternate configurations once the L is installed. =head2 atleast_version The minimum required version that is acceptable version as provided by the system. =head2 exact_version The exact required version that is acceptable version as provided by the system. =head2 max_version The max required version that is acceptable version as provided by the system. =head2 minimum_version Alias for C for backward compatibility. =head1 METHODS =head2 available my $bool = Alien::Build::Plugin::PkgConfig::PP->available; Returns true if the necessary prereqs for this plugin are I installed. =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Prefer.pod000644 000000 000000 00000003751 14710030646 021543 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Prefer # ABSTRACT: Prefer Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Prefer - Prefer Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; share { start_url 'http://ftp.gnu.org/gnu/make'; plugin 'Download'; }; =head1 DESCRIPTION Prefer plugins sort Decode plugins decode HTML and FTP file listings. Normally you will want to use the L plugin which will automatically load the appropriate Prefer plugins. =over 4 =item L Filter out known bad versions from a candidate list. =item L Require specific known good versions from a candidate list. =item L Sort candidates by version. =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Prefer/000755 000000 000000 00000000000 14710030646 021031 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Prefer/BadVersion.pm000644 000000 000000 00000010223 14710030646 023421 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Prefer::BadVersion; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Carp (); # ABSTRACT: Plugin to filter out known bad versions our $VERSION = '2.84'; # VERSION has '+filter' => sub { Carp::croak("The filter property is required for the Prefer::BadVersion plugin") }; sub init { my($self, $meta) = @_; $meta->add_requires('configure', __PACKAGE__, '1.05'); my $filter; if(ref($self->filter) eq '') { my $string = $self->filter; $filter = sub { my($file) = @_; $file->{version} ne $string; }; } elsif(ref($self->filter) eq 'ARRAY') { my %filter = map { $_ => 1 } @{ $self->filter }; $filter = sub { my($file) = @_; ! $filter{$file->{version}}; }; } elsif(ref($self->filter) eq 'CODE') { my $code = $self->filter; $filter = sub { ! $code->($_[0]) }; } else { Carp::croak("unknown filter type for Prefer::BadVersion"); } $meta->around_hook( prefer => sub { my($orig, $build, @therest) = @_; my $res1 = $orig->($build, @therest); return $res1 unless $res1->{type} eq 'list'; return { type => 'list', list => [ grep { $filter->($_) } @{ $res1->{list} } ], }; }, ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Prefer::BadVersion - Plugin to filter out known bad versions =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Prefer::BadVersion' => '1.2.3'; =head1 DESCRIPTION This plugin allows you to easily filter out known bad versions of libraries in a share install. It doesn't affect a system install at all. You need a Prefer plugin that filters and sorts files first. You may specify the filter in one of three ways: =over =item as a string Filter out any files that match the given version. use alienfile; plugin 'Prefer::BadVersion' => '1.2.3'; =item as an array Filter out all files that match any of the given versions. use alienfile; plugin 'Prefer::BadVersion' => [ '1.2.3', '1.2.4' ]; =item as a code reference Filter out any files return a true value. use alienfile; plugin 'Prefer::BadVersion' => sub { my($file) = @_; $file->{version} eq '1.2.3'; # same as the string version above }; =back This plugin can also be used to filter out known bad versions of a library on just one platform. For example, if you know that version 1.2.3 if bad on windows, but okay on other platforms: use alienfile; plugin 'Prefer::BadVersion' => '1.2.3' if $^O eq 'MSWin32'; =head1 PROPERTIES =head2 filter Filter out entries that match the filter. =head1 CAVEATS If you are using the string or array mode, then you need an existing Prefer plugin that sets the version number for each file candidate, such as L. Unless you want to exclude the latest version from a share install, this plugin isn't really that useful. It has no effect on system installs, which may not be obvious at first. =head1 SEE ALSO =over 4 =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Prefer/GoodVersion.pm000644 000000 000000 00000010320 14710030646 023621 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Prefer::GoodVersion; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Carp (); # ABSTRACT: Plugin to filter known good versions our $VERSION = '2.84'; # VERSION has '+filter' => sub { Carp::croak("The filter property is required for the Prefer::GoodVersion plugin") }; sub init { my($self, $meta) = @_; $meta->add_requires('configure', __PACKAGE__, '1.44'); my $filter; if(ref($self->filter) eq '') { my $string = $self->filter; $filter = sub { my($file) = @_; $file->{version} eq $string; }; } elsif(ref($self->filter) eq 'ARRAY') { my %filter = map { $_ => 1 } @{ $self->filter }; $filter = sub { my($file) = @_; !! $filter{$file->{version}}; }; } elsif(ref($self->filter) eq 'CODE') { my $code = $self->filter; $filter = sub { !! $code->($_[0]) }; } else { Carp::croak("unknown filter type for Prefer::GoodVersion"); } $meta->around_hook( prefer => sub { my($orig, $build, @therest) = @_; my $res1 = $orig->($build, @therest); return $res1 unless $res1->{type} eq 'list'; return { type => 'list', list => [ grep { $filter->($_) } @{ $res1->{list} } ], }; }, ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Prefer::GoodVersion - Plugin to filter known good versions =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Prefer::GoodVersion' => '1.2.3'; =head1 DESCRIPTION This plugin allows you to specify one or more good versions of a library. This doesn't affect a system install at all. This plugin does the opposite of the C plugin. You need need a Prefer plugin that filters and sorts files first. You may specify the filter in one of three ways: =over =item as a string Filter any files that match the given version. use alienfile; plugin 'Prefer::GoodVersion' => '1.2.3'; =item as an array Filter all files that match any of the given versions. use alienfile; plugin 'Prefer::GoodVersion' => [ '1.2.3', '1.2.4' ]; =item as a code reference Filter any files return a true value. use alienfile; plugin 'Prefer::GoodVersion' => sub { my($file) = @_; $file->{version} eq '1.2.3'; # same as the string version above }; =back This plugin can also be used to filter known good versions of a library on just one platform. For example, if you know that version 1.2.3 if good on windows, but the default logic is fine on other platforms: use alienfile; plugin 'Prefer::GoodVersion' => '1.2.3' if $^O eq 'MSWin32'; =head1 PROPERTIES =head2 filter Filter entries that match the filter. =head1 CAVEATS If you are using the string or array mode, then you need an existing Prefer plugin that sets the version number for each file candidate, such as L. Unless you want to exclude the latest version from a share install, this plugin isn't really that useful. It has no effect on system installs, which may not be obvious at first. =head1 SEE ALSO =over 4 =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Prefer/SortVersions.pm000644 000000 000000 00000007147 14710030646 024060 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Prefer::SortVersions; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; # ABSTRACT: Plugin to sort candidates by most recent first our $VERSION = '2.84'; # VERSION has 'filter' => undef; has '+version' => qr/([0-9](?:[0-9\.]*[0-9])?)/; sub init { my($self, $meta) = @_; $meta->add_requires('share' => 'Sort::Versions' => 0); $meta->register_hook( prefer => sub { my(undef, $res) = @_; my $cmp = sub { my($A,$B) = map { ($_ =~ $self->version)[0] } @_; Sort::Versions::versioncmp($B,$A); }; my @list = sort { $cmp->($a->{filename}, $b->{filename}) } map { ($_->{version}) = $_->{filename} =~ $self->version; $_ } grep { $_->{filename} =~ $self->version } grep { defined $self->filter ? $_->{filename} =~ $self->filter : 1 } @{ $res->{list} }; return { type => 'list', list => \@list, }; }); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Prefer::SortVersions - Plugin to sort candidates by most recent first =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Prefer::SortVersions'; =head1 DESCRIPTION Note: in most case you will want to use L instead. It picks the appropriate fetch plugin based on your platform and environment. In some cases you may need to use this plugin directly instead. This Prefer plugin sorts the packages that were retrieved from a dir listing, either directly from a Fetch plugin, or from a Decode plugin. It Returns a listing with the items sorted from post preferable to least, and filters out any undesirable candidates. This plugin updates the file list to include the versions that are extracted, so they can be used by other plugins, such as L. =head1 PROPERTIES =head2 filter This is a regular expression that lets you filter out files that you do not want to consider downloading. For example, if the directory listing contained tarballs and readme files like this: foo-1.0.0.tar.gz foo-1.0.0.readme You could specify a filter of C to make sure only tarballs are considered for download. =head2 version Regular expression to parse out the version from a filename. The regular expression should store the result in C<$1>. The default C is frequently reasonable. =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Probe.pod000644 000000 000000 00000004473 14710030646 021371 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Probe # ABSTRACT: Probe Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Probe - Probe Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS look for libraries in known location: use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-I/opt/libfoo/include', libs => '-L/opt/libfoo/lib -lfoo', ); look for tools in the path: use alienfile; plugin 'Probe::CommandLine' => ( command => 'gzip', args => [ '--version' ], match => qr/gzip/, version => qr/gzip ([0-9\.]+)/, ); Use C for Visual C++ Perl: use alienfile; plugin 'Probe::Vcpkg' => 'libffi'; =head1 DESCRIPTION Probe plugins try to find existing libraries and tools I installed on the system. If found they can be used instead of downloading the source from the internet and building. =over 4 =item L Use L to probe for existing installed library. =item L Execute commands to probe for existing tools. =item L Use L to probe for existing installed library. =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Probe/000755 000000 000000 00000000000 14710030646 020655 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Probe/CBuilder.pm000644 000000 000000 00000015034 14710030646 022707 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Probe::CBuilder; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use File::chdir; use File::Temp (); use Capture::Tiny qw( capture_merged capture ); use Alien::Util qw( version_cmp ); # ABSTRACT: Probe for system libraries by guessing with ExtUtils::CBuilder our $VERSION = '2.84'; # VERSION has options => sub { {} }; has cflags => ''; has libs => ''; has program => 'int main(int argc, char *argv[]) { return 0; }'; has version => undef; has 'atleast_version' => undef; has aliens => []; has lang => 'C'; sub init { my($self, $meta) = @_; $meta->add_requires('configure' => 'ExtUtils::CBuilder' => 0 ); if(@{ $self->aliens }) { die "You can't specify both 'aliens' and either 'cflags' or 'libs' for the Probe::CBuilder plugin" if $self->cflags || $self->libs; $meta->add_requires('configure' => $_ => 0 ) for @{ $self->aliens }; $meta->add_requires('Alien::Build::Plugin::Probe::CBuilder' => '0.53'); my $cflags = ''; my $libs = ''; foreach my $alien (@{ $self->aliens }) { my $pm = "$alien.pm"; $pm =~ s/::/\//g; require $pm; $cflags .= $alien->cflags . ' '; $libs .= $alien->libs . ' '; } $self->cflags($cflags); $self->libs($libs); } my @cpp; if($self->lang ne 'C') { $meta->add_requires('Alien::Build::Plugin::Probe::CBuilder' => '0.53'); @cpp = ('C++' => 1) if $self->lang eq 'C++'; } $meta->register_hook( probe => sub { my($build) = @_; $build->hook_prop->{probe_class} = __PACKAGE__; $build->hook_prop->{probe_instance_id} = $self->instance_id; local $CWD = File::Temp::tempdir( CLEANUP => 1, DIR => $CWD ); open my $fh, '>', 'mytest.c'; print $fh $self->program; close $fh; $build->log("trying: cflags=@{[ $self->cflags ]} libs=@{[ $self->libs ]}"); my $cb = ExtUtils::CBuilder->new(%{ $self->options }); my($out1, $obj) = capture_merged { eval { $cb->compile( source => 'mytest.c', extra_compiler_flags => $self->cflags, @cpp, ); } }; if(my $error = $@) { $build->log("compile failed: $error"); $build->log("compile failed: $out1"); die $error; } my($out2, $exe) = capture_merged { eval { $cb->link_executable( objects => [$obj], extra_linker_flags => $self->libs, ); } }; if(my $error = $@) { $build->log("link failed: $error"); $build->log("link failed: $out2"); die $error; } my($out, $err, $ret) = capture { system($^O eq 'MSWin32' ? $exe : "./$exe") }; die "execute failed" if $ret; my $cflags = $self->cflags; my $libs = $self->libs; $cflags =~ s{\s*$}{ }; $libs =~ s{\s*$}{ }; $build->install_prop->{plugin_probe_cbuilder_gather}->{$self->instance_id} = { cflags => $cflags, libs => $libs, }; if(defined $self->version) { my($version) = $out =~ $self->version; if (defined $self->atleast_version) { if(version_cmp ($version, $self->atleast_version) < 0) { die "CBuilder probe found version $version, but at least @{[ $self->atleast_version ]} is required."; } } $build->hook_prop->{version} = $version; $build->install_prop->{plugin_probe_cbuilder_gather}->{$self->instance_id}->{version} = $version; } 'system'; } ); $meta->register_hook( gather_system => sub { my($build) = @_; return if $build->hook_prop->{name} eq 'gather_system' && ($build->install_prop->{system_probe_instance_id} || '') ne $self->instance_id; if(my $p = $build->install_prop->{plugin_probe_cbuilder_gather}->{$self->instance_id}) { $build->runtime_prop->{$_} = $p->{$_} for keys %$p; } }, ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Probe::CBuilder - Probe for system libraries by guessing with ExtUtils::CBuilder =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-I/opt/libfoo/include', libs => '-L/opt/libfoo/lib -lfoo', ); alternately: ues alienfile; plugin 'Probe::CBuilder' => ( aliens => [ 'Alien::libfoo', 'Alien::libbar' ], ); =head1 DESCRIPTION This plugin probes for compiler and linker flags using L. This is a useful alternative to L for packages that do not provide a pkg-config C<.pc> file, or for when those C<.pc> files may not be available. (For example, on FreeBSD, C is a core part of the operating system, but doesn't include a C<.pc> file which is usually provided when you install the C package on Linux). =head1 PROPERTIES =head2 options Any extra options that you want to have passed into the constructor to L. =head2 cflags The compiler flags. =head2 libs The linker flags =head2 program The program to use in the test. =head2 version This is a regular expression to parse the version out of the output from the test program. =head2 atleast_version The minimum required version as provided by the system. =head2 aliens List of aliens to query fro compiler and linker flags. =head2 lang The programming language to use. One of either C or C. =head1 SEE ALSO L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Probe/CommandLine.pm000644 000000 000000 00000012745 14710030646 023412 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Probe::CommandLine; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Carp (); use Capture::Tiny qw( capture ); use File::Which (); use Alien::Util qw( version_cmp ); # ABSTRACT: Probe for tools or commands already available our $VERSION = '2.84'; # VERSION has '+command' => sub { Carp::croak "@{[ __PACKAGE__ ]} requires command property" }; has 'args' => []; has 'secondary' => 0; has 'match' => undef; has 'match_stderr' => undef; has 'version' => undef; has 'version_stderr' => undef; has 'atleast_version' => undef; sub init { my($self, $meta) = @_; my $check = sub { my($build) = @_; unless(File::Which::which($self->command)) { die 'Command not found ' . $self->command; } if(defined $self->match || defined $self->match_stderr || defined $self->version || defined $self->version_stderr) { my($out,$err,$ret) = capture { system( $self->command, @{ $self->args } ); }; die 'Command did not return a true value' if $ret; die 'Command output did not match' if defined $self->match && $out !~ $self->match; die 'Command standard error did not match' if defined $self->match_stderr && $err !~ $self->match_stderr; if (defined $self->version or defined $self->version_stderr) { my $found_version = '0'; if(defined $self->version) { if($out =~ $self->version) { $found_version = $1; $build->runtime_prop->{version} = $found_version; } } if(defined $self->version_stderr) { if($err =~ $self->version_stderr) { $found_version = $1; $build->hook_prop->{version} = $found_version; $build->runtime_prop->{version} = $found_version; } } if (my $atleast_version = $self->atleast_version) { if(version_cmp ($found_version, $self->atleast_version) < 0) { # reset the versions $build->runtime_prop->{version} = undef; $build->hook_prop->{version} = undef; die "CommandLine probe found version $found_version, but at least $atleast_version is required."; } } } } $build->runtime_prop->{command} = $self->command; 'system'; }; if($self->secondary) { $meta->around_hook( probe => sub { my $orig = shift; my $build = shift; my $type = $orig->($build, @_); return $type unless $type eq 'system'; $check->($build); }, ); } else { $meta->register_hook( probe => $check, ); } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Probe::CommandLine - Probe for tools or commands already available =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Probe::CommandLine' => ( command => 'gzip', args => [ '--version' ], match => qr/gzip/, version => qr/gzip ([0-9\.]+)/, ); =head1 DESCRIPTION This plugin probes for the existence of the given command line program. =head1 PROPERTIES =head2 command The name of the command. =head2 args The arguments to pass to the command. =head2 secondary If you are using another probe plugin (such as L or L) to detect the existence of a library, but also need a program to exist, then you should set secondary to a true value. For example when you need both: use alienfile; # requires both liblzma library and xz program plugin 'PkgConfig' => 'liblzma'; plugin 'Probe::CommandLine' => ( command => 'xz', secondary => 1, ); When you don't: use alienfile; plugin 'Probe::CommandLine' => ( command => 'gzip', secondary => 0, # default ); =head2 match Regular expression for which the program output should match. =head2 match_stderr Regular expression for which the program standard error should match. =head2 version Regular expression to parse out the version from the program output. The regular expression should store the version number in C<$1>. =head2 version_stderr Regular expression to parse out the version from the program standard error. The regular expression should store the version number in C<$1>. =head2 atleast_version The minimum required version as provided by the system. =head1 SEE ALSO L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Probe/Vcpkg.pm000644 000000 000000 00000015405 14710030646 022272 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Probe::Vcpkg; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; # ABSTRACT: Probe for system libraries using Vcpkg our $VERSION = '2.84'; # VERSION has '+name'; has 'lib'; has 'ffi_name'; has 'include'; sub init { my($self, $meta) = @_; if(defined $self->include) { $meta->add_requires('configure' => 'Alien::Build::Plugin::Probe::Vcpkg' => '2.16' ); } elsif(defined $self->ffi_name) { $meta->add_requires('configure' => 'Alien::Build::Plugin::Probe::Vcpkg' => '2.14' ); } else { $meta->add_requires('configure' => 'Alien::Build::Plugin::Probe::Vcpkg' => '0' ); } if($meta->prop->{platform}->{compiler_type} eq 'microsoft') { $meta->register_hook( probe => sub { my($build) = @_; $build->hook_prop->{probe_class} = __PACKAGE__; $build->hook_prop->{probe_instance_id} = $self->instance_id; eval { require Win32::Vcpkg; require Win32::Vcpkg::List; require Win32::Vcpkg::Package; Win32::Vcpkg->VERSION('0.02'); }; if(my $error = $@) { $build->log("unable to load Win32::Vcpkg: $error"); return 'share'; } my $package; if($self->name) { $package = Win32::Vcpkg::List->new ->search($self->name, include => $self->include); } elsif($self->lib) { $package = eval { Win32::Vcpkg::Package->new( lib => $self->lib, include => $self->include) }; return 'share' if $@; } else { $build->log("you must provode either name or lib property for Probe::Vcpkg"); return 'share'; } my $version = $package->version; $version = 'unknown' unless defined $version; $build->install_prop->{plugin_probe_vcpkg}->{$self->instance_id} = { version => $version, cflags => $package->cflags, libs => $package->libs, }; $build->hook_prop->{version} = $version; $build->install_prop->{plugin_probe_vcpkg}->{$self->instance_id}->{ffi_name} = $self->ffi_name if defined $self->ffi_name; return 'system'; }, ); $meta->register_hook( gather_system => sub { my($build) = @_; return if $build->hook_prop->{name} eq 'gather_system' && ($build->install_prop->{system_probe_instance_id} || '') ne $self->instance_id; if(my $c = $build->install_prop->{plugin_probe_vcpkg}->{$self->instance_id}) { $build->runtime_prop->{version} = $c->{version} unless defined $build->runtime_prop->{version}; $build->runtime_prop->{$_} = $c->{$_} for grep { defined $c->{$_} } qw( cflags libs ffi_name ); } }, ); } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Probe::Vcpkg - Probe for system libraries using Vcpkg =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Probe::Vcpkg' => 'libffi'; =head1 DESCRIPTION This plugin probe can be used to find "system" packages using Microsoft's C package manager for Visual C++ builds of Perl. C is a package manager for Visual C++ that includes a number of open source packages. Although C does also support Linux and macOS, this plugin does not support finding C packages on those platforms. For more details on C, see the project github page here: L Here is the quick start guide for getting L to work with C: # install Vcpkg C:\> git clone https://github.com/Microsoft/vcpkg.git C:\> cd vcpkg C:\vcpkg> .\bootstrap-vcpkg.bat C:\vcpkg> .\vcpkg integrate install # update PATH to include the bin directory # so that .DLL files can be found by Perl C:\vcpkg> path c:\vcpkg\installed\x64-windows\bin;%PATH% # install the packages that you want C:\vcpkg> .\vcpkg install libffi # install the alien that uses it C:\vcpkg> cpanm Alien::FFI If you are using 32 bit build of Perl, then substitute C for C. If you do not want to add the C directory to the C, then you can use C instead, which will provide static libraries. (As of this writing static libraries for 32 bit Windows are not available). The main downside to using C is that Aliens that require dynamic libraries for FFI will not be installable. If you do not want to install C user wide (the C command above), then you can use the C environment variable instead: # install Vcpkg C:\> git clone https://github.com/Microsoft/vcpkg.git C:\> cd vcpkg C:\vcpkg> .\bootstrap-vcpkg.bat C:\vcpkg> set PERL_WIN32_VCPKG_ROOT=c:\vcpkg =head1 PROPERTIES =head2 name Specifies the name of the Vcpkg. This should not be used with the C property below, choose only one. This is the default property, so these two are equivalent: plugin 'Probe::Vcpkg' => (name => 'foo'); and plugin 'Probe::Vcpkg' => 'foo'; =head2 lib Specifies the list of libraries that make up the Vcpkg. This should not be used with the C property above, choose only one. Note that using this detection method, the version number of the package will not be automatically determined (since multiple packages could potentially make up the list of libraries), so you need to determine the version number another way if you need it. This must be an array reference. Do not include the C<.lib> extension. plugin 'Probe::Vcpkg' => (lib => ['foo','bar']); =head2 ffi_name Specifies an alternate ffi_name for finding dynamic libraries. =head1 SEE ALSO L, L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Test.pod000644 000000 000000 00000003257 14710030646 021240 0ustar00rootroot000000 000000 # PODNAME: Alien::Build::Plugin::Test # ABSTRACT: Probe Alien::Build plugins # VERSION __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Plugin::Test - Probe Alien::Build plugins =head1 VERSION version 2.84 =head1 SYNOPSIS use alienfile; plugin 'Test::Mock' => ( probe => 'share', download => 1, extract => 1, build => 1, gather => 1, ); =head1 DESCRIPTION Test plugins are used in unit tests for L and possibly its plugins. =over 4 =item L Mocks common steps in an L. =back =head1 SEE ALSO L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Plugin/Test/000755 000000 000000 00000000000 14710030646 020525 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Plugin/Test/Mock.pm000644 000000 000000 00000026471 14710030646 021766 0ustar00rootroot000000 000000 package Alien::Build::Plugin::Test::Mock; use strict; use warnings; use 5.008004; use Alien::Build::Plugin; use Carp (); use Path::Tiny (); use File::chdir; # ABSTRACT: Mock plugin for testing our $VERSION = '2.84'; # VERSION has 'probe'; has 'download'; has 'extract'; has 'build'; has 'gather'; has check_digest => 1; sub init { my($self, $meta) = @_; if(my $probe = $self->probe) { if($probe =~ /^(share|system)$/) { $meta->register_hook( probe => sub { $probe; }, ); } elsif($probe eq 'die') { $meta->register_hook( probe => sub { die "fail"; }, ); } else { Carp::croak("usage: plugin 'Test::Mock' => ( probe => $probe ); where $probe is one of share, system or die"); } } if(my $download = $self->download) { $download = { 'foo-1.00.tar.gz' => _tarball() } unless ref $download eq 'HASH'; $meta->register_hook( download => sub { my($build) = @_; _fs($build, $download, 1); }, ); } if(my $extract = $self->extract) { $extract = { 'foo-1.00' => { 'configure' => _tarball_configure(), 'foo.c' => _tarball_foo_c(), }, } unless ref $extract eq 'HASH'; $meta->register_hook( extract => sub { my($build) = @_; _fs($build, $extract); }, ); } if(my $build = $self->build) { $build = [ { 'foo.o', => _build_foo_o(), 'libfoo.a' => _build_libfoo_a(), }, { 'lib' => { 'libfoo.a' => _build_libfoo_a(), 'pkgconfig' => { 'foo.pc' => sub { my($build) = @_; "prefix=$CWD\n" . "exec_prefix=\${prefix}\n" . "libdir=\${prefix}/lib\n" . "includedir=\${prefix}/include\n" . "\n" . "Name: libfoo\n" . "Description: libfoo\n" . "Version: 1.0.0\n" . "Cflags: -I\${includedir}\n" . "Libs: -L\${libdir} -lfoo\n"; }, }, }, }, ] unless ref $build eq 'ARRAY'; my($build_dir, $install_dir) = @$build; $meta->register_hook( build => sub { my($build) = @_; _fs($build, $build_dir); local $CWD = $build->install_prop->{prefix}; _fs($build, $install_dir); }, ); } if(my $gather = $self->gather) { $meta->register_hook( $_ => sub { my($build) = @_; if(ref $gather eq 'HASH') { foreach my $key (keys %$gather) { $build->runtime_prop->{$key} = $gather->{$key}; } } else { my $prefix = $build->runtime_prop->{prefix}; $build->runtime_prop->{cflags} = "-I$prefix/include"; $build->runtime_prop->{libs} = "-L$prefix/lib -lfoo"; } }, ) for qw( gather_share gather_system ); } if(my $cd = $self->check_digest) { $meta->register_hook( check_digest => ref($cd) eq 'CODE' ? $cd : sub { my($build, $file, $algorithm, $digest) = @_; if($algorithm ne 'FOO92') { return 'FAKE'; } if($digest eq 'deadbeaf') { return 1; } else { die "Digest FAKE does not match: got deadbeaf, expected $digest"; } } ); $meta->register_hook( check_download => sub { my($build) = @_; my $path = $build->install_prop->{download}; if(defined $path) { $build->check_digest($path); } }, ); } } sub _fs { my($build, $hash, $download) = @_; foreach my $key (sort keys %$hash) { my $val = $hash->{$key}; if(ref $val eq 'HASH') { mkdir $key; local $CWD = $key; _fs($build,$val); } elsif(ref $val eq 'CODE') { my $path = Path::Tiny->new($key)->absolute; $path->spew_raw($val->($build)); if($download) { $build->install_prop->{download_detail}->{"$path"}->{protocol} = 'file'; $build->install_prop->{download_detail}->{"$path"}->{digest} = [ FAKE => 'deadbeaf' ]; } } elsif(defined $val) { my $path = Path::Tiny->new($key)->absolute; $path->spew_raw($val); if($download) { $build->install_prop->{download_detail}->{"$path"}->{protocol} = 'file'; $build->install_prop->{download_detail}->{"$path"}->{digest} = [ FAKE => 'deadbeaf' ]; } } } } sub _tarball { return unpack 'u', <<'EOF'; M'XL(`+DM@5@``^V4P4K$,!"&>YZGF-V]J*SM9#=)#RN^B'BHV;0)U`32U(OX M[D;0*LJREZVRF.\R?TA@)OS\TWI_S4JBJI@/(JJ%P%19+>AKG4"V)4Z;C922 M(;T=6(%BQIDFQB$V(8WB^]X.W>%WQ^[?_S'5,Z']\%]YU]IN#/KT/8[ZO^6? M_B=-C-=<%$BG'^4G_]S_U:)ZL*X:#(!6QN/26(Q&![W M'BD/DO/#^6W@)2^*3":3.3]>`:%LBYL`#@`` ` EOF } sub _tarball_configure { return unpack 'u', <<'EOF'; <(R$O8FEN+W-H"@IE8VAO(")H:2!T:&5R92(["@`` ` EOF } sub _tarball_foo_c { return unpack 'u', <<'EOF'; M(VEN8VQU9&4@/'-T9&EO+F@^"@II;G0*;6%I;BAI;G0@87)G8RP@8VAA'0`````````````7U]415A4```````````` M````````````"`````````#0`0``!`````````````````0`@``````````` M`````%]?8V]M<&%C=%]U;G=I;F1?7TQ$````````````````"``````````@ M`````````-@!```#````.`(```$````````"````````````````7U]E:%]F ME(``7@0`1`,!PB0`0``)````!P```"X____ M_____P@``````````$$.$(8"0PT&```````````````!```&`0````\!```` /``````````!?;6%I;@`` ` EOF } sub _build_libfoo_a { return unpack 'u', <<'EOF'; M(3QA ( probe => 'share', download => 1, extract => 1, build => 1, gather => 1, ); =head1 DESCRIPTION This plugin is used for testing L plugins. Usually you only want to test one or two phases in an L for your plugin, but you still have to have a fully formed L that contains all required phases. This plugin lets you fill in the other phases with the appropriate hooks. This is usually better than using real plugins which may pull in additional dynamic requirements that you do not want to rely on at test time. =head1 PROPERTIES =head2 probe plugin 'Test::Mock' => ( probe => $probe, ); Override the probe behavior by one of the following: =over =item share For a C build. =item system For a C build. =item die To throw an exception in the probe hook. This will usually cause L to try the next probe hook, if available, or to assume a C install. =back =head2 download plugin 'Test::Mock' => ( download => \%fs_spec, ); plugin 'Test::Mock' => ( download => 1, ); Mock out a download. The C<%fs_spec> is a hash where the hash values are directories and the string values are files. This a spec like this: plugin 'Test::Mock' => ( download => { 'foo-1.00' => { 'README.txt' => "something to read", 'foo.c' => "#include \n", "int main() {\n", " printf(\"hello world\\n\");\n", "}\n", } }, ); Would generate two files in the directory 'foo-1.00', a C and a C file named C. The default, if you provide a true non-hash value is to generate a single tarball with the name C. =head2 extract plugin 'Test::Mock' => ( extract => \%fs_spec, ); plugin 'Test::Mock' => ( extract => 1, ); Similar to C above, but for the C phase. =head2 build plugin 'Test::Mock' => ( build => [ \%fs_spec_build, \%fs_spec_install ], ); plugin 'Test::Mock' => ( build => 1, ); =head2 gather plugin 'Test::Mock' => ( gather => \%runtime_prop, ); plugin 'Test::Mock' => ( gather => 1, ); This adds a gather hook (for both C and C) that adds the given runtime properties, or if a true non-hash value is provided, some reasonable runtime properties for testing. =head2 check_digest plugin 'Test::Mock' => ( check_digest => 1, # the default ); This adds a check_digest hook that uses fake algorithm FAKE that hashes everything to C. The mock download above will set the digest for download_details so that this will pass the signature check. plugin 'Test::Mock' => ( check_digest => sub { my($build, $file, $algo, $digest) = @_; ... }, ); If you give it a code reference then you can write your own faux digest. See the L in L for details. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Temp.pm000644 000000 000000 00000005560 14710030646 017621 0ustar00rootroot000000 000000 package Alien::Build::Temp; use strict; use warnings; use 5.008004; use Carp (); use Path::Tiny (); use File::Temp (); use File::Spec (); # ABSTRACT: Temp Dir support for Alien::Build our $VERSION = '2.84'; # VERSION # problem with vanilla File::Temp is that is often uses # as /tmp that has noexec turned on. Workaround is to # create a temp directory in the build directory, but # we have to be careful about cleanup. This puts all that # (attempted) carefulness in one place so that when we # later discover it isn't so careful we can fix it in # one place rather than all the places that we need # temp directories. # we also have a speical case for Windows, which often # has problems with long paths if we try to use the # current directory for temp files, so for those we # use the system tmp directory. my %root; sub _root { return File::Spec->tmpdir if $^O eq 'MSWin32'; my $root = Path::Tiny->new(-d "_alien" ? "_alien/tmp" : ".tmp")->absolute; unless(-d $root) { mkdir $root or die "unable to create temp root $!"; } # TODO: doesn't account for fork... my $lock = $root->child("l$$"); unless(-f $lock) { open my $fh, '>', $lock; close $fh; } $root{"$root"} = 1; $root; } END { foreach my $root (keys %root) { my $lock = Path::Tiny->new($root)->child("l$$"); unlink $lock; # try to delete if possible. # if not possible then punt rmdir $root if -d $root; } } sub newdir { my $class = shift; Carp::croak "uneven" if @_ % 2; File::Temp->newdir(DIR => _root, @_); } sub new { my $class = shift; Carp::croak "uneven" if @_ % 2; File::Temp->new(DIR => _root, @_); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Temp - Temp Dir support for Alien::Build =head1 VERSION version 2.84 =head1 DESCRIPTION This class is private to L. =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Util.pm000644 000000 000000 00000011504 14710030646 017624 0ustar00rootroot000000 000000 package Alien::Build::Util; use strict; use warnings; use 5.008004; use Exporter qw( import ); use Path::Tiny qw( path ); use Config; # ABSTRACT: Private utility functions for Alien::Build our $VERSION = '2.84'; # VERSION our @EXPORT_OK = qw( _mirror _dump _destdir_prefix _perl_config _ssl_reqs _has_ssl ); # usage: _mirror $source_directory, $dest_direction, \%options # # options: # - filter -> regex for files that should match # - empty_directory -> if true, create all directories, including empty ones. # - verbose -> turn on verbosity sub _mirror { my($src_root, $dst_root, $opt) = @_; ($src_root, $dst_root) = map { path($_) } ($src_root, $dst_root); $opt ||= {}; require Alien::Build; require File::Find; require File::Copy; File::Find::find({ wanted => sub { next unless -e $File::Find::name; my $src = path($File::Find::name)->relative($src_root); return if $opt->{filter} && "$src" !~ $opt->{filter}; return if "$src" eq '.'; my $dst = $dst_root->child("$src"); $src = $src->absolute($src_root); if(-l "$src") { unless(-d $dst->parent) { Alien::Build->log("mkdir -p @{[ $dst->parent ]}") if $opt->{verbose}; $dst->parent->mkpath; } # TODO: rmtree if a directory? if(-e "$dst") { unlink "$dst" } my $target = readlink "$src"; Alien::Build->log("ln -s $target $dst") if $opt->{verbose}; symlink($target, $dst) || die "unable to symlink $target => $dst"; } elsif(-d "$src") { if($opt->{empty_directory}) { unless(-d $dst) { Alien::Build->log("mkdir $dst") if $opt->{verbose}; mkdir($dst) || die "unable to create directory $dst: $!"; } } } elsif(-f "$src") { unless(-d $dst->parent) { Alien::Build->log("mkdir -p @{[ $dst->parent ]}") if $opt->{verbose}; $dst->parent->mkpath; } # TODO: rmtree if a directory? if(-e "$dst") { unlink "$dst" } Alien::Build->log("cp $src $dst") if $opt->{verbose}; File::Copy::cp("$src", "$dst") || die "copy error $src => $dst: $!"; if($] < 5.012 && -x "$src" && $^O ne 'MSWin32') { # apparently Perl 5.8 and 5.10 do not preserver perms my $mode = [stat "$src"]->[2] & oct(777); eval { chmod $mode, "$dst" }; } } }, no_chdir => 1, }, "$src_root"); (); } sub _dump { if(eval { require YAML }) { return YAML::Dump(@_); } else { require Data::Dumper; return Data::Dumper::Dumper(@_); } } sub _destdir_prefix { my($destdir, $prefix) = @_; $prefix =~ s{^/?([a-z]):}{$1}i if $^O eq 'MSWin32'; path($destdir)->child($prefix)->stringify; } sub _perl_config { my($key) = @_; $Config{$key}; } sub _ssl_reqs { return { 'Net::SSLeay' => '1.49', 'IO::Socket::SSL' => '1.56', }; } sub _has_ssl { my %reqs = %{ _ssl_reqs() }; eval { require Net::SSLeay; die "need Net::SSLeay $reqs{'Net::SSLeay'}" unless Net::SSLeay->VERSION($reqs{'Net::SSLeay'}); require IO::Socket::SSL; die "need IO::Socket::SSL $reqs{'IO::Socket::SSL'}" unless IO::Socket::SSL->VERSION($reqs{'IO::Socket::SSL'}); }; $@ eq ''; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Util - Private utility functions for Alien::Build =head1 VERSION version 2.84 =head1 DESCRIPTION This module contains some private utility functions used internally by L. It shouldn't be used by any distribution other than C. That includes L plugins that are not part of the L core. You have been warned. The functionality within may be removed at any time! =head1 SEE ALSO L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/Version/000755 000000 000000 00000000000 14710030646 017775 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Alien/Build/Version/Basic.pm000644 000000 000000 00000011373 14710030646 021361 0ustar00rootroot000000 000000 package Alien::Build::Version::Basic; use strict; use warnings; use 5.008004; use Carp (); use Exporter qw( import ); use overload '<=>' => sub { shift->cmp(@_) }, 'cmp' => sub { shift->cmp(@_) }, '""' => sub { shift->as_string }, bool => sub { 1 }, fallback => 1; our @EXPORT_OK = qw( version ); # ABSTRACT: Very basic version object for Alien::Build our $VERSION = '2.84'; # VERSION sub new { my($class, $value) = @_; $value =~ s/\.$//; # trim trailing dot Carp::croak("invalud version: $value") unless $value =~ /^[0-9]+(\.[0-9]+)*$/; bless \$value, $class; } sub version ($) { my($value) = @_; __PACKAGE__->new($value); } sub as_string { my($self) = @_; "@{[ $$self ]}"; } sub cmp { my @x = split /\./, ${$_[0]}; my @y = split /\./, ${ref($_[1]) ? $_[1] : version($_[1])}; while(@x or @y) { my $x = (shift @x) || 0; my $y = (shift @y) || 0; return $x <=> $y if $x <=> $y; } 0; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::Version::Basic - Very basic version object for Alien::Build =head1 VERSION version 2.84 =head1 SYNOPSIS OO interface: use Alien::Build::Version::Basic; my $version = Alien::Build::Version::Basic->new('1.2.3'); if($version > '1.2.2') # true { ... } Function interface: use Alien::Build::Version::Basic qw( version ); if(version('1.2.3') > version('1.2.2')) # true { ... } my @sorted = sort map { version($_) } qw( 2.1 1.2.3 1.2.2 ); # will come out in the order 1.2.2, 1.2.3, 2.1 =head1 DESCRIPTION This module provides a very basic class for comparing versions. This is already a crowded space on CPAN. Parts of L already use L, which is fine for sorting versions. Sometimes you need to compare to see if versions match exact I, and the best candidates (such as L on CPAN compare C<1.2.3.0> and C<1.2.3> as being different. This class compares those two as the same. This class is also quite limited, in that it only works with version schemes using a doted version numbers or real numbers with a fixed number of digits. Versions with: dashes, letters, hex digits, or anything else are not supported. This class overloads both C=E> and C to compare the version in the way that you would expect for version numbers. This way you can compare versions like numbers, or sort them using sort. if(version($v1) > version($v2)) { ... } my @sorted = sort map { version($_) } @unsorted; it also overloads C<""> to stringify as whatever string value you passed to the constructor. =head1 CONSTRUCTOR =head2 new my $version = Alien::Build::Version::Basic->new($value); This is the long form of the constructor, if you don't want to import anything into your namespace. =head2 version my $version = version($value); This is the short form of the constructor, if you are sane. It is NOT exported by default so you will have to explicitly import it. =head1 METHODS =head2 as_string my $string = $version->as_string; my $string = "$version"; Returns the string representation of the version object. =head2 cmp my $bool = $version->cmp($other); my $bool = $version <=> $other; my $bool = $version cmp $other; Returns C<-1>, C<0> or C<1> just like the regular C=E> and C operators. Although C<$version> must be a version object, C<$other> may be either a version object, or a string that could be used to create a valid version object. =head1 SEE ALSO =over 4 =item L Good, especially if you have to support rpm style versions (like C<1.2.3-2-b>) or don't care if trailing zeros (C<1.2.3> vs C<1.2.3.0>) are treated as different values. =item L Problematic for historical reasons. =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Build/rc.pm000644 000000 000000 00000005517 14710030646 017322 0ustar00rootroot000000 000000 package Alien::Build::rc; use strict; use warnings; use 5.008004; # ABSTRACT: Alien::Build local config our $VERSION = '2.84'; # VERSION sub logx ($) { unshift @_, 'Alien::Build'; goto &Alien::Build::log; } sub preload_plugin { my(@args) = @_; push @Alien::Build::rc::PRELOAD, sub { shift->apply_plugin(@args); }; } sub postload_plugin { my(@args) = @_; push @Alien::Build::rc::POSTLOAD, sub { shift->apply_plugin(@args); }; } sub preload ($) { push @Alien::Build::rc::PRELOAD, $_[0]; } sub postload ($) { push @Alien::Build::rc::POSTLOAD, $_[0]; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Build::rc - Alien::Build local config =head1 VERSION version 2.84 =head1 SYNOPSIS in your C<~/.alienbuild/rc.pl>: preload 'Foo::Bar'; postload 'Baz::Frooble'; =head1 DESCRIPTION L will load your C<~/.alienbuild/rc.pl> file, if it exists before running the L recipe. This allows you to alter the behavior of L based Ls if you have local configuration requirements. For example you can prompt before downloading remote content or fetch from a local mirror. =head1 FUNCTIONS =head2 logx log $message; Send a message to the L log. =head2 preload_plugin preload_plugin $plugin, @args; Preload the given plugin, with arguments. =head2 postload_plugin postload_plugin $plugin, @args; Postload the given plugin, with arguments. =head2 preload [deprecated] preload $plugin; Preload the given plugin. =head2 postload [deprecated] postload $plugin; Postload the given plugin. =head1 SEE ALSO =over 4 =item L =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Role.pm000644 000000 000000 00000004414 14710030646 016553 0ustar00rootroot000000 000000 package Alien::Role; use strict; use warnings; use 5.008004; # ABSTRACT: Extend Alien::Base with roles! our $VERSION = '2.84'; # VERSION 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Role - Extend Alien::Base with roles! =head1 VERSION version 2.84 =head1 SYNOPSIS package Alien::libfoo; use parent qw( Alien::Base ); use Role::Tiny::With qw( with ); with 'Alien::Role::Dino'; 1; =head1 DESCRIPTION The C namespace is intended for writing roles that can be applied to L to extend its functionality. You could of course write subclasses that extend L, but then you have to either stick with just one subclass or deal with multiple inheritance! It is recommended that you use L since it can be used on plain old Perl classes which is good since L doesn't use anything fancy like L or L. There is one working example that use this technique that are worth checking out in the event you are interested: L. This class itself doesn't do anything, it just documents the technique. =head1 SEE ALSO =over 4 =item L =item L =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Alien/Util.pm000644 000000 000000 00000005651 14710030646 016573 0ustar00rootroot000000 000000 package Alien::Util; use strict; use warnings; use Exporter qw( import ); # ABSTRACT: Alien Utilities used at build and runtime our $VERSION = '2.84'; # VERSION our @EXPORT_OK = qw( version_cmp ); # Sort::Versions isn't quite the same algorithm because it differs in # behaviour with leading zeroes. # See also https://dev.gentoo.org/~mgorny/pkg-config-spec.html#version-comparison sub version_cmp { my @x = (shift =~ m/([0-9]+|[a-z]+)/ig); my @y = (shift =~ m/([0-9]+|[a-z]+)/ig); while(@x and @y) { my $x = shift @x; my $x_isnum = $x =~ m/[0-9]/; my $y = shift @y; my $y_isnum = $y =~ m/[0-9]/; if($x_isnum and $y_isnum) { # Numerical comparison return $x <=> $y if $x != $y; } elsif(!$x_isnum && !$y_isnum) { # Alphabetic comparison return $x cmp $y if $x ne $y; } else { # Of differing types, the numeric one is newer return $x_isnum - $y_isnum; } } # Equal so far; the longer is newer return @x <=> @y; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Alien::Util - Alien Utilities used at build and runtime =head1 VERSION version 2.84 =head1 SYNOPSIS use Alien::Util qw( version_cmp ); =head1 DESCRIPTION This module contains some functions used by both the L build-time and run-time for Alien. =head2 version_cmp $cmp = version_cmp($x, $y) Comparison method used by L, L and L. May be useful to implement custom comparisons, or for subclasses to overload to get different version comparison semantics than the default rules, for packages that have some other rules than the F behaviour. Should return a number less than, equal to, or greater than zero; similar in behaviour to the C<< <=> >> and C operators. =head1 SEE ALSO L, L, L =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Test/000755 000000 000000 00000000000 14710030646 015200 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Test/Alien.pm000644 000000 000000 00000072367 14710030646 016605 0ustar00rootroot000000 000000 package Test::Alien; use strict; use warnings; use 5.008004; use Env qw( @PATH ); use File::Which 1.10 qw( which ); use Capture::Tiny qw( capture capture_merged ); use Alien::Build::Temp; use File::Copy qw( move ); use Text::ParseWords qw( shellwords ); use Test2::API qw( context run_subtest ); use Exporter qw( import ); use Path::Tiny qw( path ); use Alien::Build::Util qw( _dump ); use Config; our @EXPORT = qw( alien_ok run_ok xs_ok ffi_ok with_subtest synthetic helper_ok interpolate_template_is interpolate_run_ok plugin_ok ); # ABSTRACT: Testing tools for Alien modules our $VERSION = '2.84'; # VERSION our @aliens; sub alien_ok ($;$) { my($alien, $message) = @_; my $name = ref $alien ? ref($alien) . '[instance]' : $alien; $name = 'undef' unless defined $name; my @methods = qw( cflags libs dynamic_libs bin_dir ); $message ||= "$name responds to: @methods"; my $ok; my @diag; if(defined $alien) { my @missing = grep { ! $alien->can($_) } @methods; $ok = !@missing; push @diag, map { " missing method $_" } @missing; if($ok) { push @aliens, $alien; if($^O eq 'MSWin32' && $alien->isa('Alien::MSYS')) { unshift @PATH, Alien::MSYS::msys_path(); } else { unshift @PATH, $alien->bin_dir; } } if($alien->can('alien_helper')) { my($intr) = _interpolator(); my $help = eval { $alien->alien_helper }; if(my $error = $@) { $ok = 0; push @diag, " error getting helpers: $error"; } foreach my $name (keys %$help) { my $code = $help->{$name}; $intr->replace_helper($name, $code); } } } else { $ok = 0; push @diag, " undefined alien"; } my $ctx = context(); $ctx->ok($ok, $message); $ctx->diag($_) for @diag; $ctx->release; $ok; } sub synthetic { my($opt) = @_; $opt ||= {}; my %alien = %$opt; require Test::Alien::Synthetic; bless \%alien, 'Test::Alien::Synthetic', } sub run_ok { my($command, $message) = @_; my(@command) = ref $command ? @$command : (do { my $command = $command; # make a copy # Double the backslashes so that when they are unescaped by shellwords(), # they become a single backslash. This should be fine on Windows since # backslashes are not used to escape metacharacters in cmd.exe. $command =~ s/\\/\\\\/g if $^O eq 'MSWin32'; shellwords $command; }); $message ||= ref $command ? "run @command" : "run $command"; require Test::Alien::Run; my $run = bless { out => '', err => '', exit => 0, sig => 0, cmd => [@command], }, 'Test::Alien::Run'; my $ctx = context(); my $exe = which $command[0]; if(defined $exe) { if(ref $command) { shift @command; $run->{cmd} = [$exe, @command]; } else { $run->{cmd} = [$command]; } my @diag; my $ok = 1; my($exit, $errno); ($run->{out}, $run->{err}, $exit, $errno) = capture { if(ref $command) { system $exe, @command; } else { system $command; } ($?,$!); }; if($exit == -1) { $ok = 0; $run->{fail} = "failed to execute: $errno"; push @diag, " failed to execute: $errno"; } elsif($exit & 127) { $ok = 0; push @diag, " killed with signal: @{[ $exit & 127 ]}"; $run->{sig} = $exit & 127; } else { $run->{exit} = $exit >> 8; } $ctx->ok($ok, $message); $ok ? $ctx->note(" using $exe") : $ctx->diag(" using $exe"); $ctx->diag(@diag) for @diag; } else { $ctx->ok(0, $message); $ctx->diag(" command not found"); $run->{fail} = 'command not found'; } unless(@aliens || $ENV{TEST_ALIEN_ALIENS_MISSING}) { $ctx->diag("run_ok called without any aliens, you may want to call alien_ok"); } $ctx->release; $run; } sub _flags { my($class, $method) = @_; my $static = "${method}_static"; $class->can($static) && $class->can('install_type') && $class->install_type eq 'share' && (!$class->can('xs_load')) ? $class->$static : $class->$method; } sub xs_ok { my $cb; $cb = pop if defined $_[-1] && ref $_[-1] eq 'CODE'; my($xs, $message) = @_; $message ||= 'xs'; $xs = { xs => $xs } unless ref $xs; # make sure this is a copy because we may # modify it. $xs->{xs} = "@{[ $xs->{xs} ]}"; $xs->{pxs} ||= {}; $xs->{cbuilder_check} ||= 'have_compiler'; $xs->{cbuilder_config} ||= {}; $xs->{cbuilder_compile} ||= {}; $xs->{cbuilder_link} ||= {}; require ExtUtils::CBuilder; my $skip = do { my $have_compiler = $xs->{cbuilder_check}; my %config = %{ $xs->{cbuilder_config} }; !ExtUtils::CBuilder->new( config => \%config )->$have_compiler; }; if($skip) { my $ctx = context(); $ctx->skip($message, 'test requires a compiler'); $ctx->skip("$message subtest", 'test requires a compiler') if $cb; $ctx->release; return; } if($xs->{cpp} || $xs->{'C++'}) { my $ctx = context(); $ctx->bail("The cpp and C++ options have been removed from xs_ok"); } else { $xs->{c_ext} ||= 'c'; } my $verbose = $xs->{verbose} || 0; my $ok = 1; my @diag; my $dir = Alien::Build::Temp->newdir( TEMPLATE => 'test-alien-XXXXXX', CLEANUP => $^O =~ /^(MSWin32|cygwin|msys)$/ ? 0 : 1, ); my $xs_filename = path($dir)->child('test.xs')->stringify; my $c_filename = path($dir)->child("test.@{[ $xs->{c_ext} ]}")->stringify; my $ctx = context(); my $module; if($ENV{TEST_ALIEN_ALWAYS_KEEP}) { $dir->unlink_on_destroy(0); $ctx->note("keeping XS temporary directory $dir at user request"); } if($xs->{xs} =~ /\bTA_MODULE\b/) { our $count; $count = 0 unless defined $count; my $name = sprintf "Test::Alien::XS::Mod%s%s", $count, chr(65 + $count % 26 ) x 4; $count++; my $code = $xs->{xs}; $code =~ s{\bTA_MODULE\b}{$name}g; $xs->{xs} = $code; } # this regex copied shamefully from ExtUtils::ParseXS # in part because we need the module name to do the bootstrap # and also because if this regex doesn't match then ParseXS # does an exit() which we don't want. if($xs->{xs} =~ /^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/m) { $module = $1; $ctx->note("detect module name $module") if $verbose; } else { $ok = 0; push @diag, ' XS does not have a module decleration that we could find'; } if($ok) { open my $fh, '>', $xs_filename; print $fh $xs->{xs}; close $fh; require ExtUtils::ParseXS; my $pxs = ExtUtils::ParseXS->new; my($out, $err) = capture_merged { eval { $pxs->process_file( filename => $xs_filename, output => $c_filename, versioncheck => 0, prototypes => 0, %{ $xs->{pxs} }, ); }; $@; }; $ctx->note("parse xs $xs_filename => $c_filename") if $verbose; $ctx->note($out) if $verbose; $ctx->note("error: $err") if $verbose && $err; unless($pxs->report_error_count == 0) { $ok = 0; push @diag, ' ExtUtils::ParseXS failed:'; push @diag, " $err" if $err; push @diag, " $_" for split /\r?\n/, $out; } } push @diag, "xs_ok called without any aliens, you may want to call alien_ok" unless @aliens || $ENV{TEST_ALIEN_ALIENS_MISSING}; if($ok) { my $cb = ExtUtils::CBuilder->new( config => do { my %config = %{ $xs->{cbuilder_config} }; my $lddlflags = join(' ', grep !/^-l/, shellwords map { _flags $_, 'libs' } @aliens) . " $Config{lddlflags}"; $config{lddlflags} = defined $config{lddlflags} ? "$lddlflags $config{lddlflags}" : $lddlflags; \%config; }, ); my %compile_options = ( source => $c_filename, %{ $xs->{cbuilder_compile} }, ); if(defined $compile_options{extra_compiler_flags} && ref($compile_options{extra_compiler_flags}) eq '') { $compile_options{extra_compiler_flags} = [ shellwords $compile_options{extra_compiler_flags} ]; } push @{ $compile_options{extra_compiler_flags} }, shellwords map { _flags $_, 'cflags' } @aliens; my($out, $obj, $err) = capture_merged { my $obj = eval { $cb->compile(%compile_options); }; ($obj, $@); }; $ctx->note("compile $c_filename") if $verbose; $ctx->note($out) if $verbose; $ctx->note($err) if $verbose && $err; if($verbose > 1) { $ctx->note(_dump({ compile_options => \%compile_options })); } unless($obj) { $ok = 0; push @diag, ' ExtUtils::CBuilder->compile failed'; push @diag, " $err" if $err; push @diag, " $_" for split /\r?\n/, $out; } if($ok) { my %link_options = ( objects => [$obj], module_name => $module, %{ $xs->{cbuilder_link} }, ); if(defined $link_options{extra_linker_flags} && ref($link_options{extra_linker_flags}) eq '') { $link_options{extra_linker_flags} = [ shellwords $link_options{extra_linker_flags} ]; } unshift @{ $link_options{extra_linker_flags} }, grep /^-l/, shellwords map { _flags $_, 'libs' } @aliens; my($out, $lib, $err) = capture_merged { my $lib = eval { $cb->link(%link_options); }; ($lib, $@); }; $ctx->note("link $obj") if $verbose; $ctx->note($out) if $verbose; $ctx->note($err) if $verbose && $err; if($verbose > 1) { $ctx->note(_dump({ link_options => \%link_options })); } if($lib && -f $lib) { $ctx->note("created lib $lib") if $xs->{verbose}; } else { $ok = 0; push @diag, ' ExtUtils::CBuilder->link failed'; push @diag, " $err" if $err; push @diag, " $_" for split /\r?\n/, $out; } if($ok) { my @modparts = split(/::/,$module); my $dl_dlext = $Config{dlext}; my $modfname = $modparts[-1]; my $libpath = path($dir)->child('auto', @modparts, "$modfname.$dl_dlext"); $libpath->parent->mkpath; move($lib, "$libpath") || die "unable to copy $lib => $libpath $!"; pop @modparts; my $pmpath = path($dir)->child(@modparts, "$modfname.pm"); $pmpath->parent->mkpath; open my $fh, '>', "$pmpath"; my($alien_with_xs_load, @rest) = grep { $_->can('xs_load') } @aliens; if($alien_with_xs_load) { { no strict 'refs'; @{join '::', $module, 'rest'} = @rest; ${join '::', $module, 'alien_with_xs_load'} = $alien_with_xs_load; } print $fh '# line '. __LINE__ . ' "' . __FILE__ . qq("\n) . qq{ package $module; use strict; use warnings; our \$VERSION = '0.01'; our \@rest; our \$alien_with_xs_load; \$alien_with_xs_load->xs_load('$module', \$VERSION, \@rest); 1; }; } else { print $fh '# line '. __LINE__ . ' "' . __FILE__ . qq("\n) . qq{ package $module; use strict; use warnings; require XSLoader; our \$VERSION = '0.01'; XSLoader::load('$module',\$VERSION); 1; }; } close $fh; { local @INC = @INC; unshift @INC, "$dir"; ## no critic eval '# line '. __LINE__ . ' "' . __FILE__ . qq("\n) . qq{ use $module; }; ## use critic } if(my $error = $@) { $ok = 0; push @diag, ' XSLoader failed'; push @diag, " $error"; } } } } $ctx->ok($ok, $message); $ctx->diag($_) for @diag; $ctx->release; unless($ok || defined $ENV{TEST_ALIEN_ALWAYS_KEEP}) { $ctx->note("keeping XS temporary directory $dir due to failure"); $dir->unlink_on_destroy(0); } if($cb) { $cb = sub { my $ctx = context(); $ctx->plan(0, 'SKIP', "subtest requires xs success"); $ctx->release; } unless $ok; @_ = ("$message subtest", $cb, 1, $module); goto \&Test2::API::run_subtest; } $ok; } sub with_subtest (&) { my($code) = @_; # it may be possible to catch a segmentation fault, # but not with signal handlers apparently. See: # https://feepingcreature.github.io/handling.html return $code if $^O eq 'MSWin32'; # try to catch a segmentation fault and bail out # with a useful diagnostic. prove test to swallow # the diagnostic on such failures. sub { local $SIG{SEGV} = sub { my $ctx = context(); $ctx->bail("Segmentation fault"); }; $code->(@_); } } sub ffi_ok { my $cb; $cb = pop if defined $_[-1] && ref $_[-1] eq 'CODE'; my($opt, $message) = @_; $message ||= 'ffi'; my $ok = 1; my $skip; my $ffi; my @diag; { my $min = '0.12'; # the first CPAN release $min = '0.15' if $opt->{ignore_not_found}; $min = '0.18' if $opt->{lang}; $min = '0.99' if defined $opt->{api} && $opt->{api} > 0; unless(eval { require FFI::Platypus; FFI::Platypus->VERSION($min) }) { $ok = 0; $skip = "Test requires FFI::Platypus $min"; } } if($ok && $opt->{lang}) { my $class = "FFI::Platypus::Lang::@{[ $opt->{lang} ]}"; { my $pm = "$class.pm"; $pm =~ s/::/\//g; eval { require $pm }; } if($@) { $ok = 0; $skip = "Test requires FFI::Platypus::Lang::@{[ $opt->{lang} ]}"; } } unless(@aliens || $ENV{TEST_ALIEN_ALIENS_MISSING}) { push @diag, 'ffi_ok called without any aliens, you may want to call alien_ok'; } if($ok) { $ffi = FFI::Platypus->new( do { my @args = ( lib => [map { $_->dynamic_libs } @aliens], ignore_not_found => $opt->{ignore_not_found}, lang => $opt->{lang}, ); push @args, api => $opt->{api} if defined $opt->{api}; @args; } ); foreach my $symbol (@{ $opt->{symbols} || [] }) { unless($ffi->find_symbol($symbol)) { $ok = 0; push @diag, " $symbol not found" } } } my $ctx = context(); if($skip) { $ctx->skip($message, $skip); } else { $ctx->ok($ok, $message); } $ctx->diag($_) for @diag; $ctx->release; if($cb) { $cb = sub { my $ctx = context(); $ctx->plan(0, 'SKIP', "subtest requires ffi success"); $ctx->release; } unless $ok; @_ = ("$message subtest", $cb, 1, $ffi); goto \&Test2::API::run_subtest; } $ok; } { my @ret; sub _interpolator { return @ret if @ret; require Alien::Build::Interpolate::Default; my $intr = Alien::Build::Interpolate::Default->new; require Alien::Build; my $build = Alien::Build->new; $build->meta->interpolator($intr); @ret = ($intr, $build); } } sub helper_ok { my($name, $message) = @_; $message ||= "helper $name exists"; my($intr) = _interpolator; my $code = $intr->has_helper($name); my $ok = defined $code; my $ctx = context(); $ctx->ok($ok, $message); $ctx->diag("helper_ok called without any aliens, you may want to call alien_ok") unless @aliens || $ENV{TEST_ALIEN_ALIENS_MISSING}; $ctx->release; $ok; } sub plugin_ok { my($name, $message) = @_; my @args; ($name, @args) = @$name if ref $name; $message ||= "plugin $name"; my($intr, $build) = _interpolator; my $class = "Alien::Build::Plugin::$name"; my $pm = "$class.pm"; $pm =~ s/::/\//g; my $ctx = context(); my $plugin = eval { require $pm unless $class->can('new'); $class->new(@args); }; if(my $error = $@) { $ctx->ok(0, $message, ['unable to create $name plugin', $error]); $ctx->release; return 0; } eval { $plugin->init($build->meta); }; if($^O eq 'MSWin32' && ($plugin->isa('Alien::Build::Plugin::Build::MSYS') || $plugin->isa('Alien::Build::Plugin::Build::Autoconf'))) { require Alien::MSYS; unshift @PATH, Alien::MSYS::msys_path(); } if(my $error = $@) { $ctx->ok(0, $message, ['unable to initiate $name plugin', $error]); $ctx->release; return 0; } else { $ctx->ok(1, $message); $ctx->release; return 1; } } sub interpolate_template_is { my($template, $pattern, $message) = @_; $message ||= "template matches"; my($intr) = _interpolator; my $value = eval { $intr->interpolate($template) }; my $error = $@; my @diag; my $ok; if($error) { $ok = 0; push @diag, "error in evaluation:"; push @diag, " $error"; } elsif(ref($pattern) eq 'Regexp') { $ok = $value =~ $pattern; push @diag, "value '$value' does not match $pattern'" unless $ok; } else { $ok = $value eq "$pattern"; push @diag, "value '$value' does not equal '$pattern'" unless $ok; } my $ctx = context(); $ctx->ok($ok, $message, [@diag]); $ctx->diag('interpolate_template_is called without any aliens, you may want to call alien_ok') unless @aliens || $ENV{TEST_ALIEN_ALIENS_MISSING}; $ctx->release; $ok; } sub interpolate_run_ok { my($template, $message) = @_; my(@template) = ref $template ? @$template : ($template); my($intr) = _interpolator; my $ok = 1; my @diag; my @command; foreach my $template (@template) { my $command = eval { $intr->interpolate($template) }; if(my $error = $@) { $ok = 0; push @diag, "error in evaluation:"; push @diag, " $error"; } else { push @command, $command; } } my $ctx = context(); if($ok) { my $command = ref $template ? \@command : $command[0]; $ok = run_ok($command, $message); } else { $message ||= "run @template"; $ctx->ok($ok, $message, [@diag]); $ctx->diag('interpolate_run_ok called without any aliens, you may want to call alien_ok') unless @aliens || $ENV{TEST_ALIEN_ALIENS_MISSING}; } $ctx->release; $ok; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Test::Alien - Testing tools for Alien modules =head1 VERSION version 2.84 =head1 SYNOPSIS Test commands that come with your Alien: use Test2::V0; use Test::Alien; use Alien::patch; alien_ok 'Alien::patch'; run_ok([ 'patch', '--version' ]) ->success # we only accept the version written # by Larry ... ->out_like(qr{Larry Wall}); done_testing; Test that your library works with C: use Test2::V0; use Test::Alien; use Alien::Editline; alien_ok 'Alien::Editline'; my $xs = do { local $/; }; xs_ok $xs, with_subtest { my($module) = @_; ok $module->version; }; done_testing; __DATA__ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include const char * version(const char *class) { return rl_library_version; } MODULE = TA_MODULE PACKAGE = TA_MODULE const char *version(class); const char *class; Test that your library works with L: use Test2::V0; use Test::Alien; use Alien::LibYAML; alien_ok 'Alien::LibYAML'; ffi_ok { symbols => ['yaml_get_version'] }, with_subtest { my($ffi) = @_; my $get_version = $ffi->function(yaml_get_version => ['int*','int*','int*'] => 'void'); $get_version->call(\my $major, \my $minor, \my $patch); like $major, qr{[0-9]+}; like $minor, qr{[0-9]+}; like $patch, qr{[0-9]+}; }; done_testing; =head1 DESCRIPTION This module provides tools for testing L modules. It has hooks to work easily with L based modules, but can also be used via the synthetic interface to test non L based L modules. It has very modest prerequisites. Prior to this module the best way to test a L module was via L. The main downside to that module is that it is heavily influenced by and uses L, which is a tool for checking at install time various things about your compiler. It was also written before L became as stable as it is today. In particular, L does its testing by creating an executable and running it. Unfortunately Perl uses extensions by creating dynamic libraries and linking them into the Perl process, which is different in subtle and error prone ways. This module attempts to test the libraries in the way that they will actually be used, via either C or L. It also provides a mechanism for testing binaries that are provided by the various L modules (for example L and L). L modules can actually be usable without a compiler, or without L (for example, if the library is provided by the system, and you are using L, or if you are building from source and you are using C), so tests with missing prerequisites are automatically skipped. For example, L will automatically skip itself if a compiler is not found, and L
will automatically skip itself if L is not installed. =head1 FUNCTIONS =head2 alien_ok alien_ok $alien, $message; alien_ok $alien; Load the given L instance or class. Checks that the instance or class conforms to the same interface as L. Will be used by subsequent tests. The C<$alien> module only needs to provide these methods in order to conform to the L interface: =over 4 =item cflags String containing the compiler flags =item libs String containing the linker and library flags =item dynamic_libs List of dynamic libraries. Returns empty list if the L module does not provide this. =item bin_dir Directory containing tool binaries. Returns empty list if the L module does not provide this. =back If your L module does not conform to this interface then you can create a synthetic L module using the L function. =head2 synthetic my $alien = synthetic \%config; Create a synthetic L module which can be passed into L. C<\%config> can contain these keys (all of which are optional): =over 4 =item cflags String containing the compiler flags. =item cflags_static String containing the static compiler flags (optional). =item libs String containing the linker and library flags. =item libs_static String containing the static linker flags (optional). =item dynamic_libs List reference containing the dynamic libraries. =item bin_dir Tool binary directory. =item runtime_prop Runtime properties. =back See L for more details. =head2 run_ok my $run = run_ok $command; my $run = run_ok $command, $message; Runs the given command, falling back on any C methods provided by L modules specified with L. C<$command> can be either a string or an array reference. Only fails if the command cannot be found, or if it is killed by a signal! Returns a L object, which you can use to test the exit status, output and standard error. Always returns an instance of L, even if the command could not be found. =head2 xs_ok xs_ok $xs; xs_ok $xs, $message; Compiles, links the given C code and attaches to Perl. If you use the special module name C in your C code, it will be replaced by an automatically generated package name. This can be useful if you want to pass the same C code to multiple calls to C without subsequent calls replacing previous ones. C<$xs> may be either a string containing the C code, or a hash reference with these keys: =over 4 =item xs The XS code. This is the only required element. =item pxs Extra L arguments passed in as a hash reference. =item cbuilder_check The compile check that should be done prior to attempting to build. Should be one of C or C. Defaults to C. =item cbuilder_config Hash to override values normally provided by C. =item cbuilder_compile Extra The L arguments passed in as a hash reference. =item cbuilder_link Extra The L arguments passed in as a hash reference. =item verbose Spew copious debug information via test note. =back You can use the C keyword to conditionally run a subtest if the C call succeeds. If C does not work, then the subtest will automatically be skipped. Example: xs_ok $xs, with_subtest { # skipped if $xs fails for some reason my($module) = @_; is $module->foo, 1; }; The module name detected during the XS parsing phase will be passed in to the subtest. This is helpful when you are using a generated module name. If you need to test XS C++ interfaces, see L. Caveats: C uses L, which may call C under certain error conditions. While this is not really good thing to happen in the middle of a test, it usually indicates a real failure condition, and it should return a failure condition so the test should still fail overall. [version 2.53] As of version 2.53, C will only remove temporary generated files if the test is successful by default. You can force either always or never removing the temporary generated files using the C environment variable (see L below). =head2 ffi_ok ffi_ok; ffi_ok \%opt; ffi_ok \%opt, $message; Test that L works. C<\%opt> is a hash reference with these keys (all optional): =over 4 =item symbols List references of symbols that must be found for the test to succeed. =item ignore_not_found Ignores symbols that aren't found. This affects functions accessed via L and L methods, and does not influence the C key above. =item lang Set the language. Used primarily for language specific native types. =item api Set the API. C requires FFI::Platypus 0.99 or later. This option was added with Test::Alien version 1.90, so your use line should include this version as a safeguard to make sure it works: use Test::Alien 1.90; ... ffi_ok ...; =back As with L above, you can use the C keyword to specify a subtest to be run if C succeeds (it will skip otherwise). The L instance is passed into the subtest as the first argument. For example: ffi_ok with_subtest { my($ffi) = @_; is $ffi->function(foo => [] => 'void')->call, 42; }; =head2 helper_ok helper_ok $name; helper_ok $name, $message; Tests that the given helper has been defined. =head2 plugin_ok [version 2.52] plugin_ok $plugin_name, $message; plugin_ok [$plugin_name, @args], $message; This applies an L to the interpolator used by L, L and L so that you can test with any helpers that plugin provides. Useful, for example for getting C<%{configure}> from L. =head2 interpolate_template_is interpolate_template_is $template, $string; interpolate_template_is $template, $string, $message; interpolate_template_is $template, $regex; interpolate_template_is $template, $regex, $message; Tests that the given template when evaluated with the appropriate helpers will match either the given string or regular expression. =head2 interpolate_run_ok [version 2.52] my $run = interpolate_run_ok $command; my $run = interpolate_run_ok $command, $message; This is the same as L except it runs the command through the interpolator first. =head1 ENVIRONMENT =over 4 =item C If this is defined then it will override the built in logic that decides if the temporary files generated by L should be kept when the test file terminates. If set to true the generated files will always be kept. If set to false, then they will always be removed. =item C By default, this module will warn you if some tools are used without first invoking L. This is usually a mistake, but if you really do want to use one of these tools with no aliens loaded, you can set this environment variable to false. =back =head1 SEE ALSO =over 4 =item L =item L =item L =item L =item L =item L =item L =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Test/Alien/000755 000000 000000 00000000000 14710030646 016230 5ustar00rootroot000000 000000 Alien-Build-2.84/lib/Test/Alien/Build.pm000644 000000 000000 00000042417 14710030646 017635 0ustar00rootroot000000 000000 package Test::Alien::Build; use strict; use warnings; use 5.008004; use Exporter qw( import ); use Path::Tiny qw( path ); use Carp qw( croak ); use Test2::API qw( context run_subtest ); use Capture::Tiny qw( capture_merged ); use Alien::Build::Util qw( _mirror ); use List::Util 1.33 qw( any ); use Alien::Build::Temp; our @EXPORT = qw( alienfile alienfile_ok alienfile_skip_if_missing_prereqs alien_download_ok alien_extract_ok alien_build_ok alien_build_clean alien_clean_install alien_install_type_is alien_checkpoint_ok alien_resume_ok alien_subtest alien_rc ); # ABSTRACT: Tools for testing Alien::Build + alienfile our $VERSION = '2.84'; # VERSION my $build; my $build_alienfile; my $build_root; my $build_targ; sub alienfile::targ { $build_targ; } sub alienfile { my($package, $filename, $line) = caller; ($package, $filename, $line) = caller(2) if $package eq __PACKAGE__; $filename = path($filename)->absolute; my %args = @_ == 0 ? (filename => 'alienfile') : @_ % 2 ? ( source => do { '# line '. $line . ' "' . path($filename)->absolute . qq("\n) . $_[0] }) : @_; require alienfile; push @alienfile::EXPORT, 'targ' unless any { /^targ$/ } @alienfile::EXPORT; my $temp = Alien::Build::Temp->newdir; my $get_temp_root = do{ my $root; # may be undef; sub { $root ||= Path::Tiny->new($temp); if(@_) { my $path = $root->child(@_); $path->mkpath; $path; } else { return $root; } }; }; if($args{source}) { my $file = $get_temp_root->()->child('alienfile'); $file->spew_utf8($args{source}); $args{filename} = $file->stringify; } else { unless(defined $args{filename}) { croak "You must specify at least one of filename or source"; } $args{filename} = path($args{filename})->absolute->stringify; } $args{stage} ||= $get_temp_root->('stage')->stringify; $args{prefix} ||= $get_temp_root->('prefix')->stringify; $args{root} ||= $get_temp_root->('root')->stringify; require Alien::Build; _alienfile_clear(); my $out = capture_merged { $build_targ = $args{targ}; $build = Alien::Build->load($args{filename}, root => $args{root}); $build->set_stage($args{stage}); $build->set_prefix($args{prefix}); }; my $ctx = context(); $ctx->note($out) if $out; $ctx->release; $build_alienfile = $args{filename}; $build_root = $temp; $build } sub _alienfile_clear { eval { defined $build_root && -d $build_root && path($build_root)->remove_tree }; undef $build; undef $build_alienfile; undef $build_root; undef $build_targ; } sub alienfile_ok { my $build; my $name; my $error; if(@_ == 1 && ! defined $_[0]) { $build = $_[0]; $error = 'no alienfile given'; $name = 'alienfile compiled'; } elsif(@_ == 1 && eval { $_[0]->isa('Alien::Build') }) { $build = $_[0]; $name = 'alienfile compiled'; } else { $build = eval { alienfile(@_) }; $error = $@; $name = 'alienfile compiles'; } my $ok = !! $build; my $ctx = context(); $ctx->ok($ok, $name); $ctx->diag("error: $error") if $error; $ctx->release; $build; } sub alienfile_skip_if_missing_prereqs { my($phase) = @_; if($build) { eval { $build->load_requires('configure', 1) }; if(my $error = $@) { my $reason = "Missing configure prereq"; if($error =~ /Required (.*) (.*),/) { $reason .= ": $1 $2"; } my $ctx = context(); $ctx->plan(0, SKIP => $reason); $ctx->release; return; } $phase ||= $build->install_type; eval { $build->load_requires($phase, 1) }; if(my $error = $@) { my $reason = "Missing $phase prereq"; if($error =~ /Required (.*) (.*),/) { $reason .= ": $1 $2"; } my $ctx = context(); $ctx->plan(0, SKIP => $reason); $ctx->release; return; } } } sub alien_install_type_is { my($type, $name) = @_; croak "invalid install type" unless defined $type && $type =~ /^(system|share)$/; $name ||= "alien install type is $type"; my $ok = 0; my @diag; if($build) { my($out, $actual) = capture_merged { $build->load_requires('configure'); $build->install_type; }; if($type eq $actual) { $ok = 1; } else { push @diag, "expected install type of $type, but got $actual"; } } else { push @diag, 'no alienfile' } my $ctx = context(); $ctx->ok($ok, $name); $ctx->diag($_) for @diag; $ctx->release; $ok; } sub alien_download_ok { my($name) = @_; $name ||= 'alien download'; my $ok; my $file; my @diag; my @note; if($build) { my($out, $error) = capture_merged { eval { $build->load_requires('configure'); $build->load_requires($build->install_type); $build->download; }; $@; }; if($error) { $ok = 0; push @diag, $out if defined $out; push @diag, "extract threw exception: $error"; } else { $file = $build->install_prop->{download}; if(-d $file || -f $file) { $ok = 1; push @note, $out if defined $out; } else { $ok = 0; push @diag, $out if defined $out; push @diag, 'no file or directory'; } } } else { $ok = 0; push @diag, 'no alienfile'; } my $ctx = context(); $ctx->ok($ok, $name); $ctx->note($_) for @note; $ctx->diag($_) for @diag; $ctx->release; $file; } sub alien_extract_ok { my($archive, $name) = @_; $name ||= $archive ? "alien extraction of $archive" : 'alien extraction'; my $ok; my $dir; my @diag; my @note; if($build) { my($out, $error); ($out, $dir, $error) = capture_merged { my $dir = eval { $build->load_requires('configure'); $build->load_requires($build->install_type); $build->download; $build->extract($archive); }; ($dir, $@); }; if($error) { $ok = 0; push @diag, $out if defined $out; push @diag, "extract threw exception: $error"; } else { if(-d $dir) { $ok = 1; push @note, $out if defined $out; } else { $ok = 0; push @diag, $out if defined $out; push @diag, 'no directory'; } } } else { $ok = 0; push @diag, 'no alienfile'; } my $ctx = context(); $ctx->ok($ok, $name); $ctx->note($_) for @note; $ctx->diag($_) for @diag; $ctx->release; $dir; } my $count = 1; sub alien_build_ok { my $opt = defined $_[0] && ref($_[0]) eq 'HASH' ? shift : { class => 'Alien::Base' }; my($name) = @_; $name ||= 'alien builds okay'; my $ok; my @diag; my @note; my $alien; if($build) { my($out,$error) = capture_merged { eval { $build->load_requires('configure'); $build->load_requires($build->install_type); $build->download; $build->build; }; $@; }; if($error) { $ok = 0; push @diag, $out if defined $out; push @diag, "build threw exception: $error"; } else { $ok = 1; push @note, $out if defined $out; require Alien::Base; my $prefix = $build->runtime_prop->{prefix}; my $stage = $build->install_prop->{stage}; my %prop = %{ $build->runtime_prop }; $prop{distdir} = $prefix; _mirror $stage, $prefix; my $dist_dir = sub { $prefix; }; my $runtime_prop = sub { \%prop; }; $alien = sprintf 'Test::Alien::Build::Faux%04d', $count++; { no strict 'refs'; @{ "${alien}::ISA" } = $opt->{class}; *{ "${alien}::dist_dir" } = $dist_dir; *{ "${alien}::runtime_prop" } = $runtime_prop; } } } else { $ok = 0; push @diag, 'no alienfile'; } my $ctx = context(); $ctx->ok($ok, $name); $ctx->diag($_) for @diag; $ctx->note($_) for @note; $ctx->release; $alien; } sub alien_build_clean { my $ctx = context(); if($build_root) { foreach my $child (path($build_root)->children) { next if $child->basename eq 'prefix'; $ctx->note("clean: rm: $child"); $child->remove_tree; } } else { $ctx->note("no build to clean"); } $ctx->release; } sub alien_clean_install { my($name) = @_; $name ||= "run clean_install"; my $ok; my @diag; my @note; if($build) { my($out,$error) = capture_merged { eval { $build->clean_install; }; $@; }; if($error) { $ok = 0; push @diag, $out if defined $out && $out ne ''; push @diag, "build threw exception: $error"; } else { $ok = 1; push @note, $out if defined $out && $out ne ''; } } else { $ok = 0; push @diag, 'no alienfile'; } my $ctx = context(); $ctx->ok($ok, $name); $ctx->diag($_) for @diag; $ctx->note($_) for @note; $ctx->release; } sub alien_checkpoint_ok { my($name) = @_; $name ||= "alien checkpoint ok"; my $ok; my @diag; if($build) { eval { $build->checkpoint }; if($@) { push @diag, "error in checkpoint: $@"; $ok = 0; } else { $ok = 1; } undef $build; } else { push @diag, "no build to checkpoint"; $ok = 0; } my $ctx = context(); $ctx->ok($ok, $name); $ctx->diag($_) for @diag; $ctx->release; $ok; } sub alien_resume_ok { my($name) = @_; $name ||= "alien resume ok"; my $ok; my @diag; if($build_alienfile && $build_root && !defined $build) { $build = eval { Alien::Build->resume($build_alienfile, "$build_root/root") }; if($@) { push @diag, "error in resume: $@"; $ok = 0; } else { $ok = 1; } } else { if($build) { push @diag, "build has not been checkpointed"; } else { push @diag, "no build to resume"; } $ok = 0; } my $ctx = context(); $ctx->ok($ok, $name); $ctx->diag($_) for @diag; $ctx->release; ($ok && $build) || $ok; } my $alien_rc_root; sub alien_rc { my($code) = @_; croak "passed in undef rc" unless defined $code; croak "looks like you have already defined a rc.pl file" if $ENV{ALIEN_BUILD_RC} ne '-'; my(undef, $filename, $line) = caller; my $code2 = "use strict; use warnings;\n" . '# line ' . $line . ' "' . path($filename)->absolute . "\n$code"; $alien_rc_root ||= Alien::Build::Temp->newdir; my $rc = path($alien_rc_root)->child('rc.pl'); $rc->spew_utf8($code2); $ENV{ALIEN_BUILD_RC} = "$rc"; return 1; } sub alien_subtest { my($name, $code, @args) = @_; _alienfile_clear; my $ctx = context(); my $pass = run_subtest($name, $code, { buffered => 1 }, @args); $ctx->release; _alienfile_clear; $pass; } delete $ENV{$_} for qw( ALIEN_BUILD_LOG ALIEN_BUILD_PRELOAD ALIEN_BUILD_POSTLOAD ALIEN_INSTALL_TYPE PKG_CONFIG_PATH ALIEN_BUILD_PKG_CONFIG ); $ENV{ALIEN_BUILD_RC} = '-'; 1; __END__ =pod =encoding UTF-8 =head1 NAME Test::Alien::Build - Tools for testing Alien::Build + alienfile =head1 VERSION version 2.84 =head1 SYNOPSIS use Test2::V0; use Test::Alien::Build; # returns an instance of Alien::Build. my $build = alienfile_ok q{ use alienfile; plugin 'My::Plugin' => ( foo => 1, bar => 'string', ... ); }; alien_build_ok 'builds okay.'; done_testing; =head1 DESCRIPTION This module provides some tools for testing L and L. Outside of L core development, It is probably most useful for L developers. This module also unsets a number of L specific environment variables, in order to make tests reproducible even when overrides are set in different environments. So if you want to test those variables in various states you should explicitly set them in your test script. These variables are unset if they defined: C C C. =head1 FUNCTIONS =head2 alienfile my $build = alienfile; my $build = alienfile q{ use alienfile ... }; my $build = alienfile filename => 'alienfile'; Create a Alien::Build instance from the given L. The first two forms are abbreviations. my $build = alienfile; # is the same as my $build = alienfile filename => 'alienfile'; and my $build = alienfile q{ use alienfile ... }; # is the same as my $build = alienfile source => q{ use alienfile ... }; Except for the second abbreviated form sets the line number before feeding the source into L so that you will get diagnostics with the correct line numbers. =over 4 =item source The source for the alienfile as a string. You must specify one of C or C. =item filename The filename for the alienfile. You must specify one of C or C. =item root The build root. =item stage The staging area for the build. =item prefix The install prefix for the build. =back =head2 alienfile_ok my $build = alienfile_ok; my $build = alienfile_ok q{ use alienfile ... }; my $build = alienfile_ok filename => 'alienfile'; my $build = alienfile_ok $build; Same as C above, except that it runs as a test, and will not throw an exception on failure (it will return undef instead). [version 1.49] As of version 1.49 you can also pass in an already formed instance of L. This allows you to do something like this: subtest 'a subtest' => sub { my $build = alienfile q{ use alienfile; ... }; alienfile_skip_if_missing_prereqs; # skip if alienfile prereqs are missing alienfile_ok $build; # delayed pass/fail for the compile of alienfile }; =head2 alienfile_skip_if_missing_prereqs alienfile_skip_if_missing_prereqs; alienfile_skip_if_missing_prereqs $phase; Skips the test or subtest if the prereqs for the alienfile are missing. If C<$phase> is not given, then either C or C will be detected. =head2 alien_install_type_is alien_install_type_is $type; alien_install_type_is $type, $name; Simple test to see if the install type is what you expect. C<$type> should be one of C or C. =head2 alien_download_ok my $file = alien_download_ok; my $file = alien_download_ok $name; Makes a download attempt and test that a file or directory results. Returns the file or directory if successful. Returns C otherwise. =head2 alien_extract_ok my $dir = alien_extract_ok; my $dir = alien_extract_ok $archive; my $dir = alien_extract_ok $archive, $name; my $dir = alien_extract_ok undef, $name; Makes an extraction attempt and test that a directory results. Returns the directory if successful. Returns C otherwise. =head2 alien_build_ok my $alien = alien_build_ok; my $alien = alien_build_ok $name; my $alien = alien_build_ok { class => $class }; my $alien = alien_build_ok { class => $class }, $name; Runs the download and build stages. Passes if the build succeeds. Returns an instance of L which can be passed into C from L. Returns C if the test fails. Options =over 4 =item class The base class to use for your alien. This is L by default. Should be a subclass of L, or at least adhere to its API. =back =head2 alien_build_clean alien_build_clean; Removes all files with the current build, except for the runtime prefix. This helps test that the final install won't depend on the build files. =head2 alien_clean_install alien_clean_install; Runs C<$build-Eclean_install>, and verifies it did not crash. =head2 alien_checkpoint_ok alien_checkpoint_ok; alien_checkpoint_ok $test_name; Test the checkpoint of a build. =head2 alien_resume_ok alien_resume_ok; alien_resume_ok $test_name; Test a resume a checkpointed build. =head2 alien_rc alien_rc $code; Creates C file in a temp directory and sets ALIEN_BUILD_RC. Useful for testing plugins that should be called from C<~/.alienbuild/rc.pl>. Note that because of the nature of how the C<~/.alienbuild/rc.pl> file works, you can only use this once! =head2 alien_subtest alien_subtest $test_name => sub { ... }; Clear the build object and clear the build object before and after the subtest. =head1 SEE ALSO =over 4 =item L =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Test/Alien/CanCompile.pm000644 000000 000000 00000003631 14710030646 020603 0ustar00rootroot000000 000000 package Test::Alien::CanCompile; use strict; use warnings; use 5.008004; use Test2::API qw( context ); # ABSTRACT: Skip a test file unless a C compiler is available our $VERSION = '2.84'; # VERSION sub skip { require ExtUtils::CBuilder; ExtUtils::CBuilder->new->have_compiler ? undef : 'This test requires a compiler.'; } sub import { my $skip = __PACKAGE__->skip; return unless defined $skip; my $ctx = context(); $ctx->plan(0, SKIP => $skip); $ctx->release; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Test::Alien::CanCompile - Skip a test file unless a C compiler is available =head1 VERSION version 2.84 =head1 SYNOPSIS use Test::Alien::CanCompile; =head1 DESCRIPTION This is just a L plugin that requires that a compiler be available. Otherwise the test will be skipped. =head1 SEE ALSO =over 4 =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Test/Alien/CanPlatypus.pm000644 000000 000000 00000003634 14710030646 021037 0ustar00rootroot000000 000000 package Test::Alien::CanPlatypus; use strict; use warnings; use 5.008004; use Test2::API qw( context ); # ABSTRACT: Skip a test file unless FFI::Platypus is available our $VERSION = '2.84'; # VERSION sub skip { eval { require FFI::Platypus; 1 } ? undef : 'This test requires FFI::Platypus.'; } sub import { my $skip = __PACKAGE__->skip; return unless defined $skip; my $ctx = context(); $ctx->plan(0, SKIP => $skip); $ctx->release; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Test::Alien::CanPlatypus - Skip a test file unless FFI::Platypus is available =head1 VERSION version 2.84 =head1 SYNOPSIS use Test::Alien::CanPlatypus; =head1 DESCRIPTION This is just a L plugin that requires that L be available. Otherwise the test will be skipped. =head1 SEE ALSO =over 4 =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Test/Alien/Diag.pm000644 000000 000000 00000010430 14710030646 017430 0ustar00rootroot000000 000000 package Test::Alien::Diag; use strict; use warnings; use 5.008004; use Test2::API qw( context ); use Exporter qw( import ); our @EXPORT = qw( alien_diag ); our @EXPORT_OK = @EXPORT; # ABSTRACT: Print out standard diagnostic for Aliens in the test step. our $VERSION = '2.84'; # VERSION my @default_scalar_properties = qw( cflags cflags_static libs libs_static version install_type ); my @default_list_properties = qw( dynamic_libs bin_dir ); sub alien_diag ($@) { my $ctx = context(); my %options = defined $_[-1] && ref($_[-1]) eq 'HASH' ? %{ pop @_ } : (); my @extra_properties = @{ delete $options{properties} || [] }; my @extra_list_properties = @{ delete $options{list_properties} || [] }; my $max = 0; foreach my $alien (@_) { foreach my $name (@default_scalar_properties, @default_list_properties, @extra_properties, @extra_list_properties) { if(eval { $alien->can($name) }) { my $str = "$alien->$name"; if(length($str) > $max) { $max = length($str); } } } } $ctx->diag(''); if(%options) { my @extra = sort keys %options; $ctx->diag("warning: unknown option@{[ @extra > 1 ? 's' : '' ]} for alien_diag: @extra"); $ctx->diag("(you should check for typos or maybe upgrade to a newer version of Alien::Build)"); } foreach my $alien (@_) { $ctx->diag('') for 1..2; my $found = 0; foreach my $name (sort(@default_scalar_properties, @extra_properties)) { if(eval { $alien->can($name) }) { $found++; my $value = $alien->$name; $value = '[undef]' unless defined $value; $ctx->diag(sprintf "%-${max}s = %s", "$alien->$name", $value); } } foreach my $name (sort(@default_list_properties, @extra_list_properties)) { if(eval { $alien->can($name) }) { $found++; my @list = eval { $alien->$name }; next if $@; $ctx->diag(sprintf "%-${max}s = %s", "$alien->$name", $_) for @list; } } $ctx->diag("no diagnostics found for $alien") unless $found; } $ctx->diag('') for 1..2; $ctx->release; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Test::Alien::Diag - Print out standard diagnostic for Aliens in the test step. =head1 VERSION version 2.84 =head1 SYNOPSIS use Test2::V0; use Test::Alien::Diag qw( alien_diag ); =head1 DESCRIPTION This module provides an C method that prints out diagnostics useful for cpantesters and other bug reports that gives a quick summary of the important settings like C and C. =head1 FUNCTIONS =head2 alien_diag alien_diag @aliens; prints out diagnostics for each given alien. Each alien must be the class name of an alien. [version 2.68] alien_diag @aliens, \%options; Starting with L 2.68, you can provide an option hash to adjust the behavior of C. Valid options are: =over 4 =item properties Additional properties to display in the diagnostic. Useful when you have an L with custom properties defined in the subclass. =item list_properties Additional properties that are returned as a list to display in the diagnostic. Useful when you have an L with customer properties that return a list. =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Test/Alien/Run.pm000644 000000 000000 00000014144 14710030646 017336 0ustar00rootroot000000 000000 package Test::Alien::Run; use strict; use warnings; use 5.008004; use Test2::API qw( context ); # ABSTRACT: Run object our $VERSION = '2.84'; # VERSION sub out { shift->{out} } sub err { shift->{err} } sub exit { shift->{exit} } sub signal { shift->{sig} } sub success { my($self, $message) = @_; $message ||= 'command succeeded'; my $ok = $self->exit == 0 && $self->signal == 0; $ok = 0 if $self->{fail}; my $ctx = context(); $ctx->ok($ok, $message); unless($ok) { $ctx->diag(" command exited with @{[ $self->exit ]}") if $self->exit; $ctx->diag(" command killed with @{[ $self->signal ]}") if $self->signal; $ctx->diag(" @{[ $self->{fail} ]}") if $self->{fail}; } $ctx->release; $self; } sub exit_is { my($self, $exit, $message) = @_; $message ||= "command exited with value $exit"; my $ok = $self->exit == $exit; my $ctx = context(); $ctx->ok($ok, $message); $ctx->diag(" actual exit value was: @{[ $self->exit ]}") unless $ok; $ctx->release; $self; } sub exit_isnt { my($self, $exit, $message) = @_; $message ||= "command exited with value not $exit"; my $ok = $self->exit != $exit; my $ctx = context(); $ctx->ok($ok, $message); $ctx->diag(" actual exit value was: @{[ $self->exit ]}") unless $ok; $ctx->release; $self; } sub _like { my($self, $regex, $source, $not, $message) = @_; my $ok = $self->{$source} =~ $regex; $ok = !$ok if $not; my $ctx = context(); $ctx->ok($ok, $message); unless($ok) { $ctx->diag(" $source:"); $ctx->diag(" $_") for split /\r?\n/, $self->{$source}; $ctx->diag($not ? ' matches:' : ' does not match:'); $ctx->diag(" $regex"); } $ctx->release; $self; } sub out_like { my($self, $regex, $message) = @_; $message ||= "output matches $regex"; $self->_like($regex, 'out', 0, $message); } sub out_unlike { my($self, $regex, $message) = @_; $message ||= "output does not match $regex"; $self->_like($regex, 'out', 1, $message); } sub err_like { my($self, $regex, $message) = @_; $message ||= "standard error matches $regex"; $self->_like($regex, 'err', 0, $message); } sub err_unlike { my($self, $regex, $message) = @_; $message ||= "standard error does not match $regex"; $self->_like($regex, 'err', 1, $message); } sub note { my($self) = @_; my $ctx = context(); $ctx->note("[cmd]"); $ctx->note(" @{$self->{cmd}}"); if($self->out ne '') { $ctx->note("[out]"); $ctx->note(" $_") for split /\r?\n/, $self->out; } if($self->err ne '') { $ctx->note("[err]"); $ctx->note(" $_") for split /\r?\n/, $self->err; } $ctx->release; $self; } sub diag { my($self) = @_; my $ctx = context(); $ctx->diag("[cmd]"); $ctx->diag(" @{$self->{cmd}}"); if($self->out ne '') { $ctx->diag("[out]"); $ctx->diag(" $_") for split /\r?\n/, $self->out; } if($self->err ne '') { $ctx->diag("[err]"); $ctx->diag(" $_") for split /\r?\n/, $self->err; } $ctx->release; $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Test::Alien::Run - Run object =head1 VERSION version 2.84 =head1 SYNOPSIS use Test2::V0; use Test::Alien; run_ok([ $^X, -e => 'print "some output"; exit 22']) ->exit_is(22) ->out_like(qr{some}); =head1 DESCRIPTION This class stores information about a process run as performed by L. That function is the I way to create an instance of this class. =head1 ATTRIBUTES =head2 out my $str = $run->out; The standard output from the run. =head2 err my $str = $run->err; The standard error from the run. =head2 exit my $int = $run->exit; The exit value of the run. =head2 signal my $int = $run->signal; The signal that killed the run, or zero if the process was terminated normally. =head1 METHODS These methods return the run object itself, so they can be chained, as in the synopsis above. =head2 success $run->success; $run->success($message); Passes if the process terminated normally with an exit value of 0. =head2 exit_is $run->exit_is($exit); $run->exit_is($exit, $message); Passes if the process terminated with the given exit value. =head2 exit_isnt $run->exit_isnt($exit); $run->exit_isnt($exit, $message); Passes if the process terminated with an exit value of anything but the given value. =head2 out_like $run->out_like($regex); $run->out_like($regex, $message); Passes if the output of the run matches the given pattern. =head2 out_unlike $run->out_unlike($regex); $run->out_unlike($regex, $message); Passes if the output of the run does not match the given pattern. =head2 err_like $run->err_like($regex); $run->err_like($regex, $message); Passes if the standard error of the run matches the given pattern. =head2 err_unlike $run->err_unlike($regex); $run->err_unlike($regex, $message); Passes if the standard error of the run does not match the given pattern. =head2 note $run->note; Send the output and standard error as test note. =head2 diag $run->diag; Send the output and standard error as test diagnostic. =head1 SEE ALSO =over 4 =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/Test/Alien/Synthetic.pm000644 000000 000000 00000010560 14710030646 020542 0ustar00rootroot000000 000000 package Test::Alien::Synthetic; use strict; use warnings; use 5.008004; use Test2::API qw( context ); # ABSTRACT: A mock alien object for testing our $VERSION = '2.84'; # VERSION sub _def ($) { my($val) = @_; defined $val ? $val : '' } sub cflags { _def shift->{cflags} } sub libs { _def shift->{libs} } sub dynamic_libs { @{ shift->{dynamic_libs} || [] } } sub runtime_prop { my($self) = @_; defined $self->{runtime_prop} ? $self->{runtime_prop} : {}; } sub cflags_static { my($self) = @_; defined $self->{cflags_static} ? $self->{cflags_static} : $self->cflags; } sub libs_static { my($self) = @_; defined $self->{libs_static} ? $self->{libs_static} : $self->libs; } sub bin_dir { my $dir = shift->{bin_dir}; defined $dir && -d $dir ? ($dir) : (); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Test::Alien::Synthetic - A mock alien object for testing =head1 VERSION version 2.84 =head1 SYNOPSIS use Test2::V0; use Test::Alien; my $alien = synthetic { cflags => '-I/foo/bar/include', libs => '-L/foo/bar/lib -lbaz', }; alien_ok $alien; done_testing; =head1 DESCRIPTION This class is used to model a synthetic L class that implements the minimum L interface needed by L. It can be useful if you have a non-L based L distribution that you need to test. B: The name of this class may move in the future, so do not refer to this class name directly. Instead create instances of this class using the L function. =head1 ATTRIBUTES =head2 cflags String containing the compiler flags =head2 cflags_static String containing the static compiler flags =head2 libs String containing the linker and library flags =head2 libs_static String containing the static linker and library flags =head2 dynamic_libs List reference containing the dynamic libraries. =head2 bin_dir Tool binary directory. =head2 runtime_prop Runtime properties. =head1 EXAMPLE Here is a complete example using L which is a non-L based L distribution. use strict; use warnings; use Test2::V0; use Test::Alien; use Alien::Libarchive; my $real = Alien::Libarchive->new; my $alien = synthetic { cflags => scalar $real->cflags, libs => scalar $real->libs, dynamic_libs => [$real->dlls], }; alien_ok $alien; xs_ok do { local $/; }, with_subtest { my($module) = @_; my $ptr = $module->archive_read_new; like $ptr, qr{^[0-9]+$}; $module->archive_read_free($ptr); }; ffi_ok { symbols => [qw( archive_read_new )] }, with_subtest { my($ffi) = @_; my $new = $ffi->function(archive_read_new => [] => 'opaque'); my $free = $ffi->function(archive_read_close => ['opaque'] => 'void'); my $ptr = $new->(); like $ptr, qr{^[0-9]+$}; $free->($ptr); }; done_testing; __DATA__ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include MODULE = TA_MODULE PACKAGE = TA_MODULE void *archive_read_new(class); const char *class; CODE: RETVAL = (void*) archive_read_new(); OUTPUT: RETVAL void archive_read_free(class, ptr); const char *class; void *ptr; CODE: archive_read_free(ptr); =head1 SEE ALSO =over 4 =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/lib/alienfile.pm000644 000000 000000 00000040751 14710030646 016556 0ustar00rootroot000000 000000 package alienfile; use strict; use warnings; use 5.008004; use Alien::Build; use Exporter (); use Path::Tiny (); use Carp (); sub _path { Path::Tiny::path(@_) } # ABSTRACT: Specification for defining an external dependency for CPAN our $VERSION = '2.84'; # VERSION our @EXPORT = qw( requires on plugin probe configure share sys download fetch decode prefer extract patch patch_ffi build build_ffi gather gather_ffi meta_prop ffi log test start_url before after digest ); sub requires { my($module, $version) = @_; $version ||= 0; my $caller = caller; my $meta = $caller->meta; $meta->add_requires($meta->{phase}, $module, $version); (); } sub plugin { my($name, @args) = @_; my $caller = caller; $caller->meta->apply_plugin($name, @args); return; } sub probe { my($instr) = @_; my $caller = caller; if(my $phase = $caller->meta->{phase}) { Carp::croak "probe must not be in a $phase block" if $phase ne 'any'; } $caller->meta->register_hook(probe => $instr); return; } sub _phase { my($code, $phase) = @_; my $caller = caller(1); my $meta = $caller->meta; local $meta->{phase} = $phase; $code->(); return; } sub configure (&) { _phase($_[0], 'configure'); } sub sys (&) { _phase($_[0], 'system'); } sub share (&) { _phase($_[0], 'share'); } sub _in_phase { my($phase) = @_; my $caller = caller(1); my(undef, undef, undef, $sub) = caller(1); my $meta = $caller->meta; $sub =~ s/^.*:://; Carp::croak "$sub must be in a $phase block" unless $meta->{phase} eq $phase; } sub start_url { my($url) = @_; _in_phase 'share'; my $caller = caller; my $meta = $caller->meta; $meta->prop->{start_url} = $url; $meta->add_requires('configure' => 'Alien::Build' => '1.19'); return; } sub digest { my($algo, $digest) = @_; my $caller = caller; $caller->meta->apply_plugin('Digest', [$algo, $digest]); return; } sub download { my($instr) = @_; _in_phase 'share'; my $caller = caller; $caller->meta->register_hook(download => $instr); return; } sub fetch { my($instr) = @_; _in_phase 'share'; my $caller = caller; $caller->meta->register_hook(fetch => $instr); return; } sub decode { my($instr) = @_; _in_phase 'share'; my $caller = caller; $caller->meta->register_hook(decode => $instr); return; } sub prefer { my($instr) = @_; _in_phase 'share'; my $caller = caller; $caller->meta->register_hook(prefer => $instr); return; } sub extract { my($instr) = @_; _in_phase 'share'; my $caller = caller; $caller->meta->register_hook(extract => $instr); return; } sub patch { my($instr) = @_; _in_phase 'share'; my $caller = caller; my $suffix = $caller->meta->{build_suffix}; $caller->meta->register_hook("patch$suffix" => $instr); return; } sub patch_ffi { my($instr) = @_; Carp::carp("patch_ffi is deprecated, use ffi { patch ... } } instead"); _in_phase 'share'; my $caller = caller; $caller->meta->register_hook(patch_ffi => $instr); return; } sub build { my($instr) = @_; _in_phase 'share'; my $caller = caller; my $suffix = $caller->meta->{build_suffix}; $caller->meta->register_hook("build$suffix" => $instr); return; } sub build_ffi { my($instr) = @_; Carp::carp("build_ffi is deprecated, use ffi { build ... } } instead"); _in_phase 'share'; my $caller = caller; $caller->meta->register_hook(build_ffi => $instr); return; } sub gather { my($instr) = @_; my $caller = caller; my $meta = $caller->meta; my $phase = $meta->{phase}; Carp::croak "gather is not allowed in configure block" if $phase eq 'configure'; my $suffix = $caller->meta->{build_suffix}; if($suffix eq '_ffi') { $meta->register_hook(gather_ffi => $instr) } else { $meta->register_hook(gather_system => $instr) if $phase =~ /^(any|system)$/; $meta->register_hook(gather_share => $instr) if $phase =~ /^(any|share)$/; } return; } sub gather_ffi { my($instr) = @_; Carp::carp("gather_ffi is deprecated, use ffi { gather ... } } instead"); _in_phase 'share'; my $caller = caller; $caller->meta->register_hook(gather_ffi => $instr); return; } sub ffi (&) { my($code) = @_; _in_phase 'share'; my $caller = caller; local $caller->meta->{build_suffix} = '_ffi'; $code->(); return; } sub meta_prop { my $caller = caller; my $meta = $caller->meta; $meta->prop; } sub log { unshift @_, 'Alien::Build'; goto &Alien::Build::log; } sub test { my($instr) = @_; my $caller = caller; my $meta = $caller->meta; my $phase = $meta->{phase}; Carp::croak "test is not allowed in $phase block" if $phase eq 'any' || $phase eq 'configure'; $meta->add_requires('configure' => 'Alien::Build' => '1.14'); if($phase eq 'share') { my $suffix = $caller->meta->{build_suffix} || '_share'; $meta->register_hook( "test$suffix" => $instr, ); } elsif($phase eq 'system') { $meta->register_hook( "test_system" => $instr, ); } else { die "unknown phase: $phase"; } } my %modifiers = ( probe => { any => 'probe' }, download => { share => 'download' }, fetch => { share => 'fetch' }, decode => { share => 'fetch' }, prefer => { share => 'prefer' }, extract => { share => 'extract' }, patch => { share => 'patch$' }, build => { share => 'build$' }, test => { share => 'test$' }, # Note: below special case gather_ffi for the ffi block :P gather => { share => 'gather_share', system => 'gather_system', any => 'gather_share,gather_system' }, ); sub _add_modifier { my($type, $stage, $sub) = @_; my $method = "${type}_hook"; Carp::croak "No such stage $stage" unless defined $modifiers{$stage}; Carp::croak "$type $stage argument must be a code reference" unless defined $sub && ref($sub) eq 'CODE'; my $caller = caller; my $meta = $caller->meta; Carp::croak "$type $stage is not allowed in sys block" unless defined $modifiers{$stage}->{$meta->{phase}}; $meta->add_requires('configure' => 'Alien::Build' => '1.40'); my $suffix = $meta->{build_suffix}; if($suffix eq '_ffi' && $stage eq 'gather') { $meta->$method('gather_ffi' => $sub); } foreach my $hook ( map { split /,/, $_ } # split on , for when multiple hooks must be attached (gather in any) map { my $x = $_ ; $x =~ s/\$/$suffix/; $x } # substitute $ at the end for a suffix (_ffi) if any $modifiers{$stage}->{$meta->{phase}}) # get the list of modifiers { $meta->$method($hook => $sub); } return; } sub before { my($stage, $sub) = @_; @_ = ('before', @_); goto &alienfile::_add_modifier; } sub after { my($stage, $sub) = @_; @_ = ('after', @_); goto &alienfile::_add_modifier; } sub import { strict->import; warnings->import; goto &Exporter::import; } 1; __END__ =pod =encoding UTF-8 =head1 NAME alienfile - Specification for defining an external dependency for CPAN =head1 VERSION version 2.84 =head1 SYNOPSIS Do-it-yourself approach: use alienfile; probe [ 'pkg-config --exists libarchive' ]; share { start_url 'http://libarchive.org/downloads/libarchive-3.2.2.tar.gz'; # the first one which succeeds will be used download [ 'wget %{.meta.start_url}' ]; download [ 'curl -o %{.meta.start_url}' ]; extract [ 'tar xf %{.install.download}' ]; build [ # Note: will not work on Windows, better to use Build::Autoconf plugin # if you need windows support './configure --prefix=%{.install.prefix} --disable-shared', '%{make}', '%{make} install', ]; } gather [ [ 'pkg-config', '--modversion', 'libarchive', \'%{.runtime.version}' ], [ 'pkg-config', '--cflags', 'libarchive', \'%{.runtime.cflags}' ], [ 'pkg-config', '--libs', 'libarchive', \'%{.runtime.libs}' ], ]; With plugins (better): use alienfile; plugin 'PkgConfig' => 'libarchive'; share { start_url 'http://libarchive.org/downloads/'; plugin Download => ( filter => qr/^libarchive-.*\.tar\.gz$/, version => qr/([0-9\.]+)/, ); plugin Extract => 'tar.gz'; plugin 'Build::Autoconf'; plugin 'Gather::IsolateDynamic'; build [ '%{configure}', '%{make}', '%{make} install', ]; }; =head1 DESCRIPTION An alienfile is a recipe used by L to, probe for system libraries or download from the internet, and build source for those libraries. This document acts as reference for the alienfile system, but if you are starting out writing your own Alien you should read L, which will teach you how to write your own complete Alien using alienfile + L + L. Special attention should be taken to the section "a note about dynamic vs. static libraries". =head1 DIRECTIVES =head2 requires "any" requirement (either share or system): requires $module; requires $module => $version; configure time requirement: configure { requires $module; requires $module => $version; }; system requirement: sys { requires $module; requires $module => $version; }; share requirement: share { requires $module; requires $module => $version; }; specifies a requirement. L takes advantage of dynamic requirements, so only modules that are needed for the specific type of install need to be loaded. Here are the different types of requirements: =over =item configure Configure requirements should already be installed before the alienfile is loaded. =item any "Any" requirements are those that are needed either for the probe stage, or in either the system or share installs. =item share Share requirements are those modules needed when downloading and building from source. =item system System requirements are those modules needed when the system provides the library or tool. =back =head2 plugin plugin $name => (%args); plugin $name => $arg; Load the given plugin. If you prefix the plugin name with an C<=> sign, then it will be assumed to be a fully qualified path name. Otherwise the plugin will be assumed to live in the C namespace. If there is an appropriate negotiate plugin, that one will be loaded. Examples: # Loads Alien::Build::Plugin::Fetch::Negotiate # which will pick the best Alien::Build::Plugin::Fetch # plugin based on the URL, and system configuration plugin 'Fetch' => 'http://ftp.gnu.org/gnu/gcc'; # loads the plugin with the badly named class! plugin '=Badly::Named::Plugin::Not::In::Alien::Build::Namespace'; # explicitly loads Alien::Build::Plugin::Prefer::SortVersions plugin 'Prefer::SortVersions' => ( filter => qr/^gcc-.*\.tar\.gz$/, version => qr/([0-9\.]+)/, ); =head2 probe probe \&code; probe \@commandlist; Instructions for the probe stage. May be either a code reference, or a command list. Multiple probes and probe plugins can be given. These will be used in sequence, stopping at the first that detects a system installation. L will use a share install if no system installation is detected by the probes. =head2 configure configure { ... }; Configure block. The only directive allowed in a configure block is requires. =head2 sys sys { ... }; System block. Allowed directives are: requires and gather. =head2 share share { ... }; System block. Allowed directives are: download, fetch, decode, prefer, extract, build, gather. =head2 start_url share { start_url $url; }; Set the start URL for download. This should be the URL to an index page, or the actual tarball of the source. =head2 digest [experimental] share { digest $algorithm, $digest; }; Check fetched and downloaded files against the given algorithm and digest. Typically you will want to use SHA256 as the algorithm. =head2 download share { download \&code; download \@commandlist; }; Instructions for the download stage. May be either a code reference, or a command list. =head2 fetch share { fetch \&code; fetch \@commandlist; }; Instructions for the fetch stage. May be either a code reference, or a command list. =head2 decode share { decode \&code; decode \@commandlist; }; Instructions for the decode stage. May be either a code reference, or a command list. =head2 prefer share { prefer \&code; prefer \@commandlist; }; Instructions for the prefer stage. May be either a code reference, or a command list. =head2 extract share { extract \&code; extract \@commandlist; }; Instructions for the extract stage. May be either a code reference, or a command list. =head2 patch share { patch \&code; patch \@commandlist; }; Instructions for the patch stage. May be either a code reference, or a command list. =head2 patch_ffi share { patch_ffi \&code; patch_ffi \@commandlist; }; [DEPRECATED] Instructions for the patch_ffi stage. May be either a code reference, or a command list. =head2 build share { build \&code; build \@commandlist; }; Instructions for the build stage. May be either a code reference, or a command list. =head2 build_ffi share { build \&code; build \@commandlist; }; [DEPRECATED] Instructions for the build FFI stage. Builds shared libraries instead of static. This is optional, and is only necessary if a fresh and separate build needs to be done for FFI. =head2 gather gather \&code; gather \@commandlist; share { gather \&code; gather \@commandlist; }; sys { gather \&code; gather \@commandlist; }; Instructions for the gather stage. May be either a code reference, or a command list. In the root block of the alienfile it will trigger in both share and system build. In the share or sys block it will only trigger in the corresponding build. =head2 gather_ffi share { gather_ffi \&code; gather_ffi \@commandlist; } [DEPRECATED] Gather specific to C. Not usually necessary. =head2 ffi share { ffi { patch \&code; patch \@commandlist; build \&code; build \@commandlist; gather \&code; gather \@commandlist; } } Specify patch, build or gather stages related to FFI. =head2 meta_prop my $hash = meta_prop; Get the meta_prop hash reference. =head2 meta my $meta = meta; Returns the meta object for your L. For methods that can be used on the meta object, see L. =head2 log log($message); Prints the given log to stdout. =head2 test share { test \&code; test \@commandlist; }; sys { test \&code; test \@commandlist; }; Run the tests =head2 before before $stage => \&code; Execute the given code before the given stage. Stage should be one of C, C, C, C, C, C, C, C, C, and C. The before directive is only legal in the same blocks as the stage would normally be legal in. For example, you can't do this: use alienfile; sys { before 'build' => sub { ... }; }; Because a C wouldn't be legal inside a C block. =head2 after after $stage => \&code; Execute the given code after the given stage. Stage should be one of C, C, C, C, C, C, C, C, C, and C. The after directive is only legal in the same blocks as the stage would normally be legal in. For example, you can't do this: use alienfile; sys { after 'build' => sub { ... }; }; Because a C wouldn't be legal inside a C block. =head1 SEE ALSO =over 4 =item L =item L =item L =item L =back =head1 AUTHOR Author: Graham Ollis Eplicease@cpan.orgE Contributors: Diab Jerius (DJERIUS) Roy Storey (KIWIROY) Ilya Pavlov David Mertens (run4flat) Mark Nunberg (mordy, mnunberg) Christian Walde (Mithaldu) Brian Wightman (MidLifeXis) Zaki Mughal (zmughal) mohawk (mohawk2, ETJ) Vikas N Kumar (vikasnkumar) Flavio Poletti (polettix) Salvador Fandiño (salva) Gianni Ceccarelli (dakkar) Pavel Shaydo (zwon, trinitum) Kang-min Liu (劉康民, gugod) Nicholas Shipp (nshp) Juan Julián Merelo Guervós (JJ) Joel Berger (JBERGER) Petr PísaÅ™ (ppisar) Lance Wicks (LANCEW) Ahmad Fatoum (a3f, ATHREEF) José Joaquín Atria (JJATRIA) Duke Leto (LETO) Shoichi Kaji (SKAJI) Shawn Laffan (SLAFFAN) Paul Evans (leonerd, PEVANS) HÃ¥kon Hægland (hakonhagland, HAKONH) nick nauwelaerts (INPHOBIA) Florian Weimer =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011-2022 by Graham Ollis. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Alien-Build-2.84/maint/000755 000000 000000 00000000000 14710030646 014623 5ustar00rootroot000000 000000 Alien-Build-2.84/maint/Alien-Base-PkgConfig/000755 000000 000000 00000000000 14710030646 020370 5ustar00rootroot000000 000000 Alien-Build-2.84/maint/Alien-Base-PkgConfig/Makefile.PL000644 000000 000000 00000000360 14710030646 022341 0ustar00rootroot000000 000000 use strict; use warnings; use ExtUtils::MakeMaker; WriteMakefile( NAME => "Alien::Base::PkgConfig", VERSION_FROM => "lib/Alien/Base/PkgConfig.pm", PREREQ_PM => { 'Capture::Tiny' => 0, 'Path::Tiny' => 0, }, ); Alien-Build-2.84/maint/ci-test-plugins.pl000644 000000 000000 00000002750 14710030646 020213 0ustar00rootroot000000 000000 use strict; use warnings; use File::Glob qw( bsd_glob ); exit if $] < 5.012; my $exit = 0; my @fails; sub run { print "% @_\n"; system(@_); if($?) { push @fails, [@_]; warn "command failed!"; } } my(@tarball) = bsd_glob 'Alien-Build-*.tar.gz'; die "not exactly one tarball: @tarball" if @tarball != 1; my $tarball = shift @tarball; run 'cpanm', '-n', $tarball; my %min = ( 'Alien::Build::Plugin::Extract::Libarchive' => 5.020 ); # TODO: Alien::Build::Plugin::Build::Premake5 my @mods = qw( Alien::Build::MB Alien::Build::Git Alien::Role::Dino Alien::Build::Plugin::Decode::SourceForge Alien::Build::Plugin::Download::GitHub Alien::Build::Plugin::Download::GitLab Alien::Build::Plugin::Cleanse::BuildDir Alien::Build::Plugin::Extract::Libarchive Alien::Build::Plugin::Fetch::Cache Alien::Build::Plugin::Fetch::HostAllowList Alien::Build::Plugin::Fetch::HostBlockList Alien::Build::Plugin::Fetch::Prompt Alien::Build::Plugin::PkgConfig::PPWrapper Alien::Build::Plugin::Probe::GnuWin32 Alien::Build::Plugin::Probe::Override Alien::Build::Plugin::Fetch::Rewrite ); foreach my $mod (@mods) { my $min = $min{$mod}; if(defined $min) { next unless $] >= $min; } { local $ENV{ALIEN_DOWNLOAD_RULE} = 'default'; local $ENV{ALIEN_INSTALL_TYPE} = 'default'; run 'cpanm', '--installdeps', '-n', $mod; } run 'cpanm', '--reinstall', '-v', $mod; } if(@fails) { print "failure summary:\n"; print "+@{[ @$_ ]}" for @fails; exit 2; } Alien-Build-2.84/maint/cip-after-install000755 000000 000000 00000000236 14710030646 020070 0ustar00rootroot000000 000000 #!/bin/bash set -ex if [ "x$ALIEN_BUILD_INSTALL_EXTRA" == "x1" ]; then cip exec $CIP_DIST_DIR/t/bin/httpd -d cip exec $CIP_DIST_DIR/t/bin/ftpd -d fi Alien-Build-2.84/maint/cip-before-install000755 000000 000000 00000002157 14710030646 020235 0ustar00rootroot000000 000000 #!/bin/bash set -ex if echo $CIP_TAG | grep -q -- -alpine ; then echo alpine cip sudo apk add cmake cip sudo apk add pkgconf-dev cip sudo apk add libffi-dev # needed for plugin tests later cip sudo apk add git cip sudo apk add g++ elif echo $CIP_TAG | grep -q -- -fedora ; then echo Fedora cip sudo yum install cmake libffi-devel wget git g++ -y else echo Debian or Ubuntu cip sudo apt-get update cip sudo apt-get -y install pkg-config cmake libffi-dev wget git g++ fi if [ "x$ALIEN_BUILD_INSTALL_EXTRA" == "x1" ]; then cip exec env PERL_ALT_INSTALL=OVERWRITE cpanm -n Alt::Alien::cmake3::System cip exec cpanm -n \ Test2::Harness \ File::Listing \ File::Listing::Ftpcopy \ HTML::LinkExtor \ HTTP::Tiny \ LWP \ PkgConfig \ PkgConfig::LibPkgConf \ Sort::Versions \ URI \ YAML \ Env::ShellWords \ Archive::Tar \ Archive::Zip \ Devel::Hide \ Readonly \ Alien::Base::ModuleBuild \ FFI::Platypus \ Mojo::DOM58 \ Mojolicious \ Win32::Vcpkg \ Plack \ Proc::Daemon \ AnyEvent::FTP \ Digest::SHA::PurePerl fi Alien-Build-2.84/maint/cip-test-plugins000755 000000 000000 00000000167 14710030646 017764 0ustar00rootroot000000 000000 #!/bin/bash set -ex if [ "$CIP_TAG" = "static" ]; then echo skip else cip exec perl maint/ci-test-plugins.pl fi Alien-Build-2.84/maint/gen-test-archives.pl000644 000000 000000 00000001626 14710030646 020515 0ustar00rootroot000000 000000 use strict; use warnings; use File::Temp qw( tempdir ); use File::chdir; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); sub run { my @cmd = @_; my($out, $exit) = capture_merged { print "+@cmd\n"; system @cmd; $?; }; if($exit) { print $out; print STDERR "command failed\n"; exit 2; } } { local $CWD = tempdir( CLEANUP => 1 ); path('xx.txt')->spew("xx\n"); run 'tar', 'cvf', 'xx.tar', 'xx.txt'; run 'cp', 'xx.tar', 'xx.tar.bak'; run 'compress', 'xx.tar'; run 'mv', 'xx.tar.bak', 'xx.tar'; run 'gzip', '-k', 'xx.tar'; run 'bzip2', '-k', 'xx.tar'; run 'xz', '-k', 'xx.tar'; run 'zip', 'xx.zip', 'xx.txt'; run 'rm', '-f', 'xx.txt'; foreach my $file (sort { $a->basename cmp $b->basename } path('.')->children) { my $content = $file->slurp_raw; print "[ @{[ $file->basename ]} ]\n"; print pack('u', $content), "\n\n"; } } Alien-Build-2.84/maint/gen.pl000644 000000 000000 00000003107 14710030646 015732 0ustar00rootroot000000 000000 use strict; use warnings; my @list = sort map { chomp; s/\.pm$//; s/^lib\///; s/\//::/g; $_ } `find lib -name \*.pm`; open my $fh, '>', 't/01_use.t'; print $fh <<'EOM'; use Test2::V0 -no_srand => 1; sub require_ok ($); EOM foreach my $module (@list) { print $fh "require_ok '$module';\n"; } foreach my $module (@list) { my $test = lc $module; $test =~ s/::/_/g; $test = "t/$test.t"; printf $fh "ok -f %-55s %s\n", "'$test',", "'test for $module';"; } print $fh <<'EOM'; done_testing; sub require_ok ($) { # special case of when I really do want require_ok. # I just want a test that checks that the modules # will compile okay. I won't be trying to use them. my($mod) = @_; my $ctx = context(); { my $pm = "$mod.pm"; $pm =~ s/::/\//g; eval { require $pm }; } my $error = $@; my $ok = !$error; $ctx->ok($ok, "require $mod"); $ctx->diag("error: $error") if $error ne ''; $ctx->release; } EOM close $fh; #system 'perltidy -b -i=2 -l=900 t/01_use.t'; #unlink 't/01_use.t.bak'; { sub run { my(@cmd) = @_; print "% @cmd\n"; system @cmd; die 'command failed' if $?; } use autodie; mkdir 'corpus/dist2' unless -d 'corpus/dist2'; chdir 'corpus/dist2'; run 'rm', '-rf', 'foo', 'foo.tar'; mkdir 'foo'; run 'git', -C => 'foo', 'init'; open my $fh, '>', 'foo/foo.txt'; print $fh "xx\n"; close $fh; run 'git', -C => 'foo', 'add', '.'; run 'git', -C => 'foo', 'commit', -m => 'yy'; run 'git', -C => 'foo', 'archive', '--prefix=foo-1.00/', -o => '../foo.tar', 'master'; run 'rm', '-rf', 'foo'; chdir '../..'; } Alien-Build-2.84/maint/update-cmake-libpalindrome000755 000000 000000 00000000321 14710030646 021724 0ustar00rootroot000000 000000 #!/bin/bash set -euo pipefail IFS=$'\n\t' cd corpus rm -rf libpalindrome rm -rf cmake-libpalindrome git clone https://github.com/plicease/cmake-libpalindrome.git cd cmake-libpalindrome rm -rf .git* cd .. Alien-Build-2.84/perlcriticrc000644 000000 000000 00000003720 14710030646 016125 0ustar00rootroot000000 000000 severity = 1 only = 1 [Community::ArrayAssignAref] [Community::BarewordFilehandles] [Community::ConditionalDeclarations] [Community::ConditionalImplicitReturn] [Community::DeprecatedFeatures] [Community::DiscouragedModules] [Community::DollarAB] [Community::Each] [Community::EmptyReturn] [Community::IndirectObjectNotation] [Community::LexicalForeachIterator] [Community::LoopOnHash] [Community::ModPerl] [Community::OpenArgs] [Community::OverloadOptions] [Community::POSIXImports] [Community::PackageMatchesFilename] [Community::PreferredAlternatives] [Community::StrictWarnings] extra_importers = Test2::V0 [Community::Threads] [Community::Wantarray] [Community::WarningsSwitch] [Community::WhileDiamondDefaultAssignment] [BuiltinFunctions::ProhibitBooleanGrep] [BuiltinFunctions::ProhibitStringyEval] [BuiltinFunctions::ProhibitStringySplit] [BuiltinFunctions::ProhibitVoidGrep] [BuiltinFunctions::ProhibitVoidMap] [ClassHierarchies::ProhibitExplicitISA] [ClassHierarchies::ProhibitOneArgBless] [CodeLayout::ProhibitHardTabs] allow_leading_tabs = 0 [CodeLayout::ProhibitTrailingWhitespace] [CodeLayout::RequireConsistentNewlines] [ControlStructures::ProhibitLabelsWithSpecialBlockNames] [ControlStructures::ProhibitMutatingListFunctions] [ControlStructures::ProhibitUnreachableCode] [InputOutput::ProhibitBarewordFileHandles] [InputOutput::ProhibitJoinedReadline] [InputOutput::ProhibitTwoArgOpen] [Miscellanea::ProhibitFormats] [Miscellanea::ProhibitUselessNoCritic] [Modules::ProhibitConditionalUseStatements] ;[Modules::RequireEndWithOne] [Modules::RequireNoMatchVarsWithUseEnglish] [Objects::ProhibitIndirectSyntax] [RegularExpressions::ProhibitUselessTopic] [Subroutines::ProhibitNestedSubs] [ValuesAndExpressions::ProhibitLeadingZeros] [ValuesAndExpressions::ProhibitMixedBooleanOperators] [ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator] [ValuesAndExpressions::RequireUpperCaseHeredocTerminator] [Variables::ProhibitPerl4PackageNames] [Variables::ProhibitUnusedVariables] Alien-Build-2.84/spellcheck.ini000644 000000 000000 00000000255 14710030646 016333 0ustar00rootroot000000 000000 [Perl] skip_sections = contributors skip_sections = author skip_sections = copyright and license skip_sections = thanks [StopWords] word = unixy word = umake word = tar.exe Alien-Build-2.84/t/000755 000000 000000 00000000000 14710030646 013756 5ustar00rootroot000000 000000 Alien-Build-2.84/t/00_diag.t000644 000000 000000 00000005550 14710030646 015353 0ustar00rootroot000000 000000 use Test2::V0 -no_srand => 1; use Config; eval { require 'Test/More.pm' }; # This .t file is generated. # make changes instead to dist.ini my %modules; my $post_diag; $modules{$_} = $_ for qw( Acme::Alien::DontPanic Alien::Base::ModuleBuild Alien::Libbz2 Alien::cmake3 Alien::gzip Alien::xz Archive::Tar Archive::Zip Capture::Tiny Devel::Hide Digest::SHA Env::ShellWords ExtUtils::CBuilder ExtUtils::MakeMaker ExtUtils::ParseXS FFI::CheckLib FFI::Platypus File::Listing File::Listing::Ftpcopy File::Which File::chdir HTML::Parser HTTP::Tiny IO::Compress::Bzip2 IO::Socket::SSL IO::Uncompress::Bunzip2 IO::Zlib JSON::PP LWP LWP::Protocol::https List::Util Mojo::DOM58 Mojolicious Net::FTP Net::SSLeay Path::Tiny PkgConfig PkgConfig::LibPkgConf Plack Readonly Sort::Versions Test2::API Test2::V0 Text::ParseWords URI YAML parent ); $post_diag = sub { eval { require Alien::Build::Plugin::Core::Setup; require Alien::Build::Plugin::Build::Autoconf; require Alien::Build::Plugin::Build::CMake; require Alien::Build::Plugin::PkgConfig::Negotiate; require Alien::Build::Util; require File::Which; }; if($@) { diag "error: $@"; } else { my %hash; Alien::Build::Plugin::Core::Setup->_platform(\%hash); $hash{cmake_generator} = Alien::Build::Plugin::Build::CMake::cmake_generator(); $hash{'pkg-config'}->{$_} = File::Which::which($_) for qw( pkg-config pkgconf ); $hash{'pkg-config'}->{PKG_CONFIG} = File::Which::which($ENV{PKG_CONFIG}) if defined $ENV{PKG_CONFIG}; diag Alien::Build::Util::_dump(\%hash); diag "pkg-config negotiate pick = ", Alien::Build::Plugin::PkgConfig::Negotiate->pick; diag ''; diag ''; diag "[config.site]"; diag(Alien::Build::Plugin::Build::Autoconf->new->config_site); } }; my @modules = sort keys %modules; sub spacer () { diag ''; diag ''; diag ''; } pass 'okay'; my $max = 1; $max = $_ > $max ? $_ : $max for map { length $_ } @modules; our $format = "%-${max}s %s"; spacer; my @keys = sort grep /(MOJO|PERL|\A(LC|HARNESS)_|\A(SHELL|LANG)\Z)/i, keys %ENV; if(@keys > 0) { diag "$_=$ENV{$_}" for @keys; if($ENV{PERL5LIB}) { spacer; diag "PERL5LIB path"; diag $_ for split $Config{path_sep}, $ENV{PERL5LIB}; } elsif($ENV{PERLLIB}) { spacer; diag "PERLLIB path"; diag $_ for split $Config{path_sep}, $ENV{PERLLIB}; } spacer; } diag sprintf $format, 'perl', "$] $^O $Config{archname}"; foreach my $module (sort @modules) { my $pm = "$module.pm"; $pm =~ s{::}{/}g; if(eval { require $pm; 1 }) { my $ver = eval { $module->VERSION }; $ver = 'undef' unless defined $ver; diag sprintf $format, $module, $ver; } else { diag sprintf $format, $module, '-'; } } if($post_diag) { spacer; $post_diag->(); } spacer; done_testing; Alien-Build-2.84/t/01_use.t000644 000000 000000 00000025546 14710030646 015253 0ustar00rootroot000000 000000 use Test2::V0 -no_srand => 1; sub require_ok ($); require_ok 'Alien::Base'; require_ok 'Alien::Base::PkgConfig'; require_ok 'Alien::Base::Wrapper'; require_ok 'Alien::Build'; require_ok 'Alien::Build::CommandSequence'; require_ok 'Alien::Build::Interpolate'; require_ok 'Alien::Build::Interpolate::Default'; require_ok 'Alien::Build::Log'; require_ok 'Alien::Build::Log::Abbreviate'; require_ok 'Alien::Build::Log::Default'; require_ok 'Alien::Build::MM'; require_ok 'Alien::Build::Plugin'; require_ok 'Alien::Build::Plugin::Build::Autoconf'; require_ok 'Alien::Build::Plugin::Build::CMake'; require_ok 'Alien::Build::Plugin::Build::Copy'; require_ok 'Alien::Build::Plugin::Build::MSYS'; require_ok 'Alien::Build::Plugin::Build::Make'; require_ok 'Alien::Build::Plugin::Build::SearchDep'; require_ok 'Alien::Build::Plugin::Core::CleanInstall'; require_ok 'Alien::Build::Plugin::Core::Download'; require_ok 'Alien::Build::Plugin::Core::FFI'; require_ok 'Alien::Build::Plugin::Core::Gather'; require_ok 'Alien::Build::Plugin::Core::Legacy'; require_ok 'Alien::Build::Plugin::Core::Override'; require_ok 'Alien::Build::Plugin::Core::Setup'; require_ok 'Alien::Build::Plugin::Core::Tail'; require_ok 'Alien::Build::Plugin::Decode::DirListing'; require_ok 'Alien::Build::Plugin::Decode::DirListingFtpcopy'; require_ok 'Alien::Build::Plugin::Decode::HTML'; require_ok 'Alien::Build::Plugin::Decode::Mojo'; require_ok 'Alien::Build::Plugin::Download::Negotiate'; require_ok 'Alien::Build::Plugin::Extract::ArchiveTar'; require_ok 'Alien::Build::Plugin::Extract::ArchiveZip'; require_ok 'Alien::Build::Plugin::Extract::CommandLine'; require_ok 'Alien::Build::Plugin::Extract::Directory'; require_ok 'Alien::Build::Plugin::Extract::Negotiate'; require_ok 'Alien::Build::Plugin::Fetch::CurlCommand'; require_ok 'Alien::Build::Plugin::Fetch::HTTPTiny'; require_ok 'Alien::Build::Plugin::Fetch::LWP'; require_ok 'Alien::Build::Plugin::Fetch::Local'; require_ok 'Alien::Build::Plugin::Fetch::LocalDir'; require_ok 'Alien::Build::Plugin::Fetch::NetFTP'; require_ok 'Alien::Build::Plugin::Fetch::Wget'; require_ok 'Alien::Build::Plugin::Gather::IsolateDynamic'; require_ok 'Alien::Build::Plugin::PkgConfig::CommandLine'; require_ok 'Alien::Build::Plugin::PkgConfig::LibPkgConf'; require_ok 'Alien::Build::Plugin::PkgConfig::MakeStatic'; require_ok 'Alien::Build::Plugin::PkgConfig::Negotiate'; require_ok 'Alien::Build::Plugin::PkgConfig::PP'; require_ok 'Alien::Build::Plugin::Prefer::BadVersion'; require_ok 'Alien::Build::Plugin::Prefer::GoodVersion'; require_ok 'Alien::Build::Plugin::Prefer::SortVersions'; require_ok 'Alien::Build::Plugin::Probe::CBuilder'; require_ok 'Alien::Build::Plugin::Probe::CommandLine'; require_ok 'Alien::Build::Plugin::Probe::Vcpkg'; require_ok 'Alien::Build::Plugin::Test::Mock'; require_ok 'Alien::Build::Temp'; require_ok 'Alien::Build::Util'; require_ok 'Alien::Build::Version::Basic'; require_ok 'Alien::Build::rc'; require_ok 'Alien::Role'; require_ok 'Alien::Util'; require_ok 'Test::Alien'; require_ok 'Test::Alien::Build'; require_ok 'Test::Alien::CanCompile'; require_ok 'Test::Alien::CanPlatypus'; require_ok 'Test::Alien::Diag'; require_ok 'Test::Alien::Run'; require_ok 'Test::Alien::Synthetic'; require_ok 'alienfile'; ok -f 't/alien_base.t', 'test for Alien::Base'; ok -f 't/alien_base_pkgconfig.t', 'test for Alien::Base::PkgConfig'; ok -f 't/alien_base_wrapper.t', 'test for Alien::Base::Wrapper'; ok -f 't/alien_build.t', 'test for Alien::Build'; ok -f 't/alien_build_commandsequence.t', 'test for Alien::Build::CommandSequence'; ok -f 't/alien_build_interpolate.t', 'test for Alien::Build::Interpolate'; ok -f 't/alien_build_interpolate_default.t', 'test for Alien::Build::Interpolate::Default'; ok -f 't/alien_build_log.t', 'test for Alien::Build::Log'; ok -f 't/alien_build_log_abbreviate.t', 'test for Alien::Build::Log::Abbreviate'; ok -f 't/alien_build_log_default.t', 'test for Alien::Build::Log::Default'; ok -f 't/alien_build_mm.t', 'test for Alien::Build::MM'; ok -f 't/alien_build_plugin.t', 'test for Alien::Build::Plugin'; ok -f 't/alien_build_plugin_build_autoconf.t', 'test for Alien::Build::Plugin::Build::Autoconf'; ok -f 't/alien_build_plugin_build_cmake.t', 'test for Alien::Build::Plugin::Build::CMake'; ok -f 't/alien_build_plugin_build_copy.t', 'test for Alien::Build::Plugin::Build::Copy'; ok -f 't/alien_build_plugin_build_msys.t', 'test for Alien::Build::Plugin::Build::MSYS'; ok -f 't/alien_build_plugin_build_make.t', 'test for Alien::Build::Plugin::Build::Make'; ok -f 't/alien_build_plugin_build_searchdep.t', 'test for Alien::Build::Plugin::Build::SearchDep'; ok -f 't/alien_build_plugin_core_cleaninstall.t', 'test for Alien::Build::Plugin::Core::CleanInstall'; ok -f 't/alien_build_plugin_core_download.t', 'test for Alien::Build::Plugin::Core::Download'; ok -f 't/alien_build_plugin_core_ffi.t', 'test for Alien::Build::Plugin::Core::FFI'; ok -f 't/alien_build_plugin_core_gather.t', 'test for Alien::Build::Plugin::Core::Gather'; ok -f 't/alien_build_plugin_core_legacy.t', 'test for Alien::Build::Plugin::Core::Legacy'; ok -f 't/alien_build_plugin_core_override.t', 'test for Alien::Build::Plugin::Core::Override'; ok -f 't/alien_build_plugin_core_setup.t', 'test for Alien::Build::Plugin::Core::Setup'; ok -f 't/alien_build_plugin_core_tail.t', 'test for Alien::Build::Plugin::Core::Tail'; ok -f 't/alien_build_plugin_decode_dirlisting.t', 'test for Alien::Build::Plugin::Decode::DirListing'; ok -f 't/alien_build_plugin_decode_dirlistingftpcopy.t', 'test for Alien::Build::Plugin::Decode::DirListingFtpcopy'; ok -f 't/alien_build_plugin_decode_html.t', 'test for Alien::Build::Plugin::Decode::HTML'; ok -f 't/alien_build_plugin_decode_mojo.t', 'test for Alien::Build::Plugin::Decode::Mojo'; ok -f 't/alien_build_plugin_download_negotiate.t', 'test for Alien::Build::Plugin::Download::Negotiate'; ok -f 't/alien_build_plugin_extract_archivetar.t', 'test for Alien::Build::Plugin::Extract::ArchiveTar'; ok -f 't/alien_build_plugin_extract_archivezip.t', 'test for Alien::Build::Plugin::Extract::ArchiveZip'; ok -f 't/alien_build_plugin_extract_commandline.t', 'test for Alien::Build::Plugin::Extract::CommandLine'; ok -f 't/alien_build_plugin_extract_directory.t', 'test for Alien::Build::Plugin::Extract::Directory'; ok -f 't/alien_build_plugin_extract_negotiate.t', 'test for Alien::Build::Plugin::Extract::Negotiate'; ok -f 't/alien_build_plugin_fetch_curlcommand.t', 'test for Alien::Build::Plugin::Fetch::CurlCommand'; ok -f 't/alien_build_plugin_fetch_httptiny.t', 'test for Alien::Build::Plugin::Fetch::HTTPTiny'; ok -f 't/alien_build_plugin_fetch_lwp.t', 'test for Alien::Build::Plugin::Fetch::LWP'; ok -f 't/alien_build_plugin_fetch_local.t', 'test for Alien::Build::Plugin::Fetch::Local'; ok -f 't/alien_build_plugin_fetch_localdir.t', 'test for Alien::Build::Plugin::Fetch::LocalDir'; ok -f 't/alien_build_plugin_fetch_netftp.t', 'test for Alien::Build::Plugin::Fetch::NetFTP'; ok -f 't/alien_build_plugin_fetch_wget.t', 'test for Alien::Build::Plugin::Fetch::Wget'; ok -f 't/alien_build_plugin_gather_isolatedynamic.t', 'test for Alien::Build::Plugin::Gather::IsolateDynamic'; ok -f 't/alien_build_plugin_pkgconfig_commandline.t', 'test for Alien::Build::Plugin::PkgConfig::CommandLine'; ok -f 't/alien_build_plugin_pkgconfig_libpkgconf.t', 'test for Alien::Build::Plugin::PkgConfig::LibPkgConf'; ok -f 't/alien_build_plugin_pkgconfig_makestatic.t', 'test for Alien::Build::Plugin::PkgConfig::MakeStatic'; ok -f 't/alien_build_plugin_pkgconfig_negotiate.t', 'test for Alien::Build::Plugin::PkgConfig::Negotiate'; ok -f 't/alien_build_plugin_pkgconfig_pp.t', 'test for Alien::Build::Plugin::PkgConfig::PP'; ok -f 't/alien_build_plugin_prefer_badversion.t', 'test for Alien::Build::Plugin::Prefer::BadVersion'; ok -f 't/alien_build_plugin_prefer_goodversion.t', 'test for Alien::Build::Plugin::Prefer::GoodVersion'; ok -f 't/alien_build_plugin_prefer_sortversions.t', 'test for Alien::Build::Plugin::Prefer::SortVersions'; ok -f 't/alien_build_plugin_probe_cbuilder.t', 'test for Alien::Build::Plugin::Probe::CBuilder'; ok -f 't/alien_build_plugin_probe_commandline.t', 'test for Alien::Build::Plugin::Probe::CommandLine'; ok -f 't/alien_build_plugin_probe_vcpkg.t', 'test for Alien::Build::Plugin::Probe::Vcpkg'; ok -f 't/alien_build_plugin_test_mock.t', 'test for Alien::Build::Plugin::Test::Mock'; ok -f 't/alien_build_temp.t', 'test for Alien::Build::Temp'; ok -f 't/alien_build_util.t', 'test for Alien::Build::Util'; ok -f 't/alien_build_version_basic.t', 'test for Alien::Build::Version::Basic'; ok -f 't/alien_build_rc.t', 'test for Alien::Build::rc'; ok -f 't/alien_role.t', 'test for Alien::Role'; ok -f 't/alien_util.t', 'test for Alien::Util'; ok -f 't/test_alien.t', 'test for Test::Alien'; ok -f 't/test_alien_build.t', 'test for Test::Alien::Build'; ok -f 't/test_alien_cancompile.t', 'test for Test::Alien::CanCompile'; ok -f 't/test_alien_canplatypus.t', 'test for Test::Alien::CanPlatypus'; ok -f 't/test_alien_diag.t', 'test for Test::Alien::Diag'; ok -f 't/test_alien_run.t', 'test for Test::Alien::Run'; ok -f 't/test_alien_synthetic.t', 'test for Test::Alien::Synthetic'; ok -f 't/alienfile.t', 'test for alienfile'; done_testing; sub require_ok ($) { # special case of when I really do want require_ok. # I just want a test that checks that the modules # will compile okay. I won't be trying to use them. my($mod) = @_; my $ctx = context(); { my $pm = "$mod.pm"; $pm =~ s/::/\//g; eval { require $pm }; } my $error = $@; my $ok = !$error; $ctx->ok($ok, "require $mod"); $ctx->diag("error: $error") if $error ne ''; $ctx->release; } Alien-Build-2.84/t/alien_base.t000644 000000 000000 00000030654 14710030646 016235 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use lib 'corpus/lib'; use Env qw( @PKG_CONFIG_PATH ); use File::Glob qw( bsd_glob ); use File::chdir; use Path::Tiny qw( path ); use FFI::CheckLib; use Text::ParseWords qw( shellwords ); use List::Util qw( first ); my $mock = mock 'FFI::CheckLib' => ( override => [ find_lib => sub { my %args = @_; my @libpath; if(ref $args{libpath}) { @libpath = @{ $args{libpath} } if ref $args{libpath}; } elsif(defined $args{libpath}) { @libpath = ($args{libpath}); } if(@libpath) { my @libs; foreach my $libpath (@libpath) { if($libpath eq '/roger/opt/libbumblebee/lib') { push @libs, '/roger/opt/libbumblebee/lib/libbumblebee.so'; next; } next unless -d $libpath; local $CWD = $libpath; push @libs, map { path($_)->absolute->stringify } bsd_glob('*.so*'); } return @libs; } else { if($args{lib} eq 'foo') { return ('/usr/lib/libfoo.so', '/usr/lib/libfoo.so.1'); } else { return; } } }, ], ); unshift @PKG_CONFIG_PATH, path('corpus/pkgconfig')->absolute->stringify; subtest 'AB::MB sys install' => sub { require Alien::Foo1; my $cflags = Alien::Foo1->cflags; my $libs = Alien::Foo1->libs; my $version = Alien::Foo1->version; $libs =~ s{^\s+}{}; is $cflags, '-DFOO=stuff', "cflags: $cflags"; is $libs, '-lfoo1', "libs: $libs"; is $version, '3.99999', "version: $version"; }; subtest 'AB::MB share install' => sub { require Alien::Base::PkgConfig; require Alien::Foo2; my $cflags = Alien::Foo2->cflags; my $libs = Alien::Foo2->libs; my $version = Alien::Foo2->version; ok $cflags, "cflags: $cflags"; ok $libs, "libs: $libs"; is $version, '3.2.1', "version: $version"; (first { /^-I/ } shellwords($cflags)) =~ /^-I(.*)$/; ok defined $1 && -f "$1/foo2.h", "include path"; note "include path: $1"; (first { /^-L/ } shellwords($libs)) =~ /^-L(.*)$/; ok defined $1 && -f "$1/libfoo2.a", "lib path"; note "lib path: $1"; }; subtest 'Alien::Build system' => sub { require Alien::libfoo1; is( -f path(Alien::libfoo1->dist_dir)->child('_alien/for_libfoo1'), T(), 'dist_dir'); is( Alien::libfoo1->cflags, '-DFOO=1', 'cflags' ); is( Alien::libfoo1->cflags_static, '-DFOO=1 -DFOO_STATIC=1', 'cflags_static'); is( Alien::libfoo1->libs, '-lfoo', 'libs' ); is( Alien::libfoo1->libs_static, '-lfoo -lbar -lbaz', 'libs_static' ); is( Alien::libfoo1->version, '1.2.3', 'version'); ok( Alien::libfoo1->atleast_version('1.2'), 'version atleast 1.2' ); ok( !Alien::libfoo1->atleast_version('1.3'), 'version not atleast 1.3' ); ok( Alien::libfoo1->exact_version('1.2.3'), 'version exactly 1.2.3' ); ok( Alien::libfoo1->max_version('1.4'), 'version atmost 1.4' ); subtest 'install type' => sub { is( Alien::libfoo1->install_type, 'system' ); is( Alien::libfoo1->install_type('system'), T() ); is( Alien::libfoo1->install_type('share'), F() ); is( Alien::libfoo1->is_system_install, T() ); is( Alien::libfoo1->is_share_install, F() ); }; is( Alien::libfoo1->config('name'), 'foo', 'config.name' ); is( Alien::libfoo1->config('finished_installing'), T(), 'config.finished_installing' ); is( [Alien::libfoo1->dynamic_libs], ['/usr/lib/libfoo.so','/usr/lib/libfoo.so.1'], 'dynamic_libs' ); is( [Alien::libfoo1->dynamic_dir], [], 'dynamic_dir' ); is( [Alien::libfoo1->bin_dir], [], 'bin_dir' ); is( Alien::libfoo1->runtime_prop->{arbitrary}, 'one', 'runtime_prop' ); { # no version my $mock = mock 'Alien::libfoo1' => ( override => [ version => sub { return undef }, ], ); ok( !eval{ Alien::libfoo1->atleast_version('1.2'); 1 } && $@ =~ m/has no defined ->version/, 'no version atleast' ); ok( !eval { Alien::libfoo1->exact_version('1.2.3'); 1 } && $@ =~ m/has no defined ->version/, 'no version exactly' ); ok( !eval { Alien::libfoo1->max_version('1.4'); 1 } && $@ =~ m/has no defined ->version/, 'no version atmost' ); } }; subtest 'Alien::Build quazi system dylib' => sub { require Alien::libfoo1; my $mock = mock 'Alien::libfoo1' => ( override => [ libs => sub { return '-L/roger/opt/libbumblebee/lib -lbumblebee' }, ], ); is( Alien::libfoo1->libs, '-L/roger/opt/libbumblebee/lib -lbumblebee', 'libs' ); is( [Alien::libfoo1->dynamic_libs], ['/roger/opt/libbumblebee/lib/libbumblebee.so'], 'dynamic_libs' ); }; subtest 'Alien::Build share' => sub { require Alien::libfoo2; is( -f path(Alien::libfoo2->dist_dir)->child('_alien/for_libfoo2'), T(), 'dist_dir'); subtest 'cflags' => sub { is( [shellwords(Alien::libfoo2->cflags)], array { item match qr/^-I.*include/; item '-DFOO=1'; end; }, 'cflags', ); my($dir) = [shellwords(Alien::libfoo2->cflags)]->[0] =~ /^-I(.*)$/; is( -f path($dir)->child('foo.h'), T(), '-I directory points to foo.h location', ); is( [shellwords(Alien::libfoo2->cflags_static)], array { item match qr/^-I.*include/; item '-DFOO=1'; item '-DFOO_STATIC=1'; end; }, 'cflags_static', ); ($dir) = [shellwords(Alien::libfoo2->cflags_static)]->[0] =~ /^-I(.*)$/; is( -f path($dir)->child('foo.h'), T(), '-I directory points to foo.h location (static)', ); }; subtest 'libs' => sub { is( [shellwords(Alien::libfoo2->libs)], array { item match qr/-L.*lib/; item '-lfoo'; end; }, 'libs', ); my($dir) = [shellwords(Alien::libfoo2->libs)]->[0] =~ /^-L(.*)$/; is( -f path($dir)->child('libfoo.a'), T(), '-L directory points to libfoo.a location', ); is( [shellwords(Alien::libfoo2->libs_static)], array { item match qr/-L.*lib/; item '-lfoo'; item '-lbar'; item '-lbaz'; end; }, 'libs_static', ); ($dir) = [shellwords(Alien::libfoo2->libs_static)]->[0] =~ /^-L(.*)$/; is( -f path($dir)->child('libfoo.a'), T(), '-L directory points to libfoo.a location (static)', ); }; is( Alien::libfoo2->version, '2.3.4', 'version' ); subtest 'install type' => sub { is( Alien::libfoo2->install_type, 'share' ); is( Alien::libfoo2->install_type('system'), F() ); is( Alien::libfoo2->install_type('share'), T() ); is( Alien::libfoo2->is_system_install, F() ); is( Alien::libfoo2->is_share_install, T() ); }; is( Alien::libfoo2->config('name'), 'foo', 'config.name' ); is( Alien::libfoo2->config('finished_installing'), T(), 'config.finished_installing' ); is( [Alien::libfoo2->dynamic_libs], array { item match qr/libfoo.so$/; item match qr/libfoo.so.2$/; end; }, 'dynamic_libs', ); is( [Alien::libfoo2->bin_dir], array { item T(); end; }, 'bin_dir', ); is( [Alien::libfoo2->dynamic_dir], array { item match qr /\bdynamic$/; end; }, 'dynamic_dir', ); is( -f path(Alien::libfoo2->bin_dir)->child('foo-config'), T(), 'has a foo-config'); is( Alien::libfoo2->runtime_prop->{arbitrary}, 'two', 'runtime_prop' ); }; subtest 'build flags' => sub { my %unix_flags = ( q{ -L/a/b/c -lz -L/a/b/c } => [ "-L/a/b/c", "-lz", "-L/a/b/c" ], ); my %win_flags = ( q{ -L/a/b/c -lz -L/a/b/c } => [ "-L/a/b/c", "-lz", "-L/a/b/c" ], q{ -LC:/a/b/c -lz -L"C:/a/b c/d" } => [ "-LC:/a/b/c", "-lz", "-LC:/a/b c/d" ], q{ -LC:\a\b\c -lz } => [ q{-LC:\a\b\c}, "-lz" ], ); subtest 'unix' => sub { foreach my $flag (keys %unix_flags) { is( [ Alien::Base->split_flags_unix( $flag ) ], $unix_flags{$flag} ); } }; subtest 'windows' => sub { foreach my $flag (keys %win_flags) { is( [ Alien::Base->split_flags_windows( $flag ) ], $win_flags{$flag} ); } }; }; subtest 'ffi_name' => sub { require Alien::libfoo1; my @args_find_lib; my $mock1 = mock 'FFI::CheckLib' => ( override => [ find_lib => sub { @args_find_lib = @_; ('foo.dll','foo2.dll'); }, ], ); is( [Alien::libfoo1->dynamic_libs], ['foo.dll','foo2.dll'], 'call dynamic_libs' ); is( \@args_find_lib, [ lib => 'foo', libpath => [] ] ); my $mock2 = mock 'Alien::Base' => ( around => [ runtime_prop => sub { my($orig, @args) = @_; my $prop = $orig->(@args); { ffi_name => 'roger', %$prop }; }, ], ); is( [Alien::libfoo1->dynamic_libs], ['foo.dll','foo2.dll'], 'call dynamic_libs' ); is( \@args_find_lib, [ lib => 'roger' ] ); }; subtest 'test an alt install' => sub { require Alien::libfoo1; require Alien::libfoo2; require Alien::libfoo3; subtest 'default' => sub { like( Alien::libfoo3->cflags, qr{-I.*Alien-libfoo3/include -DFOO=1} ); like( Alien::libfoo3->libs, qr{-L.*Alien-libfoo3/lib -lfoo} ); like( Alien::libfoo3->cflags_static, qr{-I.*Alien-libfoo3/include -DFOO=1 -DFOO_STATIC=1} ); like( Alien::libfoo3->libs_static, qr{-L.*Alien-libfoo3/lib -lfoo -lbar -lbaz} ); is( Alien::libfoo3->version, '2.3.4' ); is( Alien::libfoo3->runtime_prop->{arbitrary}, 'two'); }; subtest 'foo1' => sub { my $alien = Alien::libfoo3->alt('foo1'); isa_ok $alien, 'Alien::Base'; isa_ok $alien, 'Alien::libfoo3'; like( $alien->cflags, qr{-I.*Alien-libfoo3/include -DFOO=1} ); like( $alien->libs, qr{-L.*Alien-libfoo3/lib -lfoo} ); like( $alien->cflags_static, qr{-I.*Alien-libfoo3/include -DFOO=1 -DFOO_STATIC=1} ); like( $alien->libs_static, qr{-L.*Alien-libfoo3/lib -lfoo -lbar -lbaz} ); is( $alien->version, '2.3.4' ); is( $alien->runtime_prop->{arbitrary}, 'two'); }; subtest 'foo2' => sub { my $alien = Alien::libfoo3->alt('foo2'); isa_ok $alien, 'Alien::Base'; isa_ok $alien, 'Alien::libfoo3'; like( $alien->cflags, qr{-I.*Alien-libfoo3/include -DFOO=2} ); like( $alien->libs, qr{-L.*Alien-libfoo3/lib -lfoo1} ); like( $alien->cflags_static, qr{-I.*Alien-libfoo3/include -DFOO=2 -DFOO_STATIC=2} ); like( $alien->libs_static, qr{-L.*Alien-libfoo3/lib -lfoo1 -lbar -lbaz} ); is( $alien->version, '2.3.5' ); is( $alien->runtime_prop->{arbitrary}, 'four'); }; subtest 'foo3' => sub { my $alien = Alien::libfoo3->alt('foo3'); isa_ok $alien, 'Alien::Base'; isa_ok $alien, 'Alien::libfoo3'; like( $alien->cflags, qr{-I.*Alien-libfoo3/include -DFOO=1} ); like( $alien->libs, qr{-L.*Alien-libfoo3/lib -lfoo} ); like( $alien->cflags_static, qr{-I.*Alien-libfoo3/include -DFOO=1 -DFOO_STATIC=1} ); like( $alien->libs_static, qr{-L.*Alien-libfoo3/lib -lfoo -lbar -lbaz} ); is( $alien->version, '2.3.4' ); is( $alien->runtime_prop->{arbitrary}, 'five'); }; subtest 'foo4' => sub { eval { Alien::libfoo3->alt('foo4') }; like $@, qr/no such alt: foo4/; }; subtest 'default -> foo2 -> foo1' => sub { my $alien = Alien::libfoo3->alt('foo2')->alt('foo1'); isa_ok $alien, 'Alien::Base'; isa_ok $alien, 'Alien::libfoo3'; like( $alien->cflags, qr{-I.*Alien-libfoo3/include -DFOO=1} ); like( $alien->libs, qr{-L.*Alien-libfoo3/lib -lfoo} ); like( $alien->cflags_static, qr{-I.*Alien-libfoo3/include -DFOO=1 -DFOO_STATIC=1} ); like( $alien->libs_static, qr{-L.*Alien-libfoo3/lib -lfoo -lbar -lbaz} ); is( $alien->version, '2.3.4' ); is( $alien->runtime_prop->{arbitrary}, 'two'); }; subtest 'alt_names' => sub { is([Alien::libfoo1->alt_names], [], 'no alt means empty list of alt names'); is([Alien::libfoo2->alt_names], [], 'no alt means empty list of alt names 2'); is([Alien::libfoo3->alt_names], [qw( foo1 foo2 foo3 )], 'list of alt names'); }; subtest 'alt_exists' => sub { is(Alien::libfoo1->alt_exists('anything'), F(), 'class with no alts always retrusn false for alt_exists'); is(Alien::libfoo1->alt_exists('foo1'), F(), 'class with no alts always retrusn false for alt_exists (2)'); is(Alien::libfoo3->alt_exists('foo1'), T(), 'class with an alt returns true for alt_exists if it exists' ); is(Alien::libfoo3->alt_exists('foo10'), F(), 'class with an alt returns false for alt_exists if it does not exists' ); }; }; done_testing; Alien-Build-2.84/t/alien_base__system_installed.t000644 000000 000000 00000005441 14710030646 022033 0ustar00rootroot000000 000000 use 5.008004; use lib 't/lib'; use MyTest::System; use Test2::V0 -no_srand => 1; use File::chdir; use List::Util qw/shuffle/; use Capture::Tiny qw( capture_merged ); use File::chdir; use File::Temp qw( tempdir ); use Path::Tiny qw( path ); use Alien::Base::PkgConfig; BEGIN { $ENV{ALIEN_FORCE} = 0; delete $ENV{ALIEN_INSTALL_TYPE} } skip_all 'test requires Alien::Base::ModuleBuild' unless (eval { require Alien::Base::ModuleBuild; Alien::Base::ModuleBuild->VERSION('0.040'); }); subtest 'basic' => sub { # Since this is not a complete distribution, it complains about missing files/folders local $SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /Can't (?:stat)|(?:find)/ }; local $CWD = tempdir( CLEANUP => 1 ); { path('MANIFEST')->spew( "lib/MyTest.pm\n", "MANIFEST\t\t\tThis list of files\n", ); path('lib')->mkpath; path('lib/MyTest.pm')->spew( "package MyTest;\n", "\n", "use strict;\n", "use warnings;\n", "use parent 'Alien::Base';\n", "\n", "1;\n", ); } my $lib = 'libfoo'; my $cflags = '-I/opt/foo/bar/baz/include'; my $libs = '-L/opt/foo/bar/baz/lib -lfoo'; my $gard = system_fake 'pkg-config' => sub { my(@args) = @_; if($args[0] eq '--modversion' && $args[1]) { print "1.2.3\n"; return 0; } if($args[0] eq '--cflags' && $args[1]) { print "$cflags \n"; return 0; } if($args[0] eq '--libs' && $args[1]) { print "$libs \n"; return 0; } use Alien::Build::Util qw( _dump ); diag _dump(\@args); ok 0, 'bad command'; return 2; }, ; my $mock = mock 'Alien::Base::PkgConfig' => ( override => [ pkg_config_command => sub { 'pkg-config', }, ], ); my $pkg_config = Alien::Base::PkgConfig->pkg_config_command; note "lib = $lib\n"; note "cflags = $cflags\n"; note "libs = $libs\n"; my($builder) = do { my($out, $builder) = capture_merged { Alien::Base::ModuleBuild->new( module_name => 'MyTest', dist_version => 0.01, alien_name => $lib, share_dir => 't', ); }; note $out; $builder; }; note scalar capture_merged { $builder->depends_on('build') }; { local $CWD; push @CWD, qw/blib lib/; use lib '.'; require './MyTest.pm'; my $alien = MyTest->new; isa_ok($alien, 'MyTest'); isa_ok($alien, 'Alien::Base'); note "alien->cflags = ", $alien->cflags; note "alien->libs = ", $alien->libs; is($alien->cflags, $cflags, "get cflags from system-installed library"); is($alien->libs , $libs , "get libs from system-installed library" ); } note scalar capture_merged { $builder->depends_on('realclean') }; }; done_testing; Alien-Build-2.84/t/alien_base_pkgconfig.t000644 000000 000000 00000006662 14710030646 020266 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Base::PkgConfig; use Capture::Tiny qw( capture_merged ); subtest 'basic' => sub { my $file = 'corpus/ab_pkgconfig/test.pc'; ok( -e $file, "Test file found" ); my $pc = Alien::Base::PkgConfig->new($file); isa_ok( $pc, 'Alien::Base::PkgConfig' ); # read tests my $pcfiledir = delete $pc->{vars}{pcfiledir}; ok( -d $pcfiledir, 'pcfiledir is a directory' ); ok( -e "$pcfiledir/test.pc", 'pcfiledir contains test.pc' ); is( $pc->{vars}, { 'INTERNAL_VARIABLE' => '-lotherlib', 'prefix' => '/home/test/path', }, "read vars" ); is( $pc->{keywords}, { 'Version' => '1.01', 'Libs' => '-L/home/test/path/lib -lsomelib ${INTERNAL_VARIABLE} -lm -lm', 'Cflags' => '-Dfoo=bar -I/home/test/path/deeper/include', 'Requires' => 'lib1 >= 1.0.0 lib2 >= 1.2.3', 'Description' => 'My TEST Library', 'Name' => 'TEST', }, "read keywords" ); is( $pc->{package}, 'test', "understands package name from file path" ); # vars getter/setter is( $pc->var('prefix'), '/home/test/path', "var getter" ); is( $pc->var(deeper => '/home/test/path/deeper'), '/home/test/path/deeper', "var setter" ); # abstract vars $pc->make_abstract('prefix'); is( $pc->{vars}{deeper}, '${prefix}/deeper', "abstract vars in terms of each other" ); is( (split qr/\s+/, $pc->{keywords}{Libs})[0], '-L${prefix}/lib', "abstract simple" ); $pc->make_abstract('deeper'); is( $pc->{keywords}{Cflags}, '-Dfoo=bar -I${deeper}/include', "abstract abstract 'nested'" ); # interpolate vars into keywords is( $pc->keyword('Version'), '1.01', "Simple keyword getter" ); is( (split qr/\s+/, $pc->keyword('Libs'))[0], '-L/home/test/path/lib', "single interpolation keyword" ); is( $pc->keyword('Cflags'), '-Dfoo=bar -I/home/test/path/deeper/include', "multiple interpolation keyword" ); # interpolate with overrides is( $pc->keyword( 'Cflags', {prefix => '/some/other/path'}), '-Dfoo=bar -I/some/other/path/deeper/include', "multiple interpolation keyword with override" ); }; subtest 'version' => sub { skip_all 'Test requires Alien::Base::ModuleBuild' unless eval { require Alien::Base::ModuleBuild; Alien::Base::ModuleBuild->VERSION('1.00') }; my $pkg_config = Alien::Base::PkgConfig->pkg_config_command; my(undef,$ret) = capture_merged { system( "$pkg_config --version" ); $? }; if ( $ret ) { skip_all "Cannot use pkg-config: $ret"; } my @installed = map { /^(\S+)/ ? $1 : () } `$pkg_config --list-all`; skip_all "pkg-config returned no packages" unless @installed; my $lib = $installed[0]; my ($builder_ok, $builder_bad) = map { require Alien::Base::ModuleBuild; my($out, $builder) = capture_merged { Alien::Base::ModuleBuild->new( module_name => 'My::Test', dist_version => 0.01, alien_name => $_, share_dir => 't', ); }; note $out if $out ne ''; $builder; } ($lib, 'siughspidghsp'); subtest 'good' => sub { my($out, $value) = capture_merged { $builder_ok->alien_check_installed_version, }; note $out if $out ne ''; is( $value, T(), 'found installed library' ); note "lib is $lib"; }; subtest 'bad' => sub { my($out, $value) = capture_merged { $builder_bad->alien_check_installed_version, }; note $out if $out ne ''; is( $value, F(), "returns false if not found"); }; }; done_testing; Alien-Build-2.84/t/alien_base_wrapper.t000644 000000 000000 00000017454 14710030646 020000 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Config; use Alien::Base::Wrapper (); use Alien::Build::Util qw( _dump ); use Text::ParseWords qw( shellwords ); $ENV{ALIEN_BASE_WRAPPER_QUIET} = 1; sub exec_arrayref (&) { my($code) = @_; my @answer; my $mock = mock 'Alien::Base::Wrapper' => ( override => [ _myexec => sub { @answer = @_; }, ], ); $code->(); \@answer; } subtest 'export' => sub { { package Alien::Foo1; sub install_type { 'share' } sub cflags {} sub libs {} package Alien::Bar1; sub install_type { 'share' } sub cflags {} sub libs {} package Foo::Bar1; use Alien::Base::Wrapper qw( Alien::Foo1 Alien::Bar1 ); package Foo::Bar2; use Alien::Base::Wrapper qw( WriteMakefile ); } ok( Foo::Bar1->can('cc'), 'can cc', ); ok( Foo::Bar1->can('ld'), 'can ld', ); ok( Foo::Bar2->can('WriteMakefile'), 'can WriteMakefile', ); }; subtest 'system' => sub { Alien::Base::Wrapper::_reset(); { package Alien::Foo2; sub install_type { 'system' } sub cflags { '-I/foo/include -DBAR=1' } sub cflags_static { 'wrong' } sub libs { '-L/foo/lib -lfoo' } sub libs_static { 'wrong' } } Alien::Base::Wrapper->import('Foo2'); is( exec_arrayref { local @ARGV = qw( one two three ); Alien::Base::Wrapper::cc(); }, [shellwords($Config{cc}), qw( -I/foo/include -DBAR=1 one two three )], 'cc', ); is( exec_arrayref { local @ARGV = qw( one two three ); Alien::Base::Wrapper::ld(); }, [shellwords($Config{ld}), qw( -L/foo/lib one two three -lfoo )], 'ld', ); }; subtest 'share' => sub { Alien::Base::Wrapper::_reset(); { package Alien::Foo3; sub install_type { 'share' } sub cflags { '-I/foo/include -DBAR=1' } sub cflags_static { '-I/foo/include -DBAR=2' } sub libs { '-L/foo/lib -lfoo' } sub libs_static { '-L/foo/lib -lfoo -lbaz' } } Alien::Base::Wrapper->import('Alien::Foo3'); is( exec_arrayref { local @ARGV = qw( one two three ); Alien::Base::Wrapper::cc(); }, [shellwords($Config{cc}), qw( -I/foo/include -DBAR=2 one two three )], 'cc', ); is( exec_arrayref { local @ARGV = qw( one two three ); Alien::Base::Wrapper::ld(); }, [shellwords($Config{ld}), qw( -L/foo/lib one two three -lfoo -lbaz )], 'ld', ); }; subtest 'share sans static' => sub { Alien::Base::Wrapper::_reset(); { package Alien::Foo4; sub install_type { 'share' } sub cflags { '-I/foo/include -DBAR=1' } sub libs { '-L/foo/lib -lfoo' } } Alien::Base::Wrapper->import('Alien::Foo4'); is( exec_arrayref { local @ARGV = qw( one two three ); Alien::Base::Wrapper::cc(); }, [shellwords($Config{cc}), qw( -I/foo/include -DBAR=1 one two three )], 'cc', ); is( exec_arrayref { local @ARGV = qw( one two three ); Alien::Base::Wrapper::ld(); }, [shellwords($Config{ld}), qw( -L/foo/lib one two three -lfoo )], 'ld', ); }; subtest 'combine aliens' => sub { Alien::Base::Wrapper::_reset(); { package Alien::Foo5; sub install_type { 'system' } sub cflags { '-I/foo/include -DFOO5=1' } sub libs { '-L/foo/lib --ld-foo -lfoo' } package Alien::Bar5; sub install_type { 'share' } sub cflags { '-I/bar/include -DBAR5=1' } sub libs { '-L/foo/lib --ld-bar -lbar' } } Alien::Base::Wrapper->import('Alien::Foo5', 'Alien::Bar5=1.23'); is( exec_arrayref { local @ARGV = qw( one two three ); Alien::Base::Wrapper::cc(); }, [shellwords($Config{cc}), qw( -I/foo/include -I/bar/include -DFOO5=1 -DBAR5=1 one two three ) ], 'cc', ); is( exec_arrayref { local @ARGV = qw( one two three ); Alien::Base::Wrapper::ld(); }, [shellwords($Config{ld}), qw( -L/foo/lib -L/foo/lib --ld-foo --ld-bar one two three -lfoo -lbar )], 'ld', ); subtest 'mm_args' => sub { my %mm_args = Alien::Base::Wrapper->mm_args; note _dump(\%mm_args); is( \%mm_args, hash { field DEFINE => '-DFOO5=1 -DBAR5=1'; field INC => '-I/foo/include -I/bar/include'; field LIBS => [ match(qr{-lfoo -lbar$}) ]; field LDDLFLAGS => T(); field LDFLAGS => T(); }, ); }; subtest 'mm_args2' => sub { my %mm_args = Alien::Base::Wrapper->mm_args2( foo => 'bar', INC => '-I/baz/include' ); note _dump(\%mm_args); is( \%mm_args, hash { field DEFINE => '-DFOO5=1 -DBAR5=1'; field INC => '-I/foo/include -I/bar/include -I/baz/include'; field LIBS => [ match(qr{-lfoo -lbar$}) ]; field LDDLFLAGS => T(); field LDFLAGS => T(); field foo => 'bar'; field CONFIGURE_REQUIRES => hash { field 'ExtUtils::MakeMaker' => '6.52'; field 'Alien::Base::Wrapper' => '1.97'; field 'Alien::Bar5' => '1.23'; field 'Alien::Foo5' => '0'; }; }, ); }; subtest 'WriteMakefile' => sub { local $@ = ''; eval { require ExtUtils::MakeMaker; ExtUtils::MakeMaker->VERSION('6.52') }; skip_all "test requires EUMM 6.52: $@" if $@; my %mm_args; my $mock = mock 'ExtUtils::MakeMaker' => ( override => [ WriteMakefile => sub { %mm_args = @_; 42; }, ], ); $@ = ''; my $ret = eval { Alien::Base::Wrapper::WriteMakefile( alien_requires => [ 'Alien::Foo5', 'Alien::Bar5=1.23' ], foo => 'bar', INC => '-I/baz/include', ); }; is "$@", ''; is $ret, 42; is( \%mm_args, hash { field DEFINE => '-DFOO5=1 -DBAR5=1'; field INC => '-I/foo/include -I/bar/include -I/baz/include'; field LIBS => [ match(qr{-lfoo -lbar$}) ]; field LDDLFLAGS => T(); field LDFLAGS => T(); field foo => 'bar'; field CONFIGURE_REQUIRES => hash { field 'ExtUtils::MakeMaker' => '6.52'; field 'Alien::Base::Wrapper' => '1.97'; field 'Alien::Bar5' => '1.23'; field 'Alien::Foo5' => '0'; }; }, ); $@ = ''; $ret = Alien::Base::Wrapper::WriteMakefile( alien_requires => { 'Alien::Foo5' => 0, 'Alien::Bar5' => '1.23' }, foo => 'bar', INC => '-I/baz/include', ); is "$@", ''; is $ret, 42; is( \%mm_args, hash { field DEFINE => '-DBAR5=1 -DFOO5=1'; field INC => '-I/bar/include -I/foo/include -I/baz/include'; field LIBS => [ match(qr{-lbar -lfoo$}) ]; field LDDLFLAGS => T(); field LDFLAGS => T(); field foo => 'bar'; field CONFIGURE_REQUIRES => hash { field 'ExtUtils::MakeMaker' => '6.52'; field 'Alien::Base::Wrapper' => '1.97'; field 'Alien::Bar5' => '1.23'; field 'Alien::Foo5' => '0'; }; }, ); }; subtest 'mb_args' => sub { my %mb_args = Alien::Base::Wrapper->mb_args; note _dump(\%mb_args); is( \%mb_args, hash { field extra_compiler_flags => '-I/foo/include -I/bar/include -DFOO5=1 -DBAR5=1'; field extra_linker_flags => '-lfoo -lbar'; field config => hash { field lddlflags => T(); field ldflags => T(); }; }, ); }; }; subtest 'oo interface' => sub { subtest '_export' => sub { my $abw = Alien::Base::Wrapper->new; isa_ok $abw, 'Alien::Base::Wrapper'; is $abw->_export, T(); $abw = Alien::Base::Wrapper->new('!export'); isa_ok $abw, 'Alien::Base::Wrapper'; is $abw->_export, F(); }; }; done_testing; Alien-Build-2.84/t/alien_build.t000644 000000 000000 00000141506 14710030646 016421 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use lib 't/lib'; use lib 'corpus/lib'; use MyTest::System; use Alien::Build; use Capture::Tiny qw( capture_merged ); use File::chdir; use Path::Tiny qw( path ); use Alien::Build::Util qw( _dump ); use Digest::SHA qw( sha1_hex ); subtest 'simple new' => sub { subtest 'basic basic' => sub { my $build = MyBuild->new; isa_ok $build, 'Alien::Build'; isa_ok( $build->meta, 'Alien::Build::Meta' ); isa_ok( MyBuild->meta, 'Alien::Build::Meta' ); note(_dump $build->meta); }; subtest 'with meta_prop in new' => sub { my $build = MyBuild2->new(meta_prop => { roger => 1, ramjet => [ 1,2,3] }); note(_dump $build->meta->prop); is( $build->meta_prop, hash { field roger => 1; field ramjet => [1,2,3]; etc; }, 'has argument properties', ); }; }; subtest 'from file' => sub { my $build = Alien::Build->load('corpus/basic/alienfile'); isa_ok $build, 'Alien::Build'; isa_ok( $build->meta, 'Alien::Build::Meta' ); note(_dump $build->meta); is( $build->requires, { Foo => '1.00' }, 'any' ); is( $build->requires('share'), { Foo => '1.00', Bar => '2.00' }, 'share' ); is( $build->requires('system'), { Foo => '1.00', Baz => '3.00' }, 'system' ); is( $build->requires('configure'), { 'Early::Module' => '1.234' }, 'configure' ); my $intr = $build->meta->interpolator; isa_ok $intr, 'Alien::Build::Interpolate::Default'; }; subtest 'invalid alienfile' => sub { eval { Alien::Build->load('corpus/basic/alienfilex') }; like $@, qr{Unable to read alienfile: }; }; subtest 'load requires' => sub { subtest 'basic' => sub { my $build = alienfile q{ use alienfile }; my $meta = $build->meta; note(_dump $meta); is( $build->load_requires, 1, 'empty loads okay' ); $meta->add_requires( 'any' => 'Foo::Bar::Baz' => '1.00'); is( $build->load_requires, 1, 'have it okay' ); ok $INC{'Foo/Bar/Baz.pm'}; note "inc=$INC{'Foo/Bar/Baz.pm'}"; $meta->add_requires( 'any' => 'Foo::Bar::Baz1' => '2.00'); eval { $build->load_requires }; my $error = $@; isnt $error, ''; note "error=$error"; }; }; subtest 'hook' => sub { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; subtest 'simple single working hook' => sub { my @foo1; my $props; $meta->register_hook( foo1 => sub { @foo1 = @_; my($build) = @_; $props = $build->hook_prop; return 42; } ); is( $build->hook_prop, undef ); is( $build->_call_hook(foo1 => ('roger', 'ramjet')), 42); is( $props, hash { field name => 'foo1'; etc; }, ); is( $build->hook_prop, undef ); is( \@foo1, array { item object { prop blessed => ref $build; call sub { shift->isa('Alien::Build') } => T(); }; item 'roger'; item 'ramjet'; } ); }; my $exception_count = 0; $meta->register_hook( foo2 => sub { $exception_count++; die "throw exception"; } ); subtest 'single failing hook' => sub { $exception_count = 0; eval { $build->_call_hook(foo2 => ()) }; like $@, qr/throw exception/; note "error = $@"; is $exception_count, 1; }; subtest 'one fail, one okay' => sub { $exception_count = 0; $meta->register_hook( foo2 => sub { 99; } ); is( $build->_call_hook(foo2 => ()), 99); is $exception_count, 1; }; subtest 'invalid hook' => sub { eval { $build->_call_hook(foo3 => ()) }; like $@, qr/No hooks registered for foo3/; }; subtest 'command list hook' => sub { $meta->register_hook( foo4 => [[$^X, -e => 'print @ARGV', 'hello', ' ', 'world']], ); my $out = capture_merged { $build->_call_hook('foo4') }; note $out; like $out, qr/hello world/s; }; subtest 'command with failure' => sub { $meta->register_hook( foo5 => [[$^X, -e => 'exit 1']], ); my $error; note capture_merged { eval { $build->_call_hook('foo5') }; $error = $@; }; like $error, qr/external command failed/; }; subtest 'command with failure, followed by good command' => sub { $meta->register_hook( foo5 => [[$^X, -e => '']], ); note capture_merged { $build->_call_hook('foo5'); }; ok 1; }; subtest 'around hook' => sub { subtest 'single wrapper' => sub { my @args; $meta->register_hook( foo6 => sub { my $build = shift; @args = @_; die "oops" unless $build->isa('Alien::Build'); return 'platypus'; }, ); $meta->around_hook( foo6 => sub { my $orig = shift; return $orig->(@_) . ' man'; } ); is( $build->_call_hook('foo6', 1, 2), 'platypus man', 'return value' ); is( \@args, [1,2], 'arguments' ); }; subtest 'double wrapper' => sub { my @args; $meta->register_hook( foo7 => sub { my $build = shift; @args = @_; die "oops" unless $build->isa('Alien::Build'); return 'platypus'; }, ); $meta->around_hook( foo7 => sub { my $orig = shift; return '(' . $orig->(@_) . ') man'; } ); $meta->around_hook( foo7 => sub { my $orig = shift; return 'the (' . $orig->(@_) . ')'; } ); is( $build->_call_hook('foo7', 1, 2), 'the ((platypus) man)', 'return value' ); is( \@args, [1,2], 'arguments' ); }; subtest 'alter args' => sub { my @args; $meta->register_hook( foo8 => sub { my $build = shift; @args = @_; die "oops" unless $build->isa('Alien::Build'); return 'platypus'; }, ); $meta->around_hook( foo8 => sub { my $orig = shift; my $build = shift; $orig->($build, map { $_ + 1 } @_); } ); is( $build->_call_hook('foo8', 1, 2), 'platypus' ); is( \@args, [ 2,3 ] ); }; }; subtest 'hook properties reset on each try' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { my $build = shift; $build->hook_prop->{foo} = 'bar'; 'share'; }; probe sub { my $build = shift; 'share'; }; probe sub { my $build = shift; $build->hook_prop->{foo} = 'baz'; 'share'; }; meta->around_hook( probe => sub { my $orig = shift; my $build = shift; my @foo = ($build->hook_prop->{foo}); my $install_type = $orig->($build, @_); push @foo, $install_type, $build->hook_prop->{foo}; push @{ $build->install_prop->{try} }, \@foo; $install_type; } ); }; alien_install_type_is 'share'; is( $build->install_prop->{try}, [ [ undef, 'share', 'bar' ], [ undef, 'share', undef ], [ undef, 'share', 'baz' ], ], 'set and unset at the right time.', ); is $build->hook_prop, undef; }; }; subtest 'probe' => sub { subtest 'system' => sub { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $meta->register_hook( probe => sub { note "dir = $CWD"; return 'system'; }, ); is($build->probe, 'system'); is($build->runtime_prop->{install_type}, 'system'); }; subtest 'share' => sub { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $meta->register_hook( probe => sub { note "dir = $CWD"; return 'system'; }, ); is($build->probe, 'system'); is($build->runtime_prop->{install_type}, 'system'); }; subtest 'throw exception' => sub { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $meta->register_hook( probe => sub { note "dir = $CWD"; die "error will robinson!"; }, ); my $type; note capture_merged { $type = $build->probe }; is($type, 'share'); is($build->runtime_prop->{install_type}, 'share'); }; }; subtest 'gather system' => sub { local $ENV{ALIEN_INSTALL_TYPE} = 'system'; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $meta->register_hook( probe => sub { 'system'; } ); $meta->register_hook( gather_system => sub { my($build) = @_; $build->runtime_prop->{cflags} = '-DFoo=1'; $build->runtime_prop->{libs} = '-lfoo'; $build->runtime_prop->{version} = '1.2.3'; }, ); if($build->install_type eq 'system') { note capture_merged { $build->build; }; } is( $build->runtime_prop, hash { field cflags => '-DFoo=1'; field libs => '-lfoo'; field version => '1.2.3'; etc; }, 'runtime props' ); is( $build->install_prop, hash { field finished => T(); field complete => hash { field gather_system => T(); etc; }; etc; }, 'install props' ); }; subtest 'download' => sub { my $build = sub { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; require Alien::Build::Plugin::Fetch::Corpus; my $plugin = Alien::Build::Plugin::Fetch::Corpus->new(@_); $plugin->init($meta); ($build, $meta, $plugin); }; my $tarpath = path('corpus/dist/foo-1.00.tar.gz')->absolute; my $check = sub { my($build) = @_; note scalar capture_merged { $build->download }; is( $build->install_prop, hash { field download => match qr/foo-1.00.tar.gz/; field complete => hash { field download => T(); etc; }; etc; }, 'install props' ); note "build.install_prop.download=@{[ $build->install_prop->{download} ]}"; is( path($build->install_prop->{download})->slurp_raw, $tarpath->slurp_raw, 'file matches', ); }; subtest 'component' => sub { foreach my $file_as (qw( content path )) { subtest "single download with file as $file_as" => sub { my($build, $meta) = $build->( url => 'https://test1.test/foo/bar/baz/foo-1.00.tar.gz', return_file_as => $file_as, ); $check->($build); }; } foreach my $listing_as (qw( list html dir_listing )) { subtest "listing download with listing as $listing_as" => sub { my($build, $meta) = $build->( url => 'https://test1.test/foo/bar/baz/', return_listing_as => $listing_as, ); $check->($build); }; } }; subtest 'command single' => sub { # This test uses a fake wget, and doesn't connect to the internet local $ENV{ALIEN_DOWNLOAD_RULE} = 'warn'; my $guard = system_fake wget => sub { my($url) = @_; # just pretend that we have some hidden files path('.foo')->touch; if($url eq 'https://test1.test/foo/bar/baz/foo-1.00.tar.gz') { print "200 found $url!\n"; path('foo-1.00.tar.gz')->spew_raw($tarpath->slurp_raw); return 0; } else { print "404 not found $url\n"; return 2; } }; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $meta->register_hook( download => [ "wget https://test1.test/foo/bar/baz/foo-1.00.tar.gz" ], ); $check->($build); }; subtest 'command no file' => sub { my $guard = system_fake true => sub { 0; }; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $meta->register_hook( download => [ 'true' ], ); my($out, $error) = capture_merged { eval { $build->download }; $@ }; note $out; like $error, qr/no files downloaded/, 'diagnostic failure'; }; subtest 'command multiple files' => sub { my $guard = system_fake explode => sub { path($_)->touch for map { "$_.txt" } qw( foo bar baz ); 0; }; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $meta->register_hook( download => ['explode'], ); note scalar capture_merged { $build->download }; is( $build->install_prop, hash { field download => T(); field complete => hash { field download => T(); etc; }; etc; }, 'install props' ); my $dir = path($build->install_prop->{download}); ok(-d $dir, "dir exists"); ok(-f $dir->child($_), "file $_ exists") for map { "$_.txt" } qw( foo bar baz ); }; }; alien_subtest 'extract' => sub { my $tar_cmd = do { require Alien::Build::Plugin::Extract::CommandLine; my $plugin = Alien::Build::Plugin::Extract::CommandLine->new; $plugin->tar_cmd; }; skip_all 'test requires command line tar' unless $tar_cmd; skip_all 'test requires command line tar actually works' unless Alien::Build::Plugin::Extract::CommandLine->handles('tar'); my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock', check_digest => 1; }; my $meta = $build->meta; $meta->register_hook( extract => [ [ $tar_cmd, "xf", "%{alien.install.download}"] ], ); my $archive = $build->install_prop->{download} = path("corpus/dist/foo-1.00.tar")->absolute->stringify; $build->install_prop->{download_detail}->{$archive} = { protocol => 'file', digest => [ FAKE => 'deadbeaf' ], }; my($out, $dir, $error) = capture_merged { (eval { $build->extract }, $@) }; note $out if $out ne ''; is $error, '', 'no exception'; note $error if $error; ok defined $dir && -d $dir, 'directory exists'; note "dir = $dir"; foreach my $name (qw( configure foo.c )) { my $file = path($dir)->child($name); ok -f $file, "$name exists"; } my $extract = $build->install_prop->{extract}; note "build.install.extract = $extract"; ok( -d $extract, "build.install.extract is a directory" ); ok( -f "$extract/configure", "has configure" ); ok( -f "$extract/foo.c", "has foo.c" ); }; subtest 'build' => sub { subtest 'plain' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock', probe => 'share', check_digest => 1; meta->prop->{env}->{FOO1} = 'bar1'; }; my $meta = $build->meta; my @data; $build->install_prop->{env}->{FOO3} = 'bar3'; local $ENV{FOO2} = 'bar2'; $meta->register_hook( extract => sub { path('file1')->spew('text1'); path('file2')->spew('text2'); }, ); $meta->register_hook( build => sub { is $ENV{FOO1}, 'bar1'; is $ENV{FOO2}, 'bar2'; is $ENV{FOO3}, 'bar3'; @data = (path('file1')->slurp, path('file2')->slurp); }, ); my $gather = 0; $meta->register_hook( gather_share => sub { $gather = 1; }, ); my $tmp = Path::Tiny->tempdir; my $share = $tmp->child('blib/lib/auto/share/Alien-Foo/'); my $archive = $build->install_prop->{download} = path("corpus/dist/foo-1.00.tar")->absolute->stringify; $build->install_prop->{download_detail}->{$archive} = { protocol => 'file', digest => [ FAKE => 'deadbeaf' ], }; $build->set_stage($share->stringify); note capture_merged { $build->build; (); }; is( \@data, [ 'text1', 'text2'], 'build', ); is $gather, 1, 'ran gather'; ok( -f $share->child('_alien/alien.json'), 'has alien.json'); #ok( -f $share->child('_alienfile'), 'has alienfile'); }; subtest 'destdir' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock', probe => 'share', check_digest => 1; }; my $meta = $build->meta; $meta->register_hook( extract => sub { path('file1')->spew('text1'); path('file2')->spew('text2'); }, ); $meta->register_hook( build => sub { my($build) = @_; my $prefix = $build->install_prop->{prefix}; # Handle DESTDIR in windows, where : may be # in install.prefix $prefix =~ s!^([a-z]):!$1!i if $^O eq 'MSWin32'; my $dir = path("$ENV{DESTDIR}/$prefix"); note "install dir = $dir"; $dir->mkpath; $dir->child($_)->mkpath for qw( bin lib ); $dir->child('bin/foo')->spew('foo exe'); $dir->child('lib/libfoo.a')->spew('foo lib'); }, ); my $gather = 0; $meta->register_hook( gather_share => sub { $gather = 1; }, ); my $tmp = Path::Tiny->tempdir; my $share = $tmp->child('blib/lib/auto/share/Alien-Foo/'); $build->meta_prop->{destdir} = 1; my $archive = $build->install_prop->{download} = path("corpus/dist/foo-1.00.tar")->absolute->stringify; $build->install_prop->{download_detail}->{$archive} = { protocol => 'file', digest => [ FAKE => 'deadbeaf' ], }; $build->set_prefix($tmp->child('usr/local')->stringify); $build->set_stage($share->stringify); note capture_merged { $build->build }; ok(-d $share, "directory created" ); is $gather, 1, 'ran gather'; ok( -f $share->child('_alien/alien.json'), 'has alien.json'); ok( -f $share->child('_alien/alienfile'), 'has alienfile'); }; }; subtest 'checkpoint' => sub { my $root = Path::Tiny->tempdir; my $alienfile = Path::Tiny->tempfile( TEMPLATE => 'alienfileXXXXXXX' ); $alienfile->spew(q{ use alienfile; meta_prop->{foo1} = 'bar1'; }); subtest 'create checkpoint' => sub { my $build = Alien::Build->load("$alienfile", root => "$root"); is($build->meta_prop->{foo1}, 'bar1'); $build->install_prop->{foo2} = 'bar2'; $build->runtime_prop->{foo3} = 'bar3'; $build->checkpoint; ok( -r path($build->root, 'state.json') ); }; subtest 'resume checkpoint' => sub { my $build = Alien::Build->resume("$alienfile", "$root"); is($build->meta_prop->{foo1}, 'bar1'); is($build->install_prop->{foo2}, 'bar2'); is($build->runtime_prop->{foo3}, 'bar3'); }; }; subtest 'patch' => sub { subtest 'single' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock', probe => 'share', download => 1, extract => { file1 => 'The quick brown dog jumps over the lazy dog', file2 => 'text2', }; share { patch sub { Path::Tiny->new('file1')->edit(sub { s/dog/fox/ }); }; build sub { my($build) = @_; Path::Tiny->new('file1')->copy(Path::Tiny->new($build->install_prop->{stage})->child('file3')); }; }; }; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; alien_build_ok; is( path($build->install_prop->{stage})->child('file3')->slurp, 'The quick brown fox jumps over the lazy dog', ); }; subtest 'double' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock', probe => 'share', download => 1, extract => { file1 => 'The quick brown dog jumps over the lazy dog', file2 => 'The quick brown fox jumps over the lazy fox', }; share { patch sub { # fix the saying in file1 Path::Tiny->new('file1')->edit(sub { s/dog/fox/ }); }; patch sub { # fix the saying in file 2 Path::Tiny->new('file2')->edit(sub { s/fox$/dog/ }); }; build sub { my($build) = @_; Path::Tiny->new('file1')->copy(Path::Tiny->new($build->install_prop->{stage})->child('file3')); Path::Tiny->new('file2')->copy(Path::Tiny->new($build->install_prop->{stage})->child('file4')); }; }; }; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; alien_build_ok; my $file3 = path($build->install_prop->{stage})->child('file3'); is( $file3->slurp, 'The quick brown fox jumps over the lazy dog', ); my $file4 = path($build->install_prop->{stage})->child('file4'); is( $file4->slurp, 'The quick brown fox jumps over the lazy dog', ); }; }; subtest 'preload' => sub { { package Alien::Build::Plugin::Preload1; $INC{'Alien/Build/Plugin/Preload1.pm'} = __FILE__; use Alien::Build::Plugin; sub init { my($self, $meta) = @_; $meta->register_hook('preload1' => sub {}); } } { package Alien::Build::Plugin::Preload1::Preload2; $INC{'Alien/Build/Plugin/Preload1/Preload2.pm'} = __FILE__; use Alien::Build::Plugin; sub init { my($self, $meta) = @_; $meta->register_hook('preload2' => sub {}); } } local $ENV{ALIEN_BUILD_PRELOAD} = join ';', qw( Preload1 Preload1::Preload2 ); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; ok( $meta->has_hook($_), "has hook $_" ) for qw( preload1 preload2 ); }; subtest 'first probe returns share' => sub { subtest 'share, system' => sub { my $build = alienfile q{ use alienfile; probe sub { 'share' }; probe sub { 'system' }; }; note capture_merged { $build->probe; }; is( $build->install_type, 'system' ); }; subtest 'command ok' => sub { my $guard = system_fake 'pkg-config' => sub { 0 } ; my $build = alienfile q{ use alienfile; probe [ [ 'pkg-config', '--exists', 'libfoo' ] ]; }; note capture_merged { $build->probe; (); }; is($build->install_type, 'system'); }; subtest 'command bad' => sub { my $guard = system_fake 'pkg-config' => sub { 1 } ; my $build = alienfile q{ use alienfile; probe [ [ 'pkg-config', '--exists', 'libfoo' ] ]; }; note capture_merged { $build->probe; (); }; is($build->install_type, 'share'); }; }; alien_subtest 'system' => sub { my @args; my $guard = system_fake frooble => sub { @args = ('frooble', @_); }, xor => sub { @args = ('xor', @_); }, ; my $build = alienfile_ok q{ use alienfile; }; $build->meta->interpolator->add_helper( foo => sub { '1234' }, ); $build->meta->interpolator->add_helper( bar => sub { 'xor' }, ); note scalar capture_merged { $build->system('frooble', '%{foo}') }; is( \@args, [ 'frooble', '1234' ], ); note scalar capture_merged { $build->system('%{bar}') }; is( \@args, [ 'xor' ], ); }; subtest 'requires pulls helpers' => sub { my $build = alienfile q{ use alienfile; requires 'Alien::libfoo1'; probe sub { 'system' } }; $build->load_requires('any'); ok($build->meta->interpolator->has_helper('foo1'), 'has helper foo1'); ok($build->meta->interpolator->has_helper('foo2'), 'has helper foo2'); }; alien_subtest 'around bug?' => sub { my $build = alienfile_ok q{ use alienfile; meta->register_hook( foo => sub { my($build, $arg) = @_; return scalar reverse $arg; }, ); }; is $build->_call_hook(foo => 'bar'), 'rab'; $build->meta->around_hook( foo => sub { my($orig, $build, $arg) = @_; $orig->($build, "a${arg}b"); }, ); is $build->_call_hook(foo => 'bar'), 'braba'; $build->meta->around_hook( foo => sub { my($orig, $build, $arg) = @_; $orig->($build, "|${arg}|"); }, ); is $build->_call_hook(foo => 'bar'), 'b|rab|a'; }; subtest 'requires of Alien::Build or Alien::Base' => sub { alien_subtest 'Alien::Build' => sub { my $build = alienfile_ok q{ use alienfile; requires 'Alien::Build' => 0; }; eval { $build->load_requires('configure'); $build->load_requires('share'); }; is $@, ''; }; alien_subtest 'Alien::Base' => sub { my $build = alienfile_ok q{ use alienfile; requires 'Alien::Base' => 0; }; eval { $build->load_requires('configure'); $build->load_requires('share'); }; is $@, ''; }; }; subtest 'out-of-source build' => sub { local $Alien::Build::VERSION = '1.08'; alien_subtest 'basic' => sub { skip_all 'test requires Archive::Tar' unless eval { require Archive::Tar; 1 }; alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); meta->prop->{out_of_source} = 1; plugin 'Download::Foo'; share { build sub { my($build) = @_; my $extract = $build->install_prop->{extract}; die 'no extract' unless -d $extract; die 'no $extract/configure' unless -f "$extract/configure"; die 'no $extract/foo.c' unless -f "$extract/foo.c"; die 'found $build/configure' if -f 'configure'; die 'found $build/foo.c' if -f 'foo.c'; }; }; }; alien_build_ok; }; alien_subtest 'from bundled source' => sub { local $Alien::Build::Plugin::Fetch::LocalDir::VERSION = $Alien::Build::Plugin::Fetch::LocalDir::VERSION || '1.07'; # this test extracts a local directory, which is not supported # by check_digest and does not connect to the internet local $ENV{ALIEN_DOWNLOAD_RULE} = 'warn'; my $build = alienfile_ok q{ use alienfile; meta->prop->{out_of_source} = 1; meta->prop->{start_url} = 'corpus/dist/foo-1.00'; share { plugin 'Fetch::LocalDir'; plugin 'Extract' => 'd'; build sub { my($build) = @_; my $extract = $build->install_prop->{extract}; die 'no extract' unless -d $extract; die 'no $extract/configure' unless -f "$extract/configure"; die 'no $extract/foo.c' unless -f "$extract/foo.c"; die 'found $build/configure' if -f 'configure'; die 'found $build/foo.c' if -f 'foo.c'; }; }; }; alien_build_ok; my $extract = $build->install_prop->{extract}; note "extract = $extract"; }; }; subtest 'test' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || '1.14'; alien_subtest 'good' => sub { alienfile_ok q{ use alienfile; plugin 'Test::Mock', probe => 'share', download => 1, extract => { file2 => '', file3 => '', }; share { build sub { log("the build"); Path::Tiny->new('file4')->spew('content of file4') }; test sub { log("the test"); my $x = Path::Tiny->new('file4')->slurp; die "hrm" unless $x eq 'content of file4'; }; }; }; alien_install_type_is 'share'; alien_checkpoint_ok; alien_resume_ok; alien_build_ok; alien_checkpoint_ok; my $build = alien_resume_ok; my($out, $error) = capture_merged { eval { $build->test }; $@; }; note $out; is $error, ''; }; alien_subtest 'bad' => sub { alienfile_ok q{ use alienfile; plugin 'Test::Mock', probe => 'share', download => 1, extract => 1, build => 1; share { test sub { log("the test"); die "bogus!"; }; }; }; alien_install_type_is 'share'; alien_checkpoint_ok; alien_resume_ok; alien_build_ok; alien_checkpoint_ok; my $build = alien_resume_ok; my($out, $error) = capture_merged { eval { $build->test }; $@; }; note $out; like $error, qr/bogus!/; }; alien_subtest 'ffi' => sub { alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock', probe => 'share', download => 1, extract => { file2 => '', file3 => '', }; share { build sub { log("the build"); path('file4')->spew('content of file4') }; ffi { build sub { path('file5')->spew('content of file5'); }; test sub { die "bogus1" unless -f "file2"; die "bogus2" unless -f "file3"; my $x = path("file5")->slurp; die "bogus3" unless $x eq 'content of file5'; }; }; }; }; alien_install_type_is 'share'; alien_checkpoint_ok; alien_resume_ok; alien_build_ok; alien_checkpoint_ok; my $build = alien_resume_ok; my($out, $error) = capture_merged { eval { $build->test }; $@; }; note $out; is $error, ''; }; alien_subtest 'bad ffi' => sub { alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock', probe => 'share', download => 1, extract => 1; share { build sub { log("the build"); path('file4')->spew('content of file4') }; ffi { build sub { path('file5')->spew('content of file5'); }; test sub { die "bogus4"; }; }; }; }; alien_install_type_is 'share'; alien_checkpoint_ok; alien_resume_ok; alien_build_ok; alien_checkpoint_ok; my $build = alien_resume_ok; my($out, $error) = capture_merged { eval { $build->test }; $@; }; note $out; like $error, qr/bogus4/; }; alien_subtest 'system good' => sub { alienfile_ok q{ use alienfile; probe sub { 'system' }; sys { test sub { my($build) = @_; log('in test!'); $build->install_prop->{foobar} = 'baz'; }; }; }; alien_install_type_is 'system'; alien_checkpoint_ok; alien_resume_ok; alien_build_ok; alien_checkpoint_ok; my $build = alien_resume_ok; my($out, $error) = capture_merged { eval { $build->test }; $@; }; note $out; is $error, ''; is($build->install_prop->{foobar}, 'baz'); }; alien_subtest 'system bad' => sub { alienfile_ok q{ use alienfile; probe sub { 'system' }; sys { test sub { my($build) = @_; log('in test!'); $build->install_prop->{foobar} = 'baz2'; die "bogus16"; }; }; }; alien_install_type_is 'system'; alien_checkpoint_ok; alien_resume_ok; alien_build_ok; alien_checkpoint_ok; my $build = alien_resume_ok; my($out, $error) = capture_merged { eval { $build->test }; $@; }; note $out; like $error, qr/bogus16/; is($build->install_prop->{foobar}, 'baz2'); }; }; alien_subtest 'pkg-config path during build' => sub { my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); use Env qw( @PKG_CONFIG_PATH ); plugin 'Test::Mock', probe => 'share', download => 1, extract => 1; share { requires 'Alien::libfoo2'; build sub { my($build) = @_; $build->runtime_prop->{my_pkg_config_path} = [@PKG_CONFIG_PATH]; }; }; }; alien_build_ok; is( $build->runtime_prop, hash { field my_pkg_config_path => array { item validator(sub { return -f "$_/x1.pc"; }); item validator(sub { return -f "$_/x2.pc"; }); end; }; etc; }, 'has arch and arch-indy pkg-config paths', ); }; subtest 'network available' => sub { alien_subtest 'default' => sub { my $build = alienfile_ok q{ use alienfile }; is($build->meta_prop->{network}, T()); }; alien_subtest 'override' => sub { my $build = alienfile_ok q{ use alienfile; meta->prop->{network} = 0 }; is($build->meta_prop->{network}, F()); }; ## https://github.com/PerlAlien/Alien-Build/issues/23#issuecomment-341114414 # alien_subtest 'NO_NETWORK_TESTING' => sub { # local $ENV{NO_NETWORK_TESTING} = 1; # my $build = alienfile_ok q{ use alienfile }; # is($build->meta_prop->{network}, F()); # }; alien_subtest 'ALIEN_INSTALL_NETWORK=1' => sub { local $ENV{ALIEN_INSTALL_NETWORK} = 1; my $build = alienfile_ok q{ use alienfile }; is($build->meta_prop->{network}, T()); }; alien_subtest 'ALIEN_INSTALL_NETWORK=0' => sub { local $ENV{ALIEN_INSTALL_NETWORK} = 0; my $build = alienfile_ok q{ use alienfile }; is($build->meta_prop->{network}, F()); }; }; subtest 'local_source' => sub { alien_subtest 'start_url undefined' => sub { my $build = alienfile_ok q{ use alienfile }; is($build->meta_prop->{local_source}, F()); }; alien_subtest 'start_url undefined override' => sub { my $build = alienfile_ok q{ use alienfile; meta->prop->{local_source} = 1; }; is($build->meta_prop->{local_source}, T()); }; alien_subtest 'start_url = foo/bar/baz' => sub { my $build = alienfile_ok q{ use alienfile; share { start_url 'foo/bar/baz' } }; is($build->meta_prop->{local_source}, T()); }; alien_subtest 'start_url = C:/foo/bar/baz' => sub { my $build = alienfile_ok q{ use alienfile; share { start_url 'C:/foo/bar/baz' } }; is($build->meta_prop->{local_source}, T()); }; alien_subtest 'start_url = /foo/bar/baz' => sub { my $build = alienfile_ok q{ use alienfile; share { start_url '/foo/bar/baz' } }; is($build->meta_prop->{local_source}, T()); }; alien_subtest 'start_url = ./foo/bar/baz' => sub { my $build = alienfile_ok q{ use alienfile; share { start_url './foo/bar/baz' } }; is($build->meta_prop->{local_source}, T()); }; alien_subtest 'start_url = http://foo.example/foo/bar/baz' => sub { my $build = alienfile_ok q{ use alienfile; share { start_url 'http://foo.example/foo/bar/baz' } }; is($build->meta_prop->{local_source}, F()); }; alien_subtest 'start_url = http://foo.example/foo/bar/baz override' => sub { my $build = alienfile_ok q{ use alienfile; share { start_url 'http://foo.example/foo/bar/baz'; meta->prop->{local_source} = 1; } }; is($build->meta_prop->{local_source}, T()); }; }; subtest 'do not allow network install' => sub { alien_subtest 'share' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share'}; meta->prop->{network} = 0; meta->prop->{local_source} = 0; }; my($out, $err) = capture_merged { eval { $build->probe; }; $@; }; note $out; like $err, qr/network fetch is turned off/; }; alien_subtest 'system' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'system'}; meta->prop->{network} = 0; meta->prop->{local_source} = 0; }; alien_install_type_is 'system'; }; }; alien_subtest 'interpolate env overrides' => sub { skip_all 'test requires Archive::Tar' unless eval { require Archive::Tar; 1 }; local $ENV{FOO1} = 'oxo'; my $build = alienfile_ok q{ use alienfile; meta->prop->{env_interpolate} = 1; meta->prop->{env}->{FOO1} = '%{foo1}'; meta->prop->{env}->{FOO2} = '%{.install.foo.bar}'; meta->interpolator->add_helper( foo1 => sub { 'xox' } ); probe sub { my($build) = @_; $build->install_prop->{foo}->{bar} = 'baz'; 'share'; }; share { plugin 'Download::Foo'; build sub { die 'wrong value' if $ENV{FOO1} ne 'xox'; die 'wrong value' if $ENV{FOO2} ne 'baz'; }; }; }; alien_build_ok; }; alien_subtest 'plugin instance prop' => sub { { package Alien::Build::Plugin::ABC::XYZ1; use Alien::Build::Plugin; has x => undef; has y => undef; } { my $build = alienfile_ok q{ use alienfile; }; my $plugin1 = Alien::Build::Plugin::ABC::XYZ1->new( x => 1, y => 2 ); $build->plugin_instance_prop($plugin1)->{x} = 1; $build->plugin_instance_prop($plugin1)->{y} = 2; my $plugin2 = Alien::Build::Plugin::ABC::XYZ1->new( x => 3, y => 4 ); $build->plugin_instance_prop($plugin2)->{x} = 3; $build->plugin_instance_prop($plugin2)->{y} = 4; my $plugin3 = Alien::Build::Plugin::ABC::XYZ1->new( x => 5, y => 6 ); is( $build, object { call [ plugin_instance_prop => $plugin1 ] => hash { field x => 1; field y => 2; end; }; call [ plugin_instance_prop => $plugin2 ] => hash { field x => 3; field y => 4; end; }; call [ plugin_instance_prop => $plugin3 ] => hash { end; }; }, ); alien_checkpoint_ok; } { my $build = alien_resume_ok; my $plugin1 = Alien::Build::Plugin::ABC::XYZ1->new( x => 1, y => 2 ); my $plugin2 = Alien::Build::Plugin::ABC::XYZ1->new( x => 3, y => 4 ); my $plugin3 = Alien::Build::Plugin::ABC::XYZ1->new( x => 5, y => 6 ); is( $build, object { call [ plugin_instance_prop => $plugin1 ] => hash { field x => 1; field y => 2; end; }; call [ plugin_instance_prop => $plugin2 ] => hash { field x => 3; field y => 4; end; }; call [ plugin_instance_prop => $plugin3 ] => hash { end; }; }, ); } }; subtest 'system probe plugin property' => sub { alien_subtest 'good 1' => sub { my $build = alienfile_ok q{ use alienfile; use Digest::SHA qw( sha1_hex ); probe sub { my($build) = @_; $build->hook_prop->{probe_class} = 'Foo::Foo'; $build->hook_prop->{probe_instance_id} = sha1_hex('foo'); 'system'; }; probe sub { my($build) = @_; $build->hook_prop->{probe_class} = 'Foo::Bar'; $build->hook_prop->{probe_instance_id} = sha1_hex('bar'); 'share'; }; }; alien_install_type_is 'system'; is $build->install_prop, hash { field system_probe_class => 'Foo::Foo'; field system_probe_instance_id => sha1_hex('foo'); etc; }, ; }; alien_subtest 'good 2' => sub { my $build = alienfile_ok q{ use alienfile; use Digest::SHA qw( sha1_hex ); probe sub { my($build) = @_; $build->hook_prop->{probe_class} = 'Foo::Foo'; $build->hook_prop->{probe_instance_id} = sha1_hex('foo'); 'share'; }; probe sub { my($build) = @_; $build->hook_prop->{probe_class} = 'Foo::Bar'; $build->hook_prop->{probe_instance_id} = sha1_hex('bar'); 'system'; }; }; alien_install_type_is 'system'; is $build->install_prop, hash { field system_probe_class => 'Foo::Bar'; field system_probe_instance_id => sha1_hex('bar'); etc; }, ; }; alien_subtest 'bad 1' => sub { my $build = alienfile_ok q{ use alienfile; use Digest::SHA qw( sha1_hex ); probe sub { my($build) = @_; $build->hook_prop->{probe_class} = 'Foo::Foo'; $build->hook_prop->{probe_instance_id} = sha1_hex('foo'); 'share'; }; probe sub { my($build) = @_; $build->hook_prop->{probe_class} = 'Foo::Bar'; $build->hook_prop->{probe_instance_id} = sha1_hex('bar'); 'share'; }; }; alien_install_type_is 'share'; is $build->install_prop, hash { field system_probe_class => DNE(); field system_probe_instance_id => DNE(); etc; }, ; }; alien_subtest 'bad 2' => sub { my $build = alienfile_ok q{ use alienfile; use Digest::SHA qw( sha1_hex ); probe sub { my($build) = @_; $build->hook_prop->{probe_class} = 'Foo::Foo'; $build->hook_prop->{probe_instance_id} = sha1_hex('foo'); 'share'; }; probe sub { my($build) = @_; 'system'; }; }; alien_install_type_is 'system'; is $build->install_prop, hash { field system_probe_class => DNE(); field system_probe_instance_id => DNE(); etc; }, ; }; }; subtest 'check_digest' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || 2.57; my $build = alienfile_ok q{ use alienfile; plugin 'Digest::SHA'; probe sub { 'share' }; }; alienfile_skip_if_missing_prereqs; my $path = path('corpus/alien_build_plugin_digest_shapp/foo.txt.gz'); subtest 'digest disabled' => sub { local $build->meta_prop->{check_digest} = 0; is($build->check_digest('corpus/alien_build_plugin_digest_shapp/foo.txt.gz'), F()); }; subtest 'digest enabled' => sub { local $build->meta_prop->{check_digest} = 1; my $good = 'a7e79996a02d3dfc47f6f3ec043c67690dc06a10d091bf1d760fee7c8161391a'; my $bad = 'a7e79996a02d3dfc47f6f3ec043c67690dc06a10d091bf1d760fee7c8161391b'; foreach my $type (qw( string path-tiny content path )) { subtest $type => sub { my $file; local $build->meta_prop->{digest} = {}; if($type eq 'string') { $file = $path->stringify; } elsif($type eq 'path-tiny') { $file = $path; } elsif($type eq 'content') { $file = { type => 'file', filename => $path->basename, content => $path->slurp_raw, }; } elsif($type eq 'path') { $file = { type => 'file', filename => $path->basename, path => "$path", tmp => 0, }; } else { die "oops"; } note _dump($file); is dies { $build->check_digest($file) }, match qr/^No digest for foo.txt.gz/, "dies when no digest specified"; $build->meta_prop->{digest} = { 'foo.txt.gz' => [ SHA256 => $good ], }; delete $build->install_prop->{download_detail}; is $build->check_digest($file), 1, 'good signature with filename'; if(ref($file) eq 'HASH' && defined $file->{path}) { is $build->install_prop, hash { field download_detail => hash { field $file->{path} => hash { field digest => [ SHA256 => $good ]; etc; }; etc; }; etc; }, '.install.download_detail.$download.digest is populated and matches'; } $build->meta_prop->{digest} = { 'foo.txt.gz' => [ SHA256 => $bad ], }; is dies { $build->check_digest($file) }, match qr/^foo.txt.gz SHA256 digest does not match: got $good, expected $bad/, 'bad signature with filename'; $build->meta_prop->{digest} = { '*' => [ SHA256 => $good ], }; is $build->check_digest($file), 1, 'good signature with glob'; $build->meta_prop->{digest} = { 'foo.txt.gz' => [ FOO92 => $good ], }; is dies { $build->check_digest($file) }, match qr/^No plugin provides digest algorithm for FOO92/, 'no algorithm'; if($type eq 'string') { $file = $path->sibling('bogus.txt.gz')->stringify; } elsif($type eq 'path-tiny') { $file = $path->sibling('bogus.txt.gz'); } elsif($type eq 'content') { $file = { type => 'file', filename => 'bogus.txt,gz', }; note _dump($file); is dies { $build->check_digest($file) }, match qr/^bogus.txt.gz has no content/, 'error on missing file'; $file = { type => 'file', }; note _dump($file); is dies { $build->check_digest($file) }, match qr/^File has no filename/, 'error on missing filename'; $file = { type => 'list', }; note _dump($file); is dies { $build->check_digest($file) }, match qr/^File is wrong type/, 'error on wrote file type'; $file = { }; note _dump($file); is dies { $build->check_digest($file) }, match qr/^File is wrong type/, 'error on wrote file type'; return; } elsif($type eq 'path') { $file = { type => 'file', filename => 'bogus.txt.gz', path => $path->sibling('bogus.txt.gz')->stringify, tmp => 0, }; } note _dump($file); is dies { $build->check_digest($file) }, match qr/^Missing file in digest check: bogus.txt.gz/, 'error on missing file'; } } }; }; subtest 'prefer' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || 2.60; my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url './corpus/dist'; plugin 'Download'; prefer sub { my($build, $res) = @_; return { type => 'list', list => [ sort { $b->{filename} cmp $a->{filename} } @{ $res->{list} }, ], }; }; }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; is $build->prefer($build->fetch), hash { field type => 'list'; field protocol => 'file'; field list => array { item hash { field filename => 'foo-1.00.zip'; field url => T(); }; etc; }; end; }, 'expected result'; }; subtest 'decode' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { decode sub { my($build, $res) = @_; if($res->{type} eq 'html') { die "did not get expected content" unless $res->{content} =~ /FAUX HTML/; } elsif($res->{type} eq 'dir_listing') { die "did not get expected content" unless $res->{content} =~ /FAUX DIR LISTING/; } else { die "test does not handle @{[ $res->{type} ]}"; } return { type => 'list', list => [ { filename => 'foo1.txt', url => "@{[ $res->{base} ]}/foo1.txt" }, { filename => 'foo2.txt', url => "@{[ $res->{base} ]}/foo2.txt" }, ], }; }; }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; is $build->decode({ type => 'html', base => 'http://foo.com', content => 'my FAUX HTML content', protocol => 'http', }), hash { field type => 'list'; field protocol => 'http'; field list => [ { filename => 'foo1.txt', url => 'http://foo.com/foo1.txt' }, { filename => 'foo2.txt', url => 'http://foo.com/foo2.txt' }, ]; end; }, 'decoded html'; is $build->decode({ type => 'dir_listing', base => 'ftp://foo.com', content => 'my FAUX DIR LISTING content', protocol => 'ftp', }), hash { field type => 'list'; field protocol => 'ftp'; field list => [ { filename => 'foo1.txt', url => 'ftp://foo.com/foo1.txt' }, { filename => 'foo2.txt', url => 'ftp://foo.com/foo2.txt' }, ]; end; }, 'decoded dir listing'; }; subtest 'alien_download_rule' => sub { local $ENV{ALIEN_DOWNLOAD_RULE}; delete $ENV{ALIEN_DOWNLOAD_RULE}; is( Alien::Build->new, object { call download_rule => 'warn'; }, 'implicit default'); is( do { $ENV{ALIEN_DOWNLOAD_RULE} = 'default'; Alien::Build->new }, object { call download_rule => 'warn'; }, 'explicit default'); foreach my $value ( qw( warn digest encrypt digest_or_encrypt digest_and_encrypt ) ) { local $ENV{ALIEN_DOWNLOAD_RULE} = $value; is( Alien::Build->new, object { call download_rule => $value; # changing the enviroment after the first call should not do anything call sub { $ENV{ALIEN_DOWNLOAD_RULE} = $value eq 'warn' ? 'digest' : 'warn'; shift->download_rule; } => $value; }, "override $value"); } $ENV{ALIEN_DOWNLOAD_RULE} = 'bogus'; my @w; my $mock = mock 'Alien::Build' => ( override => [ log => sub { my(undef, $msg) = @_; push @w, $msg if $msg =~ /^unknown ALIEN_DOWNLOAD_RULE/; }, ] ); is( Alien::Build->new, object { call download_rule => 'warn'; }, "got correct default for bogus rule"); is( \@w, [ 'unknown ALIEN_DOWNLOAD_RULE "bogus", using "warn" instead' ], 'got correct log for bogus rule'); }; done_testing; { package MyBuild; use parent 'Alien::Build'; } { package MyBuild2; use parent 'Alien::Build'; } Alien-Build-2.84/t/alien_build__download_rule.t000644 000000 000000 00000034117 14710030646 021475 0ustar00rootroot000000 000000 use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); our $tarball = path('corpus/dist/foo-1.00.tar')->slurp_raw; alien_subtest 'warn' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || '2.60'; local $ENV{ALIEN_DOWNLOAD_RULE} = 'warn'; require Alien::Build; is(Alien::Build->new->download_rule, 'warn'); my @warnings; my $mock = mock 'Alien::Build' => ( around => [ log => sub { my($orig, $self, $msg) = @_; push @warnings, $msg if $msg =~ /^warning:/; $self->$orig($msg); }, ], ); subtest 'no digest, no tls, no problem lol' => sub { @warnings = (); alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'http://foo.bar.baz'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'http', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; is \@warnings, bag { item match qr/warning: attempting to fetch a non-TLS or bundled URL/; item match qr/warning: fetch did not use a secure protocol/; item match qr/warning: extracting from a file that was fetched via insecure protocol/; etc; }, 'expected warnings'; }; subtest 'just tls' => sub { @warnings = (); alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'https://foo.bar.baz'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'https', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; is \@warnings, array { all_items mismatch qr/warning: (attempting to fetch a non-TLS or bundled URL|fetch did not use a secure protocol|extracting from a file that was fetched via insecure protocol)/; etc; }, 'no unexpected warnings'; }; subtest 'tls and digest' => sub { @warnings = (); alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'https://foo.bar.baz'; digest SHA256 => '0478cc6e29f934f87ae457c66a05891aef93179e0674d99fc2e73463b8810817'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'https', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; is \@warnings, array { all_items mismatch qr/warning: (attempting to fetch a non-TLS or bundled URL|fetch did not use a secure protocol|extracting from a file that was fetched via insecure protocol)/; etc; }, 'no unexpected warnings'; }; subtest 'just digest' => sub { @warnings = (); alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'http://foo.bar.baz'; digest SHA256 => '0478cc6e29f934f87ae457c66a05891aef93179e0674d99fc2e73463b8810817'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'http', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; is \@warnings, bag { item match qr/warning: attempting to fetch a non-TLS or bundled URL/; item match qr/warning: fetch did not use a secure protocol/; all_items mismatch qr/warning: extracting from a file that was fetched via insecure protocol/; etc; }, 'expected warnings'; }; }; alien_subtest 'digest' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || '2.60'; local $ENV{ALIEN_DOWNLOAD_RULE} = 'digest'; is(Alien::Build->new->download_rule, 'digest'); subtest 'with digest' => sub { alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'https://foo.bar.baz'; digest SHA256 => '0478cc6e29f934f87ae457c66a05891aef93179e0674d99fc2e73463b8810817'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'https', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; }; subtest 'without digest' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'https://foo.bar.baz'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'https', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; my($out, $exception) = capture_merged { dies { $build->extract } }; like $exception, qr/^required digest missing for/; }; }; alien_subtest 'encrypt' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || '2.60'; local $ENV{ALIEN_DOWNLOAD_RULE} = 'encrypt'; is(Alien::Build->new->download_rule, 'encrypt'); subtest 'with tls' => sub { alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'https://foo.bar.baz'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'https', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; }; subtest 'without tls' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'http://foo.bar.baz'; fetch sub { die 'not here' }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; my($out, $exception) = capture_merged { dies { $build->download } }; like $exception, qr/^insecure fetch is not allowed/; }; subtest 'no tls response' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'https://foo.bar.baz'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'http', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; my($out, $exception) = capture_merged { dies { $build->download } }; like $exception, qr/^insecure fetch is not allowed/; }; }; alien_subtest 'digest_or_encrypt' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || '2.60'; local $ENV{ALIEN_DOWNLOAD_RULE} = 'digest_or_encrypt'; is(Alien::Build->new->download_rule, 'digest_or_encrypt'); subtest 'with digest and tls' => sub { alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'https://foo.bar.baz'; digest SHA256 => '0478cc6e29f934f87ae457c66a05891aef93179e0674d99fc2e73463b8810817'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'https', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; }; subtest 'just digest' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'http://foo.bar.baz'; digest SHA256 => '0478cc6e29f934f87ae457c66a05891aef93179e0674d99fc2e73463b8810817'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'http', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; }; subtest 'just tls' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'https://foo.bar.baz'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'https', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; }; subtest 'no tls or digest' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'http://foo.bar.baz'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'http', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; my($out, $exception) = capture_merged { dies { $build->extract } }; like $exception, qr/^file was fetched insecurely and required digest missing for/; }; }; alien_subtest 'digest_and_encrypt' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || '2.60'; local $ENV{ALIEN_DOWNLOAD_RULE} = 'digest_and_encrypt'; is(Alien::Build->new->download_rule, 'digest_and_encrypt'); subtest 'with digest and tls' => sub { alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'https://foo.bar.baz'; digest SHA256 => '0478cc6e29f934f87ae457c66a05891aef93179e0674d99fc2e73463b8810817'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'https', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; }; subtest 'just digest' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'http://foo.bar.baz'; digest SHA256 => '0478cc6e29f934f87ae457c66a05891aef93179e0674d99fc2e73463b8810817'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'http', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; my($out, $exception) = capture_merged { dies { $build->download } }; like $exception, qr/^insecure fetch is not allowed/; }; subtest 'just tls' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'https://foo.bar.baz'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'https', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; my($out, $exception) = capture_merged { dies { $build->extract } }; like $exception, qr/^required digest missing for/; }; subtest 'no tls or digest' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'http://foo.bar.baz'; fetch sub { return { type => 'file', filename => 'foo-1.00.tar', content => $main::tarball, version => '1.00', protocol => 'http', }; }; plugin 'Extract::ArchiveTar' => (format => 'tar'); }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; my($out, $exception) = capture_merged { dies { $build->download } }; like $exception, qr/^insecure fetch is not allowed/; }; }; done_testing; Alien-Build-2.84/t/alien_build_commandsequence.t000644 000000 000000 00000010443 14710030646 021643 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Capture::Tiny qw( capture_merged ); { my %commands; my @command_list; BEGIN { *CORE::GLOBAL::system = sub { push @command_list, [@_]; if($commands{$_[0]}) { $commands{$_[0]}->(@_); } $? = $_[0] eq 'bogus' ? -1 : 0; }; } sub system_last { \@command_list; } sub system_clear { @command_list = (); } sub system_hook { my($name, $code) = @_; $commands{$name} = $code; } } use Alien::Build::CommandSequence; subtest 'basic' => sub { my $seq = Alien::Build::CommandSequence->new; isa_ok $seq, 'Alien::Build::CommandSequence'; }; subtest 'apply requirements' => sub { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; my $intr = $meta->interpolator; $intr->add_helper(foo => undef, Foo => '1.00'); $intr->add_helper(bar => undef, Bar => '2.00'); $intr->add_helper(baz => undef, Baz => '3.00'); my $seq = Alien::Build::CommandSequence->new( '%{foo}', [ '%{bar}' ], [ '%{baz}', '--version', sub {} ], sub {}, ); $seq->apply_requirements($meta, 'share'); is( $build->requires('share'), hash { field Foo => '1.00'; field Bar => '2.00'; field Baz => '3.00'; }, ); }; subtest 'execute' => sub { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; my $intr = $meta->interpolator; $intr->add_helper(foo => sub { 'myfoo' }); system_clear; note capture_merged { Alien::Build::CommandSequence->new( '%{foo}', [ 'stuff', '%{foo}' ], )->execute($build); }; is( system_last, [ ['myfoo'], ['stuff','myfoo'] ], 'plain', ); system_clear; my $error; note capture_merged { eval { Alien::Build::CommandSequence->new( 'bogus', [ 'stuff', '%{foo}' ], )->execute($build); }; $error = $@; }; like $error, qr/command failed/; system_clear; system_hook stuff => sub { print "stuff output"; print STDERR "stuff error"; }; my @cap; note capture_merged { Alien::Build::CommandSequence->new( [ 'stuff', '%{foo}', sub { @cap = @_ } ], )->execute($build); }; is( \@cap, array { item object { prop blessed => ref $build; call sub { shift->isa('Alien::Build') } => T(); }; item hash { field command => ['stuff','myfoo']; field err => match qr/stuff error/; field out => match qr/stuff output/; field exit => 0; }; }, ); system_hook bogus => sub { print "bogus output"; print STDERR "bogus error"; }; @cap = (); note capture_merged { Alien::Build::CommandSequence->new( [ 'bogus', '%{foo}', sub { @cap = @_ } ], )->execute($build); }; is( \@cap, array { item object { prop blessed => ref $build; call sub { shift->isa('Alien::Build') } => T(); }; item hash { field command => ['bogus','myfoo']; field err => match qr/bogus error/; field out => match qr/bogus output/; field exit => -1; }; }, ); system_hook stuff2 => sub { print "single line\n"; print STDERR "stuff error\n"; print STDERR "stuff error\n"; }; system_clear; note capture_merged { Alien::Build::CommandSequence->new( [ 'stuff2', '%{foo}', \'%{alien.runtime.foo}' ], )->execute($build); }; is($build->runtime_prop->{foo}, 'single line'); system_clear; system_hook 'stuff2 myfoo' => sub { print "single line2\n"; print STDERR "stuff error\n"; print STDERR "stuff error\n"; }; note capture_merged { Alien::Build::CommandSequence->new( [ 'stuff2 %{foo}', \'%{alien.runtime.foo2}' ], )->execute($build); }; is($build->runtime_prop->{foo2}, 'single line2'); is system_last, [['stuff2 myfoo']]; system_clear; system_hook 'stuff2 myfoo' => sub { print "single line2\n"; print STDERR "stuff error\n"; print STDERR "stuff error\n"; }; note capture_merged { Alien::Build::CommandSequence->new( [ 'stuff2 %{foo}', \'%{.runtime.foo2}' ], )->execute($build); }; is($build->runtime_prop->{foo2}, 'single line2'); is system_last, [['stuff2 myfoo']]; }; done_testing; Alien-Build-2.84/t/alien_build_commandsequence__cd.t000644 000000 000000 00000003423 14710030646 022450 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::CommandSequence; use Test::Alien::Build; use File::chdir; use File::Temp qw( tempdir ); use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); my $build = alienfile q{ use alienfile }; subtest 'cd list' => sub { local $Alien::Build::VERSION = '1.05'; local $CWD; my $where; my $dir = path(tempdir( CLEANUP => 1 ))->child('foo')->canonpath; my $seq = Alien::Build::CommandSequence->new( [ "%{make_path} $dir" ], [ "cd", "$dir" ], sub { path('foo.txt')->spew('here') }, ); note scalar capture_merged { $seq->execute($build) }; my $foo_txt = path($dir)->child('foo.txt'); is( -f $foo_txt, T(), "created file" ); is( $foo_txt->slurp, "here", "content" ); }; subtest 'cd list' => sub { local $Alien::Build::VERSION = '1.05'; local $CWD; my $where; my $dir = path(tempdir( CLEANUP => 1 ))->child('foo')->canonpath; my $seq = Alien::Build::CommandSequence->new( [ "%{make_path} $dir" ], "cd $dir", sub { path('foo.txt')->spew('here') }, ); note scalar capture_merged { $seq->execute($build) }; my $foo_txt = path($dir)->child('foo.txt'); is( -f $foo_txt, T(), "created file" ); is( $foo_txt->slurp, "here", "content" ); }; subtest 'cd list with code ref' => sub { local $Alien::Build::VERSION = '1.05'; local $CWD; my $where; my $dir = path(tempdir( CLEANUP => 1 ))->child('foo')->canonpath; my $seq = Alien::Build::CommandSequence->new( [ "%{make_path} $dir" ], [ "cd", "$dir", sub { path('foo.txt')->spew('here') } ], ); note scalar capture_merged { $seq->execute($build) }; my $foo_txt = path($dir)->child('foo.txt'); is( -f $foo_txt, T(), "created file" ); is( $foo_txt->slurp, "here", "content" ); }; done_testing; Alien-Build-2.84/t/alien_build_interpolate.t000644 000000 000000 00000007223 14710030646 021024 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Interpolate; use lib 'corpus/lib'; subtest 'basic usage' => sub { my $intr = Alien::Build::Interpolate->new; isa_ok $intr, 'Alien::Build::Interpolate'; $intr->add_helper( foo => '"foo" . "foo"' ); is( $intr->interpolate("bar%{foo}baz"), 'barfoofoobaz' ); is( $intr->interpolate("bar%%baz"), 'bar%baz' ); $intr->add_helper( foo1 => sub { 'foo1' . 'foo1' } ); is( $intr->interpolate("bar%{foo1}baz"), 'barfoo1foo1baz' ); $intr->add_helper( 'foomake1', undef, 'Alien::foomake' => '0.22' ); $intr->add_helper( 'foomake2', undef, 'Alien::foomake' => '0.24' ); $intr->add_helper( 'foomake3', undef, 'Alien::foomake' => '0.29' ); $intr->add_helper( 'foomake4', undef, 'Alien::foobogus' => '0' ); is( $intr->interpolate("-%{foomake1}-"), '-foomake.exe-' ); is( $intr->interpolate("-%{foomake2}-"), '-foomake.exe-' ); eval { $intr->interpolate("-%{foomake3}-") }; isnt( $@, '', "error!"); note $@; eval { $intr->interpolate("-%{foomake4}-") }; isnt( $@, '', "error!"); note $@; $intr->add_helper( bar => undef, 'XYZ::ABC' => '1.234' ); $intr->add_helper( baz => undef, 'ABC::XYZ' => '4.321' ); is( [$intr->requires("%{bar}%{baz}")], [ 'XYZ::ABC' => '1.234', 'ABC::XYZ' => '4.321' ], 'requires' ); eval { $intr->add_helper( foo1 => sub { } ) }; like $@, qr{duplicate implementation for interpolated key foo1}; $intr->replace_helper( foo1 => sub { 'newfoo1' } ); is( $intr->interpolate("%{foo1}"), 'newfoo1' ); is [$intr->requires('%{totallybogus}')], [], ; eval { $intr->interpolate('%{totallybogus}') }; my $error = $@; like $error, qr/no helper defined for totallybogus/; }; subtest 'clone' => sub { my $intr1 = Alien::Build::Interpolate->new; isa_ok $intr1, 'Alien::Build::Interpolate'; $intr1->add_helper( foo => sub { 100 } ); my $intr2 = $intr1->clone; $intr2->add_helper( bar => sub { 200 } ); is( $intr1->interpolate('%{foo}'), 100); is( $intr2->interpolate('%{foo}'), 100); is( $intr2->interpolate('%{bar}'), 200); my $ret = eval { $intr1->interpolate('%{bar}') }; my $error = $@; like $error, qr/no helper defined for bar/; }; subtest 'has_helper' => sub { my $intr = Alien::Build::Interpolate->new; $intr->add_helper(foo => sub { 'foo' . (1+2) }); $intr->add_helper(bar => '"bar" . (3+4)'); my $foo = $intr->has_helper('foo'); my $bar = $intr->has_helper('bar'); is(ref($foo), 'CODE'); is(ref($bar), 'CODE'); is($foo->(), 'foo3'); is($bar->(), 'bar7'); }; subtest 'requirement callback' => sub { my $intr = Alien::Build::Interpolate->new; $intr->add_helper( foo1 => undef, sub { return ( 'Alien::libfoo' => '1' ) } ); is( [$intr->requires("%{foo1}")], [ 'Alien::libfoo' => '1' ], 'requires' ); $intr->add_helper( foo2 => undef, sub { my $helper = shift; $helper->code(sub { 'foo2' }); return (); }); is( [$intr->requires("%{foo2}")], [], 'requires' ); is( $intr->interpolate('-%{foo2}-'), '-foo2-' ); }; subtest 'property' => sub { require Alien::Build; my $build = Alien::Build->new; $build->install_prop->{foo}->{bar} = 'baz'; is $build->meta->interpolator->interpolate('%{.install.foo.bar}', $build), 'baz', 'able to fetch .install.foo.bar using meta->interpolator->interpolate'; is $build->meta->interpolator->interpolate('%{alien.install.foo.bar}', $build), 'baz', 'able to fetch alien.install.foo.bar using meta->interpolator->interpolate'; is dies { $build->meta->interpolator->interpolate('%{.install.foo.bar1}', $build) }, match qr/^No property \.install\.foo\.bar1/, 'unable to interpolate invalid property'; }; done_testing; Alien-Build-2.84/t/alien_build_interpolate_default.t000644 000000 000000 00000003400 14710030646 022521 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Interpolate::Default; use lib 'corpus/lib'; subtest 'basic usage' => sub { my $intr = Alien::Build::Interpolate::Default->new; isa_ok $intr, 'Alien::Build::Interpolate'; if(eval { require YAML }) { note YAML::Dump($intr); } else { require Data::Dumper; note Data::Dumper::Dumper($intr); } }; subtest 'cwd' => sub { my $intr = Alien::Build::Interpolate::Default->new; my $val = $intr->interpolate('%{cwd}'); ok $val, "%{cwd} is okay"; note "val = $val"; }; subtest 'mkdir_deep' => sub { local $Alien::Build::VERSION = '1.04'; my $intr = Alien::Build::Interpolate::Default->new; my $val = $intr->interpolate('%{mkdir_deep} foo'); my $expected = $^O eq 'MSWin32' ? 'md foo' : 'mkdir -p foo'; is($val, $expected); }; subtest 'make_path' => sub { local $Alien::Build::VERSION = '1.05'; my $intr = Alien::Build::Interpolate::Default->new; my $val = $intr->interpolate('%{make_path} foo'); my $expected = $^O eq 'MSWin32' ? 'md foo' : 'mkdir -p foo'; is($val, $expected); }; subtest dynamic => sub { my %which; my $mock = mock 'Alien::Build::Interpolate::Default' => ( override => [ which => sub { my $command = shift; $which{$command} }, ], ); subtest 'have bison' => sub { $which{bison} = '/usr/bin/bison'; my $intr = Alien::Build::Interpolate::Default->new; is [$intr->requires('%{bison}')], [] ; is $intr->interpolate('-%{bison}-'), '-bison-', ; }; subtest 'no bison' => sub { delete $which{bison}; my $intr = Alien::Build::Interpolate::Default->new; is [$intr->requires('%{bison}')], [ 'Alien::bison' => '0.17' ] ; }; }; done_testing; Alien-Build-2.84/t/alien_build_log.t000644 000000 000000 00000004141 14710030646 017253 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build; use Alien::Build::Log; delete $ENV{ALIEN_BUILD_LOG}; subtest constructors => sub { subtest 'basic' => sub { eval { Alien::Build::Log->new }; like $@, qr/Cannot instantiate base class/; my $log = Alien::Build::Log->default; isa_ok $log, 'Alien::Build::Log'; isa_ok $log, 'Alien::Build::Log::Default'; undef $log; Alien::Build::Log->set_log_class('Alien::Build::Log::Bogus'); eval { Alien::Build::Log->default }; like $@, qr/Can't locate Alien\/Build\/Log\/Bogus\.pm/; }; subtest 'override with set_log_class' => sub { our $roger; { package Alien::Build::Log::Roger; use parent qw( Alien::Build::Log ); sub log { my (undef, %opt) = @_; $main::roger = \%opt; } } Alien::Build::Log->set_log_class('Alien::Build::Log::Roger'); isa_ok(Alien::Build::Log->default, 'Alien::Build::Log'); isa_ok(Alien::Build::Log->default, 'Alien::Build::Log::Roger'); Alien::Build->log("hello"); my $line = __LINE__; is( $roger, hash { field caller => array { item 'main'; item __FILE__; item $line; }; field message => 'hello'; end; }, 'message sent to log method' ); }; subtest 'override with environment' => sub { our $dodger; { package Alien::Build::Log::Dodger; use parent qw( Alien::Build::Log ); sub log { my (undef, %opt) = @_; $main::dodger = \%opt; } } Alien::Build::Log->set_log_class(undef); $ENV{ALIEN_BUILD_LOG} = 'Alien::Build::Log::Dodger'; isa_ok(Alien::Build::Log->default, 'Alien::Build::Log'); isa_ok(Alien::Build::Log->default, 'Alien::Build::Log::Dodger'); Alien::Build->log("hello"); my $line = __LINE__; is( $dodger, hash { field caller => array { item 'main'; item __FILE__; item $line; }; field message => 'hello'; end; }, 'message sent to log method' ); }; }; done_testing; Alien-Build-2.84/t/alien_build_log_abbreviate.t000644 000000 000000 00000000145 14710030646 021437 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Log::Abbreviate; ok 1; done_testing; Alien-Build-2.84/t/alien_build_log_default.t000644 000000 000000 00000000142 14710030646 020754 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Log::Default; ok 1; done_testing; Alien-Build-2.84/t/alien_build_meta.t000644 000000 000000 00000000400 14710030646 017412 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build; subtest 'basic' => sub { my $build = alienfile_ok qq{ use alienfile }; my $meta = $build->meta; isa_ok( $build->meta, 'Alien::Build::Meta' ); }; done_testing; Alien-Build-2.84/t/alien_build_mm.t000644 000000 000000 00000017054 14710030646 017112 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build (); use Alien::Build::MM qw( cmd ); use File::chdir; use File::Temp qw( tempdir ); use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); use Alien::Build::Util qw( _dump ); sub alienfile { my($str) = @_; my(undef, $filename, $line) = caller; $str = '# line '. $line . ' "' . $filename . qq("\n) . $str; path('alienfile')->spew($str); } sub get_build { my($build) = _args(); $build; } @INC = map { ref $_ ? $_ : path($_)->absolute->stringify } @INC; { package Config::Foo; $Config::Foo::VERSION = 99; $INC{'Config/Foo.pm'} = __FILE__ } { package Config::Bar; $Config::Bar::VERSION = 99; $INC{'Config/Bar.pm'} = __FILE__ } subtest 'basic' => sub { local $CWD = tempdir( CLEANUP => 1 ); alienfile q{ use alienfile; probe sub { $ENV{ALIEN_INSTALL_TYPE}; }; configure { requires 'Config::Foo' => '1.234', requires 'Config::Bar' => 0, }; share { requires 'Share::Foo' => '4.567', }; sys { requires 'Sys::Foo' => '9.99', }; }; subtest 'system' => sub { local $ENV{ALIEN_INSTALL_TYPE} = 'system'; my $abmm = Alien::Build::MM->new; isa_ok $abmm, 'Alien::Build::MM'; isa_ok $abmm->build, 'Alien::Build'; my %args = $abmm->mm_args( DISTNAME => 'Alien-Foo', CONFIGURE_REQUIRES => { 'YAML' => '1.2', 'Dancer2' => '3.4', 'Config::Foo' => '0.09', 'Config::Bar' => '0.01', }, BUILD_REQUIRES => { 'Foo::Bar::Baz' => '1.23', }, ); is(path($abmm->build->install_prop->{stage})->basename, 'Alien-Foo', 'stage dir'); note "stage = @{[ $abmm->build->install_prop->{stage} ]}"; is( \%args, hash { field CONFIGURE_REQUIRES => hash { field 'Alien::Build::MM' => T(); field 'YAML' => '1.2'; field 'Dancer2' => '3.4'; field 'Config::Foo' => '1.234'; field 'Config::Bar' => '0.01'; }; field BUILD_REQUIRES => hash { field 'Alien::Build::MM' => T(); field 'Foo::Bar::Baz' => '1.23'; field 'Sys::Foo' => '9.99'; }; field PREREQ_PM => hash { field 'Alien::Build' => T(); }; etc; }, ); undef $abmm; ok( -d '_alien', "left alien directory" ); ok( -f '_alien/state.json', "left alien.json file" ); }; subtest 'share' => sub { local $ENV{ALIEN_INSTALL_TYPE} = 'share'; my $abmm = Alien::Build::MM->new; isa_ok $abmm, 'Alien::Build::MM'; isa_ok $abmm->build, 'Alien::Build'; my %args = $abmm->mm_args( DISTNAME => 'Alien-Foo', CONFIGURE_REQUIRES => { 'YAML' => '1.2', 'Dancer2' => '3.4', 'Config::Foo' => '0.09', 'Config::Bar' => '0.01', }, BUILD_REQUIRES => { 'Foo::Bar::Baz' => '1.23', }, ); is( \%args, hash { field CONFIGURE_REQUIRES => hash { field 'Alien::Build::MM' => T(); field 'YAML' => '1.2'; field 'Dancer2' => '3.4'; field 'Config::Foo' => '1.234'; field 'Config::Bar' => '0.01'; }; field BUILD_REQUIRES => hash { field 'Alien::Build::MM' => T(); field 'Foo::Bar::Baz' => '1.23'; field 'Share::Foo' => '4.567'; }; field PREREQ_PM => hash { field 'Alien::Build' => T(); }; etc; }, ); }; }; subtest 'mm_postamble' => sub { local $CWD = tempdir( CLEANUP => 1 ); my $build = alienfile q{ use alienfile; probe sub { 'system' }; }; my $abmm = Alien::Build::MM->new; $abmm->mm_args( DISTNAME => 'Alien-Foo', ); my $postamble = $abmm->mm_postamble; ok $postamble, 'returned a true value'; note $postamble; }; subtest 'set_prefix' => sub { foreach my $type (qw( perl site vendor )) { subtest "type = $type" => sub { local $CWD = tempdir( CLEANUP => 1 ); alienfile q{ use alienfile; probe sub { 'share' }; }; my @dirs = map { path($CWD)->child('foo')->child($_) } qw( perl site vendor ); $_->mkpath for @dirs; do { my $abmm = Alien::Build::MM->new; $abmm->mm_args( DISTNAME => 'Alien-Foo', ); }; note capture_merged { local @ARGV = ($type, @dirs); prefix(); }; ok( -f '_alien/mm/prefix', 'touched prefix' ); my $build = Alien::Build->resume('alienfile', '_alien'); my $prefix = path($build->runtime_prop->{prefix})->relative($CWD)->stringify; is $prefix, "foo/$type/auto/share/dist/Alien-Foo", "correct path"; }; } }; subtest 'download + build' => sub { local $CWD = tempdir( CLEANUP => 1 ); $main::call_download = 0; $main::call_build = 0; alienfile q{ use alienfile; plugin 'Test::Mock', probe => 'share', check_digest => 1; use Path::Tiny qw( path ); share { download sub { my($build) = @_; my $path = path('foo.tar.gz')->absolute; $path->spew('foo'); $build->install_prop->{download_detail}->{"$path"} = { protocol => 'file', digest => [ FAKE => 'deadbeaf' ], }; print " + IN DOWNLOAD +\n"; $main::call_download = 1; }; extract sub { print " + IN EXTRACT +\n"; path('file1')->spew('foo1'); path('file2')->spew('foo2'); }; build sub { print " + IN BUILD +\n"; $main::call_build = 1; }; }; }; my $abmm = Alien::Build::MM->new; $abmm->mm_args( DISTNAME => 'Alien-Foo', ); note capture_merged { local @ARGV = ('perl', map { ($_,$_,$_) } tempdir( CLEANUP => 1 )); prefix(); }; my($out, $error) = capture_merged { local @ARGV = (); eval { download() }; $@; }; note $out if $out ne ''; is($error, '', 'no error in download') || do { diag _dump(get_build()->install_prop); return; }; note _dump(get_build()->install_prop); ok( -f '_alien/mm/download', 'touched download' ); is $main::call_download, 1, 'download'; ($out, $error) = capture_merged { local @ARGV = (); eval { build() }; $@; }; note $out if $out ne ''; is($error, '', 'no error in build') || do { diag _dump(get_build()->install_prop); return; }; note _dump(get_build()->install_prop); ok( -f '_alien/mm/build', 'touched build' ); is $main::call_build, 1, 'build'; }; subtest 'patch' => sub { local $CWD = tempdir( CLEANUP => 1 ); alienfile q{ use alienfile; }; path('patch')->mkpath; path('patch/foo.txt')->touch; my $abmm = Alien::Build::MM->new; ok( $abmm->build->install_prop->{patch}, 'patch is defined' ); ok( -f path($abmm->build->install_prop->{patch})->child('foo.txt'), 'got the correct directory' ); }; subtest 'clean_install' => sub { local $CWD = tempdir( CLEANUP => 1 ); alienfile q{ use alienfile; probe sub { 'share' }; }; my @dirs = map { path($CWD)->child('foo')->child($_) } qw( perl site vendor ); $_->mkpath for @dirs; my $abmm = Alien::Build::MM->new( clean_install => 1 ); is( $abmm->clean_install, T() ); my %args = $abmm->mm_args( DISTNAME => 'AlienFoo' ); is( \%args, hash { field CONFIGURE_REQUIRES => hash { field 'Alien::Build::MM' => '1.74'; etc; }; field BUILD_REQUIRES => hash { field 'Alien::Build::MM' => '1.74'; etc; }; field PREREQ_PM => hash { field 'Alien::Build' => '1.74'; etc; }; etc; }, ); }; done_testing; Alien-Build-2.84/t/alien_build_plugin.t000644 000000 000000 00000005400 14710030646 017767 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Plugin (); use lib 'corpus/lib'; subtest 'basic' => sub { my $plugin = Alien::Build::Plugin->new; isa_ok $plugin, 'Alien::Build::Plugin'; }; subtest 'properties' => sub { require Alien::Build::Plugin::RogerRamjet; subtest 'defaults' => sub { my $plugin = Alien::Build::Plugin::RogerRamjet->new; is $plugin->foo, 22; is $plugin->bar, 'something generated'; }; subtest 'override' => sub { my $plugin = Alien::Build::Plugin::RogerRamjet->new( foo => 42, bar => 'anything else', ); is $plugin->foo, 42; is $plugin->bar, 'anything else'; }; subtest 'set' => sub { my $plugin = Alien::Build::Plugin::RogerRamjet->new; $plugin->foo(92); $plugin->bar('string'); is $plugin->foo, 92; is $plugin->bar, 'string'; }; }; subtest 'instance-id' => sub { { package Alien::Build::Plugin::ABC::XYZ1; use Alien::Build::Plugin; has foo => undef; has bar => undef; } { package Alien::Build::Plugin::ABC::XYZ2; use Alien::Build::Plugin; has foo => undef; } is( Alien::Build::Plugin::ABC::XYZ1->new->instance_id, match qr/^[a-z0-9]{40}$/, 'id is a 40 character hex value', ); is( Alien::Build::Plugin::ABC::XYZ1->new->instance_id, Alien::Build::Plugin::ABC::XYZ1->new->instance_id, 'zero args is the consistent', ); isnt( Alien::Build::Plugin::ABC::XYZ1->new->instance_id, Alien::Build::Plugin::ABC::XYZ2->new->instance_id, 'zero args different class is different', ); isnt( Alien::Build::Plugin::ABC::XYZ1->new(foo => 1)->instance_id, Alien::Build::Plugin::ABC::XYZ2->new(foo => 1)->instance_id, 'same args different class is different', ); isnt( Alien::Build::Plugin::ABC::XYZ1->new( foo => 1, bar => 2)->instance_id, Alien::Build::Plugin::ABC::XYZ1->new->instance_id, 'args vs no args different', ); isnt( Alien::Build::Plugin::ABC::XYZ1->new( foo => 1, bar => 2)->instance_id, Alien::Build::Plugin::ABC::XYZ1->new( foo => 2, bar => 3)->instance_id, 'args vs different args different', ); is( Alien::Build::Plugin::ABC::XYZ1->new( foo => 1, bar => 2)->instance_id, Alien::Build::Plugin::ABC::XYZ1->new( bar => 2, foo => 1)->instance_id, 'same args is same', ); is( Alien::Build::Plugin::ABC::XYZ1->new( foo => [1,2,3], bar => 2)->instance_id, Alien::Build::Plugin::ABC::XYZ1->new( bar => 2, foo => [1,2,3])->instance_id, 'same args is same (array)', ); isnt( Alien::Build::Plugin::ABC::XYZ1->new( foo => [1,3,2], bar => 2)->instance_id, Alien::Build::Plugin::ABC::XYZ1->new( bar => 2, foo => [1,2,3])->instance_id, 'different args is same (array)', ); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_build_autoconf.t000644 000000 000000 00000005742 14710030646 023055 0ustar00rootroot000000 000000 use 5.008004; use lib 'corpus/lib'; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Build::Autoconf; use Alien::Build::Util qw( _dump ); use Path::Tiny qw( path ); subtest 'basic' => sub { my $plugin = Alien::Build::Plugin::Build::Autoconf->new; isa_ok $plugin, 'Alien::Build::Plugin'; isa_ok $plugin, 'Alien::Build::Plugin::Build::Autoconf'; my $build = alienfile_ok q{ use alienfile }; my $meta = $build->meta; $plugin->init($meta); my $configure = $meta->interpolator->interpolate('%{configure}'); isnt $configure, '', "\%{configure} = $configure"; like $configure, qr{configure}; like $configure, qr{--with-pic}; is($build->meta_prop->{destdir}, 1); is($meta->prop->{destdir}, 1); }; subtest 'turn off --with-pic' => sub { my $plugin = Alien::Build::Plugin::Build::Autoconf->new( with_pic => 0 ); is( $plugin->with_pic, 0 ); my $build = alienfile_ok q{ use alienfile }; my $meta = $build->meta; $plugin->init($meta); my $configure = $meta->interpolator->interpolate('%{configure}'); isnt $configure, '', "\%{configure} = $configure"; like $configure, qr{configure$}; }; subtest 'out-of-source' => sub { skip_all 'test requires Archive::Tar' unless eval { require Archive::Tar; 1 }; local $Alien::Build::VERSION = '1.08'; my $build = alienfile_ok q{ use alienfile; use Alien::Build::Util qw( _dump ); use Path::Tiny qw( path ); share { meta->prop->{out_of_source} = 1; plugin 'Download::Foo'; plugin 'Build::Autoconf' => ( with_pic => 0, ); build sub { my($build) = @_; $build->log(_dump($build->install_prop)); path('file1')->touch; my $prefix = $build->install_prop->{prefix}; $prefix =~ s{^([a-z]):/}{$1/}i if $^O eq 'MSWin32'; $build->log("prefix = $prefix"); my $file2 = path($ENV{DESTDIR})->child($prefix)->child('file2'); $file2->parent->mkpath; $file2->touch; }; }; }; $build->load_requires('share'); note _dump($build->install_prop); subtest 'before build' => sub { my $configure = $build->meta->interpolator->interpolate('%{configure}'); note "%{configure} = $configure"; ok 1; }; alien_build_ok; note _dump($build->install_prop); subtest 'after build' => sub { my $configure = $build->meta->interpolator->interpolate('%{configure}'); note "%{configure} = $configure"; my $regex = $^O eq 'MSWin32' ? qr/^sh (.*?)\s/ : qr/^(.*)\s/; like $configure, $regex, 'matches'; if($configure =~ $regex) { my $path = path($1); ok(-f $path, "configure is in the right spot" ); ok(-f $path->sibling('foo.c'), "foo.c is in the right spot" ); } }; }; done_testing; { package Alien::MSYS; use File::Temp qw( tempdir ); BEGIN { our $VERSION = '0.07'; $INC{'Alien/MSYS.pm'} = __FILE__; } my $path; sub msys_path { if(!$path) { $path = tempdir( CLEANUP => 1); } $path; } } Alien-Build-2.84/t/alien_build_plugin_build_cmake.t000644 000000 000000 00000006360 14710030646 022314 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien; use Test::Alien::Build; use Alien::Build::Plugin::Build::CMake; use Path::Tiny (); eval { require Alien::cmake3 }; skip_all 'test requires Alien::cmake3' if $@; # To see the actual commands being executed $ENV{VERBOSE} = 1; $Alien::Build::Plugin::Fetch::LocalDir::VERSION ||= '0.99'; $Alien::Build::Plugin::Build::CMake::VERSION ||= '0.99'; $Alien::Build::Plugin::Gather::IsolateDynamic::VERSION ||= '0.99'; my $xs = do { local $/; }; foreach my $type (qw( basic out-of-source )) { subtest $type => sub { # This test uses extract directory, which is unsupported by check_digest. # It uses local corpus data and does not connect to internet. local $ENV{ALIEN_DOWNLOAD_RULE} = 'warn'; my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); meta->prop->{start_url} = path('corpus/cmake-libpalindrome')->absolute->stringify; probe sub { 'share' }; share { plugin 'Fetch::LocalDir'; plugin 'Extract' => 'd'; plugin 'Build::CMake'; plugin 'Gather::IsolateDynamic'; gather sub { my($build) = @_; my $prefix = $build->runtime_prop->{prefix}; $build->runtime_prop->{$_} = "-I$prefix/include" for qw( cflags cflags_static ); if($build->meta_prop->{platform}->{compiler_type} eq 'microsoft') { $build->runtime_prop->{$_} = "-LIBPATH:$prefix/lib palindromeStatic.lib" for qw( libs libs_static ); } else { my $lib = $^O =~ /^(cygwin|MSWin32)$/ ? '-lpalindromeStatic' : '-lpalindrome'; $build->runtime_prop->{$_} = "-L$prefix/lib $lib" for qw( libs libs_static ); } }; }; }; if($type eq 'out-of-source') { $build->meta->prop->{out_of_source} = 1; } if($build->requires('share')->{'Alien::gmake'}) { if(!eval { $build->load_requires($build->install_type); 1 }) { note "prereqs not met"; return; } } my $alien = alien_build_ok; if(! defined $alien) { if($^O eq 'MSWin32') { my $tmp = $build->root; $tmp =~ s{/}{\\}g; $tmp .= "\\.."; diag "dir $tmp /s"; diag `dir $tmp /s`; } else { my $tmp = Path::Tiny->new($build->root)->parent; diag `ls -lR $tmp`; } } alien_ok $alien; note 'cflags = ', $alien->cflags; note 'libs = ', $alien->libs; xs_ok { xs => $xs, verbose => 1 }, with_subtest { my($mod) = @_; is($mod->is_palindrome("Something that is not a palindrome"), 0); is($mod->is_palindrome("Was it a car or a cat I saw?"), 1); }; run_ok(['palx', 'Something that is not a palindrome']) ->note ->exit_is(2); run_ok(['palx', 'Was it a car or a cat I saw?']) ->note ->success; run_ok(['palx', 'racecar']) ->note ->success; }; }; done_testing __DATA__ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include MODULE = TA_MODULE PACKAGE = TA_MODULE int is_palindrome(klass, word) const char *klass const char *word CODE: RETVAL = is_palindrome(word); OUTPUT: RETVAL Alien-Build-2.84/t/alien_build_plugin_build_copy.t000644 000000 000000 00000002307 14710030646 022203 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Build::Copy; use Path::Tiny; alien_subtest 'basic' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock', probe => 'share', download => 1; share { extract sub { my $bin = Path::Tiny->new('.')->absolute->child('bin')->child('mycommand'); log "bin=$bin"; $bin->parent->mkpath; $bin->touch; $bin->chmod(0755) if $^O ne 'MSWin32'; my $include = Path::Tiny->new('.')->absolute->child('include')->child('foo.h'); $include->parent->mkpath; $include->touch; }; plugin 'Build::Copy'; }; }; alien_build_ok 'builds okay'; my $stage = Path::Tiny->new($build->install_prop->{stage}); my $mycommand = $stage->child('bin', 'mycommand'); ok(-f $mycommand, "file $mycommand exists"); ok(-x $mycommand, "file $mycommand is executable") if $^O !~ /^(MSWin32|msys|cygwin)$/; my $inc = $stage->child('include','foo.h'); ok(-f $inc, "file $inc exists"); is( $build->requires('configure')->{'Alien::Build::Plugin::Build::Copy'}, D(), 'requires self', ); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_build_make.t000644 000000 000000 00000004374 14710030646 022154 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Build::Make; use Path::Tiny qw( path ); subtest 'compile' => sub { foreach my $type (qw( nmake dmake gmake umake )) { subtest $type => sub { my $build = alienfile_ok qq{ use alienfile; plugin 'Build::Make' => '$type'; }; if($type =~ /nmake|dmake/) { is( $build->meta->interpolator->interpolate('%{make}'), $type, ); } }; } }; subtest 'gmake' => sub { my $build = alienfile q{ use alienfile; use Path::Tiny qw( path ); plugin 'Build::Make' => 'gmake'; probe sub { 'share' }; share { download sub { path('file1')->touch }; extract sub { # simple portable makefile that uses gmake specific # automatic variables path('Makefile')->spew( "%.exe:%.c\n", "\t$^X build.pl \$< \$@\n", "\n", "install:foo.exe\n", "\t$^X install.pl foo.exe \$(PREFIX)/bin/foo.exe\n", ); path('build.pl')->spew("#!$^X\n", q{ use strict; use warnings; use Path::Tiny qw( path ); my($from, $to) = map { path($_) } @ARGV; $to->spew('[' . $from->slurp . ']'); }); path('install.pl')->spew("#!$^X\n", q{ use strict; use warnings; use Path::Tiny qw( path ); my($from, $to) = map { path($_) } @ARGV; $to->parent->mkpath; $from->copy($to); print "copy $from $to\n"; }); path('foo.c')->spew( "something", ); }; build [ '%{make} foo.exe', '%{make} install PREFIX=%{.install.prefix}', ]; }; }; eval { $Alien::Build::Plugin::Build::Make::VERSION = '0.01'; $build->load_requires('configure'); $build->load_requires($build->install_type); }; skip_all 'test requires GNU Make or Alien::gmake' if $@; note "make = @{[ $build->meta->interpolator->interpolate('%{make}') ]}"; my $alien = alien_build_ok; my $foo_exe = path($alien->bin_dir)->child('foo.exe'); note "foo_exe = $foo_exe"; note "content = ", $foo_exe->slurp; is($foo_exe->slurp, '[something]'); }; done_testing Alien-Build-2.84/t/alien_build_plugin_build_msys.t000644 000000 000000 00000001007 14710030646 022220 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Build::MSYS; subtest 'basic' => sub { my $plugin = Alien::Build::Plugin::Build::MSYS->new; isa_ok $plugin, 'Alien::Build::Plugin'; isa_ok $plugin, 'Alien::Build::Plugin::Build::MSYS'; my $build = alienfile_ok q{ use alienfile }; my $meta = $build->meta; $plugin->init($meta); }; done_testing; { package Alien::MSYS; BEGIN { our $VERSION = '0.07'; $INC{'Alien/MSYS.pm'} = __FILE__; } } Alien-Build-2.84/t/alien_build_plugin_build_searchdep.t000644 000000 000000 00000013347 14710030646 023175 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Build::SearchDep; use lib 'corpus/lib'; use Alien::libfoo1; use Alien::libfoo2; use Capture::Tiny qw( capture_merged ); use Path::Tiny qw( path ); eval { require Archive::Tar; }; skip_all 'test requires Archive::Tar' if $@; eval { require Env::ShellWords }; skip_all 'test requires Env::ShellWords' if $@; my $corpus = path('corpus')->absolute; $corpus =~ s{(\s)}{\\$1}g; subtest basic => sub { delete $ENV{$_} for qw( CFLAGS CXXFLAGS LDFLAGS ); my $build = alienfile q{ use alienfile; share { plugin 'Download::Foo'; plugin 'Build::SearchDep' => ( aliens => 'Alien::libfoo2', ); build sub { my($build) = @_; for(qw( CFLAGS CXXFLAGS LDFLAGS )) { die "$_ not defined !!" unless defined $ENV{$_}; #print "$_=$ENV{$_}\n"; $build->runtime_prop->{"my_$_"} = $ENV{$_}; } }; gather sub { my($build) = @_; $build->runtime_prop->{cflags} = '-core-cflag'; $build->runtime_prop->{cflags_static} = '-core-cflag-static'; $build->runtime_prop->{libs} = '-core-flag'; $build->runtime_prop->{libs_static} = '-core-flag-static'; }; }; }; ok $build->requires('configure')->{'Alien::Build::Plugin::Build::SearchDep'}, 'set configure require for self'; ok $build->requires('share')->{'Env::ShellWords'}, 'set share require for Env::ShellWords'; is $build->requires('share')->{'Alien::libfoo2'}, 0, 'set share require for Alien::libfoo2'; note scalar capture_merged { $build->load_requires($build->install_type); $build->download; $build->build; }; is($build->runtime_prop->{cflags}, '-core-cflag', 'cflags'); is($build->runtime_prop->{cflags_static}, '-core-cflag-static', 'cflags_static'); is($build->runtime_prop->{libs}, "-L$corpus/lib/auto/share/dist/Alien-libfoo2/lib -core-flag", 'libs'); is($build->runtime_prop->{libs_static}, "-L$corpus/lib/auto/share/dist/Alien-libfoo2/lib -core-flag-static", 'libs_static'); is($build->runtime_prop->{my_CFLAGS}, "-I$corpus/lib/auto/share/dist/Alien-libfoo2/include", 'my_CFLAGS'); is($build->runtime_prop->{my_CXXFLAGS}, "-I$corpus/lib/auto/share/dist/Alien-libfoo2/include", 'my_CXXFLAGS'); is($build->runtime_prop->{my_LDFLAGS}, "-L$corpus/lib/auto/share/dist/Alien-libfoo2/lib", 'my_LDFLAGS'); }; subtest public_I => sub { delete $ENV{$_} for qw( CFLAGS CXXFLAGS LDFLAGS ); my $build = alienfile q{ use alienfile; share { plugin 'Download::Foo'; plugin 'Build::SearchDep' => ( aliens => 'Alien::libfoo2', public_I => 1, ); build sub {}; gather sub { my($build) = @_; $build->runtime_prop->{cflags} = '-core-cflag'; $build->runtime_prop->{cflags_static} = '-core-cflag-static'; $build->runtime_prop->{libs} = '-core-flag'; $build->runtime_prop->{libs_static} = '-core-flag-static'; }; }; }; note scalar capture_merged { $build->load_requires($build->install_type); $build->download; $build->build; }; is($build->runtime_prop->{cflags}, "-I$corpus/lib/auto/share/dist/Alien-libfoo2/include -core-cflag"); is($build->runtime_prop->{cflags_static}, "-I$corpus/lib/auto/share/dist/Alien-libfoo2/include -core-cflag-static"); is($build->runtime_prop->{libs}, "-L$corpus/lib/auto/share/dist/Alien-libfoo2/lib -core-flag"); is($build->runtime_prop->{libs_static}, "-L$corpus/lib/auto/share/dist/Alien-libfoo2/lib -core-flag-static"); }; subtest public_l => sub { delete $ENV{$_} for qw( CFLAGS CXXFLAGS LDFLAGS ); my $build = alienfile q{ use alienfile; share { plugin 'Download::Foo'; plugin 'Build::SearchDep' => ( aliens => 'Alien::libfoo2', public_l => 1, ); build sub { }; gather sub { my($build) = @_; $build->runtime_prop->{cflags} = '-core-cflag'; $build->runtime_prop->{cflags_static} = '-core-cflag-static'; $build->runtime_prop->{libs} = '-core-flag'; $build->runtime_prop->{libs_static} = '-core-flag-static'; }; }; }; note scalar capture_merged { $build->load_requires($build->install_type); $build->download; $build->build; }; is($build->runtime_prop->{cflags}, '-core-cflag'); is($build->runtime_prop->{cflags_static}, '-core-cflag-static'); is($build->runtime_prop->{libs}, "-L$corpus/lib/auto/share/dist/Alien-libfoo2/lib -lfoo -lbar -lbaz -core-flag"); is($build->runtime_prop->{libs_static}, "-L$corpus/lib/auto/share/dist/Alien-libfoo2/lib -lfoo -lbar -lbaz -core-flag-static"); }; subtest list => sub { my $build = alienfile q{ use alienfile; plugin 'Build::SearchDep' => ( aliens => [ 'Alien::libfoo1', 'Alien::libfoo2' ], ); share { }; }; ok $build->requires('configure')->{'Alien::Build::Plugin::Build::SearchDep'}, 'set configure require for self'; ok $build->requires('share')->{'Env::ShellWords'}, 'set share require for Env::ShellWords'; is $build->requires('share')->{'Alien::libfoo1'}, 0, 'set share require for Alien::libfoo1'; is $build->requires('share')->{'Alien::libfoo2'}, 0, 'set share require for Alien::libfoo2'; }; subtest hash => sub { my $build = alienfile q{ use alienfile; plugin 'Build::SearchDep' => ( aliens => { 'Alien::libfoo2' => '0.01'}, ); share { }; }; ok $build->requires('configure')->{'Alien::Build::Plugin::Build::SearchDep'}, 'set configure require for self'; ok $build->requires('share')->{'Env::ShellWords'}, 'set share require for Env::ShellWords'; is $build->requires('share')->{'Alien::libfoo2'}, '0.01', 'set share require for Alien::libfoo2'; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_core_cleaninstall.t000644 000000 000000 00000003151 14710030646 023531 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Plugin::Core::CleanInstall; use Test::Alien::Build; use Path::Tiny qw( path ); subtest 'basic' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; }; my $dir = path($build->runtime_prop->{prefix}); $dir->child($_)->mkpath for qw( _alien bin include lib ); $dir->child('foo.txt')->touch; $dir->child('_alien/alienfile')->touch; $dir->child('bin/myexe')->touch; $dir->child('include/myheader.h')->touch; $dir->child('lib/libfoo.a')->touch; alien_clean_install; ok -d "$dir/_alien"; ok -f "$dir/_alien/alienfile"; ok !-e "$dir/foo.txt"; ok !-e "$dir/bin/myexe"; ok !-e "$dir/include/myheader.h"; ok !-e "$dir/lib/libfoo.a"; }; subtest 'do not remove on system install' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'system' }; }; my $dir = path($build->runtime_prop->{prefix}); $dir->child($_)->mkpath for qw( _alien bin include lib ); $dir->child('foo.txt')->touch; $dir->child('_alien/alienfile')->touch; $dir->child('bin/myexe')->touch; $dir->child('include/myheader.h')->touch; $dir->child('lib/libfoo.a')->touch; alien_clean_install; ok -d "$dir/_alien"; ok -f "$dir/_alien/alienfile"; ok -f "$dir/foo.txt"; ok -f "$dir/bin/myexe"; ok -f "$dir/include/myheader.h"; ok -f "$dir/lib/libfoo.a"; }; subtest 'do not try to remove when it isn\'t there' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; }; path($build->runtime_prop->{prefix})->remove_tree; alien_clean_install; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_core_download.t000644 000000 000000 00000016513 14710030646 022675 0ustar00rootroot000000 000000 use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Path::Tiny qw( path ); alien_subtest 'http html' => sub { # This test uses fake HTTP in class written below # to test http fetch. Does not realy connect to # real HTTP local $ENV{ALIEN_DOWNLOAD_RULE} = 'warn'; my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; plugin 'Decode::HTML'; plugin 'Fetch::FauxHTTP', url => 'http://foo.test', style => 'html'; plugin 'Prefer::SortVersions'; }; alienfile_skip_if_missing_prereqs; alien_download_ok; is path($build->install_prop->{download}), object { call basename => 'foo-1.01.tar.gz'; call slurp_raw => 'tarball 1.01'; }, 'downloaded 1.01'; }; alien_subtest 'http html' => sub { # This test uses fake HTTP in class written below # to test http fetch. Does not really connect to # real HTTP local $ENV{ALIEN_DOWNLOAD_RULE} = 'warn'; my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; plugin 'Fetch::FauxHTTP', url => 'http://foo.test', style => 'list'; plugin 'Prefer::SortVersions'; }; alienfile_skip_if_missing_prereqs; alien_download_ok; is path($build->install_prop->{download}), object { call basename => 'foo-1.01.tar.gz'; call slurp_raw => 'tarball 1.01'; }, 'downloaded 1.01'; }; alien_subtest 'https html' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; plugin 'Decode::HTML'; plugin 'Fetch::FauxHTTP', url => 'https://foo.test', style => 'html'; plugin 'Prefer::SortVersions'; }; alienfile_skip_if_missing_prereqs; alien_download_ok; is path($build->install_prop->{download}), object { call basename => 'foo-1.00.tar.gz'; call slurp_raw => 'tarball 1.00'; }, 'downloaded 1.01'; }; alien_subtest 'https html' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; plugin 'Fetch::FauxHTTP', url => 'https://foo.test', style => 'list'; plugin 'Prefer::SortVersions'; }; alienfile_skip_if_missing_prereqs; alien_download_ok; is path($build->install_prop->{download}), object { call basename => 'foo-1.00.tar.gz'; call slurp_raw => 'tarball 1.00'; }, 'downloaded 1.01'; }; alien_subtest 'protocol + digest' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || '2.60'; subtest 'file content' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { start_url 'file://localhost/'; digest SHA256 => 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9'; fetch sub { return { type => 'file', filename => 'foo.txt', content => 'bar', protocol => 'file', }; }; }; }; alienfile_skip_if_missing_prereqs; alien_download_ok; is $build->install_prop, hash { field download => T(); field download_detail => hash { field $build->install_prop->{download} => hash { field digest => [SHA256 => 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9']; field protocol => 'file'; etc; }; etc; }; etc; }, 'install properties set'; }; subtest 'filesystem no tmp' => sub { my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); use File::Temp qw( tempdir ); probe sub { 'share' }; share { start_url 'file://localhost/'; digest SHA256 => 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9'; fetch sub { my $path = path( tempdir( CLEANUP => 1 ))->child('foo.txt')->absolute; $path->spew('bar'); return { type => 'file', filename => 'foo.txt', path => "$path", tmp => 0, protocol => 'file', }; }; }; }; alienfile_skip_if_missing_prereqs; alien_download_ok; is $build->install_prop, hash { field download => T(); field download_detail => hash { field $build->install_prop->{download} => hash { field digest => [SHA256 => 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9']; field protocol => 'file'; etc; }; etc; }; etc; }, 'install properties set'; }; subtest 'filesystem tmp' => sub { my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); use File::Temp qw( tempdir ); probe sub { 'share' }; share { start_url 'file://localhost/'; digest SHA256 => 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9'; fetch sub { my $path = path( tempdir( CLEANUP => 1 ))->child('foo.txt')->absolute; $path->spew('bar'); return { type => 'file', filename => 'foo.txt', path => "$path", tmp => 1, protocol => 'file', }; }; }; }; alienfile_skip_if_missing_prereqs; alien_download_ok; is $build->install_prop, hash { field download => T(); field download_detail => hash { field $build->install_prop->{download} => hash { field digest => [SHA256 => 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9']; field protocol => 'file'; etc; }; etc; }; etc; }, 'install properties set'; }; }; done_testing; package Alien::Build::Plugin::Fetch::FauxHTTP; use Alien::Build::Plugin; BEGIN { has '+url' => ''; has 'style' => 'html'; } sub init { my($self, $meta) = @_; $meta->prop->{start_url} ||= $self->url; $meta->register_hook( fetch => sub { my($build, $url) = @_; $url ||= $self->url; if($url =~ m{^(https?)://foo\.test/?$}) { if($self->style eq 'html') { return { type => 'html', base => "$url", content => q{ my listing }, protocol => $1, }; } elsif($self->style eq 'list') { return { type => 'list', list => [ { filename => 'foo-1.00.tar.gz', url => 'https://foo.test/foo-1.00.tar.gz' }, { filename => 'foo-1.01.tar.gz', url => 'http://foo.test/foo-1.01.tar.gz' }, ], protocol => $1, }; } else { die 'oops 1'; } } elsif($url =~ m{(https?)://foo\.test/foo-1\.00\.tar\.gz$}) { return { type => 'file', filename => 'foo-1.00.tar.gz', content => 'tarball 1.00', protocol => $1, }; } elsif($url =~ m{(https?)://foo\.test/foo-1\.01\.tar\.gz$}) { return { type => 'file', filename => 'foo-1.01.tar.gz', content => 'tarball 1.01', protocol => $1, }; } die "oops 2 $url"; }); } Alien-Build-2.84/t/alien_build_plugin_core_ffi.t000644 000000 000000 00000007217 14710030646 021633 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Core::FFI; use Capture::Tiny qw( capture_merged ); subtest basic => sub { my $build = alienfile q{ use alienfile; use Path::Tiny qw( path ); use Alien::Build::Util qw( _destdir_prefix ); plugin 'Test::Mock', probe => 'share', download => 1, extract => 1; meta_prop->{destdir} = 1; share { build sub { my($build) = @_; print "in build\n"; my $dir = path(_destdir_prefix($ENV{DESTDIR}, $build->install_prop->{prefix})); $dir->child('lib')->mkpath; $dir->child('lib', 'libfoo.a')->touch; }; ffi { patch sub { shift->{runtime_prop}->{my_did_patch_ffi} = 1 }; build sub { my($build) = @_; print "in build_ffi DESTDIR = $ENV{DESTDIR}\n"; my $dir = path(_destdir_prefix($ENV{DESTDIR}, $build->install_prop->{prefix})); $dir->child('dynamic')->mkpath; $dir->child('dynamic', 'libfoo.so')->touch; $dir->child('lib')->mkpath; $dir->child('lib', 'libgarbage.a')->touch; $build->{runtime_prop}->{my_did_build_ffi} = 1; }; gather sub { my($build) = @_; print "in gather_ffi\n"; $build->{runtime_prop}->{my_did_gather_ffi} = 1; }; }; }; }; note scalar capture_merged { $build->probe; $build->download; $build->build; }; ok($build->{runtime_prop}->{my_did_patch_ffi}, 'did patch_ffi'); ok($build->{runtime_prop}->{my_did_build_ffi}, 'did build_ffi'); ok($build->{runtime_prop}->{my_did_gather_ffi}, 'did gather_ffi'); my $stage = $build->install_prop->{stage}; ok(-f "$stage/lib/libfoo.a", 'has static lib'); ok(-f "$stage/dynamic/libfoo.so", 'has dynamic lib'); ok(!-f "$stage/lib/libgarbage.a", "filter out garbage"); }; subtest deprecated => sub { my($out, $build) = capture_merged { alienfile q{ use alienfile; use Path::Tiny qw( path ); use Alien::Build::Util qw( _destdir_prefix ); plugin 'Test::Mock', probe => 'share', download => 1, extract => 1; meta_prop->{destdir} = 1; share { build sub { my($build) = @_; print "in build\n"; my $dir = path(_destdir_prefix($ENV{DESTDIR}, $build->install_prop->{prefix})); $dir->child('lib')->mkpath; $dir->child('lib', 'libfoo.a')->touch; }; patch_ffi sub { shift->{runtime_prop}->{my_did_patch_ffi} = 1 }; build_ffi sub { my($build) = @_; print "in build_ffi DESTDIR = $ENV{DESTDIR}\n"; my $dir = path(_destdir_prefix($ENV{DESTDIR}, $build->install_prop->{prefix})); $dir->child('dynamic')->mkpath; $dir->child('dynamic', 'libfoo.so')->touch; $dir->child('lib')->mkpath; $dir->child('lib', 'libgarbage.a')->touch; $build->{runtime_prop}->{my_did_build_ffi} = 1; }; gather_ffi sub { my($build) = @_; print "in gather_ffi\n"; $build->{runtime_prop}->{my_did_gather_ffi} = 1; }; }; } }; note "build warnings: $out"; note scalar capture_merged { $build->probe; $build->download; $build->build; }; ok($build->{runtime_prop}->{my_did_patch_ffi}, 'did patch_ffi'); ok($build->{runtime_prop}->{my_did_build_ffi}, 'did build_ffi'); ok($build->{runtime_prop}->{my_did_gather_ffi}, 'did gather_ffi'); my $stage = $build->install_prop->{stage}; ok(-f "$stage/lib/libfoo.a", 'has static lib'); ok(-f "$stage/dynamic/libfoo.so", 'has dynamic lib'); ok(!-f "$stage/lib/libgarbage.a", "filter out garbage"); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_core_gather.t000644 000000 000000 00000010102 14710030646 022324 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use utf8; use Test::Alien::Build; use Alien::Build::Plugin::Core::Gather; use Capture::Tiny qw( capture_merged ); use Alien::Build::Util qw( _dump _destdir_prefix ); use Path::Tiny qw( path ); use File::Temp qw( tempdir ); subtest 'destdir filter' => sub { my $build = alienfile q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock', probe => 'share', download => 1, extract => 1; meta_prop->{destdir} = 1; meta_prop->{destdir_filter} = qr/^(bin|lib)\/.*$/; share { build sub { my($build) = @_; my $prefix = $build->install_prop->{prefix}; $prefix =~ s{^([a-z]):}{$1}i if $^O eq 'MSWin32'; my $destdir_prefix = path(Alien::Build::Util::_destdir_prefix($ENV{DESTDIR}, $prefix)); $destdir_prefix->child($_)->mkpath for qw( bin lib etc ); $destdir_prefix->child('bin/foo.exe')->touch; $destdir_prefix->child('lib/libfoo.a')->touch; $destdir_prefix->child('etc/foorc')->touch; }; }; }; note capture_merged { eval { $build->probe; $build->download; $build->build; }; warn $@ if $@; (); }; note _dump $build->install_prop; my $stage = path($build->install_prop->{stage}); ok( -f $stage->child('bin/foo.exe'), 'bin/foo.exe' ); ok( -f $stage->child('lib/libfoo.a'), 'lib/libfoo.a' ); ok( !-f $stage->child('etc/foorc'), 'etc/foorc' ); }; subtest 'patch' => sub { my $build = alienfile q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock', probe => 'share', download => 1, extract => 1; share { build sub { my($build) = @_; my $prefix = path($build->install_prop->{prefix}); print "prefix = $prefix\n"; $prefix->mkpath; $prefix->child('foo.txt')->touch; }; }; }; my $patch = path($build->install_prop->{patch} = tempdir( CLEANUP => 1 )); $patch->child('foo.diff')->touch; my $stage = path($build->install_prop->{stage}); my $error = $@; note capture_merged { eval { $build->probe; $build->download; $build->build; }; my $error = $@; warn $error if $error; (); }; is $error, ''; note _dump $build->install_prop; ok( -f $stage->child('_alien/patch/foo.diff') ); }; subtest 'pkg-config path during gather' => sub { my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock', probe => 'share', download => 1, extract => 1; use Env qw( @PKG_CONFIG_PATH ); share { build sub { my($build) = @_; my $prefix = path($build->install_prop->{prefix}); $build->log("prefix = $prefix"); $prefix->child('lib/pkgconfig')->mkpath; $prefix->child('lib/pkgconfig/x3.pc')->spew("Name: x3\n"); $prefix->child('share/pkgconfig')->mkpath; $prefix->child('share/pkgconfig/x4.pc')->spew("Name: x4\n"); }; gather sub { my($build) = @_; $build->install_prop->{my_pkg_config_path} = [@PKG_CONFIG_PATH]; }; }; }; alien_build_ok; is( $build->install_prop, hash { field my_pkg_config_path => array { item validator(sub { return -f "$_/x3.pc"; }); item validator(sub { return -f "$_/x4.pc"; }); end; }; etc; }, 'has arch and arch-indy pkg-config paths', ); }; subtest '_alien/alien.json should be okay with unicode' => sub { my $build = alienfile q{ use alienfile; use utf8; probe sub { 'system' }; gather sub { my($build) = @_; $build->runtime_prop->{'é¾'} = 'ç«'; }; }; alien_build_ok; is( $build->runtime_prop, hash { field 'é¾' => 'ç«'; etc; } ); my $json_file = path($build->install_prop->{prefix}, '_alien', 'alien.json'); ok -r $json_file; require JSON::PP; my $config = JSON::PP::decode_json($json_file->slurp); is( $config, hash { field 'é¾' => 'ç«'; etc; } ); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_core_legacy.t000644 000000 000000 00000002413 14710030646 022324 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Core::Legacy; use Capture::Tiny qw( capture_merged ); use File::Temp qw( tempdir ); subtest 'basic' => sub { my $build = alienfile q{ use alienfile; plugin 'Test::Mock', probe => 'share', download => 1, extract => 1, build => 1, share { gather sub { my($build) = @_; $build->runtime_prop->{cflags} = '-DFOO=1'; $build->runtime_prop->{libs} = '-lfoo'; $build->runtime_prop->{version} = '1.2.3'; }; }; }; capture_merged { $build->probe; $build->download; $build->build; }; is( $build->runtime_prop->{cflags}, '-DFOO=1', 'cflags' ); is( $build->runtime_prop->{libs}, '-lfoo', 'libs' ); is( $build->runtime_prop->{cflags_static}, '-DFOO=1', 'cflags_static' ); is( $build->runtime_prop->{libs_static}, '-lfoo', 'libs_static' ); is( $build->runtime_prop->{legacy}, hash { field 'finished_installing' => T(); field 'install_type' => 'share'; field 'version' => '1.2.3'; field 'original_prefix' => $build->runtime_prop->{prefix}; }, 'legacy hash', ); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_core_override.t000644 000000 000000 00000004312 14710030646 022677 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Core::Override; subtest 'basic' => sub { subtest 'default' => sub { local $ENV{ALIEN_INSTALL_TYPE} = 'default'; subtest 'system' => sub { alienfile_ok q{ use alienfile; probe sub { 'system' }; }; alien_install_type_is 'system'; }; subtest 'share' => sub { alienfile_ok q{ use alienfile; probe sub { 'share' }; }; alien_install_type_is 'share'; }; subtest 'die' => sub { alienfile_ok q{ use alienfile; probe sub { die }; }; alien_install_type_is 'share'; }; }; subtest 'share' => sub { local $ENV{ALIEN_INSTALL_TYPE} = 'share'; alienfile_ok q{ use alienfile; probe sub { die "should not get into here!" }; }; alien_install_type_is 'share'; }; subtest 'system' => sub { local $ENV{ALIEN_INSTALL_TYPE} = 'system'; subtest 'probe okay' => sub { alienfile_ok q{ use alienfile; probe sub { 'system' }; }; alien_install_type_is 'system'; }; subtest 'probe share' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; }; eval { $build->probe }; my $error = $@; like $error, qr/requested system install not available/; }; subtest 'probe exception' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { die 'oops!' }; }; eval { $build->probe }; my $error = $@; like $error, qr/oops!/; }; }; }; subtest 'override the override' => sub { subtest 'syste, share' => sub { local $ENV{ALIEN_INSTALL_TYPE} = 'system'; alienfile_ok q{ use alienfile; meta->register_hook(override => sub { 'share' }); probe sub { 'system' }; }; alien_install_type_is 'share'; }; subtest 'share, system' => sub { local $ENV{ALIEN_INSTALL_TYPE} = 'share'; alienfile_ok q{ use alienfile; meta->register_hook(override => sub { 'system' }); probe sub { 'system' }; }; alien_install_type_is 'system'; }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_core_setup.t000644 000000 000000 00000003424 14710030646 022223 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Core::Setup; use Alien::Build::Util qw( _dump ); subtest 'compiler type' => sub { my $build = alienfile_ok q{ use alienfile; }; ok( $build->meta_prop->{platform}->{compiler_type}, 'has a compiler type' ); note "compiler type = @{[ $build->meta_prop->{platform}->{compiler_type} ]}"; }; subtest 'CPU count' => sub { my $build = alienfile_ok q{ use alienfile; }; ok( $build->meta_prop->{platform}->{cpu}{count}, 'has a CPU count' ); cmp_ok( $build->meta_prop->{platform}->{cpu}{count}, '>', '0', 'CPU count is non-negative' ); note "CPU count = @{[ $build->meta_prop->{platform}->{cpu}{count} ]}"; subtest "ALIEN_CPU_COUNT environment variable" => sub { subtest "ALIEN_CPU_COUNT=1" => sub { local $ENV{ALIEN_CPU_COUNT} = 1; my $build = alienfile_ok q{ use alienfile; }; is( $build->meta_prop->{platform}->{cpu}{count}, 1, 'CPU count = 1' ); }; subtest "ALIEN_CPU_COUNT=2" => sub { local $ENV{ALIEN_CPU_COUNT} = 2; my $build = alienfile_ok q{ use alienfile; }; is( $build->meta_prop->{platform}->{cpu}{count}, 2, 'CPU count = 2' ); }; subtest "ALIEN_CPU_COUNT=0" => sub { local $ENV{ALIEN_CPU_COUNT} = 0; my $build = alienfile_ok q{ use alienfile; }; my $cpu_count = $build->meta_prop->{platform}->{cpu}{count}; cmp_ok( $cpu_count, '>', 0, "ALIEN_CPU_COUNT=0 is ignored (value: $cpu_count)" ); }; }; }; subtest 'CPU arch' => sub { my $build = alienfile_ok q{ use alienfile; }; ok( $build->meta_prop->{platform}->{cpu}{arch}, 'has a CPU arch' ); note "CPU arch:\n@{[ _dump($build->meta_prop->{platform}->{cpu}{arch}) ]}"; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_core_tail.t000644 000000 000000 00000000564 14710030646 022016 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Core::Tail; subtest 'out-of-source build' => sub { my $build = alienfile_ok q{ use alienfile; meta->prop->{out_of_source} = 1; }; is( $build->requires('configure'), hash { field 'Alien::Build' => '1.08'; etc; }, ); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_decode_dirlisting.t000644 000000 000000 00000003153 14710030646 023525 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Decode::DirListing; use Path::Tiny; use Alien::Build::Util qw( _dump ); subtest 'updates requires' => sub { my $plugin = Alien::Build::Plugin::Decode::DirListing->new; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); is( $build->requires('share')->{'File::Listing'}, 0 ); is( $build->requires('share')->{'URI'}, 0 ); note _dump $meta; }; subtest 'decode' => sub { my $plugin = Alien::Build::Plugin::Decode::DirListing->new; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); eval { $build->load_requires('share') }; skip_all 'test requires File::Listing and URI' if $@; foreach my $file (path('corpus/dir')->children(qr/\.list$/)) { subtest "parse $file" => sub { my $res1 = { type => 'dir_listing', base => "ftp://example.test/foo/bar/", content => $file->slurp, }; my $res2 = $build->decode($res1); is( $res2, hash { field type => 'list'; field list => array { foreach my $filename (qw( foo-1.00 foo-1.00.tar foo-1.00.tar.Z foo-1.00.tar.bz2 foo-1.00.tar.gz foo-1.00.tar.xz foo-1.00.zip)) { item hash { field filename => $filename; field url => match qr{\Q$filename\E}; }; } }; }, ); note "url = $_" for map { $_->{url} } @{ $res2->{list} } }; } }; done_testing; Alien-Build-2.84/t/alien_build_plugin_decode_dirlistingftpcopy.t000644 000000 000000 00000003222 14710030646 025127 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Decode::DirListingFtpcopy; use Path::Tiny; use Alien::Build::Util qw( _dump ); subtest 'updates requires' => sub { my $plugin = Alien::Build::Plugin::Decode::DirListingFtpcopy->new; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); is( $build->requires('share')->{'File::Listing::Ftpcopy'}, 0 ); is( $build->requires('share')->{'URI'}, 0 ); note _dump $meta; }; subtest 'decode' => sub { my $plugin = Alien::Build::Plugin::Decode::DirListingFtpcopy->new; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); eval { $build->load_requires('share') }; skip_all 'test requires File::Listing::Ftpcopy and URI' if $@; foreach my $file (path('corpus/dir')->children(qr/\.list$/)) { subtest "parse $file" => sub { my $res1 = { type => 'dir_listing', base => "ftp://example.test/foo/bar/", content => $file->slurp, }; my $res2 = $build->decode($res1); is( $res2, hash { field type => 'list'; field list => array { foreach my $filename (qw( foo-1.00 foo-1.00.tar foo-1.00.tar.Z foo-1.00.tar.bz2 foo-1.00.tar.gz foo-1.00.tar.xz foo-1.00.zip)) { item hash { field filename => $filename; field url => match qr{\Q$filename\E}; }; } }; }, ); note "url = $_" for map { $_->{url} } @{ $res2->{list} } }; } }; done_testing; Alien-Build-2.84/t/alien_build_plugin_decode_html.t000644 000000 000000 00000003261 14710030646 022321 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Decode::HTML; use Path::Tiny; use Alien::Build::Util qw( _dump ); subtest 'updates requires' => sub { my $plugin = Alien::Build::Plugin::Decode::HTML->new; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); is( $build->requires('share')->{'HTML::LinkExtor'}, 0 ); is( $build->requires('share')->{'URI'}, 0 ); note _dump $meta; }; subtest 'decode' => sub { my $plugin = Alien::Build::Plugin::Decode::HTML->new; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); eval { $build->load_requires('share') }; skip_all 'test requires HTML::LinkExtor' if $@; foreach my $file (path('corpus/dir')->children(qr/\.html$/)) { subtest "parse $file" => sub { my $res1 = { type => 'html', base => "http://example.test/foo/bar/index.html", content => $file->slurp, }; my $res2 = $build->decode($res1); is( $res2, hash { field type => 'list'; field list => array { foreach my $filename (qw( foo-1.00 foo-1.00.tar foo-1.00.tar.Z foo-1.00.tar.bz2 foo-1.00.tar.gz foo-1.00.tar.xz foo-1.00.tgz foo-1.00.zip)) { item hash { field filename => $filename; field url => match qr{\Q$filename\E}; }; } }; }, ); note "filename = $_" for map { $_->{filename} } @{ $res2->{list} }; note "url = $_" for map { $_->{url} } @{ $res2->{list} }; }; } }; done_testing; Alien-Build-2.84/t/alien_build_plugin_decode_mojo.t000644 000000 000000 00000004137 14710030646 022324 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Plugin::Decode::Mojo; use Test::Alien::Build; use Path::Tiny qw( path ); use Data::Dumper qw( Dumper ); subtest 'updates requires' => sub { my $build = alienfile q{ use alienfile; plugin 'Decode::Mojo'; }; is( $build->requires('share'), hash { field 'URI' => 0; field 'URI::Escape' => 0; if($build->requires('share')->{'Mojo::DOM58'}) { field 'Mojo::DOM58' => '1.00'; } elsif($build->requires('share')->{'Mojo::DOM58'}) { field 'Mojo::DOM' => '0'; field 'Mojolicious' => '0'; } etc; }, ); note Dumper($build->requires('share')); }; foreach my $class (qw( Mojo::DOM Mojo::DOM58 )) { subtest "decode class = $class" => sub { my $build = alienfile qq{ use alienfile; plugin 'Decode::Mojo' => ( _class => "$class" ); probe sub { 'share' }; }; alienfile_skip_if_missing_prereqs; is $build->requires('share'), hash { field $class => D(); field 'Mojolicious' => D() if $class eq 'Mojo::DOM'; etc; } ; foreach my $file (path('corpus/dir')->children(qr/\.html$/)) { subtest "parse $file" => sub { my $res1 = { type => 'html', base => "http://example.test/foo/bar/index.html", content => $file->slurp, }; my $res2 = $build->decode($res1); is( $res2, hash { field type => 'list'; field list => array { foreach my $filename (qw( foo-1.00 foo-1.00.tar foo-1.00.tar.Z foo-1.00.tar.bz2 foo-1.00.tar.gz foo-1.00.tar.xz foo-1.00.tgz foo-1.00.zip)) { item hash { field filename => $filename; field url => match qr{\Q$filename\E}; }; } }; }, ); note "filename = $_" for map { $_->{filename} } @{ $res2->{list} }; note "url = $_" for map { $_->{url} } @{ $res2->{list} }; }; } }; } done_testing Alien-Build-2.84/t/alien_build_plugin_digest_negotiate.t000644 000000 000000 00000014523 14710030646 023373 0ustar00rootroot000000 000000 use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Path::Tiny qw( path ); our $download_filename; our $cwd_url; subtest 'basic' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || 2.57; my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { plugin 'Digest' => [ SHA256 => 'a7e79996a02d3dfc47f6f3ec043c67690dc06a10d091bf1d760fee7c8161391a' ]; plugin 'Fetch::Local'; download sub { $main::download_filename->copy($main::download_filename->basename); }; }; }; is $build->meta->prop->{check_digest}, T(), 'set meta.check_digest flag'; alienfile_skip_if_missing_prereqs; subtest 'check_digest method' => sub { is $build->check_digest('corpus/alien_build_plugin_digest_shapp/foo.txt.gz'), T(), 'check digest works'; is dies { $build->check_digest(__FILE__) }, match qr/SHA256 digest does not match/, 'check digest throws exception on bad signature'; }; subtest 'fetch method' => sub { is $build->fetch('corpus/alien_build_plugin_digest_shapp/foo.txt.gz'), hash { field type => 'file'; field filename => 'foo.txt.gz'; etc; }, 'fetch works with right signature'; is dies { $build->fetch(__FILE__) }, match qr/SHA256 digest does not match/, 'fetch dies with wrong signature'; }; subtest 'download method' => sub { local $download_filename = path('corpus/alien_build_plugin_digest_shapp/foo.txt.gz')->absolute; is $build, object { call download => T(); call install_prop => hash { field download => match qr/foo.txt.gz/; etc; }; }, 'download works with right signature'; delete $build->install_prop->{complete}; delete $build->install_prop->{download}; $download_filename = path(__FILE__)->absolute; is dies { $build->download }, match qr/SHA256 digest does not match/, 'download dies with wrong signature'; }; }; subtest 'two signatures' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || 2.57; my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { plugin 'Digest' => { 'foo.txt.gz' => [ SHA256 => 'a7e79996a02d3dfc47f6f3ec043c67690dc06a10d091bf1d760fee7c8161391a' ], 'foo.txt' => [ SHA256 => '032772271db8f134e4914bca0e933361e1946c91c21e43610d301d39cbdb9d51' ], 'alien_build_plugin_digest_negotiate.t' => [ SHA256 => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' ], }; plugin 'Fetch::Local'; download sub { $main::download_filename->copy($main::download_filename->basename); }; }; }; alienfile_skip_if_missing_prereqs; subtest 'check_digest method' => sub { is $build->check_digest('corpus/alien_build_plugin_digest_shapp/foo.txt.gz'), T(), 'check digest works foo.txt.gz'; is $build->check_digest('corpus/alien_build_plugin_digest_shapp/foo.txt'), T(), 'check digest works foo.txt'; is dies { $build->check_digest(__FILE__) }, match qr/SHA256 digest does not match/, 'check digest throws exception on bad signature'; }; subtest 'fetch method' => sub { is $build->fetch('corpus/alien_build_plugin_digest_shapp/foo.txt.gz'), hash { field type => 'file'; field filename => 'foo.txt.gz'; etc; }, 'fetch works foo.txt.gz'; is $build->fetch('corpus/alien_build_plugin_digest_shapp/foo.txt'), hash { field type => 'file'; field filename => 'foo.txt'; etc; }, 'fetch works foo.txt'; is dies { $build->fetch(__FILE__) }, match qr/SHA256 digest does not match/, 'fetch throws exception on bad signature'; }; subtest 'download method' => sub { local $download_filename = path('corpus/alien_build_plugin_digest_shapp/foo.txt')->absolute; is $build, object { call download => T(); call install_prop => hash { field download => match qr/foo.txt/; etc; }; }, 'download works with right signature'; delete $build->install_prop->{download}; delete $build->install_prop->{complete}; $download_filename = path('corpus/alien_build_plugin_digest_shapp/foo.txt.gz')->absolute; is $build, object { call download => T(); call install_prop => hash { field download => match qr/foo.txt.gz/; etc; }; }, 'download works with right signature'; delete $build->install_prop->{download}; delete $build->install_prop->{complete}; $download_filename = path(__FILE__)->absolute; is dies { $build->download }, match qr/SHA256 digest does not match/, 'download dies with wrong signature'; }; }; subtest 'listing' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || 2.57; skip_all 'test require URI::file' unless eval { require URI::file }; my $url = URI::file->cwd; subtest 'default' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { plugin 'Digest'; start_url 'file:///'; plugin 'Fetch::LWP'; }; }; alienfile_skip_if_missing_prereqs; is $build->fetch($url), hash { field type => 'html'; etc; }, 'works by default'; }; subtest 'allowed' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { plugin 'Digest', allow_listing => 1; start_url 'file:///'; plugin 'Fetch::LWP'; }; }; alienfile_skip_if_missing_prereqs; is $build->fetch($url), hash { field type => 'html'; etc; }, 'works by default'; }; subtest 'not allowed' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; share { plugin 'Digest', allow_listing => 0; start_url 'file:///'; plugin 'Fetch::LWP'; }; }; alienfile_skip_if_missing_prereqs; is dies { $build->fetch($url) }, match qr/^listing fetch not allowed/, 'works by default'; }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_digest_sha.t000644 000000 000000 00000003335 14710030646 022166 0ustar00rootroot000000 000000 use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Path::Tiny qw( path ); use Alien::Build::Util qw( _dump ); subtest 'basic' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || 2.57; my $build = alienfile_ok q{ use alienfile; plugin 'Digest::SHA'; probe sub { 'share' }; }; alienfile_skip_if_missing_prereqs; foreach my $type (qw( path content )) { my $good = 'a7e79996a02d3dfc47f6f3ec043c67690dc06a10d091bf1d760fee7c8161391a'; my $bad = '032772271db8f134e4914bca0e933361e1946c91c21e43610d301d39cbdb9d52'; subtest "file stored as $type" => sub { my $file = { type => 'file', filename => 'foo.txt.gz', path => path("corpus/alien_build_plugin_digest_shapp/foo.txt.gz")->absolute->stringify, tmp => 0, }; if($type eq 'content') { $file->{content} = path(delete $file->{path})->slurp_raw; delete $file->{tmp}; } note _dump($file); is $build->meta->call_hook( check_digest => $build, $file, 'xxx', $good ), 0, 'plugin returns 0 if it does not recognize the algorthim (xxx)'; is $build->meta->call_hook( check_digest => $build, $file, 'SHA13', $good ), 0, 'plugin returns 0 if it does not recognize the algorthim (SHA13)'; is $build->meta->call_hook( check_digest => $build, $file, 'SHA256', $good ), 1, 'plugin returns 1 for valid signature'; is dies { $build->meta->call_hook( check_digest => $build, $file, 'SHA256', $bad ) }, match qr/^foo.txt.gz SHA256 digest does not match: got $good, expected $bad/, 'plugin dies on invalid signature'; } } }; done_testing; Alien-Build-2.84/t/alien_build_plugin_digest_shapp.t000644 000000 000000 00000003337 14710030646 022530 0ustar00rootroot000000 000000 use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Path::Tiny qw( path ); use Alien::Build::Util qw( _dump ); subtest 'basic' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || 2.57; my $build = alienfile_ok q{ use alienfile; plugin 'Digest::SHAPP'; probe sub { 'share' }; }; alienfile_skip_if_missing_prereqs; foreach my $type (qw( path content )) { my $good = 'a7e79996a02d3dfc47f6f3ec043c67690dc06a10d091bf1d760fee7c8161391a'; my $bad = '032772271db8f134e4914bca0e933361e1946c91c21e43610d301d39cbdb9d52'; subtest "file stored as $type" => sub { my $file = { type => 'file', filename => 'foo.txt.gz', path => path("corpus/alien_build_plugin_digest_shapp/foo.txt.gz")->absolute->stringify, tmp => 0, }; if($type eq 'content') { $file->{content} = path(delete $file->{path})->slurp_raw; delete $file->{tmp}; } note _dump($file); is $build->meta->call_hook( check_digest => $build, $file, 'xxx', $good ), 0, 'plugin returns 0 if it does not recognize the algorthim (xxx)'; is $build->meta->call_hook( check_digest => $build, $file, 'SHA13', $good ), 0, 'plugin returns 0 if it does not recognize the algorthim (SHA13)'; is $build->meta->call_hook( check_digest => $build, $file, 'SHA256', $good ), 1, 'plugin returns 1 for valid signature'; is dies { $build->meta->call_hook( check_digest => $build, $file, 'SHA256', $bad ) }, match qr/^foo.txt.gz SHA256 digest does not match: got $good, expected $bad/, 'plugin dies on invalid signature'; } } }; done_testing; Alien-Build-2.84/t/alien_build_plugin_download_negotiate.t000644 000000 000000 00000017354 14710030646 023730 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Download::Negotiate; use Alien::Build::Plugin::Fetch::CurlCommand; use Path::Tiny; use Capture::Tiny qw( capture_merged ); use Alien::Build::Util qw( _dump ); delete $ENV{$_} for qw( ftp_proxy all_proxy ); my $mock_pick_decoder = mock 'Alien::Build::Plugin::Download::Negotiate' => ( override => [ _pick_decoder => sub { 'Decode::Mojo' }, ], ); subtest 'pick fetch' => sub { local %ENV = %ENV; my $has_ssl = 0; my $mock = mock 'Alien::Build::Plugin::Download::Negotiate' => ( override => [ _has_ssl => sub { $has_ssl }, ], ); my %curl; my $mock2 = mock 'Alien::Build::Plugin::Fetch::CurlCommand' => ( override => [ protocol_ok => sub { my(undef, $protocol) = @_; $curl{$protocol}; } ] ); subtest 'http' => sub { my $plugin = Alien::Build::Plugin::Download::Negotiate->new('http://mytest.test/'); is([$plugin->pick], ['Fetch::HTTPTiny','Decode::Mojo']); is($plugin->scheme, 'http'); }; subtest 'http override decoder scalar' => sub { { package Alien::Build::Plugin::Foo::Bar; use Alien::Build::Plugin; sub init {} } my $plugin = Alien::Build::Plugin::Download::Negotiate->new( url => 'http://mytest.test/', decoder => 'Foo::Bar' ); is([$plugin->pick], ['Fetch::HTTPTiny','Foo::Bar']); is($plugin->scheme, 'http'); }; subtest 'http override decoder array' => sub { { package Alien::Build::Plugin::Foo::Baz; use Alien::Build::Plugin; sub init {} } my $plugin = Alien::Build::Plugin::Download::Negotiate->new( url => 'http://mytest.test/', decoder => ['Foo::Bar','Foo::Baz'] ); is([$plugin->pick], ['Fetch::HTTPTiny','Foo::Bar', 'Foo::Baz']); is($plugin->scheme, 'http'); }; subtest 'https (ssl modules already installed)' => sub { $has_ssl = 1; %curl = ( https => 1 ); my $plugin = Alien::Build::Plugin::Download::Negotiate->new('https://mytest.test/'); is([$plugin->pick], ['Fetch::HTTPTiny','Decode::Mojo']); is($plugin->scheme, 'https'); }; subtest 'https (ssl modules NOT already installed)' => sub { skip_all 'not picking curl for now :('; $has_ssl = 0; %curl = ( https => 1 ); my $plugin = Alien::Build::Plugin::Download::Negotiate->new('https://mytest.test/'); is([$plugin->pick], ['Fetch::CurlCommand','Decode::Mojo']); is($plugin->scheme, 'https'); }; subtest 'https (ssl modules NOT already installed, no curl)' => sub { $has_ssl = 0; %curl = ( https => 0 ); my $plugin = Alien::Build::Plugin::Download::Negotiate->new('https://mytest.test/'); is([$plugin->pick], ['Fetch::HTTPTiny','Decode::Mojo']); is($plugin->scheme, 'https'); }; subtest 'ftp direct' => sub { my $plugin = Alien::Build::Plugin::Download::Negotiate->new('ftp://mytest.test/'); is([$plugin->pick], ['Fetch::NetFTP']); is($plugin->scheme, 'ftp'); }; subtest 'ftp direct proxy' => sub { $ENV{ftp_proxy} = 1; my $plugin = Alien::Build::Plugin::Download::Negotiate->new('ftp://mytest.test/'); is([$plugin->pick], ['Fetch::LWP','Decode::DirListing','Decode::Mojo']); is($plugin->scheme, 'ftp'); }; subtest 'local file URI' => sub { $ENV{ftp_proxy} = 1; my $plugin = Alien::Build::Plugin::Download::Negotiate->new('file:///foo/bar/baz'); is([$plugin->pick], ['Fetch::Local']); is($plugin->scheme, 'file'); }; subtest 'local file' => sub { $ENV{ftp_proxy} = 1; my $plugin = Alien::Build::Plugin::Download::Negotiate->new('/foo/bar/baz'); is([$plugin->pick], ['Fetch::Local']); is($plugin->scheme, 'file'); }; subtest 'bootstrap ssl' => sub { subtest 'without Net::SSLeay' => sub { $has_ssl = 0; %curl = (); my $plugin = Alien::Build::Plugin::Download::Negotiate->new( url => 'https://mytest.test/', bootstrap_ssl => 1, ); is( [$plugin->pick], array { item ['Fetch::CurlCommand','Fetch::Wget']; item 'Decode::Mojo'; end; }, ); }; subtest 'with Net::SSLeay' => sub { $has_ssl = 1; %curl = (); my $plugin = Alien::Build::Plugin::Download::Negotiate->new( url => 'https://mytest.test/', bootstrap_ssl => 1, ); is( [$plugin->pick], array { item 'Fetch::HTTPTiny'; item 'Decode::Mojo'; end; }, ); }; }; subtest 'bootstrap ssl http' => sub { my $plugin = Alien::Build::Plugin::Download::Negotiate->new( url => 'http://mytest.test/', bootstrap_ssl => 1, ); is( [$plugin->pick], array { item 'Fetch::HTTPTiny'; item 'Decode::Mojo'; end; }, ); }; }; subtest 'get the version' => sub { skip_all 'test requires Sort::Versions' unless eval { require Sort::Versions; 1 }; my $build = alienfile q{ use alienfile; probe sub { 'share' }; plugin 'Download' => ( url => 'corpus/dist', version => qr/([0-9\.]+)/, filter => qr/\.tar\.gz$/, ); }; note capture_merged { $build->download; (); }; is($build->runtime_prop->{version}, '1.00'); my $filename = $build->install_prop->{download}; ok(-f $filename, "tarball downloaded"); note "filename = $filename"; my $orig = path('corpus/dist/foo-1.00.tar.gz'); my $new = path($filename); is($new->slurp, $orig->slurp, 'content of file is the same'); }; subtest 'prefer property' => sub { subtest 'default (true)' => sub { require Alien::Build; my $mock = mock 'Alien::Build::Meta'; my @calls; $mock->around(apply_plugin => sub { my($orig, $self, @args) = @_; push @calls, \@args if $args[0] eq 'Prefer::SortVersions'; $orig->($self, @args); }); my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; plugin 'Download' => ( url => 'corpus/dist', version => qr/([0-9\.]+)/, filter => qr/\.tar\.gz$/, ); }; is( \@calls, array { item array { item 'Prefer::SortVersions'; item 'filter'; item T(); item 'version'; item T(); }; end; }, 'loaded Prefer::SortVersions exactly once' ); }; my $mock = mock 'Alien::Build::Meta'; $mock->around(apply_plugin => sub { my($orig, $self, @args) = @_; die 'oopsiedoopsie' if $args[0] eq 'Prefer::SortVersions'; $orig->($self, @args); }); subtest 'false' => sub { my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; plugin 'Download' => ( url => 'corpus/dist', version => qr/([0-9\.]+)/, filter => qr/\.tar\.gz$/, prefer => 0, ); }; ok 1, "didn't load Prefer::SortVersions"; }; subtest 'code reference' => sub { undef $mock; my $build = alienfile_ok q{ use alienfile; probe sub { 'share' }; plugin 'Download' => ( url => 'corpus/dist', version => qr/([0-9\.]+)/, filter => qr/\.tar\.gz$/, prefer => sub { my($build, $res) = @_; return { type => 'list', list => [ sort { $b->{version} <=> $a->{version} } @{ $res->{list} }, ], } }, ); }; is( $build->prefer( { type => 'list', list => [ { filename => 'abc', version => 1 }, { filename => 'def', version => 2 }, { filename => 'ghi', version => 3 } ] }, ), {type => 'list', list => [ { filename => 'ghi', version => 3 }, { filename => 'def', version => 2 }, { filename => 'abc', version => 1 } ] }, ); }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_extract_archivetar.t000644 000000 000000 00000012551 14710030646 023736 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Extract::ArchiveTar; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); use File::Temp qw( tempdir ); use Alien::Build::Util qw( _dump ); subtest 'available' => sub { subtest 'zip' => sub { # should always be false... is(Alien::Build::Plugin::Extract::ArchiveTar->available('zip'), F()); }; subtest 'tar' => sub { # should always be true... is(Alien::Build::Plugin::Extract::ArchiveTar->available('tar'), T()); }; subtest 'tar.gz' => sub { my $has_it; skip_all 'test requires Archive::Tar with has_zlib_support' unless eval { require Archive::Tar; Archive::Tar->can('has_zlib_support') }; my $mock = mock 'Archive::Tar' => ( override => [ has_zlib_support => sub { note "has_it = $has_it"; $has_it; }, ], ); subtest 'has it' => sub { $has_it = 1; is(Alien::Build::Plugin::Extract::ArchiveTar->available('tar.gz'), T()); }; subtest 'does not' => sub { $has_it = 0; is(Alien::Build::Plugin::Extract::ArchiveTar->available('tar.gz'), F()); }; }; subtest 'tar.bz2' => sub { my $has_it; skip_all 'test requires Archive::Tar with has_bzip2_support' unless eval { require Archive::Tar; Archive::Tar->can('has_bzip2_support') }; my $mock = mock 'Archive::Tar' => ( override => [ has_bzip2_support => sub { note "has_it = $has_it"; $has_it; }, ], ); todo 'detection in Archive::Tar is sometimes broken' => sub { subtest 'has it' => sub { $has_it = 1; is(Alien::Build::Plugin::Extract::ArchiveTar->available('tar.bz2'), T()); }; subtest 'does not' => sub { $has_it = 0; is(Alien::Build::Plugin::Extract::ArchiveTar->available('tar.bz2'), F()); }; }; }; subtest 'tar.xz' => sub { my $has_it; skip_all 'test requires Archive::Tar with has_xz_support' unless eval { require Archive::Tar; Archive::Tar->can('has_xz_support') }; my $mock = mock 'Archive::Tar' => ( override => [ has_xz_support => sub { note "has_it = $has_it"; $has_it; }, ], ); subtest 'has it' => sub { $has_it = 1; is(Alien::Build::Plugin::Extract::ArchiveTar->available('tar.xz'), T()); }; subtest 'does not' => sub { $has_it = 0; is(Alien::Build::Plugin::Extract::ArchiveTar->available('tar.xz'), F()); }; }; }; subtest 'archive' => sub { foreach my $ext (qw( tar tar.bz2 tar.gz tar.xz )) { subtest "with extension $ext" => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock', check_digest => 1; }; my $meta = $build->meta; my $plugin = Alien::Build::Plugin::Extract::ArchiveTar->new; $plugin->init($meta); eval { $build->load_requires('share') }; skip_all "configuration does not support $ext" if $@; if($ext eq 'tar.bz2') { skip_all 'Test requires ZLib support in Archive::Tar' unless eval { require Alien::Build::Plugin::Extract::ArchiveTar; Alien::Build::Plugin::Extract::ArchiveTar->_can_bz2 }; } elsif($ext eq 'tar.gz') { skip_all 'Test requires Bzip2 support in Archive::Tar' unless eval { Archive::Tar->has_bzip2_support }; } elsif($ext eq 'tar.xz') { skip_all 'Test requires XZ support in Archive::Tar' unless eval { Archive::Tar->has_xz_support }; } my $archive = path("corpus/dist/foo-1.00.$ext")->absolute; my($out, $dir, $error) = capture_merged { local $build->install_prop->{download_detail}->{"$archive"} = { protocol => 'file', digest => [ FAKE => 'deadbeaf' ], }; my $dir = eval { $build->extract("$archive") }; ($dir, $@); }; my($bad1, $bad2); $bad1 = !!$error; is $error, ''; note $out if $out ne ''; if(defined $dir) { $dir = path($dir); $bad2 = !ok( defined $dir && -d $dir, "directory created" ); note "dir = $dir"; foreach my $name (qw( configure foo.c )) { my $file = $dir->child($name); ok -f $file, "$name exists"; } } if($bad1 || $bad2) { diag "failed with extension $ext"; diag _dump({ error => $error, dir => "$dir" }); if($out ne '') { diag "[out]"; diag $out; } } } } }; subtest 'archive with pax_global_header' => sub { skip_all 'Test requires Archive::Tar' unless eval { require Archive::Tar }; my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock', probe => 'share', download => { 'foo.tar' => path(__FILE__)->parent->parent->child('corpus/dist2/foo.tar')->slurp_raw, }; share { plugin 'Extract::ArchiveTar'; }; }; my $dir = alien_extract_ok; if(defined $dir) { my $file = path($dir)->child('foo.txt'); my $content = eval { $file->slurp }; is($content, "xx\n", "file content matches"); unless(-f $file) { diag "listing:"; foreach my $child (path($dir)->children) { diag $child; } } } }; done_testing; Alien-Build-2.84/t/alien_build_plugin_extract_archivezip.t000644 000000 000000 00000003235 14710030646 023751 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Extract::ArchiveZip; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); use File::Temp qw( tempdir ); subtest 'available' => sub { is( Alien::Build::Plugin::Extract::ArchiveZip->available('tar'), F(), 'tar is always false', ); subtest 'with Archive::Zip' => sub { local $INC{'Archive/Zip.pm'} = __FILE__; is( Alien::Build::Plugin::Extract::ArchiveZip->available('zip'), T(), ); }; subtest 'with Archive::Zip' => sub { skip_all 'subtest requires Devel::Hide' unless eval { require Devel::Hide }; note scalar capture_merged { Devel::Hide->import(qw( Archive::Zip )) }; local %INC; delete $INC{'Archive/Zip.pm'}; is( Alien::Build::Plugin::Extract::ArchiveZip->available('zip'), F(), ); }; }; subtest 'archive' => sub { foreach my $ext (qw( zip )) { subtest "with extension $ext" => sub { my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock', probe => 'share', download => { 'foo.zip' => path(__FILE__)->parent->parent->child('corpus/dist/foo-1.00.zip')->slurp_raw, }; share { plugin 'Extract::ArchiveZip'; }; }; alienfile_skip_if_missing_prereqs; my $dir = alien_extract_ok; if(defined $dir) { $dir = path($dir); foreach my $name (qw( configure foo.c )) { my $file = $dir->child($name); ok -f $file, "$name exists"; } } } } }; done_testing; Alien-Build-2.84/t/alien_build_plugin_extract_commandline.t000644 000000 000000 00000006405 14710030646 024075 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Extract::CommandLine; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); use File::Temp qw( tempdir ); subtest 'archive' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock', check_digest => 1; }; my $meta = $build->meta; my $plugin = Alien::Build::Plugin::Extract::CommandLine->new; $plugin->init($meta); subtest 'command probe' => sub { foreach my $cmd (qw( gzip bzip2 xz tar unzip )) { my $method = "${cmd}_cmd"; my $exe = $plugin->$method; $exe = 'undef' unless defined $exe; note "$cmd = $exe"; } ok 1; }; foreach my $ext (qw( tar tar.Z tar.bz2 tar.gz tar.xz zip )) { subtest "with extension $ext" => sub { skip_all "system does not support $ext" unless $plugin->handles($ext); my $archive = do { my $original = path("corpus/dist/foo-1.00.$ext"); my $new = path(tempdir( CLEANUP => 1))->child("foo-1.00.$ext"); $original->copy($new); $new->stringify; }; note "archive = $archive"; $build->install_prop->{download_detail}->{$archive} = { protocol => 'file', digest => [ FAKE => 'deadbeaf' ], }; my($out, $dir, $error) = capture_merged { my $dir = eval { $build->extract($archive) }; ($dir, $@); }; is $error, '', 'no error from extract'; if($error ne '') { diag "[output ] $_", for split /\n/, $out; diag "[exception ] $_", for split /\n/, $error; if($ext eq 'tar.xz' && $^O eq 'openbsd') { diag "[xz --version] $_" for split /\n/, capture_merged { system 'xz --version'; }; diag "[\$( ] $("; diag "[\$) ] $)"; if(-r "/etc/fstab") { diag "[/etc/fstab ] $_" for grep m{/tmp}, path("/etc/fstab")->lines; } diag "SEE https://github.com/PerlAlien/Alien-Build/issues/62"; diag "if you can help with this.\n"; } return; } note $out if $out ne ''; note $error if $error; $dir = path($dir); ok( defined $dir && -d $dir, "directory created" ); note "dir = $dir"; foreach my $name (qw( configure foo.c )) { my $file = $dir->child($name); ok -f $file, "$name exists"; } } } }; subtest 'archive with pax_global_header' => sub { skip_all "system does not support tar" unless Alien::Build::Plugin::Extract::CommandLine->new->handles('tar'); my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock', probe => 'share', download => { 'foo.tar' => path(__FILE__)->parent->parent->child('corpus/dist2/foo.tar')->slurp_raw, }; share { plugin 'Extract::CommandLine'; }; }; my $dir = alien_extract_ok; if(defined $dir) { my $file = path($dir)->child('foo.txt'); my $content = eval { $file->slurp }; is($content, "xx\n", "file content matches"); unless(-f $file) { diag "listing:"; foreach my $child (path($dir)->children) { diag $child; } } } }; done_testing; Alien-Build-2.84/t/alien_build_plugin_extract_commandline__tar_can.t000644 000000 000000 00000001163 14710030646 025717 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Extract::CommandLine; eval { require Readonly; Readonly->VERSION('1.60') }; ## no critic (Community::PreferredAlternatives) skip_all 'test requires Readonly 1.60' if $@; subtest 'tar can' => sub { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; my $plugin = Alien::Build::Plugin::Extract::CommandLine->new; Readonly::Scalar($_ => 'a'); $plugin->init($meta); ok lives { $plugin->_tar_can('.tar.gz'); }, 'can read from with readonly $_' or note($@); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_extract_directory.t000644 000000 000000 00000002315 14710030646 023607 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Extract::Directory; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); subtest 'handles' => sub { is( Alien::Build::Plugin::Extract::Directory->handles('d'), T(), ); is( Alien::Build::Plugin::Extract::Directory->handles('tar'), F(), ); }; subtest 'available' => sub { is( Alien::Build::Plugin::Extract::Directory->available('d'), T(), ); is( Alien::Build::Plugin::Extract::Directory->available('tar'), F(), ); }; subtest 'basic' => sub { # Test uses download directory, which is unsupported by # digest checks local $ENV{ALIEN_DOWNLOAD_RULE} = 'warn'; my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); plugin 'Extract::Directory'; }; $build->install_prop->{download} = path('corpus/dist/foo-1.00')->absolute->stringify; my($out, $dir) = capture_merged { $build->extract }; $dir = path($dir); ok( defined $dir && -d $dir, "directory created" ); note "dir = $dir"; foreach my $name (qw( configure foo.c )) { my $file = $dir->child($name); ok -f $file, "$name exists"; } }; done_testing; Alien-Build-2.84/t/alien_build_plugin_extract_file.t000644 000000 000000 00000001730 14710030646 022522 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Extract::File; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); subtest 'handles' => sub { is( Alien::Build::Plugin::Extract::File->handles('f'), T(), ); is( Alien::Build::Plugin::Extract::File->handles('tar'), F(), ); }; subtest 'available' => sub { is( Alien::Build::Plugin::Extract::File->available('f'), T(), ); is( Alien::Build::Plugin::Extract::File->available('tar'), F(), ); }; subtest 'basic' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || '2.70'; my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock' => ( probe => 'share', download => { "frooble.exe" => 'a faux exe', }, ); plugin 'Extract::File'; }; alien_install_type_is 'share'; alien_download_ok; alien_extract_ok; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_extract_negotiate.t000644 000000 000000 00000007107 14710030646 023566 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Extract::Negotiate; use Capture::Tiny qw( capture_merged ); use Path::Tiny qw( path ); eval { require Archive::Tar; }; skip_all 'test requires Archive::Tar' if $@; subtest basic => sub { my $build = alienfile q{ use alienfile; plugin 'Test::Mock', probe => 'share', check_digest => 1; share { meta->prop->{check_digest} = 1; meta->prop->{digest} = { '*' => [ FAKE => 'deadbeaf' ] }; plugin 'Download' => 'corpus/dist/foo-1.00.tar'; plugin 'Extract'; }; }; note scalar capture_merged { $build->load_requires($build->install_type); $build->download; }; my $dir = $build->extract; ok(-d $dir, "extracted to directory"); note "dir = $dir"; foreach my $filename (qw( configure foo.c )) { my $old = path('corpus/dist/foo-1.00')->child($filename); my $new = path($dir)->child($filename); ok(-f $new, "created file $filename"); is($new->slurp, $old->slurp, 'content matches'); } }; subtest 'picks' => sub { foreach my $ext (qw( tar tar.gz tar.bz2 zip d f )) { my $pick = Alien::Build::Plugin::Extract::Negotiate->pick($ext); ok $pick, 'we have a pick'; note "the pick is: $pick"; } subtest 'tar' => sub { subtest 'plain' => sub { # always is( Alien::Build::Plugin::Extract::Negotiate->pick('tar'), 'Extract::ArchiveTar', ); }; my %available; my $mock = mock 'Alien::Build::Plugin::Extract::ArchiveTar' => ( override => [ available => sub { my(undef, $format) = @_; note "$format is available = @{[ !! $available{$format} ]}"; !!$available{$format}; }, ] ); subtest 'tar.gz' => sub { %available = ( 'tar.gz' => 1 ); is( Alien::Build::Plugin::Extract::Negotiate->pick('tar.gz'), 'Extract::ArchiveTar', 'when avail', ); %available = ( 'tar.gz' => '' ); is( Alien::Build::Plugin::Extract::Negotiate->pick('tar.gz'), 'Extract::CommandLine', 'when not', ); }; }; subtest 'zip' => sub { my $have_archive_zip = 0; my $have_info_zip = 0; my $mock1 = mock 'Alien::Build::Plugin::Extract::ArchiveZip' => ( override => [ available => sub { my(undef, $format) = @_; !!($format eq 'zip' && $have_archive_zip); }, ], ); my $mock2 = mock 'Alien::Build::Plugin::Extract::CommandLine' => ( override => [ available => sub { my(undef, $format) = @_; !!($format eq 'zip' && $have_info_zip); }, ], ); subtest 'nada' => sub { is( Alien::Build::Plugin::Extract::Negotiate->pick('zip'), 'Extract::CommandLine', ); }; subtest 'just Archive::Zip' => sub { $have_archive_zip = 1; $have_info_zip = 0; is( Alien::Build::Plugin::Extract::Negotiate->pick('zip'), 'Extract::ArchiveZip', ); }; subtest 'just info zip' => sub { $have_archive_zip = 0; $have_info_zip = 1; is( Alien::Build::Plugin::Extract::Negotiate->pick('zip'), 'Extract::CommandLine', ); }; subtest 'both' => sub { $have_archive_zip = 1; $have_info_zip = 1; # Not 100% sure this is the best choice now that I think of it. is( Alien::Build::Plugin::Extract::Negotiate->pick('zip'), 'Extract::ArchiveZip', ); }; }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_fetch_curlcommand.t000644 000000 000000 00000014060 14710030646 023526 0ustar00rootroot000000 000000 use 5.008004; use lib 't/lib'; use MyTest::FauxFetchCommand; use MyTest::HTTP; use MyTest::CaptureNote; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Fetch::CurlCommand; use Path::Tiny qw( path ); use Capture::Tiny (); use JSON::PP (); use File::Which qw( which ); use Alien::Build::Util qw( _dump ); use JSON::PP qw( decode_json ); $Alien::Build::Plugin::Fetch::CurlCommand::VERSION = '1.19'; # This test makes real http request against localhost only $ENV{ALIEN_DOWNLOAD_RULE} = 'warn'; subtest 'fetch from http' => sub { my $config = test_config 'httpd'; skip_all 'Test requires httpd config' unless $config; my $base = $config->{url}; my $build = alienfile_ok qq{ use alienfile; meta->prop->{start_url} = '$base/html_test.html'; probe sub { 'share' }; share { plugin 'Fetch::CurlCommand'; }; }; alien_install_type_is 'share'; subtest 'directory listing' => sub { my $list = capture_note { $build->fetch }; is( $list, hash { field type => 'html'; field base => "$base/html_test.html"; field content => "Hello World

Hello World

\n"; field protocol => 'http'; end; }, 'list' ); }; subtest 'file' => sub { my $file = capture_note { $build->fetch("$base/foo-1.01.tar") }; is( $file, hash { field type => 'file'; field filename => 'foo-1.01.tar'; field path => T(); field protocol => 'http'; end; }, 'file meta', ); is( scalar path($file->{path})->slurp, "content:foo-1.01\n", 'file content', ); }; subtest '404' => sub { my($file, $error) = capture_note { my $file = eval { $build->fetch("$base/bogus.html"); }; ($file, $@); }; isnt $error, '', 'throws error'; note "error is: $error"; }; }; #subtest 'fetch from ftp' => sub { # # my $config = test_config 'ftpd'; # # skip_all 'Test requires ftp config' unless $config; # # my $base = $config->{url}; # # my $build = alienfile_ok qq{ # use alienfile; # # meta->prop->{start_url} = '$base/html_test.html'; # # probe sub { 'share' }; # # share { # plugin 'Fetch::CurlCommand'; # }; # }; # # alien_install_type_is 'share'; # # subtest 'get directory listing with trailing slash' => sub { # # my $list = capture_note { $build->fetch("$base/") }; # # is( # $list, # hash { # field type => 'list'; # field list => array { # foreach my $filename (qw( foo-1.00.tar foo-1.01.tar foo-1.02.tar html_test.html )) # { # item hash { # field filename => $filename; # field url => "$base/$filename"; # end; # }; # }; # end; # }; # }, # 'list', # ); # # }; # # subtest 'get non-existant directory listing with trailing slash' => sub { # # my $error = capture_note { # eval { # $build->fetch("$base/bogus/") # }; # $@; # }; # # isnt $error, '', 'throws error'; # note "error = $error"; # # }; # # subtest 'get file' => sub { # # my $file = capture_note { $build->fetch("$base/foo-1.01.tar") }; # # is( # $file, # hash { # field type => 'file'; # field filename => 'foo-1.01.tar'; # field path => T(); # end; # }, # 'file meta', # ); # # is( # scalar path($file->{path})->slurp, # "content:foo-1.01\n", # 'file content', # ); # # }; # # subtest 'get missing file' => sub { # # my($error) = capture_note { # eval { # $build->fetch("$base/bogus.txt"); # }; # $@; # }; # # isnt $error, '', 'throws error'; # note "error is : $error"; # # }; # # subtest 'get directory listing sans trailing slash' => sub { # # my $list = capture_note { $build->fetch("$base") }; # # is( # $list, # hash { # field type => 'list'; # field list => array { # foreach my $filename (qw( foo-1.00.tar foo-1.01.tar foo-1.02.tar html_test.html )) # { # item hash { # field filename => $filename; # field url => "$base/$filename"; # end; # }; # }; # end; # }; # }, # 'list', # ); # # }; # #}; subtest 'live test' => sub { skip_all 'set ALIEN_BUILD_LIVE_TEST=1 to enable test' unless $ENV{ALIEN_BUILD_LIVE_TEST}; my $curl = which('curl'); is $curl, T(); note "curl = $curl"; my $pok = Alien::Build::Plugin::Fetch::CurlCommand->protocol_ok('https'); is $pok, T(); require Alien::Build::Plugin::Download::Negotiate; my $mock = mock 'Alien::Build::Plugin::Download::Negotiate' => ( override => [ pick => sub { ('Fetch::CurlCommand', 'Decode::Mojo'); }, ], ); alienfile_ok q{ use alienfile; probe sub { 'share' }; share { plugin Download => ( url => 'https://alienfile.org/dontpanic/', version => qr/([0-9\.]+)\.tar\.gz$/, ); }; }; my $download = alien_download_ok; ok -f $download, "file exists"; is path($download)->basename, match qr/^dontpanic-.*\.tar\.gz$/; }; subtest 'headers' => sub { my $url = http_url; skip_all http_error unless $url; my $build = do { my $plugin = Alien::Build::Plugin::Fetch::CurlCommand->new( url => "$url" ); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); $build; }; require URI; my $furl = URI->new_abs("test1/foo.txt", $url); note "url = $furl"; my $res = capture_note { $build->fetch("$furl", http_headers => [ Foo => 'Bar1', Foo => 'Bar2', Baz => 1 ]) }; note _dump($res); my $content; is $content = decode_json(path($res->{path})->slurp_raw), hash { field headers => hash { field Foo => 'Bar1, Bar2'; field Baz => 1; etc; }; etc; }, ; note _dump($content); }; done_testing Alien-Build-2.84/t/alien_build_plugin_fetch_httptiny.t000644 000000 000000 00000010141 14710030646 023101 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Fetch::HTTPTiny; use lib 't/lib'; use Path::Tiny qw( path ); use MyTest::HTTP; use MyTest::CaptureNote; use Alien::Build::Util qw( _dump ); use JSON::PP qw( decode_json ); subtest 'updates requires' => sub { my $plugin = Alien::Build::Plugin::Fetch::HTTPTiny->new( url => 'http://example.test/' ); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); is( $build->requires('share'), hash { field 'HTTP::Tiny' => '0.044'; field 'URI' => '0'; field 'Net::SSLeay' => DNE(); field 'IO::Socket::SSL' => DNE(); etc; }, ); note _dump($build->requires('share')); }; subtest 'updates requires ssl' => sub { my $plugin = Alien::Build::Plugin::Fetch::HTTPTiny->new( url => 'https://example.test/' ); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); is( $build->requires('share'), hash { field 'HTTP::Tiny' => '0.044'; field 'URI' => '0'; field 'Net::SSLeay' => T(); field 'IO::Socket::SSL' => T(); etc; }, ); note _dump($build->requires('share')); }; subtest 'use start_url' => sub { subtest 'sets start_url' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Fetch::HTTPTiny' => 'http://foo.bar.baz'; }; is $build->meta_prop->{start_url}, 'http://foo.bar.baz'; }; subtest 'uses start_url' => sub { my $mock = mock 'Alien::Build::Plugin::Fetch::HTTPTiny'; my $plugin; $mock->after(init => sub { my($self, $meta) = @_; $plugin = $self; }); my $build = alienfile_ok q{ use alienfile; meta->prop->{start_url} = 'http://baz.bar.foo'; plugin 'Fetch::HTTPTiny'; }; is $plugin->url, 'http://baz.bar.foo'; }; }; subtest 'fetch' => sub { skip_all 'test requires HTTP::Tiny' unless eval { require HTTP::Tiny; HTTP::Tiny->VERSION(0.044) }; my $url = http_url; skip_all http_error unless $url; my($proto) = $url =~ /^([a-z]+):/; # tests usually in CI only against a real http server on localhost local $ENV{ALIEN_DOWNLOAD_RULE} = $ENV{ALIEN_DOWNLOAD_RULE}; $ENV{ALIEN_DOWNLOAD_RULE} = 'warn' if $proto ne 'https'; like $proto, qr/^https?$/, "protocol is either http or https (url = $url)"; my $plugin = Alien::Build::Plugin::Fetch::HTTPTiny->new( url => "$url" ); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); eval { $build->load_requires('share') }; skip_all 'test requires HTTP::Tiny' if $@; subtest 'listing' => sub { my $res = $build->fetch; is( $res, hash { field type => 'html'; field base => match qr!^http:/!; field content => match qr!foo-1\.00\.tar\.gz!; field protocol => $proto; }, ); }; subtest 'file' => sub { my $furl = URI->new_abs("foo-1.00.tar.gz", $url); note "url = $furl"; my $expected_content = path('corpus/dist/foo-1.00.tar.gz')->slurp_raw; my $res = $build->fetch("$furl"); is( $res, hash { field type => 'file'; field filename => 'foo-1.00.tar.gz'; field content => $expected_content; field protocol => $proto; }, ); }; subtest 'not found' => sub { my $furl = URI->new_abs("bogus.tar.gz", $url); note "url = $furl"; capture_note { is dies { $build->fetch("$furl") }, match qr/^error fetching http:/; }; }; subtest 'headers' => sub { my $furl = URI->new_abs("test1/foo.txt", $url); note "url = $furl"; my $res = capture_note { $build->fetch("$furl", http_headers => [ Foo => 'Bar1', Foo => 'Bar2', Baz => 1 ]) }; my $content; is $content = decode_json($res->{content}), hash { field headers => hash { field Foo => 'Bar1, Bar2'; field Baz => 1; etc; }; etc; }, ; note _dump($content); }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_fetch_local.t000644 000000 000000 00000007425 14710030646 022323 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Fetch::Local; use Alien::Build::Util qw( _dump ); use Path::Tiny qw( path ); subtest 'basic' => sub { my $build = alienfile q{ use alienfile; plugin 'Fetch::Local' => ( root => 'corpus/dist', url => 'foo-1.00.tar', ); }; subtest 'default' => sub { my $res = $build->fetch; note _dump $res; is( $res, hash { field type => 'file'; field filename => 'foo-1.00.tar'; field path => T(); field tmp => 0; field protocol => 'file'; end; }, 'response hash' ); ok( -f $res->{path}, 'path exists as file' ); }; subtest 'listing' => sub { my $res = $build->fetch('.'); note _dump $res; is( $res, hash { field type => 'list'; field list => array { foreach my $fn (qw ( foo-1.00 foo-1.00.tar foo-1.00.tar.Z foo-1.00.tar.bz2 foo-1.00.tar.gz foo-1.00.tar.xz foo-1.00.zip )) { item hash { field filename => $fn; field url => T(); end; }; } }; field protocol => 'file'; end; }, 'response hash', ); foreach my $url (map { $_->{url} } @{ $res->{list} }) { ok( -e $url ); } }; subtest 'file' => sub { my $res = $build->fetch('foo-1.00.tar.gz'); note _dump $res; is( $res, hash { field type => 'file'; field filename => 'foo-1.00.tar.gz'; field path => T(); field tmp => 0; field protocol => 'file'; end; }, 'response hash' ); ok( -f $res->{path}, 'path exists as file' ); }; }; subtest 'use start_url' => sub { subtest 'sets start_url' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Fetch::Local' => 'http://foo.bar.baz'; }; is $build->meta_prop->{start_url}, 'http://foo.bar.baz'; }; subtest 'uses start_url' => sub { my $mock = mock 'Alien::Build::Plugin::Fetch::Local'; my $plugin; $mock->after(init => sub { my($self, $meta) = @_; $plugin = $self; }); my $build = alienfile_ok q{ use alienfile; meta->prop->{start_url} = 'http://baz.bar.foo'; plugin 'Fetch::Local'; }; is $plugin->url, 'http://baz.bar.foo'; }; }; subtest 'uri' => sub { skip_all 'Test requires URI' unless eval { require URI::file; 1 }; my $url = URI::file->new(path('corpus/dist')->absolute)->as_string; my $build = alienfile qq{ use alienfile; plugin 'Fetch::Local' => ( url => '$url', ); }; subtest 'listing' => sub { my $res = $build->fetch($url); note _dump $res; is( $res, hash { field type => 'list'; field list => array { foreach my $fn (qw ( foo-1.00 foo-1.00.tar foo-1.00.tar.Z foo-1.00.tar.bz2 foo-1.00.tar.gz foo-1.00.tar.xz foo-1.00.zip )) { item hash { field filename => $fn; field url => T(); end; }; } }; field protocol => 'file'; end; }, 'response hash', ); foreach my $url (map { $_->{url} } @{ $res->{list} }) { ok( -e $url ); } }; subtest 'file' => sub { my $res = $build->fetch("$url/foo-1.00.tar.gz"); note _dump $res; is( $res, hash { field type => 'file'; field filename => 'foo-1.00.tar.gz'; field path => T(); field tmp => 0; field protocol => 'file'; end; }, 'response hash' ); ok( -f $res->{path}, 'path exists as file' ); }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_fetch_localdir.t000644 000000 000000 00000002115 14710030646 023011 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Fetch::LocalDir; use Capture::Tiny qw( capture_merged ); use Path::Tiny qw( path ); subtest 'basic' => sub { local $Alien::Build::Plugin::Fetch::LocalDir::VERSION = $Alien::Build::Plugin::Fetch::LocalDir::VERSION || 2.57; # This test "downloads" a directory which isn't uspported # by check_digest local $ENV{ALIEN_DOWNLOAD_RULE} = 'warn'; my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock', probe => 'share'; share { meta->prop->{start_url} = 'corpus/dist/foo-1.00/'; plugin 'Fetch::LocalDir'; plugin 'Extract' => format => 'd'; }; }; alienfile_skip_if_missing_prereqs; alien_install_type_is 'share'; alien_download_ok; my $download = $build->install_prop->{download}; ok -d $download, 'download is a directory'; note "download = $download"; ok -f path($download)->child('configure'), 'configure is a file'; ok -f path($download)->child('foo.c'), 'foo.c is a file'; alien_extract_ok; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_fetch_lwp.t000644 000000 000000 00000010713 14710030646 022025 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Fetch::LWP; use lib 't/lib'; use Path::Tiny qw( path ); use MyTest::HTTP; use MyTest::FTP; use MyTest::File; use MyTest::CaptureNote; use Alien::Build::Util qw( _dump ); use JSON::PP qw( decode_json ); subtest 'updates requires' => sub { my $plugin = Alien::Build::Plugin::Fetch::LWP->new( url => 'file://localhost/' ); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); is( $build->requires('share')->{'LWP::UserAgent'}, 0 ); note _dump $meta; }; subtest 'use start_url' => sub { subtest 'sets start_url' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Fetch::LWP' => 'http://foo.bar.baz'; }; is $build->meta_prop->{start_url}, 'http://foo.bar.baz'; }; subtest 'uses start_url' => sub { my $mock = mock 'Alien::Build::Plugin::Fetch::LWP'; my $plugin; $mock->after(init => sub { my($self, $meta) = @_; $plugin = $self; }); my $build = alienfile_ok q{ use alienfile; meta->prop->{start_url} = 'http://baz.bar.foo'; plugin 'Fetch::LWP'; }; is $plugin->url, 'http://baz.bar.foo'; }; }; subtest 'fetch' => sub { skip_all 'test requires LWP::UserAgent' unless eval { require LWP::UserAgent; 1 }; foreach my $type (qw( http ftp file )) { subtest "with $type" => sub { my $url = do { my $get_url = \&{"${type}_url"}; my $error = \&{"${type}_error"}; my $url = $get_url->(); skip_all $error->() unless $url; }; # This test runs against a real http or ftp server, usually only in CI # the server is running on localhost local $ENV{ALIEN_DOWNLOAD_RULE} = $ENV{ALIEN_DOWNLOAD_RULE}; $ENV{ALIEN_DOWNLOAD_RULE} = 'warn' if $url =~ /^(http|ftp):/; my $plugin = Alien::Build::Plugin::Fetch::LWP->new( url => "$url" ); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); eval { $build->load_requires('share') }; skip_all 'test requires LWP' if $@; subtest 'listing' => sub { my $res = $build->fetch; is( $res, hash { if($type eq 'ftp') { field type => 'dir_listing'; } else { field type => 'html'; field charset => E(); } field base => match qr!^$type:/!; field content => match qr!foo-1\.00\.tar\.gz!; field protocol => $type; end; }, ) || diag _dump($res); }; subtest 'file' => sub { my $furl = URI->new_abs("foo-1.00.tar.gz", $url); note "url = $furl"; my $expected_content = path('corpus/dist/foo-1.00.tar.gz')->slurp_raw; my $res = $build->fetch("$furl"); is( $res, hash { field type => 'file'; field filename => 'foo-1.00.tar.gz'; field content => $expected_content; field protocol => $type; end; }, ); }; subtest 'not found' => sub { my $furl = URI->new_abs("bogus.tar.gz", $url); note "url = $furl"; eval { $build->fetch("$furl") }; like $@, qr/^error fetching $type:/; }; }; } subtest 'headers' => sub { my $url = http_url; skip_all http_error unless $url; require URI; my $furl = URI->new_abs("test1/foo.txt", $url); note "url = $furl"; # This test runs against a real http or ftp server, usually only in CI # the server is running on localhost local $ENV{ALIEN_DOWNLOAD_RULE} = $ENV{ALIEN_DOWNLOAD_RULE}; $ENV{ALIEN_DOWNLOAD_RULE} = 'warn' if $url ne 'https'; my $build = do { my $plugin = Alien::Build::Plugin::Fetch::LWP->new( url => "$url" ); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); $build; }; my $res = capture_note { $build->fetch("$furl", http_headers => [ Foo => 'Bar1', Foo => 'Bar2', Baz => 1 ]) }; my $content; is $content = decode_json($res->{content}), hash { field headers => hash { field Foo => 'Bar1, Bar2'; field Baz => 1; etc; }; etc; }, ; note _dump($content); }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_fetch_netftp.t000644 000000 000000 00000006014 14710030646 022522 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Fetch::NetFTP; use lib 't/lib'; use MyTest::FTP; use Path::Tiny qw( path ); use Alien::Build::Util qw( _dump ); subtest 'updates requires' => sub { my $plugin = Alien::Build::Plugin::Fetch::NetFTP->new( url => 'ftp://localhost/' ); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); is( $build->requires('share')->{'Net::FTP'}, 0 ); is( $build->requires('share')->{'URI'}, 0 ); note _dump $meta; }; subtest 'use start_url' => sub { subtest 'sets start_url' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Fetch::NetFTP' => 'http://foo.bar.baz'; }; is $build->meta_prop->{start_url}, 'http://foo.bar.baz'; }; subtest 'uses start_url' => sub { my $mock = mock 'Alien::Build::Plugin::Fetch::NetFTP'; my $plugin; $mock->after(init => sub { my($self, $meta) = @_; $plugin = $self; }); my $build = alienfile_ok q{ use alienfile; meta->prop->{start_url} = 'http://baz.bar.foo'; plugin 'Fetch::NetFTP'; }; is $plugin->url, 'http://baz.bar.foo'; }; }; subtest 'fetch' => sub { my $url = ftp_url; unless($url) { my $log = path('t/bin/ftpd.log'); if(-r $log) { note($log->slurp); } skip_all ftp_error; } note "url = $url"; # FTP is inherently insecure. This test usually only runs in CI # against a ftp server running on localhost local $ENV{ALIEN_DOWNLOAD_RULE} = 'warn'; my $plugin = Alien::Build::Plugin::Fetch::NetFTP->new( url => $url ); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); eval { $build->load_requires('share') }; skip_all 'test requires Net::FTP and URI' if $@; subtest 'listing' => sub { my $res = $build->fetch; is( $res, hash { field type => 'list'; field protocol => 'ftp'; field list => array { for (qw( foo-1.00 foo-1.00.tar foo-1.00.tar.Z foo-1.00.tar.bz2 foo-1.00.tar.gz foo-1.00.tar.xz foo-1.00.zip )) { item hash { field filename => $_; field url => match qr!^ftp://!; }; } }; } ); }; subtest 'file' => sub { my $furl = URI->new_abs("foo-1.00.tar.gz", $url); note "url = $furl"; my $res = $build->fetch($furl); is( $res, hash { field type => 'file'; field protocol => 'ftp'; field filename => 'foo-1.00.tar.gz'; field path => match qr/foo-1\.00\.tar\.gz$/; }, ); my $expected = path('corpus/dist/foo-1.00.tar.gz')->slurp_raw; my $actual = path($res->{path})->slurp_raw; is( $actual, $expected ); }; subtest 'not found' => sub { my $furl = URI->new_abs("bogus.tar.gz", $url); note "url = $furl"; eval { $build->fetch("$furl") }; like $@, qr/^unable to fetch ftp/; }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_fetch_wget.t000644 000000 000000 00000006272 14710030646 022176 0ustar00rootroot000000 000000 use 5.008004; use lib 't/lib'; use MyTest::FauxFetchCommand; use MyTest::CaptureNote; use MyTest::HTTP; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Fetch::Wget; use Path::Tiny qw( path ); use Alien::Build::Util qw( _dump ); use JSON::PP qw( decode_json ); skip_all "No wget or not real wget" unless Alien::Build::Plugin::Fetch::Wget->_wget; $Alien::Build::Plugin::Fetch::Wget::VERSION = '1.19'; subtest 'fetch from http' => sub { my $config = test_config 'httpd'; skip_all 'Test requires httpd config' unless $config; my $base = $config->{url}; my($proto) = $base =~ /^([a-z]+):/; like $proto, qr/^https?$/, "protocol is either http or https (url = $base)"; # This test runs against a real http or ftp server, usually only in CI # the server is running on localhost local $ENV{ALIEN_DOWNLOAD_RULE} = $ENV{ALIEN_DOWNLOAD_RULE}; $ENV{ALIEN_DOWNLOAD_RULE} = 'warn' if $proto ne 'https'; my $build = alienfile_ok qq{ use alienfile; meta->prop->{start_url} = '$base/html_test.html'; probe sub { 'share' }; share { plugin 'Fetch::Wget'; }; }; alien_install_type_is 'share'; subtest 'html' => sub { my $list = capture_note { $build->fetch }; is( $list, hash { field type => 'html'; field base => "$base/html_test.html"; field content => "Hello World

Hello World

\n"; field protocol => $proto; end; }, 'list' ); }; subtest 'file' => sub { my $file = capture_note { $build->fetch("$base/foo-1.01.tar") }; is( $file, hash { field type => 'file'; field filename => 'foo-1.01.tar'; field path => T(); field protocol => $proto; end; }, 'file meta', ); is( scalar path($file->{path})->slurp, "content:foo-1.01\n", 'file content', ); }; subtest '404' => sub { my($file, $error) = capture_note { my $file = eval { $build->fetch("$base/bogus.html"); }; ($file, $@); }; isnt $error, '', 'throws error'; note "error is: $error"; }; }; subtest 'headers' => sub { my $url = http_url; skip_all http_error unless $url; require URI; my $furl = URI->new_abs("test1/foo.txt", $url); note "url = $furl"; # This test runs against a real http or ftp server, usually only in CI # the server is running on localhost local $ENV{ALIEN_DOWNLOAD_RULE} = $ENV{ALIEN_DOWNLOAD_RULE}; $ENV{ALIEN_DOWNLOAD_RULE} = 'warn' if $url ne 'https'; my $build = do { my $plugin = Alien::Build::Plugin::Fetch::Wget->new; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); $build; }; my $res = capture_note { $build->fetch("$furl", http_headers => [ Foo => 'Bar1', Foo => 'Bar2', Baz => 1 ]) }; note _dump($res); my $content; is $content = decode_json(path($res->{path})->slurp_raw), hash { field headers => hash { field Foo => 'Bar1, Bar2'; field Baz => 1; etc; }; etc; }, ; note _dump($content); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_gather_isolatedynamic.t000644 000000 000000 00000004546 14710030646 024420 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Gather::IsolateDynamic; use Capture::Tiny qw( capture_merged ); subtest 'basic' => sub { my $check = sub { my($build) = @_; note scalar capture_merged { $build->probe; $build->download; $build->build; }; my $stage = $build->install_prop->{stage}; ok(-f "$stage/lib/$_", "correct: lib/$_") for qw( libfoo.a ); ok(-f "$stage/bin/$_", "correct: bin/$_") for qw( foo foo.exe ); foreach my $file (qw( libfoo.dylib libfoo.bundle libfoo.la foo.dll.a )) { ok(!-f "$stage/lib/$file", "moved: lib/$file"); ok(-f "$stage/dynamic/$file", "correct: dynamic/$file"); } }; subtest 'less indirect' => sub { my $build = alienfile q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock', probe => 'share', download => 1, extract => 1; share { build sub { my($build) = @_; my $dir = path($build->install_prop->{stage}); $dir->child('lib')->mkpath; $dir->child('lib', $_)->touch for qw( libfoo.a libfoo.dylib libfoo.bundle libfoo.la foo.dll.a ); $dir->child('bin')->mkpath; $dir->child('bin', $_)->touch for qw( foo foo.exe foo.dll ); }; plugin 'Gather::IsolateDynamic'; }; }; $check->($build); }; subtest 'destdir' => sub { my $build = alienfile q{ use alienfile; use Path::Tiny qw( path ); use Alien::Build::Util qw( _destdir_prefix ); plugin 'Test::Mock', probe => 'share', download => 1, extract => 1; meta_prop->{destdir} = 1; share { download sub { path('foo-1.00.tar.gz')->touch }; extract sub { path($_)->touch for qw( file1 file2 ) }; build sub { my($build) = @_; print "in build\n"; my $dir = path(_destdir_prefix($ENV{DESTDIR}, $build->install_prop->{prefix})); $dir->child('lib')->mkpath; $dir->child('lib', $_)->touch for qw( libfoo.a libfoo.dylib libfoo.bundle libfoo.la foo.dll.a ); $dir->child('bin')->mkpath; $dir->child('bin', $_)->touch for qw( foo foo.exe foo.dll ); }; plugin 'Gather::IsolateDynamic'; }; }; $check->($build); }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_meta.t000644 000000 000000 00000000406 14710030646 020776 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use lib 'corpus/lib'; use Alien::Build::Plugin::RogerRamjet; subtest 'basic' => sub { my $plugin = Alien::Build::Plugin::RogerRamjet->new; isa_ok( $plugin->meta, 'Alien::Build::PluginMeta' ); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_pkgconfig_commandline.t000644 000000 000000 00000030506 14710030646 024371 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use lib 'corpus/lib'; use Test::Alien::Build; use Alien::Build::Plugin::PkgConfig::CommandLine; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); $ENV{PKG_CONFIG_PATH} = path('corpus/lib/pkgconfig')->absolute->stringify; $ENV{PKG_CONFIG_LIBDIR} = ''; my $bin_name = Alien::Build::Plugin::PkgConfig::CommandLine->new('foo')->bin_name; skip_all 'test requires pkgconf or pkg-config' unless $bin_name; skip_all 'use PkgConfig::PP on windows' if $^O eq 'MSWin32' && !$ENV{ALIEN_BUILD_PLUGIN_PKGCONFIG_COMMANDLINE_TEST}; ok $bin_name, 'has bin_name'; note "it be $bin_name"; note "PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}"; my $prefix = '/test'; sub build { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; my $plugin = Alien::Build::Plugin::PkgConfig::CommandLine->new(@_); $plugin->init($meta); ($build, $meta, $plugin); } subtest 'available' => sub { my %which; require File::Which; my $mock = mock 'File::Which' => ( override => [ which => sub { my($prog) = @_; defined $prog ? $which{$prog} : (); }, ], ); subtest 'no command line' => sub { %which = (); is( Alien::Build::Plugin::PkgConfig::CommandLine->available, F(), ); }; subtest 'pkg-config' => sub { %which = ( 'pkg-config' => '/usr/bin/pkg-config' ); is( Alien::Build::Plugin::PkgConfig::CommandLine->available, T(), ); }; subtest 'pkgconf' => sub { %which = ( 'pkgconf' => '/usr/bin/pkgconf' ); is( Alien::Build::Plugin::PkgConfig::CommandLine->available, T(), ); }; subtest 'PKG_CONFIG' => sub { local $ENV{PKG_CONFIG} = 'foo-pkg-config'; %which = ( 'foo-pkg-config' => '/usr/bin/foo-pkg-config' ); is( Alien::Build::Plugin::PkgConfig::CommandLine->available, T(), ); }; }; subtest 'system not available' => sub { my($build, $meta, $plugin) = build('bogus'); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'version requirements' => sub { subtest 'atleast_version or minimum_version' => sub { subtest 'old name bad' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'old name good (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'old name good (much older)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.1.1', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'atleast_version bad' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', atleast_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'atleast_version good (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', atleast_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'atleast_version good (older)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', atleast_version => '1.1.1', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; }; subtest 'exact' => sub { subtest 'exact version (less)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', exact_version => '1.2.2', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'exact version (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', exact_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'exact version (more)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', exact_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; }; subtest 'max_version' => sub { subtest 'max version (lot less)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.0.0', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'max version (less)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.2.2', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'max version (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'max version (more)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'max version (lots more)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '3.3.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; }; }; subtest 'system available, okay' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); return unless $type eq 'system'; note capture_merged { $build->build; () }; if($^O eq 'MSWin32') { if($build->runtime_prop->{cflags} =~ m/-I(.*)\/include\/foo/ && $1 ne '/test') { $prefix = $1; ok(-f "$prefix/lib/pkgconfig/foo.pc", "relocation looks okay"); note "prefix = $prefix\n"; note "-f $prefix/lib/pkgconfig/foo.pc"; } } is( $build->runtime_prop, hash { #field cflags => match qr/-fPIC/; field cflags => match qr/-I\Q$prefix\E\/include\/foo/; field libs => "-L$prefix/lib -lfoo "; field libs_static => "-L$prefix/lib -lfoo -lbar -lbaz "; field version => '1.2.3'; field alt => U(); etc; }, ); # not supported by pkg-config. # may be supported by recent pkgconfig # so we do not test it. note "cflags_static = @{[ $build->runtime_prop->{cflags_static} ]}"; }; subtest 'hook prop' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', ); my $hook_prop_version; $meta->around_hook( probe => sub { my($orig, $build) = @_; my $install_type = $build->$orig; $hook_prop_version = $build->hook_prop->{version}; $install_type; }, ); my($out, $type) = capture_merged { $build->probe }; note $out; is $type, 'system'; is $hook_prop_version, '1.2.3'; }; subtest 'system multiple' => sub { subtest 'all found in system' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::CommandLine' => ( pkg_name => [ 'xor', 'xor-chillout' ], ); }; alien_install_type_is 'system'; my $alien = alien_build_ok; use Alien::Build::Util qw( _dump ); note _dump($alien->runtime_prop); is( $alien->runtime_prop, hash { field libs => "-L$prefix/lib -lxor "; field libs_static => "-L$prefix/lib -lxor -lxor1 "; field cflags => "-I$prefix/include/xor "; field cflags_static => D(); field version => '4.2.1'; field alt => hash { field 'xor' => hash { field libs => "-L$prefix/lib -lxor "; field libs_static => "-L$prefix/lib -lxor -lxor1 "; field cflags => "-I$prefix/include/xor "; field cflags_static => D(); field version => '4.2.1'; end; }; field 'xor-chillout' => hash { field libs => "-L$prefix/lib -lxor-chillout "; field libs_static => "-L$prefix/lib -lxor-chillout "; field cflags => "-I$prefix/include/xor "; field cflags_static => D(); field version => '4.2.2'; }; end; }; etc; }, ); }; }; subtest 'system rewrite' => sub { my $build = alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); meta->prop->{destdir} = 1; plugin 'PkgConfig::CommandLine' => ( pkg_name => [ 'foo-foo' ], ); share { plugin 'Test::Mock', download => 1, extract => 1; build sub { my($build) = @_; my $stage = path($ENV{DESTDIR}); my $prefix = path($build->install_prop->{prefix}); { my $tmp = $prefix->stringify; $tmp =~ s!^([a-z]):!/$1!i if $^O eq 'MSWin32'; $stage = $stage->child($tmp); } $stage->child('lib/pkgconfig')->mkpath; $stage->child('lib/libfoofoo.a')->spew("lib foo-foo as staged\n"); $stage->child('include')->mkpath; $stage->child('include/foofoo.h')->spew("h foo-foo as staged\n"); $stage->child('lib/pkgconfig/foo-foo.pc')->spew( "prefix=$prefix\n", map { s/^\s*//; "$_\n" } split /\n/, q{ exec_prefix=${prefix} libdir=${prefix}/lib includedir=${prefix}/include Name: foo-foo Description: A testing pkg-config file Version: 1.2.3 Libs: -L${libdir} -lfoofoo Cflags: -I${includedir} }, ); }; }; }; alien_install_type_is 'share'; my $alien = alien_build_ok; subtest 'test from stage' => sub { my $inc = path($build->runtime_prop->{cflags} =~ /-I(\S*)/); my $lib = path($build->runtime_prop->{libs} =~ /-L(\S*)/); ok(-d $inc, "inc dir exists" ); note "inc = $inc"; is($inc->child('foofoo.h')->slurp, "h foo-foo as staged\n", 'libfoofoo.a'); ok(-d $lib, "lib dir exists" ); note "lib = $lib"; is($lib->child('libfoofoo.a')->slurp, "lib foo-foo as staged\n", 'libfoofoo.a'); }; alien_build_clean; subtest 'test from alien' => sub { my $inc = path($alien->cflags =~ /-I(\S*)/); my $lib = path($alien->libs =~ /-L(\S*)/); ok(-d $inc, "inc dir exists" ); note "inc = $inc"; is($inc->child('foofoo.h')->slurp, "h foo-foo as staged\n", 'libfoofoo.a'); ok(-d $lib, "lib dir exists" ); note "lib = $lib"; is($lib->child('libfoofoo.a')->slurp, "lib foo-foo as staged\n", 'libfoofoo.a'); }; }; alien_subtest 'set env' => sub { skip_all 'test requires Archive::Tar' unless eval { require Archive::Tar; 1 }; my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::CommandLine' => ( pkg_name => 'totally-bogus-pkg-config-name' ); probe sub { 'share' }; share { plugin 'Download::Foo'; build sub { my($build) = @_; $build->log("PKG_CONFIG = $ENV{PKG_CONFIG}"); 1; }; meta->around_hook( gather_share => sub { 1; }, ); }; }; alien_build_ok; }; alien_subtest 'multiple probes' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::CommandLine' => ( pkg_name => 'xor', exact_version => '1.2.3', ); probe sub { 'system' }; }; alien_install_type_is 'system'; alien_build_ok; is $build, object { call runtime_prop => hash { field cflags => DNE(); field libs => DNE(); field cflags_static => DNE(); field libs_static => DNE(); etc; }; }, ; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_pkgconfig_libpkgconf.t000644 000000 000000 00000024000 14710030646 024211 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use lib 'corpus/lib'; use Test::Alien::Build; use Alien::Build::Plugin::PkgConfig::LibPkgConf; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); $ENV{PKG_CONFIG_PATH} = path('corpus/lib/pkgconfig')->absolute->stringify; $ENV{PKG_CONFIG_LIBDIR} = ''; sub build { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; my $plugin = Alien::Build::Plugin::PkgConfig::LibPkgConf->new(@_); $plugin->init($meta); ($build, $meta, $plugin); } skip_all 'Test requires PkgConfig::LibPkgConf' unless eval { my($build, $meta, $plugin) = build(pkg_name => 'foo', minimum_version => 1); $build->load_requires('configure'); }; subtest 'available' => sub { local $INC{'PkgConfig/LibPkgConf.pm'} = __FILE__; subtest 'new enough' => sub { local $PkgConfig::LibPkgConf::VERSION = '0.04'; is(Alien::Build::Plugin::PkgConfig::LibPkgConf->available, T()); }; subtest 'too old!' => sub { local $PkgConfig::VERSION = '0.03'; is(Alien::Build::Plugin::PkgConfig::LibPkgConf->available, F()); }; }; ok $INC{'PkgConfig/LibPkgConf/Client.pm'}, 'Loaded PkgConfig::LibPkgConf::Client'; note "inc=$INC{'PkgConfig/LibPkgConf/Client.pm'}"; ok $INC{'PkgConfig/LibPkgConf/Util.pm'}, 'Loaded PkgConfig::LibPkgConf::Util'; note "inc=$INC{'PkgConfig/LibPkgConf/Util.pm'}"; note "PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}"; subtest 'system not available' => sub { my($build, $meta, $plugin) = build('bogus'); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'version requirements' => sub { subtest 'atleast_version or minimum_version' => sub { subtest 'old name bad' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'old name good (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'old name good (much older)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.1.1', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'atleast_version bad' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', atleast_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'atleast_version good (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', atleast_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'atleast_version good (older)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', atleast_version => '1.1.1', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; }; subtest 'exact' => sub { subtest 'exact version (less)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', exact_version => '1.2.2', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'exact version (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', exact_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'exact version (more)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', exact_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; }; subtest 'max_version' => sub { subtest 'max version (lot less)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.0.0', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'max version (less)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.2.2', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'max version (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'max version (more)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'max version (lots more)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '3.3.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; }; }; subtest 'system available, okay' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); return unless $type eq 'system'; note capture_merged { $build->build; () }; is( $build->runtime_prop, hash { field cflags => '-fPIC -I/test/include/foo '; field cflags_static => '-fPIC -I/test/include/foo -DFOO_STATIC '; field libs => '-L/test/lib -lfoo '; field libs_static => '-L/test/lib -lfoo -lbar -lbaz '; field version => '1.2.3'; etc; }, ); is( $build->runtime_prop->{alt}, U(), ); }; subtest 'system multiple' => sub { subtest 'all found in system' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::LibPkgConf' => ( pkg_name => [ 'xor', 'xor-chillout' ], ); }; alien_install_type_is 'system'; my $alien = alien_build_ok; use Alien::Build::Util qw( _dump ); note _dump($alien->runtime_prop); is( $alien->runtime_prop, hash { field libs => '-L/test/lib -lxor '; field libs_static => '-L/test/lib -lxor -lxor1 '; field cflags => '-I/test/include/xor '; field cflags_static => '-I/test/include/xor -DXOR_STATIC '; field version => '4.2.1'; field alt => hash { field 'xor' => hash { field libs => '-L/test/lib -lxor '; field libs_static => '-L/test/lib -lxor -lxor1 '; field cflags => '-I/test/include/xor '; field cflags_static => '-I/test/include/xor -DXOR_STATIC '; field version => '4.2.1'; end; }; field 'xor-chillout' => hash { field libs => '-L/test/lib -lxor-chillout '; field libs_static => '-L/test/lib -lxor-chillout '; field cflags => '-I/test/include/xor '; field cflags_static => '-I/test/include/xor -DXOR_STATIC '; field version => '4.2.2'; }; end; }; etc; }, ); }; }; subtest 'prereqs' => sub { subtest 'are specified when user asks for plugin directly' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::LibPkgConf' => 'foo'; }; is( $build->requires('configure'), hash { field 'PkgConfig::LibPkgConf::Client' => T(); etc; }, 'prereqs' ); }; subtest 'minimum version requires util module' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::LibPkgConf' => ( pkg_name => 'foo', minimum_version => '1.00', ); }; is( $build->requires('configure'), hash { field 'PkgConfig::LibPkgConf::Client' => T(); field 'PkgConfig::LibPkgConf::Util' => T(); etc; }, 'prereqs' ); }; subtest 'are not specified when user asks for plugin IN-directly' => sub { local $ENV{ALIEN_BUILD_PKG_CONFIG} = 'PkgConfig::LibPkgConf'; my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig' => 'foo'; }; is( $build->requires('configure'), hash { field 'PkgConfig' => DNE(); field 'PkgConfig::LibPkgConf::Client' => DNE(); field 'PkgConfig::LibPkgConf::Util' => DNE(); etc; }, 'prereqs' ); }; }; alien_subtest 'set env' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::LibPkgConf' => ( pkg_name => 'totally-bogus-pkg-config-name' ); probe sub { 'share' }; share { plugin 'Download::Foo'; build sub { my($build) = @_; $build->log("PKG_CONFIG = $ENV{PKG_CONFIG}"); 1; }; meta->around_hook( gather_share => sub { 1; }, ); }; }; alien_build_ok; }; alien_subtest 'multiple probes' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::LibPkgConf' => ( pkg_name => 'xor', exact_version => '1.2.3', ); probe sub { 'system' }; }; alien_install_type_is 'system'; alien_build_ok; is $build, object { call runtime_prop => hash { field cflags => DNE(); field libs => DNE(); field cflags_static => DNE(); field libs_static => DNE(); etc; }; }, ; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_pkgconfig_makestatic.t000644 000000 000000 00000002460 14710030646 024226 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::PkgConfig::MakeStatic; use Capture::Tiny qw( capture_merged ); skip_all 'test requires PkgConfig.pm' unless eval { require PkgConfig; PkgConfig->VERSION(0.14026) }; subtest 'recursive' => sub { my $build = alienfile q{ use alienfile; use Path::Tiny qw( path ); plugin 'Test::Mock', probe => 'share', download => 1, extract => 1; plugin 'PkgConfig::MakeStatic'; plugin 'PkgConfig::PP' => 'foo1'; share { build sub { my($build) = @_; my $dir = path($build->install_prop->{prefix}, 'lib', 'pkgconfig'); $dir->mkpath; path($dir, 'foo1.pc')->spew( "libdir=/foo/bar\n" . "Cflags: -I/baz/include\n" . "Cflags.private: -DUSE_STATIC=1\n" . "Libs: -L\${libdir} -lxml2\n" . "Libs.private: -lpthread -lz -liconv -lm\n" ); path($dir, 'bar1.pc')->spew( "libdir=/foo/bar\n" . "Libs: -L\${libdir} -lfoo2\n" . "Libs.private: -lbar -lbaz\n" ); }; }; }; note capture_merged { $build->download; $build->build; (); }; like $build->runtime_prop->{libs}, qr{-L/foo/bar -lxml2 -lpthread -lz -liconv -lm}; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_pkgconfig_negotiate.t000644 000000 000000 00000012460 14710030646 024061 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::PkgConfig::Negotiate; use Alien::Build; use Capture::Tiny qw( capture_merged ); subtest 'pick' => sub { my $pick = Alien::Build::Plugin::PkgConfig::Negotiate->pick; ok $pick, 'has a pick'; note "pick = $pick"; }; subtest 'override' => sub { foreach my $name (qw( PP LibPkgConf CommandLine )) { local $ENV{ALIEN_BUILD_PKG_CONFIG} = "PkgConfig::$name"; subtest $ENV{ALIEN_BUILD_PKG_CONFIG} => sub { foreach my $minimum_version (undef, '1.2.3') { subtest "minimum_version = @{[ $minimum_version || 'undef' ]}" => sub { my $plugin = Alien::Build::Plugin::PkgConfig::Negotiate->new( pkg_name => 'libfoo', (defined $minimum_version ? (minimum_version => $minimum_version ) : ()), ); my $build = alienfile_ok q{ use alienfile }; my $subplugin; my %subplugin; my $mock = mock 'Alien::Build::Meta'; $mock->before(apply_plugin => sub { (undef, $subplugin, %subplugin) = @_; }); note scalar capture_merged { $plugin->init($build->meta) }; is( [$subplugin, \%subplugin ], [ "PkgConfig::$name", hash { field pkg_name => 'libfoo'; field minimum_version => $minimum_version if defined $minimum_version; field register_prereqs => 0; end; }, ], 'arguments to subplugin are correct', ); } } }; } }; subtest 'version stuff' => sub { my $class = 'Alien::Build::Plugin::PkgConfig::Negotiate'; my $getmeta = sub { mock { reqs => {}, apply => [] } => ( add => [ add_requires => sub { my($self, $phase, $name, $version) = @_; $version = '0' unless defined $version; $self->{reqs}->{$phase}->{$name} = $version; }, ], add => [ apply_plugin => sub { my($self, undef, %args) = @_; push @{ $self->{apply} }, \%args; }, ], ); }; my $mock = mock 'Alien::Build' => ( override => [ log => sub { my(undef, $message) = @_; note $message; }, ], ); subtest 'nodda' => sub { my $meta = $getmeta->(); my $plugin = $class->new( pkg_name => 'libfoo', ); $plugin->init($meta); is( $meta->{reqs}, {}, 'reqs', ); is( $meta->{apply}, [hash { field pkg_name => 'libfoo'; field register_prereqs => 0; end; }], 'apply', ); }; subtest 'minimum_version' => sub { my $meta = $getmeta->(); my $plugin = $class->new( pkg_name => 'libfoo', minimum_version => '1.2.3', ); $plugin->init($meta); is( $meta->{reqs}, {}, 'reqs', ); is( $meta->{apply}, [hash { field pkg_name => 'libfoo'; field register_prereqs => 0; field minimum_version => '1.2.3'; end; }], 'apply', ); }; subtest 'atleast_version' => sub { my $meta = $getmeta->(); my $plugin = $class->new( pkg_name => 'libfoo', atleast_version => '1.2.3', ); $plugin->init($meta); is( $meta->{reqs}, { configure => { 'Alien::Build::Plugin::PkgConfig::Negotiate' => '1.53' }}, 'reqs', ); is( $meta->{apply}, [hash { field pkg_name => 'libfoo'; field register_prereqs => 0; field atleast_version => '1.2.3'; end; }], 'apply', ); }; subtest 'exact_version' => sub { my $meta = $getmeta->(); my $plugin = $class->new( pkg_name => 'libfoo', exact_version => '1.2.3', ); $plugin->init($meta); is( $meta->{reqs}, { configure => { 'Alien::Build::Plugin::PkgConfig::Negotiate' => '1.53' }}, 'reqs', ); is( $meta->{apply}, [hash { field pkg_name => 'libfoo'; field register_prereqs => 0; field exact_version => '1.2.3'; end; }], 'apply', ); }; subtest 'max_version' => sub { my $meta = $getmeta->(); my $plugin = $class->new( pkg_name => 'libfoo', max_version => '1.2.3', ); $plugin->init($meta); is( $meta->{reqs}, { configure => { 'Alien::Build::Plugin::PkgConfig::Negotiate' => '1.53' }}, 'reqs', ); is( $meta->{apply}, [hash { field pkg_name => 'libfoo'; field register_prereqs => 0; field max_version => '1.2.3'; end; }], 'apply', ); }; }; subtest 'list of pkg_name' => sub { my $mock = mock 'Alien::Build::Meta'; my $subplugin; my @subplugin; $mock->before(apply_plugin => sub { (undef, $subplugin, @subplugin) = @_ if $_[1] eq 'PkgConfig'; }); my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig' => [qw( foo bar baz )]; }; is( \@subplugin, [ [ qw( foo bar baz ) ] ], 'passes pkg_name correctly', ); is( $build->requires('configure'), hash { field 'Alien::Build::Plugin::PkgConfig::Negotiate' => '0.79'; }, 'sets prereq', ); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_pkgconfig_negotiate__pick.t000644 000000 000000 00000010701 14710030646 025222 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Plugin::PkgConfig::Negotiate; use Capture::Tiny qw( capture_merged ); use Config; use File::Which (); delete $ENV{ALIEN_BUILD_PKG_CONFIG}; subtest 'LibPkgConf' => sub { subtest 'installed' => sub { local $INC{'PkgConfig/LibPkgConf.pm'} = __FILE__; subtest 'new enough' => sub { local $PkgConfig::LibPkgConf::VERSION = '0.99'; is( Alien::Build::Plugin::PkgConfig::Negotiate->pick, 'PkgConfig::LibPkgConf', ); }; subtest 'not new enough' => sub { local $PkgConfig::LibPkgConf::VERSION = '0.01'; isnt( Alien::Build::Plugin::PkgConfig::Negotiate->pick, 'PkgConfig::LibPkgConf', ); }; }; subtest 'not installed' => sub { skip_all 'subtest requires Devel::Hide' unless eval { require Devel::Hide }; # side-effect of this test, PkgConfig::LibPkgConf # cannot be loaded for the rest of this .t file note scalar capture_merged { Devel::Hide->import(qw( PkgConfig::LibPkgConf )) }; isnt( Alien::Build::Plugin::PkgConfig::Negotiate->pick, 'PkgConfig::LibPkgConf', ); }; }; my $make_pkgconfig_libpkgconf_unavailable = mock 'Alien::Build::Plugin::PkgConfig::LibPkgConf' => ( override => [ available => sub { 0 }, ], ); subtest 'CommandLine' => sub { local $INC{'PkgConfig.pm'} = __FILE__; local $PkgConfig::VERSION = '0.14026'; my %which; my $mock = mock 'File::Which' => ( override => [ which => sub { my($prog) = @_; if(defined $prog) { if($which{$prog}) { note "which: $prog => $which{$prog}"; return $which{$prog}; } else { note "which: $prog N/A"; } } else { note "which: undef"; } }, ], ); my $mock2 = mock 'Alien::Build::Plugin::PkgConfig::Negotiate'; if($^O =~ /^(solaris|MSWin32)$/) { $mock2->override( _perl_config => sub { my($key) = @_; if($key eq 'osname') { return 'linux' } else { return $Config{$key} } }, ); } subtest 'no command line' => sub { %which = (); is( Alien::Build::Plugin::PkgConfig::Negotiate->pick, 'PkgConfig::PP', ); }; subtest 'pkg-config' => sub { %which = ( 'pkg-config' => '/usr/bin/pkg-config' ); is( Alien::Build::Plugin::PkgConfig::Negotiate->pick, 'PkgConfig::CommandLine', ); }; subtest 'pkgconf' => sub { %which = ( 'pkgconf' => '/usr/bin/pkgconf' ); is( Alien::Build::Plugin::PkgConfig::Negotiate->pick, 'PkgConfig::CommandLine', ); }; subtest 'PKG_CONFIG' => sub { local $ENV{PKG_CONFIG} = 'foo-pkg-config'; %which = ( 'foo-pkg-config' => '/usr/bin/foo-pkg-config' ); is( Alien::Build::Plugin::PkgConfig::Negotiate->pick, 'PkgConfig::CommandLine', ); }; subtest 'PP' => sub { subtest '64 bit solaris' => sub { %which = ( 'pkg-config' => '/usr/bin/pkg-config' ); # From the old AB::MB days we prefer PkgConfig.pm # for 64 bit solaris over the command line pkg-config my $mock2 = mock 'Alien::Build::Plugin::PkgConfig::Negotiate' => ( override => [ _perl_config => sub { my($key) = @_; if($key eq 'ptrsize') { return 8 } elsif($key eq 'osname') { return 'solaris' } else { return $Config{$key} } }, ], ); is( Alien::Build::Plugin::PkgConfig::Negotiate->pick, 'PkgConfig::PP', ); }; subtest 'Windows' => sub { %which = ( 'pkg-config' => '/usr/bin/pkg-config' ); # From the old AB::MB days we prefer PkgConfig.pm # for 64 bit solaris over the command line pkg-config my $mock2 = mock 'Alien::Build::Plugin::PkgConfig::Negotiate' => ( override => [ _perl_config => sub { my($key) = @_; if($key eq 'osname') { return 'MSWin32' } else { return $Config{$key} } }, ], ); is( Alien::Build::Plugin::PkgConfig::Negotiate->pick, 'PkgConfig::PP', ); }; subtest 'PP is fallback' => sub { %which = (); is( Alien::Build::Plugin::PkgConfig::Negotiate->pick, 'PkgConfig::PP', ); }; }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_pkgconfig_pp.t000644 000000 000000 00000022267 14710030646 022527 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use lib 'corpus/lib'; use Test::Alien::Build; use Alien::Build::Plugin::PkgConfig::PP; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); $ENV{PKG_CONFIG_PATH} = path('corpus/lib/pkgconfig')->absolute->stringify; $ENV{PKG_CONFIG_LIBDIR} = ''; skip_all 'test requires PkgConfig 0.14026' unless eval { require PkgConfig; PkgConfig->VERSION(0.14026) }; subtest 'available' => sub { local $INC{'PkgConfig.pm'} = __FILE__; subtest 'new enough' => sub { local $PkgConfig::VERSION = '0.14026'; is(Alien::Build::Plugin::PkgConfig::PP->available, T()); }; subtest 'too old!' => sub { local $PkgConfig::VERSION = '0.14025'; is(Alien::Build::Plugin::PkgConfig::PP->available, F()); }; }; sub build { my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; my $plugin = Alien::Build::Plugin::PkgConfig::PP->new(@_); $plugin->init($meta); ($build, $meta, $plugin); } note "PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}"; subtest 'system not available' => sub { my($build, $meta, $plugin) = build('bogus'); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'version requirements' => sub { subtest 'atleast_version or minimum_version' => sub { subtest 'old name bad' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'old name good (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'old name good (much older)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.1.1', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'atleast_version bad' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', atleast_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'atleast_version good (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', atleast_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'atleast_version good (older)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', atleast_version => '1.1.1', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; }; subtest 'exact' => sub { subtest 'exact version (less)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', exact_version => '1.2.2', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'exact version (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', exact_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'exact version (more)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', exact_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; }; subtest 'max_version' => sub { subtest 'max version (lot less)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.0.0', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'max version (less)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.2.2', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'share' ); }; subtest 'max version (exact)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'max version (more)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '1.2.4', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; subtest 'max version (lots more)' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', max_version => '3.3.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); }; }; }; subtest 'system available, okay' => sub { my($build, $meta, $plugin) = build( pkg_name => 'foo', minimum_version => '1.2.3', ); my($out, $type) = capture_merged { $build->probe }; note $out; is( $type, 'system' ); return unless $type eq 'system'; note capture_merged { $build->build; () }; is( $build->runtime_prop, hash { field cflags => '-fPIC -I/test/include/foo '; field libs => '-L/test/lib -lfoo '; field libs_static => '-L/test/lib -lfoo -lbar -lbaz '; field version => '1.2.3'; etc; }, ); note "cflags_static = @{[ $build->runtime_prop->{cflags_static} ]}"; is( $build->runtime_prop->{alt}, U(), ); }; subtest 'system multiple' => sub { subtest 'all found in system' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::PP' => ( pkg_name => [ 'xor', 'xor-chillout' ], ); }; alien_install_type_is 'system'; my $alien = alien_build_ok; use Alien::Build::Util qw( _dump ); note _dump($alien->runtime_prop); is( $alien->runtime_prop, hash { field libs => '-L/test/lib -lxor '; field libs_static => '-L/test/lib -lxor -lxor1 '; field cflags => '-I/test/include/xor '; field cflags_static => '-I/test/include/xor -DXOR_STATIC '; field version => '4.2.1'; field alt => hash { field 'xor' => hash { field libs => '-L/test/lib -lxor '; field libs_static => '-L/test/lib -lxor -lxor1 '; field cflags => '-I/test/include/xor '; field cflags_static => '-I/test/include/xor -DXOR_STATIC '; field version => '4.2.1'; end; }; field 'xor-chillout' => hash { field libs => '-L/test/lib -lxor-chillout '; field libs_static => '-L/test/lib -lxor-chillout '; field cflags => '-I/test/include/xor '; field cflags_static => '-I/test/include/xor -DXOR_STATIC '; field version => '4.2.2'; }; end; }; etc; }, ); }; }; subtest 'prereqs' => sub { subtest 'are specified when user asks for plugin directly' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::PP' => 'foo'; }; is( $build->requires('configure'), hash { field 'PkgConfig' => T(); etc; }, 'prereqs' ); }; subtest 'are not specified when user asks for plugin IN-directly' => sub { local $ENV{ALIEN_BUILD_PKG_CONFIG} = 'PkgConfig::PP'; my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig' => 'foo'; }; is( $build->requires('configure'), hash { field 'PkgConfig' => DNE(); field 'PkgConfig::LibPkgConf::Client' => DNE(); field 'PkgConfig::LibPkgConf::Util' => DNE(); etc; }, 'prereqs' ); }; }; alien_subtest 'set env' => sub { skip_all 'test requires Archive::Tar' unless eval { require Archive::Tar; 1 }; my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::PP' => ( pkg_name => 'totally-bogus-pkg-config-name' ); probe sub { 'share' }; share { plugin 'Download::Foo'; build sub { my($build) = @_; $build->log("PKG_CONFIG = $ENV{PKG_CONFIG}"); 1; }; meta->around_hook( gather_share => sub { 1; }, ); }; }; alien_build_ok; }; alien_subtest 'multiple probes' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'PkgConfig::PP' => ( pkg_name => 'xor', exact_version => '1.2.3', ); probe sub { 'system' }; }; alien_install_type_is 'system'; alien_build_ok; is $build, object { call runtime_prop => hash { field cflags => DNE(); field libs => DNE(); field cflags_static => DNE(); field libs_static => DNE(); etc; }; }, ; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_prefer_badversion.t000644 000000 000000 00000003331 14710030646 023547 0ustar00rootroot000000 000000 use 5.008004; use lib 'corpus/lib'; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Prefer::BadVersion; use Path::Tiny qw( path ); eval { require Sort::Versions }; skip_all 'test requires Sort::Versions' if $@; $Alien::Build::Plugin::Prefer::BadVersion::VERSION ||= '1.05'; subtest 'compiles okay' => sub { alienfile_ok q{ use alienfile; plugin 'Prefer::BadVersion' => '1.2.3'; }; }; subtest 'filter is required' => sub { eval { alienfile q{ use alienfile; plugin 'Prefer::BadVersion'; } }; like $@, qr/The filter property is required for the Prefer::BadVersion plugin/; }; subtest 'filters out string version' => sub { alienfile_ok q{ use alienfile; share { plugin 'Fetch::Foo' => [ qw( 1.2.3 1.2.4 1.2.5 ) ]; plugin 'Prefer::SortVersions'; plugin 'Prefer::BadVersion' => '1.2.5'; }; }; my $file = alien_download_ok; is(path($file)->slurp, "data:foo-1.2.4.tar.gz"); }; subtest 'filters out list version' => sub { alienfile_ok q{ use alienfile; share { plugin 'Fetch::Foo' => [ qw( 1.2.3 1.2.4 1.2.5 ) ]; plugin 'Prefer::SortVersions'; plugin 'Prefer::BadVersion' => ['1.2.4', '1.2.5']; }; }; my $file = alien_download_ok; is(path($file)->slurp, "data:foo-1.2.3.tar.gz"); }; subtest 'filters out code ref' => sub { alienfile_ok q{ use alienfile; share { plugin 'Fetch::Foo' => [ qw( 1.2.3 1.2.4 1.2.5 ) ]; plugin 'Prefer::SortVersions'; plugin 'Prefer::BadVersion' => sub { my($file) = @_; $file->{version} eq '1.2.5'; }; }; }; my $file = alien_download_ok; is(path($file)->slurp, "data:foo-1.2.4.tar.gz"); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_prefer_goodversion.t000644 000000 000000 00000003341 14710030646 023752 0ustar00rootroot000000 000000 use 5.008004; use lib 'corpus/lib'; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Prefer::GoodVersion; use Path::Tiny qw( path ); eval { require Sort::Versions }; skip_all 'test requires Sort::Versions' if $@; $Alien::Build::Plugin::Prefer::GoodVersion::VERSION ||= '1.44'; subtest 'compiles okay' => sub { alienfile_ok q{ use alienfile; plugin 'Prefer::GoodVersion' => '1.2.3'; }; }; subtest 'filter is required' => sub { eval { alienfile q{ use alienfile; plugin 'Prefer::GoodVersion'; } }; like $@, qr/The filter property is required for the Prefer::GoodVersion plugin/; }; subtest 'filters out string version' => sub { alienfile_ok q{ use alienfile; share { plugin 'Fetch::Foo' => [ qw( 1.2.3 1.2.4 1.2.5 ) ]; plugin 'Prefer::SortVersions'; plugin 'Prefer::GoodVersion' => '1.2.4'; }; }; my $file = alien_download_ok; is(path($file)->slurp, "data:foo-1.2.4.tar.gz"); }; subtest 'filters out list version' => sub { alienfile_ok q{ use alienfile; share { plugin 'Fetch::Foo' => [ qw( 1.2.3 1.2.4 1.2.5 ) ]; plugin 'Prefer::SortVersions'; plugin 'Prefer::GoodVersion' => ['1.2.4', '1.2.3']; }; }; my $file = alien_download_ok; is(path($file)->slurp, "data:foo-1.2.4.tar.gz"); }; subtest 'filters out code ref' => sub { alienfile_ok q{ use alienfile; share { plugin 'Fetch::Foo' => [ qw( 1.2.3 1.2.4 1.2.5 ) ]; plugin 'Prefer::SortVersions'; plugin 'Prefer::GoodVersion' => sub { my($file) = @_; $file->{version} eq '1.2.4'; }; }; }; my $file = alien_download_ok; is(path($file)->slurp, "data:foo-1.2.4.tar.gz"); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_prefer_sortversions.t000644 000000 000000 00000004410 14710030646 024172 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Prefer::SortVersions; use Path::Tiny qw( path ); use Alien::Build::Util qw( _dump ); subtest 'updates requires' => sub { my $plugin = Alien::Build::Plugin::Prefer::SortVersions->new; my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); is( $build->requires('share')->{'Sort::Versions'}, 0 ); note _dump $meta; }; subtest 'prefer' => sub { my $builder = sub { my $plugin = Alien::Build::Plugin::Prefer::SortVersions->new(@_); my $build = alienfile filename => 'corpus/blank/alienfile'; my $meta = $build->meta; $plugin->init($meta); eval { $build->load_requires('share') }; $@ ? () : wantarray ? ($build,$meta) : $build; ## no critic }; my $make_list = sub { return { type => 'list', list => [ map { my $h = { filename => $_, url => "http://example.test/foo/bar/$_" }; } @_ ], }; }; my $make_cmp = sub { return { type => 'list', list => [ map { hash { field filename => $_; field url => "http://example.test/foo/bar/$_"; field version => T(); }, } @_ ], }; }; skip_all 'test requires Sort::Versions' unless $builder->(); subtest 'default settings' => sub { my $build = $builder->(); my $res = $build->prefer($make_list->(qw(roger-0.0.0.tar.gz abc-2.3.4.tar.gz xyz-1.0.0.tar.gz))); note _dump($res); is( $res, $make_cmp->(qw( abc-2.3.4.tar.gz xyz-1.0.0.tar.gz roger-0.0.0.tar.gz )) ); }; subtest 'filter' => sub { my $build = $builder->(filter => qr/abc|xyz/); my $res = $build->prefer($make_list->(qw(roger-0.0.0.tar.gz abc-2.3.4.tar.gz xyz-1.0.0.tar.gz))); note _dump($res); is( $res, $make_cmp->(qw( abc-2.3.4.tar.gz xyz-1.0.0.tar.gz )) ); }; subtest 'version regex' => sub { my $build = $builder->(qr/^foo-[0-9\.]+-bar-([0-9\.](?:[0-9\.]*[0-9])?)/); my $res = $build->prefer($make_list->(qw( foo-10.0-bar-0.1.0.tar.gz foo-5-bar-2.1.0.tar.gz bogus.tar.gz ))); note _dump($res); is( $res, $make_cmp->(qw( foo-5-bar-2.1.0.tar.gz foo-10.0-bar-0.1.0.tar.gz )) ); }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_probe_cbuilder.t000644 000000 000000 00000015104 14710030646 023031 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use lib 't/lib'; use MyTest::System; use Alien::Build::Plugin::Probe::CBuilder; use Capture::Tiny qw( capture_merged ); use Path::Tiny qw( path ); subtest 'basic' => sub { my $mock = mock 'ExtUtils::CBuilder'; my @args_new; my @args_compile; my @args_link_executable; $mock->add('new' => sub { shift; @args_new = @_; bless {}, 'ExtUtils::CBuilder'; }); $mock->add('compile' => sub { shift; @args_compile = @_; 'mytest.o'; }); $mock->add('link_executable' => sub { shift; @args_link_executable = @_; 'mytest'; }); my $build = alienfile_ok q{ use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-I/usr/local/include', libs => '-L/usr/local/lib -lfoo', options => { foo1 => 1, bar1 => 2 }, ); }; my $gard = system_fake './mytest' => sub { 0 }, 'mytest' => sub { 0 }, ; alien_build_ok; alien_install_type_is 'system'; is( $build->runtime_prop->{cflags}, '-I/usr/local/include ', 'cflags' ); is( $build->runtime_prop->{libs}, '-L/usr/local/lib -lfoo ', 'libs' ); is( { @args_new }, { foo1 => 1, bar1 => 2 }, 'options passed to new' ); is( { @args_compile }, hash { field source => T(); field extra_compiler_flags => '-I/usr/local/include'; etc; }, ); is( { @args_link_executable }, hash { field objects => array { item 'mytest.o'; end; }; field extra_linker_flags => '-L/usr/local/lib -lfoo'; etc; }, ); }; subtest 'program' => sub { my $mock = mock 'ExtUtils::CBuilder'; $mock->add('new' => sub { bless {}, 'ExtUtils::CBuilder'; }); my $source; $mock->add('compile' => sub { my(undef, %args) = @_; $source = path($args{source})->slurp; 'mytest.o'; }); $mock->add('link_executable' => sub { 'mytest'; }); my $build = alienfile q{ use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-I/usr/local/include', libs => '-L/usr/local/lib -lfoo', program => 'int main(int foo1, char *foo2[]) { return 0; }', ); }; my $gard = system_fake './mytest' => sub { 0 }, 'mytest' => sub { 0 }, ; note capture_merged { $build->probe; () }; is( $build->install_type, 'system', 'is system' ); is($source, 'int main(int foo1, char *foo2[]) { return 0; }', 'compiled with correct source'); }; subtest 'program' => sub { my $mock = mock 'ExtUtils::CBuilder'; $mock->add('new' => sub { bless {}, 'ExtUtils::CBuilder'; }); $mock->add('compile' => sub { my(undef, %args) = @_; 'mytest.o'; }); $mock->add('link_executable' => sub { 'mytest'; }); my $build = alienfile_ok q{ use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-I/usr/local/include', libs => '-L/usr/local/lib -lfoo', program => 'int main() { printf("version = \'1.2.3\'\n"); return 0; }', version => qr/version = '(.*?)'/, ); meta->around_hook( probe => sub { my($orig, $build) = @_; my $install_type = $build->$orig; push @{ $build->install_prop->{probe_version_prop} }, $build->hook_prop->{version}; $install_type; } ); }; my $gard = system_fake './mytest' => sub { print "version = '1.2.3'\n"; 0 }, 'mytest' => sub { print "version = '1.2.3'\n"; 0 }, ; alien_build_ok; alien_install_type_is 'system'; is( $build->runtime_prop->{version}, '1.2.3', 'version matches' ); is( $build->install_prop->{probe_version_prop}, ['1.2.3'], 'set probe hook prop' ); }; subtest 'fail' => sub { my $mock = mock 'ExtUtils::CBuilder'; $mock->add('new' => sub { bless {}, 'ExtUtils::CBuilder'; }); subtest 'compile' => sub { $mock->add('compile' => sub { my(undef, %args) = @_; die "error building mytest.o from mytest.c"; }); my $build = alienfile_ok q{ use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-DX=1', libs => '-lfoo', ); probe sub { my($build) = @_; # some other plugin tries system # but doesn't add a gather step 'system'; }; }; alien_install_type_is 'system'; }; }; subtest 'atleast_version_pass' => sub { my $mock = mock 'ExtUtils::CBuilder'; $mock->add('new' => sub { bless {}, 'ExtUtils::CBuilder'; }); $mock->add('compile' => sub { my(undef, %args) = @_; 'mytest.o'; }); $mock->add('link_executable' => sub { 'mytest'; }); my $build = alienfile_ok q{ use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-I/usr/local/include', libs => '-L/usr/local/lib -lfoo', program => 'int main() { printf("version = \'1.2.3\'\n"); return 0; }', version => qr/version = '(.*?)'/, atleast_version => '0.1.0', ); meta->around_hook( probe => sub { my($orig, $build) = @_; my $install_type = $build->$orig; push @{ $build->install_prop->{probe_version_prop} }, $build->hook_prop->{version}; $install_type; } ); }; my $gard = system_fake './mytest' => sub { print "version = '1.2.3'\n"; 0 }, 'mytest' => sub { print "version = '1.2.3'\n"; 0 }, ; alien_build_ok; alien_install_type_is 'system'; is( $build->runtime_prop->{version}, '1.2.3', 'version matches' ); is( $build->install_prop->{probe_version_prop}, ['1.2.3'], 'set probe hook prop' ); }; subtest 'atleast_version_fail' => sub { my $mock = mock 'ExtUtils::CBuilder'; $mock->add('new' => sub { bless {}, 'ExtUtils::CBuilder'; }); $mock->add('compile' => sub { my(undef, %args) = @_; 'mytest.o'; }); $mock->add('link_executable' => sub { 'mytest'; }); my $build = alienfile_ok q{ use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-I/usr/local/include', libs => '-L/usr/local/lib -lfoo', program => 'int main() { printf("version = \'1.2.3\'\n"); return 0; }', version => qr/version = '(.*?)'/, atleast_version => '2.1.0', ); meta->around_hook( probe => sub { my($orig, $build) = @_; my $install_type = $build->$orig; push @{ $build->install_prop->{probe_version_prop} }, $build->hook_prop->{version}; $install_type; } ); }; #alien_build_ok; alien_install_type_is 'share'; is( $build->runtime_prop->{version}, undef, 'version matches' ); is( $build->install_prop->{probe_version_prop}, undef, 'set probe hook prop' ); }; done_testing; package ExtUtils::CBuilder; BEGIN { $INC{'ExtUtils/CBuilder.pm'} = __FILE__ } Alien-Build-2.84/t/alien_build_plugin_probe_cbuilder__live.t000644 000000 000000 00000003005 14710030646 024204 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Probe::CBuilder; use Capture::Tiny qw( capture_merged ); skip_all 'CI only' unless defined $ENV{CIPSOMETHING} && $ENV{CIPSOMETHING} eq 'true'; subtest 'live test' => sub { require ExtUtils::CBuilder; my $build = alienfile_ok q{ use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-I/usr/local/include ', libs => '-L/usr/local/lib ', ); }; alien_build_ok; alien_install_type_is 'system'; is( $build->runtime_prop, hash { field cflags => '-I/usr/local/include '; field libs => '-L/usr/local/lib '; etc; }, ); }; alien_subtest 'multiple probes' => sub { require ExtUtils::CBuilder; my $build = alienfile_ok q{ use alienfile; plugin 'Probe::CBuilder' => ( cflags => '-I/usr/local/include ', libs => '-L/usr/local/lib ', ); probe sub { 'system' }; my $count = 0; meta->around_hook(probe => sub { my $orig = shift; my $build = shift; my $type = $orig->($build, @_); if($count++ == 0) { Test2::V0::note("first convert $type to share"); return 'share'; } else { Test2::V0::note("finally return $type"); return $type; } }); }; alien_install_type_is 'system'; alien_build_ok; is( $build->runtime_prop, hash { field cflags => DNE(); field libs => DNE(); etc; }, ); }; done_testing; Alien-Build-2.84/t/alien_build_plugin_probe_commandline.t000644 000000 000000 00000012102 14710030646 023521 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use lib 't/lib'; use MyTest::System; use Alien::Build::Plugin::Probe::CommandLine; use Capture::Tiny qw( capture_merged ); sub cap (&) { my($code) = @_; my($out, $ret) = capture_merged { $code->() }; note $out if $out; $ret; } sub build { my $build = alienfile_ok q{ use alienfile }; my $meta = $build->meta; if(ref $_[-1] eq 'CODE') { my $code = pop; $code->($build, $meta); } my $plugin = Alien::Build::Plugin::Probe::CommandLine->new(@_); $plugin->init($meta); ($build, $plugin, $meta); } subtest 'basic existence' => sub { my $guard = system_fake 'foo' => sub { return 0 }, ; subtest 'it is there' => sub { my($build) = build('foo'); is cap { $build->probe }, 'system', 'is system'; }; subtest 'it is not there' => sub { my($build) = build('bar'); is cap { $build->probe }, 'share', 'is share'; }; }; subtest 'args' => sub { my $called = 0; my @args; my $guard = system_fake 'foo' => sub { $called = 1; @args = @_; return 0 }, ; my($build) = build(command => 'foo', args => [1,2,3], match => qr// ); is cap { $build->probe }, 'system', 'is system'; is $called, 1, 'was called'; is \@args, [1,2,3], 'args are passed in'; }; subtest 'secondary' => sub { my $lib = 0; my $run = 0; my $guard = system_fake 'foo' => sub { $run = 1; return 0 }, ; subtest 'libs + command okay' => sub { $lib = 0; $run = 0; my($build) = build(command => 'foo', secondary => 1, match => qr//, sub { my($build, $meta) = @_; $meta->register_hook(probe => sub { $lib = 1; 'system'; }); }); is(cap { $build->probe }, 'system'); is $run, 1, 'run'; is $lib, 1, 'lib'; }; subtest 'libs ok + command bad' => sub { $lib = 0; $run = 0; my($build) = build(command => 'bar', secondary => 1, match => qr//, sub { my($build, $meta) = @_; $meta->register_hook(probe => sub { $lib = 1; 'system'; }); }); is(cap { $build->probe }, 'share'); is $lib, 1, 'lib'; }; subtest 'libs bad + command okay' => sub { $lib = 0; $run = 0; my($build) = build(command => 'foo', secondary => 1, match => qr//, sub { my($build, $meta) = @_; $meta->register_hook(probe => sub { $lib = 1; 'share'; }); }); is(cap { $build->probe }, 'share'); is $run, 0, 'run'; is $lib, 1, 'lib'; }; subtest 'libs bad + command bad' => sub { $lib = 0; $run = 0; my($build) = build(command => 'bar', secondary => 1, match => qr//, sub { my($build, $meta) = @_; $meta->register_hook(probe => sub { $lib = 1; 'share'; }); }); is(cap { $build->probe }, 'share'); is $run, 0, 'run'; is $lib, 1, 'lib'; }; }; subtest 'match + version' => sub { my $guard = system_fake 'foo' => sub { print "Froodle Foomaker version 1.00\n"; return 0 }, ; subtest 'match good' => sub { my($build) = build(command => 'foo', match => qr/Froodle/); is cap { $build->probe }, 'system'; }; subtest 'match bad' => sub { my($build) = build(command => 'foo', match => qr/Droodle/); is cap { $build->probe }, 'share'; }; subtest 'version found' => sub { my($build) = build(command => 'foo', version => qr/version ([0-9\.]+)/); is cap { $build->probe }, 'system'; is $build->runtime_prop->{version}, '1.00'; }; subtest 'version unfound' => sub { my($build) = build(command => 'foo', version => qr/version = ([0-9\.]+)/); is cap { $build->probe }, 'system'; is $build->runtime_prop->{version}, undef; }; subtest 'atleast_version satisfied' => sub { my($build) = build( command => 'foo', version => qr/version ([0-9\.]+)/, atleast_version => '0.5.0' ); is cap { $build->probe }, 'system'; is $build->runtime_prop->{version}, '1.00'; }; subtest 'atleast_version not satisfied' => sub { my($build) = build( command => 'foo', version => qr/version ([0-9\.]+)/, atleast_version => '1.5.0' ); is cap { $build->probe }, 'share'; is $build->runtime_prop->{version}, undef; }; }; subtest 'match_stderr + version_stderr' => sub { my $guard = system_fake 'foo' => sub { print STDERR "Froodle Foomaker version 1.00\n"; return 0 }, ; subtest 'match good' => sub { my($build) = build(command => 'foo', match_stderr => qr/Froodle/); is cap { $build->probe }, 'system'; }; subtest 'match bad' => sub { my($build) = build(command => 'foo', match_stderr => qr/Droodle/); is cap { $build->probe }, 'share'; }; subtest 'version found' => sub { my($build) = build(command => 'foo', version_stderr => qr/version ([0-9\.]+)/); is cap { $build->probe }, 'system'; is $build->runtime_prop->{version}, '1.00'; }; subtest 'version unfound' => sub { my($build) = build(command => 'foo', version_stderr => qr/version = ([0-9\.]+)/); is cap { $build->probe }, 'system'; is $build->runtime_prop->{version}, undef; }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_probe_vcpkg.t000644 000000 000000 00000011122 14710030646 022346 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Probe::Vcpkg; use Path::Tiny; skip_all 'Test requires Win32::Vcpkg 0.02' unless eval { require Win32::Vcpkg; Win32::Vcpkg->VERSION('0.02') }; $ENV{PERL_WIN32_VCPKG_ROOT} = path('corpus','vcpkg', 'r1')->absolute->stringify; $ENV{PERL_WIN32_VCPKG_DEBUG} = 0; $ENV{VCPKG_DEFAULT_TRIPLET} = 'x64-windows'; alien_subtest 'non vc' => sub { require Alien::Build::Plugin::Core::Setup; my $mock = mock 'Alien::Build::Plugin::Core::Setup' => ( after => [ _platform => sub { my(undef, $hash) = @_; $hash->{compiler_type} = 'unix'; }, ], ); alienfile_ok q{ use alienfile; plugin 'Probe::Vcpkg' => ( lib => ['foo'], ); }; alien_install_type_is 'share'; }; subtest 'vc' => sub { my $mock = mock 'Alien::Build::Plugin::Core::Setup' => ( after => [ _platform => sub { my(undef, $hash) = @_; $hash->{compiler_type} = 'microsoft'; return; }, ], ); alien_subtest 'lib = foo' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Probe::Vcpkg' => ( lib => ['foo'], ); }; alien_install_type_is 'system'; alien_build_ok; is( $build->runtime_prop, hash { field version => 'unknown'; field cflags => T(); field libs => T(); field ffi_name => DNE(); etc; }, ); note "version = ", $build->runtime_prop->{version}; note "cflags = ", $build->runtime_prop->{cflags}; note "libs = ", $build->runtime_prop->{libs}; }; alien_subtest 'lib = bar' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Probe::Vcpkg' => ( lib => ['bar'], ); }; alien_install_type_is 'share'; }; alien_subtest 'ffi_name' => sub { local $Alien::Build::Plugin::Probe::Vcpkg::VERSION = '2.14'; my $build = alienfile_ok q{ use alienfile; plugin 'Probe::Vcpkg' => ( lib => ['foo'], ffi_name => 'baz', ); }; alien_install_type_is 'system'; alien_build_ok; is( $build->runtime_prop, hash { field version => 'unknown'; field cflags => T(); field libs => T(); field ffi_name => 'baz'; etc; }, ); }; alien_subtest 'name = libffi' => sub { local $ENV{PERL_WIN32_VCPKG_ROOT} = path('corpus','vcpkg', 'r2')->absolute->stringify; my $build = alienfile_ok q{ use alienfile; plugin 'Probe::Vcpkg' => ( name => 'libffi', ); }; alien_install_type_is 'system'; alien_build_ok; is( $build->runtime_prop, hash { field version => '3.3'; field cflags => T(); field libs => T(); field ffi_name => DNE(); etc; }, ); note "version = ", $build->runtime_prop->{version}; note "cflags = ", $build->runtime_prop->{cflags}; note "libs = ", $build->runtime_prop->{libs}; }; alien_subtest 'libffi' => sub { local $ENV{PERL_WIN32_VCPKG_ROOT} = path('corpus','vcpkg', 'r2')->absolute->stringify; my $build = alienfile_ok q{ use alienfile; plugin 'Probe::Vcpkg' => 'libffi'; }; alien_install_type_is 'system'; alien_build_ok; is( $build->runtime_prop, hash { field version => '3.3'; field cflags => T(); field libs => T(); field ffi_name => DNE(); etc; }, ); note "version = ", $build->runtime_prop->{version}; note "cflags = ", $build->runtime_prop->{cflags}; note "libs = ", $build->runtime_prop->{libs}; }; alien_subtest 'multiple probes' => sub { local $ENV{PERL_WIN32_VCPKG_ROOT} = path('corpus','vcpkg', 'r2')->absolute->stringify; my $build = alienfile_ok q{ use alienfile; plugin 'Probe::Vcpkg' => 'libffi'; probe sub { 'system' }; my $count = 0; meta->around_hook(probe => sub { my $orig = shift; my $build = shift; my $type = $orig->($build, @_); if($count++ == 0) { Test2::V0::note("first convert $type to share"); return 'share'; } else { Test2::V0::note("finally return $type"); return $type; } }); }; alien_install_type_is 'system'; alien_build_ok; is( $build->runtime_prop, hash { field version => DNE(); field cflags => DNE(); field libs => DNE(); etc; }, ); }; }; done_testing; Alien-Build-2.84/t/alien_build_plugin_test_mock.t000644 000000 000000 00000015325 14710030646 022046 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build::Plugin::Test::Mock; use Path::Tiny qw( path ); subtest 'basic' => sub { alienfile_ok q{ use alienfile; plugin 'Test::Mock'; }; }; subtest 'probe' => sub { subtest 'share' => sub { alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( 'probe' => 'share' ); }; alien_install_type_is 'share'; }; subtest 'share' => sub { alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( 'probe' => 'system' ); }; alien_install_type_is 'system'; }; subtest 'share' => sub { alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( 'probe' => 'die' ); }; alien_install_type_is 'share'; }; }; subtest 'download' => sub { subtest 'default' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( probe => 'share', download => 1, ); }; alien_download_ok; my $tarball = path($build->install_prop->{download}); is( $tarball, object { call basename => 'foo-1.00.tar.gz'; call slurp => path('corpus/dist/foo-1.00.tar.gz')->slurp; }, ); }; subtest 'override' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( download => { 'bar-1.00.tar.gz' => 'fauxtar' }, ); }; alien_download_ok; my $tarball = path($build->install_prop->{download}); is( $tarball, object { call basename => 'bar-1.00.tar.gz'; call slurp => 'fauxtar'; }, ); }; }; subtest 'extract' => sub { subtest 'default' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( probe => 'share', download => 1, extract => 1, ); }; alien_extract_ok; my $dir = path($build->install_prop->{extract}); is( $dir, object { call basename => 'foo-1.00'; call [child => 'configure' ] => object { call slurp => path('corpus/dist/foo-1.00/configure')->slurp; }; call [child => 'foo.c' ] => object { call slurp => path('corpus/dist/foo-1.00/foo.c')->slurp; }; }, ); }; subtest 'override' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( probe => 'share', download => 1, extract => { 'bar-1.00' => { one => 1, two => 2, three => 3, }, }, ); }; alien_extract_ok; my $dir = path($build->install_prop->{extract}); is( $dir, object { call basename => 'bar-1.00'; call_list sub { sort shift->children } => [ map { object { call basename => $_ } } sort qw( one two three ) ]; call [ child => 'one' ] => object { call slurp => 1 }; call [ child => 'two' ] => object { call slurp => 2 }; call [ child => 'three' ] => object { call slurp => 3 }; }, ); }; }; subtest 'build' => sub { subtest 'default' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( probe => 'share', download => 1, extract => 1, build => 1, ); }; alien_build_ok; is( path($build->install_prop->{_ab_build_share}), object { call_list sub { sort shift->children } => [ map { object { call basename => $_ } } sort qw( configure foo.c foo.o libfoo.a ) ]; }, ); is( path($build->install_prop->{prefix}), object { call_list sub { sort shift->children } => [ map { object { call basename => $_ } } sort qw( _alien lib ) ]; call [ child => 'lib' ] => object { call_list sub { sort shift->children } => [ map { object { call basename => $_ } } sort qw( libfoo.a pkgconfig ) ]; call [ child => 'pkgconfig' ] => object { call_list sub { sort shift->children } => [ map { object { call basename => $_ } } sort qw( foo.pc ) ]; call [ child => 'foo.pc' ] => object { call slurp => match qr/-lfoo/; }; }; }; }, ); }; subtest 'override' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( probe => 'share', download => 1, extract => 1, build => [ { file1 => 'content1', }, { file2 => 'content2', }, ], ); }; alien_build_ok; is( path($build->install_prop->{_ab_build_share}), object { call_list sub { sort shift->children } => [ map { object { call basename => $_ } } sort qw( file1 configure foo.c ) ]; call [ child => 'file1' ] => object { call slurp => 'content1'; }; }, ); is( path($build->install_prop->{prefix}), object { call_list sub { sort shift->children } => [ map { object { call basename => $_ } } sort qw( _alien file2 ) ]; call [ child => 'file2' ] => object { call slurp => 'content2'; }; }, ); }; }; subtest 'gather' => sub { foreach my $install_type (qw( share system )) { subtest $install_type => sub { subtest 'default' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( download => 1, extract => 1, build => 1, gather => 1, ); }; $build->meta->register_hook(probe => sub { $install_type }); alien_install_type_is $install_type; alien_build_ok; is( $build->runtime_prop, hash { field cflags => match qr/^-I/; field libs => match qr/^-L.*-lfoo$/; etc; }, ); note "cflags = @{[ $build->runtime_prop->{cflags} ]}"; note "libs = @{[ $build->runtime_prop->{libs} ]}"; }; }; subtest $install_type => sub { subtest 'override' => sub { my $build = alienfile_ok q{ use alienfile; plugin 'Test::Mock' => ( download => 1, extract => 1, build => 1, gather => { cflags => '-I/foo/include', libs => '-L/foo/lib -lfoo' }, ); }; $build->meta->register_hook(probe => sub { $install_type }); alien_install_type_is $install_type; alien_build_ok; is( $build->runtime_prop, hash { field cflags => '-I/foo/include'; field libs => '-L/foo/lib -lfoo'; etc; }, ); }; }; }; }; done_testing; Alien-Build-2.84/t/alien_build_rc.t000644 000000 000000 00000000701 14710030646 017074 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; subtest 'preload code ref' => sub { my $meta1; my $meta2; no warnings 'once'; local @Alien::Build::rc::PRELOAD = (sub { ($meta1) = @_; }); local @Alien::Build::rc::POSTLOAD = (sub { ($meta2) = @_; }); my $build = alienfile_ok q{ use alienfile; }; isa_ok $meta1, 'Alien::Build::Meta'; isa_ok $meta2, 'Alien::Build::Meta'; }; done_testing; Alien-Build-2.84/t/alien_build_rc__prepostload.t000644 000000 000000 00000001546 14710030646 021657 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build; use Test::Alien::Build; subtest 'basic' => sub { alien_rc q{ use strict; use warnings; print "package is @{[ __PACKAGE__ ]}\n"; logx "hey"; our $run_basic_pl; $run_basic_pl = 1; preload 'Foo::Bar'; postload 'Baz::Frooble'; 1; }; my $in_foobar; my $in_bazfrooble; my $foobar = mock 'Alien::Build::Plugin::Foo::Bar' => ( override => [ init => sub { $in_foobar++ }], ); my $frooble = mock 'Alien::Build::Plugin::Baz::Frooble' => ( override => [ init => sub { $in_bazfrooble++ }], ); my $build = alienfile_ok q{ use alienfile; }; is $in_foobar, 1; is $in_bazfrooble, 1; }; done_testing; package Alien::Build::Plugin::Foo::Bar; use Alien::Build::Plugin; package Alien::Build::Plugin::Baz::Frooble; use Alien::Build::Plugin; Alien-Build-2.84/t/alien_build_rc__prepostload_plugin.t000644 000000 000000 00000001213 14710030646 023224 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; { package Alien::Build::Plugin::Foo::Foo; use Alien::Build::Plugin; has arg => -1; sub init { my($self, $meta) = @_; push @{ $meta->prop->{test} }, $self->arg; }; } subtest 'basic' => sub { alien_rc q{ preload_plugin 'Foo::Foo', arg => 10; postload_plugin 'Foo::Foo', arg => 12; }; my $build = alienfile_ok q{ use alienfile; plugin 'Foo::Foo', arg => 11; }; is( $build, object { call meta_prop => hash { field test => [ 10,11,12 ]; etc; }; }, 'loaded in correct order'); }; done_testing; Alien-Build-2.84/t/alien_build_temp.t000644 000000 000000 00000000353 14710030646 017440 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Temp; my $dir = Alien::Build::Temp->newdir; ok -d $dir; note "dir = $dir"; my $fh = Alien::Build::Temp->new; close $fh; note "file = @{[ $fh->filename ]}"; done_testing; Alien-Build-2.84/t/alien_build_tempdir.t000644 000000 000000 00000001425 14710030646 020140 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build; use File::Temp qw( tempdir ); use Path::Tiny qw( path ); my $build = alienfile filename => 'corpus/blank/alienfile'; ok( -d $build->root, "root = @{[ $build->root ]}", ); subtest 'cleanup on empty' => sub { my $tmpdir = Alien::Build::TempDir->new($build, "foo"); ok( -d "$tmpdir", "tempdir = $tmpdir" ); my $str = "$tmpdir"; undef $tmpdir; ok( ! -d "$str", "directory removed" ); }; subtest 'do not cleanup non-empty' => sub { my $tmpdir = Alien::Build::TempDir->new($build, "bar"); ok( -d "$tmpdir", "tempdir = $tmpdir" ); my $str = "$tmpdir"; path("$str")->child('baz.txt')->touch; undef $tmpdir; ok( -d "$str", "directory not removed" ); }; done_testing; Alien-Build-2.84/t/alien_build_util.t000644 000000 000000 00000005263 14710030646 017455 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Util qw( _dump _mirror _destdir_prefix _ssl_reqs _has_ssl ); use Path::Tiny qw( path ); use File::Which qw( which ); use Capture::Tiny qw( capture_merged ); use Env qw( @PATH ); use Config; use File::Temp qw( tempdir ); subtest 'dump' => sub { my $dump = _dump { a => 1, b => 2 }, [ 1..2 ]; isnt $dump, ''; note $dump; }; subtest 'mirror' => sub { if($^O eq 'MSWin32' && ! which 'diff') { if(eval { require Alien::MSYS }) { unshift @PATH, Alien::MSYS::msys_path(); } } skip_all 'test requires diff' unless which 'diff'; my $tmp1 = Path::Tiny->tempdir("mirror_src_XXXX"); ok -d $tmp1, 'created source directory'; $tmp1->child($_)->mkpath foreach qw( bin etc lib lib/pkgconfig an/empty/one/as/well ); my $bin = $tmp1->child('bin/foomake'); $bin->spew("#!/bin/sh\necho hi\n"); eval { chmod 0755, $bin }; $tmp1->child('etc/foorc')->spew("# example\nfoo = 1\n"); my $lib = $tmp1->child('lib/libfoo.so.1.2.3'); $lib->spew('XYZ'); $tmp1->child('lib/pkgconfig/foo.pc')->spew('name=foo'); if($Config{d_symlink}) { foreach my $new (map { $tmp1->child("lib/libfoo$_") } qw( .so.1.2 .so.1 .so )) { my $old = 'libfoo.so.1.2.3'; symlink($old, $new->stringify) || die "unable to symlink $new => $old $!"; } } my $tmp2 = Path::Tiny->tempdir("mirror_dst_XXXX"); _mirror "$tmp1", "$tmp2", { empty_directory => 1 }; my($out, $exit) = capture_merged { system 'diff', '-r', "$tmp1", "$tmp2" }; is $exit, 0, 'diff -r returned true'; $exit ? diag $out : note $out if $out ne ''; if(-x $tmp1->child('bin/foomake')) { ok(-x $tmp2->child('bin/foomake'), 'dst bin/foomake is executable'); } subtest 'filter' => sub { my $tmp2 = Path::Tiny->tempdir("mirror_dst_XXXX"); note capture_merged { _mirror "$tmp1", "$tmp2", { filter => qr/^(bin|etc)\/.*$/, verbose => 1 }; }; ok( -f $tmp2->child('bin/foomake'), 'bin/foomake' ); ok( -f $tmp2->child('etc/foorc'), 'bin/foomake' ); ok( ! -f $tmp2->child('lib/libfoo.so.1.2.3'), 'lib/libfoo.so.1.2.3' ); }; }; subtest 'destdir_prefix' => sub { my($destdir) = tempdir( CLEANUP => 1 ); my($prefix) = tempdir( CLEANUP => 1 ); my $destdir_prefix = path _destdir_prefix($destdir, $prefix); note "destdir_prefix = $destdir_prefix"; eval { $destdir_prefix->mkpath }; is $@, ''; }; subtest '_ssl_reqs' => sub { is( _ssl_reqs, hash { field 'Net::SSLeay' => D(); field 'IO::Socket::SSL' => D(); etc; }, ); note _dump(_ssl_reqs); }; subtest '_has_ssl' => sub { eval { _has_ssl() }; is $@, ''; note "_has_ssl = @{[ _has_ssl() ]}"; }; done_testing; Alien-Build-2.84/t/alien_build_version_basic.t000644 000000 000000 00000005567 14710030646 021335 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Build::Version::Basic qw( version ); subtest 'basic' => sub { subtest 'new' => sub { my $version = Alien::Build::Version::Basic->new("1.2.3"); isa_ok $version, 'Alien::Build::Version::Basic'; is($version->as_string, '1.2.3'); is("$version", '1.2.3'); }; subtest 'version' => sub { my $version = version("1.2.3"); isa_ok $version, 'Alien::Build::Version::Basic'; is($version->as_string, '1.2.3'); is("$version", '1.2.3'); }; subtest 'bad version' => sub { eval { version('a.b.c') }; like $@, qr/invalud version: a\.b\.c/; }; }; subtest 'cmp method' => sub { my $version = version('1.2.3'); ok($version->cmp(version('1.2.2')) > 0); ok($version->cmp(version('1.2.3')) == 0); ok($version->cmp(version('1.2.4')) < 0); ok($version->cmp('1.2.2') > 0); ok($version->cmp('1.2.3') == 0); ok($version->cmp('1.2.4') < 0); eval { $version->cmp('a.b.c') }; like $@, qr/invalud version: a\.b\.c/; }; subtest 'cmp operator' => sub { my $version = version('1.2.3'); ok(($version <=> version('1.2.2')) > 0); ok(($version <=> version('1.2.3')) == 0); ok(($version <=> version('1.2.4')) < 0); ok(($version <=> '1.2.2') > 0); ok(($version <=> '1.2.3') == 0); ok(($version <=> '1.2.4') < 0); ok(($version cmp version('1.2.2')) > 0); ok(($version cmp version('1.2.3')) == 0); ok(($version cmp version('1.2.4')) < 0); ok(($version cmp '1.2.2') > 0); ok(($version cmp '1.2.3') == 0); ok(($version cmp '1.2.4') < 0); is($version > version('1.2.2'), T()); is($version > version('1.2.3'), F()); is($version >= version('1.2.3'), T()); is($version >= version('1.2.5'), F()); is($version == version('1.2.3'), T()); is($version == version('1.2.4'), F()); is($version != version('1.2.3'), F()); is($version != version('1.2.4'), T()); is($version < version('1.2.4'), T()); is($version < version('1.2.3'), F()); is($version <= version('1.2.3'), T()); is($version <= version('1.2.2'), F()); is($version > '1.2.2', T()); is($version > '1.2.3', F()); is($version >= '1.2.3', T()); is($version >= '1.2.5', F()); is($version == '1.2.3', T()); is($version == '1.2.4', F()); is($version != '1.2.3', F()); is($version != '1.2.4', T()); is($version < '1.2.4', T()); is($version < '1.2.3', F()); is($version <= '1.2.3', T()); is($version <= '1.2.2', F()); eval { my $bool = $version cmp 'a.b.x' }; like $@, qr/invalud version: a\.b\.x/; eval { my $bool = $version <=> 'a.b.y' }; like $@, qr/invalud version: a\.b\.y/; is($version == version('1.2.3.0.0.0'), T()); is($version == '1.2.3.0.0.0.0', T()); is(version('1.2.3.0.0.0.0') == $version, T()); is(($version <=> version('1.2.3.0.0.0')) == 0, T()); is(($version <=> '1.2.3.0.0.0') == 0, T()); is((version('1.2.3.0.0.0.0') <=> $version) == 0, T()); }; done_testing; Alien-Build-2.84/t/alien_role.t000644 000000 000000 00000000127 14710030646 016254 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Role (); ok 1; done_testing; Alien-Build-2.84/t/alien_util.t000644 000000 000000 00000000403 14710030646 016265 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Alien::Util qw( version_cmp ); subtest 'version_cmp' => sub { is( version_cmp('1.0.1', '1.0.1'), 0 ); is( version_cmp('1.0.1', '1.0.2'), -1 ); is( version_cmp('1.0.1', '1.0.0'), 1 ); }; done_testing; Alien-Build-2.84/t/alienfile.t000644 000000 000000 00000035641 14710030646 016104 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Alien::Build; use Path::Tiny qw( path ); use lib 'corpus/lib'; use Capture::Tiny qw( capture_merged ); use File::Temp qw( tempdir ); subtest 'compile examples' => sub { foreach my $alienfile (path('example')->children(qr/\.alienfile$/)) { my $build = eval { Alien::Build->load("$alienfile"); }; is $@, '', $alienfile->basename; } }; subtest 'non struct alienfile' => sub { eval { alienfile q{ use alienfile; my $foo = 'bar'; @{ "${foo}::${foo}" } = (); }; }; my $error = $@; isnt $error, '', 'throws error'; note "error = $error"; }; subtest 'warnings alienfile' => sub { my $warning = warning { alienfile q{ use alienfile; my $foo; my $bar = "$foo"; }; }; ok $warning; note $warning; }; subtest 'plugin' => sub { subtest 'basic' => sub { my $build = alienfile q{ use alienfile; plugin 'RogerRamjet'; }; is( $build->meta->prop, hash { field ramjet => 'roger'; field foo => 22; field bar => 'something generated'; field baz => undef; etc; } ); }; subtest 'default argument' => sub { my $build = alienfile q{ use alienfile; plugin 'RogerRamjet' => 'starscream'; }; is( $build->meta->prop, hash { field ramjet => 'roger'; field foo => 22; field bar => 'starscream'; field baz => undef; etc; } ); }; subtest 'other arguments' => sub { my $build = alienfile q{ use alienfile; plugin 'RogerRamjet' => ( foo => 42, bar => 'skywarp', baz => 'megatron', ); }; is( $build->meta->prop, hash { field ramjet => 'roger'; field foo => 42; field bar => 'skywarp'; field baz => 'megatron'; etc; } ); }; subtest 'sub package' => sub { my $build = alienfile q{ use alienfile; plugin 'NesAdvantage::Controller'; }; is($build->meta->prop->{nesadvantage}, 'controller'); }; subtest 'negotiate' => sub { my $build = alienfile q{ use alienfile; plugin 'NesAdvantage'; }; is($build->meta->prop->{nesadvantage}, 'negotiate'); }; subtest 'fully qualified class' => sub { my $build = alienfile q{ use alienfile; plugin '=Alien::Build::Plugin::RogerRamjet'; }; is( $build->meta->prop, hash { field ramjet => 'roger'; field foo => 22; field bar => 'something generated'; field baz => undef; etc; } ); }; }; subtest 'probe' => sub { subtest 'basic' => sub { my $build = alienfile q{ use alienfile; probe sub { my($build) = @_; $build->install_prop->{called_probe} = 1; 'share'; }; }; is($build->probe, 'share'); is($build->install_prop->{called_probe}, 1); }; subtest 'wrong block' => sub { eval { alienfile q{ use alienfile; sys { probe sub { }; }; }; }; like $@, qr/probe must not be in a system block/; }; }; subtest 'download' => sub { subtest 'basic' => sub { my $build = alienfile q{ use alienfile; use Path::Tiny qw( path ); probe sub { 'share' }; share { download sub { path('xor-1.00.tar.gz')->touch }; }; }; note capture_merged { $build->download; () }; my $download = path($build->install_prop->{download}); is( $download->basename, 'xor-1.00.tar.gz', ); }; subtest 'wrong block' => sub { eval { alienfile q{ use alienfile; sys { download sub {}; }; }; }; like $@, qr/download must be in a share block/; }; }; foreach my $hook (qw( fetch decode prefer extract build build_ffi )) { subtest "$hook" => sub { my(undef, $build) = capture_merged { alienfile qq{ use alienfile; share { $hook sub { }; }; }; }; ok( $build->meta->has_hook($hook) ); }; } subtest 'gather' => sub { subtest 'configure' => sub { eval { alienfile q{ use alienfile; configure { gather sub {}; } }; }; like $@, qr/gather is not allowed in configure block/; }; subtest 'system + share' => sub { my $build = alienfile q{ use alienfile; gather sub {}; }; is( $build->meta->has_hook('gather_system'), T() ); is( $build->meta->has_hook('gather_share'), T() ); }; subtest 'system' => sub { my $build = alienfile q{ use alienfile; sys { gather sub {} }; }; is( $build->meta->has_hook('gather_system'), T() ); is( $build->meta->has_hook('gather_share'), F() ); }; subtest 'share' => sub { my $build = alienfile q{ use alienfile; share { gather sub {} }; }; is( $build->meta->has_hook('gather_system'), F() ); is( $build->meta->has_hook('gather_share'), T() ); }; subtest 'share + gather_ffi' => sub { my(undef,$build) = capture_merged { alienfile q{ use alienfile; share { gather_ffi sub {} }; }; }; is( $build->meta->has_hook('gather_ffi'), T() ); }; subtest 'share + ffi gather' => sub { my $build = alienfile q{ use alienfile; share { ffi { gather sub {} } }; }; is( $build->meta->has_hook('gather_ffi'), T() ); }; subtest 'nada' => sub { my $build = alienfile q{ use alienfile; }; is( $build->meta->has_hook('gather_system'), F() ); is( $build->meta->has_hook('gather_share'), F() ); }; }; subtest 'prop' => sub { my $build = alienfile q{ use alienfile; meta_prop->{foo1} = 'bar1'; }; is( $build->meta_prop->{foo1}, 'bar1' ); }; subtest 'patch' => sub { my $build = alienfile q{ use alienfile; share { patch sub { } }; }; is( $build->meta->has_hook('patch'), T() ); }; subtest 'patch_ffi' => sub { my(undef,$build) = capture_merged { alienfile q{ use alienfile; share { patch_ffi sub { } }; }; }; is( $build->meta->has_hook('patch_ffi'), T() ); }; subtest 'ffi patch' => sub { my $build = alienfile q{ use alienfile; share { ffi { patch sub { } } }; }; is( $build->meta->has_hook('patch_ffi'), T() ); }; subtest 'arch' => sub { subtest 'on' => sub { my $build = alienfile q{ use alienfile; meta_prop->{arch} = 1; }; is( $build->meta_prop->{arch}, T()); }; subtest 'off' => sub { my $build = alienfile q{ use alienfile; meta_prop->{arch} = 0; }; is( $build->meta_prop->{arch}, F()); }; subtest 'default' => sub { my $build = alienfile q{ use alienfile; }; is( $build->meta_prop->{arch}, T()); }; }; subtest 'meta' => sub { my $build = alienfile q{ use alienfile; meta->prop->{foo} = 1; probe sub { 'system' }; }; is $build->meta_prop->{foo}, 1; }; subtest 'test' => sub { subtest 'basic' => sub { my $build = alienfile_ok q{ use alienfile; share { test []; }; }; is( $build->requires('configure'), hash { field 'Alien::Build' => '1.14'; etc; }, ); }; alienfile_ok q{ use alienfile; sys { test []; }; }; alienfile_ok q{ use alienfile; share { ffi { test []; }; }; }; eval { alienfile q{ use alienfile; test []; }; }; like $@, qr/test is not allowed in any block/, 'not allowed in root block'; eval { alienfile q{ use alienfile; configure { test[] }; }; }; like $@, qr/test is not allowed in configure block/, 'not allowed in configure block'; }; subtest 'start_url' => sub { my $build = alienfile_ok q{ use alienfile; share { start_url 'http://bogus.com'; }; }; is( $build, object { call meta_prop => hash { field start_url => 'http://bogus.com'; etc; }; call [requires => 'configure'] => hash { field 'Alien::Build' => '1.19'; etc; }; }, 'build object' ); }; subtest 'before' => sub { my $mock = mock 'Alien::Build::Meta' => ( class => 'Alien::Build::Meta', ); my @before_hook; $mock->around(before_hook => sub { my $orig = shift; my (undef, $name, $code) = @_; push @before_hook, [$name, $code]; $orig->(@_); }); $mock->around(new => sub { my $orig = shift; @before_hook = (); $orig->(@_); }); subtest 'before build in share' => sub { my $build = alienfile_ok q{ use alienfile; share { before 'build' => sub { return 42; }; build []; }; }; is $before_hook[0][0], 'build'; ok($build->requires('configure')->{'Alien::Build'} >= '1.40', 'before directive requires 1.40'); }; subtest 'before build in share>ffi' => sub { my $build = alienfile_ok q{ use alienfile; share { ffi { before 'build' => sub { return 42; }; build []; }; }; }; is $before_hook[0][0], 'build_ffi'; }; subtest 'before probe in any' => sub { my $build = alienfile_ok q{ use alienfile; before 'probe' => sub {}; probe []; }; is $before_hook[0][0], 'probe'; }; subtest 'before gather any' => sub { my $build = alienfile_ok q{ use alienfile; before 'gather' => sub {}; gather []; }; is $before_hook[1][0], 'gather_system'; is $before_hook[0][0], 'gather_share'; }; subtest 'before gather share' => sub { my $build = alienfile_ok q{ use alienfile; share { before 'gather' => sub {}; gather []; }; }; is $before_hook[0][0], 'gather_share'; }; subtest 'before gather ffi' => sub { my $build = alienfile_ok q{ use alienfile; share { ffi { before 'gather' => sub {}; gather []; }; }; }; is $before_hook[0][0], 'gather_ffi'; }; subtest 'before gather system' => sub { my $build = alienfile_ok q{ use alienfile; sys { before 'gather' => sub {}; gather []; }; }; is $before_hook[0][0], 'gather_system'; }; subtest 'before build in sys' => sub { eval { alienfile q{ use alienfile; sys { before 'build' => sub { return 42; }; build []; }; }; }; like $@, qr/before build is not allowed in sys block/, 'not allowed in sys block'; }; subtest 'before second argument must be a code ref' => sub { eval { alienfile q{ use alienfile; share { before 'build' => 1; build []; }; }; }; like $@, qr/before build argument must be a code reference/, 'must be code reference'; }; subtest 'arbitrary stages not allowed' => sub { eval { alienfile q{ use alienfile; share { before 'bogus' => sub {}; build []; }; }; }; like $@, qr/No such stage bogus/, 'no bogus allowed'; }; }; subtest 'after' => sub { my $mock = mock 'Alien::Build::Meta' => ( class => 'Alien::Build::Meta', ); my @after_hook; $mock->around(after_hook => sub { my $orig = shift; my (undef, $name, $code) = @_; push @after_hook, [$name, $code]; $orig->(@_); }); $mock->around(new => sub { my $orig = shift; @after_hook = (); $orig->(@_); }); subtest 'after build in share' => sub { my $build = alienfile_ok q{ use alienfile; share { after 'build' => sub { return 42; }; build []; }; }; is $after_hook[0][0], 'build'; ok($build->requires('configure')->{'Alien::Build'} >= '1.40', 'after directive requires 1.40'); }; subtest 'after build in share>ffi' => sub { my $build = alienfile_ok q{ use alienfile; share { ffi { after 'build' => sub { return 42; }; build []; }; }; }; is $after_hook[0][0], 'build_ffi'; }; subtest 'after probe in any' => sub { my $build = alienfile_ok q{ use alienfile; after 'probe' => sub {}; probe []; }; is $after_hook[0][0], 'probe'; }; subtest 'after gather any' => sub { my $build = alienfile_ok q{ use alienfile; after 'gather' => sub {}; gather []; }; is $after_hook[1][0], 'gather_system'; is $after_hook[0][0], 'gather_share'; }; subtest 'after gather share' => sub { my $build = alienfile_ok q{ use alienfile; share { after 'gather' => sub {}; gather []; }; }; is $after_hook[0][0], 'gather_share'; }; subtest 'after gather ffi' => sub { my $build = alienfile_ok q{ use alienfile; share { ffi { after 'gather' => sub {}; gather []; }; }; }; is $after_hook[0][0], 'gather_ffi'; }; subtest 'after gather system' => sub { my $build = alienfile_ok q{ use alienfile; sys { after 'gather' => sub {}; gather []; }; }; is $after_hook[0][0], 'gather_system'; }; subtest 'after build in sys' => sub { eval { alienfile q{ use alienfile; sys { after 'build' => sub { return 42; }; build []; }; }; }; like $@, qr/after build is not allowed in sys block/, 'not allowed in sys block'; }; subtest 'after second argument must be a code ref' => sub { eval { alienfile q{ use alienfile; share { after 'build' => 1; build []; }; }; }; like $@, qr/after build argument must be a code reference/, 'must be code reference'; }; subtest 'arbitrary stages not allowed' => sub { eval { alienfile q{ use alienfile; share { after 'bogus' => sub {}; build []; }; }; }; like $@, qr/No such stage bogus/, 'no bogus allowed'; }; }; subtest 'digest' => sub { local $Alien::Build::VERSION = $Alien::Build::VERSION || 2.57; my $build = alienfile_ok q{ use alienfile; digest SHA256 => 'a7e79996a02d3dfc47f6f3ec043c67690dc06a10d091bf1d760fee7c8161391a'; plugin 'Fetch::Local'; probe sub { 'share' }; }; alienfile_skip_if_missing_prereqs; is $build->fetch('corpus/alien_build_plugin_digest_shapp/foo.txt.gz'), hash { field type => 'file'; field filename => 'foo.txt.gz'; etc; }, 'fetch works with good sig'; is dies { $build->fetch(__FILE__) }, match qr/SHA256 digest does not match/, 'fetch dies with bad sig'; }; done_testing; Alien-Build-2.84/t/bin/000755 000000 000000 00000000000 14710030646 014526 5ustar00rootroot000000 000000 Alien-Build-2.84/t/bin/ftpd000755 000000 000000 00000003472 14710030646 015417 0ustar00rootroot000000 000000 #!/usr/bin/env perl use strict; use warnings; use URI; use AnyEvent; ## no critic use AnyEvent::FTP::Server; use JSON::PP qw( encode_json decode_json ); use Path::Tiny qw( path ); use Getopt::Long qw( GetOptions ); my $daemon = 0; my $kill = 0; my $host = 'localhost'; GetOptions( "d" => \$daemon, "k" => \$kill, "hosth=s" => \$host, ); my $bindir = path(__FILE__)->parent->absolute; my $distdir = $bindir->parent->parent; my $config_file = $bindir->child('ftpd.json'); if(-r $config_file) { my $config = decode_json($config_file->slurp); my $pid = $config->{pid}; if(defined $pid) { kill 'KILL', $pid; } } exit if $kill; if($daemon) { require Proc::Daemon; my $daemon = Proc::Daemon->new( child_STDOUT => $bindir->child('ftpd.log')->stringify, child_STDERR => $bindir->child('ftpd.log')->stringify, ); $daemon->Init; } my $server = AnyEvent::FTP::Server->new( host => $host, port => 0, default_context => 'AnyEvent::FTP::Server::Context::FSRO', ); my %config = ( user => join('', map { chr(ord('a') + int rand(26)) } (1..10)), pass => join('', map { chr(ord('a') + int rand(26)) } (1..10)), root => $distdir->child('corpus/dist')->stringify, pid => $$, ); my $url = URI->new("ftp://localhost"); $url->host($host); $url->path($config{root}); $url->user($config{user}); $url->password($config{pass}); $server->on_bind(sub { my $port = shift; $url->port($port); }); $server->on_connect(sub { my $con = shift; $con->context->authenticator(sub { my($user, $pass) = @_; $user eq $config{user} && $pass eq $config{pass} ? 1 : 0; }); $con->context->bad_authentication_delay(0); }); $server->start; $config{url} = $url->as_string; $config_file->spew(encode_json(\%config)); print "$url\n"; AnyEvent->condvar->recv; Alien-Build-2.84/t/bin/httpd000755 000000 000000 00000005055 14710030646 015604 0ustar00rootroot000000 000000 #!/usr/bin/env perl use strict; use warnings; use Path::Tiny qw( path ); use Getopt::Long qw( GetOptions ); use URI; use URI::Escape qw( uri_unescape ); use JSON::PP qw( encode_json decode_json ); use HTTP::Server::PSGI; use Plack::Builder; use Plack::App::Directory; my $daemon = 0; my $kill = 0; my $host = 'localhost'; GetOptions( "d" => \$daemon, "k" => \$kill, "host=s" => \$host, ); my $bindir = path(__FILE__)->parent->absolute; my $distdir = $bindir->parent->parent; my $config_file = $bindir->child('httpd.json'); if(-r $config_file) { my $config = decode_json($config_file->slurp); my $pid = $config->{pid}; if(defined $pid) { kill 'KILL', $pid; } } exit if $kill; if($daemon) { require Proc::Daemon; my $daemon = Proc::Daemon->new( child_STDOUT => $bindir->child('httpd.log')->stringify, child_STDERR => $bindir->child('httpd.log')->stringify, ); $daemon->Init; } my $url = URI->new('http://localhost/corpus/dist/'); $url->host($host); $url->port(do { require IO::Socket::INET; IO::Socket::INET->new(Listen => 5, LocalAddr => "127.0.0.1")->sockport; }); my %config = ( root => $distdir->child('corpus/dist')->stringify, pid => $$, url => $url->as_string, ); $config_file->spew(encode_json(\%config)); my $app = builder { mount '/corpus/dist/test1/' => sub { my $env = shift; my %headers; foreach my $key (keys %$env) { next unless $key =~ /^HTTP_(.*)$/; my $name = join '-', map { ucfirst $_ }map { lc $_ } split /_/, $1; $headers{$name} = $env->{$key}; } my $uri = URI->new($env->{'psgi.url_scheme'} . '://' . $env->{SERVER_NAME} . uri_unescape($env->{REQUEST_URI}), $env->{'psgi.url_scheme'}); $uri->port($env->{SERVER_PORT}); my %query; my @query = $uri->query_form; while(@query) { my $key = shift @query; my $value = shift @query; push @{ $query{$key} }, $value; } return [ '200', [ 'Content-Type' => 'text/plain; charset=UTF-8' ], [ encode_json( { headers => \%headers, url => { scheme => $uri->scheme, host => $uri->host, port => $uri->port, path => $uri->path, query => \%query } } ) ], ]; }; mount '/corpus/dist/about.json' => sub { my $env = shift; return [ '200', [ 'Content-Type' => 'application/json' ], [ encode_json( { ident => 'AB Test HTTPd' } ) ], ]; }; mount '/' => Plack::App::Directory->new({ root => $distdir->stringify })->to_app; }; my $server = HTTP::Server::PSGI->new( host => $url->host, port => $url->port, ); $server->run($app); Alien-Build-2.84/t/lib/000755 000000 000000 00000000000 14710030646 014524 5ustar00rootroot000000 000000 Alien-Build-2.84/t/lib/MyTest/000755 000000 000000 00000000000 14710030646 015751 5ustar00rootroot000000 000000 Alien-Build-2.84/t/lib/MyTest/CaptureNote.pm000644 000000 000000 00000000750 14710030646 020542 0ustar00rootroot000000 000000 package MyTest::CaptureNote; use strict; use warnings; use Test2::API qw( context ); use Capture::Tiny qw( capture_merged ); use Exporter qw( import ); our @EXPORT = qw( capture_note ); sub capture_note (&) { my($code) = @_; my($out, $error, @ret) = Capture::Tiny::capture_merged(sub { my @ret = eval { $code->() }; ($@, @ret) }); my $ctx = context(); $ctx->note($out) if $out ne ''; $ctx->release; die $error if $error; wantarray ? @ret : $ret[0]; ## no critic } 1; Alien-Build-2.84/t/lib/MyTest/FTP.pm000644 000000 000000 00000002255 14710030646 016744 0ustar00rootroot000000 000000 package MyTest::FTP; use strict; use warnings; use Path::Tiny qw( path ); use JSON::PP qw( decode_json ); use Exporter qw( import ); our @EXPORT = qw( ftp_url ftp_error ); my $ftp_error; sub ftp_error { my($new) = @_; if($new) { $ftp_error = $new; return undef; } else { return $ftp_error; } } sub ftp_url { my $file = path('t/bin/ftpd.json'); return ftp_error('no ftpd.json') unless -r $file; my $config = eval { decode_json($file->slurp) }; return ftp_error("error loading ftpd.json $@") if $@; my $url = $config->{url}; return ftp_error("no url in ftpd.json") unless $url; require Net::FTP; require URI; $url = URI->new($url); my $ftp = Net::FTP->new($url->host, Port => $url->port) or do { return ftp_error("Connot connect to @{[ $url->host ]}"); }; eval { $ftp->login($url->user, $url->password) or die; $ftp->binary; $ftp->cwd($url->path) or die; my $path = Path::Tiny->tempfile; $ftp->get('foo-1.00.tar.xz', $path->stringify) or die; -e $path || die; $ftp->quit; }; return ftp_error($ftp->message) if $@; $url->path($url->path . '/') unless $url->path =~ m!/$!; return $url; } 1; Alien-Build-2.84/t/lib/MyTest/FauxFetchCommand.pm000644 000000 000000 00000005233 14710030646 021466 0ustar00rootroot000000 000000 package MyTest::FauxFetchCommand; use strict; use warnings; use MyTest::System; use Test2::API qw( context ); use Path::Tiny qw( path ); use Capture::Tiny qw( tee ); use JSON::PP qw( encode_json decode_json ); use Exporter qw( import ); our @EXPORT = qw( test_config ); my($test_name) = $0 =~ m{[/\\](.*)\.t$}; my $command_name = $test_name =~ /curlcommand/ ? 'curl' : 'wget'; my %record = %{ decode_json path("corpus/$test_name/record/old.json")->slurp }; sub real_cmd { my(@args) = @_; my %old = map { $_->basename => 1 } path('.')->children; my($stdout, $stderr, $exit) = tee { CORE::system $command_name, @args; $? >> 8; }; my $key = "@args"; for($key, $stdout, $stderr) { s{http://localhost.*?/corpus}{http://localhost/corpus}g; s{ftp://[a-z]+:[a-z]+\@localhost:[0-9]+/.*?/corpus}{ftp://localhost/corpus}g; } my %files; if(! -d ".git") { foreach my $child (path('.')->children) { next if $old{$child->basename}; $files{$child->basename} = $child->slurp; } } $record{$key} = { stdout => $stdout, stderr => $stderr, exit => $exit, files => \%files, }; $exit; } sub faux_cmd { my(@args) = @_; my $key = "@args"; unless($record{$key}) { my $ctx = context(); $ctx->bail("do not have a record for $command_name $key"); } my $run = $record{$key}; print STDOUT $run->{stdout}; print STDERR $run->{stderr}; foreach my $filename (keys %{ $run->{files} }) { path($filename)->spew($run->{files}->{$filename}); } $run->{exit}; } sub test_config ($) { my($name) = @_; my $path = path("t/bin/$name.json"); if(-f $path) { my $config = JSON::PP::decode_json(scalar $path->slurp); my $guard = system_fake; $guard->add($command_name => \&real_cmd); $guard->add("/bin/$command_name" => \&real_cmd); $config->{url} =~ s{dist/?$}{$test_name/dir}; $config->{guard} = $guard; my $ctx = context(); $ctx->note("testing against real $command_name and real $name @{[ $config->{url} ]}"); $ctx->release; return $config; } eles { my %config; my $guard = system_fake; $guard->add($command_name => \&faux_cmd); $guard->add("/bin/$command_name" => \&faux_cmd); $config{guard} = $guard; $config{url} = $name eq 'httpd' ? "http://localhost/corpus/$test_name/dir" : "ftp://localhost/corpus/$test_name/dir"; return \%config; } } delete $ENV{CURL}; delete $ENV{WGET}; END { path("corpus/$test_name/record/new.json")->spew(encode_json( \%record )); if(eval { require YAML; 1 }) { YAML::DumpFile(path("corpus/$test_name/record/new.yml")->stringify, \%record ); } } 1; Alien-Build-2.84/t/lib/MyTest/File.pm000644 000000 000000 00000000662 14710030646 017172 0ustar00rootroot000000 000000 package MyTest::File; use strict; use warnings; use Path::Tiny qw( path ); use JSON::PP qw( decode_json ); use Exporter qw( import ); our @EXPORT = qw( file_url file_error ); my $file_error; sub file_error { $file_error; } sub file_url { if(eval { require URI::file }) { return URI::file->new(path("corpus/dist")->absolute . "/"); } else { $file_error = 'test requires URI::file'; return undef; } } 1; Alien-Build-2.84/t/lib/MyTest/HTTP.pm000644 000000 000000 00000001617 14710030646 017073 0ustar00rootroot000000 000000 package MyTest::HTTP; use strict; use warnings; use Path::Tiny qw( path ); use JSON::PP qw( decode_json ); use Exporter qw( import ); our @EXPORT = qw( http_url http_error ); my $http_error; sub http_error { my($new) = @_; if($new) { $http_error = $new; return undef; } else { return $http_error; } } sub http_url { my $file = path('t/bin/httpd.json'); return http_error('no httpd.json') unless -r $file; my $config = eval { decode_json($file->slurp) }; return http_error("error loading httpd.json $@") if $@; my $url = $config->{url}; return http_error("no url in httpd.json") unless $url; require HTTP::Tiny; my $res = HTTP::Tiny->new->get("${url}about.json"); my $about = eval { decode_json( $res->{content} ) }; return http_error($@) if $@; return http_error("not a AB TEST HTTPd") unless $about->{ident} eq 'AB Test HTTPd'; return $url; } 1; Alien-Build-2.84/t/lib/MyTest/HaveCompiler.pm000644 000000 000000 00000000730 14710030646 020665 0ustar00rootroot000000 000000 package MyTest::HaveCompiler; use strict; use warnings; use Test2::V0 (); use Capture::Tiny qw( capture_merged ); use parent qw( Exporter ); our @EXPORT_OK = qw( require_compiler ); { my $first = 1; sub require_compiler { my $skip; my($diag) = capture_merged { $skip = !ExtUtils::CBuilder->new->have_compiler; }; Test2::V0::note $diag if defined $diag && $diag ne ''; Test2::V0::skip_all 'test requires a compiler' if $skip; } } 1; Alien-Build-2.84/t/lib/MyTest/System.pm000644 000000 000000 00000003060 14710030646 017572 0ustar00rootroot000000 000000 package MyTest::System; use strict; use warnings; use Exporter qw( import ); use Scalar::Util qw( refaddr ); use Text::ParseWords qw( shellwords ); use Scalar::Util qw( weaken ); use File::Which (); our @EXPORT = qw( system_fake system_add ); sub system_fake { __PACKAGE__->new(@_); } my @stack; *CORE::GLOBAL::system = sub { my $system = $stack[-1]; if($system) { $system->call(@_); } else { return CORE::system(@_); } }; { my $old = \&File::Which::which; no warnings 'redefine'; *File::Which::which = sub { my $system = $stack[-1]; if($system) { $system->can_run(@_); } else { return $old->(@_); } }; } sub new { my($class, %cmds) = @_; my $self = bless { %cmds }, $class; push @stack, $self; weaken $stack[-1]; $self; } sub add { my($self, $command, $code) = @_; $self->{$command} = $code; } sub call { my($self, $command, @args) = @_; if(@args == 0) { if($^O eq 'MSWin32' && $command =~ /^"(.*)"$/) { $command = $1 } ($command, @args) = shellwords $command; } if($self->{$command}) { my $exit = $self->{$command}->(@args); return $? = ($exit << 8); } else { $! = 'No such file or directory'; return $? = -1; } } sub can_run { my($self, $command) = @_; # we only really use can_run to figure out if # we CAN run an executable, but make up some # path just for pretends. $self->{$command} ? "/bin/$command" : undef; } sub DESTROY { my($self) = @_; @stack = grep { refaddr($_) ne refaddr($self) } @stack; } 1; Alien-Build-2.84/t/test_alien.t000644 000000 000000 00000044421 14710030646 016277 0ustar00rootroot000000 000000 use 5.008004; use lib 'corpus/lib'; use lib 't/lib'; use Test2::V0 -no_srand => 1; use Test::Alien; use Alien::Foo; use Alien::perlhelp; use Alien::libfoo1; use Env qw( @PATH ); use ExtUtils::CBuilder; use Alien::Build::Util qw( _dump ); use List::Util 1.33 qw( any ); use Config; use Test2::API 1.302096 (); use MyTest::HaveCompiler qw( require_compiler ); $ENV{TEST_ALIEN_ALIENS_MISSING} = 0; sub _reset { @Test::Alien::aliens = (); } subtest 'alien_ok' => sub { _reset(); local $ENV{PATH} = $ENV{PATH}; subtest 'as class' => sub { local $ENV{PATH} = $ENV{PATH}; is( intercept { alien_ok 'Alien::Foo' }, array { event Ok => sub { call pass => T(); call name => 'Alien::Foo responds to: cflags libs dynamic_libs bin_dir'; }; end; }, "alien_ok with class" ); is $PATH[0], '/foo/bar/baz', 'bin_dir added to path'; }; subtest 'as object' => sub { local $ENV{PATH} = $ENV{PATH}; my $alien = Alien::Foo->new; is( intercept { alien_ok $alien }, array { event Ok => sub { call pass => T(); call name => 'Alien::Foo[instance] responds to: cflags libs dynamic_libs bin_dir'; }; end; }, "alien_ok with class" ); is $PATH[0], '/foo/bar/baz', 'bin_dir added to path'; }; is( intercept { alien_ok(Alien::Foo->new) }, array { event Ok => sub { call pass => T(); call name => 'Alien::Foo[instance] responds to: cflags libs dynamic_libs bin_dir'; }; end; }, "alien_ok with instance" ); is( intercept { alien_ok 'Alien::Bogus' }, array { event Ok => sub { call pass => F(); call name => 'Alien::Bogus responds to: cflags libs dynamic_libs bin_dir'; }; event Diag => sub {}; event Diag => sub { call message => " missing method $_"; } for qw( cflags libs dynamic_libs bin_dir ); end; }, "alien_ok with bad class", ); is( intercept { alien_ok undef }, array { event Ok => sub { call pass => F(); call name => 'undef responds to: cflags libs dynamic_libs bin_dir'; }; event Diag => sub {}; event Diag => sub { call message => ' undefined alien'; }; end; }, 'alien_ok with undef', ); }; subtest 'helper_ok' => sub { _reset(); alien_ok 'Alien::libfoo1'; helper_ok 'foo1'; helper_ok 'foo2', 'something else'; is( intercept { helper_ok 'foo1' }, array { event Ok => sub { call pass => T(); call name => 'helper foo1 exists'; }; end; }, 'default test name', ); is( intercept { helper_ok 'foo2', 'something else' }, array { event Ok => sub { call pass => T(); call name => 'something else'; }; end; }, 'custom name', ); is( intercept { helper_ok 'foo3' }, array { event Ok => sub { call pass => F(); call name => 'helper foo3 exists'; }; event Diag => sub {}; end; }, 'failed test', ); }; subtest 'plugin_ok' => sub { _reset(); local $ENV{TEST_ALIEN_ALIENS_MISSING} = 1; plugin_ok 'NesAdvantage::HelperTest'; helper_ok 'nes'; interpolate_template_is '%{nes}', 'advantage'; }; subtest 'interpolate_template_is' => sub { _reset(); alien_ok 'Alien::libfoo1'; interpolate_template_is '%{foo1}', 'bar3'; interpolate_template_is '%{foo2}', qr{az7}; is( intercept { interpolate_template_is '%{foo1}', 'bar3' }, array { event Ok => sub { call pass => T(); call name => 'template matches'; }; end; }, 'pass with default name', ); is( intercept { interpolate_template_is '%{foo1}', 'bar3', 'something else' }, array { event Ok => sub { call pass => T(); call name => 'something else'; }; end; }, 'pass with custom name', ); is( intercept { interpolate_template_is '%{foo1}', 'bar4' }, array { event Ok => sub { call pass => F(); call name => 'template matches'; }; event Diag => sub {}; event Diag => sub { call message => 'value \'bar3\' does not equal \'bar4\''; }; end; }, 'fail with string match', ); is( intercept { interpolate_template_is '%{foo1}', qr{xx} }, array { event Ok => sub { call pass => F(); call name => 'template matches'; }; event Diag => sub {}; event Diag => sub { call message => match(qr{^value 'bar3' does not match }); }; end; }, 'fail with string match', ); is( intercept { interpolate_template_is '%{bogus}', 'bar4' }, array { event Ok => sub { call pass => F(); call name => 'template matches'; }; event Diag => sub {}; event Diag => sub { call message => 'error in evaluation:'; }; event Diag => sub { call message => match(qr/^ /); }; end; }, 'bogus helper', ); }; subtest 'ffi_ok' => sub { skip_all 'Test requires FFI::Platypus' unless eval { require FFI::Platypus; 1 }; _reset(); alien_ok synthetic {}; is( intercept { ffi_ok; }, array { event Ok => sub { call pass => T(); call name => 'ffi'; }; end; }, 'empty ffi' ); ffi_ok {}, 'min version test', with_subtest { my($ffi) = @_; my $version = $ffi->VERSION; $version =~ s/_.*$//; cmp_ok $version, '>=', 0.12; }; ffi_ok { ignore_not_found => 1 }, 'ignore not found', with_subtest { my($ffi) = @_; my $version = $ffi->VERSION; $version =~ s/_.*$//; cmp_ok $version, '>=', 0.15; eval { $ffi->attach( foo => [] => 'void') }; is $@, ''; is __PACKAGE__->can('foo'), F(); }; ffi_ok { lang => 'Fortran' }, 'lang', with_subtest { my($ffi) = @_; my $version = $ffi->VERSION; $version =~ s/_.*$//; cmp_ok $version, '>=', 0.18; is $ffi->lang, 'Fortran'; }; subtest 'find symbols' => sub { subtest 'good symbols' => sub { my @symbols; my $mock = mock 'FFI::Platypus' => ( override => [ find_symbol => sub { my(undef, $symbol) = @_; push @symbols, $symbol; 1; }, ], ); is( intercept { ffi_ok { symbols => [qw( foo bar baz )] } }, array { event Ok => sub { call pass => T(); call name => 'ffi'; }; }, 'test passes', ); is( \@symbols, [qw( foo bar baz )], 'tested symbols', ); }; subtest 'bad symbols' => sub { is( intercept { ffi_ok { symbols => [qw( bogus1 bogus2 )] } }, array { event Ok => sub { call pass => F(); call name => 'ffi'; }; event Diag => sub {}; event Diag => sub { call message => ' bogus1 not found'; }; event Diag => sub { call message => ' bogus2 not found'; }; end; }, 'not found error' ); }; }; subtest 'acme' => sub { skip_all 'Test requires Acme::Alien::DontPanic 0.026' unless eval { require Acme::Alien::DontPanic; Acme::Alien::DontPanic->VERSION('0.026'); }; alien_ok 'Acme::Alien::DontPanic'; ffi_ok { symbols => ['answer'] } , with_subtest { my($ffi) = @_; is $ffi->function('answer' => [] => 'int')->call(), 42, 'answer is 42'; }; }; }; subtest 'xs_ok' => sub { require_compiler(); _reset(); alien_ok synthetic {}; subtest 'bad' => sub { local $ENV{TEST_ALIEN_ALWAYS_KEEP} = 0; is( intercept { xs_ok '' }, array { event Ok => sub { call pass => F(); call name => 'xs'; }; event Diag => sub {}; event Diag => sub { call message => ' XS does not have a module decleration that we could find'; }; end; }, 'xs with no module' ); is( intercept { xs_ok '', sub { } }, array { event Ok => sub { call pass => F(); call name => 'xs'; }; event Diag => sub {}; event Diag => sub { call message => ' XS does not have a module decleration that we could find'; }; event Subtest => sub { call buffered => T(); call subevents => array { event Plan => sub { call max => 0; call directive => 'SKIP'; call reason => 'subtest requires xs success'; }; end; }; }; end; }, 'xs fail with subtest' ); # TODO: test that parsexs error should fail is( intercept { xs_ok q{ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #error "this should cause a compile error" MODULE = Foo::Bar PACKAGE = Foo::Bar } }, array { event Ok => sub { call pass => F(); call name => 'xs'; }; event Diag => sub {}; event Diag => sub { call message => ' ExtUtils::CBuilder->compile failed'; }; etc; }, 'xs with C compile error' ); # TODO: test that link error should fail }; subtest 'good' => sub { my $xs = <<'EOF'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" int baz(const char *class) { return 42; } MODULE = TA_MODULE PACKAGE = TA_MODULE int baz(class); const char *class; EOF xs_ok { xs => $xs, verbose => 1 }, with_subtest { my($module) = @_; is $module->baz(), 42, "call $module->baz()"; }; $xs =~ s{\bTA_MODULE\b}{Foo::Bar}g; xs_ok $xs, 'xs without parameterized name', with_subtest { my($module) = @_; is $module, 'Foo::Bar'; is $module->baz(), 42, "call $module->baz()"; }; }; subtest 'with xs_load' => sub { _reset(); my $xs = <<'EOF'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" MODULE = TA_MODULE PACKAGE = TA_MODULE int get_foo_one(klass) const char *klass CODE: RETVAL = FOO_ONE; OUTPUT: RETVAL int get_foo_two(klass) const char *klass CODE: RETVAL = FOO_TWO; OUTPUT: RETVAL EOF my @aliens = ( synthetic({ cflags => '-DFOO_ONE=42' }), synthetic({ cflags => '-DFOO_TWO=47' }), ); alien_ok $aliens[0]; alien_ok $aliens[1]; my @xs_load_args; my $mock = mock 'Test::Alien::Synthetic' => ( add => [ xs_load => sub { my($alien, $module, $version, @rest) = @_; @xs_load_args = @_; require XSLoader; XSLoader::load($module, $version); }, ], ); xs_ok { xs => $xs, verbose => 1 }, with_subtest { my($mod) = @_; is($mod->get_foo_one, 42, 'get_foo_one'); is($mod->get_foo_two, 47, 'get_foo_two'); }; is( \@xs_load_args, array { item object { call 'cflags' => '-DFOO_ONE=42'; }; item match(qr{^Test::Alien::XS::Mod}); item '0.01'; item object { call 'cflags' => '-DFOO_TWO=47'; }; end; }, 'called xs_load with correct args', ); }; subtest 'acme' => sub { skip_all 'Test requires Acme::Alien::DontPanic 0.026' unless eval { require Acme::Alien::DontPanic; Acme::Alien::DontPanic->VERSION('0.026'); }; reset(); my $xs = <<'EOF'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include MODULE = Acme PACKAGE = Acme int answer(); EOF alien_ok 'Acme::Alien::DontPanic'; xs_ok $xs, with_subtest { is Acme::answer(), 42, 'answer is 42'; }; }; }; subtest 'xs_ok without no compiler' => sub { my $mock = mock 'ExtUtils::CBuilder' => ( 'class' => 'ExtUtils::CBuilder', override => [ have_compiler => sub { 0; }, ], ); xs_ok ''; xs_ok '', sub {}; is( intercept { xs_ok '' }, array { event Skip => sub { # doesn't seem to be a way of testing # if an event was skipped call pass => T(); call name => 'xs'; call effective_pass => T(); }; end; }, 'skip works' ); is( intercept { xs_ok '', sub {} }, array { event Skip => sub { # doesn't seem to be a way of testing # if an event was skipped call pass => T(); call name => 'xs'; call effective_pass => T(); }; event Skip => sub { # doesn't seem to be a way of testing # if an event was skipped call pass => T(); call name => 'xs subtest'; call effective_pass => T(); }; end; }, 'skip works with cb' ); }; subtest 'overrides no overrides' => sub { _reset(); alien_ok synthetic { cflags => '-DD1=22' }; my $xs = <<'EOF'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" int answer(const char *klass) { #ifdef D1 #ifdef D2 return D1+D2; #else return D1; #endif #else #ifdef D2 return D2; #else return 0; #endif #endif } MODULE = TA_MODULE PACKAGE = TA_MODULE int answer(klass); const char *klass; EOF xs_ok { xs => $xs, cbuilder_compile => { extra_compiler_flags => '-DD2=20' }, verbose => 1 }, 'extra compiler flags as string', with_subtest { my($mod) = @_; is($mod->answer, 42); }; xs_ok { xs => $xs, cbuilder_compile => { extra_compiler_flags => ['-DD2=20'] }, verbose => 1 }, 'extra compiler flags as array ref', with_subtest { my($mod) = @_; is($mod->answer, 42); }; my $cbuilder_config; no warnings 'once'; local *ExtUtils::CBuilder::new = do { my $orig = ExtUtils::CBuilder->can('new'); sub { my $class = shift; my %args = @_; $cbuilder_config = $args{config}; $class->$orig(@_); }; }; xs_ok { xs => $xs, cbuilder_config => { foo => 'bar' } }; is $cbuilder_config, hash { field 'foo' => 'bar'; etc; } ; }; subtest 'with_subtest SEGV' => sub { # it may be possible to catch a segmentation fault, # but not with signal handlers apparently. See: # https://feepingcreature.github.io/handling.html skip_all 'Catching SEGV not currently supported on Windows' if $^O eq 'MSWin32'; skip_all 'Test requires platforms with SEGV signal' if ! any { $_ eq 'SEGV' } split /\s+/, $Config{sig_name}; our $kill_line; my $st = with_subtest { note 'one'; kill 'SEGV', $$; BEGIN { $kill_line = __LINE__ }; note 'two'; }; my $e; is( $e = intercept { $st->(); }, array { event Note => sub { call message => 'one'; }; event Bail => sub { call reason => 'Segmentation fault'; call facet_data => hash { field trace => hash { field frame => array { item 'main'; item __FILE__; item $kill_line; etc; }; etc; }; etc; }; etc; }; end; }, ) or diag _dump($e); }; subtest 'diagnostic when calling tools without alien_ok' => sub { _reset(); require_compiler; my $xs = <<'EOF'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" MODULE = TA_MODULE PACKAGE = TA_MODULE int answer(); CODE: RETVAL = 1; EOF is intercept { xs_ok { xs => $xs } }, array { event Note => {} if $ENV{TEST_ALIEN_ALWAYS_KEEP}; event Ok => sub { call pass => T(); call name => 'xs'; }; event Diag => sub { call message => 'xs_ok called without any aliens, you may want to call alien_ok'; }; end; }, 'xs_ok displays dignostic sans alien_ok', ; is intercept { run_ok [$^X, -e => '1'] }, array { event Ok => sub { call pass => T(); call name => match qr/^run/; }; event Note => sub {}; event Diag => sub { call message => 'run_ok called without any aliens, you may want to call alien_ok'; }; end; }, 'run_ok displays diagnostic sans alien_ok', ; is intercept { run_ok qq{"$^X" -e 1} }, array { event Ok => sub { call pass => T(); call name => match qr/^run/; }; event Note => sub {}; event Diag => sub { call message => 'run_ok called without any aliens, you may want to call alien_ok'; }; end; }, 'run_ok displays diagnostic sans alien_ok', ; if(eval { require FFI::Platypus; 1 }) { is intercept { ffi_ok; }, array { event Ok => sub { call pass => T(); call name => 'ffi'; }; event Diag => sub { call message => 'ffi_ok called without any aliens, you may want to call alien_ok'; }; end; }, 'ffi_ok displays diagnostic sans alien_ok', ; } is intercept { helper_ok 'foo' }, array { event Ok => sub { call pass => F(); call name => 'helper foo exists'; }; event Diag => sub {}; event Diag => sub { call message => 'helper_ok called without any aliens, you may want to call alien_ok'; }; end; }, 'helper_ok displays diagnostic sans alien_ok', ; is intercept { interpolate_template_is "foo", "foo" }, array { event Ok => sub { call pass => T(); call name => 'template matches'; }; event Diag => sub { call message => 'interpolate_template_is called without any aliens, you may want to call alien_ok'; }; end; }, 'interpolate_template_is called without any aliens, you may want to call alien_ok', ; }; subtest 'interpolate_run_ok' => sub { _reset(); alien_ok 'Alien::perlhelp'; is intercept { interpolate_run_ok '%{bogus}' }, array { event Ok => sub { call pass => F(); call name => 'run %{bogus}'; }; event Diag => sub {}; event Diag => sub { call message => 'error in evaluation:'; }; event Diag => sub { call message => match qr/^ no helper defined for bogus at/; }; end; }, 'run with bogus macro should fail', ; interpolate_run_ok ['%{perlhelp}', -e => '1']; interpolate_run_ok '"%{perlhelp}" -e 1'; }; done_testing; Alien-Build-2.84/t/test_alien_build.t000644 000000 000000 00000040412 14710030646 017452 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Build; use Path::Tiny qw( path ); use Capture::Tiny qw( capture_merged ); subtest 'alienfile_ok' => sub { subtest 'inline' => sub { my $build = alienfile q{ use alienfile; }; isa_ok $build, 'Alien::Build'; ok(-d $build->install_prop->{prefix}, "has prefix dir"); note "prefix = @{[ $build->install_prop->{prefix} ]}"; ok(-d $build->install_prop->{root}, "has root dir"); note "root = @{[ $build->install_prop->{root} ]}"; ok(-d $build->install_prop->{stage}, "has stage dir"); note "stage = @{[ $build->install_prop->{stage} ]}"; }; subtest 'from file' => sub { my $build = alienfile filename => 'corpus/basic/alienfile'; isa_ok $build, 'Alien::Build'; ok(-d $build->install_prop->{prefix}, "has prefix dir"); note "prefix = @{[ $build->install_prop->{prefix} ]}"; ok(-d $build->install_prop->{root}, "has root dir"); note "root = @{[ $build->install_prop->{root} ]}"; ok(-d $build->install_prop->{stage}, "has stage dir"); note "stage = @{[ $build->install_prop->{stage} ]}"; }; my $ret; $ret = alienfile_ok q{ use alienfile }; isa_ok($ret, 'Alien::Build'); alienfile_ok filename => 'corpus/basic/alienfile'; is( intercept { $ret = alienfile_ok q{ bogus alienfile stuff } }, array { event Ok => sub { call pass => F(); call name => 'alienfile compiles'; }; event Diag => sub {}; event Diag => sub {}; end; }, 'compile error in alienfile fails test' ); alienfile_ok q{ use alienfile; log('hey there'); }; }; subtest alien_build_ok => sub { subtest 'no alienfile' => sub { eval { alienfile q{ die } }; my $ret; is( intercept { $ret = alien_build_ok }, array { event Ok => sub { call pass => F(); call name => 'alien builds okay'; }; event Diag => sub {}; event Diag => sub { call message => 'no alienfile'; }; end; }, ); is $ret, U(); }; subtest 'alienfile compiles but does not run' => sub { alienfile_ok q{ use alienfile; probe sub { 'share' }; share { download sub { die 'dinosaurs and transformers' }; build sub {}; } }; my $ret; is( intercept { $ret = alien_build_ok }, array { event Ok => sub { call pass => F(); call name => 'alien builds okay'; }; event Diag => sub {}; event Diag => sub {}; event Diag => sub { call message => match(qr/build threw exception: dinosaurs and transformers/); }; end; }, ); is $ret, U(); }; subtest 'good system' => sub { alienfile_ok q{ use alienfile; probe sub { 'system' }; sys { gather sub { my($build) = @_; $build->runtime_prop->{cflags} = '-DFOO=1'; $build->runtime_prop->{libs} = '-lfoo'; }; }; }; my $alien = alien_build_ok; isa_ok $alien, 'Alien::Base'; is $alien->cflags, '-DFOO=1'; is $alien->libs, '-lfoo'; }; subtest 'good share' => sub { alienfile_ok q{ use alienfile; share { plugin 'Test::Mock', probe => 'share', download => 1, extract => 1, build => 1; gather sub { my($build) = @_; my $prefix = $build->runtime_prop->{prefix}; $build->runtime_prop->{cflags} = "-I$prefix/include -DFOO=1"; $build->runtime_prop->{libs} = "-L$prefix/lib -lfoo"; }; }; }; my $alien = alien_build_ok; isa_ok $alien, 'Alien::Base'; my $prefix = $alien->runtime_prop->{prefix}; is $alien->cflags, "-I$prefix/include -DFOO=1"; is $alien->libs, "-L$prefix/lib -lfoo"; ok -f path($prefix)->child('lib/libfoo.a'); }; }; subtest 'alien_install_type_is' => sub { my $ret; subtest 'no alienfile' => sub { eval { alienfile q{ die } }; is( intercept { $ret = alien_install_type_is 'system' }, array { event Ok => sub { call pass => F(); call name => 'alien install type is system'; }; event Diag => sub {}; event Diag => sub { call message => 'no alienfile'; }; end; }, 'test for anything', ); is $ret, F(), 'return false'; }; subtest 'is system' => sub { alienfile_ok q{ use alienfile; probe sub { 'system' }; }; is( intercept { $ret = alien_install_type_is 'system', 'some name' }, array { event Ok => sub { call pass => T(); call name => 'some name'; }; end; }, 'check for system', ); is $ret, T(), 'return true'; is( intercept { $ret = alien_install_type_is 'share', 'some name' }, array { event Ok => sub { call pass => F(); call name => 'some name'; }; event Diag => sub {}; event Diag => sub { call message => 'expected install type of share, but got system'; }; end; }, 'check for share', ); is $ret, F(), 'return false'; }; subtest 'is share' => sub { alienfile_ok q{ use alienfile; probe sub { 'share' }; }; is( intercept { $ret = alien_install_type_is 'share', 'some other name' }, array { event Ok => sub { call pass => T(); call name => 'some other name'; }; end; }, 'check for share', ); is $ret, T(), 'return true'; is( intercept { $ret = alien_install_type_is 'system', 'some other name' }, array { event Ok => sub { call pass => F(); call name => 'some other name'; }; event Diag => sub {}; event Diag => sub { call message => 'expected install type of system, but got share'; }; end; }, 'check for system', ); is $ret, F(), 'return false'; }; }; subtest 'alien_download_ok' => sub { subtest 'good download' => sub { alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); probe sub { 'share' }; share { download sub { path('file1')->spew("xx\n"); }; }; }; my $file = alien_download_ok; is( path($file)->slurp, "xx\n", 'file content matches', ); }; subtest 'good download' => sub { alienfile_ok q{ use alienfile; probe sub { 'share' }; share { download sub { }; }; }; my $file; is( intercept { $file = alien_download_ok }, array { event Ok => sub { call pass => F(); }; etc; }, 'test fails', ); is($file, U(), 'return value is undef'); }; }; subtest 'alien_extract_ok' => sub { subtest 'good extract' => sub { alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); probe sub { 'share' }; share { plugin 'Test::Mock', download => 1, extract => { file2 => '', file3 => '' }; }; }; my $dir = alien_extract_ok; is(-d $dir, T(), "dir is dir" ); is(-f path("$dir/file2"), T(), "has file2" ); is(-f path("$dir/file3"), T(), "has file3" ); }; subtest 'bad extract' => sub { alienfile_ok q{ use alienfile; use Path::Tiny qw( path ); probe sub { 'share' }; share { download sub { path('file1')->touch; }; extract sub { (); }; }; }; my $dir; is( intercept { $dir = alien_extract_ok }, array { event Ok => sub { call pass => F(); }; etc; }, 'test fails', ); is( $dir, U(), "dir is undef"); }; }; subtest 'alien_rc' => sub { subtest 'create rc' => sub { alien_rc q{ preload 'Foo::Bar'; package Alien::Build::Plugin::Foo::Bar; use Alien::Build::Plugin; sub init { my($self, $meta) = @_; $meta->prop->{x} = 'y'; } }; note path($ENV{ALIEN_BUILD_RC})->slurp; my $build = alienfile_ok q{ use alienfile }; is( $build->meta_prop->{x}, 'y', ); }; }; subtest 'test for custom subtest' => sub { subtest 'basic pass' => sub { my $ok; my $events = intercept { $ok = alien_subtest 'foo' => sub { ok 1; }; }; is( $events, array { event Subtest => sub { call pass => T(); call name => 'foo'; call buffered => T(); call subevents => array { etc; }; }; end; }, ); is( $ok, T(), ); }; subtest 'basic fail' => sub { my $ok; my $events = intercept { $ok = alien_subtest 'foo' => sub { ok 0; }; }; is( $events, array { event Subtest => sub { call pass => F(); call name => 'foo'; call buffered => T(); call subevents => array { etc; }; }; event Diag => sub {}; end; }, ); is( $ok, F(), ); }; }; subtest 'alien_checkpoint_ok' => sub { alien_subtest 'without build' => sub { is( intercept { alien_checkpoint_ok }, array { event Ok => sub { call pass => F(); call name => "alien checkpoint ok"; }; event Diag => sub {}; event Diag => sub { call message => 'no build to checkpoint'; }; end; }, ); }; alien_subtest 'with failure in checkpont' => sub { alienfile_ok q{ use alienfile }; my $mock = mock 'Alien::Build' => ( override => [ checkpoint => sub { die 'some error in checkpoint'; }, ], ); is( intercept { alien_checkpoint_ok }, array { event Ok => sub { call pass => F(); call name => "alien checkpoint ok"; }; event Diag => sub {}; event Diag => sub { call message => match qr/error in checkpoint: some error in checkpoint/ }; end; }, ); }; alien_subtest 'with goodness and light' => sub { alienfile_ok q{ use alienfile }; is( intercept { alien_checkpoint_ok }, array { event Ok => sub { call pass => T(); call name => 'alien checkpoint ok'; }; end; }, ); }; }; subtest 'alien_resume_ok' => sub { alien_subtest 'with no build' => sub { is( intercept { alien_resume_ok }, array { event Ok => sub { call pass => F(); call name => 'alien resume ok'; }; event Diag => sub {}; event Diag => sub { call message => 'no build to resume'; }; end; }, ); }; subtest 'without checkpoint' => sub { alienfile_ok q{ use alienfile }; is( intercept { alien_resume_ok }, array { event Ok => sub { call pass => F(); call name => 'alien resume ok'; }; event Diag => sub {}; event Diag => sub { call message => 'build has not been checkpointed'; }; end; }, ); }; subtest 'die in resume' => sub { alienfile_ok q{ use alienfile }; my $mock = mock 'Alien::Build' => ( override => [ resume => sub { die 'some error in resume'; }, ], ); alien_checkpoint_ok; is( intercept { alien_resume_ok }, array { event Ok => sub { call pass => F(); call name => 'alien resume ok'; }; event Diag => sub {}; event Diag => sub { call message => match(qr/error in resume: some error in resume/); }; end; }, ); }; subtest 'goodness and light' => sub { alienfile_ok q{ use alienfile }; alien_checkpoint_ok; my $build; is( intercept { $build = alien_resume_ok }, array { event Ok => sub { call pass => T(); call name => 'alien resume ok'; }; end; }, ); isa_ok $build, 'Alien::Build'; }; }; subtest 'targ' => sub { alienfile_ok source => q{ use alienfile; die "targ = @{[ targ ]}" unless targ == 42; }, targ => 42; }; alien_subtest 'alienfile_ok takes a already formed Alien::Build instance' => sub { my $build = alienfile q{ use alienfile }; is( intercept { alienfile_ok $build }, array { event Ok => sub { call pass => T(); call name => 'alienfile compiled'; }; end; }, ); is( intercept { alienfile_ok undef }, array { event Ok => sub { call pass => F(); call name => 'alienfile compiled'; }; event Diag => sub {}; event Diag => sub { call message => 'error: no alienfile given' }; end; }, ); }; subtest 'alienfile_skip_if_missing_prereqs' => sub { foreach my $phase (qw(share system )) { alien_subtest "no missing ($phase)" => sub { my($out, $build) = capture_merged { alienfile qq{ use alienfile; probe sub { '$phase' } } }; note $out if $out; is intercept { alienfile_skip_if_missing_prereqs }, [], ; }; } alien_subtest 'missing configure' => sub { alienfile q{ use alienfile; configure { requires 'Bogus' => '1.23' } }; is intercept { alienfile_skip_if_missing_prereqs }, array { event Plan => sub { call directive => 'SKIP'; call reason => 'Missing configure prereq: Bogus 1.23'; }; end; }; ; }; alien_subtest 'missing configure (no version)' => sub { alienfile q{ use alienfile; configure { requires 'Bogus' } }; is intercept { alienfile_skip_if_missing_prereqs }, array { event Plan => sub { call directive => 'SKIP'; call reason => 'Missing configure prereq: Bogus undef'; }; end; }; ; }; alien_subtest 'missing share' => sub { alienfile q{ use alienfile; probe sub { 'share' }; share { requires 'Bogus2', '2.34'; }; }; is intercept { alienfile_skip_if_missing_prereqs }, array { event Plan => sub { call directive => 'SKIP'; call reason => 'Missing share prereq: Bogus2 2.34'; }; }, ; }; alien_subtest 'missing share (no version)' => sub { alienfile q{ use alienfile; probe sub { 'share' }; share { requires 'Bogus2'; }; }; is intercept { alienfile_skip_if_missing_prereqs }, array { event Plan => sub { call directive => 'SKIP'; call reason => 'Missing share prereq: Bogus2 undef'; }; }, ; }; alien_subtest 'missing system' => sub { alienfile q{ use alienfile; probe sub { 'system' }; sys { requires 'Bogus2', '2.34'; }; }; is intercept { alienfile_skip_if_missing_prereqs }, array { event Plan => sub { call directive => 'SKIP'; call reason => 'Missing system prereq: Bogus2 2.34'; }; }, ; }; alien_subtest 'missing system (no version)' => sub { alienfile q{ use alienfile; probe sub { 'system' }; sys { requires 'Bogus2'; }; }; is intercept { alienfile_skip_if_missing_prereqs }, array { event Plan => sub { call directive => 'SKIP'; call reason => 'Missing system prereq: Bogus2 undef'; }; }, ; }; alien_subtest 'mismatch' => sub { alienfile q{ use alienfile; probe sub { 'system' }; share { requires 'Bogus3', '9.99'; }; }; is intercept { alienfile_skip_if_missing_prereqs }, [], ; is intercept { alienfile_skip_if_missing_prereqs 'share' }, array { event Plan => sub { call directive => 'SKIP'; call reason => 'Missing share prereq: Bogus3 9.99'; }; }, ; }; }; done_testing; Alien-Build-2.84/t/test_alien_cancompile.t000644 000000 000000 00000002512 14710030646 020464 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::CanCompile (); use ExtUtils::CBuilder; use Capture::Tiny qw( capture_merged ); subtest 'unmocked' => sub { my($diag, $ta_cc_skip, $eucb_have_compiler) = capture_merged { !!Test::Alien::CanCompile->skip, !!ExtUtils::CBuilder->new->have_compiler, }; note $diag; is( $ta_cc_skip, !$eucb_have_compiler, 'skip computed by Test::Alien::CanCompile should match ExtUtils::CBuilder#have_compiler' ); }; subtest 'skip/import' => sub { my $have_compiler; my $mock = mock 'ExtUtils::CBuilder' => ( override => [ have_compiler => sub { $have_compiler }, ], ); subtest 'have compiler' => sub { $have_compiler = 1; is [Test::Alien::CanCompile->skip], [F()], 'skip' ; is intercept { Test::Alien::CanCompile->import }, [], 'import', ; }; subtest 'no compiler' => sub { $have_compiler = 0; is [Test::Alien::CanCompile->skip], ['This test requires a compiler.'], 'skip' ; is intercept { Test::Alien::CanCompile->import }, array { event Plan => sub { call directive => 'SKIP'; call reason => 'This test requires a compiler.'; }; end; }, 'import', ; }; }; done_testing; Alien-Build-2.84/t/test_alien_canplatypus.t000644 000000 000000 00000002060 14710030646 020713 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::CanPlatypus (); use ExtUtils::CBuilder; subtest 'skip/import' => sub { subtest 'have platypus' => sub { local $INC{'FFI/Platypus.pm'} = __FILE__; is [Test::Alien::CanPlatypus->skip], [F()], 'skip' ; is intercept { Test::Alien::CanPlatypus->import }, [], 'import', ; }; subtest 'no platypus' => sub { $Devel::Hide::VERBOSE = $Devel::Hide::VERBOSE = 0; skip_all 'test does not work on Perl 5.8' unless $] >= 5.010; skip_all 'subtest requires Devel::Hide' unless eval { require Devel::Hide }; Devel::Hide->import( 'FFI::Platypus' ); is [Test::Alien::CanPlatypus->skip], ['This test requires FFI::Platypus.'], 'skip' ; is intercept { Test::Alien::CanPlatypus->import }, array { event Plan => sub { call directive => 'SKIP'; call reason => 'This test requires FFI::Platypus.'; }; end; }, 'import', ; }; }; done_testing; Alien-Build-2.84/t/test_alien_diag.t000644 000000 000000 00000017524 14710030646 017267 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien::Diag; subtest 'empty' => sub { { package Alien::Empty; } my $e; is $e = intercept { alien_diag 'Alien::Empty' }, array { event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => 'no diagnostics found for Alien::Empty'; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; end; } ; note $_ for map { $_->message } @$e; }; subtest 'all-the-things' => sub { { package Alien::Foo; use constant cflags => '-I/foo/include'; use constant libs => '-L/foo/lib -lfoo'; use constant version => '1.2.3'; use constant install_type => 'system'; sub dynamic_libs { qw( /foo/lib/libfoo.so.1.2.3 /foo/lib/libfoo.so.1 /foo/lib/libfoo.so ); } sub bin_dir { qw( /foo/bin ); } } my $e; is $e = intercept { alien_diag 'Alien::Foo' }, array { event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => match qr{Alien::Foo->cflags\s+= -I/foo/include}; }; event Diag => sub { call message => match qr{Alien::Foo->install_type\s+= system}; }; event Diag => sub { call message => match qr{Alien::Foo->libs\s+= -L/foo/lib -lfoo}; }; event Diag => sub { call message => match qr{Alien::Foo->version\s+= 1\.2\.3}; }; event Diag => sub { call message => match qr{Alien::Foo->bin_dir\s+= /foo/bin}; }; event Diag => sub { call message => match qr{Alien::Foo->dynamic_libs\s+= /foo/lib/libfoo\.so\.1\.2\.3$}; }; event Diag => sub { call message => match qr{Alien::Foo->dynamic_libs\s+= /foo/lib/libfoo\.so\.1$}; }; event Diag => sub { call message => match qr{Alien::Foo->dynamic_libs\s+= /foo/lib/libfoo\.so$}; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; end; } ; note $_ for map { $_->message } @$e; }; subtest 'undef' => sub { { package Alien::Foo1; use constant cflags => undef; use constant libs => undef; use constant version => '4.5.6'; use constant install_type => 'share'; } my $e; is $e = intercept { alien_diag 'Alien::Foo1' }, array { event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => match qr{Alien::Foo1->cflags\s+= \[undef\]}; }; event Diag => sub { call message => match qr{Alien::Foo1->install_type\s+= share}; }; event Diag => sub { call message => match qr{Alien::Foo1->libs\s+= \[undef\]}; }; event Diag => sub { call message => match qr{Alien::Foo1->version\s+= 4\.5\.6}; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; end; }; note $_ for map { $_->message } @$e; }; subtest 'extra properties' => sub { { package Alien::Foo2; use constant frooble => 'bits'; sub foo { qw( bar baz ) } } my $e; is $e = intercept { alien_diag 'Alien::Foo2', { properties => ['frooble'], list_properties => ['foo'] } }, array { event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => match qr{Alien::Foo2->frooble\s+= bits}; }; event Diag => sub { call message => match qr{Alien::Foo2->foo\s+= bar}; }; event Diag => sub { call message => match qr{Alien::Foo2->foo\s+= baz}; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; end; }; note $_ for map { $_->message } @$e; is $e = intercept { alien_diag 'Alien::Foo2', { properties => ['frooble'], list_properties => ['foo'], xor => 1 } }, array { event Diag => sub { call message => ''; }; event Diag => sub { call message => 'warning: unknown option for alien_diag: xor'; }; event Diag => sub { call message => '(you should check for typos or maybe upgrade to a newer version of Alien::Build)'; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => match qr{Alien::Foo2->frooble\s+= bits}; }; event Diag => sub { call message => match qr{Alien::Foo2->foo\s+= bar}; }; event Diag => sub { call message => match qr{Alien::Foo2->foo\s+= baz}; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; end; }, 'invalid option'; note $_ for map { $_->message } @$e; is $e = intercept { alien_diag 'Alien::Foo2', { properties => ['frooble'], list_properties => ['foo'], abc => 1, def => 2 } }, array { event Diag => sub { call message => ''; }; event Diag => sub { call message => 'warning: unknown options for alien_diag: abc def'; }; event Diag => sub { call message => '(you should check for typos or maybe upgrade to a newer version of Alien::Build)'; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => match qr{Alien::Foo2->frooble\s+= bits}; }; event Diag => sub { call message => match qr{Alien::Foo2->foo\s+= bar}; }; event Diag => sub { call message => match qr{Alien::Foo2->foo\s+= baz}; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; end; }, 'invalid options'; note $_ for map { $_->message } @$e; }; subtest 'multiple aliens' => sub { my $e; is $e = intercept { alien_diag 'Alien::Foo', 'Alien::Foo1', 'Alien::Foo2', { properties => ['frooble'], list_properties => ['foo'] } }, array { event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => match qr{Alien::Foo->cflags\s+= -I/foo/include}; }; event Diag => sub { call message => match qr{Alien::Foo->install_type\s+= system}; }; event Diag => sub { call message => match qr{Alien::Foo->libs\s+= -L/foo/lib -lfoo}; }; event Diag => sub { call message => match qr{Alien::Foo->version\s+= 1\.2\.3}; }; event Diag => sub { call message => match qr{Alien::Foo->bin_dir\s+= /foo/bin}; }; event Diag => sub { call message => match qr{Alien::Foo->dynamic_libs\s+= /foo/lib/libfoo\.so\.1\.2\.3$}; }; event Diag => sub { call message => match qr{Alien::Foo->dynamic_libs\s+= /foo/lib/libfoo\.so\.1$}; }; event Diag => sub { call message => match qr{Alien::Foo->dynamic_libs\s+= /foo/lib/libfoo\.so$}; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => match qr{Alien::Foo1->cflags\s+= \[undef\]}; }; event Diag => sub { call message => match qr{Alien::Foo1->install_type\s+= share}; }; event Diag => sub { call message => match qr{Alien::Foo1->libs\s+= \[undef\]}; }; event Diag => sub { call message => match qr{Alien::Foo1->version\s+= 4\.5\.6}; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => match qr{Alien::Foo2->frooble\s+= bits}; }; event Diag => sub { call message => match qr{Alien::Foo2->foo\s+= bar}; }; event Diag => sub { call message => match qr{Alien::Foo2->foo\s+= baz}; }; event Diag => sub { call message => ''; }; event Diag => sub { call message => ''; }; end; }; note $_ for map { $_->message } @$e; }; done_testing; Alien-Build-2.84/t/test_alien_run.t000644 000000 000000 00000023373 14710030646 017166 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use File::Which (); use File::Temp qw( tempdir ); use Path::Tiny qw( path ); our $which; our $system; BEGIN { $which = \&File::Which::which; no warnings; *File::Which::which = sub { $which->(@_); }; $system = sub { CORE::system(@_); }; *CORE::GLOBAL::system = sub { $system->(@_) }; }; use Test::Alien; alien_ok synthetic {}; sub _prog ($) { my($code) = @_; my($package, $filename, $line) = caller; my $pl = path(tempdir( CLEANUP => 1 ))->child('test.pl'); open my $fh, '>', $pl; print $fh qq{# line @{[ $line ]} "@{[ $filename ]}"\n}; print $fh $code; close $fh; $pl; } subtest 'run with exit 0' => sub { my $run; my $prog = _prog q{ use strict; use warnings; print "this is some output"; print STDERR "this is some error"; }; is( intercept { $run = run_ok [ $^X, $prog ], 'run it!' }, array { event Ok => sub { call pass => T(); call name => 'run it!'; }; event Note => sub { call message => " using $^X"; }; end; }, "run_ok", ); $run->note; is $run->out, 'this is some output', 'output'; is $run->err, 'this is some error', 'error'; is $run->exit, 0, 'exit'; is $run->signal, 0, 'signal'; is( intercept { $run->success }, array { event Ok => sub { call pass => T(); call name => "command succeeded" }; end; }, "run.success", ); is( intercept { $run->exit_is(0) }, array { event Ok => sub { call pass => T(); call name => "command exited with value 0"; }; end; }, "run.exit_is(0)", ); is( intercept { $run->exit_is(22) }, array { event Ok => sub { call pass => F(); call name => "command exited with value 22"; }; event Diag => sub {}; event Diag => sub { call message => ' actual exit value was: 0'; }; end; }, "run.exit_is(22)", ); is( intercept { $run->exit_isnt(0) }, array { event Ok => sub { call pass => F(); call name => "command exited with value not 0"; }; event Diag => sub {}; event Diag => sub { call message => ' actual exit value was: 0'; }; end; }, "run.exit_isnt(0)", ); is( intercept { $run->exit_isnt(22) }, array { event Ok => sub { call pass => T(); call name => "command exited with value not 22"; }; end; }, "run.exit_isnt(22)", ); is( intercept { $run->out_like(qr{is some out}) }, array { event Ok => sub { call pass => T(); call name => validator(sub{/^output matches/ }); }; end; }, "run.out_like(is some out)", ); is( intercept { $run->out_like(qr{bogus}) }, array { event Ok => sub { call pass => F(); call name => validator(sub{/^output matches/ }); }; event Diag => sub {}; event Diag => sub { call message => ' out:'; }; event Diag => sub { call message => ' this is some output'; }; event Diag => sub { call message => ' does not match:'; }; event Diag => sub { call message => validator(sub{/^ /}); }; end; }, "run.out_like(bogus)", ); is( intercept { $run->out_unlike(qr{is some out}) }, array { event Ok => sub { call pass => F(); call name => validator(sub{/^output does not match/ }); }; event Diag => sub {}; event Diag => sub { call message => ' out:'; }; event Diag => sub { call message => ' this is some output'; }; event Diag => sub { call message => ' matches:'; }; event Diag => sub { call message => validator(sub{/^ /}); }; end; }, "run.out_unlike(is some out)", ); is( intercept { $run->out_unlike(qr{bogus}) }, array { event Ok => sub { call pass => T(); call name => validator(sub{/^output does not match/ }); }; end; }, "run.out_unlike(bogus)", ); is( intercept { $run->err_like(qr{is some err}) }, array { event Ok => sub { call pass => T(); call name => validator(sub{/^standard error matches/ }); }; end; }, "run.err_like(is some err)", ); is( intercept { $run->err_unlike(qr{bogus}) }, array { event Ok => sub { call pass => T(); call name => validator(sub{/^standard error does not match/ }); }; end; }, "run.err_unlike(bogus)", ); }; subtest 'run with exit 22' => sub { my $run; my $prog = _prog q{ use strict; use warnings; print "2x"; print STDERR "3x"; exit 22; }; is( intercept { $run = run_ok [ $^X, $prog ], 'run it!' }, array { event Ok => sub { call pass => T(); call name => 'run it!'; }; event Note => sub { call message => " using $^X"; }; end; }, "run_ok", ); is $run->out, '2x', 'output'; is $run->err, '3x', 'error'; is $run->exit, 22, 'exit'; is $run->signal, 0, 'signal'; is( intercept { $run->success }, array { event Ok => sub { call pass => F(); call name => "command succeeded" }; event Diag => sub {}; event Diag => sub { call message => ' command exited with 22'; }; end; }, "run.success", ); is( intercept { $run->exit_is(0) }, array { event Ok => sub { call pass => F(); call name => "command exited with value 0"; }; event Diag => sub {}; event Diag => sub { call message => ' actual exit value was: 22'; }; end; }, "run.exit_is(0)", ); is( intercept { $run->exit_is(22) }, array { event Ok => sub { call pass => T(); call name => "command exited with value 22"; }; end; }, "run.exit_is(22)", ); is( intercept { $run->exit_isnt(0) }, array { event Ok => sub { call pass => T(); call name => "command exited with value not 0"; }; end; }, "run.exit_isnt(0)", ); is( intercept { $run->exit_isnt(22) }, array { event Ok => sub { call pass => F(); call name => "command exited with value not 22"; }; event Diag => sub {}; event Diag => sub { call message => ' actual exit value was: 22'; }; end; }, "run.exit_isnt(22)", ); }; subtest 'run with kill 9' => sub { skip_all "Test doesn't make sense on Windows" if $^O eq 'MSWin32'; my $prog = _prog q{ use strict; use warnings; kill 9, $$; }; my $run; is( intercept { $run = run_ok [ $^X, $prog ], 'run it!' }, array { event Ok => sub { call pass => F(); call name => 'run it!'; }; event Diag => sub {}; event Diag => sub { call message => " using $^X"; }; event Diag => sub { if($^O eq 'haiku') { call message => match qr/^ killed with signal: (9|21)$/; } else { call message => " killed with signal: 9"; } }; end; }, "run_ok", ); is $run->out, '', 'output'; is $run->err, '', 'error'; is $run->exit, 0, 'exit'; if($^O eq 'haiku') { like $run->signal, qr/^(9|21)$/, 'signal'; } else { is $run->signal, 9, 'signal'; } is( intercept { $run->success }, array { event Ok => sub { call pass => F(); call name => "command succeeded" }; event Diag => sub {}; event Diag => sub { if($^O eq 'haiku') { call message => match qr/^ command killed with (9|21)$/; } else { call message => " command killed with 9"; } }; end; }, "run.success", ); }; subtest 'run with not found' => sub { local $which = sub { undef() }; my $run; is( intercept { $run = run_ok [ qw( foo bar baz ) ] }, array { event Ok => sub { call pass => F(); call name => 'run foo bar baz'; }; event Diag => sub {}; event Diag => sub { call message => " command not found"; }; end; }, "run_ok", ); is $run->out, '', 'output'; is $run->err, '', 'error'; is $run->exit, 0, 'exit'; is $run->signal, 0, 'signal'; is( intercept { $run->success }, array { event Ok => sub { call pass => F(); call name => "command succeeded" }; event Diag => sub {}; event Diag => sub { call message => ' command not found'; }; end; }, "run.success", ); }; subtest 'run -1' => sub { local $which = sub { '/baz/bar/foo' }; local $system = sub { $? = -1; $! = 2; }; my $run; is( intercept { $run = run_ok [ qw( foo bar baz ) ] }, array { event Ok => sub { call pass => F(); call name => 'run foo bar baz'; }; event Diag => sub {}; event Diag => sub { call message => " using /baz/bar/foo"; }; event Diag => sub { call message => validator(sub{/^ failed to execute:/ }); }; end; }, "run_ok", ); is $run->out, '', 'output'; is $run->err, '', 'error'; is $run->exit, 0, 'exit'; is $run->signal, 0, 'signal'; is( intercept { $run->success }, array { event Ok => sub { call pass => F(); call name => "command succeeded" }; event Diag => sub {}; event Diag => sub { call message => validator(sub{/^ failed to execute:/ }); }; end; }, "run.success", ); }; done_testing; Alien-Build-2.84/t/test_alien_synthetic.t000644 000000 000000 00000003565 14710030646 020375 0ustar00rootroot000000 000000 use 5.008004; use Test2::V0 -no_srand => 1; use Test::Alien; use File::Temp qw( tempdir ); use Path::Tiny qw( path ); is( synthetic(), object { prop blessed => 'Test::Alien::Synthetic'; prop reftype => 'HASH'; call cflags => ''; call libs => ''; call sub { [shift->dynamic_libs] } => []; call sub { [shift->bin_dir] } => []; }, 'empty synthetic alien', ); is( synthetic({ cflags => '-DFOO=1 -I/foo/bar/baz'}), object { prop blessed => 'Test::Alien::Synthetic'; call cflags => '-DFOO=1 -I/foo/bar/baz'; call cflags_static => '-DFOO=1 -I/foo/bar/baz'; }, 'cflags', ); is( synthetic({ libs => '-L/foo/bar/baz -lfoo'}), object { prop blessed => 'Test::Alien::Synthetic'; call libs => '-L/foo/bar/baz -lfoo'; call libs_static => '-L/foo/bar/baz -lfoo'; }, 'libs', ); is( synthetic({ dynamic_libs => [qw( foo bar baz )] }), object { prop blessed => 'Test::Alien::Synthetic'; call sub { [shift->dynamic_libs] } => [qw( foo bar baz )]; }, 'dynamic_libs', ); my $dir = tempdir( CLEANUP => 1 ); is( synthetic({ bin_dir => $dir }), object { prop blessed => 'Test::Alien::Synthetic'; call bin_dir => $dir; }, 'bin_dir (exists)', ); is( synthetic({ bin_dir => path($dir)->child('foo')->stringify }), object { prop blessed => 'Test::Alien::Synthetic'; call sub { [shift->bin_dir] } => []; }, 'bin_dir (does not exist)', ); is( synthetic({ cflags => '-DCFLAGS=1', cflags_static => '-DCFLAGS_STATIC=1', libs => '-L/lib -lfoo', libs_static => '-L/lib -lfoo -lbar -lbaz' }), object { prop blessed => 'Test::Alien::Synthetic'; call cflags => '-DCFLAGS=1'; call cflags_static => '-DCFLAGS_STATIC=1'; call libs => '-L/lib -lfoo'; call libs_static => '-L/lib -lfoo -lbar -lbaz'; }, 'static flags', ); done_testing; Alien-Build-2.84/weaver.ini000644 000000 000000 00000000164 14710030646 015506 0ustar00rootroot000000 000000 [@CorePrep] [-SingleEncoding] [Name] [Version] [Region / prelude] [Leftovers] [Region / postlude] [Authors] [Legal] Alien-Build-2.84/xt/000755 000000 000000 00000000000 14710030646 014146 5ustar00rootroot000000 000000 Alien-Build-2.84/xt/author/000755 000000 000000 00000000000 14710030646 015450 5ustar00rootroot000000 000000 Alien-Build-2.84/xt/author/critic.t000644 000000 000000 00000000516 14710030646 017114 0ustar00rootroot000000 000000 use Test2::Require::Module 'Test2::Tools::PerlCritic'; use Test2::Require::Module 'Perl::Critic'; use Test2::Require::Module 'Perl::Critic::Community'; use Test2::V0; use Perl::Critic; use Test2::Tools::PerlCritic; my $critic = Perl::Critic->new( -profile => 'perlcriticrc', ); perl_critic_ok ['lib','t'], $critic; done_testing; Alien-Build-2.84/xt/author/eol.t000644 000000 000000 00000000510 14710030646 016410 0ustar00rootroot000000 000000 use strict; use warnings; use Test::More; BEGIN { plan skip_all => 'test requires Test::EOL' unless eval q{ use Test::EOL; 1 }; }; use Test::EOL; use FindBin; use File::Spec; chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir)); all_perl_files_ok(grep { -e $_ } qw( bin lib t Makefile.PL )); Alien-Build-2.84/xt/author/filename.t000644 000000 000000 00000000720 14710030646 017414 0ustar00rootroot000000 000000 use Test2::V0 -no_srand => 1; use File::chdir; use File::Find qw( find ); use File::Basename qw( basename ); my $basename = basename $CWD; my $dev = $basename =~ /^([A-Z]+)(-[A-Z]+)*$/i; local $CWD = '..'; find(sub { my $path = $File::Find::name; return if $path =~ /^$basename\/\./; return if $dev && $path =~ /^$basename\/$basename-/; my $length = length($path); cmp_ok $length, '<', 100, "$path"; }, $basename); note "dev = $dev"; done_testing; Alien-Build-2.84/xt/author/no_tabs.t000644 000000 000000 00000000522 14710030646 017261 0ustar00rootroot000000 000000 use strict; use warnings; use Test::More; BEGIN { plan skip_all => 'test requires Test::NoTabs' unless eval q{ use Test::NoTabs; 1 }; }; use Test::NoTabs; use FindBin; use File::Spec; chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir)); all_perl_files_ok( grep { -e $_ } qw( bin lib t Makefile.PL )); Alien-Build-2.84/xt/author/pod.t000644 000000 000000 00000000472 14710030646 016422 0ustar00rootroot000000 000000 use strict; use warnings; use Test::More; BEGIN { plan skip_all => 'test requires Test::Pod' unless eval q{ use Test::Pod; 1 }; }; use Test::Pod; use FindBin; use File::Spec; chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir)); all_pod_files_ok( grep { -e $_ } qw( bin lib )); Alien-Build-2.84/xt/author/pod_coverage.t000644 000000 000000 00000004001 14710030646 020265 0ustar00rootroot000000 000000 use strict; use warnings; use Test::More; BEGIN { plan skip_all => 'test requires 5.010 or better' unless $] >= 5.010; plan skip_all => 'test requires Test::Pod::Coverage' unless eval q{ use Test::Pod::Coverage; 1 }; plan skip_all => 'test requires YAML' unless eval q{ use YAML; 1; }; plan skip_all => 'test does not always work in cip check' if defined $ENV{CIPSTATIC} && $ENV{CIPSTATIC} eq 'true'; }; use Test::Pod::Coverage; use YAML qw( LoadFile ); use FindBin; use File::Spec; my $config_filename = File::Spec->catfile( $FindBin::Bin, File::Spec->updir, File::Spec->updir, 'author.yml' ); my $config; $config = LoadFile($config_filename) if -r $config_filename; plan skip_all => 'disabled' if $config->{pod_coverage}->{skip}; chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir)); my @private_classes; my %private_methods; push $config->{pod_coverage}->{private}->@*, 'Alien::.*::Install::Files#Inline'; foreach my $private ($config->{pod_coverage}->{private}->@*) { my($class,$method) = split /#/, $private; if(defined $class && $class ne '') { my $regex = eval 'qr{^' . $class . '$}'; if(defined $method && $method ne '') { push @private_classes, { regex => $regex, method => $method }; } else { push @private_classes, { regex => $regex, all => 1 }; } } elsif(defined $method && $method ne '') { $private_methods{$_} = 1 for split /,/, $method; } } my @classes = all_modules; plan tests => scalar @classes; foreach my $class (@classes) { SKIP: { my($is_private_class) = map { 1 } grep { $class =~ $_->{regex} && $_->{all} } @private_classes; skip "private class: $class", 1 if $is_private_class; my %methods = map {; $_ => 1 } map { split /,/, $_->{method} } grep { $class =~ $_->{regex} } @private_classes; $methods{$_} = 1 for keys %private_methods; my $also_private = eval 'qr{^' . join('|', keys %methods ) . '$}'; pod_coverage_ok $class, { also_private => [$also_private] }; }; } Alien-Build-2.84/xt/author/pod_link.t000644 000000 000000 00000000705 14710030646 017436 0ustar00rootroot000000 000000 use Test2::Require::Module 'Test::Pod::LinkCheck::Lite'; use Test2::Require::EnvVar 'POD_CHECK'; use Test2::V0; use Test::Pod::LinkCheck::Lite; my @checks; if(-d 'blib/script') { push @checks, 'blib/script'; } elsif(-d 'bin') { push @checks, 'bin'; } if(-d 'blib') { push @checks, 'blib'; } else { push @checks, 'lib'; diag "checking lib instead of blib"; } Test::Pod::LinkCheck::Lite ->new ->all_pod_files_ok(@checks); done_testing; Alien-Build-2.84/xt/author/pod_spelling_system.t000644 000000 000000 00000002367 14710030646 021730 0ustar00rootroot000000 000000 use strict; use warnings; use Test::More; BEGIN { plan skip_all => 'test requires Test::Spelling' unless eval q{ use Test::Spelling; 1 }; plan skip_all => 'test requires YAML' unless eval q{ use YAML; 1; }; }; use Test::Spelling; use YAML qw( LoadFile ); use FindBin; use File::Spec; my $config_filename = File::Spec->catfile( $FindBin::Bin, File::Spec->updir, File::Spec->updir, 'author.yml' ); my $config; $config = LoadFile($config_filename) if -r $config_filename; plan skip_all => 'disabled' if $config->{pod_spelling_system}->{skip}; chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir)); add_stopwords($config->{pod_spelling_system}->{stopwords}->@*); add_stopwords(qw( Plicease stdout stderr stdin subref loopback username os Ollis Mojolicious plicease CPAN reinstall TODO filename filenames login callback callbacks standalone VMS hostname hostnames TCP UDP IP API MSWin32 OpenBSD FreeBSD NetBSD unencrypted WebSocket WebSockets timestamp timestamps poney BackPAN portably RedHat AIX BSD XS FFI perlish optimizations subdirectory RESTful SQLite JavaScript dir plugins munge jQuery namespace PDF PDFs usernames DBI pluggable APIs SSL JSON YAML uncommented Solaris OpenVMS URI URL CGI )); all_pod_files_spelling_ok; Alien-Build-2.84/xt/author/version.t000644 000000 000000 00000001473 14710030646 017327 0ustar00rootroot000000 000000 use strict; use warnings; use Test::More; use FindBin (); BEGIN { plan skip_all => "test requires Test::Version 2.00" unless eval q{ use Test::Version 2.00 qw( version_all_ok ), { has_version => 1, filename_match => sub { $_[0] !~ m{/(ConfigData|Install/Files)\.pm$} }, }; 1 }; plan skip_all => 'test requires YAML' unless eval q{ use YAML; 1; }; } use YAML qw( LoadFile ); use FindBin; use File::Spec; my $config_filename = File::Spec->catfile( $FindBin::Bin, File::Spec->updir, File::Spec->updir, 'author.yml' ); my $config; $config = LoadFile($config_filename) if -r $config_filename; if($config->{version}->{dir}) { note "using dir " . $config->{version}->{dir} } version_all_ok($config->{version}->{dir} ? ($config->{version}->{dir}) : ()); done_testing; Alien-Build-2.84/xt/release/000755 000000 000000 00000000000 14710030646 015566 5ustar00rootroot000000 000000 Alien-Build-2.84/xt/release/changes.t000644 000000 000000 00000001113 14710030646 017357 0ustar00rootroot000000 000000 use strict; use warnings; use Test::More; BEGIN { plan skip_all => 'test requires Test::CPAN::Changes' unless eval q{ use Test::CPAN::Changes; 1 }; }; use Test::CPAN::Changes; use FindBin; use File::Spec; chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir)); do { my $old = \&Test::Builder::carp; my $new = sub { my($self, @messages) = @_; return if $messages[0] =~ /^Date ".*" is not in the recommend format/; $old->($self, @messages); }; no warnings 'redefine'; *Test::Builder::carp = $new; }; changes_file_ok; done_testing; Alien-Build-2.84/xt/release/fixme.t000644 000000 000000 00000000616 14710030646 017066 0ustar00rootroot000000 000000 use strict; use warnings; use Test::More; BEGIN { plan skip_all => 'test requires Test::Fixme' unless eval q{ use Test::Fixme 0.14; 1 }; }; use Test::Fixme 0.07; use FindBin; use File::Spec; chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir)); run_tests( match => qr/FIXME/, where => [ grep { -e $_ } qw( bin lib t Makefile.PL Build.PL )], warn => 1, );