Ini adalah kompiler silang RISC-V C dan C ++. Ini mendukung dua mode Build: ELF/Newlib Toolchain generik dan toolchain Linux-EFL/GLIBC yang lebih canggih.
Repositori ini menggunakan submodules, tetapi submodul akan diambil secara otomatis sesuai permintaan, jadi git submodule update --init --recursive
--recursive
atau git --in -init --recursive tidak diperlukan.
$ git clone https://github.com/riscv/riscv-gnu-toolchain
Peringatan: Git Clone membutuhkan sekitar 6,65 GB disk dan ukuran unduhan
Beberapa paket standar diperlukan untuk membangun toolchain.
Di Ubuntu, mengeksekusi perintah berikut sudah cukup:
$ sudo apt-get install autoconf automake autotools-dev curl python3 python3-pip libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev libslirp-dev
Pada OS Fedora/Centos/Rhel, mengeksekusi perintah berikut sudah cukup:
$ sudo yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk bison flex texinfo patchutils gcc gcc-c++ zlib-devel expat-devel libslirp-devel
Di Arch Linux, mengeksekusi perintah berikut sudah cukup:
$ sudo pacman -Syyu autoconf automake curl python3 libmpc mpfr gmp gawk base-devel bison flex texinfo gperf libtool patchutils bc zlib expat libslirp
Juga tersedia untuk pengguna Arch di AUR: https://aur.archlinux.org/packages/riscv-gnu-toolchain-bin
Pada macOS, Anda dapat menggunakan homebrew untuk menginstal dependensi:
$ brew install python3 gawk gnu-sed make gmp mpfr libmpc isl zlib expat texinfo flock libslirp
Saat menjalankan instruksi dalam readme ini, silakan gunakan gmake
alih -alih make
untuk menggunakan versi Make yang baru diinstal. Untuk membangun glibc (Linux) di macOS, Anda perlu membangun dalam sistem file case-sensitive. Pendekatan paling sederhana adalah membuat dan memasang gambar disk baru dengan format case sensitif. Pastikan titik pemasangan tidak berisi spasi. Ini tidak perlu membangun Newlib atau GCC sendiri di macOS.
Proses ini akan dimulai dengan mengunduh sekitar 200 MIB sumber hulu, kemudian akan menambal, membangun, dan menginstal toolchain. Jika cache lokal dari sumber hulu ada dalam $ (distdir), itu akan digunakan; Lokasi default adalah/var/cache/disfiles. Komputer Anda akan membutuhkan sekitar 8 GIB ruang disk untuk menyelesaikan proses.
Untuk membangun kompiler silang Newlib, pilih jalur instalasi (yang dapat ditulis). Jika Anda memilih, katakan, /opt/riscv
, lalu tambahkan /opt/riscv/bin
ke PATH
Anda. Kemudian, cukup jalankan perintah berikut:
./configure --prefix=/opt/riscv
make
Anda sekarang harus dapat menggunakan RISCV64-BUKU-EFL-GCC dan sepupunya.
Catatan: Jika Anda berencana menggunakan pustaka eksternal yang menggantikan bagian Newlib (misalnya libgloss-htif
), baca FAQ.
Untuk membangun kompiler silang Linux, pilih jalur instalasi (yang dapat ditulis). Jika Anda memilih, katakan, /opt/riscv
, lalu tambahkan /opt/riscv/bin
ke PATH
Anda. Kemudian, cukup jalankan perintah berikut:
./configure --prefix=/opt/riscv
make linux
Default Build untuk menargetkan RV64GC (64-bit) dengan GLIBC, bahkan pada lingkungan bangunan 32-bit. Untuk membangun toolchain RV32GC 32-bit, gunakan:
./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d
make linux
Jika Anda lebih suka musl libc daripada glibc, konfigurasikan seperti di atas dan pilih make musl
daripada make linux
.
Arsitektur yang didukung adalah RV32I atau RV64I plus ekstensi standar (a) tomics, (m) Ultiplication and Division, (f) Loat, (d) ouble, atau (g) energi untuk MAFD.
ABIS yang didukung adalah ILP32 (soft-float 32-bit), ILP32D (32-bit hard-float), ILP32F (32-bit dengan presisi tunggal dalam register dan ganda dalam memori, hanya penggunaan niche), LP64 LP64F LP64D (sama tetapi tetapi niche), LP64 LP64F LP64D (sama tetapi tetapi niche), LP64 LP64F LP64D (sama tetapi tetapi niche) dengan panjang 64-bit dan pointer).
Untuk membangun kompiler silang dengan dukungan untuk 32-bit dan 64-bit, jalankan perintah berikut:
./configure --prefix=/opt/riscv --enable-multilib
Dan kemudian make
, make linux
atau make musl
untuk Newlib, Linux GLIBC berbasis Linux atau Linux Musl LibC berbasis kompiler, masing-masing.
Kompiler multilib akan memiliki awalan RISCV64-tidak dikelilingi-atau riscv64-unknown-linux-gnu- tetapi akan dapat menargetkan sistem 32-bit dan 64-bit. Ini akan mendukung opsi -march
-mabi
yang paling umum, yang dapat dilihat dengan menggunakan bendera --print-multi-lib
pada kedua kompiler silang.
Linux Toolchain memiliki opsi tambahan --enable-default-pie
untuk mengontrol pemberdayaan pie default untuk GCC, yang dinonaktifkan secara default.
Untuk menyesuaikan bahasa yang diaktifkan, gunakan opsi --with-languages=
. Misalnya, jika Anda ingin mengaktifkan c,c++,fortran
, Gunakan ./configure --with-languages=c,c++,fortran
. Opsi ini hanya berlaku untuk GNU Toolchain.
Builds bekerja paling baik jika menginstal ke direktori kosong. Jika Anda membangun toolchain yang sangat keras dan kemudian mencoba membangun toolchain soft-float dengan direktori-prefix yang sama, maka skrip build mungkin bingung dan keluar dengan kesalahan linker mengeluh bahwa kode float keras tidak dapat ditautkan dengan Kode pelampung lunak. Menghapus toolchain yang ada terlebih dahulu, atau menggunakan awalan yang berbeda untuk build kedua, menghindari masalah. Tidak apa -apa untuk membangun satu newlib dan satu linux toolchain dengan awalan yang sama. Tetapi Anda harus menghindari membangun dua Newlib atau dua linux toolchains dengan awalan yang sama.
Jika membangun Linux Toolchain pada sistem MacOS, atau pada sistem Windows menggunakan subsistem Linux atau Cygwin, Anda harus memastikan bahwa sistem file sensitif terhadap case. Build pada sistem file yang tidak peka case akan gagal saat membangun glibc karena file *.os dan *.os akan saling bertentangan selama build yang pada akhirnya mengakibatkan kesalahan tautan yang membingungkan.
Centos (dan RHEL) menyediakan versi alat GNU lama yang mungkin terlalu tua untuk membangun risc-V toolchain. Ada alat alternatif yang disediakan yang mencakup versi saat ini dari alat GNU. Ini adalah devtoolset yang disediakan sebagai bagian dari layanan pengumpulan perangkat lunak. Untuk info lebih lanjut, lihat URL DevToolset-7. Ada berbagai versi DevToolset yang tersedia, sehingga Anda juga dapat mencoba versi lain, tetapi kami memiliki setidaknya satu laporan yang berfungsi oleh DevToolset-7.
Ada sejumlah opsi tambahan yang mungkin diteruskan untuk dikonfigurasi. Lihat './configure --help' untuk lebih jelasnya.
Anda juga dapat mendefinisikan bendera ekstra untuk diteruskan ke proyek -proyek tertentu: BINUTILS_NATIVE_FLAGS_EXTRA, BINUTILS_TARGET_FLAGS_EXTRA, GCC_EXTRA_CONFIGURE_FLAGS, GDB_NATIVE_FLAGS_EXTRA, GDB_TARGET_FLAGS_EXTRA, GLIBC_TARGET_FLAGS_EXTRA, NEWLIB_TARGET_FLAGS_EXTRA
. Contoh: GCC_EXTRA_CONFIGURE_FLAGS=--with-gmp=/opt/gmp make linux
--with-isa-spec=
dapat menentukan versi default dari spesifikasi ISA RISC-V yang tidak beruntung (sebelumnya tingkat pengguna).
Opsi yang mungkin adalah: 2.2
, 20190608
dan 20191213
.
Versi default adalah 20191213
.
Rincian lebih lanjut tentang opsi ini Anda dapat merujuk posting ini RISC-V GNU Toolchain Bumping Default ISA Spec ke 20191213.
--with-multilib-generator=
dapat menentukan multilibs apa yang akan dibangun. Argumennya adalah daftar nilai yang terpisah titik koma, mungkin terdiri dari nilai tunggal. Saat ini hanya didukung untuk RISCV* - -fel . Nilai dan makna yang diterima diberikan di bawah ini.
Setiap konfigurasi dibangun dengan empat komponen: string arsitektur, ABI, penggunaan kembali dengan string arsitektur dan aturan penggunaan kembali dengan sub-ekstensi.
Gunakan kembali bagian dukungan ekspansi (*) untuk menyederhanakan kombinasi sub-ekstensi yang berbeda, Contoh 4 menunjukkan bagaimana ia menggunakan dan bekerja.
Contoh 1: Tambahkan dukungan multi-lib untuk RV32i dengan ILP32.
./configure --with-multilib-generator="rv32i-ilp32--"
Contoh 2: Tambahkan dukungan multi-lib untuk RV32I dengan ILP32 dan RV32IMAFD dengan ILP32.
./configure --with-multilib-generator="rv32i-ilp32--;rv32imafd-ilp32--"
Contoh 3: Tambahkan dukungan multi-lib untuk RV32i dengan ILP32; RV32IM dengan ILP32 dan RV32IC dengan ILP32 akan menggunakan kembali set multi-lib ini.
./configure --with-multilib-generator="rv32i-ilp32-rv32im-c"
Contoh 4: Tambahkan dukungan multi-lib untuk RV64IMA dengan LP64; RV64IMAF dengan LP64, RV64IMAC dengan LP64 dan RV64IMAFC dengan LP64 akan menggunakan kembali set multi-lib ini.
./configure --with-multilib-generator="rv64ima-lp64--f*c"
Suite tes Dejagnu telah diangkut ke RISC-V. Ini dapat dijalankan dengan simulator untuk ELF dan Linux Toolchains. Simulator dapat dipilih dengan variabel SIM di makefile, misalnya sim = qemu, sim = gdb, atau sim = spike (eksperimental). Selain itu, simulator juga dapat dipilih dengan opsi waktu konfigurasi --with-sim=
Namun, TestSuite ILIPLIST hanya dicetak untuk qemu. Simulator lain mungkin mendapatkan kegagalan tambahan.
Skrip helper untuk menyiapkan lingkungan pengujian membutuhkan pyelftools.
Pada versi Ubuntu yang lebih baru, mengeksekusi perintah berikut sudah cukup:
$ sudo apt-get install python3-pyelftools
Pada versi yang lebih baru dari Fedora dan Centos/Rhel OS (9 atau lebih baru), mengeksekusi perintah berikut sudah cukup:
$ sudo yum install python3-pyelftools
Di Arch Linux, mengeksekusi perintah berikut sudah cukup:
$ sudo pacman -Syyu python-pyelftools
Jika distribusi/OS Anda tidak memiliki paket PyelfTools, Anda dapat menginstalnya menggunakan PIP.
# Assuming that PIP is installed
$ pip3 install --user pyelftools
Untuk menguji GCC, jalankan perintah berikut:
./configure --prefix=$RISCV --disable-linux --with-arch=rv64ima # or --with-arch=rv32ima
make newlib
make report-newlib SIM=gdb # Run with gdb simulator
./configure --prefix=$RISCV
make linux
make report-linux SIM=qemu # Run with qemu
./configure --prefix=$RISCV --with-sim=spike
make linux
make report # Run with spike
Catatan:
Secara default GCC akan melaksanakan semua tes rangkaian uji regresi. Saat menjalankannya dalam make -j$(nproc) report
) akan mempercepat waktu eksekusi pada sistem multi -prosesor, waktu yang diperlukan untuk melaksanakan semua tes biasanya terlalu tinggi untuk siklus pengembangan yang khas. Oleh karena itu GCC memungkinkan untuk memilih tes yang sedang dieksekusi menggunakan variabel lingkungan RUNTESTFLAGS
.
Untuk membatasi tes yang dijalankan hanya untuk tes spesifik RISC-V, perintah berikut dapat digunakan:
Runtestflags = "riscv.exp" membuat laporan
Untuk membatasi tes yang dijalankan hanya untuk tes spesifik RISC-V dengan mencocokkan pola "zb*.c" dan "sm*.c" perintah berikut dapat digunakan:
Runtestflags = "riscv.exp = zb*.c sm*.c" Laporkan Laporan
Target Makefile default untuk menjalankan tes Toolchain adalah report
. Ini akan menjalankan semua tes suite tes regresi GCC. Atau, perintah berikut dapat digunakan untuk melakukan hal yang sama:
make check-gcc
Perintah berikut dapat digunakan untuk menjalankan tes binutils:
make check-binutils
Perintah di bawah ini dapat digunakan untuk menjalankan tes GLIBC:
make check-glibc-linux
--with-extra-multilib-test
dapat digunakan ketika Anda ingin menguji lebih banyak kombinasi Arch/ABI, misalnya: Membangun Toolchain Linux dengan Multilib dengan rv64gc/lp64d
dan rv64imac/lp64
, tetapi Anda ingin menguji lebih banyak konfigurasi seperti seperti konfigurasi seperti rv64gcv/lp64d
atau rv64gcv_zba/lp64d
, maka Anda dapat menggunakan-dengan-EXTRA-MULTILIB-TEST untuk menentukannya melalui --with-extra-multilib-test="rv64gcv-lp64d;rv64gcv_zba-lp64d"
Untuk rv64gc/lp64d
, rv64imac/lp64
, rv64gcv/lp64d
dan rv64gcv_zba/lp64d
.
--with-extra-multilib-test
Mendukung Bare-Metal dan Linux Toolchain dan Dukungan Bahkan multilib dinonaktifkan, tetapi pengguna harus memastikan konfigurasi uji multilib ekstra dapat bekerja dengan tes LIB/Multilib yang ada, misalnya Tes RV32GCV/ILP32 tidak berfungsi Jika multilib tidak memiliki multilib RV32.
--with-extra-multilib-test
juga mendukung format yang lebih rumit agar sesuai dengan persyaratan pengguna akhir. Pertama -tama, argumennya adalah daftar konfigurasi pengujian. Setiap konfigurasi tes dipisahkan oleh ;
. Misalnya:
rv64gcv-lp64d;rv64_zvl256b_zvfh-lp64d
Untuk setiap konfigurasi tes, ia memiliki dua bagian, alias bagian lengkung yang diperlukan dan bendera build opsional. Kami memanfaatkan :
untuk memisahkan mereka dengan beberapa batasan.
:
untuk memisahkannya. Misalnya: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax
akan dianggap sebagai satu papan target yang sama seperti di bawah ini:
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic/--param=riscv-autovec-preference=fixed-vlmax
rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic,--param=riscv-autovec-preference=fixed-vlmax
akan dianggap sebagai dua papan target yang sama seperti di bawah ini:
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-preference=fixed-vlmax
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic
:
:), atau ( ,
) operator bersama tetapi OR ( ,
) akan selalu memiliki prioritas yang lebih tinggi. Misalnya: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax,--param=riscv-autovec-lmul=m2
akan dianggap sebagai babi hutan yang sama seperti di bawah ini:
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic/--param=riscv-autovec-preference=fixed-vlmax
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=m2
LLVM dapat digunakan dalam kombinasi dengan risC-V GNU compiler toolchain untuk membangun aplikasi RISC-V. Untuk membangun llvm dengan c dan c ++ mendukung bendera konfigurasi --enable-llvm
dapat digunakan.
Misalnya untuk membangun llvm di atas rv64 linux toolchain perintah berikut dapat digunakan:
./configure --prefix = $ riscv --enable-llvm --enable-linux make
Perhatikan, bahwa kombinasi bendera konfigurasi --enable-llvm
dan multilib tidak didukung.
Di bawah ini adalah contoh cara membangun rv64gc linux/newlib toolchain dengan dukungan LLVM, cara menggunakannya untuk membangun aplikasi C dan C ++ menggunakan dentang, dan cara menjalankan binari yang dihasilkan menggunakan QEMU.
Bangun Linux Toolchain dan jalankan contoh:
# Build rv64gc toolchain with LLVM
./configure --prefix=$RISCV --enable-llvm --enable-linux --with-arch=rv64gc --with-abi=lp64d
make -j$(nproc) all build-sim SIM=qemu
# Build C application with clang
$RISCV/bin/clang -march=rv64imafdc -o hello_world hello_world.c
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world
# Build C++ application with clang
$RISCV/bin/clang++ -march=rv64imafdc -stdlib=libc++ -o hello_world_cpp hello_world_cpp.cxx
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world_cpp
Bangun contoh newlib dan jalankan contoh (jangan bekerja dengan --with-multilib-generator=
):
# Build rv64gc bare-metal toolchain with LLVM
./configure --prefix=$RISCV --enable-llvm --disable-linux --with-arch=rv64gc --with-abi=lp64d
make -j$(nproc) all build-sim SIM=qemu
# Build C application with clang
$RISCV/bin/clang -march=rv64imafdc -o hello_world hello_world.c
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world
# Build C++ application with clang using static link
$RISCV/bin/clang++ -march=rv64imafdc -static -o hello_world_cpp hello_world_cpp.cxx
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world_cpp
Bagian ini hanya untuk pengembang atau pengguna tingkat lanjut, atau Anda ingin membangun toolchain dengan pohon sumber Anda sendiri.
riscv-gnu-toolchain
berisi sumber yang stabil tetapi tidak terbaru untuk setiap submodule, jika Anda ingin menggunakan pohon Develoment terbaru, Anda dapat menggunakan perintah berikut untuk meningkatkan semua submodule.
git submodule update --remote
Atau Anda hanya dapat meningkatkan submodule tertentu.
git submodule update --remote <component>
Misalnya, tingkatkan GCC saja, Anda dapat menggunakan perintah berikut:
git submodule update --remote gcc
Info cabang telah direkam dalam file .gitmodules
, yang dapat mengatur atau memperbarui melalui git submodule add -b
atau git submodule set-branch
.
Namun satu-satunya cara untuk memeriksa cabang mana yang digunakan adalah dengan memeriksa file .gitmodules
, berikut adalah contoh untuk gcc
, ia menggunakan rilis/cabang GCC-12, sehingga akan memiliki bagian bernama gcc
dan memiliki branch
lapangan adalah releases/gcc-12
.
[submodule "gcc"]
path = gcc
url = ../gcc.git
branch = releases/gcc-12
riscv-gnu-toolchain
riscv-gnu-toolchain
juga mendukung penggunaan sumber di luar pohon untuk membangun toolchain. Ada beberapa opsi konfigurasi untuk menentukan pohon sumber dari setiap submodule/komponen.
Misalnya, jika Anda memiliki sumber GCC di $HOME/gcc
, gunakan --with-gcc-src
untuk membangun toolchain menggunakan sumber-sumber tersebut:
./configure ... --with-gcc-src=$HOME/gcc
Berikut adalah daftar opsi konfigurasi untuk menentukan sumber alternatif untuk berbagai submodul/komponen:
--with-binutils-src
--with-dejagnu-src
--with-gcc-src
--with-gdb-src
--with-glibc-src
--with-linux-headers-src
--with-llvm-src
--with-musl-src
--with-newlib-src
--with-pk-src
--with-qemu-src
--with-spike-src
--with-uclibc-src
Kontribusi GCC harus memenuhi beberapa persyaratan untuk memenuhi syarat untuk inklusi hulu. Kompilasi bebas peringatan dengan build kompiler dari sumber yang sama ada di antara mereka. Bendera --enable-host-gcc
tidak bereksekusi itu:
-Werror
untuk mengidentifikasi masalah kodeJika bagian Newlib akan diganti dengan perpustakaan eksternal (seperti dengan libgloss-htif untuk antarmuka target host Berkeley), Anda harus berhati-hati untuk memastikan bahwa baik Newlib dan perpustakaan eksternal dibangun menggunakan model kode yang sama. Untuk informasi lebih lanjut tentang model kode RISC-V, baca artikel blog SIFIVE ini.
Kesalahan yang menunjukkan ketidakcocokan model kode termasuk kesalahan "relokasi overflow" atau "relokasi terpotong" dari linker yang tidak dapat berhasil merelokasi simbol dalam yang dapat dieksekusi.
Secara default, riscv-gnu-toolchain
membangun newlib dengan -mcmodel=medlow
. Anda dapat menggunakan model kode medany
alternatif (seperti yang digunakan dalam libgloss-htif) dengan lewat --with-cmodel=medany
ke skrip konfigurasi.