aboutsummaryrefslogtreecommitdiff
blob: 557095bc7801e9ccc34ca1a1ad188567e69fe90f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

EAPI=6

PYTHON_COMPAT=( python2_7 python3_{3,4,5,6} )

inherit python-r1 distutils-r1 eutils versionator

DESCRIPTION="Library for numerical computation using data flow graphs"
HOMEPAGE="https://www.tensorflow.org
	https://github.com/tensorflow/tensorflow"
SRC_URI="https://github.com/${PN}/${PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz
	https://dev.gentoo.org/~gienah/snapshots/${P}-bazel-cache-repos.tar.xz"

LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="~amd64"
IUSE="cuda cxx mpi"

# To create the cache repo tar file, temporarilly remove the
# ${P}-bazel-cache-repos.tar.xz from SRC_URI and src_upack.  Then build
# it so that bazel will download the files:
# FEATURES="noclean -network-sandbox" emerge -av sci-libs/tensorflow
# cd /var/tmp/portage/sci-libs/${P}
# tar --owner=portage --group=portage -cJvf \
# /usr/portage/distfiles/${P}-bazel-cache-repos.tar.xz \
# homedir/.cache/bazel/_bazel_portage/cache/repos/v1

# TensorFlow 1.7 may be the last time we support Cuda versions below 8.0.
# Starting with TensorFlow 1.8 release, 8.0 will be the minimum supported
# version.
# TensorFlow 1.7 may be the last time we support cuDNN versions below 6.0.
# Starting with TensorFlow 1.8 release, 6.0 will be the minimum supported
# version.
# Possibly missing deps:
# 	dev-python/gast
DEPEND="
	cxx? ( dev-libs/protobuf )
	dev-python/absl-py[${PYTHON_USEDEP}]
	dev-python/astor[${PYTHON_USEDEP}]
	dev-python/numpy[${PYTHON_USEDEP}]
	dev-python/protobuf-python[${PYTHON_USEDEP}]
	dev-python/six[${PYTHON_USEDEP}]
	dev-python/termcolor[${PYTHON_USEDEP}]
	dev-python/wheel[${PYTHON_USEDEP}]
	dev-libs/jemalloc
	dev-libs/protobuf-c
	dev-util/bazel
	media-libs/giflib
	virtual/jpeg:0
	cuda? ( >=dev-util/nvidia-cuda-toolkit-8.0[profiler] >=dev-libs/cudnn-6 )
	mpi? ( virtual/mpi )"
	#opencl? ( virtual/opencl )"
RDEPEND="${DEPEND}"

src_unpack() {
	unpack ${P}.tar.gz
	pushd .. || die
	unpack distdir/${P}-bazel-cache-repos.tar.xz
	popd || die
}

# TODO: seems it also supports some MPI implementations
src_configure(){
	# there is no setup.py but there is configure
	# https://www.tensorflow.org/install/install_sources
	# https://www.tensorflow.org/install/install_linux#InstallingNativePip
	#
	# usage: configure.py [-h] [--workspace WORKSPACE]
	python_configure() {
		export PYTHON_BIN_PATH=${PYTHON}
		export PYTHON_LIB_PATH=${PYTHON_SITEDIR}
		export TF_NEED_JEMALLOC=1
		export TF_NEED_GCP=0
		export TF_NEED_HDFS=0
		export TF_NEED_S3=0
		export TF_NEED_KAFKA=0
		export TF_ENABLE_XLA=0
		export TF_NEED_GDR=0
		export TF_NEED_VERBS=0
		export TF_NEED_OPENCL=0
		if use cuda; then
			export TF_NEED_CUDA=1
		else
			export TF_NEED_CUDA=0
		fi
		if use mpi; then
			export TF_NEED_MPI=1
		else
			export TF_NEED_MPI=0
		fi
		export TF_NEED_OPENCL_SYCL=0
		export CC_OPT_FLAGS=${CFLAGS}
		export JAVA_HOME=$(java-config -O)
		# TODO: protect by a USE flag test --config=mkl
		./configure || die
	}
	python_foreach_impl python_configure
}

