You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by ma...@apache.org on 2018/09/24 14:30:56 UTC

[incubator-mxnet] branch master updated: Enable C++ coverage (#12642)

This is an automated email from the ASF dual-hosted git repository.

marcoabreu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git


The following commit(s) were added to refs/heads/master by this push:
     new ccba621  Enable C++ coverage (#12642)
ccba621 is described below

commit ccba621e244e742774d5b8e78c6341b4a84eb374
Author: Marco de Abreu <ma...@users.noreply.github.com>
AuthorDate: Mon Sep 24 16:30:38 2018 +0200

    Enable C++ coverage (#12642)
    
    * Enable C++ coverage for make
    
    * Enable C++ test coverage for CMake
    
    * Add environment variable GCOV_PREFIX
    
    * Stash GCNO files
    
    * Enable test coverage for Scala
    
    * Fix -P not found error
    
    * Remove debug comments
    
    * Add linking with coverage
    
    * Trigger separate build
    
    * Add ignored files
---
 .codecov.yml                   |  4 ++
 .gitignore                     |  9 ++++-
 CMakeLists.txt                 | 15 ++++++++
 Jenkinsfile                    | 86 +++++++++++++++++++++---------------------
 Makefile                       |  4 ++
 ci/Jenkinsfile_utils.groovy    | 22 +++++++----
 ci/docker/runtime_functions.sh | 47 ++++++++++++++++++-----
 7 files changed, 125 insertions(+), 62 deletions(-)

diff --git a/.codecov.yml b/.codecov.yml
index f9f3e86..97624c2 100644
--- a/.codecov.yml
+++ b/.codecov.yml
@@ -21,6 +21,10 @@ parsers:
       method: no
       macro: no
 
+ignore:
+ - "cpp-package/example/**/*"
+ - "tests/**/*"
+
 # Disable comments for now to gather data in the background
 comment: false
 #  layout: "header, diff"
diff --git a/.gitignore b/.gitignore
index 0da5320..c8a8136 100644
--- a/.gitignore
+++ b/.gitignore
@@ -169,4 +169,11 @@ tests/mxnet_unit_tests
 
 # generated wrappers for ccache
 cc
-cxx
\ No newline at end of file
+cxx
+
+# Code coverage related
+.coverage
+*.gcov
+*.gcno
+coverage.xml
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 18bf046..ddf99e7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,6 +39,7 @@ mxnet_option(INSTALL_EXAMPLES     "Install the example source files." OFF)
 mxnet_option(USE_SIGNAL_HANDLER   "Print stack traces on segfaults." OFF)
 mxnet_option(USE_TENSORRT         "Enable infeference optimization with TensorRT." OFF)
 mxnet_option(USE_ASAN             "Enable Clang/GCC ASAN sanitizers." OFF)
+mxnet_option(ENABLE_TESTCOVERAGE  "Enable compilation with test coverage metric output" OFF)
 
 message(STATUS "CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}")
 if(USE_CUDA AND NOT USE_OLDCMAKECUDA)
@@ -218,6 +219,20 @@ if(USE_TENSORRT)
           ${ONNX_PROTO_LIBRARY} ${ONNX_LIBRARY} ${PROTOBUF_LIBRARY})
 endif()
 
+if(ENABLE_TESTCOVERAGE)
+  message(STATUS "Compiling with test coverage support enabled. This will result in additional files being written to your source directory!")
+  find_program( GCOV_PATH gcov )
+  if(NOT GCOV_PATH)
+    message(FATAL_ERROR "gcov not found! Aborting...")
+  endif() # NOT GCOV_PATH
+  
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
+  set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} --coverage")
+  set(GTEST_LIBRARIES "${GTEST_LIBRARIES} --coverage")
+  link_libraries(gcov)
+endif()
+
 if(USE_MKLDNN)
   include(cmake/MklDnn.cmake)
   # CPU architecture (e.g., C5) can't run on another architecture (e.g., g3).
diff --git a/Jenkinsfile b/Jenkinsfile
index bc033aa..81a25de 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -124,7 +124,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('centos7_cpu', 'build_centos7_cpu', false)
-            utils.pack_lib('centos7_cpu', mx_lib)
+            utils.pack_lib('centos7_cpu', mx_lib, true)
           }
         }
       }
