Alien-Build

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

  - 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

Changes.Alien-Base  view on Meta::CPAN

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

INSTALL  view on Meta::CPAN

    % 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

README  view on Meta::CPAN

    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

README  view on Meta::CPAN

      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.

corpus/vcpkg/r2/installed/vcpkg/info/openssl-windows_1.1.1d-1_x64-windows.list  view on Meta::CPAN

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

corpus/vcpkg/r2/installed/vcpkg/info/openssl-windows_1.1.1d-1_x64-windows.list  view on Meta::CPAN

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

corpus/vcpkg/r2/installed/vcpkg/info/openssl-windows_1.1.1d-1_x64-windows.list  view on Meta::CPAN

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

corpus/vcpkg/r2/installed/vcpkg/info/openssl-windows_1.1.1d-1_x64-windows.list  view on Meta::CPAN

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

corpus/vcpkg/r2/installed/vcpkg/status  view on Meta::CPAN

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

example/xz-manual.alienfile  view on Meta::CPAN


  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';

inc/probebad.pl  view on Meta::CPAN

  }
}

{ # 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";

lib/Alien/Base.pm  view on Meta::CPAN

as a public interface primarily so that it can be overridden at run
time.  This can also be specified in your C<Build.PL> with
L<Alien::Base::ModuleBuild> using the C<alien_inline_auto_include>
property.

=head2 runtime_prop

 my $hashref = Alien::MyLibrary->runtime_prop;

Returns a hash reference of the runtime properties computed by L<Alien::Build> during its
install process.  If the L<Alien::Base> based L<Alien> was not built using L<Alien::Build>,
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<Alien::Base> instance with the alternate configuration.

Some packages come with multiple libraries, and multiple C<.pc> files to

lib/Alien/Build.pm  view on Meta::CPAN

part of the L<Alien::Build> spec.

=head2 runtime_prop

 my $href = $build->runtime_prop;

Runtime properties are used during the install and runtime phases
(either under C<share> or C<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.

=over 4

=item alien_build_version

The version of L<Alien::Build> used to install the library or tool.

=item alt

Alternate configurations.  If the alienized package has multiple

lib/Alien/Build.pm  view on Meta::CPAN


=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<Makefile>, such as with
L<ExtUtils::MakeMaker>.  Once checkpointed you can use the C<resume>
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.

lib/Alien/Build/MM.pm  view on Meta::CPAN

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);

lib/Alien/Build/Manual/FAQ.pod  view on Meta::CPAN

=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<Alien::Base>
based Alien needs to have either the share directory build during the install process or for
older legacy L<Alien::Base::ModuleBuild> based Aliens, a ConfigData module generated by
L<Module::Build>.

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<blib/lib> instead of C<lib> 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<Makefile.PL> is using L<Alien::Build::MM> correctly.

lib/Alien/Build/Manual/PluginAuthor.pod  view on Meta::CPAN

 plugin 'Build::MyPlugin' => (
   arg1 => 'override for arg1',
   arg2 => [ 'something', 'else' ],
 );

=for html <p>flowchart</p>
<div style="display: flex"><div style="margin: 3px; flex: 1 1 50%">
<img src="image/PluginAuthor-flowchart.png" style="max-width: 100%">
</div></div>
<p><b>Notes</b>: The colored blocks indicate <tt>alienfile</tt> blocks.
Hooks are indicated as predefined process (rectangle with double struck
vertical edges).  Hooks that can easily be implemented from an
<tt>alienfile</tt> are indicated in blue (Note that <tt>[]</tt> 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 <tt>alienfile</tt>
blocks are entered.  It is not shown, but generally any plugin can cause
a <b>Fail</b> by throwing an exception with <tt>die</tt>.</p>

Perlish pseudo code for how plugins are called:

lib/Alien/Build/Manual/PluginAuthor.pod  view on Meta::CPAN

 $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<git clone>,
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<Alien::Build>
will assume that it is an archive, which will be processed by the
L<extract hook|/"extract hook">.  If you store multiple files, L<Alien::Build> 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<Note>: 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 {

lib/Alien/Build/Plugin/Core/Setup.pm  view on Meta::CPAN

      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 {

lib/Alien/Build/Plugin/Download/Negotiate.pm  view on Meta::CPAN


=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<version> 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<http>, but includes
links to C<https> URLs), then you can set this property to true, and the appropriate
Perl SSL modules will be loaded.

=head2 passive

lib/Test/Alien.pm  view on Meta::CPAN

  {
    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} },
        );
      };
      $@;
    };

lib/Test/Alien.pm  view on Meta::CPAN

to work easily with L<Alien::Base> based modules, but can also be used
via the synthetic interface to test non L<Alien::Base> based L<Alien>
modules.  It has very modest prerequisites.

Prior to this module the best way to test a L<Alien> module was via L<Test::CChecker>.
The main downside to that module is that it is heavily influenced by and uses
L<ExtUtils::CChecker>, which is a tool for checking at install time various things
about your compiler.  It was also written before L<Alien::Base> became as stable as it
is today.  In particular, L<Test::CChecker> 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<XS> or L<FFI::Platypus>.  It also provides a mechanism for
testing binaries that are provided by the various L<Alien> modules (for example
L<Alien::gmake> and L<Alien::patch>).

L<Alien> modules can actually be usable without a compiler, or without L<FFI::Platypus>
(for example, if the library is provided by the system, and you are using L<FFI::Platypus>,
or if you are building from source and you are using C<XS>), so tests with missing
prerequisites are automatically skipped.  For example, L</xs_ok> will automatically skip
itself if a compiler is not found, and L</ffi_ok> will automatically skip itself

lib/Test/Alien/Run.pm  view on Meta::CPAN


 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<Test::Alien#run_ok>.  That function is the I<ONLY> way to create
an instance of this class.

=head1 ATTRIBUTES

=head2 out

 my $str = $run->out;

The standard output from the run.

lib/Test/Alien/Run.pm  view on Meta::CPAN

=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 in 0.410 second using v1.01-cache-2.11-cpan-8d75d55dd25 )