นี่คือ RISC-V C และ C ++ cross-compiler รองรับสองโหมดการสร้าง: เครื่องมือ ELF/NEWLIB ทั่วไปและเครื่องมือ Linux-Elf/Glibc ที่ซับซ้อนยิ่งขึ้น
พื้นที่เก็บข้อมูลนี้ใช้ submodules แต่ submodules จะดึงข้อมูลโดยอัตโนมัติตามความต้องการดังนั้น --recursive
git submodule update --init --recursive
$ git clone https://github.com/riscv/riscv-gnu-toolchain
คำเตือน: Git Clone ใช้ดิสก์ประมาณ 6.65 GB และขนาดดาวน์โหลด
จำเป็นต้องใช้แพ็คเกจมาตรฐานหลายชุดเพื่อสร้างเครื่องมือ
บน Ubuntu การดำเนินการคำสั่งต่อไปนี้ควรเพียงพอ:
$ 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
นอกจากนี้ยังมีให้สำหรับผู้ใช้ Arch ใน 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
เวอร์ชันที่ติดตั้งใหม่ ในการสร้าง GLIBC (Linux) บน MacOS คุณจะต้องสร้างภายในระบบไฟล์ที่ไวต่อตัวพิมพ์ใหญ่ วิธีที่ง่ายที่สุดคือการสร้างและติดตั้งภาพดิสก์ใหม่ด้วยรูปแบบที่ละเอียดอ่อน ตรวจสอบให้แน่ใจว่าจุดเมานต์ไม่มีช่องว่าง สิ่งนี้ไม่จำเป็นต้องสร้าง newlib หรือ gcc เองบน macOS
กระบวนการนี้จะเริ่มต้นด้วยการดาวน์โหลดแหล่งต้นน้ำประมาณ 200 MIB จากนั้นจะแก้ไขสร้างและติดตั้ง Toolchain หากแคชท้องถิ่นของแหล่งต้นน้ำมีอยู่ใน $ (distdir) มันจะถูกใช้; ตำแหน่งเริ่มต้นคือ/var/cache/distfiles คอมพิวเตอร์ของคุณจะต้องใช้พื้นที่ดิสก์ประมาณ 8 GIB เพื่อดำเนินการให้เสร็จสมบูรณ์
ในการสร้าง NEWLIB Cross Compiler ให้เลือกเส้นทางการติดตั้ง (ที่เขียนได้) หากคุณเลือกพูด /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 Plus Extensions มาตรฐาน (A) Tomics, (M) UltiPlication and Division, (F) loat, (d) ouble หรือ (g) พลังงานสำหรับ MAFD
ABIs ที่รองรับคือ ILP32 (32 บิตฟล็อตนุ่ม), ILP32D (32- บิตแข็ง-ฟล็อต), ILP32F (32- บิตพร้อมความแม่นยำเดียวในการลงทะเบียนและสองในหน่วยความจำใช้เฉพาะ), LP64 LP64F LP64D ( มีความยาว 64 บิตและพอยน์เตอร์)
ในการสร้าง cross-compiler ด้วยการสนับสนุนทั้ง 32 บิตและ 64 บิตให้เรียกใช้คำสั่งต่อไปนี้:
./configure --prefix=/opt/riscv --enable-multilib
และจากนั้น make
make linux
หรือ make musl
สำหรับ newlib, linux glibc หรือ linux musl musl libc cross-compiler ตามลำดับ
คอมไพเลอร์ Multilib จะมีคำนำหน้า RISCV64-UNKNOWN-ELF- หรือ RISCV64-UNKNOWN-LINUX-GNU- แต่จะสามารถกำหนดเป้าหมายทั้งระบบ 32 บิตและ 64 บิต มันจะรองรับตัวเลือก -march
/ -mabi
ที่พบบ่อยที่สุดซึ่งสามารถมองเห็นได้โดยใช้ --print-multi-lib
FLAG บน Cross-Compiler
Linux Toolchain มีตัวเลือกเพิ่มเติม --enable-default-pie
เพื่อควบคุมการเปิดใช้งานพายเริ่มต้นสำหรับ GCC ซึ่งจะปิดการใช้งานตามค่าเริ่มต้น
ในการปรับแต่งภาษาที่เปิดใช้งานให้ใช้ตัวเลือก --with-languages=
ตัวอย่างเช่นหากคุณต้องการเปิดใช้งาน c,c++,fortran
, ใช้ ./configure --with-languages=c,c++,fortran
ตัวเลือกนี้มีผลเฉพาะสำหรับ GNU Toolchain
สร้างงานได้ดีที่สุดหากติดตั้งลงในไดเรกทอรีที่ว่างเปล่า หากคุณสร้าง toolchain hard-float จากนั้นลองสร้าง toolchain soft-float ด้วยไดเรกทอรี prefix เดียวกัน-สคริปต์ build อาจสับสนและออกไปพร้อมกับข้อผิดพลาดของตัวเชื่อม Soft Float Code การถอดเชน toolchain ที่มีอยู่ก่อนหรือใช้คำนำหน้าอื่นสำหรับการสร้างที่สองหลีกเลี่ยงปัญหา มันก็โอเคที่จะสร้างหนึ่ง newlib และหนึ่ง linux toolchain ที่มีคำนำหน้าเดียวกัน แต่คุณควรหลีกเลี่ยงการสร้าง toollib newlib สองตัวหรือสอง linux ที่มีคำนำหน้าเดียวกัน
หากการสร้าง Linux Toolchain บนระบบ 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 ที่ไม่ได้รับการรับรอง RISC-V (เดิมคือระดับผู้ใช้)
ตัวเลือกที่เป็นไปได้คือ: 2.2
, 20190608
และ 20191213
เวอร์ชันเริ่มต้นคือ 20191213
รายละเอียดเพิ่มเติมเกี่ยวกับตัวเลือกนี้คุณสามารถอ้างอิงโพสต์นี้ RISC-V GNU Toolchain Bumping Bumping ISA Spec ถึง 20191213
--with-multilib-generator=
สามารถระบุสิ่งที่ multilibs ที่จะสร้าง อาร์กิวเมนต์เป็นรายการที่คั่นด้วยเครื่องหมายอัฒภาคซึ่งอาจประกอบด้วยค่าเดียว ปัจจุบันรองรับ RISCV* - -elf เท่านั้น ค่าที่ยอมรับและความหมายได้รับด้านล่าง
การกำหนดค่าทุกครั้งจะถูกสร้างขึ้นด้วยสี่องค์ประกอบ: สตริงสถาปัตยกรรม, ABI, กฎการใช้ซ้ำด้วยสตริงสถาปัตยกรรมและกฎการใช้ซ้ำด้วยส่วนขยายย่อย
ใช้งานการสนับสนุนการขยายส่วนใหม่ (*) เพื่อลดความซับซ้อนของการรวมกันของส่วนขยายย่อยที่แตกต่างกันตัวอย่างที่ 4 แสดงให้เห็นถึงวิธีการใช้และการทำงาน
ตัวอย่างที่ 1: เพิ่มการรองรับ Multi-LIB สำหรับ RV32I ด้วย ILP32
./configure --with-multilib-generator="rv32i-ilp32--"
ตัวอย่างที่ 2: เพิ่มการรองรับ Multi-LIB สำหรับ RV32I ด้วย ILP32 และ RV32IMAFD ด้วย ILP32
./configure --with-multilib-generator="rv32i-ilp32--;rv32imafd-ilp32--"
ตัวอย่างที่ 3: เพิ่มการรองรับแบบหลายลิเบอร์สำหรับ RV32I ด้วย ILP32; RV32IM พร้อม ILP32 และ RV32IC กับ ILP32 จะนำชุดมัลติลิบนี้กลับมาใช้ใหม่
./configure --with-multilib-generator="rv32i-ilp32-rv32im-c"
ตัวอย่างที่ 4: เพิ่มการรองรับแบบหลายลิเบอร์สำหรับ RV64IMA ด้วย LP64; RV64IMAF พร้อม LP64, RV64IMAC พร้อม LP64 และ RV64IMAFC พร้อม LP64 จะนำชุด Multi-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 AllowList เป็นเพียง mintained สำหรับ 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 เริ่มต้นเพื่อเรียกใช้การทดสอบ Toolchain คือ report
สิ่งนี้จะเรียกใช้การทดสอบทั้งหมดของชุดทดสอบการถดถอย GCC อีกทางเลือกหนึ่งคำสั่งต่อไปนี้สามารถใช้ทำเช่นเดียวกัน:
make check-gcc
คำสั่งต่อไปนี้สามารถใช้เพื่อเรียกใช้การทดสอบ binutils:
make check-binutils
คำสั่งด้านล่างสามารถใช้เพื่อเรียกใช้การทดสอบ GLIBC:
make check-glibc-linux
--with-extra-multilib-test
สามารถใช้งานได้เมื่อคุณต้องการทดสอบการรวมกันของ ARCH/ABI มากขึ้นตัวอย่างเช่น: สร้าง linux toolchain กับ 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
การทดสอบการทดสอบการทดสอบการทดสอบแบบโลหะและ linux และการสนับสนุนแม้กระทั่ง Multilib จะปิดการใช้งาน แต่ผู้ใช้จะต้องตรวจสอบให้แน่ใจ หาก 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
จะถูกพิจารณาว่าเป็นหม้อพ่วงเป้าหมายเช่นเดียวกับด้านล่าง:
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 Toolchain สามารถใช้คำสั่งต่อไปนี้ได้:
./configure-prefix = $ riscv-enable-llvm-enable-linux make
โปรดทราบว่าไม่รองรับการรวมกันของ --enable-llvm
และการกำหนดค่าการกำหนดค่า multilib
ด้านล่างนี้เป็นตัวอย่างวิธีการสร้าง RV64GC Linux/newLib toolchain ด้วยการสนับสนุน LLVM วิธีการใช้เพื่อสร้างแอปพลิเคชัน C และ A C ++ โดยใช้ Clang และวิธีดำเนินการไบนารีที่สร้างขึ้นโดยใช้ QEMU
สร้าง Linux Toolchain และรันตัวอย่าง:
# 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 toolchain และรันตัวอย่าง (อย่าทำงานกับ --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
ส่วนนี้มีไว้สำหรับนักพัฒนาหรือผู้ใช้ขั้นสูงเท่านั้นหรือคุณต้องการสร้าง Toolchain ด้วยแผนผังต้นทางของคุณเอง
riscv-gnu-toolchain
มีแหล่งที่เสถียร แต่ไม่ใช่แหล่งข้อมูลล่าสุดสำหรับแต่ละ submodule ในกรณีที่คุณต้องการใช้ทรี develoment ล่าสุดคุณสามารถใช้คำสั่งต่อไปนี้เพื่ออัพเกรด submodule ทั้งหมด
git submodule update --remote
หรือคุณสามารถอัพเกรด submodule เฉพาะเท่านั้น
git submodule update --remote <component>
ตัวอย่างเช่นอัพเกรด GCC เท่านั้นคุณสามารถใช้คำสั่งต่อไปนี้:
git submodule update --remote gcc
ข้อมูลสาขาได้บันทึกไว้ในไฟล์ .gitmodules
ซึ่งสามารถตั้งค่าหรืออัปเดตผ่าน git submodule add -b
หรือ git submodule set-branch
อย่างไรก็ตามวิธีเดียวที่จะตรวจสอบสาขาที่ใช้คือการตรวจสอบไฟล์ .gitmodules
นี่คือตัวอย่างสำหรับ gcc
โดยใช้สาขารุ่น/GCC-12 ดังนั้นจึงมีส่วนที่ชื่อ gcc
และมี branch
ฟิลด์ releases/gcc-12
.
[submodule "gcc"]
path = gcc
url = ../gcc.git
branch = releases/gcc-12
riscv-gnu-toolchain
riscv-gnu-toolchain
ยังรองรับการใช้แหล่งที่อยู่นอกต้นไม้เพื่อสร้าง Toolchain มีตัวเลือกการกำหนดค่าหลายตัวสำหรับการระบุแผนผังต้นทางของแต่ละ submodule/ส่วนประกอบ
ตัวอย่างเช่นหากคุณมีแหล่งข้อมูล GCC ใน $HOME/gcc
ให้ใช้ --with-gcc-src
เพื่อสร้าง toolchain โดยใช้แหล่งข้อมูลเหล่านั้น:
./configure ... --with-gcc-src=$HOME/gcc
นี่คือรายการตัวเลือกการกำหนดค่าสำหรับการระบุแหล่งทางเลือกสำหรับ submodules/ส่วนประกอบต่างๆ:
--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
การมีส่วนร่วมของ GCC จะต้องปฏิบัติตามข้อกำหนดหลายประการเพื่อให้มีคุณสมบัติสำหรับการรวมต้นน้ำ คำเตือนการรวบรวมฟรีด้วยการสร้างคอมไพเลอร์จากแหล่งเดียวกันอยู่ในหมู่พวกเขา ธง --enable-host-gcc
นั้นมีความรุนแรงมากว่า:
-Werror
เพื่อระบุปัญหารหัสหากบางส่วนของ newlib จะถูกแทนที่ด้วยไลบรารีภายนอก (เช่น Libgloss-HTIF สำหรับอินเทอร์เฟซโฮสต์เป้าหมายของ Berkeley) คุณควรดูแลเพื่อให้แน่ใจว่าทั้ง NEWLIB และไลบรารีภายนอกถูกสร้างขึ้นโดยใช้โมเดลรหัสเดียวกัน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโมเดลรหัส RISC-V อ่านบทความบล็อก sifive นี้
ข้อผิดพลาดที่ระบุว่าโมเดลรหัสไม่ตรงกันรวมถึง "การย้ายถิ่นฐานล้น" หรือ "การย้ายถิ่นฐานที่ถูกตัดทอน" จากตัวเชื่อมโยงที่ไม่สามารถย้ายสัญลักษณ์ในการดำเนินการได้สำเร็จ
โดยค่าเริ่มต้น riscv-gnu-toolchain
จะสร้าง newLib ด้วย -mcmodel=medlow
คุณสามารถใช้โมเดลรหัส medany
มาทางเลือก (ตามที่ใช้ใน libgloss-htif) โดยผ่าน --with-cmodel=medany
ไปยังสคริปต์การกำหนดค่า