@@ -135,7 +135,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('centos7_cpu', 'build_centos7_mkldnn', false)
-            utils.pack_lib('centos7_mkldnn', mx_lib)
+            utils.pack_lib('centos7_mkldnn', mx_lib, true)
           }
         }
       }
@@ -146,7 +146,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('centos7_gpu', 'build_centos7_gpu', false)
-            utils.pack_lib('centos7_gpu', mx_lib)
+            utils.pack_lib('centos7_gpu', mx_lib, true)
           }
         }
       }
@@ -157,7 +157,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('ubuntu_cpu', 'build_ubuntu_cpu_openblas', false)
-            utils.pack_lib('cpu', mx_dist_lib)
+            utils.pack_lib('cpu', mx_dist_lib, true)
           }
         }
       }
@@ -179,7 +179,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('ubuntu_cpu', 'build_ubuntu_cpu_cmake_debug', false)
-            utils.pack_lib('cpu_debug', mx_cmake_lib_debug)
+            utils.pack_lib('cpu_debug', mx_cmake_lib_debug, true)
           }
         }
       }
@@ -220,7 +220,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('ubuntu_cpu', 'build_ubuntu_cpu_clang39_mkldnn', false)
-            utils.pack_lib('mkldnn_cpu_clang3', mx_mkldnn_lib)
+            utils.pack_lib('mkldnn_cpu_clang3', mx_mkldnn_lib, true)
           }
         }
       }
@@ -231,7 +231,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('ubuntu_cpu', 'build_ubuntu_cpu_clang60_mkldnn', false)
-            utils.pack_lib('mkldnn_cpu_clang6', mx_mkldnn_lib)
+            utils.pack_lib('mkldnn_cpu_clang6', mx_mkldnn_lib, true)
           }
         }
       }
@@ -242,7 +242,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('ubuntu_cpu', 'build_ubuntu_cpu_mkldnn', false)
-            utils.pack_lib('mkldnn_cpu', mx_mkldnn_lib)
+            utils.pack_lib('mkldnn_cpu', mx_mkldnn_lib, true)
           }
         }
       }
@@ -253,7 +253,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('ubuntu_build_cuda', 'build_ubuntu_gpu_mkldnn', false)
-            utils.pack_lib('mkldnn_gpu', mx_mkldnn_lib)
+            utils.pack_lib('mkldnn_gpu', mx_mkldnn_lib, true)
           }
         }
       }
@@ -264,7 +264,7 @@ core_logic: {
            timeout(time: max_time, unit: 'MINUTES') {
              utils.init_git()
              utils.docker_run('ubuntu_build_cuda', 'build_ubuntu_gpu_mkldnn_nocudnn', false)
-             utils.pack_lib('mkldnn_gpu_nocudnn', mx_mkldnn_lib)
+             utils.pack_lib('mkldnn_gpu_nocudnn', mx_mkldnn_lib, true)
            }
          }
        }
@@ -275,7 +275,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('ubuntu_build_cuda', 'build_ubuntu_gpu_cuda91_cudnn7', false)
-            utils.pack_lib('gpu', mx_lib_cpp_examples)
+            utils.pack_lib('gpu', mx_lib_cpp_examples, true)
           }
         }
       }
@@ -307,7 +307,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('ubuntu_gpu', 'build_ubuntu_gpu_cmake_mkldnn', false)
-            utils.pack_lib('cmake_mkldnn_gpu', mx_cmake_mkldnn_lib)
+            utils.pack_lib('cmake_mkldnn_gpu', mx_cmake_mkldnn_lib, true)
           }
         }
       }
@@ -318,7 +318,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('ubuntu_gpu', 'build_ubuntu_gpu_cmake', false)
-            utils.pack_lib('cmake_gpu', mx_cmake_lib)
+            utils.pack_lib('cmake_gpu', mx_cmake_lib, true)
           }
         }
       }
