1 # Execute gbs with --define "testcoverage 1" in case that you must get unittest coverage statistics
3 %define nnstreamer_filter 1
5 %define support_ccapi 1
6 %define support_nnstreamer_backbone 1
7 %define support_tflite_backbone 1
8 %define support_tflite_interpreter 1
9 %define nntrainerapplicationdir %{_libdir}/nntrainer/bin
10 %define gen_input $(pwd)/test/input_gen/genInput.py
11 %define support_data_augmentation_opencv 1
15 # dependency resolution
16 %if 0%{tizen_version_major}%{tizen_version_minor} >= 65
17 # (rpm -qi nnstreamer --queryformat '%%{VERSION}' | sed -e 's/\.//g') >= 171
19 %define capi_machine_learning_common capi-machine-learning-common
20 %define capi_machine_learning_inference capi-machine-learning-inference
22 %define capi_ml_common_pkg_name capi-ml-common
23 %define capi_ml_inference_pkg_name capi-ml-inference
27 %if 0%{tizen_version_major}%{tizen_version_minor} >= 60
28 # (rpm -qi nnstreamer --queryformat '%%{VERSION}' | sed -e 's/\.//g') >= 160
29 %define capi_machine_learning_common capi-ml-common
30 %define capi_machine_learning_inference capi-nnstreamer
32 %define capi_ml_common_pkg_name capi-nnstreamer
33 %define capi_ml_inference_pkg_name capi-nnstreamer
35 %{error: nnst_version < 6.0 is not supported}
36 # shouldn't reach here. Below is for the reference.
37 # If you prepare ml-common-api.h, below can work though.
38 %define capi_machine_learning_inference capi-nnstreamer
39 %define capi_machine_learning_common capi-nnstreamer
41 %define capi_ml_common_pkg_name capi-nnstreamer
42 %define capi_ml_inference_pkg_name capi-nnstreamer
43 %endif # 0%{tizen_version_major}%{tizen_version_minor} >= 60
45 %endif # 0%{tizen_version_major}%{tizen_version_minor} >= 65
48 Summary: Software framework for training neural networks
51 Packager: Jijoong Moon <jijoong.moon@samsung.com>
53 Source0: nntrainer-%{version}.tar.gz
54 Source1001: nntrainer.manifest
56 Source1002: capi-machine-learning-training.manifest
58 Source2001: trainset.tar.gz
59 Source2002: valset.tar.gz
60 Source2003: testset.tar.gz
62 Source2005: unittest_layers.tar.gz
64 BuildRequires: meson >= 0.50.0
65 BuildRequires: openblas-devel
66 BuildRequires: iniparser-devel >= 4.1
67 BuildRequires: gtest-devel
68 BuildRequires: python3
69 BuildRequires: python3-numpy
71 BuildRequires: %{capi_machine_learning_common}-devel
72 BuildRequires: %{capi_machine_learning_inference}-devel
75 BuildRequires: ssat >= 1.1.0
79 %define enable_gym -Duse_gym=false
81 BuildRequires: gym-http-api-devel
82 %define enable_gym -Duse_gym=true
86 # to be compatible with gcc-9, lcov should have a higher version than 1.14.1
88 # BuildRequires: taos-ci-unittest-coverage-assessment
91 %if 0%{?support_data_augmentation_opencv}
92 BuildRequires: opencv-devel
96 BuildRequires: pkgconfig(capi-system-info)
97 BuildRequires: pkgconfig(capi-base-common)
98 BuildRequires: pkgconfig(dlog)
100 %if 0%{?support_nnstreamer_backbone}
101 BuildRequires: nnstreamer-tensorflow2-lite
103 Requires: nnstreamer-tensorflow2-lite
104 %endif # support_nnstreamer_backbone
106 %if 0%{?support_tflite_backbone}
107 BuildRequires: tensorflow2-lite-devel
108 %endif # support_tflite_backbone
110 %if 0%{?support_tflite_interpreter}
111 BuildRequires: tensorflow2-lite-devel
112 %endif # support_tflite_interpreter
114 %define enable_nnstreamer_tensor_filter -Denable-nnstreamer-tensor-filter=false
116 %if 0%{?nnstreamer_filter}
117 BuildRequires: nnstreamer-devel
118 %define enable_nnstreamer_tensor_filter -Denable-nnstreamer-tensor-filter=true
121 BuildRequires: nnstreamer-test-devel
122 BuildRequires: gst-plugins-good-extra
123 BuildRequires: python
125 %endif #nnstreamer_filter
128 Requires: nntrainer-core = %{version}-%{release}
130 %if 0%{?nnstreamer_filter}
131 Requires: nnstreamer-nntrainer = %{version}-%{release}
132 %endif #nnstreamer_filter
134 Requires: capi-machine-learning-training = %{version}-%{release}
138 NNtrainer Meta package for tizen
141 Summary: Software framework for training neural networks
142 Requires: iniparser >= 4.1
143 Requires: libopenblas_pthreads0
146 NNtrainer is Software Framework for Training Neural Network Models on Devices.
149 Summary: Development package for custom nntrainer developers
150 Requires: nntrainer = %{version}-%{release}
151 Requires: openblas-devel
152 Requires: %{capi_machine_learning_common}-devel
155 Development package for custom nntrainer developers.
156 This contains corresponding header files and .pc pkgconfig file.
158 %package devel-static
159 Summary: Static library for nntrainer-devel package
160 Requires: nntrainer-devel = %{version}-%{release}
161 %description devel-static
162 Static library package of nntrainer-devel
164 %package applications
165 Summary: NNTrainer Examples
166 Requires: nntrainer = %{version}-%{release}
167 Requires: %{capi_machine_learning_inference}
168 Requires: nnstreamer-tensorflow2-lite
169 BuildRequires: nnstreamer-test-devel
170 BuildRequires: nnstreamer-tensorflow2-lite
171 BuildRequires: tensorflow2-lite-devel
172 BuildRequires: pkgconfig(jsoncpp)
173 BuildRequires: pkgconfig(libcurl)
174 BuildRequires: pkgconfig(dlog)
175 BuildRequires: %{capi_machine_learning_inference}-devel
176 BuildRequires: glib2-devel
177 BuildRequires: gstreamer-devel
179 %description applications
180 NNTrainer Examples for test purpose.
182 %if 0%{?testcoverage}
183 %package unittest-coverage
184 Summary: NNTrainer UnitTest Coverage Analysis Result
186 %description unittest-coverage
187 HTML pages of lcov results of NNTrainer generated during rpmbuild
191 %package -n capi-machine-learning-training
192 Summary: Tizen Native API for NNTrainer
193 Group: Machine Learning/ML Framework
194 Requires: %{name} = %{version}-%{release}
195 %description -n capi-machine-learning-training
196 Tizen Native API wrapper for NNTrainer.
197 You can train neural networks efficiently.
199 %post -n capi-machine-learning-training -p /sbin/ldconfig
200 %postun -n capi-machine-learning-training -p /sbin/ldconfig
202 %package -n capi-machine-learning-training-devel
203 Summary: Tizen Native API Devel Kit for NNTrainer
204 Group: Machine Learning/ML Framework
205 Requires: capi-machine-learning-training = %{version}-%{release}
206 Requires: %{capi_machine_learning_common}-devel
207 %description -n capi-machine-learning-training-devel
208 Developmental kit for Tizen Native NNTrainer API.
210 %package -n capi-machine-learning-training-devel-static
211 Summary: Static library for Tizen Native API
212 Group: Machine Learning/ML Framework
213 Requires: capi-machine-learning-training-devel = %{version}-%{release}
214 %description -n capi-machine-learning-training-devel-static
215 Static library of capi-machine-learning-training-devel package.
217 %package tizen-internal-devel
218 Summary: Tizen internal headers for Tizen Machine Learning Training API
219 Group: Machine Learning/ML Framework
220 Requires: capi-machine-learning-training-devel = %{version}-%{release}
221 %description tizen-internal-devel
222 Tizen internal headers for Tizen Machine Learning Training API.
224 %if 0%{?support_ccapi}
225 %package -n ccapi-machine-learning-training
226 Summary: Tizen Native API for NNTrainer
227 Group: Machine Learning/ML Framework
228 Requires: %{name} = %{version}-%{release}
229 %description -n ccapi-machine-learning-training
230 Tizen Native API wrapper for NNTrainer.
231 You can train neural networks efficiently.
233 %post -n ccapi-machine-learning-training -p /sbin/ldconfig
234 %postun -n ccapi-machine-learning-training -p /sbin/ldconfig
236 %package -n ccapi-machine-learning-training-devel
237 Summary: Tizen Native API Devel Kit for NNTrainer
238 Group: Machine Learning/ML Framework
239 Requires: ccapi-machine-learning-training = %{version}-%{release}
240 %description -n ccapi-machine-learning-training-devel
241 Developmental kit for Tizen Native NNTrainer API.
243 %package -n ccapi-machine-learning-training-devel-static
244 Summary: Static library for Tizen c++ API
245 Group: Machine Learning/ML Framework
246 Requires: ccapi-machine-learning-training-devel = %{version}-%{release}
247 %description -n ccapi-machine-learning-training-devel-static
248 Static library of ccapi-machine-learning-training-devel package.
251 %if 0%{?nnstreamer_filter}
252 %package -n nnstreamer-nntrainer
253 Summary: NNStreamer NNTrainer support
254 Requires: %{name} = %{version}-%{release}
256 %description -n nnstreamer-nntrainer
257 NNSteamer tensor filter for nntrainer to support inference.
259 %package -n nnstreamer-nntrainer-devel-static
260 Summary: NNStreamer NNTrainer support
261 Requires: nntrainer-devel-static = %{version}-%{release}
262 Requires: nnstreamer-nntrainer = %{version}-%{release}
263 %description -n nnstreamer-nntrainer-devel-static
264 NNSteamer tensor filter static package for nntrainer to support inference.
265 %endif #nnstreamer_filter
269 ## Define build options
270 %define platform -Dplatform=tizen
271 %define enable_tizen_feature_check -Denable-tizen-feature-check=true -Dtizen-version-major=0%{?tizen_version_major} -Dtizen-version-minor=0%{?tizen_version_minor}
272 %define install_app -Dinstall-app=true
273 %define enable_ccapi -Denable-ccapi=false
274 %define enable_nnstreamer_backbone -Denable-nnstreamer-backbone=false
275 %define enable_tflite_backbone -Denable-tflite-backbone=false
276 %define enable_tflite_interpreter -Denable-tflite-interpreter=false
277 %define enable_profile -Denable-profile=false
278 %define capi_ml_pkg_dep_resolution -Dcapi-ml-inference-actual=%{?capi_ml_inference_pkg_name} -Dcapi-ml-common-actual=%{?capi_ml_common_pkg_name}
279 %define enable_reduce_tolerance -Dreduce-tolerance=true
280 %define enable_debug -Denable-debug=false
282 # enable full tolerance on the CI
284 %define enable_reduce_tolerance -Dreduce-tolerance=false
287 # enable debug on the CI for build
289 %define enable_debug -Denable-debug=true
293 %define platform -Dplatform=tizen
295 %if 0%{?support_ccapi}
296 %define enable_ccapi -Denable-ccapi=true
297 %endif # support_ccapi
300 # Using cblas for Matrix calculation
302 %define enable_cblas -Denable-blas=true
305 %if 0%{?support_nnstreamer_backbone}
306 %define enable_nnstreamer_backbone -Denable-nnstreamer-backbone=true
309 %if 0%{?support_tflite_backbone}
310 %define enable_tflite_backbone -Denable-tflite-backbone=true
314 %define enable_profile -Denable-profile=true
317 %if 0%{?support_tflite_interpreter}
318 %define enable_tflite_interpreter -Denable-tflite-interpreter=true
335 CXXFLAGS=`echo $CXXFLAGS | sed -e "s|-std=gnu++11||"`
337 %if 0%{?testcoverage}
338 CXXFLAGS="${CXXFLAGS} -fprofile-arcs -ftest-coverage"
339 CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage"
342 # Add backward competibility for tizen < 6
343 %if 0%{tizen_version_major} < 6
344 ln -sf %{_includedir}/nnstreamer/nnstreamer.h %{_includedir}/nnstreamer/ml-api-common.h
345 ln -sf %{_libdir}/pkgconfig/capi-nnstreamer.pc %{_libdir}/pkgconfig/capi-ml-common.pc
349 meson --buildtype=plain --prefix=%{_prefix} --sysconfdir=%{_sysconfdir} \
350 --libdir=%{_libdir} --bindir=%{nntrainerapplicationdir} \
351 --includedir=%{_includedir} %{install_app} %{platform} \
352 %{enable_tizen_feature_check} %{enable_cblas} %{enable_ccapi} \
353 %{enable_gym} %{enable_nnstreamer_tensor_filter} %{enable_profile} \
354 %{enable_nnstreamer_backbone} %{enable_tflite_backbone} \
355 %{enable_tflite_interpreter} %{capi_ml_pkg_dep_resolution} \
356 %{enable_reduce_tolerance} %{enable_debug} build
358 ninja -C build %{?_smp_mflags}
361 export NNSTREAMER_CONF=$(pwd)/test/nnstreamer/nnstreamer-test.ini
362 export NNSTREAMER_FILTERS=$(pwd)/build/nnstreamer/tensor_filter
363 meson test -C build -t 2.0 --print-errorlogs
365 # unittest for nntrainer plugin for nnstreamer
366 # todo: migrate this to meson test soon
367 %if 0%{?nnstreamer_filter}
368 pushd test/nnstreamer
371 %endif #nnstreamer_filter
375 DESTDIR=%{buildroot} ninja -C build %{?_smp_mflags} install
377 %if 0%{?testcoverage}
379 # The included directories are:
381 # api: nnstreamer api
382 # gst: the nnstreamer elements
383 # nnstreamer_example: custom plugin examples
384 # common: common libraries for gst (elements)
385 # include: common library headers and headers for external code (packaged as "devel")
387 # Intentionally excluded directories are:
389 # tests: We are not going to show testcoverage of the test code itself or example applications
392 %define testtarget $(pwd)/api/capi
397 # 'lcov' generates the date format with UTC time zone by default. Let's replace UTC with KST.
398 # If you ccan get a root privilege, run ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
399 TZ='Asia/Seoul'; export TZ
400 $(pwd)/test/unittestcoverage.py module $(pwd)/nntrainer %testtarget
403 VCS=`cat ${RPM_SOURCE_DIR}/nntrainer.spec | grep "^VCS:" | sed "s|VCS:\\W*\\(.*\\)|\\1|"`
405 # Create human readable unit test coverage report web page.
406 # Create null gcda files if gcov didn't create it because there is completely no unit test for them.
407 find . -name "*.gcno" -exec sh -c 'touch -a "${1%.gcno}.gcda"' _ {} \;
408 # Remove gcda for meaningless file (CMake's autogenerated)
409 find . -name "CMakeCCompilerId*.gcda" -delete
410 find . -name "CMakeCXXCompilerId*.gcda" -delete
411 #find . -path "/build/*.j
414 lcov -t 'NNTrainer Unit Test Coverage' -o unittest.info -c -d . -b %{_builddir}/%{name}-%{version}/build \
415 --include "*/nntrainer/*" \
416 --include "*/api/*" \
417 --exclude "*/tensorflow*" \
418 --exclude "*/Applications/*" \
419 --exclude "*/test/*" \
420 --exclude "*/meson*/*" \
421 --exclude "*/nntrainer_logger.cpp" \
422 --exclude "*/tf_schema_generated.h" \
423 --exclude "*/nnstreamer_layer.*"
424 # nnstreamer layer is untestable here
426 # Visualize the report
427 genhtml -o result unittest.info -t "nntrainer %{version}-%{release} ${VCS}" --ignore-errors source -p ${RPM_BUILD_DIR}
429 mkdir -p %{buildroot}%{_datadir}/nntrainer/unittest/
430 cp -r result %{buildroot}%{_datadir}/nntrainer/unittest/
431 %endif # test coverage
433 %post -p /sbin/ldconfig
434 %postun -p /sbin/ldconfig
439 %manifest nntrainer.manifest
440 %defattr(-,root,root,-)
442 %{_libdir}/libnntrainer.so
443 %config %{_sysconfdir}/nntrainer.ini
446 # node exporter and its dependencies
447 %{_includedir}/nntrainer/nntrainer_error.h
448 %{_includedir}/nntrainer/common_properties.h
449 %{_includedir}/nntrainer/base_properties.h
450 %{_includedir}/nntrainer/node_exporter.h
452 %{_includedir}/nntrainer/tensor.h
453 %{_includedir}/nntrainer/tensor_wrap_specs.h
454 # @todo: update dataset headers
455 %{_includedir}/nntrainer/databuffer.h
456 %{_includedir}/nntrainer/databuffer_factory.h
458 %{_includedir}/nntrainer/layer_context.h
459 %{_includedir}/nntrainer/layer_devel.h
460 %{_includedir}/nntrainer/layer_impl.h
462 %{_includedir}/nntrainer/optimizer_context.h
463 %{_includedir}/nntrainer/optimizer_devel.h
464 %{_includedir}/nntrainer/optimizer_impl.h
465 %{_libdir}/pkgconfig/nntrainer.pc
466 # update this to enable external applications
467 # @todo filter out headers that should be hidden, and classifiy in the appropriate place if not
468 %{_includedir}/nntrainer/util_func.h
471 %{_libdir}/libnntrainer*.a
472 %exclude %{_libdir}/libcapi*.a
475 %files -n capi-machine-learning-training
476 %manifest capi-machine-learning-training.manifest
478 %{_libdir}/libcapi-nntrainer.so
480 %files -n capi-machine-learning-training-devel
481 %{_includedir}/nntrainer/nntrainer.h
482 %{_includedir}/nntrainer/nntrainer-api-common.h
483 %{_libdir}/pkgconfig/capi-ml-training.pc
485 %files -n capi-machine-learning-training-devel-static
486 %{_libdir}/libcapi-nntrainer.a
488 %files tizen-internal-devel
489 %{_includedir}/nntrainer/nntrainer-tizen-internal.h
491 %if 0%{?support_ccapi}
492 %files -n ccapi-machine-learning-training
493 %manifest capi-machine-learning-training.manifest
495 %{_libdir}/libccapi-nntrainer.so
497 %files -n ccapi-machine-learning-training-devel
498 %{_includedir}/nntrainer/model.h
499 %{_includedir}/nntrainer/layer.h
500 %{_includedir}/nntrainer/optimizer.h
501 %{_includedir}/nntrainer/dataset.h
502 %{_includedir}/nntrainer/tensor_dim.h
503 %{_libdir}/pkgconfig/ccapi-ml-training.pc
505 %files -n ccapi-machine-learning-training-devel-static
506 %{_libdir}/libccapi-nntrainer.a
507 %endif # support_ccapi
509 %if 0%{?nnstreamer_filter}
510 %files -n nnstreamer-nntrainer
511 %manifest nntrainer.manifest
512 %defattr(-,root,root,-)
514 %{_libdir}/nnstreamer/filters/libnnstreamer_filter_nntrainer.so
516 %files -n nnstreamer-nntrainer-devel-static
517 %manifest nntrainer.manifest
518 %defattr(-,root,root,-)
520 %{_libdir}/libnnstreamer_filter_nntrainer.a
522 %endif #nnstreamer_filter
526 %manifest nntrainer.manifest
527 %defattr(-,root,root,-)
529 %{_libdir}/nntrainer/bin/applications/*
531 %if 0%{?testcoverage}
532 %files unittest-coverage
533 %{_datadir}/nntrainer/unittest/*
537 * Fri Sep 24 2021 Jijoong Moon <jijoong.moon@samsung.com>
539 * Wed Jun 02 2021 Jijoong Moon <jijoong.moon@samsung.com>
541 * Wed Sep 23 2020 Jijoong Moon <jijoong.moon@samsung.com>
543 * Mon Aug 10 2020 Jijoong Moon <jijoong.moon@samsung.com>
544 - Release of 0.1.0.rc1
545 * Wed Mar 18 2020 Jijoong Moon <jijoong.moon@samsung.com>