Исправление, которое я использовал, чтобы обойти это:
Dir.chdir(File.dirname(Rake.application.rakefile))
Этот оператор должен выполняться на каждом уровне иерархии, кроме корневого, в начале каждого рейк-файла. Сокращенный пример того, как это работает на практике:
/ rakefile:
task :default do
sh "rake -f component/rakefile"
end
/ компонент / rakefile
Dir.chdir(File.dirname(Rake.application.rakefile))
task :binary => OBJECTS do
sh "gcc #{SOURCES} -Iinclude -o #{TARGET}"
end
Поскольку я новичок в граблях, я не уверен, что это самый чистый метод решения проблемы, но именно так я в итоге заставил его работать.