构建 Clang 时未知的软件包 libcxx 和 libcxxabi?

2023-12-29

我正在尝试使用 libc++ 从源代码构建 Clang。我试图将 libc++ 放入树内,同时使用其他组件在树外构建它。我使用的食谱如下。

如果我简单地放置libcxx and libcxxabiin-tree,然后配置does not拿起它们,它们不是自动构建的。我把它们放在llvm/projects per LLVM 的 libc++ 标准库 http://libcxx.llvm.org/.

另外,添加make cxx食谱并不像宣传的那样起作用LLVM 的 libc++ 标准库 http://libcxx.llvm.org/页。其结果是:

llvm[0]: Constructing LLVMBuild project information.
make: *** No rule to make target `cxx'.  Stop.

当我配置 LLVM/Clang 时--with-libcxx and --with-libcxxabi:

# Issued from a scratch 'build' directory, which is next to the 'llvm' directory.
../llvm/configure --enable-optimized --enable-cxx11 --with-libcxx --with-libcxxabi \
    $OTHER_OPTIONS --prefix=/usr/local

然后我收到以下信息:

configure: WARNING: Unknown project (libcxx) won't be configured automatically
configure: WARNING: Unknown project (libcxxabi) won't be configured automatically

libcxx and libcxxabi实际上是 LLVM 所说的,所以我不确定如果它们不正确应该使用什么名称。

我试图检查configure包名称应该是什么,但它不是很有帮助。逻辑见下文。

如何使用 libc++ 配置和构建 Clang(当 libc++ 和 libc++ ABI 位于树内时)?


配置逻辑--with-XXX如下所示。

这是我能找到的全部(它不是很有帮助):

  -with-* | --with-*)
    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
      { echo "$as_me: error: invalid package name: $ac_package" >&2
   { (exit 1); exit 1; }; }
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval with_$ac_package=\$ac_optarg ;;

相关链接:

  • LLVM/Clang 下载页面 http://llvm.org/releases/download.html
  • LLVM 的 libc++ 标准库页面 http://libcxx.llvm.org/

与此堆栈溢出问题相关:从源代码构建 Clang 时什么时候需要 libc++ 源代码? https://stackoverflow.com/q/27812611

CFE-Dev 邮件列表的讨论:关于 Linux 版 libc++ 及其 git 存储库的问题(如果有) http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-July/thread.html。该线程说将 libcxx 解包到llcm/projects确保标头被复制到 Clang 期望的位置make install。但它并没有解决--with-XXX问题,它没有讨论为什么libc++没有构建,也没有讨论如何获得make install实际安装库。


获取和构建 Clang 的配方。当not包括libcxx and libcxxabi.

#! /bin/sh

# Clang 3.5 recipe.
#   The script should be run from a scratch directory.

# Fetch

if [ ! -e llvm-3.5.0.src.tar.xz ]; then
  wget http://llvm.org/releases/3.5.0/llvm-3.5.0.src.tar.xz
fi

if [ ! -e cfe-3.5.0.src.tar.xz ]; then
  wget http://llvm.org/releases/3.5.0/cfe-3.5.0.src.tar.xz
fi

if [ ! -e compiler-rt-3.5.0.src.tar.xz ]; then
  wget http://llvm.org/releases/3.5.0/compiler-rt-3.5.0.src.tar.xz
fi

if [ ! -e libcxx-3.5.0.src.tar.xz ]; then
  wget http://llvm.org/releases/3.5.0/libcxx-3.5.0.src.tar.xz
fi

if [ ! -e libcxxabi-3.5.0.src.tar.xz ]; then
  wget http://llvm.org/releases/3.5.0/libcxxabi-3.5.0.src.tar.xz
fi

if [ ! -e clang-tools-extra-3.5.0.src.tar.xz ]; then
  wget http://llvm.org/releases/3.5.0/clang-tools-extra-3.5.0.src.tar.xz
fi

# Cleanup

echo "Cleaning up artifacts"
rm -rf llvm build llvm-3.5.0.src

# LLVM
echo "Unpacking LLVM"
tar xf llvm-3.5.0.src.tar.xz
mv llvm-3.5.0.src/ llvm

# Clang Front End
echo "Unpacking Clang Front End"
cd llvm/tools
tar xf ../../cfe-3.5.0.src.tar.xz
mv cfe-3.5.0.src clang
cd ../../

# Compiler RT
echo "Unpacking Compiler RT"
cd llvm/projects
tar xf ../../compiler-rt-3.5.0.src.tar.xz
mv compiler-rt-3.5.0.src/ compiler-rt
cd ../../

# Extra Tools
echo "Unpacking Extra Tools"
cd llvm/tools/clang/tools/
tar xf ../../../../clang-tools-extra-3.5.0.src.tar.xz
mv clang-tools-extra-3.5.0.src extra
cd ../../../../

# libc++
echo "Unpacking libc++"
cd llvm/projects
tar xf ../../libcxx-3.5.0.src.tar.xz
mv libcxx-3.5.0.src/ libcxx
cd ../../

# libc++ ABI
echo "Unpacking libc++ ABI"
cd llvm/projects
tar xf ../../libcxxabi-3.5.0.src.tar.xz
mv libcxxabi-3.5.0.src/ libcxxabi
cd ../../

# Determine if Apple
IS_DARWIN=`uname -s | egrep -i -c "Darwin"`
if [ $IS_DARWIN -ne 0 ]; then
  OTHER_OPTIONS=" --enable-libcpp"
fi

# Configure
echo "Configuring build"
mkdir -p build
cd build
../llvm/configure --enable-optimized --enable-cxx11 --with-libcxx --with-libcxxabi $OTHER_OPTIONS --prefix=/usr/local

# Build
# 'make cxx' for libc++ is from http://libcxx.llvm.org/
echo "Running make"
make cxx
make -j2

RET=$?
if [ $RET -eq 0 ];then
    echo "****************************************"
    read -p "Press [ENTER] to install, or [CTRL]+C to quit"
    sudo make install
fi

# ****************************************
# ****************************************

# Install does not install scan-build and scan-view
# Perform the copy, and/or put them on-path

#sudo cp llvm/projects/compiler-rt/lib/asan/scripts/asan_symbolize.py /usr/local/bin
#sudo 2to3 -w /usr/local/bin/asan_symbolize.py

#sudo mkdir /usr/local/bin/scan-build
#sudo cp -r llvm/tools/clang/tools/scan-build /usr/local/bin

#sudo mkdir /usr/local/bin/scan-view
#sudo cp -r llvm/tools/clang/tools/scan-view /usr/local/bin

这是我用来构建 libcxxabi 和 libcxx 的脚本。它使用之前构建的 Clang(使用 GCC(在我的例子中为 4.8.3)和 GCC STL):

if ( $#argv != 2 ) then
    echo "Usage: [32|64] <directory>"
    exit
endif

set echo on

set CMake=<CMake executable>
set GCCDir=<recent GCC directory>
set LLVMSourceDir=${PWD}/llvm-${LLVM_VERSION}.src
set LLVMOutOfTreeSourceDir=${PWD}
set LLVMPass1Dir=${PWD}/pass1
set PythonDir=<Python directory>
set InstallDir=${PWD}/$argv[2]

if ( $argv[1] == 32 ) then
    set GCC_EHDir=${GCCDir}/lib/gcc/x86_64-redhat-linux/4.8.3/32
    set BuildMode="-m32"
    set LibDirSuffix=""
else
    set GCC_EHDir=${GCCDir}/lib/gcc/x86_64-redhat-linux/4.8.3
    set BuildMode="-m64"
    set LibDirSuffix="64"
endif

set BuildDir=libcxxabi.build

if ( -d ${BuildDir} ) then
    rm -rf ${BuildDir}
endif

mkdir ${BuildDir}
cd ${BuildDir}

${CMake}                                                \
    -DCMAKE_BUILD_TYPE="Release"                                    \
    -DCMAKE_INSTALL_PREFIX:PATH=${InstallDir}                           \
    -DCMAKE_C_COMPILER=${LLVMPass1Dir}/bin/clang                            \
    -DCMAKE_C_FLAGS=${BuildMode}                                    \
    -DCMAKE_CXX_COMPILER=${LLVMPass1Dir}/bin/clang++                        \
    -DCMAKE_CXX_FLAGS=${BuildMode}                                  \
    -DCMAKE_SHARED_LINKER_FLAGS="-L ${GCC_EHDir}"                           \
    -DCMAKE_STATIC_LINKER_FLAGS="${GCC_EHDir}/libgcc_eh.a"                      \
    -DLLVM_FORCE_USE_OLD_TOOLCHAIN=YES                              \
    -DLLVM_PATH=${LLVMSourceDir}                                    \
    -DLIBCXXABI_LIBCXX_INCLUDES=${LLVMOutOfTreeSourceDir}/libcxx-${LLVM_VERSION}.src/include    \
    -DLIBCXXABI_LIBCXX_PATH=${LLVMOutOfTreeSourceDir}/libcxx-${LLVM_VERSION}.src            \
    -DLIBCXXABI_LIBDIR_SUFFIX=${LibDirSuffix}                           \
    ${LLVMOutOfTreeSourceDir}/libcxxabi-${LLVM_VERSION}.src

make
make install

cd ..

set BuildDir=libcxx.build

if ( -d ${BuildDir} ) then
    rm -rf ${BuildDir}
endif

mkdir ${BuildDir}
cd ${BuildDir}

${CMake}                                                \
    -DCMAKE_BUILD_TYPE="Release"                                    \
    -DCMAKE_INSTALL_PREFIX:PATH=${InstallDir}                           \
    -DCMAKE_C_COMPILER=${LLVMPass1Dir}/bin/clang                            \
    -DCMAKE_C_FLAGS=${BuildMode}                                    \
    -DCMAKE_CXX_COMPILER=${LLVMPass1Dir}/bin/clang++                        \
    -DCMAKE_CXX_FLAGS=${BuildMode}                                  \
    -DCMAKE_SHARED_LINKER_FLAGS="-L ${GCCDir}/lib${LibDirSuffix}"                   \
    -DLLVM_PATH=${LLVMSourceDir}                                    \
    -DLIBCXX_CXX_ABI=libcxxabi                                  \
    -DLIBCXX_CXX_ABI_INCLUDE_PATHS=${LLVMOutOfTreeSourceDir}/libcxxabi-${LLVM_VERSION}.src/include  \
    -DLIBCXX_CXX_ABI_LIBRARY_PATH=${InstallDir}/lib                         \
    -DLIBCXX_LIBDIR_SUFFIX=${LibDirSuffix}                              \
    -DLIT_EXECUTABLE=${LLVMSourceDir}/utils/lit/lit.py                      \
    ${LLVMOutOfTreeSourceDir}/libcxx-${LLVM_VERSION}.src

make
make install

cd ..
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建 Clang 时未知的软件包 libcxx 和 libcxxabi? 的相关文章

随机推荐

  • 使 svg 缩放至全屏尺寸

    我正在尝试将 svg 缩放到浏览器窗口的完整大小 svg 对象位于 div 内 高度和宽度均设置为 100 我尝试使用 svg 内的 viewBox 但无济于事 我使用的屏幕分辨率为 1080p div style width 100 he
  • C++ 定义、声明和赋值到底是什么?

    我倾向于交替使用 定义 声明 和 分配 这三个词 但这似乎会冒犯某些人 这合理吗 我应该只在第一次分配给变量时使用 声明 一词吗 或者还有比这更多的事情吗 定义是描述值或函数的地方 即编译器或程序员被准确地告知它是什么 例如 int foo
  • Python 程序在 PyCharm 中运行后,Tkinter 窗口自动关闭

    我正在 PyCharm 中编写一个小型 Python 游戏 我正在使用 Python 3 4 版本的 Macbook 上执行此操作 游戏会打开一个 Tkinter 窗口并向其中添加一些内容 但是 运行游戏时 它会显示非常短暂并立即关闭 我在
  • 瀑布对话中的 Microsoft Bot Framework LUIS

    我有一个现有的瀑布对话 我想对其进行调整 以便它可以从更复杂的用户对机器人问题的响应中提取数据 在我的 LUIS 应用程序中 我创建了一个名为GetLocation它被训练来寻找一个名为的实体Location 一个例子是用户输入 我正在布里
  • Rails + 延迟作业 => 电子邮件视图模板未更新

    我正在为我的应用程序使用 Rails Delayed Job 每次我更新电子邮件视图时 服务器 延迟的作业都不会接收它 谁在进行缓存 铁路还是延迟工作 知道如何修复它吗 其他信息 我尝试重新启动延迟的作业 但仍然没有帮助 Thanks 旧版
  • .NET (C#) 窗口最小化事件

    嘿 我真的被我的项目困住了 我需要知道任何打开的窗口何时被最小化 恢复并在我自己的应用程序中处理事件 有任何想法吗 编辑 Musigenesis 是对的 我确实想知道其他应用程序何时最小化 恢复 我认为您需要使用 SetWindowsHoo
  • 如何将图片保存在我的应用程序的特定文件夹中(正确)?

    问题是我的应用程序保存图片两次 一个在相机文件夹中 另一个在我指定的文件夹中 但当我在另一台设备上测试该应用程序时 这并没有发生 lunch the camera and make a file to save the image in a
  • Excel表格查找两列的匹配值

    我想创建一个匹配两列的表查找公式 例如 假设我想找到的值Letter所在行的列Type列是Biennial和Result列是Warning A B C 1 Letter Type Result 2 A Annual Exceeds 3 B
  • zsh vi 模式状态行

    zsh 或 bash 有没有办法获得状态行 例如在 VI 中 它会让您知道您处于插入模式 插入 是否有等效的命令行 这已经在以下位置得到了回答超级用户 https superuser com questions 151803 how do
  • 流畅的 NHibernate API 和 .NET 2.0

    我可以将 Fluent NHibernate API 用于 NET 2 0 应用程序吗 否 FluentNhibernate 需要 NET 3 5
  • 确定文件身份的算法

    对于一个开源项目 我正在文件系统之上编写一个抽象层 该层允许我将元数据和关系附加到每个文件 我希望该层能够优雅地处理文件重命名 并在文件被重命名 移动或复制时维护元数据 为此 我需要一种计算文件身份的机制 显而易见的解决方案是计算每个文件的
  • WKWebView 的 WKSelectionGranularityCharacter 选项在 iOS 9 中损坏

    我有一个 iPad 应用程序 使用WKSelectionGranularityCharacter的选项WKWebView 它在 iOS 8 设备上运行良好 在 8 4 模拟器上运行 但在 9 1 上损坏 长按文本会显示放大镜 但松开后不会突
  • Visual Studio 2017 构建工具仍然可供下载吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 Visual Studio 2017 构建工具 它们在某处还可用吗 我可以找到2015 ht
  • 在 ASP.NET Core 中将 html 导出为 pdf

    我想将一段 html 导出到 pdf 文件 但我没有任何兼容的 nuget 包 当我尝试安装任何人时 X 与 netcoreapp1 0 NETCoreApp 版本 v1 0 不兼容 有谁知道使用 ASP NET Core 导出为 pdf
  • 将 PHP 变量传递给 Google Maps API

    当用户注册我的应用程序 大学项目 时 系统会要求他们提供地址 我将此地址转换为纬度和经度 然后将其存储在我的数据库中 我像这样访问纬度和经度
  • CoAP 观察者过多

    我想 观察 CoAP 服务器中的资源 但我注意到 在我注册观察服务器中的一些资源后 我尝试 观察 的其他资源会抛出一条消息 提示 观察者太多 我正在使用 Copper Firefox 连接到服务器 CoAP 服务器可以观察到的资源是否有限制
  • Rails:在连接上使用 .references,即使这不是必需的

    我知道当你使用includes并且您指定一个where连接表上的子句 您应该使用 references example will error out or throw deprecation warning in logs customer
  • 为什么局部变量的常量性会抑制返回值的移动语义?

    struct STest public boost noncopyable STest STest test m n std move test m n explicit STest int n m n n int m n STest Fu
  • 如何在单个查询中获取最大值和最小值?

    我正在使用 MySQL 并且正在寻找一种从两列 例如 posx and posy 仅使用一个查询 Simple SELECT MIN posx MIN posy MAX posx MAX posy FROM table
  • 构建 Clang 时未知的软件包 libcxx 和 libcxxabi?

    我正在尝试使用 libc 从源代码构建 Clang 我试图将 libc 放入树内 同时使用其他组件在树外构建它 我使用的食谱如下 如果我简单地放置libcxx and libcxxabiin tree 然后配置does not拿起它们 它们