2023-01-16 01:02:17 -06:00
# Copyright (C) 2018-2023 Intel Corporation
2020-10-16 02:58:38 -05:00
# SPDX-License-Identifier: Apache-2.0
#
if ( WIN32 )
set ( PROGRAMFILES_ENV "ProgramFiles(X86)" )
2023-05-16 15:47:55 -05:00
# check that PROGRAMFILES_ENV is defined, because in case of cross-compilation for Windows
# we don't have such variable
if ( DEFINED ENV{PROGRAMFILES_ENV} )
file ( TO_CMAKE_PATH $ENV{ ${PROGRAMFILES_ENV } } PROGRAMFILES )
2023-02-25 06:33:08 -06:00
2023-05-16 15:47:55 -05:00
set ( WDK_PATHS "${PROGRAMFILES}/Windows Kits/10/bin/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x64"
" $ { P R O G R A M F I L E S } / W i n d o w s K i t s / 1 0 / b i n / x 6 4 " )
2023-02-25 06:33:08 -06:00
2023-05-16 15:47:55 -05:00
message ( STATUS "Trying to find apivalidator in: " )
foreach ( wdk_path IN LISTS WDK_PATHS )
message ( " * ${wdk_path}" )
endforeach ( )
2020-10-16 02:58:38 -05:00
2023-05-16 15:47:55 -05:00
find_host_program ( ONECORE_API_VALIDATOR
N A M E S a p i v a l i d a t o r
P A T H S $ { W D K _ P A T H S }
D O C " A p i V a l i d a t o r f o r O n e C o r e c o m p l i a n c e " )
if ( ONECORE_API_VALIDATOR )
message ( STATUS "Found apivalidator: ${ONECORE_API_VALIDATOR}" )
endif ( )
2020-10-16 02:58:38 -05:00
endif ( )
endif ( )
function ( _ie_add_api_validator_post_build_step_recursive )
cmake_parse_arguments ( API_VALIDATOR "" "TARGET" "" ${ ARGN } )
2023-02-24 15:11:50 -06:00
get_target_property ( LIBRARY_TYPE ${ API_VALIDATOR_TARGET } TYPE )
if ( LIBRARY_TYPE MATCHES "^(SHARED_LIBRARY|MODULE_LIBRARY|EXECUTABLE)$" AND
N O T $ { A P I _ V A L I D A T O R _ T A R G E T } I N _ L I S T A P I _ V A L I D A T O R _ T A R G E T S )
list ( APPEND API_VALIDATOR_TARGETS ${ API_VALIDATOR_TARGET } )
2020-10-16 02:58:38 -05:00
endif ( )
2023-02-25 13:32:45 -06:00
# keep checks target list to track cyclic dependencies, leading to infinite recursion
list ( APPEND checked_targets ${ API_VALIDATOR_TARGET } )
2020-10-16 02:58:38 -05:00
2023-02-24 15:11:50 -06:00
if ( NOT LIBRARY_TYPE STREQUAL "INTERFACE_LIBRARY" )
2020-10-16 02:58:38 -05:00
get_target_property ( LINKED_LIBRARIES ${ API_VALIDATOR_TARGET } LINK_LIBRARIES )
2023-02-24 15:11:50 -06:00
else ( )
set ( LINKED_LIBRARIES )
2020-10-16 02:58:38 -05:00
endif ( )
2023-02-24 15:11:50 -06:00
get_target_property ( INTERFACE_LINKED_LIBRARIES ${ API_VALIDATOR_TARGET } INTERFACE_LINK_LIBRARIES )
foreach ( library IN LISTS LINKED_LIBRARIES INTERFACE_LINKED_LIBRARIES )
if ( TARGET "${library}" )
get_target_property ( orig_library ${ library } ALIASED_TARGET )
2023-02-25 13:32:45 -06:00
if ( orig_library IN_LIST checked_targets OR library IN_LIST checked_targets )
# in case of cyclic dependencies, we need to skip current target
continue ( )
endif ( )
2023-02-24 15:11:50 -06:00
if ( TARGET "${orig_library}" )
_ie_add_api_validator_post_build_step_recursive ( TARGET ${ orig_library } )
else ( )
_ie_add_api_validator_post_build_step_recursive ( TARGET ${ library } )
endif ( )
endif ( )
endforeach ( )
2020-10-16 02:58:38 -05:00
set ( API_VALIDATOR_TARGETS ${ API_VALIDATOR_TARGETS } PARENT_SCOPE )
endfunction ( )
2023-02-24 15:11:50 -06:00
set ( VALIDATED_TARGETS "" CACHE INTERNAL "" )
2020-10-16 02:58:38 -05:00
2022-01-26 08:35:31 -06:00
function ( _ov_add_api_validator_post_build_step )
2023-02-26 12:51:37 -06:00
if ( ( NOT ONECORE_API_VALIDATOR ) OR ( WINDOWS_STORE OR WINDOWS_PHONE ) )
return ( )
endif ( )
# see https://learn.microsoft.com/en-us/windows-hardware/drivers/develop/validating-windows-drivers#known-apivalidator-issues
# ApiValidator does not run on Arm64 because AitStatic does not work on Arm64
if ( HOST_AARCH64 )
return ( )
endif ( )
if ( X86_64 )
set ( wdk_platform "x64" )
elseif ( X86 )
set ( wdk_platform "x86" )
elseif ( ARM )
set ( wdk_platform "arm" )
elseif ( AARCH64 )
set ( wdk_platform "arm64" )
else ( )
message ( FATAL_ERROR "Unknown configuration: ${CMAKE_HOST_SYSTEM_PROCESSOR}" )
endif ( )
2023-02-25 06:33:08 -06:00
find_file ( ONECORE_API_VALIDATOR_APIS NAMES UniversalDDIs.xml
2023-02-26 12:51:37 -06:00
P A T H S " $ { P R O G R A M F I L E S } / W i n d o w s K i t s / 1 0 / b u i l d / $ { C M A K E _ V S _ W I N D O W S _ T A R G E T _ P L A T F O R M _ V E R S I O N } / u n i v e r s a l D D I s / $ { w d k _ p l a t f o r m } "
" $ { P R O G R A M F I L E S } / W i n d o w s K i t s / 1 0 / b u i l d / u n i v e r s a l D D I s / $ { w d k _ p l a t f o r m } "
2023-02-25 06:33:08 -06:00
D O C " P a t h t o U n i v e r s a l D D I s . x m l f i l e " )
find_file ( ONECORE_API_VALIDATOR_EXCLUSION NAMES BinaryExclusionlist.xml
P A T H S $ { W D K _ P A T H S }
D O C " P a t h t o B i n a r y E x c l u s i o n l i s t . x m l f i l e " )
2023-02-26 12:51:37 -06:00
if ( NOT ONECORE_API_VALIDATOR_APIS )
message ( FATAL_ERROR "Internal error: apiValidator is found (${ONECORE_API_VALIDATOR}), but UniversalDDIs.xml file has not been found for ${wdk_platform} platform" )
2020-10-16 02:58:38 -05:00
endif ( )
2023-02-28 05:34:14 -06:00
cmake_parse_arguments ( API_VALIDATOR "" "TARGET" "EXTRA" "" ${ ARGN } )
2020-10-16 02:58:38 -05:00
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 } )
2023-02-28 05:34:14 -06:00
if ( API_VALIDATOR_EXTRA )
foreach ( target IN LISTS API_VALIDATOR_EXTRA )
_ie_add_api_validator_post_build_step_recursive ( TARGET ${ target } )
endforeach ( )
endif ( )
2020-10-16 02:58:38 -05:00
# remove targets which were tested before
2021-12-17 04:37:16 -06:00
foreach ( item IN LISTS VALIDATED_TARGETS )
2020-10-16 02:58:38 -05:00
list ( REMOVE_ITEM API_VALIDATOR_TARGETS ${ item } )
endforeach ( )
if ( NOT API_VALIDATOR_TARGETS )
return ( )
endif ( )
2020-10-29 04:38:15 -05:00
# apply check
macro ( api_validator_get_target_name )
2023-02-25 06:33:08 -06:00
get_target_property ( is_imported ${ target } IMPORTED )
2021-07-05 01:48:05 -05:00
get_target_property ( orig_target ${ target } ALIASED_TARGET )
2023-02-25 06:33:08 -06:00
if ( is_imported )
get_target_property ( imported_configs ${ target } IMPORTED_CONFIGURATIONS )
foreach ( imported_config RELEASE RELWITHDEBINFO DEBUG )
if ( imported_config IN_LIST imported_configs )
get_target_property ( target_location ${ target } IMPORTED_LOCATION_ ${ imported_config } )
get_filename_component ( target_name "${target_location}" NAME_WE )
break ( )
endif ( )
endforeach ( )
unset ( imported_configs )
2021-07-05 01:48:05 -05:00
elseif ( TARGET "${orig_target}" )
set ( target_name ${ orig_target } )
2023-02-24 15:11:50 -06:00
set ( target_location $< TARGET_FILE:${orig_target} > )
2020-10-29 04:38:15 -05:00
else ( )
set ( target_name ${ target } )
2023-02-24 15:11:50 -06:00
set ( target_location $< TARGET_FILE:${target} > )
2020-10-29 04:38:15 -05:00
endif ( )
2023-02-25 06:33:08 -06:00
unset ( orig_target )
unset ( is_imported )
2020-10-29 04:38:15 -05:00
endmacro ( )
2020-10-16 02:58:38 -05:00
foreach ( target IN LISTS API_VALIDATOR_TARGETS )
2020-10-29 04:38:15 -05:00
api_validator_get_target_name ( )
2023-02-25 06:33:08 -06:00
if ( CMAKE_VERSION VERSION_GREATER_EQUAL 3.20 AND OV_GENERATOR_MULTI_CONFIG )
set ( output_file "${OpenVINO_BINARY_DIR}/api_validator/$<CONFIG>/${target_name}.txt" )
2021-11-27 05:58:24 -06:00
else ( )
2023-02-25 06:33:08 -06:00
set ( output_file "${OpenVINO_BINARY_DIR}/api_validator/${target_name}.txt" )
2021-11-27 05:58:24 -06:00
endif ( )
2020-10-29 04:38:15 -05:00
2023-02-25 06:33:08 -06:00
list ( APPEND post_build_commands
$ { C M A K E _ C O M M A N D } - - c o n f i g $ < C O N F I G >
- D O N E C O R E _ A P I _ V A L I D A T O R = $ { O N E C O R E _ A P I _ V A L I D A T O R }
- D O N E C O R E _ A P I _ V A L I D A T O R _ T A R G E T = $ { t a r g e t _ l o c a t i o n }
- D O N E C O R E _ A P I _ V A L I D A T O R _ A P I S = $ { O N E C O R E _ A P I _ V A L I D A T O R _ A P I S }
- D O N E C O R E _ A P I _ V A L I D A T O R _ E X C L U S I O N = $ { O N E C O R E _ A P I _ V A L I D A T O R _ E X C L U S I O N }
- D O N E C O R E _ A P I _ V A L I D A T O R _ O U T P U T = $ { o u t p u t _ f i l e }
2020-11-10 07:29:37 -06:00
- D C M A K E _ T O O L C H A I N _ F I L E = $ { C M A K E _ T O O L C H A I N _ F I L E }
2023-02-25 06:33:08 -06:00
- P " $ { I E D e v S c r i p t s _ D I R } / a p i _ v a l i d a t o r / a p i _ v a l i d a t o r _ r u n . c m a k e " )
list ( APPEND byproducts_files ${ output_file } )
unset ( target_name )
unset ( target_location )
2020-10-16 02:58:38 -05:00
endforeach ( )
2023-02-25 06:33:08 -06:00
add_custom_command ( TARGET ${ API_VALIDATOR_TARGET } POST_BUILD
C O M M A N D $ { p o s t _ b u i l d _ c o m m a n d s }
B Y P R O D U C T S $ { b y p r o d u c t s _ f i l e s }
C O M M E N T " [ a p i V a l i d a t o r ] C h e c k $ { A P I _ V A L I D A T O R _ T A R G E T } a n d d e p e n d e n c i e s f o r O n e C o r e c o m p l i a n c e "
V E R B A T I M )
2020-10-16 02:58:38 -05:00
# update list of validated libraries
2023-02-24 15:11:50 -06:00
list ( APPEND VALIDATED_TARGETS ${ API_VALIDATOR_TARGETS } )
set ( VALIDATED_TARGETS "${VALIDATED_TARGETS}" CACHE INTERNAL "" FORCE )
2020-10-16 02:58:38 -05:00
endfunction ( )
#
# ie_add_api_validator_post_build_step(TARGET <name>)
#
2023-09-14 07:22:50 -05:00
macro ( ov_add_api_validator_post_build_step )
_ov_add_api_validator_post_build_step ( ${ ARGV } )
endmacro ( )
2020-10-16 02:58:38 -05:00
macro ( ie_add_api_validator_post_build_step )
2023-09-14 07:22:50 -05:00
message ( WARNING "ie_add_api_validator_post_build_step is deprecated, use ov_add_api_validator_post_build_step instead" )
2022-01-26 08:35:31 -06:00
_ov_add_api_validator_post_build_step ( ${ ARGV } )
2020-10-16 02:58:38 -05:00
endmacro ( )