Alien-SDL3
view release on metacpan or search on metacpan
builder/Alien/SDL3/Builder.pm view on Meta::CPAN
use CPAN::Meta;
use ExtUtils::Install qw[pm_to_blib install];
use ExtUtils::InstallPaths 0.002;
use File::Basename qw[basename dirname];
use File::Find ();
use File::Path qw[mkpath rmtree];
use File::Spec::Functions qw[catfile catdir rel2abs abs2rel splitdir curdir];
use JSON::PP 2 qw[encode_json decode_json];
use Config;
use Carp qw[croak];
use Env qw[@PATH];
use HTTP::Tiny;
# Not in CORE
use Path::Tiny qw[cwd path tempdir];
use ExtUtils::Helpers 0.028 qw[make_executable split_like_shell detildefy];
use Devel::CheckBin;
#
field $action : param //= 'build';
field $meta = CPAN::Meta->load_file('META.json');
# https://wiki.libsdl.org/SDL3/Installation
#~ apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
#~ pacman -S sdl2 sdl2_image sdl2_mixer sdl2_ttf
#~ dnf install SDL2-devel SDL2_image-devel SDL2_mixer-devel SDL2_ttf-devel
#~ https://github.com/libsdl-org/setup-sdl/issues/20
# TODO: Write a GH action to test with libs preinstalled
field $version : param //= '3.4.2';
field $prebuilt : param //= 1;
field $archive : param //= sprintf 'https://github.com/libsdl-org/SDL/releases/download/release-%s/SDL3-' . (
$^O eq 'MSWin32' ?
!$prebuilt ?
'%s.zip' :
( $Config{cc} =~ m[gcc]i ? 'devel-%s-mingw.zip' : 'devel-%s-VC.zip' ) :
#~ $^O eq 'darwin' ? '%s.dmg' :
'%s.tar.gz'
),
$version, $version;
field $http;
field %config;
#
# Params to Build script
field $install_base : param //= '';
field $installdirs : param //= '';
field $uninst : param //= 0; # Make more sense to have a ./Build uninstall command but...
field $install_paths : param //= ExtUtils::InstallPaths->new( dist_name => $meta->name );
field $verbose : param //= 0;
field $dry_run : param //= 0;
field $pureperl : param //= 0;
field $jobs : param //= 1;
field $destdir : param //= '';
field $prefix : param //= '';
field $cwd = cwd()->absolute;
#
#
ADJUST {
-e 'META.json' or die "No META information provided\n";
}
method write_file( $filename, $content ) { path($filename)->spew_raw($content) or die "Could not open $filename: $!\n" }
method read_file ($filename) { path($filename)->slurp_utf8 or die "Could not open $filename: $!\n" }
method step_build() {
$self->step_build_libs;
for my $pl_file ( find( qr/\.PL$/, 'lib' ) ) {
( my $pm = $pl_file ) =~ s/\.PL$//;
system $^X, $pl_file->stringify, $pm and die "$pl_file returned $?\n";
}
my %modules = map { $_ => catfile( 'blib', $_ ) } find( qr/\.pm$/, 'lib' );
my %docs = map { $_ => catfile( 'blib', $_ ) } find( qr/\.pod$/, 'lib' );
my %scripts = map { $_ => catfile( 'blib', $_ ) } find( qr/(?:)/, 'script' );
my %sdocs = map { $_ => delete $scripts{$_} } grep {/.pod$/} keys %scripts;
my %dist_shared = map { $_ => catfile( qw[blib lib auto share dist], $meta->name, abs2rel( $_, 'share' ) ) } find( qr/(?:)/, 'share' );
my %module_shared = map { $_ => catfile( qw[blib lib auto share module], abs2rel( $_, 'module-share' ) ) } find( qr/(?:)/, 'module-share' );
pm_to_blib( { %modules, %docs, %scripts, %dist_shared, %module_shared }, catdir(qw[blib lib auto]) );
make_executable($_) for values %scripts;
mkpath( catdir(qw[blib arch]), $verbose );
0;
}
method step_clean() { rmtree( $_, $verbose ) for qw[blib temp]; 0 }
method step_install() {
$self->step_build() unless -d 'blib';
install(
[ from_to => $install_paths->install_map,
verbose => $verbose,
dry_run => $dry_run,
uninstall_shadows => $uninst,
skip => undef,
always_copy => 1
]
);
0;
}
method step_realclean () { rmtree( $_, $verbose ) for qw[blib temp Build _build_params MYMETA.yml MYMETA.json]; 0 }
method step_test() {
$self->step_build() unless -d 'blib';
require TAP::Harness::Env;
my %test_args = (
( verbosity => $verbose ),
( jobs => $jobs ),
( color => -t STDOUT ),
lib => [ map { rel2abs( catdir( 'blib', $_ ) ) } qw[arch lib] ],
);
TAP::Harness::Env->create( \%test_args )->runtests( sort map { $_->stringify } find( qr/\.t$/, 't' ) )->has_errors;
}
method _do_in_dir( $path, $sub ) {
my $cwd = cwd()->absolute;
chdir $path->absolute->stringify if -d $path->absolute;
$sub->();
chdir $cwd->stringify;
}
method step_build_libs() {
my $pre = cwd->absolute->child( qw[blib arch auto], $meta->name );
return 0 if -d $pre;
my $p = $cwd->child('share')->realpath;
if ( $^O eq 'MSWin32' && $prebuilt ) {
say 'Using prebuilt SDL3...' if $verbose;
( run in 0.670 second using v1.01-cache-2.11-cpan-754626df90b )