Sto usando GNU make per creare un gruppo di librerie statiche, usando le regole implicite del make per farlo. Queste regole eseguono il comando ar (1) per aggiornare la libreria/archivio. Il profiling ha mostrato che il tempo di compilazione sarebbe stato ridotto se avessi usato l'opzione -j per eseguire i lavori paralleli durante la compilazione.Come evitare problemi di concorrenza quando si utilizza GNU make per build paralleli di file di archivio?
Purtroppo, la GNU fare manuale ha una sezione http://www.gnu.org/software/make/manual/html_node/Archive-Pitfalls.html che praticamente dice che make fornisce guardie di concorrenza per l'esecuzione di ar (1), e quindi si può (e lo fa) corrotto l'archivio. Il manuale anticipa ulteriormente che ciò potrebbe essere risolto in futuro.
Una soluzione a questo è utilizzare http://code.google.com/p/ipcmd, che in pratica fa bloccare il semaforo prima di eseguire un comando, serializzando in questo modo i comandi ar (1) che creano l'archivio. Questa particolare soluzione non mi va bene perché sto costruendo con strumenti cross-compilation basati su mingw su Windows.
C'è una soluzione più semplice o migliore a questo problema?
Penso che sia necessario eseguire il ranlib dell'archivio, non gli objs. Forse puoi usare $^anche per i file oggetto nelle regole. – user1143888