Неизвестный пакет libcxx и libcxxabi при сборке Clang?

Я пытаюсь собрать Clang с libC++ из источников. И я пытаюсь удалить libC++ in-tree при сборке его из других компонентов. Рецепт, который я использую, ниже.

Если я просто место libcxx а также libcxxabi in-tree, то configure не подхватывает их, и они не собираются автоматически. Я поместил их в llvm/projects согласно стандартной библиотеке libC++ LLVM.

Кроме того, добавляя make cxx к рецепту не работает так, как рекламируется на странице стандартной библиотеки LLVM libC++. Это приводит к:

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

Когда я настраиваю LLVM/Clang с --with-libcxx а также --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 а также libcxxabi буквально то, что LLVM называет их, поэтому я не уверен, какие имена использовать, если они не верны.

Я пытался изучить configure для того, что имена пакетов должны быть, но это не очень полезно. Смотрите ниже для логики.

Как мне настроить и собрать Clang с помощью libC++ (когда 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 ;;

Ссылки по теме:

И этот вопрос переполнения стека связан: когда нужны источники libC++ при сборке Clang из исходников?

И это обсуждение списка рассылки CFE-Dev: Вопросы о libC++ для linux и его git-репозитории (если есть). В ветке написано распаковка 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

2 ответа

Это скрипт, который я использовал для сборки 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 ..

libC++ и libC++abi не поддерживаются для работы с configure. Я думаю, что libC++ может работать, если вы вызываете его правильно, но нет даже скрипта configure для libC++abi.

Посмотрите наши документы по использованию 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
Другие вопросы по тегам