L'ultima versione di make
ha un'opzione --output-sync
che può fare la STDOUT di ciascun target atomica in modo che le dichiarazioni provenienti da più obiettivi non sono intercalati quando si utilizza make --jobs=N
GNU make 3,81 - come fare '--output-sync = target'
Sfortunatamente, devo usare make v 3.81
perché è quello che viene fornito con il nostro SDK.
Per determinare se ho bisogno --output-sync
, ho aggiunto un po 'di dichiarazioni da guardia' in giro i miei obiettivi
all: $(patsubst %.cpp, %.o, $(wildcard *.cpp))
%.o: %.cpp
@echo BEFORE
@echo MAKEFLAGS=$(MAKEFLAGS)
qcc.exe $(CC_FLAGS) [email protected] $<
@echo AFTER
L'uscita è stata molto interleaved.
AFTER
BEFOREAFTER
AFTER
AFTER
Esiste un modo per emulare la funzionalità --output-sync
?
Comprendo che la velocità di costruzione può essere compromessa se, ad esempio, esiste un modo per bloccare la pre-ricetta del mutex STDOUT e rilasciarla dopo la ricetta.
Sto bene modificando ognuno dei nostri obiettivi se è quello che serve.
Non utilizzare l'opzione '-j'? Questo eviterà l'interleaving, ed è banale da fare senza modificare il makefile, ed è approssimativamente equivalente a qualsiasi cosa tu abbia intenzione di fare, solo più facile. La funzione è solo in GNU Make 4.2? GNU Make 4.2.1 risolve il problema riscontrato con 4.2? –
@JonathanLeffler Devo usare '-j' per ottenere build parallele. Aggiornerò il post riguardante la versione 'make'. – Adrian