2012-01-11 9 views
10

Estoy usando GNU make para construir un grupo de bibliotecas estáticas, usando las reglas implícitas de make para hacerlo. Estas reglas ejecutan el comando ar (1) para actualizar la biblioteca/archivo. La creación de perfiles ha demostrado que el tiempo de creación se reduciría si utilicé la opción -j para ejecutar trabajos paralelos durante la compilación.¿Cómo evito los problemas de simultaneidad cuando uso GNU make para versiones paralelas de archivos de almacenamiento?

Por desgracia, la GNU make manual tiene una sección http://www.gnu.org/software/make/manual/html_node/Archive-Pitfalls.html que más o menos dice que marca ofrece ningún guardia de concurrencia para el funcionamiento de AR (1), y por lo tanto se puede (y lo hace) corromper el archivo. El manual también se burla de que esto pueda solucionarse en el futuro.

Una solución para esto es usar http://code.google.com/p/ipcmd, que básicamente hace el bloqueo del semáforo antes de ejecutar un comando, serializando así los comandos ar (1) que crean el archivo. Esta solución particular no es buena para mí porque estoy construyendo con herramientas de compilación cruzada basadas en mingw en Windows.

¿Existe una solución más simple o mejor para este problema?

Respuesta

2

hacer el archivo como un solo paso, en lugar de tratar de actualizar el archivo de forma incremental:

libfoo.a: $(OBJS) 
     -rm -f [email protected] 
     $(AR) rc [email protected] $^ 
     $(RANLIB) [email protected] 
+1

Creo que necesita ranlib el archivo, no los objs. Posiblemente también puede usar $^para los archivos objeto en las reglas. – user1143888

2

Pruebe lo siguiente -

AR := flock make.lock $(AR) 

clean:: 
    rm -f make.lock 

Ahora ar (1) se ejecutará con un bloqueo exclusivo al archivo make.lock, serializando así el acceso a la biblioteca.

Puede agregar un comando para eliminar el archivo make.lock después del comando ranlib.

Agregue export AR para propagar la definición a sub-marcas, si es necesario.

+0

¿Tendría sentido "agrupar" el archivo en construcción? ¿O 'bandada' prohíbe el acceso de otras maneras? –

Cuestiones relacionadas