Я бы посоветовал не создавать общие задачи отладки и выпуска, если проект действительно является чем-то, что компилируется и приводит к файлам. Вы должны пойти с файловыми задачами, что вполне выполнимо в вашем примере, поскольку вы утверждаете, что ваш вывод идет в разные каталоги. Скажем, ваш проект просто компилирует файл test.c в out / debug / 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).
- у вас есть все задачи под рукой, если вы хотите запустить сборку релиза или сборку отладки.
- этот пример включает в себя способ определения небольших различий между отладочной и выпускной сборками.
- нет необходимости повторно включать задачу сборки, которая параметризована глобальной переменной, потому что теперь разные сборки имеют разные задачи. повторное использование кода задачи сборки выполняется путем повторного использования кода для определения задач сборки. Посмотрите, как цикл не выполняет одну и ту же задачу дважды, а вместо этого создает задачи, которые впоследствии могут быть запущены (либо с помощью всей задачи, либо путем выбора одной из них в командной строке rake).