Arquivos
rocm-systems/projects/rocprofiler-systems/examples/openmp/target/CMakeLists.txt
T
Kian Cossettini 5d582fcd37 [rocprofiler-systems] Add Fortran OpenMP CTests (#874)
* Added Fortran (amdflang) openmp tests using the openmp-vv project

---------

Signed-off-by: David Galiffi <David.Galiffi@amd.com>
Co-authored-by: David Galiffi <David.Galiffi@amd.com>
2025-09-12 09:52:16 -04:00

123 linhas
3.6 KiB
CMake

# Copyright (c) Advanced Micro Devices, Inc.
# SPDX-License-Identifier: MIT
cmake_minimum_required(VERSION 3.21 FATAL_ERROR)
if(NOT OMP_TARGET_COMPILER)
find_program(
amdclangpp_EXECUTABLE
NAMES amdclang++
HINTS ${ROCM_PATH}
ENV ROCM_PATH
/opt/rocm
PATHS ${ROCM_PATH}
ENV ROCM_PATH
/opt/rocm
PATH_SUFFIXES bin llvm/bin
)
mark_as_advanced(amdclangpp_EXECUTABLE)
if(amdclangpp_EXECUTABLE)
set(OMP_TARGET_COMPILER
"${amdclangpp_EXECUTABLE}"
CACHE FILEPATH
"OpenMP target compiler"
)
else()
message(WARNING "OpenMP target compiler not found. Skipping this example.")
return()
endif()
endif()
project(rocprofiler-systems-example-openmp-target-lib LANGUAGES CXX)
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
find_package(Threads REQUIRED)
function(add_offload_flags tgt)
foreach(arch IN LISTS GPU_TARGETS)
target_compile_options(${tgt} PRIVATE --offload-arch=${arch})
target_link_options(${tgt} PUBLIC --offload-arch=${arch})
endforeach()
endfunction()
# Derive the ROCm root
get_filename_component(_omp_bin_dir "${OMP_TARGET_COMPILER}" DIRECTORY)
get_filename_component(ROCM_ROOT_DIR "${_omp_bin_dir}" DIRECTORY)
message(STATUS "Using OpenMP target compiler: ${OMP_TARGET_COMPILER}")
message(STATUS "ROCm root inferred from compiler: ${ROCM_ROOT_DIR}")
# Candidate lib directories for libomptarget across ROCm layouts
set(_LLVM_LIB_HINTS
"${ROCM_ROOT_DIR}/lib"
"${ROCM_ROOT_DIR}/llvm/lib"
"$ENV{ROCM_PATH}/llvm/lib"
"$ENV{ROCM_PATH}/lib/llvm/lib"
"/opt/rocm/llvm/lib"
"/opt/rocm/lib/llvm/lib"
)
# Find libomptarget
find_library(LIBOMPTARGET_SO NAMES omptarget HINTS ${_LLVM_LIB_HINTS})
if(NOT LIBOMPTARGET_SO)
message(FATAL_ERROR "Could not find libomptarget in any of:\n ${_LLVM_LIB_HINTS}")
endif()
# Use the directory that actually contains the library we found
get_filename_component(_rocm_llvm_lib "${LIBOMPTARGET_SO}" DIRECTORY)
set(_rocm_clang_lib "${ROCM_ROOT_DIR}/lib")
set(_COMMON_RPATH "${_rocm_llvm_lib};${_rocm_clang_lib}")
list(REMOVE_DUPLICATES _COMMON_RPATH)
message(STATUS "libomptarget found at: ${LIBOMPTARGET_SO}")
message(STATUS "LLVM libdir: ${_rocm_llvm_lib}")
message(STATUS "Clang libdir: ${_rocm_clang_lib}")
# Shared library
add_library(openmp-target-lib SHARED)
target_sources(openmp-target-lib PRIVATE library.cpp)
target_link_libraries(openmp-target-lib PUBLIC Threads::Threads)
target_compile_options(openmp-target-lib PRIVATE -fopenmp -ggdb)
target_link_options(openmp-target-lib PUBLIC -fopenmp)
add_offload_flags(openmp-target-lib)
# Executable
add_executable(openmp-target)
target_sources(openmp-target PRIVATE main.cpp)
target_link_libraries(openmp-target PRIVATE openmp-target-lib)
target_compile_options(openmp-target PRIVATE -fopenmp -ggdb)
target_link_options(openmp-target PUBLIC -fopenmp)
add_offload_flags(openmp-target)
foreach(tgt openmp-target-lib openmp-target)
set_target_properties(
${tgt}
PROPERTIES
BUILD_RPATH "${_COMMON_RPATH}"
INSTALL_RPATH "${_COMMON_RPATH}"
INSTALL_RPATH_USE_LINK_PATH TRUE
POSITION_INDEPENDENT_CODE ON
)
target_link_options(
${tgt}
PUBLIC
"-L${_rocm_llvm_lib}"
"-Wl,-rpath,${_rocm_llvm_lib}"
"-Wl,-rpath,${_rocm_clang_lib}"
)
endforeach()
rocprofiler_systems_custom_compilation(
TARGET openmp-target-lib
COMPILER ${OMP_TARGET_COMPILER}
)
rocprofiler_systems_custom_compilation(TARGET openmp-target
COMPILER ${OMP_TARGET_COMPILER}
)