هذا هو RISC-V C و C ++ المتقاطع. وهو يدعم وضعين للبناء: نظام أدوات قزم/نييلب عام وعلى أدوات أدوات Linux-elf/GLIBC أكثر تطوراً.
يستخدم هذا المستودع النطاق الفرعي ، لكن العداوات الفرعية ستجلب تلقائيًا على الطلب ، لذلك -لا يلزم إجراء تحديث --recursive
أو git submodule update --init --recursive
.
$ git clone https://github.com/riscv/riscv-gnu-toolchain
تحذير: GIT Clone يستغرق حوالي 6.65 جيجابايت من القرص وحجم التنزيل
هناك حاجة إلى عدة حزم قياسية لبناء مخطط الأدوات.
في أوبونتو ، يجب أن يكون تنفيذ الأمر التالي كافياً:
$ 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
في Fedora/Centos/Rhel OS ، يجب أن يكون تنفيذ الأمر التالي كافياً:
$ 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
في Arch Linux ، يجب أن يكون تنفيذ الأمر التالي كافياً:
$ sudo pacman -Syyu autoconf automake curl python3 libmpc mpfr gmp gawk base-devel bison flex texinfo gperf libtool patchutils bc zlib expat libslirp
متاح أيضًا لمستخدمي القوس على AUR: https://aur.archlinux.org/packages/riscv-gnu-toolchain-bin
على MacOS ، يمكنك استخدام Homebrew لتثبيت التبعيات:
$ brew install python3 gawk gnu-sed make gmp mpfr libmpc isl zlib expat texinfo flock libslirp
عند تنفيذ الإرشادات الواردة في هذا ReadMe ، يرجى استخدام gmake
بدلاً من make
لاستخدام الإصدار المثبت حديثًا من Make. لبناء GLIBC (Linux) على MacOS ، ستحتاج إلى البناء داخل نظام ملفات حساس للحالة. أبسط طريقة هي إنشاء وتركيب صورة قرص جديدة بتنسيق حساس للحالة. تأكد من أن نقطة جبل لا تحتوي على مساحات. هذا ليس ضروريًا لبناء Newlib أو GCC نفسه على MacOS.
ستبدأ هذه العملية بتنزيل حوالي 200 MIB من مصادر المنبع ، ثم ستقوم بتصحيح وتثبيت مجموعة الأدوات. في حالة وجود ذاكرة التخزين المؤقت المحلية لمصادر المنبع في $ (distdir) ، فسيتم استخدامها ؛ الموقع الافتراضي هو/var/cache/distfiles. سيحتاج جهاز الكمبيوتر الخاص بك إلى حوالي 8 GIB من مساحة القرص لإكمال العملية.
لبناء Newlib المتقاطع ، اختر مسار تثبيت (قابل للكتابة). إذا اخترت ، على سبيل المثال ، /opt/riscv
، ثم إضافة /opt/riscv/bin
إلى PATH
. ثم ، ما عليك سوى تشغيل الأمر التالي:
./configure --prefix=/opt/riscv
make
يجب أن تكون قادرًا الآن على استخدام RISCV64-unknown-Elf-GCC وأبناء عمومتها.
ملاحظة: إذا كنت تخطط لاستخدام مكتبة خارجية تحل محل جزء من NewLib (على سبيل المثال libgloss-htif
) ، اقرأ الأسئلة الشائعة.
لإنشاء Linux Cross-Compiler ، اختر مسار تثبيت (قابل للكتابة). إذا اخترت ، على سبيل المثال ، /opt/riscv
، ثم إضافة /opt/riscv/bin
إلى PATH
. ثم ، ما عليك سوى تشغيل الأمر التالي:
./configure --prefix=/opt/riscv
make linux
إن بناء الافتراضات لاستهداف RV64GC (64 بت) مع GLIBC ، حتى في بيئة البناء 32 بت. لبناء أدوات أدوات RV32GC 32 بت ، استخدام:
./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d
make linux
في حال كنت تفضل musl libc على glibc ، قم بتكوين مثل أعلاه واختر make musl
بدلاً من make linux
.
البنى المدعومة هي RV32i أو RV64i بالإضافة إلى الامتدادات القياسية (أ) tomics ، (M) ultiplication والانقسام ، (و) loat ، (د) ouble ، أو (ز) eneral للماف.
ABIs المدعومة هي ILP32 (32 بت ناعمة ناعمة) ، ILP32D (32 بت من الطبقات الصلبة) ، ILP32F (32 بت مع تحديد واحد في السجلات ومضاعفة في الذاكرة ، الاستخدام المتخصص فقط) ، LP64 LP64D LP64D (نفس ولكن مع 64 بت طويلة ومؤشرات).
لإنشاء إما مُجتمع مع الدعم لكل من 32 بت و 64 بت ، قم بتشغيل الأمر التالي:
./configure --prefix=/opt/riscv --enable-multilib
ثم إما make
make linux
أو make musl
لـ Newlib أو Linux GLIBC المستندة إلى Linux Musl libc ، على التوالي.
سيكون لدى برنامج التحويل البرمجي المتعدد بادئة RISCV64-unknown-elf- أو riscv64-unknown-linux-gnu- ولكن سيكون قادرًا على استهداف كل من أنظمة 32 بت و 64 بت. ستدعم خيارات -march
/ -mabi
الأكثر شيوعًا ، والتي يمكن رؤيتها باستخدام العلم --print-multi-lib
على أي من المتقاطعين.
يحتوي Linux Toolchain على خيار إضافي --enable-default-pie
للتحكم في تمكين PIE الافتراضي لـ GCC ، والذي يتم تعطيله افتراضيًا.
لتخصيص اللغات الممكّنة ، استخدم الخيار --with-languages=
. على سبيل المثال ، إذا كنت ترغب في تمكين c,c++,fortran
، استخدم ./configure --with-languages=c,c++,fortran
. هذا الخيار يسري فقط بالنسبة إلى أدوات GNU.
Builds تعمل بشكل أفضل إذا تم التثبيت في دليل فارغ. إذا قمت بإنشاء مخطط أدوات عدوى صلبة ثم حاولت إنشاء مخطط أدوات ناعم مع نفس الدليل-prefix ، فقد يتم الخلط بين البرامج النصية للبناء والخروج مع خطأ في الارتباط يشكو من أنه لا يمكن ربط رمز التعويم الصلب مع رمز تعويم ناعم. يؤدي إزالة مجموعة الأدوات الحالية أولاً ، أو استخدام بادئة مختلفة للبناء الثاني ، إلى تجنب المشكلة. لا بأس في إنشاء Newlib و Linux Toolchain مع نفس البادئة. ولكن يجب تجنب بناء اثنين من أدوات Newlib أو اثنين من أدوات Linux مع نفس البادئة.
إذا كان إنشاء مجموعة أدوات Linux على نظام MacOS ، أو على نظام Windows باستخدام نظام Linux الفرعي أو cygwin ، فيجب عليك التأكد من أن نظام الملفات حساس للحالة. سيفشل البناء على نظام ملفات غير حساس للحالة عند إنشاء ملفات GLIBC لأن *.OS و *.OS سوف تفوق بعضها البعض أثناء الإنشاء في النهاية في أخطاء الارتباط.
توفر CentOS (و RHEL) إصدارات أدوات GNU القديمة التي قد تكون قديمة جدًا بحيث لا يمكن إنشاء مجموعة أدوات RISC-V. هناك مجموعة أدوات بديلة تتضمن الإصدارات الحالية من أدوات GNU. هذه هي DevToolset المقدمة كجزء من خدمة مجموعة البرمجيات. لمزيد من المعلومات ، راجع عنوان URL DevToolset-7. هناك العديد من الإصدارات من DevToolset متوفرة ، بحيث يمكنك أيضًا تجربة إصدارات أخرى منه ، ولكن لدينا تقرير واحد على الأقل يعمل DevToolset-7.
هناك عدد من الخيارات الإضافية التي قد يتم تمريرها لتكوينها. انظر "./Configure -Help" لمزيد من التفاصيل.
يمكنك أيضًا تحديد علامات إضافية لتمريرها إلى مشاريع محددة: 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
. مثال: GCC_EXTRA_CONFIGURE_FLAGS=--with-gmp=/opt/gmp make linux
--with-isa-spec=
يمكن أن تحدد الإصدار الافتراضي لمواصفات ISA غير المحبوبة (على مستوى المستخدم سابقًا).
الخيارات الممكنة هي: 2.2
و 20190608
و 20191213
.
الإصدار الافتراضي هو 20191213
.
مزيد من التفاصيل حول هذا الخيار ، يمكنك إحالة هذا Post Risc-V GNU أدوات أدوات الافتراض الافتراضي لمواصفات ISA إلى 20191213.
--with-multilib-generator=
يمكن أن تحدد ما هو multilibs التي يجب بناءها. الوسيطة هي قائمة مفصولة من القيم الفاصلة ، والتي ربما تتكون من قيمة واحدة. حاليا مدعوم فقط لـ RISCV* - - فيما يلي القيم والمعاني المقبولة.
يتم إنشاء كل تكوين بأربعة مكونات: سلسلة الهندسة المعمارية ، ABI ، قاعدة إعادة استخدام مع سلسلة الهندسة المعمارية وقاعدة إعادة الاستخدام مع التمديد الفرعي.
إعادة استخدام PART Part Support Operator (*) لتبسيط مزيج من الامتدادات الفرعية المختلفة ، يوضح المثال 4 كيفية استخدامه ويعمل.
مثال 1: إضافة دعم متعدد LIB لـ RV32i مع ILP32.
./configure --with-multilib-generator="rv32i-ilp32--"
مثال 2: أضف دعمًا متعدد lib لـ RV32i مع ILP32 و RV32IMAFD مع ILP32.
./configure --with-multilib-generator="rv32i-ilp32--;rv32imafd-ilp32--"
مثال 3: إضافة دعم متعدد lib لـ RV32i مع ILP32 ؛ RV32IM مع ILP32 و RV32IC مع ILP32 سوف يعيد استخدام هذه المجموعة متعددة LIB.
./configure --with-multilib-generator="rv32i-ilp32-rv32im-c"
مثال 4: إضافة دعم متعدد lib لـ rv64ima مع LP64 ؛ RV64IMAF مع LP64 و RV64IMAC مع LP64 و RV64IMAFC مع LP64 سوف يعيد استخدام هذه المجموعة متعددة LIB.
./configure --with-multilib-generator="rv64ima-lp64--f*c"
تم نقل جناح اختبار Dejagnu إلى RISC-V. يمكن تشغيل ذلك باستخدام محاكاة لأدوات الأدوات ELF و Linux. يمكن تحديد جهاز المحاكاة بواسطة متغير SIM في Makefile ، على سبيل المثال sim = qemu ، sim = gdb ، أو sim = spike (تجريبي). في الإضافة ، يمكن أيضًا تحديد المحاكاة مع خيار تكوين الوقت- --with-sim=
ومع ذلك ، فإن قائمة testsuite المسموح بها فقط من أجل Qemu. قد تحصل أجهزة المحاكاة الأخرى على إخفاقات إضافية.
يتطلب نص المساعد لإعداد بيئة اختبار pyelftools.
في الإصدارات الأحدث من Ubuntu ، يجب أن يكون تنفيذ الأمر التالي كافياً:
$ sudo apt-get install python3-pyelftools
على الإصدارات الأحدث من Fedora و Centos/Rhel OS (9 أو أحدث) ، يجب أن يكون تنفيذ الأمر التالي كافياً:
$ sudo yum install python3-pyelftools
في Arch Linux ، يجب أن يكون تنفيذ الأمر التالي كافياً:
$ sudo pacman -Syyu python-pyelftools
إذا لم يكن لدى التوزيع/نظام التشغيل حزمة PyelfTools ، فيمكنك تثبيته باستخدام PIP.
# Assuming that PIP is installed
$ pip3 install --user pyelftools
لاختبار GCC ، قم بتشغيل الأوامر التالية:
./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
ملحوظة:
بشكل افتراضي ، ستقوم GCC بتنفيذ جميع اختبارات جناح اختبار الانحدار. أثناء تشغيلها بالتوازي (على سبيل المثال make -j$(nproc) report
) ، فإنه سيؤدي إلى تسريع وقت التنفيذ على الأنظمة متعددة المعالجات ، فإن الوقت المطلوب لتنفيذ جميع الاختبارات عادة ما يكون مرتفعًا للغاية بالنسبة لدورات التطوير النموذجية. لذلك يسمح GCC بتحديد الاختبارات التي يتم تنفيذها باستخدام RUNTESTFLAGS
المتغير البيئي.
لتقييد إجراء اختبار إلى اختبارات محددة RISC-V فقط ، يمكن استخدام الأمر التالي:
RunTestFlags = "riscv.exp" جعل تقرير
لتقييد إجراء اختبار إلى اختبارات محددة RISC-V فقط مع تطابق نمط "ZB*.C" و "SM*.C" يمكن استخدام الأمر التالي:
RunTestFlags = "riscv.exp = zb*.c sm*.c"
الهدف الافتراضي Makefile لتشغيل اختبارات أدوات أدوات هو report
. سيؤدي ذلك إلى إجراء جميع اختبارات مجموعة اختبار الانحدار في مجلس التعاون الخليجي. بدلاً من ذلك ، يمكن استخدام الأمر التالي لفعل الشيء نفسه:
make check-gcc
يمكن استخدام الأمر التالي لتشغيل اختبارات BinuTils:
make check-binutils
يمكن استخدام الأمر أدناه لتشغيل اختبارات GLIBC:
make check-glibc-linux
--with-extra-multilib-test
يمكن استخدامها عندما تريد اختبار المزيد من مجموعة من Arch/ABI ، على سبيل المثال: تم تصميم مجموعة أدوات Linux مع multiLib مع rv64gc/lp64d
و rv64imac/lp64
، لكنك تريد اختبار المزيد من التكوين مثل rv64gcv/lp64d
أو rv64gcv_zba/lp64d
، ثم يمكنك استخدام-مع extra-multilib-test لتحديد ذلك عبر- --with-extra-multilib-test="rv64gcv-lp64d;rv64gcv_zba-lp64d"
لـ rv64gc/lp64d
، rv64imac/lp64
، rv64gcv/lp64d
و rv64gcv_zba/lp64d
.
--with-extra-multilib-test
، تدعم أدوات الأدوات المعدنية والدعم والدعم حتى تعطيل multiLib ، ولكن يجب على المستخدم ضمان أن يكون تكوين اختبار متعدد الإضافات يعمل مع lib/multilib الحالي ، على سبيل المثال اختبار RV32GCV/ILP32 لا يمكن العمل إذا لم يكن لدى Multilib أي rv32 multilib.
--with-extra-multilib-test
أيضًا تدعم تنسيقًا أكثر تعقيدًا لتناسب متطلبات المستخدمين النهائيين. بادئ ذي بدء ، فإن الوسيطة هي قائمة بتكوينات الاختبار. يتم فصل كل تكوين اختبار بواسطة ;
. على سبيل المثال:
rv64gcv-lp64d;rv64_zvl256b_zvfh-lp64d
لكل تكوين اختبار ، يحتوي على جزأين ، ويعرف أيضًا باسم جزء Arch-ABI وعلامات الإنشاء الاختيارية. نحن نستفيد :
لفصلها مع بعض القيود.
:
لفصلها. على سبيل المثال: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax
سيتم النظر في لوحة مستهدفة واحدة أدناه:
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
سيتم النظر في لوحين مستهدفين كما هو موضح أدناه:
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
:
:) أو ( ,
) المشغل معًا ، لكن ( ,
، سيكون لها دائمًا أولوية أعلى. على سبيل المثال: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax,--param=riscv-autovec-lmul=m2
سيتم النظر في خنازير Tow Target كما هو أدناه:
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 بالاشتراك مع مخلفات برنامج التحويل البرمجي RISC-V GNU لبناء تطبيقات RISC-V. لإنشاء LLVM مع C و C ++ يدعم علامة التكوين --enable-llvm
.
على سبيل المثال لبناء LLVM أعلى مجموعة أدوات RV64 Linux ، يمكن استخدام الأوامر التالية:
./configure-prefix = $ riscv-enable-llvm-cenable-linux
لاحظ أن مزيجًا من علامات التكوين- --enable-llvm
و MultiLib غير مدعومة.
فيما يلي أمثلة على كيفية إنشاء مجموعة أدوات RV64GC Linux/NewLib مع دعم LLVM ، وكيفية استخدامه لإنشاء تطبيق C و C ++ باستخدام Clang ، وكيفية تنفيذ الثنائيات التي تم إنشاؤها باستخدام QEMU.
بناء أدوات Linux وتشغيل الأمثلة:
# 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
قم ببناء أدوات NewLib وتشغيل أمثلة (لا تعمل مع --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
هذا القسم مخصص فقط للمطور أو المستخدم المتقدم ، أو تريد إنشاء مجموعة أدوات مع شجرة المصدر الخاصة بك.
يحتوي riscv-gnu-toolchain
على مستقر ولكن ليس أحدث مصدر لكل وحدة فرعية ، في حال كنت ترغب في استخدام أحدث شجرة develoment ، يمكنك استخدام الأمر التالي لترقية جميع المواد الفرعية.
git submodule update --remote
أو يمكنك ترقية وحدة فرعية محددة فقط.
git submodule update --remote <component>
على سبيل المثال ، ترقية GCC فقط ، يمكنك استخدام الأمر التالي:
git submodule update --remote gcc
سجلت معلومات الفرع في ملف .gitmodules
، والذي يمكن تعيينه أو تحديثه عبر git submodule add -b
أو git submodule set-branch
.
gcc
ذلك gcc
releases/gcc-12
الطريقة branch
للتحقق من الفرع الذي يستخدمه .gitmodules
التحقق releases/gcc-12
.
[submodule "gcc"]
path = gcc
url = ../gcc.git
branch = releases/gcc-12
riscv-gnu-toolchain
يدعم riscv-gnu-toolchain
أيضًا استخدام مصدر خارج الشراء لإنشاء أدوات. هناك العديد من خيارات التكوين لتحديد شجرة المصدر لكل وحدة فرعية/مكون.
على سبيل المثال ، إذا كان لديك مصادر GCC في $HOME/gcc
، فاستخدم --with-gcc-src
لبناء أدوات باستخدام تلك المصادر:
./configure ... --with-gcc-src=$HOME/gcc
فيما يلي قائمة خيارات التكوين لتحديد مصادر بديلة لمختلف العوامل الفرعية/المكونات:
--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
يجب أن تلبي مساهمات دول مجلس التعاون الخليجي عدة متطلبات للتأهل لإدراج المنبع. تحذير تجميع مجاني مع برنامج التحويل البرمجي من نفس المصادر هو من بينها. العلم --enable-host-gcc
لا ينسجم:
-Werror
لتحديد مشكلات الكودإذا تم استبدال أجزاء من Newlib بمكتبة خارجية (كما هو الحال مع Libgloss-HTIF لواجهة مستضيف Berkeley) ، فيجب عليك الاهتمام بالتأكد من أن كل من Newlib والمكتبة الخارجية مبنية باستخدام نموذج الرمز نفسه. لمزيد من المعلومات حول نماذج رمز RISC-V ، اقرأ مقالة المدونة هذه.
تتضمن الأخطاء التي تشير إلى عدم تطابق نموذج رمز "تدفق النقل" أو "نقل النقل" من الرابط غير قادر على نقل الرموز بنجاح في القابلة للتنفيذ.
بشكل افتراضي ، تقوم riscv-gnu-toolchain
ببناء NewLib مع -mcmodel=medlow
. يمكنك استخدام نموذج رمز medany
البديل (كما هو مستخدم في Libgloss-HTIF) عن طريق المرور --with-cmodel=medany
إلى البرنامج النصي.