Alien-Libtensorflow

 view release on metacpan or  search on metacpan

alienfile  view on Meta::CPAN

# - ALIEN_LIBTENSORFLOW_DEVICE_TYPE
#
#   Which device type to use for binary release.
#
#   Values:
#     - "auto": automatically detect type (default)
#     - "cpu": CPU
#     - "gpu": GPU (Currently only Nvidia)
use Env qw(
	ALIEN_LIBTENSORFLOW_FROM_BINARY_VERSION
	ALIEN_LIBTENSORFLOW_FROM_BINARY_ALLOW_RELEASE_CANDIDATES
	ALIEN_LIBTENSORFLOW_FROM_SOURCE
	ALIEN_LIBTENSORFLOW_FROM_SOURCE_BUILD_TYPE
	ALIEN_LIBTENSORFLOW_DEVICE_TYPE

	@PATH
);

my %os_arch_data = (
	'linux:x86_64' => {
		device_type => {
			cpu => {
				bucket_prefix => 'libtensorflow/libtensorflow-cpu-linux-x86_64',
				bucket_format => 'tar.gz',
			},
			gpu => {
				bucket_prefix => 'libtensorflow/libtensorflow-gpu-linux-x86_64',
				bucket_format => 'tar.gz',
			},
		}
	},
	'darwin:x86_64' => {
		device_type => {
			cpu => {
				bucket_prefix => 'libtensorflow/libtensorflow-cpu-darwin-x86_64',
				bucket_format => 'tar.gz',
			}
		},
	},
	'MSWin32:x86_64' => {
		device_type => {
			cpu => {
				bucket_prefix => 'libtensorflow/libtensorflow-cpu-windows-x86_64',
				bucket_format => 'zip',
			},
			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"



( run in 1.299 second using v1.01-cache-2.11-cpan-df04353d9ac )