[enco] Introduce build test (#1221)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Wed, 29 Aug 2018 02:02:50 +0000 (11:02 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Wed, 29 Aug 2018 02:02:50 +0000 (11:02 +0900)
The current enco test framework supports only inference test based on
nnkit, and thus cannot be used in the middle of development.

This commit allows us to test whether enco generates a valid source code.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/enco/test/caffe/000/BUILD [new file with mode: 0644]
contrib/enco/test/caffe/000/INFERENCE [new file with mode: 0644]
contrib/enco/test/caffe/CMakeLists.txt

diff --git a/contrib/enco/test/caffe/000/BUILD b/contrib/enco/test/caffe/000/BUILD
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/contrib/enco/test/caffe/000/INFERENCE b/contrib/enco/test/caffe/000/INFERENCE
new file mode 100644 (file)
index 0000000..e69de29
index 3c3e14e..6b22b0f 100644 (file)
@@ -1,3 +1,18 @@
+###
+### Common function(s)
+###
+function(get_test_configuration PREFIX)
+  set(PROTOTXT_FILE "${PREFIX}.prototxt" PARENT_SCOPE)
+  set(PROTOTXT_TARGET enco_caffe_test_${PREFIX}_prototxt PARENT_SCOPE)
+  set(CAFFEMODEL_FILE "${PREFIX}.caffemodel" PARENT_SCOPE)
+  set(CAFFEMODEL_TARGET enco_caffe_test_${PREFIX}_caffemodel PARENT_SCOPE)
+  set(SOURCE_FILE ${PREFIX}.cpp PARENT_SCOPE)
+  set(SOURCE_TARGET enco_caffe_test_${PREFIX}_generated PARENT_SCOPE)
+endfunction(get_test_configuration)
+
+###
+### Prepare test(s)
+###
 if(NOT TARGET caffegen)
   return()
 endif(NOT TARGET caffegen)
@@ -6,36 +21,19 @@ if(NOT TARGET enco_caffe_frontend)
   return()
 endif(NOT TARGET enco_caffe_frontend)
 
-if(NOT TARGET ann_ref_static)
-  return()
-endif(NOT TARGET ann_ref_static)
-
-find_program(H5DIFF h5diff)
-
-if (NOT H5DIFF)
-  return()
-endif(NOT H5DIFF)
-
-message(STATUS "Enable enco(caffe) test")
-
-file(GLOB MODELS
-     RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
-     "*/test.prototxt")
+file(GLOB MODELS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/test.prototxt")
 
 foreach(MODEL IN ITEMS ${MODELS})
   get_filename_component(PREFIX ${MODEL} DIRECTORY)
+  get_test_configuration(${PREFIX})
 
   set(MODEL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${MODEL})
 
-  set(PROTOTXT_FILE ${PREFIX}.prototxt)
-  set(CAFFEMODEL_FILE ${PREFIX}.caffemodel)
-  set(CAFFEMODEL_TARGET enco_caffe_test_${PREFIX}_caffemodel)
-  set(SOURCE_FILE ${PREFIX}.cpp)
-  set(SOURCE_TARGET enco_caffe_test_${PREFIX}_generated)
-  set(BINDER_TARGET enco_caffe_test_${PREFIX}_binder)
-
   # Copy prototxt
-  file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PROTOTXT_FILE} INPUT ${MODEL_FILE})
+  add_custom_target(${PROTOTXT_TARGET}
+                    ALL ${CMAKE_COMMAND} -E copy "${MODEL_FILE}"
+                                                 "${CMAKE_CURRENT_BINARY_DIR}/${PROTOTXT_FILE}"
+                    COMMENT "Generating ${PROTOTXT_FILE}")
 
   # Generate caffemodel
   add_custom_target(${CAFFEMODEL_TARGET}
@@ -43,7 +41,8 @@ foreach(MODEL IN ITEMS ${MODELS})
                         | $<TARGET_FILE:caffegen> init
                         | $<TARGET_FILE:caffegen> encode
                         > ${CAFFEMODEL_FILE}
-                    DEPENDS caffegen)
+                    DEPENDS caffegen ${PROTOTXT_TARGET}
+                    COMMENT "Generating ${CAFFEMODEL_FILE}")
 
   # Generate C++ code
   add_custom_target(${SOURCE_TARGET}
@@ -52,9 +51,55 @@ foreach(MODEL IN ITEMS ${MODELS})
                           --frontend-arg ${PROTOTXT_FILE}
                           --frontend-arg ${CAFFEMODEL_FILE}
                         > ${SOURCE_FILE}
-                    DEPENDS enco-cli enco_caffe_frontend)
+                    DEPENDS enco-cli enco_caffe_frontend ${CAFFEMODEL_TARGET}
+                    COMMENT "Generating ${SOURCE_FILE}")
   set_source_files_properties(${SOURCE_FILE} PROPERTIES GENERATED TRUE)
 
+  list(APPEND CANDIDATES ${PREFIX})
+endforeach(MODEL)
+
+###
+### Build test
+###
+message(STATUS "Enable enco(caffe) build test")
+
+foreach(PREFIX IN ITEMS ${CANDIDATES})
+  if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PREFIX}/BUILD")
+    continue()
+  endif()
+
+  get_test_configuration(${PREFIX})
+
+  # Compile shared library (from generated C++ code)
+  set(LIBRARY_TARGET enco_caffe_test_${PREFIX}_lib)
+
+  add_library(${LIBRARY_TARGET} SHARED ${SOURCE_FILE})
+  target_link_libraries(${LIBRARY_TARGET} ann_api)
+  add_dependencies(${LIBRARY_TARGET} ${SOURCE_TARGET})
+endforeach(PREFIX)
+
+###
+### Inference test
+###
+if(NOT TARGET ann_ref_static)
+  return()
+endif(NOT TARGET ann_ref_static)
+
+find_program(H5DIFF h5diff)
+
+if (NOT H5DIFF)
+  return()
+endif(NOT H5DIFF)
+
+message(STATUS "Enable enco(caffe) inference test")
+
+foreach(PREFIX IN ITEMS ${CANDIDATES})
+  if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PREFIX}/INFERENCE")
+    continue()
+  endif()
+
+  set(BINDER_TARGET enco_caffe_test_${PREFIX}_binder)
+
   # Compile nnkit binder (from generated C++ code)
   add_library(${BINDER_TARGET} SHARED binder.cpp ${SOURCE_FILE})
   target_link_libraries(${BINDER_TARGET} nnkit_intf_backend)
@@ -64,7 +109,7 @@ foreach(MODEL IN ITEMS ${MODELS})
   add_dependencies(${BINDER_TARGET} ${SOURCE_TARGET})
 
   list(APPEND TESTS ${PREFIX})
-endforeach(MODEL)
+endforeach(PREFIX)
 
 # Run tests
 add_test(NAME enco_test_caffe