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

时间:2015-01-10 22:40:41

标签: c++ clang llvm libc++

我试图从源代码中使用libc ++构建Clang。而且我试图在与其他组件一起构建树外的时候删除libc ++ in-tree。我使用的食谱如下。

如果我只是将libcxxlibcxxabi置于树中,则配置 选择它们,并且它们不会自动构建。我将它们放在llvm/projectsLLVM's libc++ Standard Library

此外,在配方中添加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

libcxxlibcxxabi实际上是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可确保在make install期间将标头复制到Clang期望的位置。但它没有解决--with-XXX问题,也没有讨论为什么libc++没有构建,也没有讨论如何让make install实际安装库。


用于获取和构建Clang的配方。当 包括libcxxlibcxxabi时,它可以正常工作。

#! /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

2 个答案:

答案 0 :(得分:3)

这是我用来构建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 ..

答案 1 :(得分:2)

libc ++和libc ++ abi不能与configure配合使用。我认为如果你正确调用libc ++可能会有效,但是即使是libc ++ abi的配置脚本也没有。

请参阅our docs了解如何在这些项目中使用cmake:

# In-tree build:
# Check out libcxx and libcxxabi into llvm/projects
cd llvm
mkdir build && cd build
cmake .. # Linux may require -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
make cxx