38a79c3f4f401e28522481636f2dc5d4b3af00a9
[platform/core/ml/nntrainer.git] / packaging / nntrainer.spec
1 # Execute gbs with --define "testcoverage 1" in case that you must get unittest coverage statistics
2 %define         use_cblas 1
3 %define         nnstreamer_filter 1
4 %define         use_gym 0
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
12
13 %bcond_with tizen
14
15 # dependency resolution
16 %if 0%{tizen_version_major}%{tizen_version_minor} >= 65
17 # (rpm -qi nnstreamer --queryformat '%%{VERSION}' | sed -e 's/\.//g') >= 171
18
19 %define         capi_machine_learning_common       capi-machine-learning-common
20 %define         capi_machine_learning_inference  capi-machine-learning-inference
21
22 %define         capi_ml_common_pkg_name          capi-ml-common
23 %define         capi_ml_inference_pkg_name       capi-ml-inference
24
25 %else
26
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
31
32 %define         capi_ml_common_pkg_name          capi-nnstreamer
33 %define         capi_ml_inference_pkg_name       capi-nnstreamer
34 %else
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
40
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
44
45 %endif # 0%{tizen_version_major}%{tizen_version_minor} >= 65
46
47 Name:           nntrainer
48 Summary:        Software framework for training neural networks
49 Version:        0.2.0
50 Release:        0
51 Packager:       Jijoong Moon <jijoong.moon@samsung.com>
52 License:        Apache-2.0
53 Source0:        nntrainer-%{version}.tar.gz
54 Source1001:     nntrainer.manifest
55 %if %{with tizen}
56 Source1002:     capi-machine-learning-training.manifest
57 %endif
58 Source2001:     trainset.tar.gz
59 Source2002:     valset.tar.gz
60 Source2003:     testset.tar.gz
61 Source2004:     label.dat
62 Source2005:     unittest_layers.tar.gz
63
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
70
71 BuildRequires:  %{capi_machine_learning_common}-devel
72 BuildRequires:  %{capi_machine_learning_inference}-devel
73
74 %if 0%{?unit_test}
75 BuildRequires:  ssat >= 1.1.0
76 %endif
77
78 # OpenAI interface
79 %define enable_gym -Duse_gym=false
80 %if 0%{?use_gym}
81 BuildRequires:  gym-http-api-devel
82 %define enable_gym -Duse_gym=true
83 %endif
84
85 %if 0%{?testcoverage}
86 # to be compatible with gcc-9, lcov should have a higher version than 1.14.1
87 BuildRequires: lcov
88 # BuildRequires:        taos-ci-unittest-coverage-assessment
89 %endif
90
91 %if 0%{?support_data_augmentation_opencv}
92 BuildRequires: opencv-devel
93 %endif
94
95 %if %{with tizen}
96 BuildRequires:  pkgconfig(capi-system-info)
97 BuildRequires:  pkgconfig(capi-base-common)
98 BuildRequires:  pkgconfig(dlog)
99
100 %if 0%{?support_nnstreamer_backbone}
101 BuildRequires: nnstreamer-tensorflow2-lite
102
103 Requires:       nnstreamer-tensorflow2-lite
104 %endif # support_nnstreamer_backbone
105
106 %if 0%{?support_tflite_backbone}
107 BuildRequires: tensorflow2-lite-devel
108 %endif # support_tflite_backbone
109
110 %if 0%{?support_tflite_interpreter}
111 BuildRequires: tensorflow2-lite-devel
112 %endif # support_tflite_interpreter
113
114 %define enable_nnstreamer_tensor_filter -Denable-nnstreamer-tensor-filter=false
115
116 %if  0%{?nnstreamer_filter}
117 BuildRequires:  nnstreamer-devel
118 %define enable_nnstreamer_tensor_filter -Denable-nnstreamer-tensor-filter=true
119
120 %if 0%{?unit_test}
121 BuildRequires:  nnstreamer-test-devel
122 BuildRequires:  gst-plugins-good-extra
123 BuildRequires:  python
124 %endif #unit_test
125 %endif #nnstreamer_filter
126 %endif  # tizen
127
128 Requires:       nntrainer-core = %{version}-%{release}
129
130 %if 0%{?nnstreamer_filter}
131 Requires:       nnstreamer-nntrainer = %{version}-%{release}
132 %endif #nnstreamer_filter
133 %if %{with tizen}
134 Requires:       capi-machine-learning-training = %{version}-%{release}
135 %endif #tizen
136
137 %description
138 NNtrainer Meta package for tizen
139
140 %package core
141 Summary:        Software framework for training neural networks
142 Requires:       iniparser >= 4.1
143 Requires:       libopenblas_pthreads0
144
145 %description core
146 NNtrainer is Software Framework for Training Neural Network Models on Devices.
147
148 %package devel
149 Summary:        Development package for custom nntrainer developers
150 Requires:       nntrainer = %{version}-%{release}
151 Requires:       openblas-devel
152 Requires:       %{capi_machine_learning_common}-devel
153
154 %description devel
155 Development package for custom nntrainer developers.
156 This contains corresponding header files and .pc pkgconfig file.
157
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
163
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
178
179 %description applications
180 NNTrainer Examples for test purpose.
181
182 %if 0%{?testcoverage}
183 %package unittest-coverage
184 Summary:        NNTrainer UnitTest Coverage Analysis Result
185
186 %description unittest-coverage
187 HTML pages of lcov results of NNTrainer generated during rpmbuild
188 %endif
189
190 %if %{with tizen}
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.
198
199 %post -n capi-machine-learning-training -p /sbin/ldconfig
200 %postun -n capi-machine-learning-training -p /sbin/ldconfig
201
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.
209
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.
216
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.
223
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.
232
233 %post -n ccapi-machine-learning-training -p /sbin/ldconfig
234 %postun -n ccapi-machine-learning-training -p /sbin/ldconfig
235
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.
242
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.
249 %endif
250
251 %if 0%{?nnstreamer_filter}
252 %package -n nnstreamer-nntrainer
253 Summary: NNStreamer NNTrainer support
254 Requires: %{name} = %{version}-%{release}
255 Requires:       nnstreamer
256 %description -n nnstreamer-nntrainer
257 NNSteamer tensor filter for nntrainer to support inference.
258
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
266
267 %endif #tizen
268
269 ## Define build options
270 %define platform -Dplatform=tizen
271 %define enable_tizen_feature_check -Denable-tizen-feature-check=true
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
281 # enable full tolerance on the CI
282 %if 0%{?unit_test}
283 %define enable_reduce_tolerance -Dreduce-tolerance=false
284 %endif
285
286 %if %{with tizen}
287 %define platform -Dplatform=tizen
288
289 %if 0%{?support_ccapi}
290 %define enable_ccapi -Denable-ccapi=true
291 %endif # support_ccapi
292 %endif # tizen
293
294 # Using cblas for Matrix calculation
295 %if 0%{?use_cblas}
296 %define enable_cblas -Denable-blas=true
297 %endif
298
299 %if 0%{?support_nnstreamer_backbone}
300 %define enable_nnstreamer_backbone -Denable-nnstreamer-backbone=true
301 %endif
302
303 %if 0%{?support_tflite_backbone}
304 %define enable_tflite_backbone -Denable-tflite-backbone=true
305 %endif
306
307 %if 0%{?unit_test}
308 %define enable_profile -Denable-profile=true
309 %endif
310
311 %if 0%{?support_tflite_interpreter}
312 %define enable_tflite_interpreter -Denable-tflite-interpreter=true
313 %endif
314
315 %prep
316 %setup -q
317 cp %{SOURCE1001} .
318 cp %{SOURCE2001} .
319 cp %{SOURCE2002} .
320 cp %{SOURCE2003} .
321 cp %{SOURCE2004} .
322 cp %{SOURCE2005} .
323
324 %if %{with tizen}
325 cp %{SOURCE1002} .
326 %endif
327
328 %build
329 CXXFLAGS=`echo $CXXFLAGS | sed -e "s|-std=gnu++11||"`
330
331 %if 0%{?testcoverage}
332 CXXFLAGS="${CXXFLAGS} -fprofile-arcs -ftest-coverage"
333 CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage"
334 %endif
335
336 # Add backward competibility for tizen < 6
337 %if 0%{tizen_version_major} < 6
338 ln -sf %{_includedir}/nnstreamer/nnstreamer.h %{_includedir}/nnstreamer/ml-api-common.h
339 ln -sf %{_libdir}/pkgconfig/capi-nnstreamer.pc %{_libdir}/pkgconfig/capi-ml-common.pc
340 %endif
341
342 mkdir -p build
343 meson --buildtype=plain --prefix=%{_prefix} --sysconfdir=%{_sysconfdir} \
344       --libdir=%{_libdir} --bindir=%{nntrainerapplicationdir} \
345       --includedir=%{_includedir} %{install_app} %{platform} \
346       %{enable_tizen_feature_check} %{enable_cblas} %{enable_ccapi} \
347       %{enable_gym} %{enable_nnstreamer_tensor_filter} %{enable_profile} \
348       %{enable_nnstreamer_backbone} %{enable_tflite_backbone} \
349       %{enable_tflite_interpreter} %{capi_ml_pkg_dep_resolution} \
350       %{enable_reduce_tolerance} build
351
352 ninja -C build %{?_smp_mflags}
353
354 %if 0%{?unit_test}
355 export NNSTREAMER_CONF=$(pwd)/test/nnstreamer/nnstreamer-test.ini
356 export NNSTREAMER_FILTERS=$(pwd)/build/nnstreamer/tensor_filter
357 meson test -C build -t 2.0 --print-errorlogs
358
359 # unittest for nntrainer plugin for nnstreamer
360 # todo: migrate this to meson test soon
361 %if 0%{?nnstreamer_filter}
362 pushd test/nnstreamer
363 ssat
364 popd
365 %endif #nnstreamer_filter
366 %endif #unit_test
367
368 %install
369 DESTDIR=%{buildroot} ninja -C build %{?_smp_mflags} install
370
371 %if 0%{?testcoverage}
372 ##
373 # The included directories are:
374 #
375 # api: nnstreamer api
376 # gst: the nnstreamer elements
377 # nnstreamer_example: custom plugin examples
378 # common: common libraries for gst (elements)
379 # include: common library headers and headers for external code (packaged as "devel")
380 #
381 # Intentionally excluded directories are:
382 #
383 # tests: We are not going to show testcoverage of the test code itself or example applications
384
385 %if %{with tizen}
386 %define testtarget $(pwd)/api/capi
387 %else
388 %define testtarget
389 %endif
390
391 # 'lcov' generates the date format with UTC time zone by default. Let's replace UTC with KST.
392 # If you ccan get a root privilege, run ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
393 TZ='Asia/Seoul'; export TZ
394 $(pwd)/test/unittestcoverage.py module $(pwd)/nntrainer %testtarget
395
396 # Get commit info
397 VCS=`cat ${RPM_SOURCE_DIR}/nntrainer.spec | grep "^VCS:" | sed "s|VCS:\\W*\\(.*\\)|\\1|"`
398
399 # Create human readable unit test coverage report web page.
400 # Create null gcda files if gcov didn't create it because there is completely no unit test for them.
401 find . -name "*.gcno" -exec sh -c 'touch -a "${1%.gcno}.gcda"' _ {} \;
402 # Remove gcda for meaningless file (CMake's autogenerated)
403 find . -name "CMakeCCompilerId*.gcda" -delete
404 find . -name "CMakeCXXCompilerId*.gcda" -delete
405 #find . -path "/build/*.j
406
407 # Generate report
408 lcov -t 'NNTrainer Unit Test Coverage' -o unittest.info -c -d . -b %{_builddir}/%{name}-%{version}/build --include "*/nntrainer/*" --include "*/api/*" --exclude "*/tensorflow/*" --exclude "*/nntrainer_logger.cpp"
409
410 # Exclude generated files
411 lcov -r unittest.info "*/test/*" "*/meson*/*" -o unittest-filtered.info
412
413 # Visualize the report
414 genhtml -o result unittest-filtered.info -t "nntrainer %{version}-%{release} ${VCS}" --ignore-errors source -p ${RPM_BUILD_DIR}
415
416 mkdir -p %{buildroot}%{_datadir}/nntrainer/unittest/
417 cp -r result %{buildroot}%{_datadir}/nntrainer/unittest/
418 %endif  # test coverage
419
420 %post -p /sbin/ldconfig
421 %postun -p /sbin/ldconfig
422
423 %files
424
425 %files core
426 %manifest nntrainer.manifest
427 %defattr(-,root,root,-)
428 %license LICENSE
429 %{_libdir}/libnntrainer.so
430 %config %{_sysconfdir}/nntrainer.ini
431
432 %files devel
433 # node exporter and its dependencies
434 %{_includedir}/nntrainer/nntrainer_error.h
435 %{_includedir}/nntrainer/common_properties.h
436 %{_includedir}/nntrainer/base_properties.h
437 %{_includedir}/nntrainer/props_util.h
438 %{_includedir}/nntrainer/node_exporter.h
439 # tensor headers
440 %{_includedir}/nntrainer/tensor.h
441 %{_includedir}/nntrainer/tensor_wrap_specs.h
442 # @todo: update dataset headers
443 %{_includedir}/nntrainer/databuffer.h
444 %{_includedir}/nntrainer/databuffer_factory.h
445 # layer headers
446 %{_includedir}/nntrainer/layer_context.h
447 %{_includedir}/nntrainer/layer_devel.h
448 %{_includedir}/nntrainer/layer_impl.h
449 # optimizer headers
450 %{_includedir}/nntrainer/optimizer_context.h
451 %{_includedir}/nntrainer/optimizer_devel.h
452 %{_includedir}/nntrainer/optimizer_impl.h
453 %{_libdir}/pkgconfig/nntrainer.pc
454
455 %files devel-static
456 %{_libdir}/libnntrainer*.a
457 %exclude %{_libdir}/libcapi*.a
458
459 %if %{with tizen}
460 %files -n capi-machine-learning-training
461 %manifest capi-machine-learning-training.manifest
462 %license LICENSE
463 %{_libdir}/libcapi-nntrainer.so
464
465 %files -n capi-machine-learning-training-devel
466 %{_includedir}/nntrainer/nntrainer.h
467 %{_includedir}/nntrainer/nntrainer-api-common.h
468 %{_libdir}/pkgconfig/capi-ml-training.pc
469
470 %files -n capi-machine-learning-training-devel-static
471 %{_libdir}/libcapi-nntrainer.a
472
473 %files tizen-internal-devel
474 %{_includedir}/nntrainer/nntrainer-tizen-internal.h
475
476 %if 0%{?support_ccapi}
477 %files -n ccapi-machine-learning-training
478 %manifest capi-machine-learning-training.manifest
479 %license LICENSE
480 %{_libdir}/libccapi-nntrainer.so
481
482 %files -n ccapi-machine-learning-training-devel
483 %{_includedir}/nntrainer/model.h
484 %{_includedir}/nntrainer/layer.h
485 %{_includedir}/nntrainer/optimizer.h
486 %{_includedir}/nntrainer/dataset.h
487 %{_includedir}/nntrainer/tensor_dim.h
488 %{_libdir}/pkgconfig/ccapi-ml-training.pc
489
490 %files -n ccapi-machine-learning-training-devel-static
491 %{_libdir}/libccapi-nntrainer.a
492 %endif # support_ccapi
493
494 %if 0%{?nnstreamer_filter}
495 %files -n nnstreamer-nntrainer
496 %manifest nntrainer.manifest
497 %defattr(-,root,root,-)
498 %license LICENSE
499 %{_libdir}/nnstreamer/filters/libnnstreamer_filter_nntrainer.so
500
501 %files -n nnstreamer-nntrainer-devel-static
502 %manifest nntrainer.manifest
503 %defattr(-,root,root,-)
504 %license LICENSE
505 %{_libdir}/libnnstreamer_filter_nntrainer.a
506
507 %endif #nnstreamer_filter
508 %endif #tizen
509
510 %files applications
511 %manifest nntrainer.manifest
512 %defattr(-,root,root,-)
513 %license LICENSE
514 %{_libdir}/nntrainer/bin/applications/*
515
516 %if 0%{?testcoverage}
517 %files unittest-coverage
518 %{_datadir}/nntrainer/unittest/*
519 %endif
520
521 %changelog
522 * Wed Jun 02 2021 Jijoong Moon <jijoong.moon@samsung.com>
523 - Release of 0.2.0
524 * Wed Sep 23 2020 Jijoong Moon <jijoong.moon@samsung.com>
525 - Release of 0.1.1
526 * Mon Aug 10 2020 Jijoong Moon <jijoong.moon@samsung.com>
527 - Release of 0.1.0.rc1
528 * Wed Mar 18 2020 Jijoong Moon <jijoong.moon@samsung.com>
529 - packaged nntrainer