Спасибо за предложение - я протестирую ваш скрипт сборки как можно скорее и сообщу. В общем, SO предпочитает это, если вы не просто ссылаетесь на внешний сайт, но и включаете важные части в свой ответ. Поэтому я бы порекомендовал вам добавить команды сборки в ваш ответ здесь.

олагая, что это возможно, кто-то может сказать мне, как я должен настроить сборку cmake для создания «чистого» набора инструментов llvm на Ubuntu-16.04, состоящего из

лязгДНУLibc ++Libc ++ ABIlibunwind (llvm)Компилятор-к.т.любые другие части, которые могут быть актуальны и "готовы к производству"

Полученный компилятор должен

быть максимально быстрым (оптимизация включена, никаких ненужных утверждений или других проверок в самом двоичном файле компилятора)быть установленным в отдельном локальном каталоге (назовем его<llvm_install>)не имеют зависимости от llvm tolchain, предоставляемого менеджером пакетовпо умолчанию используйте libc ++, libc ++ abi и т. д.поддержка дезинфицирующих средств (ubsan, address, memory, thread) (что, вероятно, означает, что я должен скомпилировать libc ++ aвторой раз)

Пока что я клонировал

отhttp://llvm.org/git/llvm.git в<llvm_root>лязг изhttp://llvm.org/git/clang.git в<llvm_root>/tools/clangлдл изhttp://llvm.org/git/lld.git в<llvm_root>/tools/lldcompiler-rt, libcxx, libcxxabi, libunwind изhttp://llvm.org/git/<project_name> в<llvm_root>/projects/<project_name>

Затем запустите ccmake в отдельном каталоге - я пробовал различные настройки, но как только я пробую что-то более необычное, чем включение оптимизации, я почти всегда получаю какую-то ошибку сборки. К сожалению, мне еще не удалось найти способ экспортировать мои изменения из ccmake, иначе я бы дал вам пример с настройками и соответствующей ошибкой, но в любом случае меня больше интересует лучшая практика, чем исправление моих тестовых конфигураций.

Бонусные баллы: по умолчанию это должно собираться с использованием стандартного набора инструментов g ++, но я также был бы заинтересован в двухэтапном построении, если это улучшает производительность финального набора инструментов (например, с помощью LTO).

Кстати: вся идея пришла от просмотра выступления Чендлера
Pacific ++ 2017: Чендлер Каррут, «LLVM: современный открытый инструментарий C ++»

 compor24 нояб. 2017 г., 21:49
Я только что скомпилировал trunk (6.0) успешно с помощью команд, упомянутых в моем ответе ниже. Единственная неиспользованная переменная былаLLVM_ENABLE_LIBCXXABI, но это не повлияло на сборку.
 Nir Friedman26 февр. 2018 г., 21:39
Я понимаю, что это не ответ, но некоторое время назад я попробовал это, потому что я хотел 17 функций, моя IDE использует clang для автозаполнения и т. Д., И clang не очень хорошо компилировал реализации libstdc ++ 17 функций. Я профессионально пишу на C ++ и в прошлом занимался выяснением различных проблем компоновщика / RPATH / RUNPATH / LD_LIBRARY. Я не смог найти предварительно скомпилированную версию libc ++ новее, чем 3.8 для Ubuntu. После нескольких часов попыток заставить все это работать, я ушел с отвращением. В итоге я использовал libstdc ++ 7.2, clang 5.0 или что-то в этом роде, все работало нормально.

Ответы на вопрос(1)

чтобы у меня было что-то сlibc++ а такжеlibc++abi, Я полагаю, вы можете использовать LLVM, предоставляемый системой, но я не пробовал. Для этого шага, вероятно, достаточно того, что вы проверили. Пример сценария для этого:

cmake
-G Ninja \
-DCMAKE_EXPORT_COMPILE_COMMANDS=On \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DBUILD_SHARED_LIBS=On \
-DLLVM_ENABLE_ASSERTIONS=Off \
-DLLVM_TARGETS_TO_BUILD="X86" \
-DLLVM_ENABLE_SPHINX=Off \
-DLLVM_ENABLE_THREADS=On \
-DLIBCXX_ENABLE_EXCEPTIONS=On \
-DLIBCXX_ENABLE_RTTI=On \
-DCMAKE_INSTALL_PREFIX=[path-to-install-dir] \
[path-to-source-dir]

Имея вышеупомянутоеclang в вашейPATH Переменная окружения, вы можете снова использовать приведенный ниже скрипт сборки и настроить его в соответствии с вашими потребностями (дезинфицирующее средство и т. д.). Отдельно отглавный страница документации по теме, ковыряясь вCMakeLists.txt каждого соответствующего инструмента также подсвечивает и помогает настроить процесс сборки от версии к версии.

LLVM_TOOLCHAIN_LIB_DIR=$(llvm-config --libdir)
LD_FLAGS=""
LD_FLAGS="${LD_FLAGS} -Wl,-L ${LLVM_TOOLCHAIN_LIB_DIR}"
LD_FLAGS="${LD_FLAGS} -Wl,-rpath-link ${LLVM_TOOLCHAIN_LIB_DIR}"
LD_FLAGS="${LD_FLAGS} -lc++ -lc++abi"

CXX_FLAGS=""
CXX_FLAGS="${CXX_FLAGS} -stdlib=libc++ -pthread"

CC=clang CXX=clang++ \
cmake -G Ninja \
-DCMAKE_EXPORT_COMPILE_COMMANDS=On \
-DBUILD_SHARED_LIBS=On \
-DLLVM_ENABLE_LIBCXX=On \
-DLLVM_ENABLE_LIBCXXABI=On \
-DLLVM_ENABLE_ASSERTIONS=On \
-DLLVM_TARGETS_TO_BUILD="X86" \
-DLLVM_ENABLE_SPHINX=Off \
-DLLVM_ENABLE_THREADS=On \
-DLLVM_INSTALL_UTILS=On \
-DLIBCXX_ENABLE_EXCEPTIONS=On \
-DLIBCXX_ENABLE_RTTI=On \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_CXX_FLAGS="${CXX_FLAGS}" \
-DCMAKE_SHARED_LINKER_FLAGS="${LD_FLAGS}" \
-DCMAKE_MODULE_LINKER_FLAGS="${LD_FLAGS}" \
-DCMAKE_EXE_LINKER_FLAGS="${LD_FLAGS}" \
-DCMAKE_POLICY_DEFAULT_CMP0056=NEW \
-DCMAKE_POLICY_DEFAULT_CMP0058=NEW \
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
[path-to-source-dir]

Заметка о производительности, я еще не наблюдал за этим выступлением, но моя мотивация в этой двухэтапной сборке заключалась в том, чтобы иметь набор инструментов, который я могу легко перемещать между системами, поскольку минимальная системная зависимость, которая имеет значение,libc.

Наконец, отношение к вышеупомянутой процедуреэто мой старый вопрос, который до сих пор не дает мне покоя. Если у вас есть понимание этого, пожалуйста, не стесняйтесь.

PS: Сценарии были протестированы с LLVM с 3.7 по 3.9 и текущей магистралью 6.0.0.

ОбновитьЯ также подал заявкуэти предложения, и при использованииgold компоновщик вместоld, LTO также является стимулом.

 MikeMB15 нояб. 2017 г., 14:23
Спасибо за предложение - я протестирую ваш скрипт сборки как можно скорее и сообщу. В общем, SO предпочитает это, если вы не просто ссылаетесь на внешний сайт, но и включаете важные части в свой ответ. Поэтому я бы порекомендовал вам добавить команды сборки в ваш ответ здесь.

Ваш ответ на вопрос