2009-09-30 22 views
7

scons usa hash MD5 en lugar de tiempos de mod de archivo para determinar si se debe crear una dependencia.equivalente a "touch" en scons?

Quiero que este sea el comportamiento predeterminado. ¿Pero hay alguna forma de forzarlo a suponer que un archivo en particular está desactualizado (el equivalente a "tocar"), además de editar el archivo para hacerlo diferente?

edición: caso uso:

archivo F binaria se utiliza para crear otro archivo de G usando una herramienta X. Por alguna razón archivo G ha cambiado (que se corrompe, o que lo editó) o la herramienta X ha cambiado, y quiero volver a crear el archivo G y todo lo que se encuentra aguas abajo.

corregir: Esto es para uso ocasional solamente. No quiero que esto suceda siempre, solo esas pocas veces cuando lo pido. Además, es posible que no conozca el archivo en particular con anticipación. Por esta razón, no quiero modificar los archivos SConscript/SConstruct para construir un archivo en particular. Lo que me gustaría es hacer esto en un símbolo del sistema:

scons {something to specify file foobar.h} 

y que obligaría a scons para construir todos los archivos en función de foobar.h, mientras que sólo escribir scons haría la acumulación regular usando hashes MD5 de comprobación de dependencias . No me importa editar los archivos SConscript/SConstruct antes de tiempo para permitir esto (el Redactor personalizado, supongo), si hay una manera de hacerlo que no aumente significativamente los tiempos de compilación.

Respuesta

4

¿Has echado un vistazo a la opcióninteractiva de Scons, allí puedes limpiar y construir objetivos específicos.

man page describing this.

+0

eh, nunca supe sobre --interactive, eso me va a ahorrar algo de tiempo con compilaciones repetidas. ¡Gracias! Creo que puedo usarlo para lo que yo también quería. –

+0

Tenga en cuenta que si realmente desea desencadenar nuevas llamadas a compilaciones, debe hacer scons '--interactive --no-cache'; de lo contrario, el comando interactivo' build' solo seleccionará de la memoria caché y no ejercitará su compilador. –

1

No creo que haya una manera de hacerlo directamente. Si el archivo de origen en cuestión tiene un resultado obvio, como test.o creado a partir del test.c, eliminar test.o forzaría una recompilación del archivo de origen.

Si, por el contrario, quiere tocar test.h que está incluido en varios archivos fuente diferentes, es mejor que haga una limpieza de todo su proyecto para asegurarse de que todo se reconstruya.

Dicho esto, es posible que desee leer sobre el Decider() function que le permite elegir cómo se tratarán las dependencias de archivos. Incluso puede elegir una función de decider personalizada para archivos particulares en su proyecto, por lo que si tiene algún archivo de encabezado global que le gustaría poder touch y reconstruir, puede hacerlo.

Actualización: Para responder a su última pregunta, simplemente elimine el archivo G. Scons lo recreará desde F ejecutando X la próxima vez que compile.

0

Creo un archivo de destino ficticio con una fecha completa hasta la hora en minutos y segundos. Luego tengo los otros pasos que dependen de este archivo de destino ficticio. Esto cambiará el valor de md5 cada vez que el paso de compilación se recompile y provoque los siguientes pasos para recompilarlo. Alternativamente, puede eliminar el objetivo ficticio y eso también generará una nueva compilación en cascada.

Personalmente, esto me parece muy útil porque no puedo predecir todos los resultados de cada paso del flujo de compilación de mi EDA. Tampoco quiero intentar predecir todos los resultados de cada paso de compilación debido al costo de mantenimiento.

Estoy seguro de que la función Decider(), como Greg ha mencionado, es más parecida a scons, pero personalmente me gusta tener los archivos de marca de tiempo.

0

En su archivo SConstruct extraer el nodo que representa su archivo. Después de esto, debería poder usar el nodo .always_build (true) para asegurarme de que está construido, creo que esto obligará a sus dependientes a ser reconstruidos también.

+0

gracias, pero no quieren hacer esto siempre (que es una tarea poco común pero muy necesario), y no quiero modificar los archivos SConstruct/SConscript, sólo quiero una forma de haciendo una reconstrucción de una sola vez para obligar a reconstruir un archivo o archivos en particular y sus dependientes. –