uhd/host/python/CMakeLists.txt
Martin Braun 1bba62a75a Remove remaining Python 2 references
This changes two things in all applicable files:
- Remove imports from __future__
- Change default shebangs from /usr/bin/env python to /usr/bin/env
  python3
2020-05-07 15:10:41 -05:00

128 lines
5 KiB
CMake

#
# Copyright 2017-2018 Ettus Research, a National Instruments Company
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
########################################################################
# This file included, use CMake directory variables
########################################################################
PYTHON_CHECK_MODULE(
"virtualenv"
"sys" "hasattr(sys, 'real_prefix')"
HAVE_PYTHON_VIRTUALENV
)
# Get include dirs
include_directories(${PYTHON_INCLUDE_DIRS})
set(PYBIND11_INCLUDE_DIR
"${CMAKE_SOURCE_DIR}/lib/deps/pybind11/include"
CACHE
STRING
"Location of PyBind11 includes"
)
include_directories(${PYBIND11_INCLUDE_DIR})
execute_process(
COMMAND "${PYTHON_EXECUTABLE}" -c
"try:\n import numpy\n import os\n inc_path = numpy.get_include()\n if os.path.exists(os.path.join(inc_path, 'numpy', 'arrayobject.h')):\n print(inc_path, end='')\nexcept:\n pass"
OUTPUT_VARIABLE PYTHON_NUMPY_INCLUDE_DIR)
# Build pyuhd library
add_library(pyuhd SHARED pyuhd.cpp)
# python expects extension modules with a particular suffix
if(WIN32)
set_target_properties(pyuhd PROPERTIES PREFIX "lib" SUFFIX ".pyd")
else()
execute_process(
COMMAND "${PYTHON_EXECUTABLE}" -c
"from distutils.sysconfig import get_config_var; print(get_config_var('EXT_SUFFIX'))"
OUTPUT_VARIABLE PYTHON_EXTENSION_SUFFIX
)
string(STRIP ${PYTHON_EXTENSION_SUFFIX} PYTHON_EXTENSION_SUFFIX)
if(${PYTHON_EXTENSION_SUFFIX} STREQUAL "None")
set(PYTHON_EXTENSION_SUFFIX ${CMAKE_SHARED_MODULE_SUFFIX})
endif()
set_target_properties(pyuhd
PROPERTIES
PREFIX "lib"
SUFFIX ${PYTHON_EXTENSION_SUFFIX}
)
endif(WIN32)
target_include_directories(pyuhd PUBLIC
${PYTHON_NUMPY_INCLUDE_DIR}
${CMAKE_SOURCE_DIR}/lib
${PYBIND11_INCLUDE_DIR}
)
if(WIN32)
target_link_libraries(pyuhd ${Boost_LIBRARIES} ${PYTHON_LIBRARIES} uhd)
else()
# for extension module, proper to NOT link against python library and instead
# add dynamic lookup link option on OSX
target_link_libraries(pyuhd ${Boost_LIBRARIES} uhd)
if(APPLE)
target_link_options(pyuhd PRIVATE "LINKER:-undefined,dynamic_lookup")
endif(APPLE)
endif(WIN32)
# Copy pyuhd library to the staging directory
add_custom_command(TARGET pyuhd
POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pyuhd> ${CMAKE_CURRENT_BINARY_DIR}/uhd/$<TARGET_FILE_NAME:pyuhd>)
# List of Python files that are part of the module but don't get
# generated during build time.
# Note: When adding Python files into uhd/, they don't get added to the
# dependency list until CMake is re-run.
file(GLOB_RECURSE PYUHD_FILES
${CMAKE_CURRENT_SOURCE_DIR}/uhd/*.py
)
set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
set(TIMESTAMP_FILE "${CMAKE_CURRENT_BINARY_DIR}/build/timestamp")
# convert binary directory to native format to use in SETUP_PY file.
file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR} NATIVE_CURRENT_BINARY_DIR)
configure_file(${SETUP_PY_IN} ${SETUP_PY})
add_custom_command(OUTPUT ${TIMESTAMP_FILE}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/uhd ${CMAKE_CURRENT_BINARY_DIR}/uhd
COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} -q build
COMMAND ${CMAKE_COMMAND} -E touch ${TIMESTAMP_FILE}
DEPENDS ${PYUHD_FILES})
add_custom_target(pyuhd_library ALL DEPENDS ${TIMESTAMP_FILE} pyuhd)
if(HAVE_PYTHON_VIRTUALENV)
# In virtualenvs, let setuptools do its thing
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} -q install --force)")
else()
# Otherwise, use distutils to determine the correct relative path for Python
# packages, and install to our prefix
if(NOT DEFINED UHD_PYTHON_DIR)
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
"from distutils import sysconfig;\
print(sysconfig.get_python_lib(plat_specific=True, prefix='${CMAKE_INSTALL_PREFIX}'));"
OUTPUT_VARIABLE UHD_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif(NOT DEFINED UHD_PYTHON_DIR)
file(TO_CMAKE_PATH ${UHD_PYTHON_DIR} UHD_PYTHON_DIR)
message(STATUS "Utilizing the python install directory: ${UHD_PYTHON_DIR}")
# CMake will create an up-to-date copy of the entire Python module within
# the build directory. Instead of using setuptools, we use distutils (above)
# to figure out the destination path, and then we simply copy this module
# recursively into its final destination.
install(DIRECTORY
${CMAKE_CURRENT_BINARY_DIR}/uhd
DESTINATION ${UHD_PYTHON_DIR}
COMPONENT pythonapi
)
# On Linux/Unix systems, we must properly install the library file, though.
# install(DIRECTORY) will treat the .so file like any other file, which
# means it won't update its RPATH, and thus the RPATH would be stuck to the
# build directory.
if(UNIX)
install(TARGETS pyuhd
DESTINATION ${UHD_PYTHON_DIR}/uhd
)
endif(UNIX)
endif(HAVE_PYTHON_VIRTUALENV)