Fix building MKLDNNPlugin when the source path contains spaces (#5109)

The key changes are:

* Using VERBATIM to ensure CMake property passes command-line arguments
  to child processes.

* Using the INCLUDE_DIRECTORIES property instead of COMPILE_FLAGS to add
  include directories, because COMPILE_FLAGS are treated as space-separated
  values. (A small side benefit is that this doesn't rely on -I being
  the include directory option.)

In addition, some changes had to be made in order to preserve behavior:

* The _GEN_ARGS_LIST variable has to be inlined, because ARCH_SET is a list,
  and therefore the "-DXARCH_SET=..." argument gets split into multiple arguments
  (this happens to work by coincidence without VERBATIM). IMO, the code looks
  better this way anyway.

* It's no longer necessary to replace spaces in XARCH_SET in
  cross_compiled_disp_gen.cmake, because those spaces were an artifact of how
  the CMake arguments were passed before.
This commit is contained in:
Roman Donchenko 2021-04-12 13:27:49 +03:00 committed by GitHub
parent 69e1eebf4f
commit b92d1c1bdd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 12 deletions

View File

@ -10,7 +10,7 @@
# XARCH_FUNC_NAME -- name of function to dispatch
# XARCH_NAMESPACES -- full namespace used to keep ODR
# XARCH_DISP_FILE -- dispatcher file name to generate
# XARCH_SET -- set of ARCH supported by dispatcher. space delimited
# XARCH_SET -- set of ARCH supported by dispatcher. semicolon-delimited
#
# =================================================================
@ -24,7 +24,6 @@ function(_generate_dispatcher)
_find_signature_in_file(${XARCH_API_HEADER} ${XARCH_FUNC_NAME} SIGNATURE)
_generate_call_line_from_signature("${SIGNATURE}" CALL_LINE)
string(REPLACE " " ";" XARCH_SET "${XARCH_SET}")
string(REPLACE "::" ";" XARCH_NAMESPACES "${XARCH_NAMESPACES}")
list(GET XARCH_NAMESPACES -1 XARCH_CURRENT_NAMESPACE)

View File

@ -117,17 +117,21 @@ function(_clone_source_to_target TARGET SOURCE ARCH_SET)
${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}
${CMAKE_CURRENT_BINARY_DIR}/${ARCH_SOURCE}
DEPENDS ${SOURCE}
VERBATIM
)
set(_ARCH_SPECIFIC_FLAGS
${_DEFINE_${_arch}}
${_FLAGS_${_arch}}
"-DXARCH=${_arch}" ## to replace XARCH with direct ARCH name
"-I${CMAKE_CURRENT_SOURCE_DIR}/${ARCH_INCLUDE_DIR}" ## To make valid #include "some.hpp"
)
_add_source_compile_flags(${ARCH_SOURCE} ${_ARCH_SPECIFIC_FLAGS})
## To make `#include "some.hpp"` valid
set_property(SOURCE ${ARCH_SOURCE} APPEND PROPERTY INCLUDE_DIRECTORIES
"${CMAKE_CURRENT_SOURCE_DIR}/${ARCH_INCLUDE_DIR}")
list(APPEND _ARCH_SOURCES ${ARCH_SOURCE})
endforeach()
@ -146,25 +150,26 @@ function(_add_dispatcher_to_target TARGET HEADER FUNC_NAME NAMESPACE ARCH_SET)
set(DISPATCHER_SOURCE "cross-compiled/${DISPATCHER_NAME}_disp.cpp")
set(DISPATCHER_OPT_HOLDER "cross-compiled/${DISPATCHER_NAME}_holder.txt")
set(_GEN_ARGS_LIST
-DXARCH_FUNC_NAME="${X_NAME}"
-DXARCH_NAMESPACES="${NAMESPACE}"
-DXARCH_API_HEADER="${CMAKE_CURRENT_SOURCE_DIR}/${HEADER}"
-DXARCH_DISP_FILE="${CMAKE_CURRENT_BINARY_DIR}/${DISPATCHER_SOURCE}"
-DXARCH_SET="${ARCH_SET}"
)
configure_file(${DISPATCHER_GEN_OPTIONS_HOLDER} ${DISPATCHER_OPT_HOLDER})
add_custom_command(
OUTPUT ${DISPATCHER_SOURCE}
COMMAND ${CMAKE_COMMAND} ${_GEN_ARGS_LIST}
COMMAND ${CMAKE_COMMAND}
-D "XARCH_FUNC_NAME=${X_NAME}"
-D "XARCH_NAMESPACES=${NAMESPACE}"
-D "XARCH_API_HEADER=${CMAKE_CURRENT_SOURCE_DIR}/${HEADER}"
-D "XARCH_DISP_FILE=${CMAKE_CURRENT_BINARY_DIR}/${DISPATCHER_SOURCE}"
-D "XARCH_SET=${ARCH_SET}"
-P ${DISPATCHER_GEN_SCRIPT}
DEPENDS ${HEADER}
${DISPATCHER_GEN_SCRIPT}
${CMAKE_CURRENT_BINARY_DIR}/${DISPATCHER_OPT_HOLDER} ## Just to make run dependency on args value
VERBATIM
)
_add_source_compile_flags(${DISPATCHER_SOURCE} "-I${DISPATCHER_INCLUDE_DIR}")
set_property(SOURCE ${DISPATCHER_SOURCE} APPEND PROPERTY INCLUDE_DIRECTORIES
"${CMAKE_CURRENT_SOURCE_DIR}/${DISPATCHER_INCLUDE_DIR}")
_add_source_to_target(${TARGET} ${DISPATCHER_SOURCE})
endfunction()