Я создаю clang clang для libС++, libС++ abi, compiler-rt в следующих шагах:
-
Чтобы загрузить (и обновить) llvm и подпроекты, я использую следующий script:
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm cd llvm/tools svn co http://llvm.org/svn/llvm-project/cfe/trunk clang svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk clang/tools/extra svn co http://llvm.org/svn/llvm-project/lldb/trunk lldb svn co http://llvm.org/svn/llvm-project/lld/trunk lld svn co http://llvm.org/svn/llvm-project/polly/trunk polly cd ../projects/ svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt svn co http://llvm.org/svn/llvm-project/libunwind/trunk libunwind svn co http://llvm.org/svn/llvm-project/openmp/trunk openmp svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
-
Прежде всего, я создаю llvm, clang, libunwind для libgcc и libstdС++ с помощью gcc и устанавливаю их в
/usr/local
. Во всех следующих шагах, кроме последнего, я использую этот свежийclang
/clang++
. - Затем я отдельно создаю libunwind, как 32-битную, так и 64-битную версии (они необходимы, как будет дальше, потому что asan нуждается в 32-битных версиях некоторых библиотек во время окончательной компиляции всего дерева проектов) и установите его в
/usr/local/lib
и/usr/local/lib32
соответственно (также я обновляюLD_LIBRARY_PATH
соответственно). - Создайте библиотеку ABC libcxxrt как с 32-разрядной, так и с 64-разрядной версиями и установите их правильно.
- Создайте libcxx для libcxxrt как 32-разрядных, так и 64-разрядных версий и установите их правильно.
- Затем создайте libС++ abi для libС++ как 32-разрядных, так и 64-разрядных версий и установите их правильно.
- Затем создайте libС++ для libС++ abi как для 32-разрядных, так и для 64-разрядных версий и правильно установите их поверх предыдущей версии, связанной с libcxxrt.
- В конце концов я строю все дерево проекта против libС++, libС++ abi, libunwind, compiler-rt и устанавливаю его поверх старого clang в
/usr/local
.
(Я почти уверен, что здесь нет лишнего шага.)
На последнем этапе у меня проблема: мне нужно добавить дополнительные параметры в компоновщик (я добавляю их в CMAKE_EXE_LINKER_FLAGS
и CMAKE_SHARED_LINKER_FLAGS
) -lunwind
и -lc++abi
. Более того, каждый раз, когда я использую результирующий clang++
с -stdlib=libc++
и compiler-rt (или, в равной степени, CLANG_DEFAULT_CXX_STDLIB=libc++
и CLANG_DEFAULT_RTLIB=compiler-rt
), в моих проектах мне приходится делать это снова и снова. Это раздражает. Скажем, сгенерированный Qt Creator проект CMakeLists.txt
должен быть исправлен вручную или cmake-gui
.
Как сделать драйвер clang
для автоматического указания этих параметров на ld
во время выполнения? Есть ли что-то похожее на механизм RPATH
? Или существует определенная переменная CMake (указанная до процесса построения llvm) для достижения желаемого поведения?
Могу ли я использовать RPATH
для моих целей?
Конечно, я не хочу создавать некоторые bash - script подобные обертки (похожие на clang++-libc++
), чтобы указать дополнительные параметры. Я хочу, чтобы библиотеки были жестко закодированы где-то в самом двоичном файле clang
.