@@ -329,7 +329,7 @@ core_logic: {
           timeout(time: max_time, unit: 'MINUTES') {
             utils.init_git()
             utils.docker_run('ubuntu_gpu_tensorrt', 'build_ubuntu_gpu_tensorrt', false)
-            utils.pack_lib('tensorrt', mx_tensorrt_lib)
+            utils.pack_lib('tensorrt', mx_tensorrt_lib, true)
           }
         }
       }
@@ -442,7 +442,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/ut-python2-cpu') {
           try {
-            utils.unpack_and_init('cpu', mx_lib)
+            utils.unpack_and_init('cpu', mx_lib, true)
             python2_ut('ubuntu_cpu')
             utils.publish_test_coverage()
           } finally {
@@ -457,7 +457,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/ut-python3-cpu') {
           try {
-            utils.unpack_and_init('cpu', mx_lib)
+            utils.unpack_and_init('cpu', mx_lib, true)
             python3_ut('ubuntu_cpu')
             utils.publish_test_coverage()
           } finally {
@@ -479,7 +479,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/ut-python3-cpu-debug') {
           try {
-            utils.unpack_and_init('cpu_debug', mx_cmake_lib_debug)
+            utils.unpack_and_init('cpu_debug', mx_cmake_lib_debug, true)
             python3_ut('ubuntu_cpu')
           } finally {
             utils.collect_test_results_unix('nosetests_unittest.xml', 'nosetests_python3_cpu_debug_unittest.xml')
@@ -492,7 +492,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/ut-python2-gpu') {
           try {
-            utils.unpack_and_init('gpu', mx_lib)
+            utils.unpack_and_init('gpu', mx_lib, true)
             python2_gpu_ut('ubuntu_gpu')
             utils.publish_test_coverage()
           } finally {
@@ -505,7 +505,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/ut-python3-gpu') {
           try {
-            utils.unpack_and_init('gpu', mx_lib)
+            utils.unpack_and_init('gpu', mx_lib, true)
             python3_gpu_ut('ubuntu_gpu')
             utils.publish_test_coverage()
           } finally {
@@ -519,7 +519,7 @@ core_logic: {
         ws('workspace/ut-python2-quantize-gpu') {
           timeout(time: max_time, unit: 'MINUTES') {
             try {
-              utils.unpack_and_init('gpu', mx_lib)
+              utils.unpack_and_init('gpu', mx_lib, true)
               utils.docker_run('ubuntu_gpu', 'unittest_ubuntu_python2_quantization_gpu', true)
               utils.publish_test_coverage()
             } finally {
@@ -534,7 +534,7 @@ core_logic: {
         ws('workspace/ut-python3-quantize-gpu') {
           timeout(time: max_time, unit: 'MINUTES') {
             try {
-              utils.unpack_and_init('gpu', mx_lib)
+              utils.unpack_and_init('gpu', mx_lib, true)
               utils.docker_run('ubuntu_gpu', 'unittest_ubuntu_python3_quantization_gpu', true)
               utils.publish_test_coverage()
             } finally {
@@ -548,7 +548,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/ut-python2-mkldnn-cpu') {
           try {
-            utils.unpack_and_init('mkldnn_cpu', mx_mkldnn_lib)
+            utils.unpack_and_init('mkldnn_cpu', mx_mkldnn_lib, true)
             python2_ut('ubuntu_cpu')
             utils.publish_test_coverage()
           } finally {
@@ -563,7 +563,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/ut-python2-mkldnn-gpu') {
           try {
-            utils.unpack_and_init('mkldnn_gpu', mx_mkldnn_lib)
+            utils.unpack_and_init('mkldnn_gpu', mx_mkldnn_lib, true)
             python2_gpu_ut('ubuntu_gpu')
             utils.publish_test_coverage()
           } finally {
@@ -576,7 +576,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/ut-python3-mkldnn-cpu') {
           try {
-            utils.unpack_and_init('mkldnn_cpu', mx_mkldnn_lib)
+            utils.unpack_and_init('mkldnn_cpu', mx_mkldnn_lib, true)
             python3_ut_mkldnn('ubuntu_cpu')
             utils.publish_test_coverage()
           } finally {
@@ -590,7 +590,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/ut-python3-mkldnn-gpu') {
           try {
-            utils.unpack_and_init('mkldnn_gpu', mx_mkldnn_lib)
+            utils.unpack_and_init('mkldnn_gpu', mx_mkldnn_lib, true)
             python3_gpu_ut('ubuntu_gpu')
             utils.publish_test_coverage()
           } finally {
@@ -603,7 +603,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/ut-python3-mkldnn-gpu-nocudnn') {
           try {
-            utils.unpack_and_init('mkldnn_gpu_nocudnn', mx_mkldnn_lib)
+            utils.unpack_and_init('mkldnn_gpu_nocudnn', mx_mkldnn_lib, true)
             python3_gpu_ut_nocudnn('ubuntu_gpu')
             utils.publish_test_coverage()
           } finally {
@@ -617,7 +617,7 @@ core_logic: {
         ws('workspace/build-centos7-cpu') {
           timeout(time: max_time, unit: 'MINUTES') {
             try {
-              utils.unpack_and_init('centos7_cpu', mx_lib)
+              utils.unpack_and_init('centos7_cpu', mx_lib, true)
               utils.docker_run('centos7_cpu', 'unittest_centos7_cpu', false)
               utils.publish_test_coverage()
             } finally {
@@ -633,7 +633,7 @@ core_logic: {
         ws('workspace/build-centos7-gpu') {
           timeout(time: max_time, unit: 'MINUTES') {
             try {
-              utils.unpack_and_init('centos7_gpu', mx_lib)
+              utils.unpack_and_init('centos7_gpu', mx_lib, true)
               utils.docker_run('centos7_gpu', 'unittest_centos7_gpu', true)
               utils.publish_test_coverage()
             } finally {
@@ -648,7 +648,7 @@ core_logic: {
         ws('workspace/build-tensorrt') {
           timeout(time: max_time, unit: 'MINUTES') {
             try {
-              utils.unpack_and_init('tensorrt', mx_tensorrt_lib)
+              utils.unpack_and_init('tensorrt', mx_tensorrt_lib, true)
               utils.docker_run('ubuntu_gpu_tensorrt', 'unittest_ubuntu_tensorrt_gpu', true)
               utils.publish_test_coverage()
             } finally {
@@ -662,7 +662,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/ut-scala-cpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('cpu', mx_dist_lib)
+            utils.unpack_and_init('cpu', mx_dist_lib, true)
             utils.docker_run('ubuntu_cpu', 'unittest_ubuntu_cpu_scala', false)
             utils.publish_test_coverage()
           }
@@ -673,7 +673,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/ut-clojure-cpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('cpu', mx_dist_lib)
+            utils.unpack_and_init('cpu', mx_dist_lib, true)
             utils.docker_run('ubuntu_cpu', 'unittest_ubuntu_cpu_clojure', false)
             utils.publish_test_coverage()
           }
@@ -684,7 +684,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/ut-perl-cpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('cpu', mx_lib)
+            utils.unpack_and_init('cpu', mx_lib, true)
             utils.docker_run('ubuntu_cpu', 'unittest_ubuntu_cpugpu_perl', false)
             utils.publish_test_coverage()
           }
@@ -695,7 +695,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/ut-perl-gpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('gpu', mx_lib)
+            utils.unpack_and_init('gpu', mx_lib, true)
             utils.docker_run('ubuntu_gpu', 'unittest_ubuntu_cpugpu_perl', true)
             utils.publish_test_coverage()
           }
@@ -706,7 +706,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/ut-cpp-gpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('cmake_gpu', mx_cmake_lib)
+            utils.unpack_and_init('cmake_gpu', mx_cmake_lib, true)
             utils.docker_run('ubuntu_gpu', 'unittest_ubuntu_gpu_cpp', true)
             utils.publish_test_coverage()
           }
@@ -717,7 +717,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/ut-cpp-mkldnn-gpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('cmake_mkldnn_gpu', mx_cmake_mkldnn_lib)
+            utils.unpack_and_init('cmake_mkldnn_gpu', mx_cmake_mkldnn_lib, true)
             utils.docker_run('ubuntu_gpu', 'unittest_ubuntu_gpu_cpp', true)
             utils.publish_test_coverage()
           }
@@ -728,7 +728,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/ut-r-cpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('cpu', mx_lib)
+            utils.unpack_and_init('cpu', mx_lib, true)
             utils.docker_run('ubuntu_cpu', 'unittest_ubuntu_cpu_R', false)
             utils.publish_test_coverage()
           }
@@ -739,7 +739,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/ut-r-gpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('gpu', mx_lib)
+            utils.unpack_and_init('gpu', mx_lib, true)
             utils.docker_run('ubuntu_gpu', 'unittest_ubuntu_gpu_R', true)
             utils.publish_test_coverage()
           }
@@ -829,7 +829,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/it-onnx-cpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('cpu', mx_lib)
+            utils.unpack_and_init('cpu', mx_lib, true)
             utils.docker_run('ubuntu_cpu', 'integrationtest_ubuntu_cpu_onnx', false)
             utils.publish_test_coverage()
           }
@@ -840,7 +840,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/it-python-gpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('gpu', mx_lib)
+            utils.unpack_and_init('gpu', mx_lib, true)
             utils.docker_run('ubuntu_gpu', 'integrationtest_ubuntu_gpu_python', true)
             utils.publish_test_coverage()
           }
@@ -851,7 +851,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/it-cpp-package') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('gpu', mx_lib_cpp_examples)
+            utils.unpack_and_init('gpu', mx_lib_cpp_examples, true)
             utils.docker_run('ubuntu_gpu', 'integrationtest_ubuntu_gpu_cpp_package', true)
             utils.publish_test_coverage()
           }
@@ -875,7 +875,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/it-dist-kvstore') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('gpu', mx_lib)
+            utils.unpack_and_init('gpu', mx_lib, true)
             utils.docker_run('ubuntu_gpu', 'integrationtest_ubuntu_gpu_dist_kvstore', true)
             utils.publish_test_coverage()
           }
@@ -890,7 +890,7 @@ core_logic: {
       node(NODE_LINUX_CPU) {
         ws('workspace/it-dist-kvstore') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('cpu', mx_lib)
+            utils.unpack_and_init('cpu', mx_lib, true)
             utils.docker_run('ubuntu_cpu', 'integrationtest_ubuntu_cpu_dist_kvstore', false)
             utils.publish_test_coverage()
           }
@@ -901,7 +901,7 @@ core_logic: {
       node(NODE_LINUX_GPU) {
         ws('workspace/ut-scala-gpu') {
           timeout(time: max_time, unit: 'MINUTES') {
-            utils.unpack_and_init('gpu', mx_dist_lib)
+            utils.unpack_and_init('gpu', mx_dist_lib, true)
             utils.docker_run('ubuntu_gpu', 'integrationtest_ubuntu_gpu_scala', true)
             utils.publish_test_coverage()
           }
diff --git a/Makefile b/Makefile
index 941ac8e..69b25da 100644
--- a/Makefile
+++ b/Makefile
@@ -92,6 +92,10 @@ endif
 CFLAGS += -I$(TPARTYDIR)/mshadow/ -I$(TPARTYDIR)/dmlc-core/include -fPIC -I$(NNVM_PATH)/include -I$(DLPACK_PATH)/include -I$(TPARTYDIR)/tvm/include -Iinclude $(MSHADOW_CFLAGS)
 LDFLAGS = -pthread $(MSHADOW_LDFLAGS) $(DMLC_LDFLAGS)
 
+ifeq ($(ENABLE_TESTCOVERAGE), 1)
+        CFLAGS += --coverage
+        LDFLAGS += --coverage
+endif
 
 ifeq ($(USE_TENSORRT), 1)
 	CFLAGS +=  -I$(ROOTDIR) -I$(TPARTYDIR) -DONNX_NAMESPACE=$(ONNX_NAMESPACE) -DMXNET_USE_TENSORRT=1
diff --git a/ci/Jenkinsfile_utils.groovy b/ci/Jenkinsfile_utils.groovy
index 818eb62..e2b0855 100644
--- a/ci/Jenkinsfile_utils.groovy
+++ b/ci/Jenkinsfile_utils.groovy
@@ -57,22 +57,32 @@ def init_git_win() {
 }
 
 // pack libraries for later use
-def pack_lib(name, libs) {
+def pack_lib(name, libs, include_gcov_data = false) {
   sh """
 echo "Packing ${libs} into ${name}"
 echo ${libs} | sed -e 's/,/ /g' | xargs md5sum
 """
   stash includes: libs, name: name
+
+  if (include_gcov_data) {
+    // Store GCNO files that are required for GCOV to operate during runtime
+    sh "find . -name '*.gcno'"
+    stash name: "${name}_gcov_data", includes: "**/*.gcno"
+  }
 }
 
 // unpack libraries saved before
-def unpack_and_init(name, libs) {
+def unpack_and_init(name, libs, include_gcov_data = false) {
   init_git()
   unstash name
   sh """
 echo "Unpacked ${libs} from ${name}"
 echo ${libs} | sed -e 's/,/ /g' | xargs md5sum
 """
+  if (include_gcov_data) {
+    // Restore GCNO files that are required for GCOV to operate during runtime
+    unstash "${name}_gcov_data"
+  }
 }
 
 def publish_test_coverage() {
@@ -86,16 +96,12 @@ def publish_test_coverage() {
         GIT_COMMIT_HASH = sh (script: "git rev-parse @", returnStdout: true)
     }
    
-    def codecovArgs = ""
     if (env.CHANGE_ID) {
       // PR execution
-      codecovArgs += "-B ${env.CHANGE_TARGET} " +
-        "-C ${GIT_COMMIT_HASH} " +
-        "-P ${env.CHANGE_ID} "
+      codecovArgs = "-B ${env.CHANGE_TARGET} -C ${GIT_COMMIT_HASH} -P ${env.CHANGE_ID}"
     } else {
       // Branch execution
-      codecovArgs += "-B ${env.BRANCH_NAME} " +
-        "-C ${GIT_COMMIT_HASH} "
+      codecovArgs = "-B ${env.BRANCH_NAME} -C ${GIT_COMMIT_HASH}"
     }
 
     // To make sure we never fail because test coverage reporting is not available
diff --git a/ci/docker/runtime_functions.sh b/ci/docker/runtime_functions.sh
index f5241d5..d1fc223 100755
--- a/ci/docker/runtime_functions.sh
+++ b/ci/docker/runtime_functions.sh
@@ -245,6 +245,7 @@ build_centos7_cpu() {
     make \
         DEV=1 \
         USE_LAPACK=1 \
+        ENABLE_TESTCOVERAGE=1 \
         USE_LAPACK_PATH=/usr/lib64/liblapack.so \
         USE_BLAS=openblas \
         USE_DIST_KVSTORE=1 \
@@ -256,6 +257,7 @@ build_amzn_linux_cpu() {
     cmake \
         -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
         -DCMAKE_C_COMPILER_LAUNCHER=ccache \
+        -DENABLE_TESTCOVERAGE=ON \
         -DUSE_CUDA=OFF\
         -DUSE_OPENCV=ON\
         -DUSE_OPENMP=ON\
@@ -277,6 +279,7 @@ build_centos7_mkldnn() {
 
     make \
         DEV=1 \
+        ENABLE_TESTCOVERAGE=1 \
         USE_LAPACK=1 \
         USE_LAPACK_PATH=/usr/lib64/liblapack.so \
         USE_MKLDNN=1 \
@@ -291,6 +294,7 @@ build_centos7_gpu() {
     # build_ccache_wrappers
     make \
         DEV=1 \
+        ENABLE_TESTCOVERAGE=1 \
         USE_LAPACK=1 \
         USE_LAPACK_PATH=/usr/lib64/liblapack.so \
         USE_BLAS=openblas \
@@ -311,6 +315,7 @@ build_ubuntu_cpu_openblas() {
     export CXX="ccache g++"
     make \
         DEV=1                         \
+        ENABLE_TESTCOVERAGE=1         \
         USE_CPP_PACKAGE=1             \
         USE_BLAS=openblas             \
         USE_DIST_KVSTORE=1            \
@@ -324,6 +329,7 @@ build_ubuntu_cpu_cmake_debug() {
     cmake \
         -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
         -DCMAKE_C_COMPILER_LAUNCHER=ccache \
+        -DENABLE_TESTCOVERAGE=ON \
         -DUSE_CUDA=OFF \
         -DUSE_MKL_IF_AVAILABLE=OFF \
         -DUSE_OPENMP=OFF \
@@ -371,6 +377,7 @@ build_ubuntu_cpu_clang39() {
     export CC=clang-3.9
      build_ccache_wrappers
      make \
+        ENABLE_TESTCOVERAGE=1         \
         USE_CPP_PACKAGE=1             \
         USE_BLAS=openblas             \
         USE_OPENMP=0                  \
@@ -387,6 +394,7 @@ build_ubuntu_cpu_clang60() {
     build_ccache_wrappers
 
     make  \
+        ENABLE_TESTCOVERAGE=1         \
         USE_CPP_PACKAGE=1             \
         USE_BLAS=openblas             \
         USE_OPENMP=1                  \
@@ -429,6 +437,7 @@ build_ubuntu_cpu_clang39_mkldnn() {
     build_ccache_wrappers
 
     make \
+        ENABLE_TESTCOVERAGE=1         \
         USE_CPP_PACKAGE=1             \
         USE_BLAS=openblas             \
         USE_MKLDNN=1                  \
@@ -445,6 +454,7 @@ build_ubuntu_cpu_clang60_mkldnn() {
     build_ccache_wrappers
 
     make \
+        ENABLE_TESTCOVERAGE=1         \
         USE_CPP_PACKAGE=1             \
         USE_BLAS=openblas             \
         USE_MKLDNN=1                  \
@@ -459,6 +469,7 @@ build_ubuntu_cpu_mkldnn() {
 
     make  \
         DEV=1                         \
+        ENABLE_TESTCOVERAGE=1         \
         USE_CPP_PACKAGE=1             \
         USE_BLAS=openblas             \
         USE_MKLDNN=1                  \
@@ -510,6 +521,7 @@ build_ubuntu_gpu_tensorrt() {
     rm -rf build
     make \
         DEV=1                                               \
+        ENABLE_TESTCOVERAGE=1                               \
         USE_BLAS=openblas                                   \
         USE_CUDA=1                                          \
         USE_CUDA_PATH=/usr/local/cuda                       \
@@ -531,6 +543,7 @@ build_ubuntu_gpu_mkldnn() {
 
     make  \
         DEV=1                         \
+        ENABLE_TESTCOVERAGE=1         \
         USE_CPP_PACKAGE=1             \
         USE_BLAS=openblas             \
         USE_MKLDNN=1                  \
@@ -547,6 +560,7 @@ build_ubuntu_gpu_mkldnn_nocudnn() {
 
     make  \
         DEV=1                         \
+        ENABLE_TESTCOVERAGE=1         \
         USE_BLAS=openblas             \
         USE_MKLDNN=1                  \
         USE_CUDA=1                    \
@@ -561,6 +575,7 @@ build_ubuntu_gpu_cuda91_cudnn7() {
     # build_ccache_wrappers
     make \
         DEV=1                         \
+        ENABLE_TESTCOVERAGE=1         \
         USE_BLAS=openblas             \
         USE_CUDA=1                    \
         USE_CUDA_PATH=/usr/local/cuda \
@@ -574,14 +589,19 @@ build_ubuntu_amalgamation() {
     set -ex
     # Amalgamation can not be run with -j nproc
     make -C amalgamation/ clean
-    make -C amalgamation/ USE_BLAS=openblas
+    make -C amalgamation/     \
+        USE_BLAS=openblas     \
+        ENABLE_TESTCOVERAGE=1
 }
 
 build_ubuntu_amalgamation_min() {
     set -ex
     # Amalgamation can not be run with -j nproc
     make -C amalgamation/ clean
-    make -C amalgamation/ USE_BLAS=openblas MIN=1
+    make -C amalgamation/     \
+        USE_BLAS=openblas     \
+        MIN=1                 \
+        ENABLE_TESTCOVERAGE=1
 }
 
 build_ubuntu_gpu_cmake_mkldnn() {
@@ -590,6 +610,7 @@ build_ubuntu_gpu_cmake_mkldnn() {
     cmake \
         -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
         -DCMAKE_C_COMPILER_LAUNCHER=ccache \
+        -DENABLE_TESTCOVERAGE=ON   \
         -DUSE_CUDA=1               \
         -DUSE_CUDNN=1              \
         -DUSE_MKLML_MKL=1          \
@@ -610,6 +631,7 @@ build_ubuntu_gpu_cmake() {
     cmake \
         -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
         -DCMAKE_C_COMPILER_LAUNCHER=ccache \
+        -DENABLE_TESTCOVERAGE=ON   \
         -DUSE_CUDA=1               \
         -DUSE_CUDNN=1              \
         -DUSE_MKLML_MKL=0          \
@@ -744,14 +766,14 @@ unittest_ubuntu_python3_quantization_gpu() {
 
 unittest_ubuntu_cpu_scala() {
     set -ex
-    make scalapkg USE_BLAS=openblas USE_DIST_KVSTORE=1
-    make scalaunittest USE_BLAS=openblas USE_DIST_KVSTORE=1
+    make scalapkg USE_BLAS=openblas USE_DIST_KVSTORE=1 ENABLE_TESTCOVERAGE=1
+    make scalaunittest USE_BLAS=openblas USE_DIST_KVSTORE=1 ENABLE_TESTCOVERAGE=1
 }
 
 unittest_ubuntu_cpu_clojure() {
     set -ex
-    make scalapkg USE_OPENCV=1 USE_BLAS=openblas USE_DIST_KVSTORE=1
-    make scalainstall USE_OPENCV=1 USE_BLAS=openblas USE_DIST_KVSTORE=1
+    make scalapkg USE_OPENCV=1 USE_BLAS=openblas USE_DIST_KVSTORE=1 ENABLE_TESTCOVERAGE=1
+    make scalainstall USE_OPENCV=1 USE_BLAS=openblas USE_DIST_KVSTORE=1 ENABLE_TESTCOVERAGE=1
     ./contrib/clojure-package/ci-test.sh
 }
 
@@ -772,7 +794,10 @@ unittest_ubuntu_cpu_R() {
     mkdir -p ~/.R/
     echo  "MAKEFLAGS = -j"$(nproc) > ~/.R/Makevars
     # make -j not supported
-    make rpkg USE_BLAS=openblas R_LIBS=/tmp/r-site-library
+    make rpkg                           \
+        USE_BLAS=openblas               \
+        R_LIBS=/tmp/r-site-library
+
     R CMD INSTALL --library=/tmp/r-site-library R-package
     make rpkgtest R_LIBS=/tmp/r-site-library
 }
@@ -784,7 +809,9 @@ unittest_ubuntu_gpu_R() {
     mkdir -p ~/.R/
     echo  "MAKEFLAGS = -j"$(nproc) > ~/.R/Makevars
     # make -j not supported
-    make rpkg USE_BLAS=openblas R_LIBS=/tmp/r-site-library
+    make rpkg                           \
+        USE_BLAS=openblas               \
+        R_LIBS=/tmp/r-site-library
     R CMD INSTALL --library=/tmp/r-site-library R-package
     make rpkgtest R_LIBS=/tmp/r-site-library R_GPU_ENABLE=1
 }
@@ -861,8 +888,8 @@ integrationtest_ubuntu_cpu_dist_kvstore() {
 
 integrationtest_ubuntu_gpu_scala() {
     set -ex
-    make scalapkg USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1 USE_DIST_KVSTORE=1 SCALA_ON_GPU=1
-    make scalaintegrationtest USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1 SCALA_TEST_ON_GPU=1 USE_DIST_KVSTORE=1
+    make scalapkg USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1 USE_DIST_KVSTORE=1 SCALA_ON_GPU=1 ENABLE_TESTCOVERAGE=1
+    make scalaintegrationtest USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1 SCALA_TEST_ON_GPU=1 USE_DIST_KVSTORE=1 ENABLE_TESTCOVERAGE=1
 }
 
 integrationtest_ubuntu_gpu_dist_kvstore() {