From 36597bc5befd89a930f3bbc46305a419bfb3458f Mon Sep 17 00:00:00 2001 From: zhang_wenyu1 Date: Mon, 25 Nov 2024 10:25:39 +0800 Subject: [PATCH] llvm: add recipe for llvm and modify manifest.yaml 1. add recipe for llvm 2. modify manifest.yaml Signed-off-by: zhang_wenyu --- .oebuild/manifest.yaml | 3 + ...r-sort-ClassInfo-lists-by-name-as-we.patch | 31 +++ ...-llvm-allow-env-override-of-exe-path.patch | 37 ++++ ...e-64bit-off_t-on-32bit-glibc-systems.patch | 79 ++++++++ .../recipes-devtools/llvm/files/llvm-config | 51 +++++ .../recipes-devtools/llvm/llvm_%.bbappend | 10 + .../recipes-devtools/llvm/llvm_15.0.7.bb | 179 ++++++++++++++++++ 7 files changed, 390 insertions(+) create mode 100644 meta-openeuler/recipes-devtools/llvm/files/0001-AsmMatcherEmitter-sort-ClassInfo-lists-by-name-as-we.patch create mode 100644 meta-openeuler/recipes-devtools/llvm/files/0007-llvm-allow-env-override-of-exe-path.patch create mode 100644 meta-openeuler/recipes-devtools/llvm/files/0035-cmake-Enable-64bit-off_t-on-32bit-glibc-systems.patch create mode 100644 meta-openeuler/recipes-devtools/llvm/files/llvm-config create mode 100644 meta-openeuler/recipes-devtools/llvm/llvm_%.bbappend create mode 100644 meta-openeuler/recipes-devtools/llvm/llvm_15.0.7.bb diff --git a/.oebuild/manifest.yaml b/.oebuild/manifest.yaml index 34ef45c66dd..18fb192595f 100644 --- a/.oebuild/manifest.yaml +++ b/.oebuild/manifest.yaml @@ -2208,3 +2208,6 @@ manifest_list: clucene-core: remote_url: https://gitee.com/src-openeuler/clucene.git version: ab6b4df2f4dfebbd991ee377293b7bd512281c6a + llvm: + remote_url: https://gitee.com/openeuler/llvm-project.git + version: 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a diff --git a/meta-openeuler/recipes-devtools/llvm/files/0001-AsmMatcherEmitter-sort-ClassInfo-lists-by-name-as-we.patch b/meta-openeuler/recipes-devtools/llvm/files/0001-AsmMatcherEmitter-sort-ClassInfo-lists-by-name-as-we.patch new file mode 100644 index 00000000000..48af6fc2834 --- /dev/null +++ b/meta-openeuler/recipes-devtools/llvm/files/0001-AsmMatcherEmitter-sort-ClassInfo-lists-by-name-as-we.patch @@ -0,0 +1,31 @@ +From 86940d87026432683fb6741cd8a34d3b9b18e40d Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Fri, 27 Nov 2020 10:11:08 +0000 +Subject: [PATCH] AsmMatcherEmitter: sort ClassInfo lists by name as well + +Otherwise, there are instances which are identical in +every other field and therefore sort non-reproducibly +(which breaks binary and source reproducibiliy). + +Upstream-Status: Submitted [https://reviews.llvm.org/D97477] +Signed-off-by: Alexander Kanavin +--- + llvm/utils/TableGen/AsmMatcherEmitter.cpp | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/llvm/utils/TableGen/AsmMatcherEmitter.cpp b/llvm/utils/TableGen/AsmMatcherEmitter.cpp +index ccf0959389b..1f801e83b7d 100644 +--- a/llvm/utils/TableGen/AsmMatcherEmitter.cpp ++++ b/llvm/utils/TableGen/AsmMatcherEmitter.cpp +@@ -359,7 +359,10 @@ public: + // name of a class shouldn't be significant. However, some of the backends + // accidentally rely on this behaviour, so it will have to stay like this + // until they are fixed. +- return ValueName < RHS.ValueName; ++ if (ValueName != RHS.ValueName) ++ return ValueName < RHS.ValueName; ++ // All else being equal, we should sort by name, for source and binary reproducibility ++ return Name < RHS.Name; + } + }; + diff --git a/meta-openeuler/recipes-devtools/llvm/files/0007-llvm-allow-env-override-of-exe-path.patch b/meta-openeuler/recipes-devtools/llvm/files/0007-llvm-allow-env-override-of-exe-path.patch new file mode 100644 index 00000000000..b01b8647c91 --- /dev/null +++ b/meta-openeuler/recipes-devtools/llvm/files/0007-llvm-allow-env-override-of-exe-path.patch @@ -0,0 +1,37 @@ +Upstream-Status: Pending +Signed-off-by: Khem Raj + +From 61b00e1e051e367f5483d7b5253b6c85a9e8a90f Mon Sep 17 00:00:00 2001 +From: Martin Kelly +Date: Fri, 19 May 2017 00:22:57 -0700 +Subject: [PATCH] llvm: allow env override of exe path + +When using a native llvm-config from inside a sysroot, we need llvm-config to +return the libraries, include directories, etc. from inside the sysroot rather +than from the native sysroot. Thus provide an env override for calling +llvm-config from a target sysroot. + +Signed-off-by: Martin Kelly +Signed-off-by: Khem Raj +--- + llvm/tools/llvm-config/llvm-config.cpp | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/llvm/tools/llvm-config/llvm-config.cpp b/llvm/tools/llvm-config/llvm-config.cpp +index 7ef7c46a262..a4f7ed82c7b 100644 +--- a/llvm/tools/llvm-config/llvm-config.cpp ++++ b/llvm/tools/llvm-config/llvm-config.cpp +@@ -225,6 +225,13 @@ Typical components:\n\ + + /// Compute the path to the main executable. + std::string GetExecutablePath(const char *Argv0) { ++ // Hack for Yocto: we need to override the root path when we are using ++ // llvm-config from within a target sysroot. ++ const char *Sysroot = std::getenv("YOCTO_ALTERNATE_EXE_PATH"); ++ if (Sysroot != nullptr) { ++ return Sysroot; ++ } ++ + // This just needs to be some symbol in the binary; C++ doesn't + // allow taking the address of ::main however. + void *P = (void *)(intptr_t)GetExecutablePath; diff --git a/meta-openeuler/recipes-devtools/llvm/files/0035-cmake-Enable-64bit-off_t-on-32bit-glibc-systems.patch b/meta-openeuler/recipes-devtools/llvm/files/0035-cmake-Enable-64bit-off_t-on-32bit-glibc-systems.patch new file mode 100644 index 00000000000..fe98e3e4c05 --- /dev/null +++ b/meta-openeuler/recipes-devtools/llvm/files/0035-cmake-Enable-64bit-off_t-on-32bit-glibc-systems.patch @@ -0,0 +1,79 @@ +From cd2fa12d715929642513fc441287c402f4560096 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sun, 25 Dec 2022 15:13:41 -0800 +Subject: [PATCH] build: Enable 64bit off_t on 32bit glibc systems + +Pass -D_FILE_OFFSET_BITS=64 to compiler flags on 32bit glibc based +systems. This will make sure that 64bit versions of LFS functions are +used e.g. lseek will behave same as lseek64. Also revert [1] partially +because this added a cmake test to detect lseek64 but then forgot to +pass the needed macro during actual compile, this test was incomplete too +since libc implementations like musl has 64-bit off_t by default on 32-bit +systems and does not bundle -D_LARGEFILE64_SOURCE [2] under -D_GNU_SOURCE +like glibc, which means the compile now fails on musl because the cmake +check passes but we do not have _LARGEFILE64_SOURCE defined. Moreover, +Using the *64 function was transitional anyways so use +-D_FILE_OFFSET_BITS=64 instead + +[1] https://github.com/llvm/llvm-project/commit/8db7e5e4eed4c4e697dc3164f2c9351d8c3e942b +[2] https://git.musl-libc.org/cgit/musl/commit/?id=25e6fee27f4a293728dd15b659170e7b9c7db9bc + +Upstream-Status: Submitted [https://reviews.llvm.org/D139752] +Signed-off-by: Khem Raj +--- + llvm/cmake/config-ix.cmake | 8 +++++--- + llvm/include/llvm/Config/config.h.cmake | 3 --- + llvm/lib/Support/raw_ostream.cpp | 2 -- + llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn | 2 -- + utils/bazel/llvm-project-overlay/llvm/config.bzl | 1 - + .../llvm/include/llvm/Config/config.h | 3 --- + utils/bazel/llvm_configs/config.h.cmake | 3 --- + 7 files changed, 5 insertions(+), 17 deletions(-) + +--- a/llvm/cmake/config-ix.cmake ++++ b/llvm/cmake/config-ix.cmake +@@ -284,9 +284,6 @@ check_symbol_exists(futimes sys/time.h H + if( HAVE_SIGNAL_H AND NOT LLVM_USE_SANITIZER MATCHES ".*Address.*" AND NOT APPLE ) + check_symbol_exists(sigaltstack signal.h HAVE_SIGALTSTACK) + endif() +-set(CMAKE_REQUIRED_DEFINITIONS "-D_LARGEFILE64_SOURCE") +-check_symbol_exists(lseek64 "sys/types.h;unistd.h" HAVE_LSEEK64) +-set(CMAKE_REQUIRED_DEFINITIONS "") + check_symbol_exists(mallctl malloc_np.h HAVE_MALLCTL) + check_symbol_exists(mallinfo malloc.h HAVE_MALLINFO) + check_symbol_exists(mallinfo2 malloc.h HAVE_MALLINFO2) +@@ -350,6 +347,11 @@ check_symbol_exists(__GLIBC__ stdio.h LL + if( LLVM_USING_GLIBC ) + add_definitions( -D_GNU_SOURCE ) + list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE") ++# enable 64bit off_t on 32bit systems using glibc ++ if (CMAKE_SIZEOF_VOID_P EQUAL 4) ++ add_compile_definitions(_FILE_OFFSET_BITS=64) ++ list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_FILE_OFFSET_BITS=64") ++ endif() + endif() + # This check requires _GNU_SOURCE + if (NOT PURE_WINDOWS) +--- a/llvm/include/llvm/Config/config.h.cmake ++++ b/llvm/include/llvm/Config/config.h.cmake +@@ -128,9 +128,6 @@ + /* Define to 1 if you have the header file. */ + #cmakedefine HAVE_LINK_H ${HAVE_LINK_H} + +-/* Define to 1 if you have the `lseek64' function. */ +-#cmakedefine HAVE_LSEEK64 ${HAVE_LSEEK64} +- + /* Define to 1 if you have the header file. */ + #cmakedefine HAVE_MACH_MACH_H ${HAVE_MACH_MACH_H} + +--- a/llvm/lib/Support/raw_ostream.cpp ++++ b/llvm/lib/Support/raw_ostream.cpp +@@ -804,8 +804,6 @@ uint64_t raw_fd_ostream::seek(uint64_t o + flush(); + #ifdef _WIN32 + pos = ::_lseeki64(FD, off, SEEK_SET); +-#elif defined(HAVE_LSEEK64) +- pos = ::lseek64(FD, off, SEEK_SET); + #else + pos = ::lseek(FD, off, SEEK_SET); + #endif diff --git a/meta-openeuler/recipes-devtools/llvm/files/llvm-config b/meta-openeuler/recipes-devtools/llvm/files/llvm-config new file mode 100644 index 00000000000..5e4ded2da5b --- /dev/null +++ b/meta-openeuler/recipes-devtools/llvm/files/llvm-config @@ -0,0 +1,51 @@ +#!/bin/bash +# +# Copyright OpenEmbedded Contributors +# +# SPDX-License-Identifier: MIT +# +# Wrap llvm-config since the native llvm-config will remap some values correctly +# if placed in the target sysroot but for flags, it would provide the native ones. +# Provide ours from the environment instead. + +NEXT_LLVM_CONFIG="$(which -a llvm-config | sed -n 2p)" +if [[ $# == 0 ]]; then + exec "$NEXT_LLVM_CONFIG" +fi + +remain="" +output="" +for arg in "$@"; do + case "$arg" in + --cppflags) + output="${output} ${CPPFLAGS}" + ;; + --cflags) + output="${output} ${CFLAGS}" + ;; + --cxxflags) + output="${output} ${CXXFLAGS}" + ;; + --ldflags) + output="${output} ${LDFLAGS}" + ;; + --shared-mode) + output="${output} shared" + ;; + --libs) + output="${output} -lLLVM" + ;; + --link-shared) + break + ;; + *) + remain="${remain} ${arg}" + ;; + esac +done + +if [ "${remain}" != "" ]; then + output="${output} "$("$NEXT_LLVM_CONFIG" ${remain}) +fi + +echo "${output}" diff --git a/meta-openeuler/recipes-devtools/llvm/llvm_%.bbappend b/meta-openeuler/recipes-devtools/llvm/llvm_%.bbappend new file mode 100644 index 00000000000..aecf4fba330 --- /dev/null +++ b/meta-openeuler/recipes-devtools/llvm/llvm_%.bbappend @@ -0,0 +1,10 @@ +# source bb: yocto-meta-openeuler/meta-openeuler/recipes-devtools/llvm/llvm_15.0.7.bb +SRC_URI:remove = " \ + git://github.com/llvm/llvm-project.git;branch=${BRANCH};protocol=https \ +" + +SRC_URI:prepend = " \ + file://llvm \ +" + +S = "${WORKDIR}/llvm/llvm" diff --git a/meta-openeuler/recipes-devtools/llvm/llvm_15.0.7.bb b/meta-openeuler/recipes-devtools/llvm/llvm_15.0.7.bb new file mode 100644 index 00000000000..f617b172310 --- /dev/null +++ b/meta-openeuler/recipes-devtools/llvm/llvm_15.0.7.bb @@ -0,0 +1,179 @@ +# Copyright (C) 2017 Khem Raj +# Released under the MIT license (see COPYING.MIT for the terms) + +DESCRIPTION = "The LLVM Compiler Infrastructure" +HOMEPAGE = "http://llvm.org" +LICENSE = "Apache-2.0-with-LLVM-exception" +SECTION = "devel" + +LIC_FILES_CHKSUM = "file://LICENSE.TXT;md5=8a15a0759ef07f2682d2ba4b893c9afe" + +DEPENDS = "libffi libxml2 zlib zstd libedit ninja-native llvm-native" + +COMPATIBLE_HOST:riscv64 = "null" +COMPATIBLE_HOST:riscv32 = "null" + +RDEPENDS:${PN}:append:class-target = " ncurses-terminfo" + +inherit cmake pkgconfig + +PROVIDES += "llvm${PV}" + +PV = "15.0.7" + +MAJOR_VERSION = "${@oe.utils.trim_version("${PV}", 1)}" + +LLVM_RELEASE = "${PV}" + +BRANCH = "release/${MAJOR_VERSION}.x" +SRCREV = "8dfdcc7b7bf66834a761bd8de445840ef68e4d1a" +SRC_URI = "git://github.com/llvm/llvm-project.git;branch=${BRANCH};protocol=https \ + file://0007-llvm-allow-env-override-of-exe-path.patch;striplevel=2 \ + file://0001-AsmMatcherEmitter-sort-ClassInfo-lists-by-name-as-we.patch;striplevel=2 \ + file://0035-cmake-Enable-64bit-off_t-on-32bit-glibc-systems.patch;striplevel=2 \ + file://llvm-config \ + " + +UPSTREAM_CHECK_GITTAGREGEX = "llvmorg-(?P\d+(\.\d+)+)" + +S = "${WORKDIR}/git/llvm" + +LLVM_INSTALL_DIR = "${WORKDIR}/llvm-install" + +def get_llvm_arch(bb, d, arch_var): + import re + a = d.getVar(arch_var) + if re.match(r'(i.86|athlon|x86.64)$', a): return 'X86' + elif re.match(r'arm$', a): return 'ARM' + elif re.match(r'armeb$', a): return 'ARM' + elif re.match(r'aarch64$', a): return 'AArch64' + elif re.match(r'aarch64_be$', a): return 'AArch64' + elif re.match(r'mips(isa|)(32|64|)(r6|)(el|)$', a): return 'Mips' + elif re.match(r'riscv(32|64)(eb|)$', a): return 'RISCV' + elif re.match(r'p(pc|owerpc)(|64)', a): return 'PowerPC' + else: + raise bb.parse.SkipRecipe("Cannot map '%s' to a supported LLVM architecture" % a) + +def get_llvm_host_arch(bb, d): + return get_llvm_arch(bb, d, 'HOST_ARCH') + +PACKAGECONFIG ??= "libllvm" +PACKAGECONFIG:class-native = "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'libllvm', '', d)}" +# if optviewer OFF, force the modules to be not found or the ones on the host would be found +PACKAGECONFIG[optviewer] = ",-DPY_PYGMENTS_FOUND=OFF -DPY_PYGMENTS_LEXERS_C_CPP_FOUND=OFF -DPY_YAML_FOUND=OFF,python3-pygments python3-pyyaml,python3-pygments python3-pyyaml" +PACKAGECONFIG[libllvm] = "" + +# +# Default to build all OE-Core supported target arches (user overridable). +# +LLVM_TARGETS ?= "AMDGPU;${@get_llvm_host_arch(bb, d)}" + +ARM_INSTRUCTION_SET:armv5 = "arm" +ARM_INSTRUCTION_SET:armv4t = "arm" + +EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \ + -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \ + -DLLVM_ENABLE_PIC=ON \ + -DLLVM_BINDINGS_LIST='' \ + -DLLVM_LINK_LLVM_DYLIB=ON \ + -DLLVM_ENABLE_FFI=ON \ + -DLLVM_ENABLE_RTTI=ON \ + -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ + -DLLVM_OPTIMIZED_TABLEGEN=ON \ + -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS}' \ + -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \ + -DCMAKE_BUILD_TYPE=Release \ + " + +EXTRA_OECMAKE:append:class-target = "\ + -DCMAKE_CROSSCOMPILING:BOOL=ON \ + -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen${PV} \ + -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config${PV} \ + " + +EXTRA_OECMAKE:append:class-nativesdk = "\ + -DCMAKE_CROSSCOMPILING:BOOL=ON \ + -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen${PV} \ + -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config${PV} \ + " + +# patch out build host paths for reproducibility +do_compile:prepend:class-target() { + sed -i -e "s,${WORKDIR},,g" ${B}/tools/llvm-config/BuildVariables.inc +} + +do_compile() { + if ${@bb.utils.contains('PACKAGECONFIG', 'libllvm', 'true', 'false', d)}; then + ninja -v ${PARALLEL_MAKE} + else + ninja -v ${PARALLEL_MAKE} llvm-config llvm-tblgen + fi +} + +do_install() { + if ${@bb.utils.contains('PACKAGECONFIG', 'libllvm', 'true', 'false', d)}; then + DESTDIR=${D} ninja -v install + + # llvm harcodes usr/lib as install path, so this corrects it to actual libdir + mv -T -n ${D}/${prefix}/lib ${D}/${libdir} || true + + # Remove opt-viewer: https://llvm.org/docs/Remarks.html + rm -rf ${D}${datadir}/opt-viewer + rmdir ${D}${datadir} + + # reproducibility + sed -i -e 's,${WORKDIR},,g' ${D}/${libdir}/cmake/llvm/LLVMConfig.cmake + fi +} + +do_install:append:class-native() { + install -D -m 0755 ${B}/bin/llvm-tblgen ${D}${bindir}/llvm-tblgen${PV} + install -D -m 0755 ${B}/bin/llvm-config ${D}${bindir}/llvm-config${PV} + ln -sf llvm-config${PV} ${D}${bindir}/llvm-config +} + +SYSROOT_PREPROCESS_FUNCS:append:class-target = " llvm_sysroot_preprocess" + +llvm_sysroot_preprocess() { + install -d ${SYSROOT_DESTDIR}${bindir_crossscripts}/ + install -m 0755 ${WORKDIR}/llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/ + ln -sf llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/llvm-config${PV} +} + +PACKAGES =+ "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-libllvm ${PN}-liboptremarks ${PN}-liblto" + +RRECOMMENDS:${PN}-dev += "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-liboptremarks" + +FILES:${PN}-bugpointpasses = "\ + ${libdir}/BugpointPasses.so \ +" + +FILES:${PN}-libllvm = "\ + ${libdir}/libLLVM-${MAJOR_VERSION}.so \ +" + +FILES:${PN}-liblto += "\ + ${libdir}/libLTO.so.* \ +" + +FILES:${PN}-liboptremarks += "\ + ${libdir}/libRemarks.so.* \ +" + +FILES:${PN}-llvmhello = "\ + ${libdir}/LLVMHello.so \ +" + +FILES:${PN}-dev += " \ + ${libdir}/llvm-config \ + ${libdir}/libRemarks.so \ + ${libdir}/libLLVM-${PV}.so \ +" + +FILES:${PN}-staticdev += "\ + ${libdir}/*.a \ +" + +INSANE_SKIP:${PN}-libllvm += "dev-so" + +BBCLASSEXTEND = "native nativesdk" -- Gitee