| # SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) | |
| # Copyright (c) 2018, Mellanox Technologies. All rights reserved. See COPYING file | |
| # Copyright (c) 2020, Intel Corporation. All rights reserved. See COPYING file | |
| set(COMMON_LIBS_PIC ccan_pic rdma_util_pic) | |
| function(build_module_from_cfiles PY_MODULE MODULE_NAME ALL_CFILES LINKER_FLAGS) | |
| string(REGEX REPLACE "\\.so$" "" SONAME "${MODULE_NAME}${CMAKE_PYTHON_SO_SUFFIX}") | |
| add_library(${SONAME} SHARED ${ALL_CFILES}) | |
| set_target_properties(${SONAME} PROPERTIES | |
| COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -fno-strict-aliasing -Wno-unused-function -Wno-redundant-decls -Wno-shadow -Wno-cast-function-type -Wno-implicit-fallthrough -Wno-unknown-warning -Wno-unknown-warning-option -Wno-deprecated-declarations ${NO_VAR_TRACKING_FLAGS}" | |
| LIBRARY_OUTPUT_DIRECTORY "${BUILD_PYTHON}/${PY_MODULE}" | |
| PREFIX "") | |
| target_link_libraries(${SONAME} LINK_PRIVATE ${PYTHON_LIBRARIES} ibverbs rdmacm ${LINKER_FLAGS} ${COMMON_LIBS_PIC} ${CMAKE_THREAD_LIBS_INIT}) | |
| install(TARGETS ${SONAME} | |
| DESTINATION ${CMAKE_INSTALL_PYTHON_ARCH_LIB}/${PY_MODULE}) | |
| endfunction() | |
| function(rdma_cython_module PY_MODULE LINKER_FLAGS) | |
| set(ALL_CFILES "") | |
| set(MODULE_NAME "") | |
| foreach(SRC_FILE ${ARGN}) | |
| get_filename_component(FILENAME ${SRC_FILE} NAME_WE) | |
| get_filename_component(DIR ${SRC_FILE} DIRECTORY) | |
| get_filename_component(EXT ${SRC_FILE} EXT) | |
| if (DIR) | |
| set(SRC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${DIR}") | |
| else() | |
| set(SRC_PATH "${CMAKE_CURRENT_SOURCE_DIR}") | |
| endif() | |
| if (${EXT} STREQUAL ".pyx") | |
| # each .pyx file starts a new module, finish the previous module first | |
| if (ALL_CFILES AND MODULE_NAME) | |
| build_module_from_cfiles(${PY_MODULE} ${MODULE_NAME} "${ALL_CFILES}" "${LINKER_FLAGS}") | |
| endif() | |
| set(PYX "${SRC_PATH}/${FILENAME}.pyx") | |
| set(CFILE "${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.c") | |
| include_directories(${PYTHON_INCLUDE_DIRS}) | |
| add_custom_command( | |
| OUTPUT "${CFILE}" | |
| MAIN_DEPENDENCY "${PYX}" | |
| COMMAND ${CYTHON_EXECUTABLE} "${PYX}" -o "${CFILE}" | |
| "-I${PYTHON_INCLUDE_DIRS}" | |
| COMMENT "Cythonizing ${PYX}" | |
| ) | |
| set(MODULE_NAME ${FILENAME}) | |
| set(ALL_CFILES "${CFILE}") | |
| elseif(${EXT} STREQUAL ".c") | |
| # .c files belong to the same module as the most recent .pyx file, | |
| # ignored if appearing before all .pyx files | |
| set(CFILE "${SRC_PATH}/${FILENAME}.c") | |
| set(ALL_CFILES "${ALL_CFILES};${CFILE}") | |
| else() | |
| continue() | |
| endif() | |
| endforeach() | |
| # finish the last module | |
| if (ALL_CFILES AND MODULE_NAME) | |
| build_module_from_cfiles(${PY_MODULE} ${MODULE_NAME} "${ALL_CFILES}" "${LINKER_FLAGS}") | |
| endif() | |
| endfunction() | |
| function(rdma_python_module PY_MODULE) | |
| if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/__version__.py.in") | |
| message(FATAL_ERROR "Can't generate python module ${PY_MODULE} version, need ${CMAKE_CURRENT_SOURCE_DIR}/__version__.py.in") | |
| endif() | |
| configure_file("${CMAKE_CURRENT_SOURCE_DIR}/__version__.py.in" | |
| "${BUILD_PYTHON}/${PY_MODULE}/__version__.py" @ONLY) | |
| install(FILES "${BUILD_PYTHON}/${PY_MODULE}/__version__.py" | |
| DESTINATION ${CMAKE_INSTALL_PYTHON_ARCH_LIB}/${PY_MODULE}) | |
| foreach(PY_FILE ${ARGN}) | |
| get_filename_component(LINK "${CMAKE_CURRENT_SOURCE_DIR}/${PY_FILE}" ABSOLUTE) | |
| rdma_create_symlink("${LINK}" "${BUILD_PYTHON}/${PY_MODULE}/${PY_FILE}") | |
| install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PY_FILE} | |
| DESTINATION ${CMAKE_INSTALL_PYTHON_ARCH_LIB}/${PY_MODULE}) | |
| endforeach() | |
| endfunction() | |
| function(rdma_python_test PY_MODULE) | |
| foreach(PY_FILE ${ARGN}) | |
| install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PY_FILE} | |
| DESTINATION ${CMAKE_INSTALL_DOCDIR}/${PY_MODULE}) | |
| endforeach() | |
| endfunction() | |
| # Make a python script runnable from the build/bin directory with all the | |
| # correct paths filled in | |
| function(rdma_internal_binary) | |
| foreach(PY_FILE ${ARGN}) | |
| get_filename_component(ABS "${CMAKE_CURRENT_SOURCE_DIR}/${PY_FILE}" ABSOLUTE) | |
| get_filename_component(FN "${CMAKE_CURRENT_SOURCE_DIR}/${PY_FILE}" NAME) | |
| set(BIN_FN "${BUILD_BIN}/${FN}") | |
| file(WRITE "${BIN_FN}" "#!/bin/sh | |
| PYTHONPATH='${BUILD_PYTHON}' exec '${PYTHON_EXECUTABLE}' '${ABS}' \"$@\" | |
| ") | |
| execute_process(COMMAND "chmod" "a+x" "${BIN_FN}") | |
| endforeach() | |
| endfunction() |