115 lines
3.0 KiB
Perl
Executable File
115 lines
3.0 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
|
|
use v5.30;
|
|
use strict;
|
|
use warnings;
|
|
no warnings 'experimental::signatures';
|
|
use feature 'signatures';
|
|
use autodie;
|
|
|
|
use FindBin qw( $Bin );
|
|
use File::Spec;
|
|
use lib File::Spec->catdir( $Bin, 'lib' );
|
|
|
|
use Getopt::Long;
|
|
use IPC::System::Simple qw( capturex );
|
|
use Path::Tiny qw( path );
|
|
use Test::More;
|
|
|
|
sub main {
|
|
my $target;
|
|
my $expect_cross;
|
|
my $expect_cross_version;
|
|
my $expect_file_re;
|
|
my $expect_stripped;
|
|
|
|
GetOptions(
|
|
'target=s' => \$target,
|
|
'expect-file-re=s' => \$expect_file_re,
|
|
'expect-cross!' => \$expect_cross,
|
|
'expect-cross-version=s' => \$expect_cross_version,
|
|
'expect-stripped!' => \$expect_stripped,
|
|
);
|
|
|
|
check_cross(
|
|
path( $ENV{RUNNER_TEMP} ),
|
|
$expect_cross,
|
|
$expect_cross_version
|
|
);
|
|
|
|
for my $bin (
|
|
path( qw( . target ), $target, qw( debug bin1 ) ),
|
|
path( qw( . target ), $target, qw( debug bin2 ) ),
|
|
path( qw( . subcrate target ), $target, qw( debug subcrate ) )
|
|
) {
|
|
check_binary( $bin, $expect_file_re, $expect_stripped );
|
|
}
|
|
|
|
done_testing();
|
|
}
|
|
|
|
sub check_cross ( $bin_dir, $expect_cross, $expect_cross_version ) {
|
|
my $cross = $bin_dir->child('cross');
|
|
if ($expect_cross) {
|
|
ok( $cross->is_file && -x $cross, 'found `cross` in $PATH' );
|
|
if ($expect_cross_version) {
|
|
my $version = capturex( $cross, '--version' );
|
|
like(
|
|
$version, qr/\Q$expect_cross_version/,
|
|
'cross version matches expected version'
|
|
);
|
|
}
|
|
}
|
|
else {
|
|
ok( !$cross->exists, 'did not find `cross` in $PATH' );
|
|
}
|
|
}
|
|
|
|
sub check_binary ( $bin, $expect_file_re, $expect_stripped ) {
|
|
ok( $bin->exists, "Binary at $bin exists" )
|
|
or return;
|
|
ok( $bin->is_file, "Binary at $bin is a file" )
|
|
or return;
|
|
ok( -x $bin, "Binary at $bin is executable" )
|
|
or return;
|
|
|
|
my $file = capturex( qw( file --brief ), $bin ) // q{};
|
|
chomp $file;
|
|
|
|
like(
|
|
$file, qr/$expect_file_re/,
|
|
"`file` output for $bin matches expected output"
|
|
);
|
|
|
|
# The file command on macOS doesn't report whether the binary is stripped
|
|
# or not.
|
|
return if $^O eq 'darwin';
|
|
|
|
if ($expect_stripped) {
|
|
unlike(
|
|
$file, qr/not stripped/,
|
|
"`file` does not report $bin as not stripped"
|
|
);
|
|
like( $file, qr/stripped/, "`file` reports $bin as stripped" );
|
|
}
|
|
else {
|
|
if ( $^O eq 'MSWin32' || $^O eq 'msys' ) {
|
|
|
|
# On Windows, unstripped binaries don't contain the word
|
|
# "stripped" at all.
|
|
unlike(
|
|
$file, qr/stripped/,
|
|
"`file` does not report $bin as stripped"
|
|
);
|
|
}
|
|
else {
|
|
like(
|
|
$file, qr/not stripped/,
|
|
"`file` reports $bin as not stripped"
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
main();
|