Added apiValidator post-build checks for WCOS compliance (#2657)
authorIlya Lavrenov <ilya.lavrenov@intel.com>
Fri, 16 Oct 2020 07:58:38 +0000 (10:58 +0300)
committerGitHub <noreply@github.com>
Fri, 16 Oct 2020 07:58:38 +0000 (10:58 +0300)
* Added apiValidator post-build checks for WCOS compiance

* WA for cmake

* Additional checks for old WDK version

17 files changed:
cmake/api_validator.cmake [new file with mode: 0644]
cmake/developer_package.cmake
cmake/uwp.toolchain.cmake
inference-engine/src/CMakeLists.txt
inference-engine/src/gna_plugin/CMakeLists.txt
inference-engine/src/hetero_plugin/CMakeLists.txt
inference-engine/src/inference_engine/CMakeLists.txt
inference-engine/src/legacy_api/CMakeLists.txt
inference-engine/src/low_precision_transformations/CMakeLists.txt
inference-engine/src/mkldnn_plugin/CMakeLists.txt
inference-engine/src/multi_device/CMakeLists.txt
inference-engine/src/preprocessing/CMakeLists.txt
inference-engine/src/readers/ir_reader/CMakeLists.txt
inference-engine/src/readers/ir_reader_v7/CMakeLists.txt
inference-engine/src/readers/onnx_reader/CMakeLists.txt
inference-engine/src/transformations/CMakeLists.txt
ngraph/core/CMakeLists.txt

diff --git a/cmake/api_validator.cmake b/cmake/api_validator.cmake
new file mode 100644 (file)
index 0000000..b465ad1
--- /dev/null
@@ -0,0 +1,117 @@
+# Copyright (C) 2020 Intel Corporation
+# SPDX-License-Identifier: Apache-2.0
+#
+
+if(WIN32)
+    set(PROGRAMFILES_ENV "ProgramFiles(X86)")
+    file(TO_CMAKE_PATH $ENV{${PROGRAMFILES_ENV}} PROGRAMFILES)
+    set(UWP_SDK_PATH "${PROGRAMFILES}/Windows Kits/10/bin/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x64")
+
+    message(STATUS "Trying to find apivalidator in: ${UWP_SDK_PATH}")
+    find_host_program(UWP_API_VALIDATOR
+                      NAMES apivalidator
+                      PATHS "${UWP_SDK_PATH}"
+                      DOC "ApiValidator for UWP compliance")
+
+    if(UWP_API_VALIDATOR)
+        message(STATUS "Found apivalidator: ${UWP_API_VALIDATOR}")
+    endif()
+endif()
+
+function(_ie_add_api_validator_post_build_step_recursive)
+    cmake_parse_arguments(API_VALIDATOR "" "TARGET" "" ${ARGN})
+
+    list(APPEND API_VALIDATOR_TARGETS ${API_VALIDATOR_TARGET})
+    set(API_VALIDATOR_TARGETS ${API_VALIDATOR_TARGETS} PARENT_SCOPE)
+
+    get_target_property(IS_IMPORTED ${API_VALIDATOR_TARGET} IMPORTED)
+    if(IS_IMPORTED)
+        return()
+    endif()
+
+    get_target_property(LIBRARY_TYPE ${API_VALIDATOR_TARGET} TYPE)
+    if(LIBRARY_TYPE STREQUAL "EXECUTABLE" OR LIBRARY_TYPE STREQUAL "SHARED_LIBRARY")
+        get_target_property(LINKED_LIBRARIES ${API_VALIDATOR_TARGET} LINK_LIBRARIES)
+        if(LINKED_LIBRARIES)
+            foreach(ITEM IN LISTS LINKED_LIBRARIES)
+                if(NOT TARGET ${ITEM})
+                    continue()
+                endif()
+                get_target_property(LIBRARY_TYPE_DEPENDENCY ${ITEM} TYPE)
+                if(LIBRARY_TYPE_DEPENDENCY STREQUAL "SHARED_LIBRARY")
+                    _ie_add_api_validator_post_build_step_recursive(TARGET ${ITEM})
+                endif()
+            endforeach()
+        endif()
+    endif()
+
+    set(API_VALIDATOR_TARGETS ${API_VALIDATOR_TARGETS} PARENT_SCOPE)
+endfunction()
+
+set(VALIDATED_LIBRARIES "" CACHE INTERNAL "")
+
+function(_ie_add_api_validator_post_build_step)
+    set(UWP_API_VALIDATOR_APIS "${PROGRAMFILES}/Windows Kits/10/build/universalDDIs/x64/UniversalDDIs.xml")
+    set(UWP_API_VALIDATOR_EXCLUSION "${UWP_SDK_PATH}/BinaryExclusionlist.xml")
+
+    if(NOT UWP_API_VALIDATOR OR (WINDOWS_STORE OR WINDOWS_PHONE) OR
+       NOT EXISTS UWP_API_VALIDATOR_APIS OR NOT EXISTS UWP_API_VALIDATOR_EXCLUSION)
+        return()
+    endif()
+
+    cmake_parse_arguments(API_VALIDATOR "" "TARGET" "" ${ARGN})
+
+    if(NOT API_VALIDATOR_TARGET)
+        message(FATAL_ERROR "RunApiValidator requires TARGET to validate!")
+    endif()
+
+    if(NOT TARGET ${API_VALIDATOR_TARGET})
+        message(FATAL_ERROR "${API_VALIDATOR_TARGET} is not a TARGET in the project tree.")
+    endif()
+
+    # collect targets
+
+    _ie_add_api_validator_post_build_step_recursive(TARGET ${API_VALIDATOR_TARGET})
+
+    # remove targets which were tested before
+
+    foreach(item IN LISTS VALIDATED_LIBRARIES)
+        list(REMOVE_ITEM API_VALIDATOR_TARGETS ${item})
+    endforeach()
+
+    list(REMOVE_DUPLICATES API_VALIDATOR_TARGETS)
+
+    if(NOT API_VALIDATOR_TARGETS)
+        return()
+    endif()
+
+    # generate rules
+
+    foreach(target IN LISTS API_VALIDATOR_TARGETS)
+        list(APPEND commands
+                COMMAND "${UWP_API_VALIDATOR}"
+                -SupportedApiXmlFiles:${UWP_API_VALIDATOR_APIS}
+                -BinaryExclusionListXmlFile:${UWP_API_VALIDATOR_EXCLUSION}
+                -StrictCompliance:TRUE
+                -DriverPackagePath:$<TARGET_FILE:${target}>)
+    endforeach()
+
+    # apply rules
+
+    add_custom_command(TARGET ${API_VALIDATOR_TARGET} POST_BUILD
+        ${commands}
+        COMMENT "[apiValidator] Check ${API_VALIDATOR_TARGET} and its dependencies for WCOS compatibility"
+    VERBATIM)
+
+    # update list of validated libraries
+
+    list(APPEND VALIDATED_LIBRARIES ${API_VALIDATOR_TARGETS})
+    set(VALIDATED_LIBRARIES "${VALIDATED_LIBRARIES}" CACHE INTERNAL "" FORCE)
+endfunction()
+
+#
+# ie_add_api_validator_post_build_step(TARGET <name>)
+#
+macro(ie_add_api_validator_post_build_step)
+    _ie_add_api_validator_post_build_step(${ARGV})
+endmacro()
index 8a21786..03e8e11 100644 (file)
@@ -237,6 +237,7 @@ include(os_flags)
 include(sanitizer)
 include(cross_compiled_func)
 include(faster_build)
+include(api_validator)
 
 function(set_ci_build_number)
     set(OpenVINO_MAIN_SOURCE_DIR "${CMAKE_SOURCE_DIR}")
index 3c11d03..26f9b61 100644 (file)
@@ -4,11 +4,11 @@
 
 set(CMAKE_SYSTEM_NAME WindowsStore)
 
-if (NOT DEFINED CMAKE_SYSTEM_VERSION)
+if(NOT DEFINED CMAKE_SYSTEM_VERSION)
     set(CMAKE_SYSTEM_VERSION 10.0)
 endif()
 
-if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
+if(NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
     set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR})
 endif()
 
