|
|
@@ -0,0 +1,95 @@
|
|
|
+# Filename: Python.cmake
|
|
|
+#
|
|
|
+# Description: This file provides support functions for building/installing
|
|
|
+# Python extension modules and/or pure-Python packages.
|
|
|
+#
|
|
|
+# Functions:
|
|
|
+# add_python_target(target [source1 [source2 ...]])
|
|
|
+# install_python_package(path [ARCH/LIB])
|
|
|
+#
|
|
|
+
|
|
|
+#
|
|
|
+# Function: add_python_target(target [source1 [source2 ...]])
|
|
|
+# Build the provided source(s) as a Python extension module, linked against the
|
|
|
+# Python runtime library.
|
|
|
+#
|
|
|
+# Note that this also takes care of installation, unlike other target creation
|
|
|
+# commands in CMake.
|
|
|
+#
|
|
|
+function(add_python_target target)
|
|
|
+ if(NOT HAVE_PYTHON)
|
|
|
+ return()
|
|
|
+ endif()
|
|
|
+
|
|
|
+ string(REGEX REPLACE "^.*\\." "" basename "${target}")
|
|
|
+ set(sources ${ARGN})
|
|
|
+
|
|
|
+ add_library(${target} ${MODULE_TYPE} ${sources})
|
|
|
+ target_link_libraries(${target} PKG::PYTHON)
|
|
|
+
|
|
|
+ if(BUILD_SHARED_LIBS)
|
|
|
+ set_target_properties(${target} PROPERTIES
|
|
|
+ LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/panda3d"
|
|
|
+ OUTPUT_NAME "${basename}"
|
|
|
+ PREFIX ""
|
|
|
+ SUFFIX "${PYTHON_EXTENSION_SUFFIX}")
|
|
|
+
|
|
|
+ install(TARGETS ${target} DESTINATION "${PYTHON_ARCH_INSTALL_DIR}/panda3d")
|
|
|
+ else()
|
|
|
+ set_target_properties(${target} PROPERTIES
|
|
|
+ OUTPUT_NAME "${basename}"
|
|
|
+ PREFIX "libpython_panda3d_")
|
|
|
+
|
|
|
+ install(TARGETS ${target} DESTINATION lib)
|
|
|
+ endif()
|
|
|
+
|
|
|
+endfunction(add_python_target)
|
|
|
+
|
|
|
+#
|
|
|
+# Function: install_python_package(path [ARCH/LIB])
|
|
|
+#
|
|
|
+# Installs the Python package which was built at `path`.
|
|
|
+#
|
|
|
+# Note that this handles more than just installation; it will also invoke
|
|
|
+# Python's compileall utility to pregenerate .pyc/.pyo files. This will only
|
|
|
+# happen if the Python interpreter is found.
|
|
|
+#
|
|
|
+# The ARCH or LIB keyword may be used to specify whether this package should be
|
|
|
+# installed into Python's architecture-dependent or architecture-independent
|
|
|
+# package path. The default, if unspecified, is LIB.
|
|
|
+#
|
|
|
+function(install_python_package path)
|
|
|
+ if(ARGN STREQUAL "ARCH")
|
|
|
+ set(type "ARCH")
|
|
|
+ elseif(ARGN STREQUAL "LIB")
|
|
|
+ set(type "LIB")
|
|
|
+ elseif(ARGN STREQUAL "")
|
|
|
+ set(type "LIB")
|
|
|
+ else()
|
|
|
+ message(FATAL_ERROR "install_python_package got unexpected argument: ${ARGN}")
|
|
|
+ endif()
|
|
|
+
|
|
|
+ get_filename_component(package_name "${path}" NAME)
|
|
|
+ set(custom_target "bytecompile_${package_name}")
|
|
|
+
|
|
|
+ file(RELATIVE_PATH relpath "${PROJECT_BINARY_DIR}" "${path}")
|
|
|
+
|
|
|
+ if(PYTHON_EXECUTABLE)
|
|
|
+ add_custom_target(${custom_target} ALL)
|
|
|
+ add_custom_command(
|
|
|
+ TARGET ${custom_target}
|
|
|
+ WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
|
|
|
+ COMMAND "${PYTHON_EXECUTABLE}" -m compileall -q "${relpath}")
|
|
|
+ add_custom_command(
|
|
|
+ TARGET ${custom_target}
|
|
|
+ WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
|
|
|
+ COMMAND "${PYTHON_EXECUTABLE}" -OO -m compileall -q "${relpath}")
|
|
|
+ endif()
|
|
|
+
|
|
|
+ set(dir ${PYTHON_${type}_INSTALL_DIR})
|
|
|
+ if(dir)
|
|
|
+ install(DIRECTORY "${path}" DESTINATION "${dir}"
|
|
|
+ FILES_MATCHING REGEX "\\.py[co]?$")
|
|
|
+ endif()
|
|
|
+
|
|
|
+endfunction(install_python_package)
|