File size: 4,634 Bytes
1380717
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# Usage of this module as follows:
#
#  find_package(LLVMAlt)

if(LLVMAlt_FOUND)
  return()
endif()

if(DEFINED LLVM_ROOT)
  # if llvm source is set to conda then prefer conda llvm over system llvm even
  # if the system one is newer
  foreach(ARROW_LLVM_VERSION ${ARROW_LLVM_VERSIONS})
    find_package(LLVM
                 ${ARROW_LLVM_VERSION}
                 CONFIG
                 NO_DEFAULT_PATH
                 HINTS
                 ${LLVM_ROOT})
    if(LLVM_FOUND)
      break()
    endif()
  endforeach()
endif()

if(NOT LLVM_FOUND)
  foreach(ARROW_LLVM_VERSION ${ARROW_LLVM_VERSIONS})
    set(LLVM_HINTS ${LLVM_ROOT} ${LLVM_DIR} /usr/lib /usr/share)

    if(APPLE)
      find_program(BREW brew)
      if(BREW)
        string(REGEX REPLACE "^([0-9]+)(\\..+)?" "\\1" ARROW_LLVM_VERSION_MAJOR
                             "${ARROW_LLVM_VERSION}")
        execute_process(COMMAND ${BREW} --prefix "llvm@${ARROW_LLVM_VERSION_MAJOR}"
                        OUTPUT_VARIABLE LLVM_BREW_PREFIX
                        OUTPUT_STRIP_TRAILING_WHITESPACE)
        list(APPEND LLVM_HINTS ${LLVM_BREW_PREFIX})
      endif()
    endif()

    find_package(LLVM
                 ${ARROW_LLVM_VERSION}
                 CONFIG
                 HINTS
                 ${LLVM_HINTS})

    if(LLVM_FOUND)
      break()
    endif()
  endforeach()
endif()

if(LLVM_FOUND)
  find_program(LLVM_LINK_EXECUTABLE llvm-link HINTS ${LLVM_TOOLS_BINARY_DIR})

  find_program(CLANG_EXECUTABLE
               NAMES clang-${LLVM_PACKAGE_VERSION}
                     clang-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}
                     clang-${LLVM_VERSION_MAJOR} clang
               HINTS ${LLVM_TOOLS_BINARY_DIR})

  add_library(LLVM::LLVM_HEADERS INTERFACE IMPORTED)
  set_target_properties(LLVM::LLVM_HEADERS
                        PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LLVM_INCLUDE_DIRS}"
                                   INTERFACE_COMPILE_FLAGS "${LLVM_DEFINITIONS}")

  add_library(LLVM::LLVM_LIBS INTERFACE IMPORTED)
  if(ARROW_LLVM_USE_SHARED)
    target_link_libraries(LLVM::LLVM_LIBS INTERFACE LLVM)
  else()
    # Find the libraries that correspond to the LLVM components
    set(LLVM_TARGET_COMPONENTS
        analysis
        bitreader
        core
        debuginfodwarf
        ipo
        linker
        native
        orcjit
        target)
    if(LLVM_VERSION_MAJOR GREATER_EQUAL 14)
      list(APPEND LLVM_TARGET_COMPONENTS passes)
    endif()
    llvm_map_components_to_libnames(LLVM_LIBS ${LLVM_TARGET_COMPONENTS})
    target_link_libraries(LLVM::LLVM_LIBS INTERFACE ${LLVM_LIBS})

    if(TARGET LLVMSupport AND NOT ARROW_ZSTD_USE_SHARED)
      get_target_property(LLVM_SUPPORT_INTERFACE_LINK_LIBRARIES LLVMSupport
                          INTERFACE_LINK_LIBRARIES)
      list(FIND LLVM_SUPPORT_INTERFACE_LINK_LIBRARIES zstd::libzstd_shared
           LLVM_SUPPORT_LIBZSTD_INDEX)
      if(NOT LLVM_SUPPORT_LIBZSTD_INDEX EQUAL -1)
        list(REMOVE_AT LLVM_SUPPORT_INTERFACE_LINK_LIBRARIES
             ${LLVM_SUPPORT_LIBZSTD_INDEX})
        list(INSERT LLVM_SUPPORT_INTERFACE_LINK_LIBRARIES ${LLVM_SUPPORT_LIBZSTD_INDEX}
             zstd::libzstd_static)
      endif()
      set_target_properties(LLVMSupport
                            PROPERTIES INTERFACE_LINK_LIBRARIES
                                       "${LLVM_SUPPORT_INTERFACE_LINK_LIBRARIES}")
    endif()
  endif()
endif()

mark_as_advanced(CLANG_EXECUTABLE LLVM_LINK_EXECUTABLE)

find_package_handle_standard_args(
  LLVMAlt
  REQUIRED_VARS # The first variable is used for display.
                LLVM_PACKAGE_VERSION CLANG_EXECUTABLE LLVM_FOUND LLVM_LINK_EXECUTABLE)
if(LLVMAlt_FOUND)
  message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
  message(STATUS "Found llvm-link ${LLVM_LINK_EXECUTABLE}")
  message(STATUS "Found clang ${CLANG_EXECUTABLE}")
endif()