summaryrefslogtreecommitdiff
path: root/rakelib/cross.rake
diff options
context:
space:
mode:
Diffstat (limited to 'rakelib/cross.rake')
-rw-r--r--rakelib/cross.rake34
1 files changed, 29 insertions, 5 deletions
diff --git a/rakelib/cross.rake b/rakelib/cross.rake
index 3de7d79..700a8dd 100644
--- a/rakelib/cross.rake
+++ b/rakelib/cross.rake
@@ -4,15 +4,14 @@ require 'net/http'
require 'rake/clean'
require 'open3'
require 'etc'
+require_relative 'shared'
GCC_VERSION = "14.2.0"
BINUTILS_VERSION = '2.43.1'
GLIBC_VERSION = '2.40'
KERNEL_VERSION = '5.15.166'
-TMP = Pathname.new('./build')
-
-CLEAN.include TMP
+CLOBBER.include TMP
class BuildTarget
attr_accessor(:build, :gcc, :target, :tmp)
@@ -87,11 +86,16 @@ def download_and_unarchive(url, target)
download_and_unarchive URI.parse(response['location'])
when Net::HTTPSuccess
Open3.popen2 'tar', '-C', target.to_path, archive_type, '-xv' do |stdin, stdout, wait_thread|
- stdout.close
+ Thread.new do
+ stdout.each { |line| puts line }
+ end
response.read_body do |chunk|
stdin.write chunk
end
+ stdin.close
+
+ wait_thread.value
end
else
response.error!
@@ -301,7 +305,27 @@ namespace :cross do
sh env, 'make', '-j', Etc.nprocessors.to_s, chdir: cwd.to_path
sh env, 'make', 'install', chdir: cwd.to_path
end
+
+ task :init, [:target] do |_, args|
+ options = find_build_target GCC_VERSION, args
+ env = {
+ 'PATH' => "#{options.rootfs.realpath + 'bin'}:#{ENV['PATH']}"
+ }
+ sh env, 'riscv32-unknown-linux-gnu-gcc',
+ '-ffreestanding', '-static',
+ '-o', (options.tools + 'init').to_path,
+ 'tools/init.c'
+ end
end
-task cross: ['cross:binutils', 'cross:gcc1', 'cross:headers', 'cross:kernel', 'cross:glibc', 'cross:gcc2'] do
+desc 'Build cross toolchain'
+task cross: [
+ 'cross:binutils',
+ 'cross:gcc1',
+ 'cross:headers',
+ 'cross:kernel',
+ 'cross:glibc',
+ 'cross:gcc2',
+ 'cross:init'
+] do
end