【发布时间】:2015-01-10 22:40:41
【问题描述】:
我正在尝试从源代码中使用 libc++ 构建 Clang。而且我正在尝试将 libc++ 放入树中,同时使用其他组件在树外构建它。我使用的配方如下。
如果我只是将libcxx 和libcxxabi 放在树中,那么配置不会 拾取它们,并且它们不会自动构建。我根据LLVM's libc++ Standard Library 将它们放在llvm/projects 中。
此外,将make cxx 添加到配方中并不像LLVM's libc++ Standard Library 页面上所宣传的那样起作用。结果是:
llvm[0]: Constructing LLVMBuild project information.
make: *** No rule to make target `cxx'. Stop.
当我使用 --with-libcxx 和 --with-libcxxabi 配置 LLVM/Clang 时:
# 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 和 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 ;;
相关链接:
这个 Stack Overflow 问题是相关的:When is libc++ sources needed when building Clang from sources?
关于 CFE-Dev 邮件列表的讨论:Questions about libc++ for linux and its git repository (if any)。该线程说将 libcxx 解包到 llcm/projects 可确保将标头复制到 Clang 在 make install 期间期望它们的位置。但它没有解决--with-XXX 的问题,没有讨论为什么没有构建libc++,也没有讨论如何让make install 实际安装库。
获取和构建 Clang 的配方。当不包括libcxx和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
【问题讨论】:
-
那些安装说明假定您使用 svn 检查了它们(我就是这样做的。)我假设使用 tar 球将包含不同的安装说明(尝试查找 README 或 INSTALL,我'我从未尝试过。)在运行
make之前,我还按照说明使用了cmake。 -
@remyabel - 我不使用 SVN 的前沿技术。我使用下载页面上发布的稳定版。有没有办法知道 3.5.0 是什么版本? (我也不使用 CMAKE,但这是我过桥时要解决的另一个问题。
-
@remyabel - 这是相关的(从 10,000 英尺开始)。我认为各种 LLVM 包是有凝聚力的,应该能够混合/匹配它们点菜(在合理范围内)。我越是尝试做一些基本的事情,比如配置、构建和安装,我发现情况并非如此。是我做错了什么,还是这些包被破坏了,所以它们在配置、构建和安装过程中不能很好地结合在一起。
-
@remyabel - 解决您在
README上的问题,它没用。没有INSTALL。有一个LLVMBuild.txt,它指向我http://llvm.org/docs/LLVMBuild.html。而http://llvm.org/docs/LLVMBuild.html没有关于添加组件点菜的说明。我认为 LLVM 项目认为这些东西开箱即用(在实践中,它不是)。或者我正在运行超出其规范的构建系统。 -
@remyabel - 感谢您的帮助。我将把它移到 CFE-Dev。我遇到了太多问题,我需要这个项目来讨论其中的一些问题,因为像你和我这样的人有不同的期望(就像我们期望它开箱即用一样)。