Короткая версия: После долгих исследований я не смог установить программное обеспечение на MacOS из исходных кодов либо с флагами llvm
и -mretpoline
, либо с флагами gcc
и -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register
. Это кажется более общим, чем R
и специфичным для MacOS
, поэтому я соответственно изменил название. Я подозреваю, что это не может быть сделано на Mac с 27 апреля 2018 года. Я использую macOS High Sierra версии 10.13.3 (17D102).
Длинная версия: следующее относится к GnuPG, который я решил установить до R (потому что R требует gfortran, который требует gcc, который требует MPFR, который поставляется с подписью GPG, которую я хотел проверить). Я следовал инструкциям по установке GPG из Git.
Последний LLVM (с Homebrew)
LLVM от Apple терпит неудачу (см. Ниже), поэтому я использовал LLVM clang 6, чтобы исправить это, и я установил с помощью homebrew (это немного противоречит цели компиляции из источника с конкретными флагами, но у меня не хватило времени). Я установил доморощенный с:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
затем обновил его дважды
brew update
Для установки clang с Homebrew требуется XCode, поэтому я установил его в App Store. Затем я следовал инструкциям на этой странице:
brew install --with-toolchain llvm
Затем я добавил флаг -mretpoline
для обоих C
, добавил путь к компиляторам C
и C++
и вызвал сценарии оболочки из GPG:
export CFLAGS='-mretpoline'
export CC=/usr/local/opt/llvm/bin/clang
export CXX=/usr/local/opt/llvm/bin/clang++
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode && make
Я получил эту ошибку:
checking whether the C compiler works... no
Файл журнала config.log
дает более подробную информацию:
configure:4049: /usr/local/opt/llvm/bin/clang -mretpoline conftest.c >&5
fatal error: error in backend: MachO doesn't support COMDATs, '__llvm_retpoline_r11' cannot be lowered.
clang-6.0: error: clang frontend command failed with exit code 70 (use -v to see invocation)
Эта ветка с комментарием от января 2018 года внизу о том, что Mac еще не поддерживается с -mretpoline
:
samkellett: @chandlerc - преднамеренно отсутствует поддержка MacOS (т. е. еще не реализована)?
Чандлерк: Вовсе нет, у меня просто нет системы Mac для тестирования ...
У него нет ответа с тех пор. Так что установка с LLVM не удалась.
GCC (с домашним пивом)
Другой альтернативой была компиляция с gcc
вместо LLVM. Я установил последнюю версию Clang (6.0) с
brew install gcc
И я добавил флаги gcc
с этой страницы, которые отличаются от LLVM. Этот bash-скрипт добавляет флаги в C
и C++
, дает пути к обоим компиляторам и вызывает сценарии оболочки из GPG:
export CFLAGS='-mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register'
export CXXFLAGS=$CFLAGS
export CC=/usr/local/opt/gcc/bin/gcc-7
export CXX=/usr/local/opt/gcc/bin/g++-7
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode && make
и снова я получаю ошибку:
checking whether the C compiler works... no
Файл журнала config.log
дает более подробную информацию:
configure:4027: checking whether the C compiler works
configure:4049: /usr/local/opt/gcc/bin/gcc-7 -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register conftest.c >&5
Undefined symbols for architecture x86_64:
"__x86_return_thunk", referenced from:
_main in ccZuBhFQ.o
(maybe you meant: ___x86_return_thunk)
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
configure:4053: $? = 1
configure:4091: result: no
Странно, что компилятор знает о похожем звучащем имени с дополнительным подчеркиванием.
Так что gcc
тоже не удалось. И теперь я в растерянности.
Приложение: LLVM от Apple
Следующий скрипт bash экспортирует флаги для make
и вызывает сценарии оболочки из GnuPG:
export CFLAGS='-mretpoline'
export CXXFLAGS=$CFLAGS
echo $CFLAGS
echo $CXXFLAGS
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode && make
Это терпит неудачу с компилятором, который поставляется от Apple, но это показывает, что флаги доходят до компилятора:
configure:4045: gcc -mretpoline -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register conftest.c >&5
clang: error: unknown argument: '-mretpoline'
Поэтому комментарий @ seth прав в том, как отправлять флаги компилятору.