Imported Upstream version 0.19 upstream/0.19
authorTizenOpenSource <tizenopensrc@samsung.com>
Thu, 8 Feb 2024 04:48:47 +0000 (13:48 +0900)
committerTizenOpenSource <tizenopensrc@samsung.com>
Thu, 8 Feb 2024 04:48:47 +0000 (13:48 +0900)
30 files changed:
Changes [new file with mode: 0644]
INSTALL [new file with mode: 0644]
LICENSE [new file with mode: 0644]
MANIFEST [new file with mode: 0644]
META.json [new file with mode: 0644]
META.yml [new file with mode: 0644]
Makefile.PL [new file with mode: 0644]
README [new file with mode: 0644]
alienfile [new file with mode: 0644]
author.yml [new file with mode: 0644]
corpus/basic.xml [new file with mode: 0644]
dist.ini [new file with mode: 0644]
lib/Alien/Libxml2.pm [new file with mode: 0644]
maint/cip-before-install [new file with mode: 0755]
maint/tags-to-versions.pl [new file with mode: 0644]
perlcriticrc [new file with mode: 0644]
t/00_diag.t [new file with mode: 0644]
t/alien_libxml2.t [new file with mode: 0644]
t/c/test.c [new file with mode: 0644]
xt/author/critic.t [new file with mode: 0644]
xt/author/eol.t [new file with mode: 0644]
xt/author/no_tabs.t [new file with mode: 0644]
xt/author/pod.t [new file with mode: 0644]
xt/author/pod_coverage.t [new file with mode: 0644]
xt/author/pod_spelling_common.t [new file with mode: 0644]
xt/author/pod_spelling_system.t [new file with mode: 0644]
xt/author/strict.t [new file with mode: 0644]
xt/author/version.t [new file with mode: 0644]
xt/release/changes.t [new file with mode: 0644]
xt/release/fixme.t [new file with mode: 0644]

