Alien-Xmake
view release on metacpan or search on metacpan
# SYNOPSIS
```perl
use Alien::Xmake;
my $xmake = Alien::Xmake->new;
system $xmake->exe, '--help';
system $xmake->exe, qw[create -t qt.widgetapp test];
system $xmake->xrepo, qw[info libpng];
```
# DESCRIPTION
Xmake is a lightweight, cross-platform build utility based on Lua. It uses a Lua script to maintain project builds, but
is driven by a dependency-free core program written in C. Compared with Makefiles or CMake, the configuration syntax is
(in the opinion of the author) much more concise and intuitive. As such, it's friendly to novices while still
maintaining the flexibly required in a build system. With Xmake, you can focus on your project instead of the build.
Xmake can be used to directly build source code (like with Make or Ninja), or it can generate project source files like
eg/alien_xrepo.pl view on Meta::CPAN
# Initialize
my $repo = Alien::Xrepo->new();
# Add a custom repository (optional)
# $repo->add_repo( 'my-repo', 'https://github.com/my/repo.git' );
# Install a shared lib with an automatic configuration
my $ogg = $repo->install('libvorbis');
# Install a library with specific configuration
# equivalent to: xrepo install -p windows -a x86_64 -m debug --configs='shared=true,vs_runtime=MD' libpng
my $pkg = $repo->install( 'libpng', '1.6.x', plat => 'windows', arch => 'x64', mode => 'debug', configs => { vs_runtime => 'MD' } );
die 'Install failed' unless $pkg;
# Automatically wrap zlib as a whole with Affix::Wrap
use Affix;
use Affix::Wrap;
my $zlib = $repo->install('zlib');
Affix::Wrap->new(
project_files => [ $zlib->find_header('zlib.h') ],
include_dirs => [ $zlib->includedirs ],
types => { gzFile_s => Pointer [Void] }
)->wrap( $zlib->libpath );
say 'zlib version: ' . zlibVersion();
# Wrap a single function from sqlite3 with Affix
use Affix;
my $sqlite3 = $repo->install('sqlite3');
affix $sqlite3->libpath, 'sqlite3_libversion', [], String;
say 'SQLite version: ' . sqlite3_libversion();
# Wrap a single function from libpng with FFI::Platypus
use FFI::Platypus;
my $lz4 = $repo->install('lz4');
my $ffi = FFI::Platypus->new;
$ffi->lib( $lz4->libpath );
$ffi->attach( 'LZ4_versionString', [] => 'string' );
say 'LZ4 version: ' . LZ4_versionString();
lib/Alien/Xmake.pod view on Meta::CPAN
=head1 SYNOPSIS
use Alien::Xmake;
my $xmake = Alien::Xmake->new;
system $xmake->exe, '--help';
system $xmake->exe, qw[create -t qt.widgetapp test];
system $xmake->xrepo, qw[info libpng];
=head1 DESCRIPTION
Xmake is a lightweight, cross-platform build utility based on Lua. It uses a Lua script to maintain project builds, but
is driven by a dependency-free core program written in C. Compared with Makefiles or CMake, the configuration syntax is
(in the opinion of the author) much more concise and intuitive. As such, it's friendly to novices while still
maintaining the flexibly required in a build system. With Xmake, you can focus on your project instead of the build.
Xmake can be used to directly build source code (like with Make or Ninja), or it can generate project source files like
CMake or Meson. It also has a built-in package management system to help users integrate C/C++ dependencies.
lib/Alien/Xrepo.pm view on Meta::CPAN
# Search for the DLL
for my $dir (@search_dirs) {
next unless -d $dir;
my $d = path($dir);
# Exact match: zlib.lib -> zlib.dll
my $try = $d->child("$basename.dll");
if ( $try->exists ) { $runtime_lib = $try->stringify; last; }
# MSVC vs MinGW naming: libpng.lib -> libpng16.dll or png.dll
# Scan directory for anything starting with the basename
my ($fuzzy) = grep { /^$basename/i && /\.dll$/i } map { $_->basename } $d->children;
if ($fuzzy) { $runtime_lib = $d->child($fuzzy)->stringify; last; }
}
}
}
}
elsif ( $^O eq 'darwin' ) {
# macOS: Prefer .dylib, then .so
lib/Alien/Xrepo.pod view on Meta::CPAN
# Initialize
my $repo = Alien::Xrepo->new( );
# Add a custom repository (optional)
# $repo->add_repo( 'my-repo', 'https://github.com/my/repo.git' );
# Install a shared lib with an automatic configuration
my $ogg = $repo->install('libvorbis');
# Install a library with specific configuration
# equivalent to: xrepo install -p windows -a x86_64 -m debug --configs='shared=true,vs_runtime=MD' libpng
my $pkg = $repo->install( 'libpng', '1.6.x', plat => 'windows', arch => 'x64', mode => 'debug', configs => { vs_runtime => 'MD' } );
die 'Install failed' unless $pkg;
# Automatically wrap zlib as a whole with Affix::Wrap
use Affix;
use Affix::Wrap;
my $zlib = $repo->install('zlib');
Affix::Wrap->new(
project_files => [ $zlib->find_header('zlib.h') ],
include_dirs => [ $zlib->includedirs ],
types => { gzFile_s => Pointer [Void] }
)->wrap( $zlib->libpath );
say 'zlib version: ' . zlibVersion();
# Wrap a single function from sqlite3 with Affix
use Affix;
my $sqlite3 = $repo->install('sqlite3');
affix $sqlite3->libpath, 'sqlite3_libversion', [], String;
say 'SQLite version: ' . sqlite3_libversion();
# Wrap a single function from libpng with FFI::Platypus
use FFI::Platypus;
my $lz4 = $repo->install('lz4');
my $ffi = FFI::Platypus->new;
$ffi->lib( $lz4->libpath );
$ffi->attach( 'LZ4_versionString', [] => 'string' );
say 'LZ4 version: ' . LZ4_versionString();
=head1 DESCRIPTION
This module acts as an intelligent bridge between Perl and the C<xrepo> package manager.
While L<Affix> or L<FFI::Platypus> or L<Inline::C> can handle the binding or linking to native functions, Alien::Xrepo
handles the B<acquisition> of the libraries containing those functions. It automates the entire dependency lifecycle:
=over
=item 1. Provisioning:
Downloads and installs libraries (C<libpng>, C<openssl>, etc.) via C<xrepo>, handling version constraints and custom
repository lookups.
=item 2. Configuration:
Ensures libraries are compiled with FFI compatible flags (forcing C<shared> libraries instead of static archives) and
supports cross-compilation parameters (platform, architecture, toolchains).
=item 3. Introspection:
Parses the build metadata to locate the exact absolute paths to the runtime binaries (C<.dll>, C<.so>, C<.dylib>) and
lib/Alien/Xrepo.pod view on Meta::CPAN
Returns an L<Alien::Xrepo::PackageInfo> object.
=head2 C<uninstall( ... )>
$repo->uninstall('zlib');
Removes the specified package from the local cache. Accepts the same C<%options> as C<install( ... )>.
=head2 C<search>
$repo->search( 'png' );
Runs `xrepo search` and prints the results to STDOUT.
=head2 C<clean( )>
$repo->clean( );
Cleans the cached packages and downloads.
=head2 C<add_repo( ... )>
lib/Alien/Xrepo.pod view on Meta::CPAN
=item B<version>
The installed version.
=back
=head3 Methods
=head4 C<find_header( ... )>
my $path = $info->find_header( 'png.h' );
Scans C<includedirs> for the given filename and returns the absolute path if found. Returns C<undef> otherwise.
=head1 SEE ALSO
L<Affix::Wrap>, L<Alien::Xmake>, L<https://xrepo.xmake.io>
=head1 AUTHOR
Sanko Robinson E<lt>sanko@cpan.orgE<gt>
t/02_xrepo.t view on Meta::CPAN
#
ok $Alien::Xrepo::VERSION, 'Alien::Xrepo::VERSION';
#
my $repo = Alien::Xrepo->new( verbose => 0 );
my $xmake = Alien::Xmake->new;
my $exe = $xmake->exe;
diag `$exe --help`;
diag $exe;
#~ diag `$exe update`;
#~ xmake.exe lua private.xrepo install -y -k shared libpng
diag `$exe lua private.xrepo install -y -k shared libpng`;
ok my $pkg = $repo->install('libpng'), 'install libpng';
skip_all 'Failed to install libpng', 3 unless $pkg;
diag 'Found library at: ' . $pkg->libpath;
diag 'Version: ' . $pkg->version;
diag 'License: ' . $pkg->license;
diag 'Header: ' . $pkg->find_header('png.h');
diag 'Include dirs: ';
diag ' - ' . $_ for @{ $pkg->includedirs };
diag 'Lib: ' . $pkg->libpath;
#
done_testing;
( run in 2.136 seconds using v1.01-cache-2.11-cpan-df04353d9ac )