index e6f8277..65cbcf6 100644 (file)
@@ -20,7 +20,7 @@ if(ENABLE_VPU)
   add_subdirectory(vpu)
 endif()
 
-if (ENABLE_GNA)
+if(ENABLE_GNA)
     add_subdirectory(gna_plugin)
 endif()
 
index ae0cbbd..36fe16a 100644 (file)
@@ -14,29 +14,40 @@ addVersionDefines(gna_plugin_entry_points.cpp CI_BUILD_NUMBER)
 
 find_package(libGNA)
 
-ie_add_plugin(NAME ${TARGET_NAME}
-              DEVICE_NAME "GNA"
-              SOURCES ${SOURCES} ${HEADERS})
-
 if(GNA_LIBRARY_VERSION STREQUAL "GNA2")
-    SET(GNA_LIBRARY_VERSION_NUMBER 2)
+    set(GNA_LIBRARY_VERSION_NUMBER 2)
 else()
-    SET(GNA_LIBRARY_VERSION_NUMBER 1)
+    set(GNA_LIBRARY_VERSION_NUMBER 1)
 endif()
 
-#saving rpath to GNA shared library be used by CI
+#
+# Shared plugin library
+# 
+
+ie_add_plugin(NAME ${TARGET_NAME}
+              DEVICE_NAME "GNA"
+              SOURCES ${SOURCES} ${HEADERS})
+
+# saving rpath to GNA shared library be used by CI
 log_rpath_from_dir(GNA ${libGNA_LIBRARIES_BASE_PATH})
 
 target_link_libraries(${TARGET_NAME} PRIVATE inference_engine Threads::Threads libGNA)
 target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+
 target_compile_definitions(${TARGET_NAME}
     PRIVATE
         _NO_MKL_
     PUBLIC
         GNA_LIB_VER=${GNA_LIBRARY_VERSION_NUMBER})
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
+#
+# Static version for tests
+#
 
 add_library(${TARGET_NAME}_test_static STATIC ${SOURCES} ${HEADERS})
