Change Build Framework & add application package
authorjijoong.moon <jijoong.moon@samsung.com>
Fri, 27 Mar 2020 05:39:29 +0000 (14:39 +0900)
committerwooksong <wook16.song@samsung.com>
Fri, 27 Mar 2020 08:05:42 +0000 (17:05 +0900)
- From now on, we are going to use meson as an build framework instead
of cmake.
- Add nntrainer-applications packages

**Self evaluation:**
1. Build test:  [X]Passed [ ]Failed [ ]Skipped
2. Run test:  [X]Passed [ ]Failed [ ]Skipped

Signed-off-by: jijoong.moon <jijoong.moon@samsung.com>
25 files changed:
Applications/Classification/jni/CMakeLists.txt [deleted file]
Applications/Classification/jni/meson.build [new file with mode: 0644]
Applications/KNN/jni/CMakeLists.txt [deleted file]
Applications/KNN/jni/main.cpp [moved from Applications/KNN/jni/demo.cpp with 100% similarity]
Applications/KNN/jni/meson.build [new file with mode: 0644]
Applications/LogisticRegression/jni/meson.build [new file with mode: 0644]
Applications/ReinforcementLearning/DeepQ/jni/CMakeLists.txt [deleted file]
Applications/ReinforcementLearning/DeepQ/jni/meson.build [new file with mode: 0644]
Applications/Training/jni/CMakeLists.txt [deleted file]
Applications/Training/jni/meson.build [new file with mode: 0644]
Applications/meson.build [new file with mode: 0644]
CMakeLists.txt [deleted file]
meson.build [new file with mode: 0644]
meson_options.txt [new file with mode: 0644]
nntrainer.pc.in [moved from package.pc.in with 58% similarity]
nntrainer/include/databuffer.h [moved from include/databuffer.h with 100% similarity]
nntrainer/include/layers.h [moved from include/layers.h with 100% similarity]
nntrainer/include/neuralnet.h [moved from include/neuralnet.h with 100% similarity]
nntrainer/include/tensor.h [moved from include/tensor.h with 100% similarity]
nntrainer/meson.build [new file with mode: 0644]
nntrainer/src/databuffer.cpp [moved from src/databuffer.cpp with 100% similarity]
nntrainer/src/layers.cpp [moved from src/layers.cpp with 100% similarity]
nntrainer/src/neuralnet.cpp [moved from src/neuralnet.cpp with 100% similarity]
nntrainer/src/tensor.cpp [moved from src/tensor.cpp with 100% similarity]
packaging/nntrainer.spec

