开源编译器LLVM-源码编译

1.编译参考

详细的cmake编译选项,参考:Building LLVM with CMake — LLVM 18.0.0git documentation

2.编译脚本

utils.bash

build-llvm.sh 依赖 utils.bash 脚本

#!/usr/bin/env bashCOLOR_FATAL=$'\033[41;38m'
COLOR_ERROR=$'\033[1;31m'
COLOR_WARN=$'\033[1;33m'
COLOR_NOTE=$'\033[1;32m'
COLOR_INFO=$'\033[1;34m'
COLOR_TRACE=$'\033[0;37m'
COLOR_RESET=$'\033[0m'log_colored () {if [ -t 1 ]; thenecho -n $1fishiftecho -e "[$PROG_NAME] $*"if [ -t 1 ]; thenecho -e -n $COLOR_RESETfi
}log_fatal () {log_colored $COLOR_FATAL $*exit -1
}log_error () {log_colored $COLOR_ERROR $*
}log_warn () {log_colored $COLOR_WARN $*
}log_note () {log_colored $COLOR_NOTE $*
}log_info () {log_colored $COLOR_INFO $*
}log_trace () {log_colored $COLOR_TRACE $*
}prog_log_fatal () {log_fatal  "|FATAL| $*"
}prog_log_error () {log_error "|ERROR| $*"
}prog_log_warn () {log_warn "|WARNING| $*"
}prog_log_note () {log_note "|NOTE| $*"
}prog_log_info () {log_info "|INFO| $*"
}prog_log_trace () {log_trace "|TRACE| $*"
}join_by () {# bash method like python ",".join([a, b, c,])# @ref Stack Overflow 1527049 how-can-i-join-elements-of-an-array-in-bashlocal d=${1-} f=${2-}if shift 2; thenprintf %s "$f" "${@/#/$d}"fi
}version_le () {# compare v1:a.b.c and v2:x.y.z# check v1 <= v2, return 0 for true, 1 for falselocal v1=$1local v2=$2[ "$v1" = "$(echo -e "$v1\n$v2" | sort -V | head -n1)" ]
}download_pkg () {local _url=$1local _filename=$(basename $_url)local _download_dir=$2local _package_verify=$(wget -c ${_url}.md5sum --timeout=10 -qO-)# ugly workaround for cntoolkit md5sum naming buglocal _package_verify_fixname=$(paste <(awk '{print $1}' <<< "$_package_verify") <(echo "$_filename"))pushd ${_download_dir} >/dev/null## Download package in either condition:#### 1. File not found#### 2. File.md5sum not found#### 3. File and md5sum does not matchif [ ! -f "${_filename}" ] \|| [ -z "${_package_verify}" ] \|| [ -n "$(echo ${_package_verify_fixname} | md5sum --check --quiet || :)" ]; thenrm -rf ${_filename}wget --progress=bar:force:noscroll -c ${_url} --timeout=100elseprog_log_trace "download_pkg hit cache for ${_filename}"fipopd >/dev/null
}get_json_val_from_str () {# def get_json_val (json_file, key, default_value=None)# parse json file and fetch value by key name# XXX Does not support nested object yetjson_val='' # return valuelocal input=$1local key=$2local match_pattern="\"${key}\".*"# json may contains newline and spaces# TODO avoid deleting spaces inside value stringlocal matched_str=`echo ${input} | sed -z 's/\n//g' | sed -r 's/ +//g' | grep -E -o ${match_pattern} | sed -r "s/^\"${key}\" *://"`# parse formats below:#  | "(?key)":{(?object)}#  | "(?key)":[(?array)]#  | "(?key)":(true | false | null)#  | "(?key)":(?number)#  | "(?key)":"(?string)"local next_char=${matched_str:0:1}case $next_char in'{')# value may be object# TODO match nested bracesjson_val=$(cut -d '{' -f 2 <<< ${matched_str} | cut -d '}' -f 1);;'[')# value may be array# TODO match nested bracketsjson_val=$(cut -d '[' -f 2 <<< ${matched_str} | cut -d ']' -f 1);;'"')json_val=$(sed -r 's/"([^"]+)".*/\1/' <<< ${matched_str});;'t' | 'f' | 'n')json_val=$(sed -r 's/^(true|false|null).*/\1/' <<< ${matched_str});;[-.0-9])# TODO validate numberjson_val=$(sed -r 's/([-.0-9]+).*/\1/' <<< ${matched_str});;*);;esac# | cut -d '{' -f 2 | cut -d '}' -f 1`if [ -z "${json_val}" ] && [ -n "$3" ]; then# return default value (if set)json_val=$3fiecho ${json_val};
}get_json_val () {get_json_val_from_str "`cat $1`" $2 $3
}common_extract () {local file_ext=${1##*.}local overwrite=$3local write_flag=mkdir -vp $2pushd $2 >/dev/nullcase ${file_ext} inrpm)[ -n "${overwrite}" ] && write_flag="-u"[ -n "${BUILD_VERBOSE}" ] && local ex_flag="-v"rpm2cpio $1 | cpio ${write_flag} -di $ex_flag;;deb)[ -n "${overwrite}" ] && write_flag="--force-overwrite"[ -n "${BUILD_VERBOSE}" ] && local dpkg_ex="-X"dpkg ${dpkg_ex:--x} ${write_flag} $1 ./;;gz)write_flag="--keep-newer-files"[ -n "${overwrite}" ] && write_flag="--overwrite"[ -n "${BUILD_VERBOSE}" ] && local ex_flag="-v"#  --no-same-owner for docker rootlesstar ${write_flag} --no-same-owner -zxf $ex_flag $1;;xz)write_flag="--keep-newer-files"[ -n "${overwrite}" ] && write_flag="--overwrite"[ -n "${BUILD_VERBOSE}" ] && local ex_flag="-v"tar ${write_flag} --no-same-owner -Jxf $ex_flag $1;;bz2)write_flag="--keep-newer-files"[ -n "${overwrite}" ] && write_flag="--overwrite"[ -n "${BUILD_VERBOSE}" ] && local ex_flag="-v"tar ${write_flag} --no-same-owner -jxf $ex_flag $1;;*)prog_log_fatal "Unknown file extension ${file_ext}, cannot extract this"esacpopd >/dev/null
}select_arch () {local arch=$1arch_name=''case $arch inx86_64)arch_name="amd64";;aarch64)arch_name="arm64";;*)echo 'unknown arch name'esacecho ${arch_name}
}workaround_cmake_3_5_pkg_name () {# workaround for cmake 3.5, which does not support `CPACK_DEBIAN_<COMPONENT>_FILE_NAME` welllocal build_dir=$1local component=$2local component_lower=$(tr '[:upper:]' '[:lower:]' <<< $component)cmake3 --version 2>/dev/null && CMAKE=${CMAKE:-cmake3} || CMAKE=${CMAKE:-cmake}local cmake_minor_version=`${CMAKE} --version | head -n1 | cut -d '.' -f2`local cpack_debian_package_name=`sed -n "s@SET(CPACK_DEBIAN_${component}_FILE_NAME *\"\(.*\)\")@\1@p" $build_dir/CPackConfig.cmake`local cpack_rpm_package_name=`sed -n "s@SET(CPACK_RPM_${component}_FILE_NAME *\"\(.*\)\")@\1@p" $build_dir/CPackConfig.cmake`local package_name=`sed -n "s@SET(CPACK_PACKAGE_NAME *\"\(.*\)\")@\1@p" $build_dir/CPackConfig.cmake`local package_vesion=`sed -n "s@SET(CPACK_PACKAGE_VERSION *\"\(.*\)\")@\1@p" $build_dir/CPackConfig.cmake`echo $cmake_minor_versionecho $cpack_debian_package_nameif [ "${cmake_minor_version}" -lt "6" ]; thenif [ -d $build_dir/_CPack_Packages/Linux/DEB/ ]; thenfor files in $build_dir/_CPack_Packages/Linux/DEB/$package_name-$package_vesion-Linux-$component_lower.deb; doif [ ! -f "$files" ]; then break; fimv $files `dirname $files`/${cpack_debian_package_name}donefor files in $build_dir/$package_name-$package_vesion-Linux-$component_lower.deb; doif [ ! -f "$files" ]; then break; fimv $files `dirname $files`/${cpack_debian_package_name}donefiif [ -d $build_dir/_CPack_Packages/Linux/RPM/RPMS ]; thenfor files in $build_dir/_CPack_Packages/Linux/RPM/RPMS/$package_name-$package_vesion-Linux-$component_lower.rpm; doif [ ! -f "$files" ]; then break; fimv $files `dirname $files`/${cpack_rpm_package_name}donefor files in $build_dir/$package_name-$package_vesion-Linux-$component_lower.rpm; doif [ ! -f "$files" ]; then break; fimv $files `dirname $files`/${cpack_rpm_package_name}donefifi
}

