diff options
| author | Khem Raj <raj.khem@gmail.com> | 2025-05-02 09:55:18 -0700 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2025-05-05 18:02:48 +0100 |
| commit | 601b05a298c0847e96b8f5f71e50d057e2833382 (patch) | |
| tree | 36499726a5ef05e41a1b239fafcc61e86c750f6f | |
| parent | 5c996938de1da941dfce5c9a1272c5658cb7caaa (diff) | |
| download | poky-601b05a298c0847e96b8f5f71e50d057e2833382.tar.gz | |
mesa: Fix header search paths
mesa build currently emits CLANG_RESOURCE_DIR into compiled objects and
meson calculates it from llvm cmake files from sysroot and it points to
absolute paths in target sysroot. To fix this backport a patch that does
not rely on CLANG_RESOURCE_DIR, however, this patch still leaves it in
code as fallback via FALLBACK_CLANG_RESOURCE_DIR, we are on LLVM 20.x
which will not use this variable, lets just remove detection so it does
not encode hardcoded paths.
Fixes
ERROR: mesa-2_25.0.2-r0 do_package_qa: QA Issue: File /usr/lib/libMesaOpenCL.so.1.0.0 in package libopencl-mesa contains reference to TMPDIR [buildpaths]
ERROR: mesa-2_25.0.2-r0 do_package_qa: Fatal QA errors were found, failing task.
(From OE-Core rev: afcde8eb575684fb514e1012b31bc0da04f4cb28)
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Cc: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
3 files changed, 179 insertions, 0 deletions
diff --git a/meta/recipes-graphics/mesa/files/0001-clover-Don-t-include-libclc-headers.patch b/meta/recipes-graphics/mesa/files/0001-clover-Don-t-include-libclc-headers.patch new file mode 100644 index 0000000000..0f9a01d823 --- /dev/null +++ b/meta/recipes-graphics/mesa/files/0001-clover-Don-t-include-libclc-headers.patch | |||
| @@ -0,0 +1,143 @@ | |||
| 1 | From e94da9ccbc099468df752227716880efef66411b Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Nikita Popov <npopov@redhat.com> | ||
| 3 | Date: Thu, 27 Feb 2025 15:44:27 +0100 | ||
| 4 | Subject: [PATCH] clover: Don't include libclc headers | ||
| 5 | |||
| 6 | Per https://github.com/llvm/llvm-project/issues/119967 these | ||
| 7 | headers are internal implementation details of libclc and were | ||
| 8 | never supposed to be installed. They are not available anymore | ||
| 9 | since LLVM 20. Instead opencl-c.h should be used. | ||
| 10 | |||
| 11 | There already ise a code path for including opencl-c.h, so always | ||
| 12 | use it. | ||
| 13 | |||
| 14 | This didn't work for me out of the box, because the build system | ||
| 15 | currently hardcodes the clang resource directory, which is incorrect | ||
| 16 | for Fedora at least. Fix this by using GetResourcePath + | ||
| 17 | CLANG_RESOURCE_DIR provided by clang instead. This is basically | ||
| 18 | the same as what is done in clc_helper.c | ||
| 19 | |||
| 20 | I've still retained the old behavior as a fallback just in case | ||
| 21 | (e.g. if clang is linked statically?) | ||
| 22 | |||
| 23 | Upstream-Status: Submitted [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33805/] | ||
| 24 | Reviewed-by: Karol Herbst <kherbst@redhat.com> | ||
| 25 | Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33805> | ||
| 26 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | ||
| 27 | --- | ||
| 28 | .../frontends/clover/llvm/invocation.cpp | 53 +++++++++++++------ | ||
| 29 | src/gallium/frontends/clover/meson.build | 5 +- | ||
| 30 | 2 files changed, 39 insertions(+), 19 deletions(-) | ||
| 31 | |||
| 32 | diff --git a/src/gallium/frontends/clover/llvm/invocation.cpp b/src/gallium/frontends/clover/llvm/invocation.cpp | ||
| 33 | index 3cbb05b..ca030b4 100644 | ||
| 34 | --- a/src/gallium/frontends/clover/llvm/invocation.cpp | ||
| 35 | +++ b/src/gallium/frontends/clover/llvm/invocation.cpp | ||
| 36 | @@ -24,6 +24,8 @@ | ||
| 37 | // OTHER DEALINGS IN THE SOFTWARE. | ||
| 38 | // | ||
| 39 | |||
| 40 | +#include <dlfcn.h> | ||
| 41 | + | ||
| 42 | #include <llvm/IR/DiagnosticPrinter.h> | ||
| 43 | #include <llvm/IR/DiagnosticInfo.h> | ||
| 44 | #include <llvm/IR/LLVMContext.h> | ||
| 45 | @@ -39,6 +41,8 @@ | ||
| 46 | #include <clang/Frontend/TextDiagnosticBuffer.h> | ||
| 47 | #include <clang/Frontend/TextDiagnosticPrinter.h> | ||
| 48 | #include <clang/Basic/TargetInfo.h> | ||
| 49 | +#include <clang/Config/config.h> | ||
| 50 | +#include <clang/Driver/Driver.h> | ||
| 51 | |||
| 52 | #if LLVM_VERSION_MAJOR >= 20 | ||
| 53 | #include <llvm/Support/VirtualFileSystem.h> | ||
| 54 | @@ -323,6 +327,30 @@ namespace { | ||
| 55 | return c; | ||
| 56 | } | ||
| 57 | |||
| 58 | + std::string getResourceDirectory() { | ||
| 59 | + Dl_info info; | ||
| 60 | + if (dladdr((void *)clang::CompilerInvocation::CreateFromArgs, &info) == 0) { | ||
| 61 | + return FALLBACK_CLANG_RESOURCE_DIR; | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + char *libclang_path = realpath(info.dli_fname, NULL); | ||
| 65 | + if (libclang_path == nullptr) { | ||
| 66 | + return FALLBACK_CLANG_RESOURCE_DIR; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + // GetResourcePath is a way to retrieve the actual libclang resource dir based on a given | ||
| 70 | + // binary or library. | ||
| 71 | + std::string clang_resource_dir = | ||
| 72 | +#if LLVM_VERSION_MAJOR >= 20 | ||
| 73 | + clang::driver::Driver::GetResourcesPath(std::string(libclang_path)); | ||
| 74 | +#else | ||
| 75 | + clang::driver::Driver::GetResourcesPath(std::string(libclang_path), CLANG_RESOURCE_DIR); | ||
| 76 | +#endif | ||
| 77 | + free(libclang_path); | ||
| 78 | + | ||
| 79 | + return clang_resource_dir; | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | std::unique_ptr<Module> | ||
| 83 | compile(LLVMContext &ctx, clang::CompilerInstance &c, | ||
| 84 | const std::string &name, const std::string &source, | ||
| 85 | @@ -331,25 +359,18 @@ namespace { | ||
| 86 | c.getFrontendOpts().ProgramAction = clang::frontend::EmitLLVMOnly; | ||
| 87 | c.getHeaderSearchOpts().UseBuiltinIncludes = true; | ||
| 88 | c.getHeaderSearchOpts().UseStandardSystemIncludes = true; | ||
| 89 | - c.getHeaderSearchOpts().ResourceDir = CLANG_RESOURCE_DIR; | ||
| 90 | |||
| 91 | - if (use_libclc) { | ||
| 92 | - // Add libclc generic search path | ||
| 93 | - c.getHeaderSearchOpts().AddPath(LIBCLC_INCLUDEDIR, | ||
| 94 | - clang::frontend::Angled, | ||
| 95 | - false, false); | ||
| 96 | + std::string clang_resource_dir = getResourceDirectory(); | ||
| 97 | + c.getHeaderSearchOpts().ResourceDir = clang_resource_dir; | ||
| 98 | |||
| 99 | - // Add libclc include | ||
| 100 | - c.getPreprocessorOpts().Includes.push_back("clc/clc.h"); | ||
| 101 | - } else { | ||
| 102 | - // Add opencl-c generic search path | ||
| 103 | - c.getHeaderSearchOpts().AddPath(CLANG_RESOURCE_DIR, | ||
| 104 | - clang::frontend::Angled, | ||
| 105 | - false, false); | ||
| 106 | + // Add opencl-c generic search path | ||
| 107 | + std::string clang_include_path = clang_resource_dir + "/include"; | ||
| 108 | + c.getHeaderSearchOpts().AddPath(clang_include_path, | ||
| 109 | + clang::frontend::Angled, | ||
| 110 | + false, false); | ||
| 111 | |||
| 112 | - // Add opencl include | ||
| 113 | - c.getPreprocessorOpts().Includes.push_back("opencl-c.h"); | ||
| 114 | - } | ||
| 115 | + // Add opencl include | ||
| 116 | + c.getPreprocessorOpts().Includes.push_back("opencl-c.h"); | ||
| 117 | |||
| 118 | // Add definition for the OpenCL version | ||
| 119 | const auto dev_version = dev.device_version(); | ||
| 120 | diff --git a/src/gallium/frontends/clover/meson.build b/src/gallium/frontends/clover/meson.build | ||
| 121 | index e569b86..56a9894 100644 | ||
| 122 | --- a/src/gallium/frontends/clover/meson.build | ||
| 123 | +++ b/src/gallium/frontends/clover/meson.build | ||
| 124 | @@ -10,7 +10,6 @@ clover_opencl_cpp_args = [ | ||
| 125 | '-DCL_USE_DEPRECATED_OPENCL_2_0_APIS', | ||
| 126 | '-DCL_USE_DEPRECATED_OPENCL_2_1_APIS', | ||
| 127 | '-DCL_USE_DEPRECATED_OPENCL_2_2_APIS', | ||
| 128 | - '-DLIBCLC_INCLUDEDIR="@0@/"'.format(dep_clc.get_variable(pkgconfig : 'includedir')), | ||
| 129 | '-DLIBCLC_LIBEXECDIR="@0@/"'.format(dep_clc.get_variable(pkgconfig : 'libexecdir')) | ||
| 130 | ] | ||
| 131 | clover_incs = [inc_include, inc_src, inc_gallium, inc_gallium_aux] | ||
| 132 | @@ -43,9 +42,9 @@ libclllvm = static_library( | ||
| 133 | cpp_args : [ | ||
| 134 | clover_cpp_args, | ||
| 135 | clover_opencl_cpp_args, | ||
| 136 | - '-DCLANG_RESOURCE_DIR="@0@"'.format(join_paths( | ||
| 137 | + '-DFALLBACK_CLANG_RESOURCE_DIR="@0@"'.format(join_paths( | ||
| 138 | dep_llvm.get_variable(cmake : 'LLVM_LIBRARY_DIR', configtool: 'libdir'), 'clang', | ||
| 139 | - dep_llvm.version(), 'include', | ||
| 140 | + dep_llvm.version() | ||
| 141 | )), | ||
| 142 | ], | ||
| 143 | gnu_symbol_visibility : 'hidden', | ||
diff --git a/meta/recipes-graphics/mesa/files/0001-gallium-clover-Do-not-use-LLVM_LIBRARY_DIR-for-FALLB.patch b/meta/recipes-graphics/mesa/files/0001-gallium-clover-Do-not-use-LLVM_LIBRARY_DIR-for-FALLB.patch new file mode 100644 index 0000000000..8b2ce2f63b --- /dev/null +++ b/meta/recipes-graphics/mesa/files/0001-gallium-clover-Do-not-use-LLVM_LIBRARY_DIR-for-FALLB.patch | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | From 5ea5c5d48e049d7b10b7ffb814e84e3ddef7fff9 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Khem Raj <raj.khem@gmail.com> | ||
| 3 | Date: Fri, 25 Apr 2025 19:00:14 -0700 | ||
| 4 | Subject: [PATCH] gallium/clover: Do not use LLVM_LIBRARY_DIR for | ||
| 5 | FALLBACK_CLANG_RESOURCE_DIR | ||
| 6 | |||
| 7 | This option -DFALLBACK_CLANG_RESOURCE_DIR is synthesized by meson from | ||
| 8 | LLVM_LIBRARY_DIR which is resolved to absolute path under <recipe_sysroot> | ||
| 9 | and its used in clover front-end as string in .c files, which encodes it | ||
| 10 | into binary as string and shows up in yocto QA error. | ||
| 11 | |||
| 12 | ERROR: mesa-2_25.0.2-r0 do_package_qa: QA Issue: File /usr/lib/libMesaOpenCL.so.1.0.0 in package libopencl-mesa contains reference to TMPDIR [buildpaths] | ||
| 13 | ERROR: mesa-2_25.0.2-r0 do_package_qa: Fatal QA errors were found, failing task. | ||
| 14 | ERROR: Logfile of failure stored in: /mnt/b/yoe/master/sources/poky/build/tmp/work/cortexa57-poky-linux/mesa/25.0.2/temp/log.do_package_qa.974870 | ||
| 15 | |||
| 16 | Upstream-Status: Inappropriate [OE-Specific] | ||
| 17 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | ||
| 18 | --- | ||
| 19 | src/gallium/frontends/clover/meson.build | 2 +- | ||
| 20 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 21 | |||
| 22 | diff --git a/src/gallium/frontends/clover/meson.build b/src/gallium/frontends/clover/meson.build | ||
| 23 | index 56a9894..32c21d6 100644 | ||
| 24 | --- a/src/gallium/frontends/clover/meson.build | ||
| 25 | +++ b/src/gallium/frontends/clover/meson.build | ||
| 26 | @@ -43,7 +43,7 @@ libclllvm = static_library( | ||
| 27 | clover_cpp_args, | ||
| 28 | clover_opencl_cpp_args, | ||
| 29 | '-DFALLBACK_CLANG_RESOURCE_DIR="@0@"'.format(join_paths( | ||
| 30 | - dep_llvm.get_variable(cmake : 'LLVM_LIBRARY_DIR', configtool: 'libdir'), 'clang', | ||
| 31 | + '/usr/lib/clang', | ||
| 32 | dep_llvm.version() | ||
| 33 | )), | ||
| 34 | ], | ||
diff --git a/meta/recipes-graphics/mesa/mesa.inc b/meta/recipes-graphics/mesa/mesa.inc index 0356a13ecf..66fb896676 100644 --- a/meta/recipes-graphics/mesa/mesa.inc +++ b/meta/recipes-graphics/mesa/mesa.inc | |||
| @@ -18,6 +18,8 @@ SRC_URI = "https://archive.mesa3d.org/mesa-${PV}.tar.xz \ | |||
| 18 | file://0001-meson-misdetects-64bit-atomics-on-mips-clang.patch \ | 18 | file://0001-meson-misdetects-64bit-atomics-on-mips-clang.patch \ |
| 19 | file://0001-freedreno-don-t-encode-build-path-into-binaries.patch \ | 19 | file://0001-freedreno-don-t-encode-build-path-into-binaries.patch \ |
| 20 | file://0001-mesa-clc-add-an-option-to-force-inclusion-of-OpenCL-.patch \ | 20 | file://0001-mesa-clc-add-an-option-to-force-inclusion-of-OpenCL-.patch \ |
| 21 | file://0001-clover-Don-t-include-libclc-headers.patch \ | ||
| 22 | file://0001-gallium-clover-Do-not-use-LLVM_LIBRARY_DIR-for-FALLB.patch \ | ||
| 21 | " | 23 | " |
| 22 | 24 | ||
| 23 | SRC_URI[sha256sum] = "c0d245dea0aa4b49f74b3d474b16542e4a8799791cd33d676c69f650ad4378d0" | 25 | SRC_URI[sha256sum] = "c0d245dea0aa4b49f74b3d474b16542e4a8799791cd33d676c69f650ad4378d0" |