diff --git a/Applications/Classification/jni/CMakeLists.txt b/Applications/Classification/jni/CMakeLists.txt
deleted file mode 100644 (file)
index bd0977c..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-cmake_minimum_required(VERSION 2.8.3)
-project(Classification)
-
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -g -pthread")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -g -std=c++11 -pthread")
-
-find_package(PkgConfig REQUIRED)
-
-pkg_check_modules(TFLITE tensorflow-lite)
-link_libraries(${TFLITE_LIBRARIES})
-
-pkg_check_modules(INIPARSER iniparser)
-link_libraries(${INIPARSER_LIBRARIES})
-
-pkg_check_modules(NNTRAINER nntrainer)
-link_libraries(${NNTRAINER_LIBRARIES})
-
-include_directories(
-  ${CMAKE_CURRENT_SOURCE_DIR}
-  ${TFLITE_INCLUDE_DIRS}
-  ${NNTRAINER_INCLUDE_DIRS}
-  ${INIPARSER_INCLUDE_DIRS}
-  )
-                  
-set(SRCS
-  main.cpp
-  bitmap_helpers.cpp
-  )
-
-add_executable(Classification ${SRCS})
-
-target_link_libraries( Classification ${TFLITE_LIBRARIES} ${CMAKE_DL_LIBS} ${NNTRAINER_LIBRARIES} ${INIPARSER_LIBRARIES})
-
-install (TARGETS Classification
-       RUNTIME DESTINATION bin
-       )
diff --git a/Applications/Classification/jni/meson.build b/Applications/Classification/jni/meson.build
new file mode 100644 (file)
index 0000000..7510553
--- /dev/null
@@ -0,0 +1,12 @@
+classification_sources = [
+  'main.cpp',
+  'bitmap_helpers.cpp'
+]
+
+executable('nntrainer_classification',
+  classification_sources,
+  dependencies: [iniparser_dep, nntrainer_dep, tflite_dep],
+  include_directories: include_directories('.'),
+  install: get_option('install-app'),
+  install_dir: application_install_dir
+)
diff --git a/Applications/KNN/jni/CMakeLists.txt b/Applications/KNN/jni/CMakeLists.txt
deleted file mode 100644 (file)
index 9bab984..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-cmake_minimum_required(VERSION 2.8.3)
-project(KNN)
-
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -g -pthread")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -g -std=c++11 -pthread")
-find_package(PkgConfig REQUIRED)
-
-pkg_check_modules(TFLITE tensorflow-lite)
-link_libraries(${TFLITE_LIBRARIES})
-
-pkg_check_modules(NNTRAINER nntrainer)
-link_libraries(${NNTRAINER_LIBRARIES})
-
-include_directories( ${include_directories}
-                    ${CMAKE_CURRENT_SOURCE_DIR}
-                    ${TFLITE_INCLUDE_DIRS}
-                    ${NNTRAINER_INCLUDE_DIRS}
-                    )
-set(SRCS
-       demo.cpp
-       bitmap_helpers.cpp
-       )
-
-add_executable(KNN ${SRCS})
-target_link_libraries( KNN ${TFLITE_LIBRARIES} ${CMAKE_DL_LIBS} ${NNTRAINER_LIBRARIES})
diff --git a/Applications/KNN/jni/meson.build b/Applications/KNN/jni/meson.build
new file mode 100644 (file)
index 0000000..f661ccb
--- /dev/null
@@ -0,0 +1,13 @@
+knn_sources = [
+  'main.cpp',
+  'bitmap_helpers.cpp'
+]
+
+knn_inc = include_directories('.')
+
+executable('nntrainer_knn',
+  knn_sources,
+  dependencies: [iniparser_dep, nntrainer_dep, tflite_dep],
+  install: get_option('install-app'),
+  install_dir: application_install_dir
+)
diff --git a/Applications/LogisticRegression/jni/meson.build b/Applications/LogisticRegression/jni/meson.build
new file mode 100644 (file)
index 0000000..c788590
--- /dev/null
@@ -0,0 +1,6 @@
+executable('nntrainer_logistic',
+  'main.cpp',
+  dependencies: [iniparser_dep, nntrainer_dep],
+  install: get_option('install-app'),
+  install_dir: application_install_dir
+)
diff --git a/Applications/ReinforcementLearning/DeepQ/jni/CMakeLists.txt b/Applications/ReinforcementLearning/DeepQ/jni/CMakeLists.txt
deleted file mode 100644 (file)
index 37e1675..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-cmake_minimum_required(VERSION 2.8.3)
-project(DeepQ)
-
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -g")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -g -std=c++11")
-
-ADD_DEFINITIONS(-DUSING_CUSTOM_ENV)
-
-find_package(PkgConfig REQUIRED)
-
-pkg_check_modules(JSONCPP jsoncpp)
-link_libraries(${JSONCPP_LIBRARIES})
-
-pkg_check_modules(CURL libcurl)
-link_libraries(${CURL_LIBRARIES})
-
-pkg_check_modules(NNTRAINER nntrainer)
-link_libraries(${NNTRAINER_LIBRARIES})
-
-pkg_check_modules(INIPARSER iniparser)
-link_libraries(${INIPARSER_LIBRARIES})
-
-set(ENVDIR ../../Environment)
-
-include_directories( ${include_directories}
-                     ${CMAKE_CURRENT_SOURCE_DIR}/include
-                    ${JSONCPP_INCLUDE_DIRS}
-                    ${ENVDIR}
-                    ${NNTRAINER_INCLUDE_DIRS}
-                    ${INIPARSER_INCLUDE_DIRS}               
-                    )
-set(SRCS
-       main.cpp
-       gym_binding.cpp
-       ${ENVDIR}/CartPole/cartpole.cpp
-       )
-
-add_executable(DeepQ ${SRCS})
-target_link_libraries( DeepQ ${JSONCPP_LIBRARIES} ${CURL_LIBRARIES} ${NNTRAINER_LIBRARIES} ${INIPARSER_INCLUDE_DIRS})
-
-install (TARGETS DeepQ
-       RUNTIME DESTINATION bin
-       )
diff --git a/Applications/ReinforcementLearning/DeepQ/jni/meson.build b/Applications/ReinforcementLearning/DeepQ/jni/meson.build
new file mode 100644 (file)
index 0000000..c8f7791
--- /dev/null
@@ -0,0 +1,20 @@
+env_dir='../../Environment'
+
+deepq_sources = [
+  'main.cpp',
+  'gym_binding.cpp',
+  join_paths(env_dir, 'CartPole/cartpole.cpp')
+]
+
+deepq_inc = [
+  env_dir,
+  './'
+]
+
+executable('nntrainer_deepq',
+  deepq_sources,
+  dependencies: [iniparser_dep, nntrainer_dep, tflite_dep, jsoncpp_dep, libcurl_dep],
+  include_directories: include_directories(env_dir),
+  install: get_option('install-app'),
+  install_dir: application_install_dir
+)
diff --git a/Applications/Training/jni/CMakeLists.txt b/Applications/Training/jni/CMakeLists.txt
deleted file mode 100644 (file)
index 506f19f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-cmake_minimum_required(VERSION 2.8.3)
-project(TransferLearning)
-
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -g -pthread")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -g -std=c++11 -pthread")
-find_package(PkgConfig REQUIRED)
-
-pkg_check_modules(TFLITE tensorflow-lite)
-link_libraries(${TFLITE_LIBRARIES})
-
-pkg_check_modules(INIPARSER iniparser)
-link_libraries(${INIPARSER_LIBRARIES})
-
-pkg_check_modules(NNTRAINER nntrainer)
-link_libraries(${NNTRAINER_LIBRARIES})
-
-include_directories(
-  ${CMAKE_CURRENT_SOURCE_DIR}
-  ${TFLITE_INCLUDE_DIRS}
-  ${NNTRAINER_INCLUDE_DIRS}
-  ${INIPARSER_INCLUDE_DIRS}
-  )
-
-set(SRCS
-  main.cpp
-  bitmap_helpers.cpp
-  )
-
-add_executable(TransferLearning ${SRCS})
-
-target_link_libraries( TransferLearning ${TFLITE_LIBRARIES} ${CMAKE_DL_LIBS} ${NNTRAINER_LIBRARIES} ${INIPARSER_LIBRARIES})
-
-install (TARGETS TransferLearning
-       RUNTIME DESTINATION bin
-       )
diff --git a/Applications/Training/jni/meson.build b/Applications/Training/jni/meson.build
new file mode 100644 (file)
index 0000000..2f56016
--- /dev/null
@@ -0,0 +1,12 @@
+training_sources = [
+  'main.cpp',
+  'bitmap_helpers.cpp'
+]
+
+executable('nntrainer_training',
+  training_sources,
+  dependencies: [iniparser_dep, nntrainer_dep, tflite_dep],
+  include_directories: include_directories('.'),
+  install: get_option('install-app'),
+  install_dir: application_install_dir
+)
diff --git a/Applications/meson.build b/Applications/meson.build
new file mode 100644 (file)
index 0000000..580faa2
--- /dev/null
@@ -0,0 +1,5 @@
+subdir('Classification/jni')
+subdir('KNN/jni')
+subdir('LogisticRegression/jni')
+subdir('ReinforcementLearning/DeepQ/jni')
+subdir('Training/jni')
diff --git a/CMakeLists.txt b/CMakeLists.txt
deleted file mode 100644 (file)
index dc77dbb..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-cmake_minimum_required(VERSION 2.8.3)
-
-project(nntrainer)
-set(NNTRAINER_MAJOR 0)
-set(NNTRAINER_MINOR 0)
-set(NNTRAINER_RELEASE 1)
-set(NNTRAINER_VERSION ${NNTRAINER_MAJOR}.${NNTRAINER_MINOR}.${NNTRAINER_RELEASE})
-
-option(TIZEN "Build for Tizen" OFF)
-
-set (LIBDIR lib)
-
-if(TARGET_ARCH STREQUAL "x86_64")
-  set (LIBDIR lib64)
-endif()
-
-set (BLASLIB blas-openblas)
-if(TIZEN)
-  set (BLASLIB openblas)
-endif(TIZEN)
-
-if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
-  set(CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/${LIBDIR})
-endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
-
-set (PKGCONFIG_INSTALL_DIR "/usr/lib/pkgconfig/" )
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -g -pthread")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -g -std=c++11 -pthread")
-
-find_package(PkgConfig REQUIRED)
-pkg_check_modules(INIPARSER iniparser)
-link_libraries(${INIPARSER_LIBRAIRES})
-include_directories(${INIPARSER_INCLUDE_DIRS})
-
-option(USE_BLAS "Use BLAS library" ON)
-
-set(SRCS
-  src/neuralnet.cpp
-  src/tensor.cpp
-  src/layers.cpp
-  src/databuffer.cpp
-  )
-
-set(NNTRAINER_HEADERS
-  include/neuralnet.h
-  include/tensor.h
-  include/layers.h
-  include/databuffer.h
-  )
-
-include_directories(
-  ${CMAKE_CURRENT_SOURCE_DIR}
-  )
-
-if(USE_BLAS)
-  ADD_DEFINITIONS(-DUSE_BLAS)
-  pkg_check_modules(BLAS ${BLASLIB})
-  link_libraries(${BLAS_LIBRARIES})
-  include_directories(${BLAS_INCLUDE_DIRS})
-  message("[-DUSE_BLAS] is enabled")
-endif(USE_BLAS)
-
-add_library( ${PROJECT_NAME} SHARED ${SRCS} )
-
-configure_file("package.pc.in" "${PROJECT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.pc" @ONLY)
-install (FILES "${PROJECT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.pc" DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
-
-install (TARGETS nntrainer
-  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
-  )
-
-install (FILES ${NNTRAINER_HEADERS} DESTINATION include/nntrainer)
diff --git a/meson.build b/meson.build
new file mode 100644 (file)
index 0000000..9415a39
--- /dev/null
@@ -0,0 +1,106 @@
+project('nntrainer', 'c', 'cpp',
+  version: '0.0.1',
+  license: ['apache-2.0'],
+  meson_version: '>=0.50.0',
+  default_options: [
+    'werror=true',
+    'warning_level=1',
+    'c_std=gnu89',
+    'cpp_std=c++14'
+  ]
+)
+
+cc = meson.get_compiler('c')
+cxx = meson.get_compiler('cpp')
+build_platform = ''
+
+if get_option('enable-tizen')
+  # Pass __TIZEN__ to the compiler
+  build_platform = 'tizen'
+endif
+
+warning_flags = [
+  '-Wredundant-decls',
+  '-Wwrite-strings',
+  '-Wformat',
+  '-Wformat-nonliteral',
+  '-Wformat-security',
+  '-Winit-self',
+  '-Waddress',
+  '-Wno-multichar',
+  '-Wvla',
+  '-Wpointer-arith'
+]
+
+warning_c_flags = [
+  '-Wmissing-declarations',
+  '-Wmissing-include-dirs',
+  '-Wmissing-prototypes',
+  '-Wnested-externs',
+  '-Waggregate-return',
+  '-Wold-style-definition',
+  '-Wdeclaration-after-statement'
+]
+
+foreach extra_arg : warning_flags
+  if cc.has_argument (extra_arg)
+    add_project_arguments([extra_arg], language: 'c')
+  endif
+  if cxx.has_argument (extra_arg)
+    add_project_arguments([extra_arg], language: 'cpp')
+  endif
+endforeach
+
+foreach extra_arg : warning_c_flags
+  if cc.has_argument (extra_arg)
+    add_project_arguments([extra_arg], language: 'c')
+  endif
+endforeach
+
+# Set install path
+nntrainer_prefix = get_option('prefix')
+nntrainer_libdir = join_paths(nntrainer_prefix, get_option('libdir'))
+nntrainer_bindir = join_paths(nntrainer_prefix, get_option('bindir'))
+nntrainer_includedir = join_paths(nntrainer_prefix, get_option('includedir'))
+nntrainer_inidir = get_option('sysconfdir')
+application_install_dir = join_paths(nntrainer_bindir, 'applications')
+
+
+# Set default configuration
+nntrainer_conf = configuration_data()
+nntrainer_conf.set('VERSION', meson.project_version())
+nntrainer_conf.set('PREFIX', nntrainer_prefix)
+nntrainer_conf.set('EXEC_PREFIX', nntrainer_bindir)
+nntrainer_conf.set('LIB_INSTALL_DIR', nntrainer_libdir)
+nntrainer_conf.set('INCLUDE_INSTALL_DIR', nntrainer_includedir)
+
+# Dependencies
+if get_option('enable-blas')
+  add_project_arguments('-DUSE_BLAS=1', language:['c','cpp'])
+  if build_platform == 'tizen'
+    blas_dep = dependency('openblas')
+  else
+    blas_dep = dependency('blas-openblas')
+  endif
+endif
+
+libm_dep = cxx.find_library('m') # cmath library
+libdl_dep = cxx.find_library('dl') # DL library
+thread_dep = dependency('threads') # pthread for tensorflow-lite
+iniparser_dep = dependency('iniparser') # iniparser
+jsoncpp_dep = dependency('jsoncpp') # jsoncpp
+libcurl_dep = dependency('libcurl')
+
+# Install .pc
+configure_file(input: 'nntrainer.pc.in', output: 'nntrainer.pc',
+  install_dir: join_paths(nntrainer_libdir, 'pkgconfig'),
+  configuration: nntrainer_conf
+)
+
+# Build nntrainer
+subdir('nntrainer')
+
+if get_option('enable-app')
+  tflite_dep = dependency('tensorflow-lite', required: true)
+  subdir('Applications')
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644 (file)
index 0000000..6ace395
--- /dev/null
@@ -0,0 +1,4 @@
+option('enable-tizen', type: 'boolean', value: false)
+option('enable-blas', type: 'boolean', value: true)
+option('enable-app', type: 'boolean', value: true)
+option('install-app', type: 'boolean', value: true)
similarity index 58%
rename from package.pc.in
rename to nntrainer.pc.in
index da59ab4..470e410 100644 (file)
@@ -1,9 +1,9 @@
-prefix=@CMAKE_INSTALL_PREFIX@
-libdir=${prefix}/lib
-includedir=${prefix}/include
+prefix=@PREFIX@
+libdir=@LIB_INSTALL_DIR@
+includedir=@INCLUDE_INSTALL_DIR@
 
 Name : nntrainer
-Version : @NNTRAINER_VERSION@
+Version : @VERSION@
 Description: Software Framework for Training Neural Network on Device
 Libs: -L${libdir} -lnntrainer
 Cflags: -I${includedir}/nntrainer
similarity index 100%
rename from include/layers.h
rename to nntrainer/include/layers.h
similarity index 100%
rename from include/tensor.h
rename to nntrainer/include/tensor.h
diff --git a/nntrainer/meson.build b/nntrainer/meson.build
new file mode 100644 (file)
index 0000000..8ff5b92
--- /dev/null
@@ -0,0 +1,61 @@
+nntrainer_inc = include_directories('./include')
+
+# Dependencies
+nntrainer_base_deps=[
+  blas_dep,
+  iniparser_dep,
+  libm_dep,
+  libdl_dep,
+  thread_dep
+]
+
+if build_platform == 'tizen'
+  nntrainer_base_deps += dependency('dlog')
+endif
+
+nntrainer_sources = [
+  'src/neuralnet.cpp',
+  'src/tensor.cpp',
+  'src/layers.cpp',
+  'src/databuffer.cpp'
+]
+
+nntrainer_headers = [
+  'include/neuralnet.h',
+  'include/tensor.h',
+  'include/layers.h',
+  'include/databuffer.h'
+]
+
+
+# Build libraries
+nntrainer_shared = shared_library('nntrainer',
+  nntrainer_sources,
+  dependencies: nntrainer_base_deps,
+  include_directories: nntrainer_inc,
+  install: true,
+  install_dir: nntrainer_libdir
+)
+
+nntrainer_static = static_library('nntrainer',
+  nntrainer_sources,
+  dependencies: nntrainer_base_deps,
+  include_directories: nntrainer_inc,
+  install: true,
+  install_dir: nntrainer_libdir
+)
+
+nntrainer_lib = nntrainer_shared
+if get_option('default_library') == 'static'
+  nntrainer_lib = nntrainer_static
+endif
+
+nntrainer_dep = declare_dependency(link_with: nntrainer_lib,
+  dependencies: nntrainer_base_deps,
+  include_directories: nntrainer_inc
+)
+
+# Install headers
+install_headers(nntrainer_headers,
+  subdir: 'nntrainer'
+)
similarity index 100%
rename from src/layers.cpp
rename to nntrainer/src/layers.cpp
similarity index 100%
rename from src/tensor.cpp
rename to nntrainer/src/tensor.cpp
index 84e26ca..deff5e3 100644 (file)
@@ -1,33 +1,46 @@
 %define         enable_cblas 1
+%define                nntrainerapplicationdir %{_libdir}/nntrainer/bin
 
 Name:          nntrainer
 Summary:       Software framework for traning neural networks
-Version:        0.0.1
-Release:        0
-Packager:       Jijoong Moon <jijoong.moon@sansumg.com>
-License:        Apache-2.0
-Source0:        nntrainer-%{version}.tar.gz
-Source1001:     nntrainer.manifest
-
-BuildRequires:  cmake >= 2.8.3
-BuildRequires:  openblas-devel
-BuildRequires:  iniparser-devel
-Requires:       iniparser
-Requires:       libopenblas
+Version:       0.0.1
+Release:       0
+Packager:      Jijoong Moon <jijoong.moon@sansumg.com>
+License:       Apache-2.0
+Source0:       nntrainer-%{version}.tar.gz
+Source1001:    nntrainer.manifest
+
+BuildRequires: meson >= 0.50.0
+BuildRequires: openblas-devel
+BuildRequires: iniparser-devel
+Requires:      iniparser
+Requires:      libopenblas
 
 %description
 NNtrainer is Software Framework for Training Nerual Network Models on Devices.
 
 %package devel
-Summary:        Development package for custom nntrainer developers
-Requires:       nntrainer = %{version}-%{release}
-Requires:       iniparser-devel
-Requires:       openblas-devel
+Summary:       Development package for custom nntrainer developers
+Requires:      nntrainer = %{version}-%{release}
+Requires:      iniparser-devel
+Requires:      openblas-devel
 
 %description devel
 Development pacage for custom nntrainer developers.
 This contains corresponding header files and .pc pkgconfig file.
 
+%package applications
+Summary:       NNTrainer Examples
+Requires:      nntrainer = %{version}-%{release}
+Requires:      iniparser
+BuildRequires: tensorflow-lite-devel
+BuildRequires: pkgconfig(jsoncpp)
+BuildRequires: pkgconfig(libcurl)
+BuildRequires: pkgconfig(dlog)
+
+%description applications
+NNTraier Exmaples for test purpose.
+
 # Using cblas for Matrix calculation
 %if 0%{?enable_cblas}
 %define enable_cblas -DUSE_BLAS=ON
@@ -40,17 +53,21 @@ cp %{SOURCE1001} .
 %build
 CXXFLAGS=`echo $CXXFLAGS | sed -e "s|-std=gnu++11||"`
 
+# mkdir -p build
+# pushd build
+# cmake .. -DCMAKE_INSTALL_PREFIX=/usr %{enable_cblas} -DTIZEN=ON -DTARGET_ARCH=%{_arch}
+# make %{?jobs:-j%jobs}
+# popd
+
 mkdir -p build
-pushd build
-cmake .. -DCMAKE_INSTALL_PREFIX=/usr %{enable_cblas} -DTIZEN=ON -DTARGET_ARCH=%{_arch}
-make %{?jobs:-j%jobs}
-popd
+meson --buildtype=plain --prefix=%{_prefix} --sysconfdir=%{_sysconfdir} \
+      --libdir=%{_libdir} --bindir=%{nntrainerapplicationdir} --includedir=%{_includedir}\
+      -Dinstall-app=true -Denable-tizen=true build
 
-%install
-pushd build
-%make_install
-popd
+ninja -C build %{?_smp_mflags}
 
+%install
+DESTDIR=%{buildroot} ninja -C build %{?_smp_mflags} install
 
 %files
 %manifest nntrainer.manifest
@@ -63,8 +80,15 @@ popd
 %{_includedir}/nntrainer/layers.h
 %{_includedir}/nntrainer/neuralnet.h
 %{_includedir}/nntrainer/tensor.h
+%{_libdir}/*.a
 %{_libdir}/pkgconfig/nntrainer.pc
 
+%files applications
+%manifest nntrainer.manifest
+%defattr(-,root,root,-)
+%license LICENSE
+%{_libdir}/nntrainer/bin/applications/*
+
 %changelog
 * Wed Mar 18 2020 Jijoong Moon <jijoong.moon@samsung.com>
 - packaged nntrainer