У меня есть вспомогательный класс, который сканирует весь каталог моего проекта и собирает список исходных файлов и соответствующих (целевых) объектных файлов.Зависимости от задачи компиляции определяются после сканирования исходного каталога, как показано ниже.
CLEAN.include(FileList[obj_dir + '**/*.o'])
CLOBBER.include(FileList[exe_dir + '**/*.exe'])
$proj = DirectoryParser.new(src_dir)
$proj.source_files.each do |source_file|
file source_file.obj_file do
sh "gcc -c ..."
end
end
$proj.obj_files.each do |obj_file|
task :compile => obj_file
end
task :compile do
end
Поскольку $proj
является глобальным, DirectoryParser.new () вызывается при вызове любой из задач, включая clean
и clobber
.Это замедляет выполнение задач clean
и clobber
, что нежелательно.
Чтобы обойти проблему, я перенес все поколения зависимостей файлов в задачу по умолчанию.Это ускоряет выполнение моих задач clean
и clobber
, однако теперь я не могу независимо вызывать мои задачи компиляции или компоновки.
CLEAN.include(FileList[obj_dir + '**/*.o'])
CLOBBER.include(FileList[exe_dir + '**/*.exe'])
task :compile => $proj.source_files do # Throws error!
end
task :default => do
$proj = DirectoryParser.new(src_dir)
$proj.source_files.each do |source_file|
file source_file.obj_file do
sh "gcc -c ..."
end
end
$proj.obj_files.each do |obj_file|
task :compile => obj_file
end
... compile
... link
... execute
end
Как мне обойти эту проблему?Я уверен, что кто-то ранее сталкивался с подобной проблемой.Буду признателен за любую помощь.