1329be958a
Change-Id: I8023f4349621fd81c58615737b7e897649e0f7ca
348 行
13 KiB
CMake
348 行
13 KiB
CMake
cmake_minimum_required(VERSION 2.8.3)
|
|
project(hip)
|
|
|
|
#############################
|
|
# Setup config generation
|
|
#############################
|
|
string(TIMESTAMP _timestamp UTC)
|
|
set(_versionInfo "# Auto-generated by cmake\n")
|
|
set(_buildInfo "# Auto-generated by cmake on ${_timestamp} UTC\n")
|
|
macro(add_to_config _configfile _variable)
|
|
set(${_configfile} "${${_configfile}}${_variable}=${${_variable}}\n")
|
|
endmacro()
|
|
|
|
#############################
|
|
# Setup version information
|
|
#############################
|
|
# Determine HIP_BASE_VERSION
|
|
execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bin/hipconfig --version
|
|
OUTPUT_VARIABLE HIP_BASE_VERSION
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
string(REPLACE "." ";" VERSION_LIST ${HIP_BASE_VERSION})
|
|
list(GET VERSION_LIST 0 HIP_VERSION_MAJOR)
|
|
list(GET VERSION_LIST 1 HIP_VERSION_MINOR)
|
|
|
|
# get date information based on UTC
|
|
# use the last two digits of year + week number + day in the week as HIP_VERSION_PATCH
|
|
# use the commit date, instead of build date
|
|
# add xargs to remove strange trailing newline character
|
|
execute_process(COMMAND git show -s --format=@%ct
|
|
COMMAND xargs
|
|
COMMAND date -f - --utc +%y%U%w
|
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
OUTPUT_VARIABLE HIP_VERSION_PATCH
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
set(HIP_VERSION $HIP_VERSION_MAJOR.$HIP_VERSION_MINOR.$HIP_VERSION_PATCH)
|
|
add_to_config(_versionInfo HIP_VERSION_MAJOR)
|
|
add_to_config(_versionInfo HIP_VERSION_MINOR)
|
|
add_to_config(_versionInfo HIP_VERSION_PATCH)
|
|
|
|
#############################
|
|
# Configure variables
|
|
#############################
|
|
# Determine HIP_PLATFORM
|
|
if(NOT DEFINED HIP_PLATFORM)
|
|
if(NOT DEFINED ENV{HIP_PLATFORM})
|
|
execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bin/hipconfig --platform
|
|
OUTPUT_VARIABLE HIP_PLATFORM
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
else()
|
|
set(HIP_PLATFORM $ENV{HIP_PLATFORM} CACHE STRING "HIP Platform")
|
|
endif()
|
|
endif()
|
|
message(STATUS "HIP Platform: " ${HIP_PLATFORM})
|
|
|
|
# If HIP_PLATFORM is hcc, we need HCC_HOME and HSA_PATH to be defined
|
|
if(HIP_PLATFORM STREQUAL "hcc")
|
|
# Determine HCC_HOME
|
|
if(NOT DEFINED HCC_HOME)
|
|
if(NOT DEFINED ENV{HCC_HOME})
|
|
set(HCC_HOME "/opt/rocm/hcc" CACHE PATH "Path to which HCC has been installed")
|
|
else()
|
|
set(HCC_HOME $ENV{HCC_HOME} CACHE PATH "Path to which HCC has been installed")
|
|
endif()
|
|
endif()
|
|
if(DEFINED ENV{HIP_DEVELOPER})
|
|
add_to_config(_buildInfo HCC_HOME)
|
|
endif()
|
|
if(IS_ABSOLUTE ${HCC_HOME} AND EXISTS ${HCC_HOME} AND IS_DIRECTORY ${HCC_HOME})
|
|
execute_process(COMMAND ${HCC_HOME}/bin/hcc --version
|
|
COMMAND cut -d\ -f9
|
|
OUTPUT_VARIABLE HCC_VERSION
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
message(STATUS "Looking for HCC in: " ${HCC_HOME} ". Found version: " ${HCC_VERSION})
|
|
else()
|
|
message(FATAL_ERROR "Don't know where to find HCC. Please specify abolute path using -DHCC_HOME")
|
|
endif()
|
|
add_to_config(_buildInfo HCC_VERSION)
|
|
|
|
# Determine HSA_PATH
|
|
if(NOT DEFINED HSA_PATH)
|
|
if(NOT DEFINED ENV{HSA_PATH})
|
|
set(HSA_PATH "/opt/rocm/hsa" CACHE PATH "Path to which HSA runtime has been installed")
|
|
else()
|
|
set(HSA_PATH $ENV{HSA_PATH} CACHE PATH "Path to which HSA runtime has been installed")
|
|
endif()
|
|
endif()
|
|
if(IS_ABSOLUTE ${HSA_PATH} AND EXISTS ${HSA_PATH} AND IS_DIRECTORY ${HSA_PATH})
|
|
message(STATUS "Looking for HSA runtime in: " ${HSA_PATH})
|
|
else()
|
|
message(FATAL_ERROR "Don't know where to find HSA runtime. Please specify absolute path using -DHSA_PATH")
|
|
endif()
|
|
endif()
|
|
|
|
# Set default build type
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE "Release")
|
|
endif()
|
|
|
|
# Determine HIP install path
|
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND CMAKE_INSTALL_PREFIX MATCHES "/usr/local")
|
|
if(CMAKE_BUILD_TYPE MATCHES Debug)
|
|
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "Installation path for HIP" FORCE)
|
|
elseif(CMAKE_BUILD_TYPE MATCHES Release)
|
|
set(CMAKE_INSTALL_PREFIX "/opt/rocm/hip" CACHE PATH "Installation path for HIP" FORCE)
|
|
else()
|
|
message(FATAL_ERROR "Invalid CMAKE_BUILD_TYPE specified. Valid values are Debug and Release")
|
|
endif()
|
|
endif()
|
|
if(IS_ABSOLUTE ${CMAKE_INSTALL_PREFIX})
|
|
message(STATUS "HIP will be installed in: " ${CMAKE_INSTALL_PREFIX})
|
|
else()
|
|
message(FATAL_ERROR "Don't know where to install HIP. Please specify absolute path using -DCMAKE_INSTALL_PREFIX")
|
|
endif()
|
|
|
|
# Set if we need to build shared or static library
|
|
if(NOT DEFINED HIP_LIB_TYPE)
|
|
if(NOT DEFINED ENV{HIP_LIB_TYPE})
|
|
set(HIP_LIB_TYPE 1)
|
|
else()
|
|
set(HIP_LIB_TYPE $ENV{HIP_LIB_TYPE})
|
|
endif()
|
|
endif()
|
|
add_to_config(_buildInfo HIP_LIB_TYPE)
|
|
|
|
# Check if we need to build hipify-clang
|
|
if(NOT DEFINED HIPIFY_CLANG_LLVM_DIR)
|
|
if(DEFINED ENV{HIPIFY_CLANG_LLVM_DIR})
|
|
set(HIPIFY_CLANG_LLVM_DIR $ENV{HIPIFY_CLANG_LLVM_DIR})
|
|
endif()
|
|
endif()
|
|
|
|
# Check if we need to enable ATP marker
|
|
if(NOT DEFINED COMPILE_HIP_ATP_MARKER)
|
|
if(NOT DEFINED ENV{COMPILE_HIP_ATP_MARKER})
|
|
set(COMPILE_HIP_ATP_MARKER 0)
|
|
else()
|
|
set(COMPILE_HIP_ATP_MARKER $ENV{COMPILE_HIP_ATP_MARKER})
|
|
endif()
|
|
endif()
|
|
add_to_config(_buildInfo COMPILE_HIP_ATP_MARKER)
|
|
|
|
#############################
|
|
# Build steps
|
|
#############################
|
|
# Rebuild cmake cache updates .hipInfo and .hipVersion
|
|
add_custom_target(update_build_and_version_info ALL COMMAND make rebuild_cache)
|
|
|
|
# Build clang hipify if enabled
|
|
add_subdirectory(hipify-clang)
|
|
|
|
# Build hip_hcc if platform is hcc
|
|
if(HIP_PLATFORM STREQUAL "hcc")
|
|
include_directories(${PROJECT_SOURCE_DIR}/include)
|
|
set(HIP_HCC_BUILD_FLAGS)
|
|
if(COMPILE_HIP_ATP_MARKER)
|
|
include_directories(/opt/rocm/profiler/CXLActivityLogger/include)
|
|
set(HIP_HCC_BUILD_FLAGS "${HIP_HCC_BUILD_FLAGS} -DCOMPILE_HIP_ATP_MARKER=1")
|
|
endif()
|
|
|
|
# Add HIP_VERSION to CMAKE_<LANG>_FLAGS
|
|
set(HIP_HCC_BUILD_FLAGS "${HIP_HCC_BUILD_FLAGS} -DHIP_VERSION_MAJOR=${HIP_VERSION_MAJOR} -DHIP_VERSION_MINOR=${HIP_VERSION_MINOR} -DHIP_VERSION_PATCH=${HIP_VERSION_PATCH}")
|
|
|
|
# Add remaining flags
|
|
set(HIP_HCC_BUILD_FLAGS "${HIP_HCC_BUILD_FLAGS} -fPIC -hc -I${HCC_HOME}/include -I${HSA_PATH}/include -I/opt/rocm/libhsakmt/include -stdlib=libc++")
|
|
|
|
# Set compiler and compiler flags
|
|
set(CMAKE_CXX_COMPILER "${HCC_HOME}/bin/hcc")
|
|
set(CMAKE_C_COMPILER "${HCC_HOME}/bin/hcc")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${HIP_HCC_BUILD_FLAGS}")
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${HIP_HCC_BUILD_FLAGS}")
|
|
|
|
set(SOURCE_FILES src/device_util.cpp
|
|
src/hip_hcc.cpp
|
|
src/hip_context.cpp
|
|
src/hip_device.cpp
|
|
src/hip_error.cpp
|
|
src/hip_event.cpp
|
|
src/hip_ldg.cpp
|
|
src/hip_memory.cpp
|
|
src/hip_peer.cpp
|
|
src/hip_stream.cpp
|
|
src/hip_fp16.cpp
|
|
src/hip_module.cpp)
|
|
|
|
if(${HIP_LIB_TYPE} EQUAL 0)
|
|
add_library(hip_hcc OBJECT ${SOURCE_FILES})
|
|
elseif(${HIP_LIB_TYPE} EQUAL 1)
|
|
add_library(hip_hcc STATIC ${SOURCE_FILES})
|
|
else()
|
|
add_library(hip_hcc SHARED ${SOURCE_FILES})
|
|
endif()
|
|
|
|
# Generate hcc_version.txt
|
|
add_custom_target(query_hcc_version COMMAND ${HCC_HOME}/bin/hcc --version > ${PROJECT_BINARY_DIR}/hcc_version.tmp)
|
|
add_custom_target(check_hcc_version COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_BINARY_DIR}/hcc_version.tmp ${PROJECT_BINARY_DIR}/hcc_version.txt DEPENDS query_hcc_version)
|
|
set_source_files_properties(${PROJECT_BINARY_DIR}/hcc_version.txt PROPERTIES GENERATED TRUE)
|
|
set_source_files_properties(${SOURCE_FILES} PROPERTIES OBJECT_DEPENDS ${PROJECT_BINARY_DIR}/hcc_version.txt)
|
|
add_dependencies(hip_hcc check_hcc_version update_build_and_version_info)
|
|
|
|
# Generate .hipInfo
|
|
file(WRITE "${PROJECT_BINARY_DIR}/.hipInfo" ${_buildInfo})
|
|
endif()
|
|
|
|
# Generate .hipVersion
|
|
file(WRITE "${PROJECT_BINARY_DIR}/.hipVersion" ${_versionInfo})
|
|
|
|
# Build doxygen documentation
|
|
add_custom_target(doc COMMAND HIP_PATH=${CMAKE_CURRENT_SOURCE_DIR} doxygen ${CMAKE_CURRENT_SOURCE_DIR}/docs/doxygen-input/doxy.cfg
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/docs)
|
|
|
|
#############################
|
|
# Install steps
|
|
#############################
|
|
# Install hip_hcc if platform is hcc
|
|
if(HIP_PLATFORM STREQUAL "hcc")
|
|
if(${HIP_LIB_TYPE} EQUAL 0)
|
|
install(DIRECTORY ${PROJECT_BINARY_DIR}/CMakeFiles/hip_hcc.dir/src/ DESTINATION lib)
|
|
else()
|
|
install(TARGETS hip_hcc DESTINATION lib)
|
|
endif()
|
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/hip_ir.ll DESTINATION lib)
|
|
|
|
# Install .hipInfo
|
|
install(FILES ${PROJECT_BINARY_DIR}/.hipInfo DESTINATION lib)
|
|
endif()
|
|
|
|
# Install .hipVersion
|
|
install(FILES ${PROJECT_BINARY_DIR}/.hipVersion DESTINATION bin)
|
|
|
|
# Install src, bin, include & cmake if necessary
|
|
execute_process(COMMAND test ${CMAKE_INSTALL_PREFIX} -ef ${CMAKE_CURRENT_SOURCE_DIR}
|
|
RESULT_VARIABLE INSTALL_SOURCE)
|
|
if(NOT ${INSTALL_SOURCE} EQUAL 0)
|
|
install(DIRECTORY src DESTINATION .)
|
|
install(DIRECTORY bin DESTINATION . USE_SOURCE_PERMISSIONS)
|
|
install(DIRECTORY include DESTINATION .)
|
|
install(DIRECTORY cmake DESTINATION .)
|
|
endif()
|
|
|
|
#############################
|
|
# Packaging steps
|
|
#############################
|
|
# Package: hip_base
|
|
set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/packages/hip_base)
|
|
configure_file(packaging/hip_base.txt ${BUILD_DIR}/CMakeLists.txt @ONLY)
|
|
configure_file(packaging/hip_base.postinst ${BUILD_DIR}/postinst @ONLY)
|
|
configure_file(packaging/hip_base.prerm ${BUILD_DIR}/prerm @ONLY)
|
|
if(NOT BUILD_HIPIFY_CLANG)
|
|
add_custom_target(pkg_hip_base COMMAND ${CMAKE_COMMAND} .
|
|
COMMAND rm -rf *.deb *.rpm *.tar.gz
|
|
COMMAND make package
|
|
COMMAND cp *.deb ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.rpm ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.tar.gz ${PROJECT_BINARY_DIR}
|
|
WORKING_DIRECTORY ${BUILD_DIR})
|
|
else()
|
|
add_custom_target(pkg_hip_base COMMAND ${CMAKE_COMMAND} .
|
|
COMMAND rm -rf *.deb *.rpm *.tar.gz
|
|
COMMAND make package
|
|
COMMAND cp *.deb ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.rpm ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.tar.gz ${PROJECT_BINARY_DIR}
|
|
WORKING_DIRECTORY ${BUILD_DIR}
|
|
DEPENDS hipify-clang)
|
|
endif()
|
|
|
|
# Package: hip_hcc
|
|
set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/packages/hip_hcc)
|
|
configure_file(packaging/hip_hcc.txt ${BUILD_DIR}/CMakeLists.txt @ONLY)
|
|
configure_file(packaging/hip_hcc.postinst ${BUILD_DIR}/postinst @ONLY)
|
|
configure_file(packaging/hip_hcc.prerm ${BUILD_DIR}/prerm @ONLY)
|
|
add_custom_target(pkg_hip_hcc COMMAND ${CMAKE_COMMAND} .
|
|
COMMAND rm -rf *.deb *.rpm *.tar.gz
|
|
COMMAND make package
|
|
COMMAND cp *.deb ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.rpm ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.tar.gz ${PROJECT_BINARY_DIR}
|
|
WORKING_DIRECTORY ${BUILD_DIR}
|
|
DEPENDS hip_hcc)
|
|
|
|
# Package: hip_nvcc
|
|
set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/packages/hip_nvcc)
|
|
configure_file(packaging/hip_nvcc.txt ${BUILD_DIR}/CMakeLists.txt @ONLY)
|
|
add_custom_target(pkg_hip_nvcc COMMAND ${CMAKE_COMMAND} .
|
|
COMMAND rm -rf *.deb *.rpm *.tar.gz
|
|
COMMAND make package
|
|
COMMAND cp *.deb ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.rpm ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.tar.gz ${PROJECT_BINARY_DIR}
|
|
WORKING_DIRECTORY ${BUILD_DIR})
|
|
|
|
# Package: hip_doc
|
|
set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/packages/hip_doc)
|
|
configure_file(packaging/hip_doc.txt ${BUILD_DIR}/CMakeLists.txt @ONLY)
|
|
add_custom_target(pkg_hip_doc COMMAND ${CMAKE_COMMAND} .
|
|
COMMAND rm -rf *.deb *.rpm *.tar.gz
|
|
COMMAND make package
|
|
COMMAND cp *.deb ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.rpm ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.tar.gz ${PROJECT_BINARY_DIR}
|
|
WORKING_DIRECTORY ${BUILD_DIR})
|
|
|
|
# Package: hip_samples
|
|
set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/packages/hip_samples)
|
|
configure_file(packaging/hip_samples.txt ${BUILD_DIR}/CMakeLists.txt @ONLY)
|
|
add_custom_target(pkg_hip_samples COMMAND ${CMAKE_COMMAND} .
|
|
COMMAND rm -rf *.deb *.rpm *.tar.gz
|
|
COMMAND make package
|
|
COMMAND cp *.deb ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.rpm ${PROJECT_BINARY_DIR}
|
|
COMMAND cp *.tar.gz ${PROJECT_BINARY_DIR}
|
|
WORKING_DIRECTORY ${BUILD_DIR})
|
|
|
|
# Package: all
|
|
if(POLICY CMP0037)
|
|
cmake_policy(PUSH)
|
|
cmake_policy(SET CMP0037 OLD)
|
|
endif()
|
|
add_custom_target(package DEPENDS pkg_hip_base pkg_hip_hcc pkg_hip_nvcc pkg_hip_doc pkg_hip_samples)
|
|
if(POLICY CMP0037)
|
|
cmake_policy(POP)
|
|
endif()
|
|
|
|
#############################
|
|
# Testing steps
|
|
#############################
|
|
# Target: test
|
|
set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/hip_tests)
|
|
configure_file(tests/hip_tests.txt ${BUILD_DIR}/CMakeLists.txt @ONLY)
|
|
if(POLICY CMP0037)
|
|
cmake_policy(PUSH)
|
|
cmake_policy(SET CMP0037 OLD)
|
|
endif()
|
|
add_custom_target(install_for_test COMMAND "${CMAKE_COMMAND}" --build . --target install
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
|
execute_process(COMMAND getconf _NPROCESSORS_ONLN OUTPUT_VARIABLE DASH_JAY OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
add_custom_target(test COMMAND ${CMAKE_COMMAND} .
|
|
COMMAND make -j ${DASH_JAY}
|
|
COMMAND make test
|
|
WORKING_DIRECTORY ${BUILD_DIR}
|
|
DEPENDS install_for_test)
|
|
if(POLICY CMP0037)
|
|
cmake_policy(POP)
|
|
endif()
|
|
|
|
# vim: ts=4:sw=4:expandtab:smartindent
|