build-llvm.sh

#! /usr/bin/env bash
set -e
# import common method like `download_pkg`, `get_json_val`, `common_extract`, etc
. ./utils.bash
PROG_NAME=$(basename $0)  # current script filename, DO NOT EDITSCRIPT_DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
prog_log_info "SCRIPT_DIR=${SCRIPT_DIR}"BUILD_PATH=${SCRIPT_DIR}/build
CMAKE=cmakeexport BUILD_MODE=${BUILD_MODE:-Release} # release/debug
export BUILD_JOBS="${BUILD_JOBS:-16}" # concurrent build jobs
export BUILD_TARGET="${BUILD_TARGET:-cuda}" # concurrent build jobs# install path
LLVM_INSTALL_PATH=${SCRIPT_DIR}/install#####################################
## usage and command line parsing  ##
###################################### setup short options, follow alphabetical order
short_args=(h   # helpd   # debugj:  # jobst:  # target
)
# setup long options, follow alphabetical order
long_args=(debughelpjobs:target:
)usage () {echo "USAGE: ./build.sh <options>"echoecho "OPTIONS:"echo "      -h, --help                  Print usage."echo "      -d, --debug                 Build with debug mode"echo "      -j N, --jobs=N              Build for N parallel jobs."echo "      -t cuda, --target=cuda      Build target, default cuda (cuda or rocm)."echo
}_short_args_joined=$(join_by , ${short_args[@]})
_long_args_joined=$(join_by , ${long_args[@]})# parse arguments and setup internal env
_cmdline_args=$(getopt -o $_short_args_joined --long $_long_args_joined -n $PROG_NAME -- "$@" || usage -1)
eval set -- "$_cmdline_args"if [ $# != 0 ]; thenwhile true; docase "$1" in-h | --help)usageexit 0;;-d | --debug)shiftexport BUILD_MODE="Debug"prog_log_note "Using debug build mode";;-j | --jobs)shiftexport BUILD_JOBS=$1shift;;-t | --target)shiftexport BUILD_TARGET=$1shift;;--)shiftif [ $# -gt 0 ]; thenprog_log_warn "ignore '--', command line args meaning has been changed, check README.md for more details"sleep 1 # I hope user will see itfi;;*)if [ $# -eq 0 ]; thenbreakfi_cmdline_args=$(getopt -o $_short_args_joined --long $_long_args_joined -n $PROG_NAME -- "$@" || usage -1)eval set -- "$_cmdline_args";;esacdone
fiprog_log_info "BUILD_TARGET=${BUILD_TARGET}"
prog_log_info "BUILD_MODE=${BUILD_MODE}"
prog_log_info "BUILD_JOBS=${BUILD_JOBS}"if [ ! -d "$BUILD_PATH" ]; thenmkdir "$BUILD_PATH"
firm -rf ${BUILD_PATH}/*
rm -fr ${LLVM_INSTALL_PATH}/*# compile nvidia platform
build_cuda() {pushd ${BUILD_PATH} > /dev/null${CMAKE} ../llvm \-DCMAKE_BUILD_TYPE=${BUILD_MODE} \-DCMAKE_INSTALL_PREFIX=${LLVM_INSTALL_PATH} \-DLLVM_ENABLE_ASSERTIONS=1 \-DLLVM_TARGETS_TO_BUILD="NVPTX;X86" \-DLLVM_ENABLE_PROJECTS="llvm;clang;lld;lldb" \-DLLVM_ENABLE_RUNTIMES="compiler-rt" \-DLLVM_USE_LINKER=lld \-DLLVM_ENABLE_RTTI=ON \-DLLVM_ENABLE_ZSTD=ON \-DLLVM_ENABLE_ZLIB=ON \-DLLVM_ENABLE_FFI=ON \-DLLVM_CCACHE_BUILD=ON \-DLLVM_ENABLE_EH=ON \-DLLVM_USE_LINKER=goldmake -j ${BUILD_JOBS}; make installpopd > /dev/null
}# compile amd platform
build_rocm() {pushd ${BUILD_PATH} > /dev/null${CMAKE} ../llvm \-DCMAKE_BUILD_TYPE=${BUILD_MODE} \-DCMAKE_INSTALL_PREFIX=${LLVM_INSTALL_PATH} \-DLLVM_ENABLE_ASSERTIONS=1 \-DLLVM_TARGETS_TO_BUILD="AMDGPU;X86" \-DLLVM_ENABLE_PROJECTS="llvm;clang;lld;lldb" \-DLLVM_ENABLE_RUNTIMES="compiler-rt" \-DLLVM_USE_LINKER=lld \-DLLVM_ENABLE_RTTI=ON \-DLLVM_ENABLE_ZSTD=ON \-DLLVM_ENABLE_ZLIB=ON \-DLLVM_ENABLE_WARNINGS=ON \-DLLVM_ENABLE_FFI=ON \-DLLVM_ENABLE_PIC=ON \-DLLVM_CCACHE_BUILD=ON \-DLLVM_ENABLE_EH=ON \-DLLVM_USE_LINKER=goldmake -j ${BUILD_JOBS}; make installpopd > /dev/null
}if [ "${BUILD_TARGET}"x  = "cuda"x ]
thenbuild_cuda
elif [  "${BUILD_TARGET}"x  = "rocm"x  ]
thenbuild_rocm
elseprog_log_error "UnRecognized target ${BUILD_TARGET}..."usage
fi

3.编译nvidia平台

拉取代码

git clone --recursive https://github.com/llvm/llvm-project.git

编译

./build-llvm.sh -t cuda

4.编译amd平台

拉取代码

git clone --recursive https://github.com/RadeonOpenCompute/llvm-project.git

编译

./build-llvm.sh -t rocm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/175636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git多库多账号本地SSH连接配置方法

Git多库多账号本地SSH连接配置方法 一、前言二、环境三、帮助文档四、多环境配置4.1 配置config文件 五、生成RSA秘钥对5.1 ssh秘钥位置5.2 生成秘钥对&#xff08;公钥、私钥&#xff09;5.3 添加公钥到GIT用户配置中 六 测试git是否可以使用七、总结 一、前言 在使用Git管理…

qt QString字符串常用转换

QString字符串转换类型,常见的有: 1. const char*初始化QString.即const char*类型转QString字符串类型. QString str("肖战");qDebug() <<str; 2. QChar数组初始化QString.即QChar字符数组转QString字符串. QChar cHello[5] {H,e,l,l,o};QString strHell…

nodejs+vue+elementui足球篮球联赛系统

系统主要是以后台管理员管理为主。管理员需要先登录系统然后才可以使用本系统&#xff0c;管理员可以对个人中心、用户管理、赛事信息管理、球队信息管理、球员信息管理、比赛分值板管理、系统管理等进行添加、查询、修改、删除&#xff0c;以保障足球联赛管理系统的正常运行。…

spring Cloud在代码中如何应用,erueka 客户端配置 和 服务端配置,Feign 和 Hystrix做高可用配置

文章目录 Eureka一、erueka 客户端配置二、eureka 服务端配置 三、高可用配置FeignHystrix 通过这篇文章来看看spring Cloud在代码中的具体应用&#xff0c;以及配置和注解&#xff1b; Eureka 一、erueka 客户端配置 1、Eureka 启禁用 eureka.client.enabledtrue 2、Eurek…

【python程序】把小于10的数值都变成1

【python程序】把小于10的数值都变成1 import numpy as np import xarray as xra xr.DataArray(np.arange(25).reshape(5, 5)) a[np.where(a < 10)] 1 print(a)

对百度搜索页面设计的测试用例设计

测试百度搜索页面设计时&#xff0c;可以设计多种测试用例来确保页面的功能、性能和用户体验。以下是一些可能的测试用例&#xff1a; 搜索框功能测试&#xff1a; 输入有效关键字&#xff0c;验证搜索结果是否正确显示。输入无效关键字或特殊字符&#xff0c;验证系统是否给出…

公网穿透和RTC

RTC RTC 是 Real-Time Communication 的简写&#xff0c;正如其中文名称 “即时通讯” 的意思一样&#xff0c;RTC 协议被广泛用于各种即时通讯领域&#xff0c;诸如&#xff1a; 在线教育&#xff1b;直播中的主播连麦 PK&#xff1b;日常生活的音视频电话&#xff1b;.....…

Filebeat 部署

目录 &#xff08;1&#xff09;下载 &#xff08;2&#xff09;解压 &#xff08;3&#xff09;修改配置 &#xff08;4&#xff09;启动 &#xff08;5&#xff09;配置nginx 为什么用 Filebeat &#xff0c;而不用原来的 Logstash 呢&#xff1f; 原因很简单&#xff0c…

Python基础语法之学习type()函数

Python基础语法之学习type函数 一、代码二、效果 查看数据类型或者说查看变量存储的数据类型 一、代码 print(type("文本")) print(type(666)) print(type(3.14))二、效果 梦想是生活的指南针&#xff0c;坚持追逐梦想&#xff0c;终将抵达成功的彼岸。不要害怕失败…

深度学习中的Transformer机制

Transformer 是一种深度学习模型结构&#xff0c;最初由Vaswani等人于2017年提出&#xff0c;用于自然语言处理任务&#xff0c;尤其是机器翻译。Transformer 引入了自注意力机制&#xff08;self-attention mechanism&#xff09;&#xff0c;这是其在处理序列数据时的关键创新…

什么是终端服务器

什么是终端服务器 服务器的种类非常多&#xff0c;除了最为常用的wed服务器之外&#xff0c;还有高防服务器、缓存服务器以及终端服务器。什么是终端服务器&#xff0c;终端服务器有哪些工作方式&#xff1f; 终端服务器 什么是终端服务器终端服务器可以用在局域网上将很多终…

ESP32-Web-Server编程-JS 基础 1

ESP32-Web-Server编程-JS 基础 1 概述 前述分别在 HTML 基础 和 CSS 基础 中介绍了 HTML、CSS 的基本内容。HTML 定义了网页中包含哪些对象&#xff0c;CSS 定义了对象的显示样式。JavaScript(LiveScript)是一种运行于客户端的解释性脚本语言&#xff0c;使 HTML 页面更具动态…

多线程04 死锁,线程可见性

前言 前面我们讲到了简单的线程安全问题以及简单的解决策略 其根本原因是cpu底层对线程的抢占式调度策略,随机调度 其他还有一些场景的问题如下 1.多个线程同时修改一个变量问题 2.执行的操作指令本身不是原子的 比如自增操作就分为三步,加载,自增,保存 3.内存可见性问题 4.指令…

9.增删改操作

目录 一、插入操作 1、为表的所有字段插入数据 2、为表的指定字段插入数据 3、同时插入多条记录 4、将查询结果插入表中&#xff1a; 二、更新操作 三、删除操作 四、练习题 一、插入操作 在使用数据库之前&#xff0c;数据库中必须要有数据&#xff0c;MYSQL中使INSE…

C语言中文网 - Shell脚本 - 11 - 执行Shell脚本(多种方法)

第1章 Shell基础&#xff08;开胃菜&#xff09; 11. 执行Shell脚本&#xff08;多种方法&#xff09; 上节我们编写了一个简单的 Shell 脚本&#xff0c;这节我们就让它运行起来。运行 Shell 脚本有两种方法&#xff0c;一种在新进程中运行&#xff0c;一种是在当前 Shell 进…

【李宏毅-元学习】

一、基本概念 1、元学习&#xff1a;学习如何学习&#xff0c;超参数调整 2、机器学习和元学习 机器学习&#xff1a;定义函数&#xff08;未知参数&#xff09;-定义损失函数-优化&#xff08;最小化损失函数&#xff09; 3、什么是元学习 机器学习通过三个步骤找到了学习算…

python 列表的操作

增加 # append 在已有的列表末尾插入一个值 list1[张三,李四] list1.append(王二) print(list1)# expand 在已有的列表末尾追加一个列表 list1 [love,peace,keep] list2 [beautiful,string] list1.extend(list2) print(list1)# insert 在指定位置插入一个值list1 [love,peac…

【Web】PHP反序列化刷题记录

目录 ①[NISACTF 2022]babyserialize ②[NISACTF 2022]popchains ③[SWPUCTF 2022 新生赛]ez_ez_unserialize ④[GDOUCTF 2023]反方向的钟 再巩固下基础 ①[NISACTF 2022]babyserialize <?php include "waf.php"; class NISA{public $fun"show_me_fla…

pycharm 怎么切换Anaconda简单粗暴

&#xff08;1&#xff09;创建一个环境 &#xff08;2&#xff09;选择一下自己conda的安装路径中conba.exe (3)选择存在的环境&#xff0c;一般会自动检测到conda创建有哪些环境&#xff0c;导入就行

蓝桥杯刷题day01——字符串中的单词反转

题目描述 你在与一位习惯从右往左阅读的朋友发消息&#xff0c;他发出的文字顺序都与正常相反但单词内容正确&#xff0c;为了和他顺利交流你决定写一个转换程序&#xff0c;把他所发的消息 message 转换为正常语序。 注意&#xff1a;输入字符串 message 中可能会存在前导空…