Как использовать clang и distcc для компиляции на ведомом устройстве другой архитектуры (например, mac / linux)

Я хочу использовать distcc для компиляции кода с моего Mac на несколько хостов Linux, но я не могу понять, как заставить все «выстраиваться». Я успешно использовал distcc от Mac до Mac, поэтому у меня есть общее представление о том, как все настроить.

Я использую clang 4.0, и он установлен и работает как на Mac, так и на Linux. Следующая команда компилируется нормально без distcc в начале, но после добавления distcc я получаю следующие проблемы:

distcc /Users/xaxxon/Downloads/clang+llvm-4.0.0-x86_64-apple-darwin/bin/clang++   -I/usr/local/include -I/Users/xaxxon/v8toolkit/./include -I/Users/xaxxon/v8/include  -stdlib=libc++ -g -Werror=return-type -g   -std=gnu++1z -o CMakeFiles/v8toolkit_static.dir/src/v8toolkit.cpp.o -c /Users/xaxxon/v8toolkit/src/v8toolkit.cpp

Я не уверен, какой компилятор собирается в Linux, и я не знаю, как это выяснить. Возможно, он собирает GCC вместо лязга.

Моя первая проблема заключается в следующем:

clang: warning: argument unused during compilation: '-stdlib=libc++'

Моя первая ошибка:

In file included from /Users/xaxxon/v8toolkit/src/v8toolkit.cpp:5:
In file included from /usr/include/assert.h:44:
In file included from /Users/xaxxon/Downloads/clang+llvm-4.0.0-x86_64-apple-darwin/bin/../include/c++/v1/stdlib.h:94:
/usr/include/stdlib.h:250:20: error: blocks support disabled - compile with -fblocks or pick a deployment target that supports them
int atexit_b(void (^)(void)) __attribute__((availability(macosx,introduced=10.6)));

Следующая ошибка, которую я получаю (которая становится первой ошибкой, если я вручную добавляю -fblocks к команде компиляции (которая не нужна для встроенной сборки Mac):

/Users/xaxxon/Downloads/clang+llvm-4.0.0-x86_64-apple-darwin/bin/../include/c++/v1/__tuple:289:13: error: unknown type name '__type_pack_element'
typedef __type_pack_element<_Ip, _Types...> type;
^
/Users/xaxxon/Downloads/clang+llvm-4.0.0-x86_64-apple-darwin/bin/../include/c++/v1/__tuple:289:32: error: expected member name or ';' after declaration specifiers
typedef __type_pack_element<_Ip, _Types...> type;
~~~~~~~~~~~~~~~~~~~~~~~~~~~^
/Users/xaxxon/Downloads/clang+llvm-4.0.0-x86_64-apple-darwin/bin/../include/c++/v1/__tuple:356:43: error: use of undeclared identifier '__type_pack_element'
typename _ApplyFn::template __apply<__type_pack_element<_Idx, _Types...>>...
^
/Users/xaxxon/Downloads/clang+llvm-4.0.0-x86_64-apple-darwin/bin/../include/c++/v1/__tuple:357:6: error: expected a type
>;

Я не понимаю, делаю ли я что-то в корне неправильно или что-то не так, что заставляет компилятор Linux работать по-другому.

Спасибо за любые подсказки или советы.

редактировать: я только что удостоверился, что Clang для Linux находится в том же именованном каталоге, и теперь только получаю -fblocks а также unused during compilation -stdlib=libc++ проблемы.

edit2: я могу получить все для компиляции (хотя и с предупреждениями), но когда он ссылается, я получаю:

ld: warning: ignoring file CMakeFiles/v8toolkit_shared.dir/src/debugger.cpp.o, file was built for
unsupported file format ( 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 ) which is not the architecture being linked
(x86_64): CMakeFiles/v8toolkit_shared.dir/src/debugger.cpp.o

1

Решение

Добавление флага -target исправляет все! В моем случае для el capitan целевая тройка:

-target x86_64-apple-darwin15.6.0

для команды сборки:

distcc /Users/xaxxon/Downloads/clang+llvm-4.0.0-x86_64-apple-darwin/bin/clang++  -Dv8toolkit_shared_EXPORTS -I/usr/local/include -I/Users/xaxxon/v8toolkit/./include -isystem /Users/xaxxon/v8/include  -stdlib=libc++ -g -Werror=return-type -target x86_64-apple-darwin15.6.0 -g -fPIC   -std=gnu++1z -o CMakeFiles/v8toolkit_shared.dir/src/v8toolkit.cpp.o -c /Users/xaxxon/v8toolkit/src/v8toolkit.cpp

Вы можете получить цель текущего хоста, набрав clang -v:

$ clang -v
clang version 4.0.0 (tags/RELEASE_400/final)
Target: x86_64-apple-darwin15.6.0 <<==== THIS LINE HERE
Thread model: posix
InstalledDir: /Users/xaxxon/Downloads/clang+llvm-4.0.0-x86_64-apple-darwin/bin

Следующие строки CMake будут получать (и распечатывать) тройку для текущей машины:

# Get the target triple for the current host by calling clang -v and then stripping out the Target: value from its output.  CMake regex syntax is quite limited.
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -v ERROR_VARIABLE CLANG_VERSION_INFO)
string(REGEX REPLACE ".*Target:[\r\n\t ]*([^\r\n\t]*).*Thread model.*" "\\1" TARGET_TRIPLE ${CLANG_VERSION_INFO})
message(STATUS "TARGET TRIPLE: '${TARGET_TRIPLE}' END")

Большое спасибо @duskwuff и oftc.net #llvm за помощь в выяснении этого!

1

Другие решения

Пока вы указываете флаг -target, вы можете даже кросс-компилировать, потому что clang является нативным кросс-компилятором.

https://clang.llvm.org/docs/CrossCompilation.html

1

По вопросам рекламы [email protected]