From f67f9033c8e636e86cd2ce374d2af34b35e4ebbe Mon Sep 17 00:00:00 2001 From: Kiriti Gowda Date: Wed, 15 Nov 2023 18:32:10 -0800 Subject: [PATCH] rocDecode - runtime, dev, ASAN package (#52) * rocDecode - runtime, dev, ASAN * Package - Updates & cleanup * Package - Fix * Package - Deps Info * rocDecode - Package Depends Cleanup * CI - Verify Runtime & Dev Packages * Jenkins - Save all built packages * Jenkins - Groovy Updates * Package - Cleanup * CMakeList - updates * CI - save all packages * CI - Save Test Logs --- .jenkins/common.groovy | 36 +++++++-- CMakeLists.txt | 179 +++++++++++++++++++++++++---------------- 2 files changed, 138 insertions(+), 77 deletions(-) diff --git a/.jenkins/common.groovy b/.jenkins/common.groovy index 49efd4071e..986e1c73c5 100644 --- a/.jenkins/common.groovy +++ b/.jenkins/common.groovy @@ -53,17 +53,36 @@ def runPackageCommand(platform, project) { String packageType = "" String packageInfo = "" + String osType = '' + String packageRunTime = '' - if (platform.jenkinsLabel.contains('centos') || - platform.jenkinsLabel.contains('rhel') || - platform.jenkinsLabel.contains('sles')) { + if (platform.jenkinsLabel.contains('centos') || platform.jenkinsLabel.contains('rhel') || platform.jenkinsLabel.contains('sles')) { packageType = 'rpm' packageInfo = 'rpm -qlp' + packageRunTime = 'rocdecode-*' + + if (platform.jenkinsLabel.contains('sles')) { + osType = 'sles' } + else if (platform.jenkinsLabel.contains('rhel8')) { + osType = 'rhel8' + } + else if (platform.jenkinsLabel.contains('rhel9')) { + osType = 'rhel9' + } + } else { packageType = 'deb' packageInfo = 'dpkg -c' + packageRunTime = 'rocdecode_*' + + if (platform.jenkinsLabel.contains('ubuntu20')) { + osType = 'ubuntu20' + } + else if (platform.jenkinsLabel.contains('ubuntu22')) { + osType = 'ubuntu22' + } } def command = """#!/usr/bin/env bash @@ -73,13 +92,16 @@ def runPackageCommand(platform, project) { cd ${project.paths.project_build_prefix}/build/release sudo make package mkdir -p package - mv *.${packageType} package/ - mv Testing/Temporary/*.log package/ - ${packageInfo} package/*.${packageType} + mv rocdecode-dev*.${packageType} package/${osType}-rocdecode-dev.${packageType} + mv ${packageRunTime}.${packageType} package/${osType}-rocdecode.${packageType} + mv Testing/Temporary/LastTest.log package/${osType}-LastTest.log + mv Testing/Temporary/LastTestsFailed.log package/${osType}-LastTestsFailed.log + ${packageInfo} package/${osType}-rocdecode-dev.${packageType} + ${packageInfo} package/${osType}-rocdecode.${packageType} """ platform.runCommand(this, command) platform.archiveArtifacts(this, packageHelper[1]) } -return this +return this \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a7c57ea8a..d0b5f6e2ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,10 +23,12 @@ cmake_minimum_required(VERSION 3.5) -project(rocdecode) set(VERSION "0.4.0") set(CMAKE_CXX_STANDARD 17) +# Set Project Version and Language +project(rocdecode VERSION ${VERSION} LANGUAGES CXX) + set(CMAKE_INSTALL_LIBDIR "lib" CACHE STRING "Library install directory") set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE STRING "Include install directory") include(GNUInstallDirs) @@ -71,7 +73,7 @@ message("-- ${BoldBlue}rocDecode Version -- ${VERSION}${ColourReset}") message("-- ${BoldBlue}rocDecode Install Path -- ${CMAKE_INSTALL_PREFIX}${ColourReset}") list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) -list(APPEND CMAKE_PREFIX_PATH ${ROCM_PATH}/hip ${ROCM_PATH}) +list(APPEND CMAKE_PREFIX_PATH ${ROCM_PATH} ${ROCM_PATH}/hip) set(CMAKE_CXX_COMPILER ${ROCM_PATH}/llvm/bin/clang++) # rocDecode Default Options @@ -127,57 +129,119 @@ if(HIP_FOUND AND Libva_FOUND AND Libdrm_FOUND) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++17") target_link_libraries(${PROJECT_NAME} ${LINK_LIBRARY_LIST}) - install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) - install(FILES api/rocdecode.h api/rocparser.h utils/video_demuxer.h utils/rocvideodecode/roc_video_dec.h - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}) - install(DIRECTORY cmake DESTINATION ${CMAKE_INSTALL_DATADIR}/rocdecode) - install(DIRECTORY utils/rocvideodecode DESTINATION ${CMAKE_INSTALL_DATADIR}/rocdecode/utils) - install(DIRECTORY samples/videoDecode DESTINATION ${CMAKE_INSTALL_DATADIR}/rocdecode/samples) - install(FILES data/videos/AMD_driving_virtual_20-H265.mp4 DESTINATION ${CMAKE_INSTALL_DATADIR}/rocdecode/video) + set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) + set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX) + set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) + + # install rocDecode libs -- {ROCM_PATH}/lib + install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime NAMELINK_SKIP) + install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT dev NAMELINK_ONLY) + install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT asan) + # install rocDecode include files -- {ROCM_PATH}/include/rocdecode + install(FILES api/rocdecode.h api/rocparser.h utils/video_demuxer.h utils/rocvideodecode/roc_video_dec.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} COMPONENT dev) + # install rocDecode samples -- {ROCM_PATH}/share/rocdecode + install(DIRECTORY cmake DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME} COMPONENT dev) + install(DIRECTORY utils/rocvideodecode DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/utils COMPONENT dev) + install(DIRECTORY samples/videoDecode DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/samples COMPONENT dev) + install(FILES data/videos/AMD_driving_virtual_20-H265.mp4 DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/video COMPONENT dev) + # set license information - {ROCM_PATH}/share/doc/rocdecode + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") + install(FILES ${CPACK_RESOURCE_FILE_LICENSE} DESTINATION ${CMAKE_INSTALL_DOCDIR}-asan COMPONENT asan) + install(FILES ${CPACK_RESOURCE_FILE_LICENSE} DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT runtime) + install(FILES ${CPACK_RESOURCE_FILE_LICENSE} DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT dev) message("-- ${White}AMD ROCm rocDecode -- CMAKE_CXX_FLAGS:${CMAKE_CXX_FLAGS}${ColourReset}") message("-- ${White}AMD ROCm rocDecode -- Link Libraries: ${LINK_LIBRARY_LIST}${ColourReset}") + # make test with CTest enable_testing() include(CTest) add_subdirectory(samples) # set package information - set(CPACK_PACKAGE_VERSION ${VERSION}) - set(CPACK_PACKAGE_LICENSE "AMD") + set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) + set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) + set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) + set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") + set(CPACK_PACKAGE_LICENSE "MIT") set(CPACK_PACKAGE_CONTACT "rocDecode Support ") set(CPACK_PACKAGE_VENDOR "AMD ROCm") set(CPACK_PACKAGE_GROUP "Development/Tools") set(CPACK_PACKAGE_HOMEPAGE "https://github.com/ROCmSoftwarePlatform/rocDecode") if(ENABLE_ASAN_PACKAGING) - set(CPACK_PACKAGE_NAME "rocDecode-asan") set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "AMD rocDecode address sanitizer libraries") set(CPACK_RPM_PACKAGE_SUMMARY "AMD rocDecode address sanitizer libraries") else() - set(CPACK_PACKAGE_NAME "rocDecode") set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "AMD rocDecode hardware-accelerated video decoder on AMD’s GPUs. - rocDecode is a toolkit to decode videos and images using a hardware-accelerated video \ - decoder on AMD’s GPUs.") + rocDecode is a toolkit to decode videos using a hardware-accelerated video \ + decoder on AMD’s GPUs.") set(CPACK_RPM_PACKAGE_SUMMARY "AMD rocDecode hardware-accelerated video decoder on AMD’s GPUs.") endif() - # set license information - set(CPACK_RPM_PACKAGE_LICENSE "MIT") - set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") - - # NOTE: ASAN package requires address sanitized libraries and license file - # BUILD_DEV will be set to OFF for ASAN biulds. - if(ENABLE_ASAN_PACKAGING) - install(FILES ${CPACK_RESOURCE_FILE_LICENSE} - DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/rocdecode-asan) - else() - install(FILES ${CPACK_RESOURCE_FILE_LICENSE} - DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/rocdecode) - endif() if(DEFINED ENV{ROCM_LIBPATCH_VERSION}) - set(CPACK_PACKAGE_VERSION - "${CPACK_PACKAGE_VERSION}.$ENV{ROCM_LIBPATCH_VERSION}") + set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}.$ENV{ROCM_LIBPATCH_VERSION}") + endif() + + # Set the dependent packages + set(rocDecode_DEBIAN_PACKAGE_LIST "libva-dev, libdrm-dev") + set(rocDecode_RPM_PACKAGE_LIST "libva-devel, libdrm-devel") + + # '%{?dist}' breaks manual builds on debian systems due to empty Provides + execute_process( + COMMAND rpm --eval %{?dist} + RESULT_VARIABLE PROC_RESULT + OUTPUT_VARIABLE EVAL_RESULT + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(PROC_RESULT EQUAL "0" AND NOT EVAL_RESULT STREQUAL "") + string(APPEND CPACK_RPM_PACKAGE_RELEASE "%{?dist}") + endif() + + # set package + set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) + set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CPACK_PACKAGE_HOMEPAGE}) + set(CPACK_RPM_PACKAGE_URL ${CPACK_PACKAGE_HOMEPAGE}) + set(CPACK_RPM_PACKAGE_AUTOREQPROV "no") + # Debian package + set(CPACK_DEB_COMPONENT_INSTALL ON) + set(CPACK_DEBIAN_RUNTIME_PACKAGE_NAME "${PROJECT_NAME}") + set(CPACK_DEBIAN_RUNTIME_PACKAGE_DEPENDS "rocm-core, ${rocDecode_DEBIAN_PACKAGE_LIST}") + set(CPACK_DEBIAN_DEV_PACKAGE_NAME "${PROJECT_NAME}-dev") + set(CPACK_DEBIAN_DEV_PACKAGE_DEPENDS "${PROJECT_NAME}, rocm-core, ${rocDecode_DEBIAN_PACKAGE_LIST}") + # Debian package - specific variable for ASAN + set(CPACK_DEBIAN_ASAN_PACKAGE_NAME "${PROJECT_NAME}-asan" ) + set(CPACK_DEBIAN_ASAN_PACKAGE_DEPENDS "${PROJECT_NAME}, rocm-core-asan, ${rocDecode_DEBIAN_PACKAGE_LIST}" ) + # RPM package + set(CPACK_RPM_COMPONENT_INSTALL ON) + set(CPACK_RPM_RUNTIME_PACKAGE_NAME "${PROJECT_NAME}") + set(CPACK_RPM_RUNTIME_PACKAGE_REQUIRES "rocm-core, ${rocDecode_RPM_PACKAGE_LIST}") + set(CPACK_RPM_DEV_PACKAGE_NAME "${PROJECT_NAME}-devel") + set(CPACK_RPM_DEV_PACKAGE_REQUIRES "${PROJECT_NAME}, rocm-core, ${rocDecode_RPM_PACKAGE_LIST}") + set(CPACK_RPM_RUNTIME_PACKAGE_PROVIDES "${PROJECT_NAME}") + set(CPACK_RPM_RUNTIME_PACKAGE_OBSOLETES "${PROJECT_NAME}") + set(CPACK_RPM_DEV_PACKAGE_PROVIDES "${PROJECT_NAME}-dev") + set(CPACK_RPM_DEV_PACKAGE_OBSOLETES "${PROJECT_NAME}-dev") + set(CPACK_RPM_PACKAGE_LICENSE "MIT" ) + # RPM package specific variable for ASAN + set(CPACK_RPM_ASAN_PACKAGE_NAME "${PROJECT_NAME}-asan" ) + set(CPACK_RPM_ASAN_PACKAGE_REQUIRES "rocm-core-asan, ${rocDecode_RPM_PACKAGE_LIST}" ) + + if(NOT ROCM_DEP_ROCMCORE) + string(REGEX REPLACE ",? ?rocm-core," "" CPACK_RPM_RUNTIME_PACKAGE_REQUIRES ${CPACK_RPM_RUNTIME_PACKAGE_REQUIRES}) + string(REGEX REPLACE ",? ?rocm-core-asan," "" CPACK_RPM_ASAN_PACKAGE_REQUIRES ${CPACK_RPM_ASAN_PACKAGE_REQUIRES}) + string(REGEX REPLACE ",? ?rocm-core," "" CPACK_RPM_DEV_PACKAGE_REQUIRES ${CPACK_RPM_DEV_PACKAGE_REQUIRES}) + string(REGEX REPLACE ",? ?rocm-core," "" CPACK_DEBIAN_RUNTIME_PACKAGE_DEPENDS ${CPACK_DEBIAN_RUNTIME_PACKAGE_DEPENDS}) + string(REGEX REPLACE ",? ?rocm-core-asan," "" CPACK_DEBIAN_ASAN_PACKAGE_DEPENDS ${CPACK_DEBIAN_ASAN_PACKAGE_DEPENDS}) + string(REGEX REPLACE ",? ?rocm-core," "" CPACK_DEBIAN_DEV_PACKAGE_DEPENDS ${CPACK_DEBIAN_DEV_PACKAGE_DEPENDS}) + endif() + + if(ENABLE_ASAN_PACKAGING) + # ASAN Package requires asan component with only libraries and license file + set(CPACK_COMPONENTS_ALL asan) + else() + set(CPACK_COMPONENTS_ALL runtime dev) endif() set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT") @@ -192,59 +256,34 @@ if(HIP_FOUND AND Libva_FOUND AND Libdrm_FOUND) set(CPACK_RPM_PACKAGE_RELEASE $ENV{CPACK_RPM_PACKAGE_RELEASE}) endif() - # Set the dependent packages - set(rocDecode_DEBIAN_PACKAGE_LIST - "vainfo, libva-dev, libdrm-dev") - set(rocDecode_RPM_PACKAGE_LIST - "libva-devel, libdrm-devel") - # set dependency to ROCm if set to TRUE, default to OFF - set(ROCM_DEP_ROCMCORE OFF CACHE BOOL "Set rocm-core dependency") - if(ROCM_DEP_ROCMCORE) - if(ENABLE_ASAN_PACKAGING) - set(_rocm_core_pkg "rocm-core-asan") - else() - set(_rocm_core_pkg "rocm-core") - endif() - set(rocDecode_PACKAGE_REQS "${rocDecode_PACKAGE_REQS}, ${_rocm_core_pkg}") - - set(rocDecode_DEBIAN_PACKAGE_LIST "${rocDecode_PACKAGE_REQS}, ${rocDecode_DEBIAN_PACKAGE_LIST}") - set(rocDecode_RPM_PACKAGE_LIST "${rocDecode_PACKAGE_REQS}, ${rocDecode_RPM_PACKAGE_LIST}") - endif() - - set(CPACK_DEBIAN_PACKAGE_DEPENDS "${rocDecode_DEBIAN_PACKAGE_LIST}") - set(CPACK_RPM_PACKAGE_REQUIRES "${rocDecode_RPM_PACKAGE_LIST}") - - # '%{?dist}' breaks manual builds on debian systems due to empty Provides - execute_process( - COMMAND rpm --eval %{?dist} - RESULT_VARIABLE PROC_RESULT - OUTPUT_VARIABLE EVAL_RESULT - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(PROC_RESULT EQUAL "0" AND NOT EVAL_RESULT STREQUAL "") - string(APPEND CPACK_RPM_PACKAGE_RELEASE "%{?dist}") - endif() - - set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) - - set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CPACK_PACKAGE_HOMEPAGE}) - set(CPACK_RPM_PACKAGE_URL ${CPACK_PACKAGE_HOMEPAGE}) - set(CPACK_RPM_PACKAGE_AUTOREQPROV "no") - set(CPACK_GENERATOR "TGZ;ZIP") if(EXISTS ${MAKE_NSIS_EXE}) list(APPEND CPACK_GENERATOR "NSIS") endif() if(EXISTS ${RPMBUILD_EXE}) list(APPEND CPACK_GENERATOR "RPM") - message("-- ${White}AMD ROCm rocDecode -- CPACK_RPM_PACKAGE_REQUIRES: ${CPACK_RPM_PACKAGE_REQUIRES}${ColourReset}") + message("-- ${White}AMD ROCm rocDecode -- CPACK_RPM_RUNTIME_PACKAGE_REQUIRES: ${CPACK_RPM_RUNTIME_PACKAGE_REQUIRES}${ColourReset}") endif() if(EXISTS ${DPKG_EXE}) list(APPEND CPACK_GENERATOR "DEB") - message("-- ${White}AMD ROCm rocDecode -- CPACK_DEBIAN_PACKAGE_DEPENDS: ${CPACK_DEBIAN_PACKAGE_DEPENDS}${ColourReset}") + message("-- ${White}AMD ROCm rocDecode -- CPACK_DEBIAN_RUNTIME_PACKAGE_DEPENDS: ${CPACK_DEBIAN_RUNTIME_PACKAGE_DEPENDS}${ColourReset}") endif() include(CPack) + + cpack_add_component(runtime + DISPLAY_NAME "Runtime" + DESCRIPTION "Library, Header files and documentation for rocDecode") + + cpack_add_component(dev + DISPLAY_NAME "Devel" + DESCRIPTION "Header files and documentation for rocDecode") + + cpack_add_component(asan + DISPLAY_NAME "ASAN" + DESCRIPTION "ASAN libraries for the rocDecode") else() + message("-- ${Red}AMD ROCm rocDecode -- unmet dependencies${ColourReset}") if(NOT HIP_FOUND) message(FATAL_ERROR "-- ERROR!: HIP Not Found! - please install ROCm and HIP!") endif()