Я б запропонував не створювати загальних завдань налагодження та випуску, якщо проект дійсно щось компілюється і таким чином призводить до файлів. Вам слід виконати файлові завдання, що цілком можливо у вашому прикладі, як ви заявляєте, що ваш результат надходить у різні каталоги. Скажіть, що ваш проект просто компілює файл test.c для виходу / налагодження / test.out та out / release / test.out за допомогою gcc, ви можете налаштувати свій проект так:
WAYS = ['debug', 'release']
FLAGS = {}
FLAGS['debug'] = '-g'
FLAGS['release'] = '-O'
def out_dir(way)
File.join('out', way)
end
def out_file(way)
File.join(out_dir(way), 'test.out')
end
WAYS.each do |way|
desc "create output directory for #{way}"
directory out_dir(way)
desc "build in the #{way}-way"
file out_file(way) => [out_dir(way), 'test.c'] do |t|
sh "gcc #{FLAGS[way]} -c test.c -o #{t.name}"
end
end
desc 'build all ways'
task :all => WAYS.map{|way|out_file(way)}
task :default => [:all]
Цю установку можна використовувати так:
rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)
Це робить трохи більше, як просили, але показує мої моменти:
- Вихідні каталоги створюються за потребою.
- файли рекомпілюються лише за потреби (цей приклад правильний лише для найпростіших файлів test.c).
- у вас є всі завдання під рукою, якщо ви хочете запустити збірку випуску або збірку налагодження.
- цей приклад включає спосіб також визначити невеликі відмінності між налагодженнями та версіями версій.
- немає необхідності повторно використовувати завдання збирання, параметризовані глобальною змінною, тому що зараз у різних збірок є різні завдання. повторне використання коду завдання збірки здійснюється шляхом повторного використання коду для визначення завдань збирання. подивіться, як цикл не виконує одне і те ж завдання двічі, а натомість створив завдання, які згодом можуть бути запущені (або всезадачею, або вибираючи одну з них у командному рядку рейка).