# # 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) # TODO: Enable once virtualenv is installed on CI machines option(BUILD_WRAPPER "Rebuild AMDSMI-wrapper" OFF) option(BUILD_CLI "Build AMDSMI-CLI and install" ON) option(ENABLE_LDCONFIG "Set library links and caches using ldconfig." ON) option(ENABLE_ASAN_PACKAGING "" OFF) option(ENABLE_ESMI_LIB "" OFF) # 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") if(ENABLE_ESMI_LIB) if((EXISTS ${PROJECT_SOURCE_DIR}/e_smi_library/src) AND (EXISTS ${PROJECT_SOURCE_DIR}/e_smi_library/src/e_smi_plat.c)) set(ESMI_AVAILABLE TRUE) add_definitions("-DENABLE_ESMI_LIB=1") else() message("E-smi source not found. Errors will be encountered during compilation!!!") endif() if(ESMI_AVAILABLE) set(ESMI_INC_DIR "${PROJECT_SOURCE_DIR}/e_smi_library/include") set(ESMI_SRC_DIR "${PROJECT_SOURCE_DIR}/e_smi_library/src") endif() endif() 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 ${ESMI_INC_DIR} ${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" "${ROCM_SRC_DIR}/rocm_smi_logger.cc" "${SHR_MUTEX_DIR}/shared_mutex.cc") if(ESMI_AVAILABLE) list(APPEND CMN_SRC_LIST ${ESMI_SRC_DIR}/e_smi.c) list(APPEND CMN_SRC_LIST ${ESMI_SRC_DIR}/e_smi_monitor.c) list(APPEND CMN_SRC_LIST ${ESMI_SRC_DIR}/e_smi_plat.c) list(APPEND CMN_SRC_LIST ${ESMI_SRC_DIR}/e_smi_utils.c) endif() 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" "${ROCM_INC_DIR}/rocm_smi_logger.h" "${SHR_MUTEX_DIR}/shared_mutex.h") add_subdirectory("rocm_smi") add_subdirectory("src") add_subdirectory("example") if(BUILD_TESTS) set(TESTS_COMPONENT "tests") #add_subdirectory("tests/rocm_smi_test") add_subdirectory("tests/amd_smi_test") endif() add_subdirectory("py-interface") if(BUILD_CLI) add_subdirectory("amdsmi_cli") endif() 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") # install license file in share/doc/amd_smi-asan folder install( FILES ${CPACK_RESOURCE_FILE_LICENSE} DESTINATION share/doc/${AMD_SMI}-asan RENAME LICENSE.txt COMPONENT asan) # 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 COMPONENT dev) #Readme file install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/README.md DESTINATION share/doc/${AMD_SMI} COMPONENT dev) #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_ASAN_PACKAGE_RECOMMENDS ${CPACK_DEBIAN_PACKAGE_RECOMMENDS}) set(CPACK_DEBIAN_DEV_PACKAGE_RECOMMENDS ${CPACK_DEBIAN_PACKAGE_RECOMMENDS}) set(CPACK_DEBIAN_ASAN_PACKAGE_PROVIDES "${AMD_SMI_PACKAGE}-asan") set(CPACK_DEBIAN_DEV_PACKAGE_PROVIDES "${AMD_SMI_PACKAGE}") set(CPACK_DEBIAN_PACKAGE_DEPENDS "python3 (>= 3.7.9)") set(CPACK_DEBIAN_ASAN_PACKAGE_DEPENDS ${CPACK_DEBIAN_PACKAGE_DEPENDS}) set(CPACK_DEBIAN_DEV_PACKAGE_DEPENDS ${CPACK_DEBIAN_PACKAGE_DEPENDS}) ## 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_DEV_PACKAGE_PROVIDES "${AMD_SMI_PACKAGE}") set(CPACK_RPM_ASAN_PACKAGE_PROVIDES "${AMD_SMI_PACKAGE}-asan") set(CPACK_RPM_PACKAGE_SUGGESTS "python3 >= 3.7.9") set(CPACK_RPM_DEV_PACKAGE_SUGGESTS ${CPACK_RPM_PACKAGE_SUGGESTS}) set(CPACK_RPM_ASAN_PACKAGE_SUGGESTS ${CPACK_RPM_PACKAGE_SUGGESTS}) # don't terminate if bytecompile of python files fails set(CPACK_RPM_SPEC_MORE_DEFINE "%define _python_bytecompile_errors_terminate_build 0") # Add rocm-core dependency if -DROCM_DEP_ROCMCORE=ON is passed if(ROCM_DEP_ROCMCORE) string(APPEND CPACK_DEBIAN_ASAN_PACKAGE_DEPENDS ", rocm-core-asan") string(APPEND CPACK_RPM_ASAN_PACKAGE_REQUIRES ", rocm-core-asan") string(APPEND CPACK_DEBIAN_DEV_PACKAGE_DEPENDS ", rocm-core") string(APPEND CPACK_RPM_DEV_PACKAGE_REQUIRES ", rocm-core") string(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS ", rocm-core") string(APPEND CPACK_RPM_PACKAGE_REQUIRES ", rocm-core") endif() ## Enable Component Mode and set component specific flags set(CPACK_DEB_COMPONENT_INSTALL ON) set(CPACK_DEBIAN_DEV_PACKAGE_NAME "${AMD_SMI_PACKAGE}") set(CPACK_DEBIAN_ASAN_PACKAGE_NAME "${AMD_SMI_PACKAGE}-asan") set(CPACK_RPM_COMPONENT_INSTALL ON) set(CPACK_RPM_DEV_PACKAGE_NAME "${AMD_SMI_PACKAGE}") set(CPACK_RPM_ASAN_PACKAGE_NAME "${AMD_SMI_PACKAGE}-asan") if(ENABLE_ASAN_PACKAGING) # ASAN Package requires only asan component with libraries and license file set(CPACK_COMPONENTS_ALL asan) else() set(CPACK_COMPONENTS_ALL dev tests ) 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/preun.in" RPM/preun @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_PRE_UNINSTALL_SCRIPT_FILE "${CMAKE_CURRENT_BINARY_DIR}/RPM/preun" ) 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()