2012-05-12 5 views
29

Mogę ustawić liczbę wątków dla procesu kompilacji za pomocą argumentu -j. Na przykład mam 4 rdzenie +4 wirtualne. Kiedy piszę: make -j8 prędkość wzrasta 4 razy.Równoległe make: set -j8 jako domyślna opcja

Czy można ustawić tę wartość jako domyślną? (Na przykład w Gentoo Linux, w pliku konfiguracyjnym, można ustawić tę domyślną wartość).

p.s. Mam Arch Linux

+1

To bardziej pytanie niż make gcc jeden. – Pubby

+0

Więc ... domyślną opcją C++ make jest "uruchamiać 4 razy wolniej niż jest to możliwe"? Cóż za dziwna decyzja! –

+1

@MartinJames Równoległa marka ma wiele wad, a więc sprawia, że ​​zły domyślny. – Pubby

Odpowiedz

30

Twoje pytanie nie dotyczy wątków, ale procesów (zadań) wykonywanych przez make.

Prosta, aby ustawić ten sposób, gdy jest stosowane w konsoli dodaje:

alias make="/usr/bin/make -j 8" 

do pliku .profile.

Można również użyć setenv MAKEFLAGS '-j 8', ale MAKEFLAGS może zignorować ten parametr w niektórych scenariuszach, ponieważ utrzymanie żądanej liczby procesów wymaga komunikacji z rekursywnymi połączeniami make. Na szczęście ta metoda to works with current versions of GNU Make.

+6

Od tego wzmianka o "rekursywnej make" nie kończy się, chciałbym jeszcze raz wskazać na http://aegis.sourceforge.net/auug97.pdf ... poza tym, plik make musi być dobrze napisany, aby nawet pozwolić dla równoległej marki. Często, szczególnie zautomatyzowane metody, pomijają rzeczywiste zależności i powodują, że cele mają być budowane wiele razy i podoba im się ... – 0xC0000022L

+0

Jeśli łącze nie działa w przyszłości, dokument zatytułowany jest "Rekursywny uważaj za szkodliwy" i powinien być dość łatwy znaleźć. Warto przeczytać. – SystemParadox

+0

Co to jest "setenv"? Wbudowany csh? – alecov

25

setenv MAKEFLAGS '-j8'

nadzieję, że to pomaga!

5

Oto jak zrobiłem to:

CORES ?= $(shell sysctl -n hw.ncpu || echo 1) 

all:; @$(MAKE) _all -j$(CORES) 
_all: install lint test 
.PHONY: all _all 
… 

Ja w zasadzie „alias” domyślną bramkę all do „prywatnej” _all. Polecenie do obliczenia liczby rdzeni jest specyficzne dla OSX, AFAIK, więc możesz go ulepszyć, aby był bardziej platformowy, jeśli zechcesz. Ze względu na przypisanie ?= możemy po prostu zastąpić je zmienną env i if/when w razie potrzeby.

EDIT:

Można również dodać do istniejącego MAKEFLAGS od wewnątrz samego makefile, tak:

CPUS ?= $(shell sysctl -n hw.ncpu || echo 1) 
MAKEFLAGS += --jobs=$(CPUS) 
… 
+1

To jest IMHO lepsze niż inne rozwiązania, ponieważ można to dostosować na plik Makefile. –

+0

Nie można zmienić plików MAKEFLAG w ten sposób. Wypróbuj: https://gist.github.com/sanmai/dcc31ae20afa6e8ba4721f174fe05fd9 – sanmai