bazel-get-flags() {
	local fs=""
	for i in ${CXXFLAGS}; do
		[[ -n "${fs}" ]] && fs+=" "
		fs+="--cxxopt=${i}"
	done
	for i in ${CPPFLAGS}; do
		[[ -n "${fs}" ]] && fs+=" "
		fs+="--copt=${i}"
		fs+="--cxxopt=${i}"
	done
	for i in ${LDFLAGS}; do
		[[ -n "${fs}" ]] && fs+=" "
		fs+="--linkopt=${i}"
	done
	echo "${fs}"
}

src_compile() {
	# F: fopen_wr
	# S: deny
	# P: /proc/self/setgroups
	# A: /proc/self/setgroups
	# R: /proc/7712/setgroups
	# C: unable to read /proc/1/cmdline
	addpredict /proc

	local opt=$(usex cuda "--config=cuda" "")
	einfo ">>> Compiling ${PN} C"$(usex cxx " and C++" "")
	einfo "	bazel build \\"
	einfo "	  --config=opt ${opt} \\"
	einfo "	  $(bazel-get-flags) \\"
	einfo "	  //tensorflow:libtensorflow.so \\"
	einfo "   //tensorflow:libtensorflow_framework.so \\"
	einfo "	  "$(usex cxx "//tensorflow:libtensorflow_cc.so" "")
	bazel build \
		  --config=opt ${opt} \
		  $(bazel-get-flags) \
		  //tensorflow:libtensorflow.so \
		  //tensorflow:libtensorflow_framework.so \
		  $(usex cxx "//tensorflow:libtensorflow_cc.so" "") || die

	python_compile() {
		einfo ">>> Compiling ${PN} ${MULTIBUILD_VARIANT}"
		einfo "	bazel build \\"
		einfo "	  --config=opt ${opt} \\"
		einfo "	  $(bazel-get-flags) \\"
		einfo "   //tensorflow/tools/pip_package:build_pip_package"
		bazel build \
			  --config=opt ${opt} \
			  $(bazel-get-flags) \
			  //tensorflow/tools/pip_package:build_pip_package || die
		bazel-bin/tensorflow/tools/pip_package/build_pip_package tensorflow_pkg || die
		unzip -o -d ${PN}_pkg_${MULTIBUILD_VARIANT} ${PN}_pkg/${P}-*.whl || die
		rm -f ${PN}_pkg_${MULTIBUILD_VARIANT}/lib${PN}_framework.so || die
	}
	python_foreach_impl python_compile
	bazel shutdown || die
}

src_test() {
	python_foreach_impl python_test
}

src_install() {
	local SO1=$(get_major_version)
	local SOVER=$(version_format_string '$1.$2')
	local tl="${PN} ${PN}_framework"
	dodir /usr/include/${PN}/${PN}/c
	insinto /usr/include/${PN}/${PN}/c
	doins ${PN}/c/c_api.h
	if use cxx; then
		for i in $(find ${PN}/cc ${PN}/core third_party/eigen3 -type f \
						\( -name \*.h -o \
						-wholename third_party/eigen3/Eigen/\* \) -print); do
			dodir $(dirname /usr/include/${PN}/${i})
			insinto $(dirname /usr/include/${PN}/${i})
			doins ${i}
		done
		tl+=" ${PN}_cc"
	fi
	for i in ${tl}; do
		dolib.so bazel-bin/${PN}/lib${i}.so
		dosym "lib${i}.so" \
			  "/usr/$(get_libdir)/lib${i}.so.${SO1}" \
			|| die "Could not create /usr/$(get_libdir)/lib${i}.so.${SO1} symlink"
		dosym "lib${i}.so" \
			  "/usr/$(get_libdir)/lib${i}.so.${SOVER}" \
			|| die "Could not create /usr/$(get_libdir)/lib${i}.so.${SOVER} symlink"
	done
	python_install() {
		python_domodule ${PN}_pkg_${MULTIBUILD_VARIANT}/${P}.data/purelib/${PN}
		dosym "../../../lib${PN}_framework.so" \
			  "$(python_get_sitedir)/${PN}/lib${PN}_framework.so" \
			|| die "Could not create $(python_get_sitedir)/lib${PN}_framework.so symlink for python module"
	}
	python_foreach_impl python_install
	einstalldocs
}