project_name "x86_64-elf-gcc" binutils_version = "2.41" binutils_checksum = "ae9a5789e23459e59606e6714723f2d3ffc31c03174191ef0d015bdf06007450" gcc_version = "13.2.0" gcc_checksum = "e275e76442a6067341a27f04c5c6b83d8613144004c0413528863dc6b5c743da" install_path = File.expand_path("x86_64-elf-gcc") target = "x86_64-elf" path_prepend "#{install_path}/bin" configure do check_c_compiler "gcc" check_program "make" check_program "bison" check_program "flex" check_program "texi2any", on_fail: "Install the texinfo package" check_program "wget" check_lib "gmp", on_fail: "Install the libgmp-dev package" check_lib "mpc", on_fail: "Install the libmpc-dev package" check_lib "mpfr", on_fail: "Install the libmpfr-dev package" end default do unless Dir.exist?(install_path) puts "Building cross compiler toolchain..." # Download archives. puts "Downloading binutils..." download "https://ftp.gnu.org/gnu/binutils/binutils-#{binutils_version}.tar.xz", "#{build_dir}/binutils-#{binutils_version}.tar.xz", sha256sum: binutils_checksum puts "Downloading gcc..." download "https://ftp.gnu.org/gnu/gcc/gcc-#{gcc_version}/gcc-#{gcc_version}.tar.xz", "#{build_dir}/gcc-#{gcc_version}.tar.xz", sha256sum: gcc_checksum # Extract archives. puts "Extracting binutils..." sh "tar", "xJf", "binutils-#{binutils_version}.tar.xz", chdir: build_dir puts "Extracting gcc..." sh "tar", "xJf", "gcc-#{gcc_version}.tar.xz", chdir: build_dir # Build binutils. puts "Building binutils..." rm_rf "#{build_dir}/build-binutils" mkdir_p "#{build_dir}/build-binutils" cd "#{build_dir}/build-binutils" do sh %W[../binutils-#{binutils_version}/configure --target=#{target} --prefix=#{install_path} --with-sysroot --disable-nls --disable-werror] sh "make" sh "make install" end # Build gcc. puts "Building gcc..." rm_rf "#{build_dir}/build-gcc" mkdir_p "#{build_dir}/build-gcc" cd "#{build_dir}/build-gcc" do sh %W[../gcc-#{gcc_version}/configure --target=#{target} --prefix=#{install_path} --disable-nls --enable-languages=c --without-headers] sh "make all-gcc" sh "make all-target-libgcc" sh "make install-gcc" sh "make install-target-libgcc" end # Remove archives and build directories if everything succeeded. puts "Cleaning up..." rm_f "#{build_dir}/binutils-#{binutils_version}.tar.xz" rm_rf "#{build_dir}/binutils-#{binutils_version}" rm_rf "#{build_dir}/build-binutils" rm_f "#{build_dir}/gcc-#{gcc_version}.tar.xz" rm_rf "#{build_dir}/gcc-#{gcc_version}" rm_rf "#{build_dir}/build-gcc" end end distclean do rm_rf install_path end