Versi pendek : Setelah banyak penyelidikan, saya tidak dapat menginstal perangkat lunak pada MacOS dari sumber dengan baik llvm
dan -mretpoline
bendera, atau dengan gcc
dan -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register
bendera. Ini tampaknya lebih umum daripada R
dan khusus untuk MacOS
, jadi saya mengubah judulnya. Saya menduga bahwa ini tidak dapat dilakukan pada Mac pada tanggal 27 April 2018. Saya menjalankan macOS High Sierra versi 10.13.3 (17D102).
Versi panjang : Hal berikut ini berlaku untuk GnuPG, yang saya putuskan untuk diinstal sebelum R (karena R membutuhkan gfortran, yang membutuhkan gcc, yang membutuhkan MPFR , yang dilengkapi dengan tanda tangan GPG yang ingin saya verifikasi). Saya mengikuti langkah - langkah untuk menginstal GPG dari Git .
LLVM terbaru (dengan Homebrew)
LLVM dari Apple gagal (lihat di bawah), jadi saya menggunakan LLVM clang 6 untuk memperbaikinya dan saya instal dengan homebrew (sedikit mengalahkan tujuan kompilasi dari sumber dengan flag tertentu, tetapi saya kehabisan waktu). Saya memasang homebrew dengan:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
kemudian memperbaruinya dua kali dengan
brew update
Menginstal dentang dengan Homebrew diperlukan XCode, jadi saya menginstalnya dari App Store. Kemudian saya mengikuti langkah-langkah di halaman ini :
brew install --with-toolchain llvm
Lalu saya menambahkan -mretpoline
flag ke keduanya C
, saya menambahkan path ke keduanya C
dan C++
kompiler, dan saya memanggil skrip shell dari 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
Saya mendapat kesalahan ini:
checking whether the C compiler works... no
File log config.log
memberikan rincian lebih lanjut:
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)
Utas ini dengan komentar dari Januari 2018 di bagian bawah mengatakan bahwa Mac belum didukung dengan -mretpoline
:
samkellett: @chandlerc apakah dukungan MacOS sengaja dihilangkan (mis. belum diimplementasikan)? chandlerc: Tidak sama sekali, saya hanya tidak memiliki sistem Mac untuk menguji dengan ...
Sejak itu tidak ada tanggapan. Jadi menginstal dengan LLVM gagal.
GCC (dengan Homebrew)
Alternatif lain adalah mengkompilasi dengan gcc
bukannya LLVM. Saya menginstal clang (6.0) versi terbaru dengan
brew install gcc
Dan saya menambahkan gcc
bendera dari halaman ini , yang berbeda dari LLVM. Skrip bash ini menambahkan flag untuk keduanya C
dan C++
, memberikan path ke kedua kompiler, dan memanggil skrip shell dari 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
dan sekali lagi saya mendapatkan kesalahan:
checking whether the C compiler works... no
File log config.log
memberikan rincian lebih lanjut:
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
Sungguh aneh bahwa kompiler tahu tentang nama yang mirip dengan garis bawah ekstra.
Jadi gcc
gagal juga. Dan sekarang saya bingung.
Lampiran: LLVM dari Apple
Skrip bash berikut mengekspor flag untuk make
dan memanggil skrip shell dari GnuPG:
export CFLAGS='-mretpoline'
export CXXFLAGS=$CFLAGS
echo $CFLAGS
echo $CXXFLAGS
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode && make
Gagal dengan kompiler yang dikirimkan dari Apple, tetapi itu menunjukkan bahwa flag-flag tersebut sampai ke kompiler:
configure:4045: gcc -mretpoline -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register conftest.c >&5
clang: error: unknown argument: '-mretpoline'
Jadi komentar @ seth benar dalam cara mengirim flag ke compiler.