meson: Add support for using cmake for finding LLVM
authorDylan Baker <dylan@pnwbakers.com>
Wed, 22 May 2019 18:01:17 +0000 (11:01 -0700)
committerDylan Baker <dylan@pnwbakers.com>
Thu, 27 Jun 2019 22:12:02 +0000 (22:12 +0000)
Meson has support for using cmake as a finder for some dependencies,
including LLVM. Using cmake has a lot of advantages: it needs less meson
maintenance to keep working (even for llvm updates); it works more
sanely for cross compiles (as llvm-config is a compiled binary not a
shell script). Meson 0.51.0 also has a new generic variable getter that
can be used to get information from either cmake, pkg-config, or
config-tools dependencies, which is needed for cmake. We continue to
support using llvm-config if you don't have cmake installed, or if cmake
cannot find a suitable version.

Fixes: 0d59459432cf077d768164091318af8fb1612500
       ("meson: Force the use of config-tool for llvm")
Reviewed-by: Eric Engestrom <eric.engestrom@intel.com>
meson.build
src/gallium/drivers/swr/rasterizer/jitter/meson.build
src/gallium/state_trackers/clover/meson.build
src/gallium/targets/opencl/meson.build

index 31bb0dd04eabd54da54df6544bcdb51305fe8031..ff529d339226ebfa426eef0f9332a4bf2222609e 100644 (file)
@@ -1260,7 +1260,6 @@ if _llvm != 'false'
       with_gallium_opencl or _llvm == 'true'
     ),
     static : not _shared_llvm,
-    method : 'config-tool',
   )
   with_llvm = dep_llvm.found()
 endif
@@ -1274,7 +1273,17 @@ if with_llvm
   # LLVM can be built without rtti, turning off rtti changes the ABI of C++
   # programs, so we need to build all C++ code in mesa without rtti as well to
   # ensure that linking works.
-  if dep_llvm.get_configtool_variable('has-rtti') == 'NO'
+  #
+  # In meson 0.51.0 we can use cmake to find LLVM in addittion to meson's
+  # builtin llvm-config based finder. A new generic variable getter method
+  # has also been added, so we'll use that if we can, to cover the cmake case.
+  if meson.version().version_compare('>=0.51')
+    # The CMake finder will return 'ON', the llvm-config will return 'YES'
+    _rtti = ['ON', 'YES'].contains(dep_llvm.get_variable(cmake : 'LLVM_ENABLE_RTTI', configtool: 'has-rtti'))
+  else
+    _rtti = dep_llvm.get_configtool_variable('has-rtti') == 'YES'
+  endif
+  if not _rtti
     if with_gallium_nouveau
       error('The Nouveau driver requires rtti. You either need to turn off nouveau or use an LLVM built with LLVM_ENABLE_RTTI.')
     elif with_gallium_opencl
index aced4a1b7353c68f720f19c16585717db31d5558..6885c344939665417ab527909b2a74e2f7c20c55 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright © 2017-2018 Intel Corporation
+# Copyright © 2017-2019 Intel Corporation
 
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
 # SOFTWARE.
 
 
+if meson.version().version_compare('>=0.51')
+  _llvm_includedir = dep_llvm.get_variable(configtool : 'includedir', cmake : 'LLVM_INCLUDE_DIR')
+else
+  _llvm_includedir = dep_llvm.get_configtool_variable('includedir')
+endif
+
 gen_builder_hpp = custom_target(
   'gen_builder.hpp',
   input : [
     swr_gen_llvm_ir_macros_py,
-    join_paths(
-      dep_llvm.get_configtool_variable('includedir'), 'llvm', 'IR',
-      'IRBuilder.h'
-    )
+    join_paths(_llvm_includedir, 'llvm', 'IR', 'IRBuilder.h')
   ],
   output : 'gen_builder.hpp',
   command : [
index 2ff060bf35beb248686506f50ed8eebf326e0d5a..8f751cbb414e9655ffe626274162a3dc0acd1d58 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright © 2017-2018 Intel Corporation
+# Copyright © 2017-2019 Intel Corporation
 
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
@@ -25,6 +25,12 @@ if with_opencl_icd
   clover_cpp_args += '-DHAVE_CLOVER_ICD'
 endif
 
+if meson.version().version_compare('>=0.51')
+  _clang_resources = join_paths(dep_llvm.get_variable(cmake : 'LLVM_LIBRARY_DIR', configtool : 'libdir'), 'clang', dep_llvm.version(), 'include')
+else
+  _clang_resources = join_paths(dep_llvm.get_configtool_variable('libdir'), 'clang', dep_llvm.version(), 'include')
+endif
+
 libclllvm = static_library(
   'clllvm',
   files(
@@ -43,10 +49,7 @@ libclllvm = static_library(
     cpp_vis_args,
     '-DLIBCLC_INCLUDEDIR="@0@/"'.format(dep_clc.get_pkgconfig_variable('includedir')),
     '-DLIBCLC_LIBEXECDIR="@0@/"'.format(dep_clc.get_pkgconfig_variable('libexecdir')),
-    '-DCLANG_RESOURCE_DIR="@0@"'.format(join_paths(
-      dep_llvm.get_configtool_variable('libdir'), 'clang',
-      dep_llvm.version(), 'include',
-    )),
+    '-DCLANG_RESOURCE_DIR="@0@"'.format(_clang_resources),
   ],
   dependencies : [dep_llvm, dep_elf],
   override_options : clover_cpp_std,
index 317ad8dab4a42d09219d3178e7420628db31bd00..676e0e13174e53ae2eaa2472a25e1259f201da4a 100644 (file)
@@ -29,7 +29,11 @@ if with_ld_version_script
   opencl_link_deps += files('opencl.sym')
 endif
 
-llvm_libdir = dep_llvm.get_configtool_variable('libdir')
+if meson.version().version_compare('>=0.51')
+  llvm_libdir = dep_llvm.get_variable(configtool : 'libdir', cmake : 'LLVM_LIBRARY_DIR')
+else
+  llvm_libdir = dep_llvm.get_configtool_variable('libdir')
+endif
 
 opencl_libname = with_opencl_icd ? 'MesaOpenCL' : 'OpenCL'