# Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. include(pybind11) FIND_PACKAGE(NumPy) if(NOT PYTHON_INCLUDE_DIR) set(PYTHON_NOT_FOUND false) exec_program("${PYTHON_EXECUTABLE}" ARGS "-c \"import distutils.sysconfig; print(distutils.sysconfig.get_python_inc())\"" OUTPUT_VARIABLE PYTHON_INCLUDE_DIR RETURN_VALUE PYTHON_NOT_FOUND) if(${PYTHON_NOT_FOUND}) message(FATAL_ERROR "Cannot get Python include directory. Is distutils installed?") endif(${PYTHON_NOT_FOUND}) endif(NOT PYTHON_INCLUDE_DIR) # 2. Resolve the installed version of NumPy (for numpy/arrayobject.h). if(NOT NUMPY_INCLUDE_DIR) set(NUMPY_NOT_FOUND false) exec_program("${PYTHON_EXECUTABLE}" ARGS "-c \"import numpy; print(numpy.get_include())\"" OUTPUT_VARIABLE NUMPY_INCLUDE_DIR RETURN_VALUE NUMPY_NOT_FOUND) if(${NUMPY_NOT_FOUND}) message(FATAL_ERROR "Cannot get NumPy include directory: Is NumPy installed?") endif(${NUMPY_NOT_FOUND}) endif(NOT NUMPY_INCLUDE_DIR) # ---[ Python + Numpy set(onnxruntime_pybind_srcs_pattern "${ONNXRUNTIME_ROOT}/python/*.cc" "${ONNXRUNTIME_ROOT}/python/*.h" ) file(GLOB onnxruntime_pybind_srcs ${onnxruntime_pybind_srcs_pattern}) #TODO(): enable cuda and test it add_library(onnxruntime_pybind11_state MODULE ${onnxruntime_pybind_srcs}) if(HAS_CAST_FUNCTION_TYPE) target_compile_options(onnxruntime_pybind11_state PRIVATE "-Wno-cast-function-type") endif() target_include_directories(onnxruntime_pybind11_state PRIVATE ${ONNXRUNTIME_ROOT} ${PYTHON_INCLUDE_DIR} ${NUMPY_INCLUDE_DIR}) target_include_directories(onnxruntime_pybind11_state PRIVATE ${pybind11_INCLUDE_DIRS}) if(APPLE) set(ONNXRUNTIME_SO_LINK_FLAG "-Xlinker -exported_symbols_list ${ONNXRUNTIME_ROOT}/python/exported_symbols.lst") elseif(UNIX) set(ONNXRUNTIME_SO_LINK_FLAG "-Xlinker --version-script=${ONNXRUNTIME_ROOT}/python/version_script.lds -Xlinker --no-undefined") endif() set(onnxruntime_pybind11_state_libs onnxruntime_session ${onnxruntime_libs} ${PROVIDERS_CUDA} ${PROVIDERS_MKLDNN} onnxruntime_providers onnxruntime_framework onnxruntime_util onnxruntime_graph onnx onnx_proto onnxruntime_common onnxruntime_mlas ${onnxruntime_tvm_libs} ) set(onnxruntime_pybind11_state_dependencies ${onnxruntime_EXTERNAL_DEPENDENCIES} pybind11 ) add_dependencies(onnxruntime_pybind11_state ${onnxruntime_pybind11_state_dependencies}) if (MSVC) # if MSVC, pybind11 looks for release version of python lib (pybind11/detail/common.h undefs _DEBUG) target_link_libraries(onnxruntime_pybind11_state ${onnxruntime_pybind11_state_libs} ${onnxruntime_EXTERNAL_LIBRARIES} ${PYTHON_LIBRARY_RELEASE} ${ONNXRUNTIME_SO_LINK_FLAG}) else() target_link_libraries(onnxruntime_pybind11_state ${onnxruntime_pybind11_state_libs} ${onnxruntime_EXTERNAL_LIBRARIES} ${PYTHON_LIBRARY} ${ONNXRUNTIME_SO_LINK_FLAG}) if (APPLE) set_target_properties(onnxruntime_pybind11_state PROPERTIES INSTALL_RPATH "@loader_path") else() set_target_properties(onnxruntime_pybind11_state PROPERTIES LINK_FLAGS "-Xlinker -rpath=\$ORIGIN") endif() endif() set_target_properties(onnxruntime_pybind11_state PROPERTIES PREFIX "") set_target_properties(onnxruntime_pybind11_state PROPERTIES FOLDER "ONNXRuntime") if (MSVC) set_target_properties(onnxruntime_pybind11_state PROPERTIES SUFFIX ".pyd") else() set_target_properties(onnxruntime_pybind11_state PROPERTIES SUFFIX ".so") endif() file(GLOB onnxruntime_backend_srcs "${ONNXRUNTIME_ROOT}/python/backend/*.py" ) file(GLOB onnxruntime_python_srcs "${ONNXRUNTIME_ROOT}/python/*.py" ) file(GLOB onnxruntime_python_test_srcs "${ONNXRUNTIME_ROOT}/test/python/*.py" ) file(GLOB onnxruntime_python_tools_srcs "${ONNXRUNTIME_ROOT}/python/tools/*.py" ) file(GLOB onnxruntime_python_datasets_srcs "${ONNXRUNTIME_ROOT}/python/datasets/*.py" ) file(GLOB onnxruntime_python_datasets_data "${ONNXRUNTIME_ROOT}/python/datasets/*.pb" "${ONNXRUNTIME_ROOT}/python/datasets/*.onnx" ) # adjust based on what target/s onnxruntime_unittests.cmake created if (SingleUnitTestProject) set(test_data_target onnxruntime_test_all) else() set(test_data_target onnxruntime_test_ir) endif() add_custom_command( TARGET onnxruntime_pybind11_state POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/backend COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/capi COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/datasets COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/tools COMMAND ${CMAKE_COMMAND} -E copy ${ONNXRUNTIME_ROOT}/__init__.py $/onnxruntime/ COMMAND ${CMAKE_COMMAND} -E copy ${REPO_ROOT}/ThirdPartyNotices.txt $/onnxruntime/ COMMAND ${CMAKE_COMMAND} -E copy ${REPO_ROOT}/LICENSE $/onnxruntime/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_test_srcs} $ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_backend_srcs} $/onnxruntime/backend/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_srcs} $/onnxruntime/capi/ COMMAND ${CMAKE_COMMAND} -E copy $ $/onnxruntime/capi/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_datasets_srcs} $/onnxruntime/datasets/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_datasets_data} $/onnxruntime/datasets/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_tools_srcs} $/onnxruntime/tools/ ) if (onnxruntime_USE_MKLDNN) add_custom_command( TARGET onnxruntime_pybind11_state POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${MKLDNN_LIB_DIR}/${MKLDNN_SHARED_LIB} $/onnxruntime/capi/ ) endif() if (onnxruntime_USE_TVM) add_custom_command( TARGET onnxruntime_pybind11_state POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ $ $/onnxruntime/capi/ ) endif() if (onnxruntime_USE_MKLML) add_custom_command( TARGET onnxruntime_pybind11_state POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${MKLDNN_LIB_DIR}/${MKLML_SHARED_LIB} ${MKLDNN_LIB_DIR}/${IOMP5MD_SHARED_LIB} $/onnxruntime/capi/ ) endif()