Alien-Libtensorflow

 view release on metacpan or  search on metacpan

alienfile  view on Meta::CPAN

			},
			gpu => {
				bucket_prefix => 'libtensorflow/libtensorflow-gpu-windows-x86_64',
				bucket_format => 'zip',
			},
		}
	},

);

my %os_dynamic_lib = (
	'linux' => 'libtensorflow.so.2',
	'darwin' => 'libtensorflow.2.dylib',
	'MSWin32' => 'tensorflow.dll',
);
my %other_os_dynamic_lib = (
	'linux' => 'libtensorflow_framework.so.2',
	'darwin' => 'libtensorflow_framework.2.dylib',
);

probe sub {
	# linux: ./lib/libtensorflow.so.2
	# darwin: ./lib/libtensorflow.2.dylib
	# win32: ./lib/tensorflow.dll

	my @prefix = ( "/usr/local" );

	for my $prefix (@prefix) {
		my $dylib_path = File::Spec->catfile(
			$prefix, qw(lib),
			$os_dynamic_lib{ $^O }
		);
		return 'system' if -f $dylib_path;
	}

	return 'share';
};

sub detect_gpu {
	# detect Nvidia
	if( $^O eq 'linux' ) {
		return !! File::Which::which('nvidia-smi');
	} elsif( $^O eq 'MSWin32' ) {
		local $ENV{PATH} = $ENV{PATH};
		push @PATH, File::Spec->catfile($ENV{ProgramFiles}, 'NVIDIA Corporation','NVSMI' );
		return !! File::Which::which('nvidia-smi');
	}

	return 0;
}

sub device_type {
	return 'gpu' if detect_gpu;

	return 'cpu';
}

share {
	requires 'HTTP::Tiny' => 0;
	requires 'Net::SSLeay' => 0;
	requires 'IO::Socket::SSL' => 0;
	requires 'URI' => 0;
	requires 'File::Which';
	requires 'Alien::Build::Plugin::Download::GitHub' => 0.10;

	$ENV{ALIEN_LIBTENSORFLOW_FROM_BINARY_ALLOW_RELEASE_CANDIDATES} ||= 0;

	# 0|1 (default: 0)
	$ENV{ALIEN_LIBTENSORFLOW_FROM_SOURCE} ||= 0;

	# release|debug (default: release)
	$ENV{ALIEN_LIBTENSORFLOW_FROM_SOURCE_BUILD_TYPE} ||= 'release';
	die "Unknown value for ALIEN_LIBTENSORFLOW_FROM_SOURCE_BUILD_TYPE = $ALIEN_LIBTENSORFLOW_FROM_SOURCE_BUILD_TYPE"
		unless $ALIEN_LIBTENSORFLOW_FROM_SOURCE_BUILD_TYPE =~ /^(release|debug)$/;

	# auto|cpu|gpu (default: auto)
	$ENV{ALIEN_LIBTENSORFLOW_DEVICE_TYPE} ||= 'auto';
	die "Unknown value for ALIEN_LIBTENSORFLOW_DEVICE_TYPE = $ALIEN_LIBTENSORFLOW_DEVICE_TYPE"
		unless $ALIEN_LIBTENSORFLOW_DEVICE_TYPE =~ /^(auto|cpu|gpu)$/;

	my $os_arch = join ":", ( $^O, meta->prop->{platform}{cpu}{arch}{name} );
	if(exists $os_arch_data{$os_arch} && !$ENV{ALIEN_LIBTENSORFLOW_FROM_SOURCE}) {
		my $device_type = $ALIEN_LIBTENSORFLOW_DEVICE_TYPE eq 'auto'
			? device_type()
			: $ALIEN_LIBTENSORFLOW_DEVICE_TYPE;

		die "Binary release for $os_arch + $device_type does not exist"
			unless exists $os_arch_data{$os_arch}{device_type}{$device_type};

		my $data = $os_arch_data{$os_arch}{device_type}{$device_type};

		my $version_filter = exists $ENV{ALIEN_LIBTENSORFLOW_FROM_BINARY_VERSION}
			? $ALIEN_LIBTENSORFLOW_FROM_BINARY_VERSION
			: '2.';

		(my $bucket_prefix_no_dir = $data->{bucket_prefix}) =~ s,^libtensorflow/,,;
		my $re = qr{
			^
			\Q@{[ $bucket_prefix_no_dir ]}\E
			-
			(?<version> .* )
			\.
			\Q@{[ $data->{bucket_format} ]}\E
			$
		}x;

		my $bucket_url = 'https://storage.googleapis.com/tensorflow/';
		my $start_url = URI->new($bucket_url);
		$start_url->query_form( prefix => join('',
			$data->{bucket_prefix},
			'-',
			$version_filter,
		));
		start_url $start_url;
		plugin 'Decode::Mojo';
		meta->around_hook( fetch => sub {
			my $orig = shift;
			my $build = shift;

			my $fetched = $orig->($build, @_);



( run in 0.540 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )