# # Minimum version of cmake required # cmake_minimum_required(VERSION 3.11) set(AMD_SMI "amd_smi") set(AMD_SMI_COMPONENT "lib${AMD_SMI}") set(AMD_SMI_TARGET "${AMD_SMI}") set(AMD_SMI_LIB_NAME "lib${AMD_SMI_TARGET}") set(AMD_SMI_LIBS_TARGET "amd_smi_libraries") set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared library (.so) or not.") set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/" CACHE INTERNAL "Default module path.") ## Include common cmake modules include(utils) include(help_package) find_package(PkgConfig) generic_add_rocm() # provide git to utilities find_program(GIT NAMES git) ## Setup the package version based on git tags. set(PKG_VERSION_GIT_TAG_PREFIX "amdsmi_pkg_ver") get_package_version_number("1.0.0" ${PKG_VERSION_GIT_TAG_PREFIX} GIT) message("Package version: ${PKG_VERSION_STR}") set(${AMD_SMI_LIBS_TARGET}_VERSION_MAJOR "${VERSION_MAJOR}") set(${AMD_SMI_LIBS_TARGET}_VERSION_MINOR "${VERSION_MINOR}") set(${AMD_SMI_LIBS_TARGET}_VERSION_PATCH "0") set(${AMD_SMI_LIBS_TARGET}_VERSION_BUILD "0") # The following default version values should be updated as appropriate for # ABI breaks (update MAJOR and MINOR), and ABI/API additions (update MINOR). # Until ABI stabilizes VERSION_MAJOR will be 0. This should be over-ridden # by git tags (through "git describe") when they are present. set(PKG_VERSION_MAJOR 1) set(PKG_VERSION_MINOR 0) set(PKG_VERSION_PATCH 0) set(PKG_VERSION_NUM_COMMIT 0) set(AMD_SMI_PACKAGE amd-smi-lib CACHE STRING "") project(${AMD_SMI_LIBS_TARGET}) include(GNUInstallDirs) option(BUILD_TESTS "Build test suite" OFF) option(ENABLE_LDCONFIG "Set library links and caches using ldconfig." ON) # Set share path here because project name != amd_smi set(SHARE_INSTALL_PREFIX "share/${AMD_SMI}" CACHE STRING "Tests and Example install directory") # Packaging directives set(CPACK_PACKAGE_NAME ${AMD_SMI_PACKAGE} CACHE STRING "") set(CPACK_PACKAGE_CONTACT "AMD-SMILib Support " CACHE STRING "") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "AMD System Management libraries" CACHE STRING "") generic_package() ## Compiler flags set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -fno-rtti -m64 -msse -msse2 -std=c++11") # Security options set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wconversion -Wcast-align") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wformat=2 -fno-common -Wstrict-overflow") # Intentionally leave out -Wsign-promo. It causes spurious warnings. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wreorder") set(COMMON_SRC_DIR "${PROJECT_SOURCE_DIR}/src") set(ROCM_SRC_DIR "${PROJECT_SOURCE_DIR}/rocm_smi/src") set(AMDSMI_SRC_DIR "${PROJECT_SOURCE_DIR}/src/amd_smi") set(COMMON_INC_DIR "${PROJECT_SOURCE_DIR}/include/amd_smi") set(AMDSMI_INC_DIR "${PROJECT_SOURCE_DIR}/include/amd_smi") set(ROCM_INC_DIR "${PROJECT_SOURCE_DIR}/rocm_smi/include/rocm_smi") set(SHR_MUTEX_DIR "${PROJECT_SOURCE_DIR}/third_party/shared_mutex") pkg_check_modules(DRM REQUIRED libdrm) pkg_check_modules(AMDGPU_DRM REQUIRED libdrm_amdgpu) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/third_party/shared_mutex ${CMAKE_CURRENT_SOURCE_DIR}/include/amd_smi ${DRM_INCLUDE_DIRS}) set(CMN_SRC_LIST "${ROCM_SRC_DIR}/rocm_smi.cc" "${ROCM_SRC_DIR}/rocm_smi_counters.cc" "${ROCM_SRC_DIR}/rocm_smi_device.cc" "${ROCM_SRC_DIR}/rocm_smi_gpu_metrics.cc" "${ROCM_SRC_DIR}/rocm_smi_io_link.cc" "${ROCM_SRC_DIR}/rocm_smi_kfd.cc" "${ROCM_SRC_DIR}/rocm_smi_main.cc" "${ROCM_SRC_DIR}/rocm_smi_monitor.cc" "${ROCM_SRC_DIR}/rocm_smi_power_mon.cc" "${ROCM_SRC_DIR}/rocm_smi_utils.cc" "${SHR_MUTEX_DIR}/shared_mutex.cc") set(CMN_INC_LIST "${ROCM_INC_DIR}/rocm_smi.h" "${ROCM_INC_DIR}/rocm_smi_common.h" "${ROCM_INC_DIR}/rocm_smi_counters.h" "${ROCM_INC_DIR}/rocm_smi_device.h" "${ROCM_INC_DIR}/rocm_smi_exception.h" "${ROCM_INC_DIR}/rocm_smi_io_link.h" "${ROCM_INC_DIR}/rocm_smi_kfd.h" "${ROCM_INC_DIR}/rocm_smi_main.h" "${ROCM_INC_DIR}/rocm_smi_monitor.h" "${ROCM_INC_DIR}/rocm_smi_power_mon.h" "${ROCM_INC_DIR}/rocm_smi_utils.h" "${SHR_MUTEX_DIR}/shared_mutex.h") add_subdirectory("rocm_smi") add_subdirectory("src") add_subdirectory("example") if(BUILD_TESTS) add_subdirectory("tests/rocm_smi_test") add_subdirectory("tests/amd_smi_test") endif() # Generate python_wrapper and package targets find_program(PYTHON3 "python3") find_program(PIP3 "pip3") if(PYTHON3 AND PIP3) add_custom_command( OUTPUT clang_tools_extract COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper COMMAND pip3 download ctypeslib2==2.3.2 -d ${CMAKE_CURRENT_BINARY_DIR}/dl COMMAND pip3 download clang==10.0.1 -d ${CMAKE_CURRENT_BINARY_DIR}/dl COMMAND unzip -o ${CMAKE_CURRENT_BINARY_DIR}/dl/ctypeslib2-2.3.2-py3-none-any.whl -d ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper COMMAND unzip -o ${CMAKE_CURRENT_BINARY_DIR}/dl/clang-10.0.1-py3-none-any.whl -d ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_custom_target( python_wrapper DEPENDS clang_tools_extract COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper COMMAND cp -r ${CMAKE_CURRENT_SOURCE_DIR}/include/amd_smi/amdsmi.h ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/amd_smi COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/rocm_smi/include/rocm_smi/kfd_ioctl.h ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/amd_smi/ COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/tools/generator.py ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/ COMMAND python3 ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/generator.py -o ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/amdsmi_wrapper.py -i ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/amdsmi.h -l ${CMAKE_CURRENT_BINARY_DIR}/src/libamd_smi.so COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/amdsmi_wrapper.py ${CMAKE_CURRENT_SOURCE_DIR}/py-interface/ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper) set(PY_INTERFACE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/py-interface") set(PACKAGE_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/python_package/amdsmi") add_custom_target( python_package DEPENDS python_wrapper COMMAND mkdir -p ${PACKAGE_OUTPUT_DIR} COMMAND cp ${PY_INTERFACE_DIR}/__init__.py ${PACKAGE_OUTPUT_DIR} COMMAND cp ${PY_INTERFACE_DIR}/amdsmi_exception.py ${PACKAGE_OUTPUT_DIR} COMMAND cp ${PY_INTERFACE_DIR}/amdsmi_interface.py ${PACKAGE_OUTPUT_DIR} COMMAND cp ${PY_INTERFACE_DIR}/amdsmi_wrapper.py ${PACKAGE_OUTPUT_DIR} COMMAND cp ${PY_INTERFACE_DIR}/README.md ${PACKAGE_OUTPUT_DIR} COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/src/libamd_smi.so ${PACKAGE_OUTPUT_DIR} COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE ${PACKAGE_OUTPUT_DIR} COMMAND echo ${PACKAGE_OUTPUT_DIR}) else() message("Python3 or Pip3 not found.") endif(PYTHON3 AND PIP3) include(CMakePackageConfigHelpers) configure_package_config_file( amd_smi-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/amd_smi-config.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/amd_smi PATH_VARS CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_BINDIR) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/amd_smi-config-version.cmake VERSION "${AMD_SMI_LIBS_TARGET_VERSION_MAJOR}.${AMD_SMI_LIBS_TARGET_VERSION_MINOR}.${AMD_SMI_LIBS_TARGET_VERSION_PATCH}" COMPATIBILITY SameMajorVersion) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/amd_smi-config.cmake ${CMAKE_CURRENT_BINARY_DIR}/amd_smi-config-version.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${AMD_SMI} COMPONENT dev) # Create cmake target # Add all targets to the build-tree export set export(TARGETS ${AMD_SMI_TARGET} FILE "${PROJECT_BINARY_DIR}/amd_smi_target.cmake") # Export the package for use from the build-tree # (this registers the build-tree with a global CMake-registry) export(PACKAGE amd_smi) # Create the amd_smiConfig.cmake and amd_smiConfigVersion files # ... for the build tree install( EXPORT amd_smiTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${AMD_SMI} COMPONENT dev) #License file set(CPACK_RPM_PACKAGE_LICENSE "NCSA") # docs are installed into different share directory from tests and examples install( FILES ${CPACK_RESOURCE_FILE_LICENSE} DESTINATION share/doc/${AMD_SMI} RENAME LICENSE.txt) #Readme file install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/README.md DESTINATION share/doc/${AMD_SMI}) #Make proper version for appending #Default Value is 99999, setting it first set(ROCM_VERSION_FOR_PACKAGE "99999") if(DEFINED ENV{ROCM_LIBPATCH_VERSION}) set(ROCM_VERSION_FOR_PACKAGE $ENV{ROCM_LIBPATCH_VERSION}) endif() #Debian package specific variables set(CPACK_DEBIAN_PACKAGE_PROVIDES "amd-smi") set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "sudo, libdrm-dev") set(CPACK_DEBIAN_PACKAGE_DEPENDS "python3") ## Process the Debian install/remove scripts to update the CPACK variables configure_file(${CMAKE_CURRENT_SOURCE_DIR}/DEBIAN/postinst.in DEBIAN/postinst @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/DEBIAN/prerm.in DEBIAN/prerm @ONLY) set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "DEBIAN/postinst;DEBIAN/prerm") # RPM package specific variables set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "${CPACK_PACKAGING_INSTALL_PREFIX} ${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}") #Set rpm distro if(CPACK_RPM_PACKAGE_RELEASE) set(CPACK_RPM_PACKAGE_RELEASE_DIST ON) endif() set(CPACK_RPM_PACKAGE_PROVIDES "amd-smi") set(CPACK_RPM_PACKAGE_REQUIRES "python3") # Add rocm-core dependency if -DROCM_DEP_ROCMCORE=ON is passed if(ROCM_DEP_ROCMCORE) string(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS ", rocm-core") string(APPEND CPACK_RPM_PACKAGE_REQUIRES ", rocm-core") endif() # The line below doesn't currently work; it may be this issue: # https://bugzilla.redhat.com/show_bug.cgi?id=1811358 # set(CPACK_RPM_PACKAGE_SUGGESTS "sudo, libdrm-dev") #Prepare final version for the CPACK use set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}.${ROCM_VERSION_FOR_PACKAGE}" ) ## Process the Rpm install/remove scripts to update the CPACK variables configure_file("${CMAKE_CURRENT_SOURCE_DIR}/RPM/post.in" RPM/post @ONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/RPM/postun.in" RPM/postun @ONLY) set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_BINARY_DIR}/RPM/post") set(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE "${CMAKE_CURRENT_BINARY_DIR}/RPM/postun") #Set the names now using CPACK utility set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT") set(CPACK_RPM_FILE_NAME "RPM-DEFAULT") include(CPack) generic_package_post()