Clang 3.6.0 падает, пытаясь скомпилировать "hana/example/core/is_a.cpp"

Попытка скомпилировать библиотеку Boost.Hana из последних источников https://github.com/ldionne/hana (на сегодняшний день). Получение аварии во время make examples, Это проблема с последней комбинацией исходников и компилятора, или я действительно не установил требуемую версию компилятора (Хане нужны некоторые последние исправления ошибок в Clang)? Я довольно новичок в OS X, поэтому немного боролся с настройкой компилятора и библиотеки, и не знаю, как правильно настроить cmake для сборки с недавно установленным clang.

Я установил Clang через Homebrew:

brew install --HEAD llvm --with-clang

Когда я попытался сделать это с помощью только что установленного компилятора, сборка не удалась, потому что не удалось найти заголовок "cstdio".

Итак, я также клонировал "libcxx" из github и изменил настройку в CMakeCache.txt:

CMAKE_CXX_FLAGS:STRING=-Wall -std=c++11 -stdlib=libc++ -I/Users/yacoder/github/libcxx/include/

А вот цитата из вывода о сбое, который я сейчас получаю во время make examples:

0.  Program arguments: /usr/local/Cellar/llvm/HEAD/bin/clang -cc1 -triple x86_64-apple-macosx10.9.0 -emit-obj -mrelax-all -disable-free -main-file-name is_a.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 241.8 -dwarf-column-info -coverage-file /Users/yacoder/github/hana/build/example/CMakeFiles/example.core.is_a.dir/core/is_a.cpp.o
-resource-dir /usr/local/Cellar/llvm/HEAD/bin/../lib/clang/3.6.0 -I /Users/yacoder/github/libcxx/include/ -I /Users/yacoder/github/hana/include -stdlib=libc++ -stdlib=libc++ -Wall
-W -Wall -Wextra -Wno-long-long -Wno-unused-local-typedefs -Wno-unused-parameter -Wwrite-strings -pedantic -std=c++1y -fdeprecated-macro -fdebug-compilation-dir /Users/yacoder/github/hana/build/example -ferror-limit 19
-fmessage-length 177 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.9.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o CMakeFiles/example.core.is_a.dir/core/is_a.cpp.o -x c++ /Users/yacoder/github/hana/example/core/is_a.cpp
1.  /Users/yacoder/github/hana/example/core/is_a.cpp:51:5: current parser token ')'
2.  /Users/yacoder/github/hana/example/core/is_a.cpp:26:12: parsing function body 'main'
3.  /Users/yacoder/github/hana/example/core/is_a.cpp:26:12: in compound statement ('{}') clang: error: unable to execute command: Segmentation fault: 11 clang: error: clang frontend command failed due to signal (use -v to see invocation) clang version 3.6.0 (trunk) Target: x86_64-apple-darwin13.4.0

1 ответ

Решение

Установка Clang через Homebrew должна работать нормально, если вы используете --HEAD версия. При сборке Clang убедитесь, что вы работаете в режиме Release; в противном случае некоторые тесты вызовут утверждения в Clang (об ошибках сообщалось давно). Я думаю, что сборка релиза является стандартной по умолчанию для Homebrew, поэтому вам не нужно предпринимать никаких действий.

Затем вам также понадобится последняя версия libC++. Добавление пути включения, как вы сделали, будет работать нормально. Однако Hana должна скомпилировать с -std= C++1y вместо std = C++11. Hana уже передает необходимые флаги компилятору, поэтому вы должны быть в порядке, если вы оставите их как есть, за исключением пути включения, который необходимо изменить для вашего libC++.

Наконец, вы должны использовать make -k вместо make, Это инструктирует make продолжать идти, даже если есть ошибки. Дело в том, что в Clang trunk по-прежнему есть несколько ошибок, связанных с C++14, которые приводят к segfault/assert/explode в некоторых тестах. Особенно, core/example/is_a.cpp последние несколько недель терпел неудачу. В общем, вы должны ожидать 3-4 утверждения при выполнении тестов. Это отстой, но ребята из Clang были осведомлены об этих проблемах.

TL; DR

Попробуйте следующее:

> cd root/of/hana
> mkdir build && cd build
> CXX=path/to/clang/binary cmake .. -DCMAKE_CXX_FLAGS="-I path/to/libc++"
> make -k

Если вы установили Clang с Homebrew, path/to/clang/binary это что-то вроде /usr/local/opt/llvm/bin/clang++,

Другие вопросы по тегам