У меня есть вспомогательный класс, который сканирует весь каталог моего проекта и собирает список исходных файлов и соответствующих (целевых) объектных файлов. Зависимости от задачи компиляции определяются после сканирования исходного каталога, как показано ниже.
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
Как обойти эту проблему? Я уверен, что кто-то уже сталкивался с подобной проблемой. Буду признателен за любую помощь.
clean
иclobber
занимают немного больше времени, чем хотелось бы. Если кто-то не предложит лучшее решение? - person thegreendroid   schedule 03.12.2011