Alien-SIMDe
view release on metacpan or search on metacpan
'https://github.com/chrisarg/simde/archive/refs/heads/master.zip';
$repo_response = HTTP::Tiny->new->head($repo_url);
croak "Failed to download SIMDe from either location"
unless $repo_response->{success};
}
# Configure download
start_url $repo_url;
plugin 'Download';
plugin 'Extract' => 'zip';
# Build configuration using Meson
my $build_dir = path(Path::Tiny->cwd,'_build')->stringify;
build sub {
print "Starting SIMDe build process in $build_dir\n";
print "Using Meson executable: ", Alien::Meson->exe, "\n";
if (system(Alien::Meson->exe, 'setup', $build_dir)) {
croak("Meson setup failed for SIMDe build");
}
if (system(Alien::Meson->exe, 'compile', qw(-C), $build_dir)) {
croak("Meson compile failed for SIMDe build");
}
my $output = qx{ Alien::Meson->exe test -C $build_dir };
my $failed_tests = $output =~ /Fail:\s+(\d+)/gm;
if ( $failed_tests && $failed_tests > 0 ) {
croak("Some tests failed during SIMDe build");
}
};
# Post-build file handling - copy files to staging directory
after 'build' => sub {
my ($build) = @_;
# Determine destination directory
my $stage_dir = path( $build->install_prop->{stage} );
my $source_dir = path( $build->install_prop->{extract} );
# Create include directories
my $include_dir = $stage_dir->child('include');
$include_dir->mkpath;
# Copy header files
my $headers_dir = $source_dir->child('simde');
my $dest = $include_dir->child('simde');
dircopy( $headers_dir, $dest )
or croak "Failed to copy $headers_dir to $dest: $!";
print "Copied header directory: ", $headers_dir->basename, "\n";
};
# Set runtime properties for client code
gather sub {
my ($build) = @_;
my $prefix = $build->runtime_prop->{prefix};
# Set include and library paths
my $include_dir = path( $prefix, 'include' )->stringify;
my $lib_dir = path( $prefix, 'lib' )->stringify;
# Set compiler flags
$build->runtime_prop->{cflags} = "-I$include_dir";
# Store raw paths
$build->runtime_prop->{include_dir} = $include_dir;
# Print confirmation
print "Alien::SIMDe configured with:\n";
print " cflags: ", $build->runtime_prop->{cflags}, "\n";
print " include_dir: ", $build->runtime_prop->{include_dir}, "\n";
};
# Run tests after installation
=pod
test sub {
my ($build) = @_;
my $lib_dir = path( $build->install_prop->{stage}, 'lib' );
# Define test executable names based on platform
my $test_exe = $^O eq 'MSWin32' ? 'test_bit.exe' : 'test_bit';
my $bench_exe = $^O eq 'MSWin32' ? 'benchmark.exe' : 'benchmark';
my $openmp_exe = $^O eq 'MSWin32' ? 'openmp_bit.exe' : 'openmp_bit';
# Get full paths
my $test_path = $lib_dir->child($test_exe);
my $bench_path = $lib_dir->child($bench_exe);
my $openmp_path = $lib_dir->child($openmp_exe);
# Run main tests if available
if ( -x $test_path ) {
print "\n**************** Running Bit Tests ****************\n";
my $test_output = `$test_path 2>&1`;
print $test_output;
if ( $test_output =~ /All tests passed/m ) {
print
"\n**************** Bit tests passed successfully ****************\n";
}
else {
croak("Bit tests failed");
}
}
else {
print "Test executable not found at $test_path - skipping tests\n";
}
unlink $test_path; # Clean up test executable
# Run benchmarks if available
if ( -x $bench_path ) {
print
"\n**************** Running Bit Benchmarks ****************\n";
my $bench_output = `$bench_path 2>&1`;
print $bench_output;
unlink $bench_path; # Clean up benchmark executable
}
else {
print
"Benchmark executable not found at $bench_path - skipping benchmarks\n";
}
# Run OpenMP benchmarks if available
if ( -x $openmp_path ) {
print
"\n**************** Running Bit OpenMP Benchmarks ****************\n";
my $openmp_output = `$openmp_path 1024 1000 1000 4 2>&1`;
print $openmp_output;
unlink $openmp_path; # Clean up OpenMP benchmark executable
}
else {
( run in 1.748 second using v1.01-cache-2.11-cpan-140bd7fdf52 )