Files
TheRock/rocm-systems/projects/rocprofiler-systems/external/timemory/cmake/Modules/FindUPCXX.cmake
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

510 lines
20 KiB
CMake

#[=======================================================================[.rst:
UPCXXConfig
-------
Configuration for UPC++.
UPC++ is a C++ library that supports Partitioned Global Address Space
(PGAS) programming, and is designed to interoperate smoothly and
efficiently with MPI, OpenMP, CUDA and AMTs. It leverages GASNet-EX to
deliver low-overhead, fine-grained communication, including Remote Memory
Access (RMA) and Remote Procedure Call (RPC).
This module checks if either the upcxx-meta utility can be found in the path
or in the bin sub-directory located inside the path pointed by the
``UPCXX_INSTALL`` environment variable if it is defined.
#]=======================================================================]
# Try to find the UPCXX library, headers, compile options, etc. Basic usage of this module
# is as follows:
#
# find_package(UPCXX) if(UPCXX_FOUND) add_executable(foo foo.cc) target_link_libraries(foo
# UPCXX::upcxx) endif()
#
# You can provide a minimum version number that should be used. If you provide this
# version number and specify the REQUIRED attribute, this module will fail if it can't
# find a UPCXX of the specified version or higher. If you further specify the EXACT
# attribute, then this module will fail if it can't find a UPCXX with a version eaxctly as
# specified.
#
# ===========================================================================
# Variables used by this module which can be used to change the default behaviour, and
# hence need to be set before calling find_package:
#
# ENV UPCXX_INSTALL Used to find path to upcxx-meta
#
# UPCXX_ROOT_DIR Used to find path to upcxx-meta if UPCXX_INSTALL not provided
#
# UPCXX_TARGET_NAME Default is "upcxx" to create UPCXX::upcxx interface library. If
# multiple configurations are needed. Pair changing this variable with the COMPONENTS
# field in find_package, e.g.
#
# set(UPCXX_TARGET_NAME upcxx-seq-debug) find_package(UPCXX COMPONENTS par debug)
#
# set(UPCXX_TARGET_NAME upcxx-par-opt) find_package(UPCXX COMPONENTS seq O3)
#
# target_link_libraries(foo-debug UPCXX::upcxx-seq-debug) target_link_libraries(foo-opt
# UPCXX::upcxx-par-opt)
#
# ============================================================================
# Variables set by this module:
#
# UPCXX_FOUND System has UPCXX.
#
# UPCXX_INCLUDE_DIRS UPCXX include directories: not cached.
#
# UPCXX_LIBRARIES Link to these to use the UPCXX library: not cached.
#
# UPCXX_OPTIONS Compiler flags for C++
#
# UPCXX_LINK_OPTIONS Linker flags
#
# UPCXX_DEFINITIONS Pre-processor definitions
#
# UPCXX_CXX_STANDARD C++ language standard
#
# UPCXX_CXX_STD_FLAG C++ language standard flag used by UPC++ compiler
#
cmake_minimum_required(VERSION 3.6)
cmake_policy(PUSH)
# ensure that IN_LIST operator is not ignored:
# https://cmake.org/cmake/help/v3.3/policy/CMP0057.html
cmake_policy(SET CMP0057 NEW)
# these are the variables set in the script unset them in case multiple configurations are
# generated
set(UPCXX_VARIABLES
UPCXX_FOUND
UPCXX_META_EXECUTABLE
UPCXX_INCLUDE_DIRS
UPCXX_LIBRARIES
UPCXX_DEFINITIONS
UPCXX_CXX_STANDARD
UPCXX_OPTIONS
UPCXX_LINK_OPTIONS
UPCXX_COMPATIBLE_COMPILER)
foreach(_VAR ${UPCXX_VARIABLES})
unset(${_VAR})
endforeach()
# option for verbosity
option(UPCXX_VERBOSE "Verbose UPC++ detection" OFF)
mark_as_advanced(UPCXX_VERBOSE)
function(UPCXX_VERB MESSAGE)
if(UPCXX_VERBOSE OR DEFINED ENV{UPCXX_VERBOSE})
message(STATUS "${MESSAGE}")
endif()
endfunction()
# default to no preference
set(UPCXX_THREADMODE
""
CACHE STRING "UPC++ thread-mode")
set(UPCXX_CODEMODE
""
CACHE STRING "UPC++ code mode")
set(UPCXX_NETWORK
""
CACHE STRING "UPC++ networking mode")
# these appear to have defaults but thread-mode does not
mark_as_advanced(UPCXX_THREADMODE UPCXX_CODEMODE UPCXX_NETWORK)
# for IN_LIST checks
set(UPCXX_THREADMODE_STRINGS "seq" "par")
set(UPCXX_CODEMODE_STRINGS "O3" "debug")
set(UPCXX_NETWORK_STRINGS "ibv" "aries" "smp" "udp" "mpi")
# set options in GUI
set_property(CACHE UPCXX_THREADMODE PROPERTY STRINGS "${UPCXX_THREADMODE_STRINGS}")
set_property(CACHE UPCXX_CODEMODE PROPERTY STRINGS "${UPCXX_CODEMODE_STRINGS}")
set_property(CACHE UPCXX_NETWORK PROPERTY STRINGS "${UPCXX_NETWORK_STRINGS}")
# macro for checking if value is in list of possible options
macro(UPCXX_CHECK_PROPERTY_STRING _TYPE)
if(NOT "${UPCXX_${_TYPE}}" IN_LIST UPCXX_${_TYPE}_STRINGS)
message(
FATAL_ERROR
"Invalid value for UPCXX_${_TYPE}: '${UPCXX_${_TYPE}}'. Valid options: '${UPCXX_${_TYPE}_STRINGS}'"
)
endif()
endmacro()
# ----------------------------------------------------------------------------------------#
#
# UPCXX_THREADMODE
#
# ----------------------------------------------------------------------------------------#
if((UPCXX_THREADMODE STREQUAL "" OR NOT DEFINED UPCXX_THREADMODE)
AND "$ENV{UPCXX_THREADMODE}" STREQUAL "")
# if find_package(Threads) set Threads_FOUND previously, this suggests threading is
# used by the application and would be a good default but otherwise, leave blank
if(Threads_FOUND)
set(UPCXX_THREADMODE "par")
else()
set(UPCXX_THREADMODE "seq")
endif()
elseif(UPCXX_THREADMODE)
upcxx_check_property_string(THREADMODE)
endif()
# ----------------------------------------------------------------------------------------#
#
# UPCXX_CODEMODE
#
# ----------------------------------------------------------------------------------------#
if((UPCXX_CODEMODE STREQUAL "" OR NOT DEFINED UPCXX_CODEMODE) AND "$ENV{UPCXX_CODEMODE}"
STREQUAL "")
# use CMAKE_BUILD_TYPE to provide a default choice
if("${CMAKE_BUILD_TYPE}" MATCHES "Debug")
set(UPCXX_CODEMODE "debug")
elseif("${CMAKE_BUILD_TYPE}" MATCHES "Release|RelWithDebInfo|MinSizeRel")
set(UPCXX_CODEMODE "O3")
endif()
elseif(UPCXX_CODEMODE)
upcxx_check_property_string(CODEMODE)
endif()
# ----------------------------------------------------------------------------------------#
#
# UPCXX_NETWORK
#
# ----------------------------------------------------------------------------------------#
if((UPCXX_NETWORK STREQUAL "" OR NOT DEFINED UPCXX_NETWORK) AND "$ENV{UPCXX_NETWORK}"
STREQUAL "")
# no defaults provided -- let upcxx-meta choose
elseif(UPCXX_NETWORK)
upcxx_check_property_string(NETWORK)
endif()
# ----------------------------------------------------------------------------------------#
#
# UPCXX_FIND_COMPONENTS, e.g: find_package(UPCXX COMPONENTS udp seq debug)
#
# ----------------------------------------------------------------------------------------#
# for the find_package_handle_standard_args
set(UPCXX_FOUND_COMPONENTS)
# loop over all components requested, e.g. find_package(UPCXX COMPONENTS udp seq debug)
foreach(_COMPONENT ${UPCXX_FIND_COMPONENTS})
foreach(_VAR THREADMODE CODEMODE NETWORK)
if("${_COMPONENT}" IN_LIST UPCXX_${_VAR}_STRINGS)
# remove the item from the missing list
list(REMOVE_ITEM UPCXX_FIND_COMPONENTS "${_COMPONENT}")
list(APPEND UPCXX_FOUND_COMPONENTS "${_COMPONENT}")
# set the variable
set(UPCXX_${_VAR} "${_COMPONENT}")
endif()
endforeach()
endforeach()
if(UPCXX_FOUND_COMPONENTS AND NOT UPCXX_FIND_QUIETLY)
message(STATUS "UPCXX found components: ${UPCXX_FOUND_COMPONENTS}")
endif()
# ----------------------------------------------------------------------------------------#
#
# Propagate to environment
#
# ----------------------------------------------------------------------------------------#
foreach(_VAR THREADMODE CODEMODE NETWORK)
if(UPCXX_${_VAR})
# set the variable in the environment for upcxx-meta
set(ENV{UPCXX_${_VAR}} "${UPCXX_${_VAR}}")
endif()
endforeach()
# Set up some auxillary vars if hints have been set
if(DEFINED ENV{UPCXX_INSTALL})
find_program(
UPCXX_META_EXECUTABLE upcxx-meta
HINTS "$ENV{UPCXX_INSTALL}/bin"
NO_DEFAULT_PATH)
else()
find_program(
UPCXX_META_EXECUTABLE upcxx-meta
HINTS UPCXX_ROOT_DIR ENV UPCXX_ROOT_DIR
PATH_SUFFIXES bin)
endif()
if(NOT EXISTS "${UPCXX_META_EXECUTABLE}" AND NOT UPCXX_FIND_QUIETLY)
message(
WARNING
"Failed to find UPC++ command interface 'upcxx-meta'. Please set UPCXX_INSTALL=/path/to/upcxx or add /path/to/upcxx/bin to $PATH"
)
endif()
if(UPCXX_META_EXECUTABLE)
execute_process(
COMMAND ${UPCXX_META_EXECUTABLE} CXXFLAGS
OUTPUT_VARIABLE UPCXX_CXXFLAGS
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND ${UPCXX_META_EXECUTABLE} CPPFLAGS
OUTPUT_VARIABLE UPCXX_CPPFLAGS
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND ${UPCXX_META_EXECUTABLE} LIBS
OUTPUT_VARIABLE UPCXX_LIBFLAGS
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND ${UPCXX_META_EXECUTABLE} LDFLAGS
OUTPUT_VARIABLE UPCXX_LDFLAGS
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND ${UPCXX_META_EXECUTABLE} CXX
OUTPUT_VARIABLE UPCXX_CXX_COMPILER
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND ${UPCXX_META_EXECUTABLE} GASNET_CONDUIT
OUTPUT_VARIABLE UPCXX_NETWORK
OUTPUT_STRIP_TRAILING_WHITESPACE)
list(APPEND UPCXX_LIBRARIES ${UPCXX_LIBFLAGS})
# move any embedded options from UPCXX_CXX_COMPILER to UPCXX_CXXFLAGS
if(UPCXX_CXX_COMPILER MATCHES "[ \t\n]+(.+)$")
upcxx_verb("embedded CXX options: ${CMAKE_MATCH_0}")
string(REGEX REPLACE "[ \t\n]+.+$" "" UPCXX_CXX_COMPILER ${UPCXX_CXX_COMPILER})
set(UPCXX_CXXFLAGS "${CMAKE_MATCH_0} ${UPCXX_CXXFLAGS}")
string(STRIP ${UPCXX_CXXFLAGS} UPCXX_CXXFLAGS)
endif()
upcxx_verb("UPCXX_CXX_COMPILER=${UPCXX_CXX_COMPILER}")
upcxx_verb("CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}")
# get absolute path, resolving symbolic links, of UPCXX_CXX_COMPILER
get_filename_component(ABS_UPCXX_CXX_PATH "${UPCXX_CXX_COMPILER}" REALPATH CACHE)
if(NOT EXISTS "${ABS_UPCXX_CXX_PATH}" AND NOT UPCXX_FIND_QUIETLY)
message(
WARNING
"CANNOT FIND ABSOLUTE PATH TO UPCXX_CXX_COMPILER (${UPCXX_CXX_COMPILER})")
set(ABS_UPCXX_CXX_PATH "${UPCXX_CXX_COMPILER}")
endif()
# get absolute path, resolving symbolic links, of CMAKE_CXX_COMPILER
get_filename_component(ABS_CMAKE_CXX_PATH ${CMAKE_CXX_COMPILER} REALPATH CACHE)
upcxx_verb("ABS_UPCXX_CXX_PATH=${ABS_UPCXX_CXX_PATH}")
upcxx_verb("ABS_CMAKE_CXX_PATH=${ABS_CMAKE_CXX_PATH}")
set(UPCXX_COMPATIBLE_COMPILER FALSE)
# compare the files -- generally more reliable than string parse + compare
execute_process(COMMAND ${CMAKE_COMMAND} -E compare_files ${ABS_UPCXX_CXX_PATH}
${ABS_CMAKE_CXX_PATH} RESULT_VARIABLE COMPILER_FILE_DIFF)
if(("${ABS_UPCXX_CXX_PATH}" STREQUAL "${ABS_CMAKE_CXX_PATH}") OR (COMPILER_FILE_DIFF
EQUAL 0))
set(UPCXX_COMPATIBLE_COMPILER TRUE)
else()
get_filename_component(UPCXX_CXX_NAME ${ABS_UPCXX_CXX_PATH} NAME)
get_filename_component(CMAKE_CXX_NAME ${ABS_CMAKE_CXX_PATH} NAME)
upcxx_verb("compiler names: ${UPCXX_CXX_NAME} vs ${CMAKE_CXX_NAME}")
if("${UPCXX_CXX_NAME}" STREQUAL "${CMAKE_CXX_NAME}")
# compare the versions
execute_process(COMMAND ${UPCXX_CXX_COMPILER} --version
OUTPUT_VARIABLE UPCXX_CXX_COMPILER_VERSION)
string(REPLACE "\n" " " UPCXX_CXX_COMPILER_VERSION
${UPCXX_CXX_COMPILER_VERSION})
execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version
OUTPUT_VARIABLE LOC_CMAKE_CXX_COMPILER_VERSION)
string(REPLACE "\n" " " LOC_CMAKE_CXX_COMPILER_VERSION
${LOC_CMAKE_CXX_COMPILER_VERSION})
# message(STATUS "${UPCXX_CXX_COMPILER_VERSION} vs
# ${LOC_CMAKE_CXX_COMPILER_VERSION}")
if("${UPCXX_CXX_COMPILER_VERSION}" STREQUAL
"${LOC_CMAKE_CXX_COMPILER_VERSION}")
set(UPCXX_COMPATIBLE_COMPILER TRUE)
endif()
endif()
endif()
if(NOT UPCXX_COMPATIBLE_COMPILER AND NOT UPCXX_FIND_QUIETLY)
message(
WARNING
"Compiler compatibility check failed!\nUPCXX compiler provided by upcxx-meta CXX:\n ${UPCXX_CXX_COMPILER} ->\n ${ABS_UPCXX_CXX_PATH}\nis different from CMAKE_CXX_COMPILER:\n ${CMAKE_CXX_COMPILER} ->\n ${ABS_CMAKE_CXX_PATH}\n\nPlease either pass cmake: -DCMAKE_CXX_COMPILER=${UPCXX_CXX_COMPILER}\nor re-install UPC++ with: CXX=${CMAKE_CXX_COMPILER}\n"
)
endif()
unset(ABS_UPCXX_CXX_PATH)
unset(ABS_CMAKE_CXX_PATH)
unset(UPCXX_CXX_NAME)
unset(CMAKE_CXX_NAME)
unset(UPCXX_CXX_COMPILER_VERSION)
unset(COMPILER_FILE_DIFF)
# now separate include dirs from flags
if(UPCXX_CPPFLAGS)
string(REGEX REPLACE "[ ]+" ";" UPCXX_CPPFLAGS ${UPCXX_CPPFLAGS})
foreach(option ${UPCXX_CPPFLAGS})
string(STRIP ${option} option)
string(REGEX MATCH "^-I" UPCXX_INCLUDE ${option})
if(UPCXX_INCLUDE)
string(REGEX REPLACE "^-I" "" option ${option})
list(APPEND UPCXX_INCLUDE_DIRS ${option})
else()
string(REGEX MATCH "^-D" UPCXX_DEFINE ${option})
if(UPCXX_DEFINE)
string(REGEX REPLACE "^-D" "" option ${option})
list(APPEND UPCXX_DEFINITIONS ${option})
else()
list(APPEND UPCXX_OPTIONS ${option})
endif()
endif()
endforeach()
endif()
if(UPCXX_LDFLAGS)
string(REGEX REPLACE "[ ]+" ";" UPCXX_LDFLAGS ${UPCXX_LDFLAGS})
foreach(option ${UPCXX_LDFLAGS})
string(STRIP ${option} option)
if(option MATCHES "^-O" AND CMAKE_BUILD_TYPE)
# filter -O options when CMake is handling that
else()
list(APPEND UPCXX_LINK_OPTIONS ${option})
endif()
endforeach()
endif()
# extract the required cxx standard from the flags
if(UPCXX_CXXFLAGS)
string(REGEX REPLACE "[ ]+" ";" UPCXX_CXXFLAGS ${UPCXX_CXXFLAGS})
foreach(option ${UPCXX_CXXFLAGS})
if(option MATCHES "^-+std=(c|gnu)\\+\\+([0-9]+)")
set(UPCXX_CXX_STD_FLAG ${option})
set(UPCXX_CXX_STANDARD ${CMAKE_MATCH_2})
elseif(option MATCHES "^-O" AND CMAKE_BUILD_TYPE)
# filter -O options when CMake is handling that
else()
list(APPEND UPCXX_OPTIONS ${option})
endif()
endforeach()
endif()
unset(UPCXX_CXXFLAGS)
unset(UPCXX_LIBFLAGS)
unset(UPCXX_CPPFLAGS)
unset(UPCXX_LDFLAGS)
unset(UPCXX_INCLUDE)
unset(UPCXX_DEFINE)
endif()
foreach(dir ${UPCXX_INCLUDE_DIRS})
if(EXISTS ${dir}/upcxx/upcxx.hpp)
set(version_pattern "#[\t ]*define[\t ]+UPCXX_VERSION[\t ]+([0-9]+)")
# message(STATUS "checking ${dir}/upcxx/upcxx.hpp for ${version_pattern}" )
file(STRINGS ${dir}/upcxx/upcxx.hpp upcxx_version REGEX ${version_pattern})
# message(STATUS "upcxx_version ${upcxx_version}" )
if(${upcxx_version} MATCHES ${version_pattern})
set(UPCXX_VERSION_STRING ${CMAKE_MATCH_1})
endif()
unset(upcxx_version)
unset(version_pattern)
endif()
endforeach()
# CMake bug #15826: CMake's ill-advised deduplication mis-feature breaks certain types of
# compiler arguments, see: https://gitlab.kitware.com/cmake/cmake/issues/15826 Here we
# workaround the problem as best we can to prevent compile failures
function(UPCXX_FIX_FRAGILE_OPTS var)
set(fragile_option_pat ";(-+param);([^;]+);")
set(temp ";${${var}};")
while(temp MATCHES "${fragile_option_pat}")
# should NOT need a loop here, but regex replace is buggy, at least in cmake 3.6
if(CMAKE_VERSION VERSION_LESS 3.12.0)
# no known workaround, must strip these options
string(REGEX REPLACE "${fragile_option_pat}" ";" temp "${temp}")
else()
# use the SHELL: prefix introduced in cmake 3.12
string(REGEX REPLACE "${fragile_option_pat}" ";SHELL:\\1 \\2;" temp "${temp}")
endif()
endwhile()
list(FILTER temp EXCLUDE REGEX "^$") # strip surrounding empties
set("${var}"
"${temp}"
PARENT_SCOPE)
endfunction()
upcxx_fix_fragile_opts(UPCXX_OPTIONS)
upcxx_fix_fragile_opts(UPCXX_LINK_OPTIONS)
# Determine if we've found UPCXX
mark_as_advanced(
UPCXX_FOUND
UPCXX_META_EXECUTABLE
UPCXX_INCLUDE_DIRS
UPCXX_LIBRARIES
UPCXX_DEFINITIONS
UPCXX_CXX_STANDARD
UPCXX_OPTIONS
UPCXX_LINK_OPTIONS
UPCXX_COMPATIBLE_COMPILER)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
UPCXX
REQUIRED_VARS UPCXX_META_EXECUTABLE UPCXX_LIBRARIES UPCXX_INCLUDE_DIRS
UPCXX_DEFINITIONS UPCXX_LINK_OPTIONS UPCXX_COMPATIBLE_COMPILER
VERSION_VAR UPCXX_VERSION_STRING
HANDLE_COMPONENTS)
if(NOT UPCXX_FIND_QUIETLY)
if(NOT "${UPCXX_CXX_STANDARD}" STREQUAL "${CMAKE_CXX_STANDARD}")
message(STATUS "UPC++ requires the c++${UPCXX_CXX_STANDARD} standard.")
endif()
message(STATUS "UPCXX_NETWORK=${UPCXX_NETWORK}")
message(STATUS "UPCXX_THREADMODE=$ENV{UPCXX_THREADMODE}")
message(STATUS "UPCXX_CODEMODE=$ENV{UPCXX_CODEMODE}")
endif()
# ----------------------------------------------------------------------------------------#
#
# UPCXX_TARGET_NAME <-- set this variable if multiple configuration are needed
#
# ----------------------------------------------------------------------------------------#
if(NOT UPCXX_TARGET_NAME)
set(UPCXX_TARGET_NAME upcxx)
endif()
# Export a UPCXX::upcxx target for modern cmake projects
if(UPCXX_FOUND AND NOT TARGET UPCXX::${UPCXX_TARGET_NAME})
add_library(UPCXX::${UPCXX_TARGET_NAME} INTERFACE IMPORTED)
# Handle various CMake version dependencies
if(NOT CMAKE_VERSION VERSION_LESS 3.8.0)
set_property(TARGET UPCXX::${UPCXX_TARGET_NAME}
PROPERTY INTERFACE_COMPILE_FEATURES "cxx_std_${UPCXX_CXX_STANDARD}")
elseif(DEFINED UPCXX_CXX_STD_FLAG)
upcxx_verb("UPCXX_CXX_STD_FLAG=${UPCXX_CXX_STD_FLAG}")
list(APPEND UPCXX_OPTIONS ${UPCXX_CXX_STD_FLAG})
endif()
if(CMAKE_VERSION VERSION_LESS 3.13.0)
list(APPEND UPCXX_OPTIONS "$<LINK_ONLY:${UPCXX_LINK_OPTIONS}>")
else()
set_property(TARGET UPCXX::${UPCXX_TARGET_NAME} PROPERTY INTERFACE_LINK_OPTIONS
"${UPCXX_LINK_OPTIONS}")
endif()
set_target_properties(
UPCXX::${UPCXX_TARGET_NAME}
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${UPCXX_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${UPCXX_LIBRARIES}"
INTERFACE_COMPILE_DEFINITIONS "${UPCXX_DEFINITIONS}"
# ensures that UPCXX_OPTIONS is only added for CXX compilation:
INTERFACE_COMPILE_OPTIONS
"$<$<COMPILE_LANGUAGE:CXX>:${UPCXX_OPTIONS}>")
# set(UPCXX_LIBRARIES UPCXX::${UPCXX_TARGET_NAME})
upcxx_verb("UPCXX_INCLUDE_DIRS: ${UPCXX_INCLUDE_DIRS}")
upcxx_verb("UPCXX_DEFINITIONS: ${UPCXX_DEFINITIONS}")
upcxx_verb("UPCXX_OPTIONS: ${UPCXX_OPTIONS}")
upcxx_verb("UPCXX_LINK_OPTIONS: ${UPCXX_LINK_OPTIONS}")
upcxx_verb("UPCXX_LIBRARIES: ${UPCXX_LIBRARIES}")
endif()
# pop the policy scope
cmake_policy(POP)