+
 target_compile_definitions(${TARGET_NAME}_test_static
         PRIVATE
             _NO_MKL_
@@ -45,6 +56,7 @@ target_compile_definitions(${TARGET_NAME}_test_static
             GNA_LIB_VER=${GNA_LIBRARY_VERSION_NUMBER}
             INTEGER_LOW_P
             USE_STATIC_IE)
+
 target_link_libraries(${TARGET_NAME}_test_static PUBLIC inference_engine_preproc_s inference_engine_lp_transformations libGNA::API)
 target_include_directories(${TARGET_NAME}_test_static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
 set_target_properties(${TARGET_NAME}_test_static PROPERTIES COMPILE_PDB_NAME ${TARGET_NAME}_test_static)
index 3777a0e..7894e95 100644 (file)
@@ -18,4 +18,6 @@ ie_faster_build(${TARGET_NAME}
 
 target_link_libraries(${TARGET_NAME} PRIVATE inference_engine ade pugixml ${NGRAPH_LIBRARIES} inference_engine_transformations)
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
 set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})
index ae0e2b0..0ba769e 100644 (file)
@@ -187,6 +187,8 @@ target_compile_definitions(${TARGET_NAME} PRIVATE IMPLEMENT_INFERENCE_ENGINE_API
 ie_register_plugins(MAIN_TARGET ${TARGET_NAME}
                     POSSIBLE_PLUGINS MultiDevicePlugin HeteroPlugin clDNNPlugin GNAPlugin MKLDNNPlugin myriadPlugin)
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
 # Static library used for unit tests which are always built
 
 add_library(${TARGET_NAME}_s STATIC
index 6ae6289..a7fb772 100644 (file)
@@ -54,6 +54,8 @@ target_link_libraries(${TARGET_NAME} PRIVATE ${CMAKE_DL_LIBS} ${NGRAPH_LIBRARIES
 
 add_cpplint_target(${TARGET_NAME}_cpplint FOR_TARGETS ${TARGET_NAME})
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
 # LTO
 
 set_target_properties(${TARGET_NAME} ${TARGET_NAME}_obj
index fac1666..adb0ea2 100644 (file)
@@ -35,6 +35,8 @@ target_include_directories(${TARGET_NAME} PUBLIC ${PUBLIC_HEADERS_DIR}
 
 add_cpplint_target(${TARGET_NAME}_cpplint FOR_TARGETS ${TARGET_NAME})
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
 # LTO
 
 set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})
index 5f19256..4e87370 100644 (file)
@@ -187,6 +187,8 @@ cross_compiled_file(${TARGET_NAME}
         NAMESPACE   InferenceEngine::Extensions::Cpu::XARCH
 )
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
 #  add test object library
 
 add_library(${TARGET_NAME}_obj OBJECT ${SOURCES} ${HEADERS})
index 65fc808..92a0a71 100644 (file)
@@ -16,4 +16,6 @@ target_link_libraries(${TARGET_NAME} PRIVATE inference_engine)
 
 set_ie_threading_interface_for(${TARGET_NAME})
 
-set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})
\ No newline at end of file
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
+set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})
index b39bf1b..70bab36 100644 (file)
@@ -165,6 +165,8 @@ endif()
 
 add_cpplint_target(${TARGET_NAME}_cpplint FOR_TARGETS ${TARGET_NAME})
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
 # Static library used for unit tests which are always built
 
 add_library(${TARGET_NAME}_s STATIC
index ff8ac49..51ef530 100644 (file)
@@ -33,6 +33,8 @@ target_link_libraries(${TARGET_NAME} PRIVATE ${NGRAPH_LIBRARIES}
                                              pugixml
                                              openvino::itt)
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
 set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})
 
 # code style
