diff --git a/cmake/developer_package/target_flags.cmake b/cmake/developer_package/target_flags.cmake index 29f23e713e1..b203d68558b 100644 --- a/cmake/developer_package/target_flags.cmake +++ b/cmake/developer_package/target_flags.cmake @@ -113,31 +113,35 @@ endif() get_property(OV_GENERATOR_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +function(ov_get_compiler_definition definition var) + if(NOT LINUX) + message(FATAL_ERROR "Internal error: 'ov_get_definition' must be used only on Linux") + endif() + + execute_process(COMMAND echo "#include " + COMMAND "${CMAKE_CXX_COMPILER}" -x c++ - -E -dM + COMMAND grep -E "^#define ${definition} " + OUTPUT_VARIABLE output_value + ERROR_VARIABLE error_message + RESULT_VARIABLE exit_code + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(NOT exit_code EQUAL 0) + message(FATAL_ERROR "Failed to detect '${definition}' definition value: ${error_message}\n${output_value}") + endif() + + if(output_value MATCHES "^#define ${definition} ([0-9]+)") + set("${var}" "${CMAKE_MATCH_1}" PARENT_SCOPE) + else() + message(FATAL_ERROR "Internal error: failed to parse ${definition} from '${output_value}'") + endif() +endfunction() + function(ov_glibc_version) # cmake needs to look at glibc version only when we build for Linux on Linux if(LINUX) - function(ov_get_definition definition var) - execute_process(COMMAND echo "#include " - COMMAND "${CMAKE_CXX_COMPILER}" -xc - -E -dM - COMMAND grep -E "^#define ${definition} " - OUTPUT_VARIABLE glibc_version_component - ERROR_VARIABLE error_message - RESULT_VARIABLE exit_code - OUTPUT_STRIP_TRAILING_WHITESPACE) - - if(NOT exit_code EQUAL 0) - message(FATAL_ERROR "Failed to detect glibc version: ${error_message}\n${glibc_version_component}") - endif() - - if(glibc_version_component MATCHES "^#define ${definition} ([0-9]+)") - set("${var}" "${CMAKE_MATCH_1}" PARENT_SCOPE) - else() - message(FATAL_ERROR "Internal error: failed to parse ${definition} from '${glibc_version_component}'") - endif() - endfunction() - - ov_get_definition("__GLIBC__" _ov_glibc_major) - ov_get_definition("__GLIBC_MINOR__" _ov_glibc_minor) + ov_get_compiler_definition("__GLIBC__" _ov_glibc_major) + ov_get_compiler_definition("__GLIBC_MINOR__" _ov_glibc_minor) set(OV_GLIBC_VERSION "${_ov_glibc_major}.${_ov_glibc_minor}" PARENT_SCOPE) else() @@ -146,3 +150,14 @@ function(ov_glibc_version) endfunction() ov_glibc_version() + +# +# Detects default value for _GLIBCXX_USE_CXX11_ABI for current compiler +# +macro(ov_get_glibcxx_use_cxx11_abi) + if(LINUX) + ov_get_compiler_definition("_GLIBCXX_USE_CXX11_ABI" OV_GLIBCXX_USE_CXX11_ABI) + endif() +endmacro() + +ov_get_glibcxx_use_cxx11_abi() diff --git a/src/cmake/openvino.cmake b/src/cmake/openvino.cmake index 0883b144cde..c742a5388f8 100644 --- a/src/cmake/openvino.cmake +++ b/src/cmake/openvino.cmake @@ -53,6 +53,10 @@ if(NOT BUILD_SHARED_LIBS) target_compile_definitions(${TARGET_NAME} PUBLIC OPENVINO_STATIC_LIBRARY) endif() +if(DEFINED OV_GLIBCXX_USE_CXX11_ABI) + target_compile_definitions(${TARGET_NAME} PUBLIC _GLIBCXX_USE_CXX11_ABI=${OV_GLIBCXX_USE_CXX11_ABI}) +endif() + if(WIN32) set_target_properties(${TARGET_NAME} PROPERTIES COMPILE_PDB_NAME ${TARGET_NAME}) endif()