Sugeriría no crear tareas generales de depuración y liberación si el proyecto es realmente algo que se compila y resulta en archivos. Debería ir con las tareas de archivo, que es bastante factible en su ejemplo, como usted dice, que su salida va a diferentes directorios. Digamos que su proyecto solo compila un archivo test.c a / debug / test.out y out / release / test.out con gcc, podría configurar su proyecto así:
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]
Esta configuración se puede usar como:
rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)
Esto hace un poco más de lo solicitado, pero muestra mis puntos:
- Se crean directorios de salida, según sea necesario.
- los archivos solo se vuelven a compilar si es necesario (este ejemplo solo es correcto para los archivos test.c más simples).
- tiene todas las tareas a mano si desea activar la versión de lanzamiento o la versión de depuración.
- Este ejemplo incluye una manera de definir también pequeñas diferencias entre depuración y versiones de lanzamiento.
- no es necesario volver a habilitar una tarea de compilación que se parametriza con una variable global, porque ahora las diferentes compilaciones tienen tareas diferentes. La reutilización del código de la tarea de compilación se realiza reutilizando el código para definir las tareas de compilación. vea cómo el bucle no ejecuta la misma tarea dos veces, sino que crea tareas, que luego pueden activarse (ya sea por todas las tareas o eligiendo una de ellas en la línea de comandos de rake).