index f3e281e..639c79d 100644 (file)
@@ -31,6 +31,8 @@ target_include_directories(${TARGET_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/"
 target_link_libraries(${TARGET_NAME} PRIVATE inference_engine_reader_api inference_engine_plugin_api
                                              inference_engine pugixml openvino::itt)
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
 set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})
 
 # code style
index 5aaffa9..b2f6d9e 100644 (file)
@@ -22,6 +22,8 @@ target_compile_definitions(${TARGET_NAME} PRIVATE IMPLEMENT_INFERENCE_ENGINE_PLU
 
 target_link_libraries(${TARGET_NAME} PRIVATE inference_engine_reader_api onnx_importer inference_engine)
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
 set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})
 
 # code style
index f855db9..ecb265d 100644 (file)
@@ -32,6 +32,8 @@ target_include_directories(${TARGET_NAME} PUBLIC ${PUBLIC_HEADERS_DIR}
 
 add_cpplint_target(${TARGET_NAME}_cpplint FOR_TARGETS ${TARGET_NAME})
 
+ie_add_api_validator_post_build_step(TARGET ${TARGET_NAME})
+
 # LTO
 
 set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO})
index c1e3f69..018cb2b 100644 (file)
@@ -43,6 +43,10 @@ if(COMMAND ie_faster_build)
     )
 endif()
 
+if(COMMAND ie_add_api_validator_post_build_step)
+    ie_add_api_validator_post_build_step(TARGET ngraph)
+endif()
+
 set_target_properties(ngraph PROPERTIES
                       CXX_VISIBILITY_PRESET hidden
                       C_VISIBILITY_PRESET hidden