diff --git a/CMakeLists.txt b/CMakeLists.txt index faed8a43d2..7164d4ff2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -184,7 +184,7 @@ if(HIP_FOUND AND Libva_FOUND AND Libdrm_amdgpu_FOUND) # install rocdecode include files -- {ROCM_PATH}/include/rocdecode install(FILES api/rocdecode/rocdecode.h api/rocdecode/rocparser.h api/rocdecode/roc_bitstream_reader.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} COMPONENT dev) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/rocdecode_version.h api/rocdecode/rocdecode_host.h + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/rocdecode_version.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} COMPONENT dev) # install rocdecode api trace include file -- {ROCM_PATH}/include/rocdecode/amd_detail install(FILES api/amd_detail/rocdecode_api_trace.h diff --git a/api/rocdecode-host_version.h.in b/api/rocdecode-host_version.h.in new file mode 100644 index 0000000000..eaf4762881 --- /dev/null +++ b/api/rocdecode-host_version.h.in @@ -0,0 +1,59 @@ +/* +Copyright (c) 2024 - 2025 Advanced Micro Devices, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#ifndef _ROCDECODE_HOST_VERSION_H_ +#define _ROCDECODE_HOST_VERSION_H_ + +/*! + * \file + * \brief rocDecode host version + * \defgroup group_rocdecode_host_version rocdecode-host Version + * \brief rocdecode-host version + */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define ROCDECODE_HOST_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ +#define ROCDECODE_HOST_VERSION_MINOR @PROJECT_VERSION_MINOR@ +#define ROCDECODE_HOST_VERSION_PATCH @PROJECT_VERSION_PATCH@ + +/** + * ROCDECODE_HOST_CHECK_VERSION: + * @major: major version, like 1 in 1.2.3 + * @minor: minor version, like 2 in 1.2.3 + * @patch: patch version, like 3 in 1.2.3 + * + * Evaluates to %TRUE if the version of ROCDECODE HOST is greater than + * @major, @minor and @patch + */ +#define ROCDECODE_HOST_CHECK_VERSION(major, minor, patch) \ + (ROCDECODE_HOST_VERSION_MAJOR > (major) || \ + (ROCDECODE_HOST_VERSION_MAJOR == (major) && ROCDECODE_HOST_VERSION_MINOR > (minor)) || \ + (ROCDECODE_HOST_VERSION_MAJOR == (major) && ROCDECODE_HOST_VERSION_MINOR == (minor) && ROCDECODE_HOST_VERSION_PATCH >= (patch))) + +#ifdef __cplusplus +} // end extern "C" block +#endif + +#endif //_ROCDECODE_HOST_VERSION_H_ header guard diff --git a/cmake_modules/rocdecode-host-config.cmake.in b/cmake_modules/rocdecode-host-config.cmake.in new file mode 100644 index 0000000000..491c308241 --- /dev/null +++ b/cmake_modules/rocdecode-host-config.cmake.in @@ -0,0 +1,36 @@ +# - Config file for the rocdecode-host package +# It defines the following variables +# use rocdecode-host_INCLUDE_DIR - include directory for rocdecode-host +# use rocdecode-host_LIB_DIR - library directory for rocdecode-host +# use rocdecode-host_LIBRARY - library to link against +# use rocdecode-host_LIBRARIES - library to link against + +# compute paths +get_filename_component(@PROJECT_NAME@_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) + +# version +include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-config-version.cmake) +set(@PROJECT_NAME@_VERSION ${PACKAGE_VERSION}) + +# targets +include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake) + +@PACKAGE_INIT@ + +set_and_check(@PROJECT_NAME@_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") +set_and_check(@PROJECT_NAME@_LIB_DIR "@PACKAGE_LIB_INSTALL_DIR@") +set_and_check(@PROJECT_NAME@_LIBRARY "@PACKAGE_LIB_INSTALL_DIR@/lib@PROJECT_NAME@.so") +set_and_check(@PROJECT_NAME@_LIBRARIES "@PACKAGE_LIB_INSTALL_DIR@/lib@PROJECT_NAME@.so") + +if(NOT TARGET rocdecode::@PROJECT_NAME@) + add_library(rocdecode::@PROJECT_NAME@ INTERFACE IMPORTED) + set_target_properties(rocdecode::@PROJECT_NAME@ PROPERTIES INTERFACE_LINK_LIBRARIES ${@PROJECT_NAME@_LIBRARY}) +endif () + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + @PROJECT_NAME@ + FOUND_VAR @PROJECT_NAME@_FOUND + REQUIRED_VARS @PROJECT_NAME@_INCLUDE_DIR @PROJECT_NAME@_LIB_DIR @PROJECT_NAME@_LIBRARY @PROJECT_NAME@_LIBRARIES + VERSION_VAR @PROJECT_NAME@_VERSION + HANDLE_COMPONENTS) diff --git a/samples/rocdecDecode/CMakeLists.txt b/samples/rocdecDecode/CMakeLists.txt index 854c55896b..4d11e99c58 100644 --- a/samples/rocdecDecode/CMakeLists.txt +++ b/samples/rocdecDecode/CMakeLists.txt @@ -64,22 +64,22 @@ endif() find_package(HIP QUIET) find_package(FFmpeg QUIET) find_package(rocdecode QUIET) +find_package(rocdecode-host 1.0.0 QUIET) -if(HIP_FOUND AND FFMPEG_FOUND AND rocdecode_FOUND) +if(HIP_FOUND AND FFMPEG_FOUND AND rocdecode_FOUND AND rocdecode-host_FOUND) # HIP - find_library(rocdecode_HOST_LIBRARY rocdecode-host PATHS ${ROCM_PATH}/lib) set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} hip::host) # FFMPEG include_directories(${AVUTIL_INCLUDE_DIR} ${AVCODEC_INCLUDE_DIR} ${AVFORMAT_INCLUDE_DIR}) set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${FFMPEG_LIBRARIES}) # rocdecode and utils - include_directories (${rocdecode_INCLUDE_DIR} ${ROCM_PATH}/lib) - if(rocdecode_HOST_LIBRARY) - set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocdecode::rocdecode ${rocdecode_HOST_LIBRARY}) - else() - message(FATAL_ERROR "Library rocdecode_HOST_LIBRARY not found!") - endif() + include_directories(${rocdecode_INCLUDE_DIR} ${ROCM_PATH}/lib) + set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocdecode::rocdecode) + # rocdecode-host + include_directories(${rocdecode-host_INCLUDE_DIR}) + set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocdecode::rocdecode-host) + # rocdecode # sample app exe list(APPEND SOURCES ${PROJECT_SOURCE_DIR} rocdecdecode.cpp) @@ -97,5 +97,8 @@ else() if (NOT rocdecode_FOUND) message(FATAL_ERROR "-- ERROR!: rocdecode Not Found! - please install rocdecode!") endif() + if (NOT rocdecode-host_FOUND) + message(FATAL_ERROR "-- ERROR!: rocdecode-host Not Found! - please install rocdecode-host!") + endif() endif() \ No newline at end of file diff --git a/samples/videoDecode/CMakeLists.txt b/samples/videoDecode/CMakeLists.txt index 3933249a8e..212f77d8ed 100644 --- a/samples/videoDecode/CMakeLists.txt +++ b/samples/videoDecode/CMakeLists.txt @@ -63,6 +63,7 @@ endif() find_package(HIP QUIET) find_package(rocdecode QUIET) +find_package(rocdecode-host 1.0.0 QUIET) find_package(rocprofiler-register QUIET) find_package(FFmpeg QUIET) find_package(Threads REQUIRED) @@ -83,13 +84,14 @@ if(HIP_FOUND AND FFMPEG_FOUND AND rocdecode_FOUND AND Threads_FOUND AND rocprofi # rocprofiler-register set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocprofiler-register::rocprofiler-register) # rocdecode-host - find_library(rocdecode_HOST_LIBRARY NAMES rocdecode-host HINTS ${ROCM_PATH}/lib) list(APPEND SOURCES ${PROJECT_SOURCE_DIR} videodecode.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../utils/rocvideodecode/roc_video_dec.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../utils/ffmpegvideodecode/ffmpeg_video_dec.cpp) # sample app exe add_executable(${PROJECT_NAME} ${SOURCES}) set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocdecode::rocdecode) - if(rocdecode_HOST_LIBRARY) - set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${rocdecode_HOST_LIBRARY}) + if(rocdecode-host_FOUND) + # rocdecode-host + include_directories(${rocdecode-host_INCLUDE_DIR}) + set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocdecode::rocdecode-host) target_compile_definitions(${PROJECT_NAME} PUBLIC ENABLE_HOST_DECODE=1) else() target_compile_definitions(${PROJECT_NAME} PUBLIC ENABLE_HOST_DECODE=0) diff --git a/samples/videoDecodePerf/CMakeLists.txt b/samples/videoDecodePerf/CMakeLists.txt index ff5d4efb6c..cb1367c8b3 100644 --- a/samples/videoDecodePerf/CMakeLists.txt +++ b/samples/videoDecodePerf/CMakeLists.txt @@ -63,6 +63,7 @@ endif() find_package(HIP QUIET) find_package(rocdecode QUIET) +find_package(rocdecode-host 1.0.0 QUIET) find_package(rocprofiler-register QUIET) find_package(FFmpeg QUIET) find_package(Threads QUIET) @@ -83,13 +84,13 @@ if(HIP_FOUND AND FFMPEG_FOUND AND rocdecode_FOUND AND Threads_FOUND AND rocprofi set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} Threads::Threads) # rocprofiler-register set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocprofiler-register::rocprofiler-register) - # rocdecode-host - find_library(rocdecode_HOST_LIBRARY NAMES rocdecode-host HINTS ${ROCM_PATH}/lib) # sample app exe list(APPEND SOURCES ${PROJECT_SOURCE_DIR} videodecodeperf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../utils/rocvideodecode/roc_video_dec.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../utils/ffmpegvideodecode/ffmpeg_video_dec.cpp) add_executable(${PROJECT_NAME} ${SOURCES}) - if(rocdecode_HOST_LIBRARY) - set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${rocdecode_HOST_LIBRARY}) + if(rocdecode-host_FOUND) + # rocdecode-host + include_directories(${rocdecode-host_INCLUDE_DIR}) + set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocdecode::rocdecode-host) target_compile_definitions(${PROJECT_NAME} PUBLIC ENABLE_HOST_DECODE=1) else() target_compile_definitions(${PROJECT_NAME} PUBLIC ENABLE_HOST_DECODE=0) diff --git a/src/rocdecode-host/CMakeLists.txt b/src/rocdecode-host/CMakeLists.txt index 421f7e0f15..59e59daf1f 100644 --- a/src/rocdecode-host/CMakeLists.txt +++ b/src/rocdecode-host/CMakeLists.txt @@ -90,6 +90,9 @@ if(HIP_FOUND AND Threads_FOUND AND FFMPEG_FOUND) message("-- ${White}AMD ROCm ${PROJECT_NAME} -- CMAKE_CXX_FLAGS:${CMAKE_CXX_FLAGS}${ColourReset}") message("-- ${White}AMD ROCm ${PROJECT_NAME} -- Link Libraries: ${LINK_LIBRARY_LIST}${ColourReset}") + # Generate BUILD_INFO + configure_file( ${CMAKE_SOURCE_DIR}/api/rocdecode-host_version.h.in ${CMAKE_CURRENT_BINARY_DIR}/rocdecode-host_version.h @ONLY ) + # install rocdecode-host libs -- {ROCM_PATH}/lib set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime NAMELINK_SKIP) @@ -97,7 +100,55 @@ if(HIP_FOUND AND Threads_FOUND AND FFMPEG_FOUND) install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT asan) # install rocdecode include files -- {ROCM_PATH}/include/rocdecode install(FILES ${PROJECT_SOURCE_DIR}/../../api/rocdecode/rocdecode_host.h - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} COMPONENT dev) + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/rocdecode COMPONENT dev) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_version.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/rocdecode COMPONENT dev) + + # Cmake module config file configurations + set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules/" CACHE INTERNAL "Default module path.") + + # Export the package for use from the build-tree + ## (this registers the build-tree with a global CMake-registry) + export(PACKAGE ${PROJECT_NAME}) + set(CONF_LIB_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") + + # Create the rocdecode-config.cmake and rocdecode-config-version files + include(CMakePackageConfigHelpers) + set(CONFIG_PACKAGE_INSTALL_DIR ${CONF_LIB_DIR}/cmake/${PROJECT_NAME}) + set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") + set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}") + set(BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}") + + # Generate config Version File for rocdecode + write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake + VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" + COMPATIBILITY SameMajorVersion + ) + + # Generate Config File for rocdecode + configure_package_config_file( + ${CMAKE_MODULE_PATH}/${PROJECT_NAME}-config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake + INSTALL_DESTINATION ${CONFIG_PACKAGE_INSTALL_DIR} + PATH_VARS LIB_INSTALL_DIR INCLUDE_INSTALL_DIR BIN_INSTALL_DIR + ) + + # Install the rocdecode-config.cmake and rocdecode-config-version.cmake + install(FILES + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" + COMPONENT dev + ) + + # Install the export set for use with the install-tree + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE rocdecode:: + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" + COMPONENT dev + ) else() message("-- ERROR!: ${PROJECT_NAME} excluded! please install all the dependencies and try again!") diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0f756088ca..2dfeaa9916 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -75,6 +75,20 @@ else() else() message("-- ${Yellow}${PROJECT_NAME} requires rocdecode. Install rocdecode before running CTests") endif(rocdecode_FOUND) + find_package(rocdecode-host QUIET) + if(rocdecode-host_FOUND) + message("-- ${White}${PROJECT_NAME}: rocdecode-host found with find_package(rocdecode-host QUIET)${ColourReset}") + message("-- \t${White}rocdecode-host_INCLUDE_DIR -- ${rocdecode-host_INCLUDE_DIR}${ColourReset}") + message("-- \t${White}rocdecode-host_LIB_DIR -- ${rocdecode-host_LIB_DIR}${ColourReset}") + message("-- \t${White}rocdecode-host_LIBRARY -- ${rocdecode-host_LIBRARY}${ColourReset}") + message("-- \t${White}rocdecode-host_FOUND -- ${rocdecode-host_FOUND}${ColourReset}") + message("-- \t${White}rocdecode-host_VERSION -- ${rocdecode-host_VERSION}${ColourReset}") + message("-- \t${White}rocdecode-host_VERSION_MAJOR -- ${rocdecode-host_VERSION_MAJOR}${ColourReset}") + message("-- \t${White}rocdecode-host_VERSION_MINOR -- ${rocdecode-host_VERSION_MINOR}${ColourReset}") + message("-- \t${White}rocdecode-host_VERSION_PATCH -- ${rocdecode-host_VERSION_PATCH}${ColourReset}") + else() + message("-- ${Yellow}${PROJECT_NAME} requires rocdecode-host. Install rocdecode-host before running CTests") + endif(rocdecode-host_FOUND) endif(BUILD_FROM_SOURCE) # 1 - videoDecode HEVC