Pregunta

tengo un Rakefile con una regla como la siguiente:

rule '.so' => '.cc' do |t|
    puts "@ Compiling #{t.source}"
    output = t.source.ext("so")
    output['stdlib'] = 'build'
    sh "mkdir -p #{File.dirname(output)}"
    sh "#{CXX} #{t.source} -o#{output} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end

Como se puede ver, genera muchas bibliotecas .so del directorio 'stdlib' (que contiene las fuentes) en el directorio 'construir', donde se almacenan los archivos binarios.

Ahora el problema es que, debido a este "cambio de directorio", rastrillo parece no reconocer los archivos como archivos .so que ha generado, haciendo que la recopilación de cada .so o cada vez que ejecute el comando rastrillo, incluso si nada se cambia.

¿Hay alguna manera de solucionar esto?

Gracias

¿Fue útil?

Solución

Puede utilizar la sintaxis pathmap o un proc explícita para cambiar el nombre del archivo de salida / ruta en el archivo de entrada / ruta.

La sintaxis pathmap se verá algo como esto (no probado):

rule '.so' => '%{build,stdlib}X.cc' do |t|
   puts "@ Compiling #{t.source}"
   sh "mkdir -p #{File.dirname(t.name)}"
   sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end

El método proc se verá algo como esto (también no probado):

rule '.so' => [proc { |f| f.sub(/build/, 'stdlib').ext('.cc') }] do |t|
   puts "@ Compiling #{t.source}"
   sh "mkdir -p #{File.dirname(t.name)}"
   sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end

Tenga en cuenta que usted puede deshacerse de la 'mkdir' explícita en su acción y utilizar una tarea 'directorio' en su lugar (si se sabe de antemano los posibles directorios de destino)

possible_dest_dirs.each { |d|
    directory d
}

rule '.so' => [proc { |f| f.sub(/build/, 'stdlib').ext('.cc') },
               proc { |f| File.dirname(f) }] do |t|
   puts "@ Compiling #{t.source}"
   sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top