diff --git a/Changes b/Changes
new file mode 100644 (file)
index 0000000..3e817a2
--- /dev/null
+++ b/Changes
@@ -0,0 +1,66 @@
+Revision history for Alien-Libxml2
+
+0.19      2022-09-25 08:54:48 -0600
+
+0.18_01   2022-09-23 21:05:53 -0600
+  - Use Download::GitLab plugin to fetch recent version of
+    libxml2
+
+0.17      2020-11-02 12:03:28 -0700
+  - Bump required version of AB for bug fixes (gh#23, gh#24)
+
+0.16      2020-04-22 03:50:16 -0600
+  - Fix mixed probe on macOS (gh#20)
+
+0.15      2020-03-18 23:16:56 -0600
+  - Updated documentation to use Alien::Base::Wrapper
+  - Updated documentation refrences to Alien::LibXML (gh#18, gh#19)
+
+0.14      2020-03-09 10:59:12 -0600
+  - Support for Visual C++ Perl + Vcpkg system install (gh#17)
+
+0.12      2019-12-13 17:35:02 -0700
+  - Support for Visual C++ Perl (gh#14)
+
+0.11      2019-10-28 09:54:24 -0600
+  - Production release identical to 0.11.
+
+0.10_01   2019-07-05 09:36:21 -0400
+  - Prefer xml2-config over pkg-config (gh#11, gh#12)
+
+0.09      2019-05-14 06:57:21 -0600
+  - Production release identical to 0.08_01.
+
+0.08_01   2019-05-13 22:10:45 -0600
+  - Fix bug in xml2-config logic
+
+0.07      2019-03-27 11:37:47 -0400
+  - Add ability to find libxml2 via pkg-config (requires Alien::Build
+    1.61 or better).  Previous methods for finding libxml2 like
+    xml2-config or if -lxml2 happens to work will still work (gh#6).
+
+0.06      2019-03-19 22:54:55 -0400
+  - Fixes for Windows (gh#2, gh#3)
+
+0.05      2019-03-03 14:36:02 -0500
+  - Use http instead of ftp to fetch libxml2 sources.
+
+0.04_01   2018-07-10 14:15:41 -0400
+  - Fixed the blacklist of bad versions of libxml2.  It is based
+    on the list of versions rejected by XML-LibXML.
+  - As with XML-LibXML, you can force Alien-Libxml2 to install by
+    setting the environment variable FORCE to a true value.
+
+0.03      2017-09-22 06:46:14 -0400
+  - Look for libxml2 in some standard places.
+    OS X, for example provides a libxml2, but (unhelpfully) does not
+    provide the .pc file to go along with it.
+  - Do not accept same bad versions refused by XML::LibXML
+    on share install
+
+0.02      2017-08-08 15:17:54 -0400
+  - Require Alien::Build 0.73 for bug fixes
+    related to parallel builds
+
+0.01      2017-03-30 18:05:22 -0400
+  - initial version
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..46dbcee
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,75 @@
+This is the Perl distribution Alien-Libxml2.
+
+Installing Alien-Libxml2 is straightforward.
+
+## Installation with cpanm
+
+If you have cpanm, you only need one line:
+
+    % cpanm Alien::Libxml2
+
+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::Libxml2
+
+## 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::Libxml2
+
+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-Libxml2 documentation is available as POD.
+You can run `perldoc` from a shell to read the documentation:
+
+    % perldoc Alien::Libxml2
+
+For more information on installing Perl modules via CPAN, please see:
+https://www.cpan.org/modules/INSTALL.html
diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
index 0000000..53b201d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,379 @@
+This software is copyright (c) 2013-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) 2013-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.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    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.
+
+  <signature of Ty Coon>, 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) 2013-2022 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
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+The End
+
diff --git a/MANIFEST b/MANIFEST
new file mode 100644 (file)
index 0000000..0d81388
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,31 @@
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.025.
+Changes
+INSTALL
+LICENSE
+MANIFEST
+META.json
+META.yml
+Makefile.PL
+README
+alienfile
+author.yml
+corpus/basic.xml
+dist.ini
+lib/Alien/Libxml2.pm
+maint/cip-before-install
+maint/tags-to-versions.pl
+perlcriticrc
+t/00_diag.t
+t/alien_libxml2.t
+t/c/test.c
+xt/author/critic.t
+xt/author/eol.t
+xt/author/no_tabs.t
+xt/author/pod.t
+xt/author/pod_coverage.t
+xt/author/pod_spelling_common.t
+xt/author/pod_spelling_system.t
+xt/author/strict.t
+xt/author/version.t
+xt/release/changes.t
+xt/release/fixme.t
diff --git a/META.json b/META.json
new file mode 100644 (file)
index 0000000..7f962da
--- /dev/null
+++ b/META.json
@@ -0,0 +1,173 @@
+{
+   "abstract" : "Install the C libxml2 library on your system",
+   "author" : [
+      "Graham Ollis <plicease@cpan.org>"
+   ],
+   "dynamic_config" : 1,
+   "generated_by" : "Dist::Zilla version 6.025, CPAN::Meta::Converter version 2.150010",
+   "license" : [
+      "perl_5"
+   ],
+   "meta-spec" : {
+      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+      "version" : 2
+   },
+   "name" : "Alien-Libxml2",
+   "prereqs" : {
+      "build" : {
+         "requires" : {
+            "Alien::Build" : "2.37",
+            "Alien::Build::MM" : "0.32",
+            "ExtUtils::MakeMaker" : "6.52"
+         }
+      },
+      "configure" : {
+         "requires" : {
+            "Alien::Build" : "2.37",
+            "Alien::Build::MM" : "2.37",
+            "Alien::Build::Plugin::Build::SearchDep" : "0.35",
+            "Alien::Build::Plugin::Download::GitLab" : "0",
+            "Alien::Build::Plugin::Prefer::BadVersion" : "1.05",
+            "Alien::Build::Plugin::Probe::Vcpkg" : "0",
+            "ExtUtils::CBuilder" : "0",
+            "ExtUtils::MakeMaker" : "6.52",
+            "perl" : "5.006"
+         }
+      },
+      "develop" : {
+         "recommends" : {
+            "Alien::Build::Plugin::Probe::Vcpkg" : "0",
+            "Dist::Zilla::Plugin::AlienBase::Doc" : "0",
+            "Dist::Zilla::Plugin::AlienBuild" : "0.11",
+            "Dist::Zilla::Plugin::Author::Plicease::Thanks" : "0",
+            "Dist::Zilla::Plugin::Author::Plicease::Upload" : "0",
+            "Dist::Zilla::Plugin::Prereqs" : "0",
+            "Dist::Zilla::Plugin::PruneFiles" : "0",
+            "Dist::Zilla::Plugin::RemovePrereqs" : "0",
+            "Dist::Zilla::PluginBundle::Author::Plicease" : "2.69",
+            "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::ControlStructures::ProhibitLabelsWithSpecialBlockNames" : "0",
+            "Perl::Critic::Policy::ControlStructures::ProhibitMutatingListFunctions" : "0",
+            "Perl::Critic::Policy::ControlStructures::ProhibitUnreachableCode" : "0",
+            "Perl::Critic::Policy::Freenode::ArrayAssignAref" : "0",
+            "Perl::Critic::Policy::Freenode::BarewordFilehandles" : "0",
+            "Perl::Critic::Policy::Freenode::ConditionalDeclarations" : "0",
+            "Perl::Critic::Policy::Freenode::ConditionalImplicitReturn" : "0",
+            "Perl::Critic::Policy::Freenode::DeprecatedFeatures" : "0",
+            "Perl::Critic::Policy::Freenode::DiscouragedModules" : "0",
+            "Perl::Critic::Policy::Freenode::DollarAB" : "0",
+            "Perl::Critic::Policy::Freenode::Each" : "0",
+            "Perl::Critic::Policy::Freenode::EmptyReturn" : "0",
+            "Perl::Critic::Policy::Freenode::IndirectObjectNotation" : "0",
+            "Perl::Critic::Policy::Freenode::LexicalForeachIterator" : "0",
+            "Perl::Critic::Policy::Freenode::LoopOnHash" : "0",
+            "Perl::Critic::Policy::Freenode::ModPerl" : "0",
+            "Perl::Critic::Policy::Freenode::OpenArgs" : "0",
+            "Perl::Critic::Policy::Freenode::OverloadOptions" : "0",
+            "Perl::Critic::Policy::Freenode::POSIXImports" : "0",
+            "Perl::Critic::Policy::Freenode::PackageMatchesFilename" : "0",
+            "Perl::Critic::Policy::Freenode::PreferredAlternatives" : "0",
+            "Perl::Critic::Policy::Freenode::StrictWarnings" : "0",
+            "Perl::Critic::Policy::Freenode::Threads" : "0",
+            "Perl::Critic::Policy::Freenode::Wantarray" : "0",
+            "Perl::Critic::Policy::Freenode::WarningsSwitch" : "0",
+            "Perl::Critic::Policy::Freenode::WhileDiamondDefaultAssignment" : "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" : {
+            "File::Spec" : "0",
+            "FindBin" : "0",
+            "Perl::Critic" : "0",
+            "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::Spelling::CommonMistakes" : "0",
+            "Test::Spelling" : "0",
+            "Test::Strict" : "0",
+            "YAML" : "0"
+         }
+      },
+      "runtime" : {
+         "requires" : {
+            "Alien::Base" : "2.37",
+            "perl" : "5.006"
+         }
+      },
+      "test" : {
+         "requires" : {
+            "Test2::V0" : "0.000121",
+            "Test::Alien" : "0",
+            "perl" : "5.006"
+         }
+      }
+   },
+   "release_status" : "stable",
+   "resources" : {
+      "bugtracker" : {
+         "web" : "https://github.com/PerlAlien/Alien-Libxml2/issues"
+      },
+      "homepage" : "https://metacpan.org/pod/Alien::Libxml2",
+      "repository" : {
+         "type" : "git",
+         "url" : "git://github.com/PerlAlien/Alien-Libxml2.git",
+         "web" : "https://github.com/PerlAlien/Alien-Libxml2"
+      },
+      "x_IRC" : "irc://irc.perl.org/#native"
+   },
+   "version" : "0.19",
+   "x_alienfile" : {
+      "generated_by" : "Dist::Zilla::Plugin::AlienBuild version 0.32",
+      "requires" : {
+         "share" : {
+            "Config" : "0",
+            "HTTP::Tiny" : "0.044",
+            "IO::Socket::SSL" : "1.56",
+            "Mozilla::CA" : "0",
+            "Net::SSLeay" : "1.49",
+            "URI" : "0"
+         },
+         "system" : {}
+      }
+   },
+   "x_contributors" : [
+      "Graham Ollis <plicease@cpan.org>",
+      "Shlomi Fish (shlomif)"
+   ],
+   "x_generated_by_perl" : "v5.36.0",
+   "x_serialization_backend" : "Cpanel::JSON::XS version 4.30",
+   "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later",
+   "x_use_unsafe_inc" : 0
+}
+
diff --git a/META.yml b/META.yml
new file mode 100644 (file)
index 0000000..0f94a7c
--- /dev/null
+++ b/META.yml
@@ -0,0 +1,55 @@
+---
+abstract: 'Install the C libxml2 library on your system'
+author:
+  - 'Graham Ollis <plicease@cpan.org>'
+build_requires:
+  Alien::Build: '2.37'
+  Alien::Build::MM: '0.32'
+  ExtUtils::MakeMaker: '6.52'
+  Test2::V0: '0.000121'
+  Test::Alien: '0'
+  perl: '5.006'
+configure_requires:
+  Alien::Build: '2.37'
+  Alien::Build::MM: '2.37'
+  Alien::Build::Plugin::Build::SearchDep: '0.35'
+  Alien::Build::Plugin::Download::GitLab: '0'
+  Alien::Build::Plugin::Prefer::BadVersion: '1.05'
+  Alien::Build::Plugin::Probe::Vcpkg: '0'
+  ExtUtils::CBuilder: '0'
+  ExtUtils::MakeMaker: '6.52'
+  perl: '5.006'
+dynamic_config: 1
+generated_by: 'Dist::Zilla version 6.025, 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-Libxml2
+requires:
+  Alien::Base: '2.37'
+  perl: '5.006'
+resources:
+  IRC: irc://irc.perl.org/#native
+  bugtracker: https://github.com/PerlAlien/Alien-Libxml2/issues
+  homepage: https://metacpan.org/pod/Alien::Libxml2
+  repository: git://github.com/PerlAlien/Alien-Libxml2.git
+version: '0.19'
+x_alienfile:
+  generated_by: 'Dist::Zilla::Plugin::AlienBuild version 0.32'
+  requires:
+    share:
+      Config: '0'
+      HTTP::Tiny: '0.044'
+      IO::Socket::SSL: '1.56'
+      Mozilla::CA: '0'
+      Net::SSLeay: '1.49'
+      URI: '0'
+    system: {}
+x_contributors:
+  - 'Graham Ollis <plicease@cpan.org>'
+  - 'Shlomi Fish (shlomif)'
+x_generated_by_perl: v5.36.0
+x_serialization_backend: 'YAML::Tiny version 1.73'
+x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later'
+x_use_unsafe_inc: 0
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644 (file)
index 0000000..84328aa
--- /dev/null
@@ -0,0 +1,94 @@
+BEGIN {
+  use strict; use warnings;
+  unless(eval q{ use 5.006; 1}) {
+    print "Perl 5.006 or better required\n";
+    exit;
+  }
+}
+# This file was automatically generated by Dist::Zilla::Plugin::Author::Plicease::MakeMaker v2.72.
+use strict;
+use warnings;
+use 5.006;
+use ExtUtils::MakeMaker;
+
+my %WriteMakefileArgs = (
+  "ABSTRACT"       => "Install the C libxml2 library on your system",
+  "AUTHOR"         => "Graham Ollis <plicease\@cpan.org>",
+  "BUILD_REQUIRES" => {
+    "Alien::Build"        => "2.37",
+    "Alien::Build::MM"    => "0.32",
+    "ExtUtils::MakeMaker" => "6.52"
+  },
+  "CONFIGURE_REQUIRES" => {
+    "Alien::Build"                             => "2.37",
+    "Alien::Build::MM"                         => "2.37",
+    "Alien::Build::Plugin::Build::SearchDep"   => "0.35",
+    "Alien::Build::Plugin::Download::GitLab"   => 0,
+    "Alien::Build::Plugin::Prefer::BadVersion" => "1.05",
+    "Alien::Build::Plugin::Probe::Vcpkg"       => 0,
+    "ExtUtils::CBuilder"                       => 0,
+    "ExtUtils::MakeMaker"                      => "6.52"
+  },
+  "DISTNAME"         => "Alien-Libxml2",
+  "LICENSE"          => "perl",
+  "MIN_PERL_VERSION" => "5.006",
+  "NAME"             => "Alien::Libxml2",
+  "PM"               => {
+    "lib/Alien/Libxml2.pm" => "\$(INST_LIB)/Alien/Libxml2.pm"
+  },
+  "PREREQ_PM" => {
+    "Alien::Base" => "2.37"
+  },
+  "TEST_REQUIRES" => {
+    "Test2::V0"   => "0.000121",
+    "Test::Alien" => 0
+  },
+  "VERSION" => "0.19",
+  "test"    => {
+    "TESTS" => "t/*.t"
+  }
+);
+
+my %FallbackPrereqs = (
+  "Alien::Base"         => "2.37",
+  "Alien::Build"        => "2.37",
+  "Alien::Build::MM"    => "0.32",
+  "ExtUtils::MakeMaker" => "6.52",
+  "Test2::V0"           => "0.000121",
+  "Test::Alien"         => 0
+);
+
+# BEGIN code inserted by Dist::Zilla::Plugin::AlienBuild
+use Alien::Build::MM;
+my $abmm = Alien::Build::MM->new;
+%WriteMakefileArgs = $abmm->mm_args(%WriteMakefileArgs);
+
+# END code inserted by Dist::Zilla::Plugin::AlienBuild
+
+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);
+
+# BEGIN code inserted by Dist::Zilla::Plugin::AlienBuild
+{ package
+    MY;
+
+  sub postamble {
+    $abmm->mm_postamble(@_);
+  }
+
+  sub install {
+    $abmm->can('mm_install')
+      ? $abmm->mm_install(@_)
+      : shift->SUPER::install(@_);
+  }
+}
+
+# END code inserted by Dist::Zilla::Plugin::AlienBuild
\ No newline at end of file
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..61bd231
--- /dev/null
+++ b/README
@@ -0,0 +1,95 @@
+NAME
+
+    Alien::Libxml2 - Install the C libxml2 library on your system
+
+VERSION
+
+    version 0.19
+
+SYNOPSIS
+
+    In your Makefile.PL:
+
+     use ExtUtils::MakeMaker;
+     use Alien::Base::Wrapper ();
+    
+     WriteMakefile(
+       Alien::Base::Wrapper->new('Alien::Libxml2')->mm_args2(
+         # MakeMaker args
+         NAME => 'My::XS',
+         ...
+       ),
+     );
+
+    In your Build.PL:
+
+     use Module::Build;
+     use Alien::Base::Wrapper qw( Alien::Libxml2 !export );
+    
+     my $builder = Module::Build->new(
+       ...
+       configure_requires => {
+         'Alien::Libxml2' => '0',
+         ...
+       },
+       Alien::Base::Wrapper->mb_args,
+       ...
+     );
+    
+     $build->create_build_script;
+
+    In your FFI::Platypus script or module:
+
+     use FFI::Platypus;
+     use Alien::Libxml2;
+    
+     my $ffi = FFI::Platypus->new(
+       lib => [ Alien::Libxml2->dynamic_libs ],
+     );
+
+DESCRIPTION
+
+    This module provides libxml2 for other modules to use.
+
+CAVEATS
+
+    There was an older existing Alien::LibXML, but it uses the older
+    Alien::Build::ModuleBuild and the author prefers this version which is
+    based on the more robust alienfile system.
+
+    libxml2 has some optional prereqs, including zlib and iconv. For a
+    share install you will want to make sure that these are installed prior
+    to installing Alien::Libxml2 if you want to make use of features
+    relying on them.
+
+    For a system install, you want to make sure the development packages
+    for libxml2, zlib and iconv are installed if libxml2 has been
+    configured to use them, otherwise XML::LibXML will not install as
+    expected. If the tests for this module fail with a missing iconv.h or
+    zlib.h, then this is likely the reason.
+
+SEE ALSO
+
+    Alien::LibXML
+
+      Older Alien for the same library.
+
+    XML::LibXML
+
+      Perl interface to libxml2, which uses this Alien
+
+AUTHOR
+
+    Author: Graham Ollis <plicease@cpan.org>
+
+    Contributors:
+
+    Shlomi Fish (shlomif)
+
+COPYRIGHT AND LICENSE
+
+    This software is copyright (c) 2013-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.
+
diff --git a/alienfile b/alienfile
new file mode 100644 (file)
index 0000000..dcfb4eb
--- /dev/null
+++ b/alienfile
@@ -0,0 +1,195 @@
+use alienfile;
+use Config;
+
+configure { requires 'Alien::Build' => '2.37' };
+
+my $test_program = <<'EOF';
+#include <stdio.h>
+#include <libxml/xmlversion.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+int
+main(int argc, char *argv[])
+{
+  xmlDoc *doc = NULL;
+  /*
+   * xmlRead should fail, but having this call ensures
+   * that the we have access to the symbols in -lxml2
+   * (LIBXML_DOTTED_VERSION below is in the header file)
+   */
+  doc = xmlReadFile("foo.xml", NULL, 0);
+  printf("xml version = '%s'\n", LIBXML_DOTTED_VERSION);
+}
+EOF
+
+my @try_flags = (
+  { cflags => '',                             libs => '-lxml2' },
+  { cflags => '-I/usr/include/libxml2',       libs => '-lxml2' },
+  { cflags => '-I/usr/local/include/libxml2', libs => '-lxml2' },
+);
+
+plugin 'Probe::Vcpkg' => 'libxml2';
+
+probe [
+  ['xml2-config', '--version' => \'%{.install.my_version}'],
+  ['xml2-config', '--cflags'  => \'%{.install.my_cflags}'],
+  ['xml2-config', '--libs'    => \'%{.install.my_libs}'],
+];
+
+plugin 'PkgConfig' => 'libxml-2.0';
+
+plugin 'Probe::CBuilder' => (
+  cflags  => $_->{cflags},
+  libs    => $_->{libs},
+  program => $test_program,
+  version => qr{xml version = '(.*?)'},
+) for @try_flags;
+plugin 'PkgConfig::MakeStatic' => ();
+
+my %bad_versions = map { $_ => 1 } (
+  # known bad versions
+  # may have some extras, and may be incomplete.
+  # but probably sufficient.
+  # computed using maint/tags-to-versions.pl and the git repository
+  # for libxml2.
+  '2.0.0',
+  '2.1.0','2.1.1',
+  '2.2.0','2.2.1','2.2.2','2.2.3','2.2.4','2.2.5','2.2.6','2.2.7','2.2.8',
+  '2.3.0','2.3.1','2.3.2','2.3.3','2.3.4','2.3.5','2.3.6','2.3.7','2.3.8','2.3.9','2.3.10','2.3.11','2.3.12','2.3.13','2.3.14',
+  '2.4.0','2.4.1','2.4.2','2.4.3','2.4.4','2.4.5','2.4.6','2.4.7','2.4.8','2.4.9','2.4.10','2.4.11','2.4.12','2.4.13','2.4.14','2.4.15','2.4.16','2.4.17','2.4.18','2.4.19','2.4.20','2.4.21','2.4.22','2.4.23','2.4.24','2.4.25','2.4.26','2.4.27','2.4.28','2.4.29','2.4.30',
+  '2.5.0','2.5.1','2.5.2','2.5.3','2.5.4','2.5.5','2.5.6','2.5.7','2.5.8','2.5.9','2.5.10','2.5.11',
+  '2.6.0','2.6.1','2.6.2','2.6.3','2.6.4','2.6.5','2.6.6','2.6.7','2.6.8','2.6.9','2.6.10','2.6.11','2.6.12','2.6.13','2.6.14','2.6.15','2.6.19','2.6.20','2.6.25',
+  '2.7.0','2.7.1',
+  '2.9.4',
+);
+
+meta->around_hook(
+  probe => sub {
+    my $orig = shift;
+    my $build = shift;
+    my $install_type = $orig->($build, @_);
+    # if the system type is install, make sure the version isn't on the
+    # blacklist.
+    # Honor $ENV{FORCE} used in the Makefile.PL for XML-LibXML to allow
+    # versions on the blacklist.
+    if($install_type eq 'system' && !$ENV{FORCE})
+    {
+      # the first is provided by Probe::CBuilder, or pkg-config plugins for AB >= 1.61
+      # the second is generated by the Probe::CBuilder plugin since forever (or thereabouts)
+      # the thirds is from this alienfile, (see above with the xml2-config probe).
+      my $version = $build->hook_prop->{version}                                    ||
+                    $build->install_prop->{plugin_probe_cbuilder_gather}->{version} ||
+                    $build->install_prop->{my_version};
+
+      $version =~ s/-.*$//g;
+
+      unless(defined $version)
+      {
+        print STDERR "Unfortunately, Alien::Libxml2 requires the version from the system libxml2 in\n",
+                     "order to determine if it is acceptible for use, but Alien::Build prior to 1.61\n",
+                     "did not provide this information in the probe step.  Alien::Libxml2 can still\n",
+                     "find the system libxml2 on systems with xml2-config in the PATH, or if libxml2\n",
+                     "is available from one of the commonly known locations.  If you want to detect\n",
+                     "the system libxml2 with a .pc file via pkg-config, then please upgrade\n",
+                     "Alien::Build to 1.61 or better\n";
+        return 'share';
+      }
+
+      if($bad_versions{$version})
+      {
+        print STDERR "Alien::Libxml2 is designed to work with XML::LibXML.\n\n".
+                     "The installed system version of libxml2 $version is not compatible with XML::LibXML (and probably buggy)!\n\n".
+                     "  - don't expect XML::LibXML to build or work correctly with this version of libxml2!\n" .
+                     "  - don't report errors with this version of libxml2!\n" .
+                     "  - don't send patches for this version of libxml2!\n\n";
+        if($version eq '2.9.4')
+        {
+          print STDERR "XML::LibXML typically attempts to install with this version anyway, so will we.\n";
+        }
+        else
+        {
+          print STDERR "XML::LibXML typcially refuses to install with this version unless forced, so we will\n";
+          print STDERR "attempt to download a newer version from the internet.  If you prefer you can force\n";
+          print STDERR "Alien::Libxml2 to install with this possibly buggy version using:\n";
+          print STDERR "env FORCE=1 perl Makefile.PL\n";
+          print STDERR "or\n";
+          print STDERR "env FORCE=1 cpanm Alien::Libxml2\n";
+          return 'share';
+        }
+      }
+    }
+    $install_type;
+  },
+);
+
+plugin 'Prefer::BadVersion' => [ keys %bad_versions ];
+
+share {
+
+  # out of source build is borked on Windows, so we turn it
+  # off there.  Turn it on elsewhere as it saves a copy.
+  meta->prop->{out_of_source} = $^O eq 'MSWin32' ? 0 : 1;
+
+  plugin 'Download::GitLab' => (
+    gitlab_host     => 'https://gitlab.gnome.org',
+    gitlab_user     => 'GNOME',
+    gitlab_project  => 'libxml2',
+    type            => 'link',
+    format          => 'tar.xz',
+    version_from    => 'tag_name',
+    convert_version => sub {
+      my $version = shift;
+      $version =~ s/^v//;
+      $version;
+    },
+  );
+
+  if($^O eq 'MSWin32' && $Config{ccname} eq 'cl')
+  {
+    build [
+      sub { shift->install_prop->{prefix} =~ s/\//\\/g;},
+      'cd win32',
+      'cscript configure.js prefix=%{.install.prefix} iconv=no compiler=msvc static=yes',
+      'nmake -f Makefile.msvc',
+      'nmake -f Makefile.msvc install',
+    ];
+
+    plugin 'Gather::IsolateDynamic';
+
+    gather sub {
+      my($build) = @_;
+      my $prefix = $build->runtime_prop->{prefix};
+      $build->runtime_prop->{cflags} = "-I$prefix/include/libxml2";
+      $build->runtime_prop->{libs}   = "-L$prefix/lib libxml2_a.lib";
+    };
+  }
+  else
+  {
+    plugin 'Build::Autoconf' => ();
+
+    build [
+      '%{configure} --prefix=%{.install.autoconf_prefix} --without-python --disable-shared --enable-static',
+      '%{make}',
+      '%{make} install',
+    ];
+
+    plugin 'PkgConfig::MakeStatic' => ();
+  }
+
+};
+
+sys {
+
+  meta->after_hook(
+    gather_system => sub {
+      my($build) = @_;
+      return if defined $build->runtime_prop->{libs};
+      if($build->install_prop->{my_libs})
+      {
+        $build->runtime_prop->{$_} = $build->install_prop->{"my_$_"} for qw( version cflags libs );
+      }
+    },
+  );
+
+};
diff --git a/author.yml b/author.yml
new file mode 100644 (file)
index 0000000..03de38a
--- /dev/null
@@ -0,0 +1,14 @@
+---
+pod_spelling_system:
+  # list of words that are spelled correctly
+  # (regardless of what spell check thinks)
+  stopwords:
+    - libxml
+    - FFI
+    - Shlomi
+    - shlomif
+
+pod_coverage:
+  # format is "Class#method" or "Class", regex allowed
+  # for either Class or method.
+  private: []
diff --git a/corpus/basic.xml b/corpus/basic.xml
new file mode 100644 (file)
index 0000000..fab04a8
--- /dev/null
@@ -0,0 +1 @@
+<foo><bar/></foo>
diff --git a/dist.ini b/dist.ini
new file mode 100644 (file)
index 0000000..63e5271
--- /dev/null
+++ b/dist.ini
@@ -0,0 +1,68 @@
+name             = Alien-Libxml2
+author           = Graham Ollis <plicease@cpan.org>
+license          = Perl_5
+copyright_holder = Graham Ollis
+copyright_year   = 2013-2022
+version          = 0.19
+
+; authordep Alien::Build::Plugin::Probe::Vcpkg
+
+[AlienBase::Doc]
+name = libxml2
+type = library
+type = ffi
+
+[@Author::Plicease]
+:version      = 2.69
+release_tests = 1
+installer     = Author::Plicease::MakeMaker
+irc           = irc://irc.perl.org/#native
+test2_v0      = 1
+github_user   = PerlAlien
+
+workflow = linux
+workflow = macos-share
+workflow = macos-system
+workflow = windows-share
+workflow = windows-system
+
+diag_preamble = | $post_diag = sub {
+diag_preamble = |   require Alien::Libxml2;
+diag_preamble = |   diag "version        = ", Alien::Libxml2->config('version');
+diag_preamble = |   diag "cflags         = ", Alien::Libxml2->cflags;
+diag_preamble = |   diag "cflags_static  = ", Alien::Libxml2->cflags_static;
+diag_preamble = |   diag "libs           = ", Alien::Libxml2->libs;
+diag_preamble = |   diag "libs_static    = ", Alien::Libxml2->libs_static;
+diag_preamble = |   diag "bin_dir        = ", $_ for Alien::Libxml2->bin_dir;
+diag_preamble = | };
+
+[AlienBuild]
+:version = 0.11
+
+[RemovePrereqs]
+; comes with Perl
+remove = strict
+remove = warnings
+remove = base
+
+[Prereqs]
+Alien::Base = 2.37
+
+[Prereqs / ConfigureRequires]
+-phase = configure
+Alien::Build = 2.37
+Alien::Build::MM = 2.37
+
+[Prereqs / BuildRequires]
+-phase = build
+Alien::Build = 2.37
+
+[Author::Plicease::Upload]
+cpan = 1
+
+[Author::Plicease::Thanks]
+current = Graham Ollis <plicease@cpan.org>
+contributor = Shlomi Fish (shlomif)
+
+[PruneFiles]
+filename = a.out
diff --git a/lib/Alien/Libxml2.pm b/lib/Alien/Libxml2.pm
new file mode 100644 (file)
index 0000000..daf1e49
--- /dev/null
@@ -0,0 +1,120 @@
+package Alien::Libxml2;
+
+use strict;
+use warnings;
+use base qw( Alien::Base );
+
+# ABSTRACT: Install the C libxml2 library on your system
+our $VERSION = '0.19'; # VERSION
+
+
+
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Alien::Libxml2 - Install the C libxml2 library on your system
+
+=head1 VERSION
+
+version 0.19
+
+=head1 SYNOPSIS
+
+In your Makefile.PL:
+
+ use ExtUtils::MakeMaker;
+ use Alien::Base::Wrapper ();
+
+ WriteMakefile(
+   Alien::Base::Wrapper->new('Alien::Libxml2')->mm_args2(
+     # MakeMaker args
+     NAME => 'My::XS',
+     ...
+   ),
+ );
+
+In your Build.PL:
+
+ use Module::Build;
+ use Alien::Base::Wrapper qw( Alien::Libxml2 !export );
+
+ my $builder = Module::Build->new(
+   ...
+   configure_requires => {
+     'Alien::Libxml2' => '0',
+     ...
+   },
+   Alien::Base::Wrapper->mb_args,
+   ...
+ );
+
+ $build->create_build_script;
+
+In your L<FFI::Platypus> script or module:
+
+ use FFI::Platypus;
+ use Alien::Libxml2;
+
+ my $ffi = FFI::Platypus->new(
+   lib => [ Alien::Libxml2->dynamic_libs ],
+ );
+
+=head1 DESCRIPTION
+
+This module provides C<libxml2> for other modules to use.
+
+=head1 CAVEATS
+
+There was an older existing L<Alien::LibXML>, but it uses the older
+L<Alien::Build::ModuleBuild> and the author prefers this version which
+is based on the more robust L<alienfile> system.
+
+C<libxml2> has some optional prereqs, including C<zlib> and C<iconv>.
+For a C<share> install you will want to make sure that these are installed
+prior to installing L<Alien::Libxml2> if you want to make use of features
+relying on them.
+
+For a system install, you want to make sure the development packages for
+C<libxml2>, C<zlib> and C<iconv> are installed if C<libxml2> has been
+configured to use them, otherwise L<XML::LibXML> will not install as
+expected.  If the tests for this module fail with a missing C<iconv.h>
+or C<zlib.h>, then this is likely the reason.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<Alien::LibXML>
+
+Older Alien for the same library.
+
+=item L<XML::LibXML>
+
+Perl interface to C<libxml2>, which uses this L<Alien>
+
+=back
+
+=head1 AUTHOR
+
+Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>
+
+Contributors:
+
+Shlomi Fish (shlomif)
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2013-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
diff --git a/maint/cip-before-install b/maint/cip-before-install
new file mode 100755 (executable)
index 0000000..739c84d
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+set -ex
+
+if [ "x$CIP_ENV" == "x" ]; then
+  echo "please set CIP_ENV to one of:"
+  echo " export CIP_ENV=ALIEN_INSTALL_TYPE=share"
+  echo " export CIP_ENV=ALIEN_INSTALL_TYPE=system"
+  false
+fi
+
+if echo $CIP_ENV | grep -q system; then
+  echo use system libxml2
+  cip sudo apt-get update
+  cip sudo apt-get -y install libxml2-dev
+else
+  echo use internet libxml2
+fi
+
+cip exec dzil-cpanm -n Alien::Build::Plugin::Download::GitLab
diff --git a/maint/tags-to-versions.pl b/maint/tags-to-versions.pl
new file mode 100644 (file)
index 0000000..f901df3
--- /dev/null
@@ -0,0 +1,118 @@
+use strict;
+use warnings;
+use version;
+
+my @tags = `git tag`;
+chomp @tags;
+
+my %v;
+
+foreach my $version (@tags)
+{
+  next if $version =~ /-rc[0-9]$/; # ignore rc
+  next if $version =~ /^CVE/;
+  next if $version =~ /^PRE_MUCKUP/;
+  next if $version eq 'help';
+  next if $version =~ /^(help|GNUMERIC_FIRST_PUBLIC_RELEASE|ChangeLog|EAZEL-NAUTILUS-MS-AUG07|FOR_GNOME_0_99_1|GNOME_0_30|GNOME_PRINT_0_24|LIBXML2_2_5_x|LIB_XML_1_X)$/;
+
+  my @v;
+
+  if($version =~ /^LIBXML([0-9]+)\.([0-9]+)\.([0-9]+)$/)
+  {
+    @v = ($1,$2,$3);
+  }
+  elsif($version =~ /^LIBXML2_([0-9]+)_([0-9]+)_([0-9]+)$/)
+  {
+    @v = ($1,$2,$3);
+  }
+  elsif($version =~ /^LIBXML_?([0-9]+)_([0-9]+)_([0-9]+)(_REAL)?$/)
+  {
+    @v = ($1,$2,$3);
+  }
+  elsif($version =~ /^LIBXML_TEST_([0-9]+)_([0-9]+)_([0-9]+)?$/)
+  {
+    @v = ($1,$2,$3);
+  }
+  elsif($version =~ /^LIB_?XML_([0-9]+)_([0-9]+)$/)
+  {
+    @v = ($1,$2,$3);
+  }
+  elsif($version =~ /^LIB_?XML_([0-9]+)_([0-9]+)_([0-9]+)$/)
+  {
+    @v = ($1,$2,$3);
+  }
+  elsif($version =~ /^v([0-9]+)\.([0-9]+)\.([0-9]+)$/)
+  {
+    @v = ($1,$2,$3);
+  }
+  else
+  {
+    die "unrecognized tag format: $version";
+  }
+
+  next if $v[0] != 2;
+
+  for(0..$3)
+  {
+    $v{"$v[0].$v[1].$_"} = 1;
+  }
+}
+
+my $bl = [
+  # format X,Y,Z,is_ok, X,Y,Z is version,
+  # is_ok applies also to *preceding* versions
+  [2,4,22,0],
+  [2,4,25,0], # broken XPath
+  [2,4,28,0], # unsupported, may work fine with earlier XML::LibXML versions
+  [2,4,29,0], # broken
+  [2,4,30,0], # broken
+  [2,5,0,0], # unsupported
+  [2,5,1,0], # all pre 2.5.4 version have broken attr output
+  [2,5,5,0], # tests pass, but known as broken
+  [2,5,11,0], # will partially work
+  [2,6,0,0], # unsupported
+  [2,6,4,0], # schema error
+  [2,6,5,0], # broken xincludes
+  [2,6,15,0],
+# [2,6,16,1], # first version to pass all tests
+  [2,6,18,1], # up to 2.6.18 all ok
+  [2,6,19,0], # broken c14n
+  [2,6,20,0], # broken schemas
+  [2,6,24,1], # all tests pass
+  [2,6,25,0], # broken XPath
+  [2,6,32,1], # tested, works ok
+  [2,7,1,0], # broken release, broken utf-16
+  [2,7,6,1], # tested, ok
+  [2,7,8,1], # tested, ok
+  [2,9,3,1], # schema regression
+  [2,9,4,0], # schema regression
+  [2,9,6,1],
+];
+
+my @bad;
+
+foreach my $ver (sort map { version->parse($_) } keys %v)
+{
+  my($major, $minor, $point) = $ver =~ /([0-9]+).([0-9]+)\.([0-9]+)/g;
+
+  my $state = undef;
+
+  foreach my $i (@$bl)
+  {
+    $state = $i->[3];
+    last if $major <  $i->[0];
+    next if $major >  $i->[0];
+    last if $minor <  $i->[1];
+    next if $minor >  $i->[1];
+    last if $point <= $i->[2];
+    $state = undef;
+  }
+
+  if(defined $state and $state == 0)
+  {
+    print "'$ver',";
+  }
+}
+
+print "\n";
+
diff --git a/perlcriticrc b/perlcriticrc
new file mode 100644 (file)
index 0000000..c6805fd
--- /dev/null
@@ -0,0 +1,59 @@
+severity = 1
+only = 1
+
+[Freenode::ArrayAssignAref]
+[Freenode::BarewordFilehandles]
+[Freenode::ConditionalDeclarations]
+[Freenode::ConditionalImplicitReturn]
+[Freenode::DeprecatedFeatures]
+[Freenode::DiscouragedModules]
+[Freenode::DollarAB]
+[Freenode::Each]
+[Freenode::EmptyReturn]
+[Freenode::IndirectObjectNotation]
+[Freenode::LexicalForeachIterator]
+[Freenode::LoopOnHash]
+[Freenode::ModPerl]
+[Freenode::OpenArgs]
+[Freenode::OverloadOptions]
+[Freenode::POSIXImports]
+[Freenode::PackageMatchesFilename]
+[Freenode::PreferredAlternatives]
+[Freenode::StrictWarnings]
+extra_importers = Test2::V0
+[Freenode::Threads]
+[Freenode::Wantarray]
+[Freenode::WarningsSwitch]
+[Freenode::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]
diff --git a/t/00_diag.t b/t/00_diag.t
new file mode 100644 (file)
index 0000000..1be5811
--- /dev/null
@@ -0,0 +1,103 @@
+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(
+  Alien::Base
+  Alien::Build
+  Alien::Build::MM
+  Alien::Build::Plugin::Build::SearchDep
+  Alien::Build::Plugin::Download::GitLab
+  Alien::Build::Plugin::Prefer::BadVersion
+  Alien::Build::Plugin::Probe::Vcpkg
+  ExtUtils::CBuilder
+  ExtUtils::MakeMaker
+  Test2::V0
+  Test::Alien
+);
+
+$post_diag = sub {
+  require Alien::Libxml2;
+  diag "version        = ", Alien::Libxml2->config('version');
+  diag "cflags         = ", Alien::Libxml2->cflags;
+  diag "cflags_static  = ", Alien::Libxml2->cflags_static;
+  diag "libs           = ", Alien::Libxml2->libs;
+  diag "libs_static    = ", Alien::Libxml2->libs_static;
+  diag "bin_dir        = ", $_ for Alien::Libxml2->bin_dir;
+};
+
+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;
+
diff --git a/t/alien_libxml2.t b/t/alien_libxml2.t
new file mode 100644 (file)
index 0000000..429684c
--- /dev/null
@@ -0,0 +1,61 @@
+use Test2::V0 -no_srand => 1;
+use Test::Alien;
+use Config;
+use Alien::Libxml2;
+
+alien_ok 'Alien::Libxml2';
+
+if($^O eq 'MSWin32' && $Config{ccname} eq 'cl')
+{
+  my $code = q{
+    package Alien::Libxml2;
+    sub libs_static
+    {
+      my($self) = @_;
+      my $str = $self->SUPER::libs_static;
+      $str =~ s/-L/-LIBPATH:/;
+      $str;
+    }
+  };
+  eval $code;    ## no critic (BuiltinFunctions::ProhibitStringyEval)
+  die $@ if $@;
+}
+
+my $xs = do { local $/; <DATA> };
+xs_ok $xs, with_subtest {
+  ok(Libxml2::mytest());
+};
+
+done_testing;
+
+__DATA__
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+MODULE = Libxml2 PACKAGE = Libxml2
+
+int
+mytest()
+  INIT:
+    xmlDoc *doc = NULL;
+    xmlNode *root_element = NULL;
+    const char *filename = "corpus/basic.xml";
+  CODE:
+    doc = xmlReadFile(filename, NULL, 0);
+    if(doc == NULL)
+    {
+      printf("error reading %s\n", filename);
+      RETVAL = 0;
+    }
+    else
+    {
+      xmlFreeDoc(doc);
+      xmlCleanupParser();
+      RETVAL = 1;
+    }
+  OUTPUT:
+    RETVAL
diff --git a/t/c/test.c b/t/c/test.c
new file mode 100644 (file)
index 0000000..fd6e39e
--- /dev/null
@@ -0,0 +1,31 @@
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+/*
+ * C version of the test can be used to see verify if alien is doing something wonky
+ * compile and run with pkg-config:
+ * cc `pkg-config --cflags libxml-2.0` t/c/test.c `pkg-config --libs libxml-2.0` && ./a.out
+ * compile and run with xml2-config:
+ * cc `xml2-config --cflags` t/c/test.c  `xml2-config --libs` && ./a.out
+ */
+
+int
+main(int argc, char *argv[])
+{
+  xmlDoc *doc = NULL;
+  xmlNode *root_element = NULL;
+  const char *filename = "corpus/basic.xml";
+  doc = xmlReadFile(filename, NULL, 0);
+  if(doc == NULL)
+  {
+    printf("error reading %s\n", filename);
+    return  2;
+  }
+  else
+  {
+    xmlFreeDoc(doc);
+    xmlCleanupParser();
+    printf("ok\n");
+    return 0;
+  }
+}
diff --git a/xt/author/critic.t b/xt/author/critic.t
new file mode 100644 (file)
index 0000000..0c03a4f
--- /dev/null
@@ -0,0 +1,14 @@
+use Test2::Require::Module 'Test2::Tools::PerlCritic';
+use Test2::Require::Module 'Perl::Critic';
+use Test2::Require::Module 'Perl::Critic::Freenode';
+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;
diff --git a/xt/author/eol.t b/xt/author/eol.t
new file mode 100644 (file)
index 0000000..801ee44
--- /dev/null
@@ -0,0 +1,16 @@
+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 ));
+
+
diff --git a/xt/author/no_tabs.t b/xt/author/no_tabs.t
new file mode 100644 (file)
index 0000000..e990e72
--- /dev/null
@@ -0,0 +1,16 @@
+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 ));
+
+
diff --git a/xt/author/pod.t b/xt/author/pod.t
new file mode 100644 (file)
index 0000000..186707f
--- /dev/null
@@ -0,0 +1,16 @@
+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 ));
+
+
diff --git a/xt/author/pod_coverage.t b/xt/author/pod_coverage.t
new file mode 100644 (file)
index 0000000..a463f4c
--- /dev/null
@@ -0,0 +1,77 @@
+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] };
+  };
+}
+
+
diff --git a/xt/author/pod_spelling_common.t b/xt/author/pod_spelling_common.t
new file mode 100644 (file)
index 0000000..2bd36be
--- /dev/null
@@ -0,0 +1,29 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+  plan skip_all => 'test requires Test::Pod::Spelling::CommonMistakes'
+    unless eval q{ use Test::Pod::Spelling::CommonMistakes; 1 };
+  plan skip_all => 'test requires YAML'
+    unless eval q{ use YAML qw( LoadFile ); 1 };
+};
+use Test::Pod::Spelling::CommonMistakes;
+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_common}->{skip};
+
+chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
+
+# TODO: test files in bin too.
+all_pod_files_ok;
+
+
diff --git a/xt/author/pod_spelling_system.t b/xt/author/pod_spelling_system.t
new file mode 100644 (file)
index 0000000..1637a97
--- /dev/null
@@ -0,0 +1,102 @@
+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;
+
+
diff --git a/xt/author/strict.t b/xt/author/strict.t
new file mode 100644 (file)
index 0000000..d5146f0
--- /dev/null
@@ -0,0 +1,23 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+  plan skip_all => 'test requires Test::Strict'
+    unless eval q{ use Test::Strict; 1 };
+};
+use Test::Strict;
+use FindBin;
+use File::Spec;
+
+chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
+
+unshift @Test::Strict::MODULES_ENABLING_STRICT,
+  'ozo',
+  'Test2::Bundle::SIPS',
+  'Test2::V0',
+  'Test2::Bundle::Extended';
+note "enabling strict = $_" for @Test::Strict::MODULES_ENABLING_STRICT;
+
+all_perl_files_ok( grep { -e $_ } qw( bin lib t Makefile.PL ));
+
+
diff --git a/xt/author/version.t b/xt/author/version.t
new file mode 100644 (file)
index 0000000..7638e80
--- /dev/null
@@ -0,0 +1,39 @@
+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;
+
diff --git a/xt/release/changes.t b/xt/release/changes.t
new file mode 100644 (file)
index 0000000..7781a30
--- /dev/null
@@ -0,0 +1,29 @@
+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;
+
+
diff --git a/xt/release/fixme.t b/xt/release/fixme.t
new file mode 100644 (file)
index 0000000..f1f17de
--- /dev/null
@@ -0,0 +1,20 @@
+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,
+);
+
+