1*7fa19e6fSNishant Patel# CMake find_package() module for level-zero 2*7fa19e6fSNishant Patel# 3*7fa19e6fSNishant Patel# Example usage: 4*7fa19e6fSNishant Patel# 5*7fa19e6fSNishant Patel# find_package(LevelZero) 6*7fa19e6fSNishant Patel# 7*7fa19e6fSNishant Patel# If successful, the following variables will be defined: 8*7fa19e6fSNishant Patel# LevelZero_FOUND 9*7fa19e6fSNishant Patel# LevelZero_INCLUDE_DIRS 10*7fa19e6fSNishant Patel# LevelZero_LIBRARY 11*7fa19e6fSNishant Patel# LevelZero_LIBRARIES_DIR 12*7fa19e6fSNishant Patel# 13*7fa19e6fSNishant Patel# By default, the module searches the standard paths to locate the "ze_api.h" 14*7fa19e6fSNishant Patel# and the ze_loader shared library. When using a custom level-zero installation, 15*7fa19e6fSNishant Patel# the environment variable "LEVEL_ZERO_DIR" should be specified telling the 16*7fa19e6fSNishant Patel# module to get the level-zero library and headers from that location. 17*7fa19e6fSNishant Patel 18*7fa19e6fSNishant Patelinclude(FindPackageHandleStandardArgs) 19*7fa19e6fSNishant Patel 20*7fa19e6fSNishant Patel# Search path priority 21*7fa19e6fSNishant Patel# 1. CMake Variable LEVEL_ZERO_DIR 22*7fa19e6fSNishant Patel# 2. Environment Variable LEVEL_ZERO_DIR 23*7fa19e6fSNishant Patel 24*7fa19e6fSNishant Patelif(NOT LEVEL_ZERO_DIR) 25*7fa19e6fSNishant Patel if(DEFINED ENV{LEVEL_ZERO_DIR}) 26*7fa19e6fSNishant Patel set(LEVEL_ZERO_DIR "$ENV{LEVEL_ZERO_DIR}") 27*7fa19e6fSNishant Patel endif() 28*7fa19e6fSNishant Patelendif() 29*7fa19e6fSNishant Patel 30*7fa19e6fSNishant Patelif(LEVEL_ZERO_DIR) 31*7fa19e6fSNishant Patel find_path(LevelZero_INCLUDE_DIR 32*7fa19e6fSNishant Patel NAMES level_zero/ze_api.h 33*7fa19e6fSNishant Patel PATHS ${LEVEL_ZERO_DIR}/include 34*7fa19e6fSNishant Patel NO_DEFAULT_PATH 35*7fa19e6fSNishant Patel ) 36*7fa19e6fSNishant Patel 37*7fa19e6fSNishant Patel if(LINUX) 38*7fa19e6fSNishant Patel find_library(LevelZero_LIBRARY 39*7fa19e6fSNishant Patel NAMES ze_loader 40*7fa19e6fSNishant Patel PATHS ${LEVEL_ZERO_DIR}/lib 41*7fa19e6fSNishant Patel ${LEVEL_ZERO_DIR}/lib/x86_64-linux-gnu 42*7fa19e6fSNishant Patel NO_DEFAULT_PATH 43*7fa19e6fSNishant Patel ) 44*7fa19e6fSNishant Patel else() 45*7fa19e6fSNishant Patel find_library(LevelZero_LIBRARY 46*7fa19e6fSNishant Patel NAMES ze_loader 47*7fa19e6fSNishant Patel PATHS ${LEVEL_ZERO_DIR}/lib 48*7fa19e6fSNishant Patel NO_DEFAULT_PATH 49*7fa19e6fSNishant Patel ) 50*7fa19e6fSNishant Patel endif() 51*7fa19e6fSNishant Patelelse() 52*7fa19e6fSNishant Patel find_path(LevelZero_INCLUDE_DIR 53*7fa19e6fSNishant Patel NAMES level_zero/ze_api.h 54*7fa19e6fSNishant Patel ) 55*7fa19e6fSNishant Patel 56*7fa19e6fSNishant Patel find_library(LevelZero_LIBRARY 57*7fa19e6fSNishant Patel NAMES ze_loader 58*7fa19e6fSNishant Patel ) 59*7fa19e6fSNishant Patelendif() 60*7fa19e6fSNishant Patel 61*7fa19e6fSNishant Patel# Compares the two version string that are supposed to be in x.y.z format 62*7fa19e6fSNishant Patel# and reports if the argument VERSION_STR1 is greater than or equal than 63*7fa19e6fSNishant Patel# version_str2. The strings are compared lexicographically after conversion to 64*7fa19e6fSNishant Patel# lists of equal lengths, with the shorter string getting zero-padded. 65*7fa19e6fSNishant Patelfunction(compare_versions VERSION_STR1 VERSION_STR2 OUTPUT) 66*7fa19e6fSNishant Patel # Convert the strings to list 67*7fa19e6fSNishant Patel string(REPLACE "." ";" VL1 ${VERSION_STR1}) 68*7fa19e6fSNishant Patel string(REPLACE "." ";" VL2 ${VERSION_STR2}) 69*7fa19e6fSNishant Patel # get lengths of both lists 70*7fa19e6fSNishant Patel list(LENGTH VL1 VL1_LEN) 71*7fa19e6fSNishant Patel list(LENGTH VL2 VL2_LEN) 72*7fa19e6fSNishant Patel set(LEN ${VL1_LEN}) 73*7fa19e6fSNishant Patel # If they differ in size pad the shorter list with 0s 74*7fa19e6fSNishant Patel if(VL1_LEN GREATER VL2_LEN) 75*7fa19e6fSNishant Patel math(EXPR DIFF "${VL1_LEN} - ${VL2_LEN}" OUTPUT_FORMAT DECIMAL) 76*7fa19e6fSNishant Patel foreach(IDX RANGE 1 ${DIFF} 1) 77*7fa19e6fSNishant Patel list(APPEND VL2 "0") 78*7fa19e6fSNishant Patel endforeach() 79*7fa19e6fSNishant Patel elseif(VL2_LEN GREATER VL2_LEN) 80*7fa19e6fSNishant Patel math(EXPR DIFF "${VL1_LEN} - ${VL2_LEN}" OUTPUT_FORMAT DECIMAL) 81*7fa19e6fSNishant Patel foreach(IDX RANGE 1 ${DIFF} 1) 82*7fa19e6fSNishant Patel list(APPEND VL2 "0") 83*7fa19e6fSNishant Patel endforeach() 84*7fa19e6fSNishant Patel set(LEN ${VL2_LEN}) 85*7fa19e6fSNishant Patel endif() 86*7fa19e6fSNishant Patel math(EXPR LEN_SUB_ONE "${LEN}-1") 87*7fa19e6fSNishant Patel foreach(IDX RANGE 0 ${LEN_SUB_ONE} 1) 88*7fa19e6fSNishant Patel list(GET VL1 ${IDX} VAL1) 89*7fa19e6fSNishant Patel list(GET VL2 ${IDX} VAL2) 90*7fa19e6fSNishant Patel 91*7fa19e6fSNishant Patel if(${VAL1} GREATER ${VAL2}) 92*7fa19e6fSNishant Patel set(${OUTPUT} TRUE PARENT_SCOPE) 93*7fa19e6fSNishant Patel break() 94*7fa19e6fSNishant Patel elseif(${VAL1} LESS ${VAL2}) 95*7fa19e6fSNishant Patel set(${OUTPUT} FALSE PARENT_SCOPE) 96*7fa19e6fSNishant Patel break() 97*7fa19e6fSNishant Patel else() 98*7fa19e6fSNishant Patel set(${OUTPUT} TRUE PARENT_SCOPE) 99*7fa19e6fSNishant Patel endif() 100*7fa19e6fSNishant Patel endforeach() 101*7fa19e6fSNishant Patel 102*7fa19e6fSNishant Patel endfunction(compare_versions) 103*7fa19e6fSNishant Patel 104*7fa19e6fSNishant Patel# Creates a small function to run and extract the LevelZero loader version. 105*7fa19e6fSNishant Patelfunction(get_l0_loader_version) 106*7fa19e6fSNishant Patel 107*7fa19e6fSNishant Patel set(L0_VERSIONEER_SRC 108*7fa19e6fSNishant Patel [====[ 109*7fa19e6fSNishant Patel #include <iostream> 110*7fa19e6fSNishant Patel #include <level_zero/loader/ze_loader.h> 111*7fa19e6fSNishant Patel #include <string> 112*7fa19e6fSNishant Patel int main() { 113*7fa19e6fSNishant Patel ze_result_t result; 114*7fa19e6fSNishant Patel std::string loader("loader"); 115*7fa19e6fSNishant Patel zel_component_version_t *versions; 116*7fa19e6fSNishant Patel size_t size = 0; 117*7fa19e6fSNishant Patel result = zeInit(0); 118*7fa19e6fSNishant Patel if (result != ZE_RESULT_SUCCESS) { 119*7fa19e6fSNishant Patel std::cerr << "Failed to init ze driver" << std::endl; 120*7fa19e6fSNishant Patel return -1; 121*7fa19e6fSNishant Patel } 122*7fa19e6fSNishant Patel zelLoaderGetVersions(&size, nullptr); 123*7fa19e6fSNishant Patel versions = new zel_component_version_t[size]; 124*7fa19e6fSNishant Patel zelLoaderGetVersions(&size, versions); 125*7fa19e6fSNishant Patel for (size_t i = 0; i < size; i++) { 126*7fa19e6fSNishant Patel if (loader.compare(versions[i].component_name) == 0) { 127*7fa19e6fSNishant Patel std::cout << versions[i].component_lib_version.major << "." 128*7fa19e6fSNishant Patel << versions[i].component_lib_version.minor << "." 129*7fa19e6fSNishant Patel << versions[i].component_lib_version.patch; 130*7fa19e6fSNishant Patel break; 131*7fa19e6fSNishant Patel } 132*7fa19e6fSNishant Patel } 133*7fa19e6fSNishant Patel delete[] versions; 134*7fa19e6fSNishant Patel return 0; 135*7fa19e6fSNishant Patel } 136*7fa19e6fSNishant Patel ]====] 137*7fa19e6fSNishant Patel ) 138*7fa19e6fSNishant Patel 139*7fa19e6fSNishant Patel set(L0_VERSIONEER_FILE ${CMAKE_BINARY_DIR}/temp/l0_versioneer.cpp) 140*7fa19e6fSNishant Patel 141*7fa19e6fSNishant Patel file(WRITE ${L0_VERSIONEER_FILE} "${L0_VERSIONEER_SRC}") 142*7fa19e6fSNishant Patel 143*7fa19e6fSNishant Patel # We need both the directories in the include path as ze_loader.h 144*7fa19e6fSNishant Patel # includes "ze_api.h" and not "level_zero/ze_api.h". 145*7fa19e6fSNishant Patel list(APPEND INCLUDE_DIRS ${LevelZero_INCLUDE_DIR}) 146*7fa19e6fSNishant Patel list(APPEND INCLUDE_DIRS ${LevelZero_INCLUDE_DIR}/level_zero) 147*7fa19e6fSNishant Patel list(JOIN INCLUDE_DIRS ";" INCLUDE_DIRS_STR) 148*7fa19e6fSNishant Patel try_run(L0_VERSIONEER_RUN L0_VERSIONEER_COMPILE 149*7fa19e6fSNishant Patel "${CMAKE_BINARY_DIR}" 150*7fa19e6fSNishant Patel "${L0_VERSIONEER_FILE}" 151*7fa19e6fSNishant Patel LINK_LIBRARIES ${LevelZero_LIBRARY} 152*7fa19e6fSNishant Patel CMAKE_FLAGS 153*7fa19e6fSNishant Patel "-DINCLUDE_DIRECTORIES=${INCLUDE_DIRS_STR}" 154*7fa19e6fSNishant Patel RUN_OUTPUT_VARIABLE L0_VERSION 155*7fa19e6fSNishant Patel ) 156*7fa19e6fSNishant Patel if(${L0_VERSIONEER_COMPILE} AND (DEFINED L0_VERSIONEER_RUN)) 157*7fa19e6fSNishant Patel set(LevelZero_VERSION ${L0_VERSION} PARENT_SCOPE) 158*7fa19e6fSNishant Patel message(STATUS "Found Level Zero of version: ${L0_VERSION}") 159*7fa19e6fSNishant Patel else() 160*7fa19e6fSNishant Patel message(FATAL_ERROR 161*7fa19e6fSNishant Patel "Could not compile a level-zero program to extract loader version" 162*7fa19e6fSNishant Patel ) 163*7fa19e6fSNishant Patel endif() 164*7fa19e6fSNishant Patelendfunction(get_l0_loader_version) 165*7fa19e6fSNishant Patel 166*7fa19e6fSNishant Patelif(LevelZero_INCLUDE_DIR AND LevelZero_LIBRARY) 167*7fa19e6fSNishant Patel list(APPEND LevelZero_LIBRARIES "${LevelZero_LIBRARY}") 168*7fa19e6fSNishant Patel list(APPEND LevelZero_INCLUDE_DIRS ${LevelZero_INCLUDE_DIR}) 169*7fa19e6fSNishant Patel if(OpenCL_FOUND) 170*7fa19e6fSNishant Patel list(APPEND LevelZero_INCLUDE_DIRS ${OpenCL_INCLUDE_DIRS}) 171*7fa19e6fSNishant Patel endif() 172*7fa19e6fSNishant Patel 173*7fa19e6fSNishant Patel cmake_path(GET LevelZero_LIBRARY PARENT_PATH LevelZero_LIBRARIES_PATH) 174*7fa19e6fSNishant Patel set(LevelZero_LIBRARIES_DIR ${LevelZero_LIBRARIES_PATH}) 175*7fa19e6fSNishant Patel 176*7fa19e6fSNishant Patel if(NOT TARGET LevelZero::LevelZero) 177*7fa19e6fSNishant Patel add_library(LevelZero::LevelZero INTERFACE IMPORTED) 178*7fa19e6fSNishant Patel set_target_properties(LevelZero::LevelZero 179*7fa19e6fSNishant Patel PROPERTIES INTERFACE_LINK_LIBRARIES "${LevelZero_LIBRARIES}" 180*7fa19e6fSNishant Patel ) 181*7fa19e6fSNishant Patel set_target_properties(LevelZero::LevelZero 182*7fa19e6fSNishant Patel PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LevelZero_INCLUDE_DIRS}" 183*7fa19e6fSNishant Patel ) 184*7fa19e6fSNishant Patel endif() 185*7fa19e6fSNishant Patelendif() 186*7fa19e6fSNishant Patel 187*7fa19e6fSNishant Patel# Check if a specific version of Level Zero is required 188*7fa19e6fSNishant Patelif(LevelZero_FIND_VERSION) 189*7fa19e6fSNishant Patel get_l0_loader_version() 190*7fa19e6fSNishant Patel set(VERSION_GT_FIND_VERSION FALSE) 191*7fa19e6fSNishant Patel compare_versions( 192*7fa19e6fSNishant Patel ${LevelZero_VERSION} 193*7fa19e6fSNishant Patel ${LevelZero_FIND_VERSION} 194*7fa19e6fSNishant Patel VERSION_GT_FIND_VERSION 195*7fa19e6fSNishant Patel ) 196*7fa19e6fSNishant Patel if(${VERSION_GT_FIND_VERSION}) 197*7fa19e6fSNishant Patel set(LevelZero_FOUND TRUE) 198*7fa19e6fSNishant Patel else() 199*7fa19e6fSNishant Patel set(LevelZero_FOUND FALSE) 200*7fa19e6fSNishant Patel endif() 201*7fa19e6fSNishant Patelelse() 202*7fa19e6fSNishant Patel set(LevelZero_FOUND TRUE) 203*7fa19e6fSNishant Patelendif() 204*7fa19e6fSNishant Patel 205*7fa19e6fSNishant Patelfind_package_handle_standard_args(LevelZero 206*7fa19e6fSNishant Patel REQUIRED_VARS 207*7fa19e6fSNishant Patel LevelZero_FOUND 208*7fa19e6fSNishant Patel LevelZero_INCLUDE_DIRS 209*7fa19e6fSNishant Patel LevelZero_LIBRARY 210*7fa19e6fSNishant Patel LevelZero_LIBRARIES_DIR 211*7fa19e6fSNishant Patel HANDLE_COMPONENTS 212*7fa19e6fSNishant Patel) 213*7fa19e6fSNishant Patelmark_as_advanced(LevelZero_LIBRARY LevelZero_INCLUDE_DIRS) 214*7fa19e6fSNishant Patel 215*7fa19e6fSNishant Patelif(LevelZero_FOUND) 216*7fa19e6fSNishant Patel find_package_message(LevelZero "Found LevelZero: ${LevelZero_LIBRARY}" 217*7fa19e6fSNishant Patel "(found version ${LevelZero_VERSION})" 218*7fa19e6fSNishant Patel ) 219*7fa19e6fSNishant Patelelse() 220*7fa19e6fSNishant Patel find_package_message(LevelZero "Could not find LevelZero" "") 221*7fa19e6fSNishant Patelendif() 222