Files

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

109 rivejä
5.4 KiB
CMake

2023-03-10 13:45:51 -06:00
# Generate py-interface and package targets
2023-10-11 21:54:09 -05:00
# CLANG installed must be 16.0 or above
2024-08-29 18:28:39 -05:00
# CLANG is only needed for generating new amdsmi_wrapper.py
# this is normally done in a docker container with a controlled clang and python-clang versions
2023-10-11 21:54:09 -05:00
set(clang_ver 16.0)
set(clang_ver_py 16.0.1)
set(ctypeslib_ver_py 2.3.4)
2023-03-10 13:45:51 -06:00
2023-03-20 13:29:28 -05:00
set(PY_BUILD_DIR "python_package")
2023-03-10 13:45:51 -06:00
# amdsmi part of this string is the directory containing all python files
# additionally defined in pyproject.toml
2023-03-20 13:29:28 -05:00
set(PY_PACKAGE_DIR "${PY_BUILD_DIR}/amdsmi")
set(PY_WRAPPER_INSTALL_DIR "${SHARE_INSTALL_PREFIX}" CACHE STRING "Wrapper installation directory")
2023-03-10 13:45:51 -06:00
# try to find clang of the right version
set(GOOD_CLANG_FOUND FALSE)
2023-03-20 13:29:28 -05:00
# only try to re-generate amdsmi_wrapper.py if BUILD_WRAPPER is on/true
if(BUILD_WRAPPER)
find_program(clang NAMES clang REQUIRED)
2023-03-10 13:45:51 -06:00
# extract clang version manually because find_package(clang) doesn't work
execute_process(COMMAND ${clang} --version OUTPUT_VARIABLE clang_full_version_string)
2025-05-06 05:40:18 +00:00
string(REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1" CLANG_VERSION_STRING ${clang_full_version_string})
2023-08-28 18:42:12 -05:00
if((CLANG_VERSION_STRING VERSION_GREATER clang_ver) OR (CLANG_VERSION_STRING VERSION_EQUAL clang_ver))
2023-03-10 13:45:51 -06:00
message("GOOD CLANG VERSION: ${CLANG_VERSION_STRING}")
set(GOOD_CLANG_FOUND TRUE)
else()
2023-03-20 13:29:28 -05:00
message(FATAL_ERROR "${clang} VERSION TOO OLD!: ${CLANG_VERSION_STRING}")
2023-03-10 13:45:51 -06:00
endif()
endif()
2023-03-20 13:29:28 -05:00
2023-03-10 13:45:51 -06:00
if(NOT GOOD_CLANG_FOUND)
# keep old wrapper because no clang found
2025-05-06 05:40:18 +00:00
message(
AUTHOR_WARNING
"A wrapper will not be re-generated! Using old wrapper instead.\nSet -DBUILD_WRAPPER=ON to re-build the wrapper"
)
2023-03-10 13:45:51 -06:00
add_custom_command(
2025-05-06 05:40:18 +00:00
OUTPUT amdsmi_wrapper.py ${PY_PACKAGE_DIR}/amdsmi_wrapper.py
DEPENDS ${AMD_SMI} ${CMAKE_CURRENT_SOURCE_DIR}/amdsmi_wrapper.py
2023-03-10 13:45:51 -06:00
COMMAND mkdir -p ${PY_PACKAGE_DIR}
2025-09-26 11:44:13 -05:00
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/amdsmi_wrapper.py ${PY_PACKAGE_DIR}/)
2023-03-10 13:45:51 -06:00
else()
find_package(Python3 3.6 COMPONENTS Interpreter Development REQUIRED)
2023-08-28 18:42:12 -05:00
# --break-system-packages is needed for python 3.11
# see: https://peps.python.org/pep-0668/
2025-05-06 05:40:18 +00:00
if(NOT Python3_VERSION VERSION_LESS "3.11")
2023-09-25 01:53:42 -05:00
set(Python3_BREAK_SYSTEM_PACKAGES "--break-system-packages")
endif()
2025-05-06 05:40:18 +00:00
add_custom_target(python_pre_reqs COMMAND ${Python3_EXECUTABLE} -m pip install ${Python3_BREAK_SYSTEM_PACKAGES}
ctypeslib2==${ctypeslib_ver_py})
2023-03-10 13:45:51 -06:00
# generate new wrapper
configure_file(${PROJECT_SOURCE_DIR}/tools/generator.py generator.py @ONLY COPYONLY)
add_custom_command(
2025-05-06 05:40:18 +00:00
OUTPUT amdsmi.h ${CMAKE_CURRENT_SOURCE_DIR}/amdsmi_wrapper.py amdsmi_wrapper.py
2023-03-10 13:45:51 -06:00
${PY_PACKAGE_DIR}/amdsmi_wrapper.py
2025-05-06 05:40:18 +00:00
DEPENDS ${AMD_SMI} python_pre_reqs generator.py ${PROJECT_SOURCE_DIR}/include/amd_smi/amdsmi.h
2023-03-10 13:45:51 -06:00
COMMAND cp ${PROJECT_SOURCE_DIR}/include/amd_smi/amdsmi.h ./
2025-05-06 05:40:18 +00:00
COMMAND ${Python3_EXECUTABLE} generator.py "$<$<BOOL:${ENABLE_ESMI_LIB}>:-e -DENABLE_ESMI_LIB>" -i amdsmi.h -l
${PROJECT_BINARY_DIR}/src/libamd_smi.so -o ${CMAKE_CURRENT_SOURCE_DIR}/amdsmi_wrapper.py
2023-03-10 13:45:51 -06:00
COMMAND mkdir -p ${PY_PACKAGE_DIR}
2025-09-26 11:44:13 -05:00
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/amdsmi_wrapper.py ${PY_PACKAGE_DIR}/)
2023-03-10 13:45:51 -06:00
endif()
# populate version string
configure_file(pyproject.toml.in ${PY_BUILD_DIR}/pyproject.toml @ONLY)
2024-02-27 17:49:02 -06:00
configure_file(_version.py.in ${PY_PACKAGE_DIR}/_version.py @ONLY)
configure_file(setup.py.in ${PY_BUILD_DIR}/setup.py @ONLY)
2025-05-06 05:40:18 +00:00
add_custom_target(python_wrapper DEPENDS amdsmi_wrapper.py)
2023-03-10 13:45:51 -06:00
2023-03-20 13:29:28 -05:00
# hard-linking instead of copying avoids unnecessarry regeneration of packaged files
2023-03-10 13:45:51 -06:00
add_custom_command(
2025-05-06 05:40:18 +00:00
OUTPUT ${PY_PACKAGE_DIR}/__init__.py ${PY_PACKAGE_DIR}/amdsmi_exception.py ${PY_PACKAGE_DIR}/amdsmi_interface.py
${PY_PACKAGE_DIR}/README.md ${PY_PACKAGE_DIR}/LICENSE
2023-03-10 13:45:51 -06:00
DEPENDS python_wrapper
2025-09-26 11:44:13 -05:00
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/__init__.py ${PY_PACKAGE_DIR}/
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/amdsmi_exception.py ${PY_PACKAGE_DIR}/
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/amdsmi_interface.py ${PY_PACKAGE_DIR}/
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/README.md ${PY_PACKAGE_DIR}/
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/LICENSE ${PY_PACKAGE_DIR}/)
2023-11-01 18:36:43 -05:00
# copy libamd_smi.so to allow for a self-contained python package
2025-05-06 05:40:18 +00:00
add_custom_command(OUTPUT ${PY_PACKAGE_DIR}/libamd_smi.so DEPENDS ${PROJECT_BINARY_DIR}/src/libamd_smi.so
COMMAND cp "${PROJECT_BINARY_DIR}/src/libamd_smi.so" ${PY_PACKAGE_DIR}/)
2023-03-10 13:45:51 -06:00
2023-03-20 13:29:28 -05:00
add_custom_target(
python_package ALL
2023-03-10 13:45:51 -06:00
DEPENDS ${PY_BUILD_DIR}/pyproject.toml
${PY_BUILD_DIR}/setup.py
2024-02-27 17:49:02 -06:00
${PY_PACKAGE_DIR}/_version.py
2023-03-10 13:45:51 -06:00
${PY_PACKAGE_DIR}/__init__.py
${PY_PACKAGE_DIR}/amdsmi_exception.py
${PY_PACKAGE_DIR}/amdsmi_interface.py
${PY_PACKAGE_DIR}/README.md
2023-11-01 18:36:43 -05:00
${PY_PACKAGE_DIR}/LICENSE
2025-05-06 05:40:18 +00:00
${PY_PACKAGE_DIR}/libamd_smi.so)
2023-03-10 13:45:51 -06:00
install(
2025-05-06 05:40:18 +00:00
FILES ${CMAKE_CURRENT_BINARY_DIR}/${PY_BUILD_DIR}/pyproject.toml
${CMAKE_CURRENT_BINARY_DIR}/${PY_BUILD_DIR}/setup.py ${CMAKE_CURRENT_BINARY_DIR}/${PY_PACKAGE_DIR}/_version.py
DESTINATION ${PY_WRAPPER_INSTALL_DIR}
COMPONENT dev)
2023-03-10 13:45:51 -06:00
2023-03-20 13:29:28 -05:00
install(
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PY_PACKAGE_DIR}
DESTINATION ${PY_WRAPPER_INSTALL_DIR}
COMPONENT dev)