xref: /llvm-project/mlir/cmake/modules/FindLevelZero.cmake (revision 7fa19e6f4b87623b0ca1a23bf6b6293c1b5e5799)
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