2012-05-12 35 views
29

Tôi có thể đặt số lượng chủ đề cho quy trình xây dựng sử dụng đối số -j. Ví dụ, tôi có 4 lõi +4 ảo. Khi tôi viết: make -j8 tốc độ tăng gấp 4 lần.Làm song song: set -j8 làm tùy chọn mặc định

Có thể đặt giá trị đó làm mặc định không? (Ví dụ, trong Gentoo Linux, trong tệp cấu hình, bạn có thể đặt giá trị mặc định này).

p.s. Tôi có Arch Linux

+1

Đây là chi tiết của một make câu hỏi hơn một gcc. – Pubby

+0

Vì vậy .. mặc định C++ làm cho tùy chọn là 'chạy 4 lần chậm hơn là có thể'? Thật là một quyết định kỳ lạ! –

+1

@MartinJames Việc tạo song song có nhiều sai sót và do đó nó làm cho một mặc định xấu. – Pubby

Trả lời

30

Câu hỏi của bạn không phải là về chủ đề, nhưng quy trình (công việc) được thực hiện bằng cách thực hiện.

Các đơn giản, cách để thiết lập này, khi làm được sử dụng từ giao diện điều khiển sẽ bổ sung:

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

đến file .profile của bạn.

Bạn cũng có thể sử dụng setenv MAKEFLAGS '-j 8', nhưng MAKEFLAGS có thể bỏ qua thông số này trong một số trường hợp, vì việc giữ số lượng quy trình yêu cầu phải liên lạc với các cuộc gọi đệ quy make. Vui lòng phương pháp này works with current versions of GNU Make.

+6

Vì điều này đề cập đến "đệ quy làm" không dừng lại, tôi muốn một lần nữa trỏ đến http://aegis.sourceforge.net/auug97.pdf ... bên cạnh đó, các tập tin cần phải được viết tốt để thậm chí cho phép để thực hiện song song. Thông thường, đặc biệt là các phương pháp tự động, bỏ qua các phụ thuộc thực tế và gây ra các mục tiêu được xây dựng nhiều lần và thích ... – 0xC0000022L

+0

Trong trường hợp liên kết không hoạt động trong tương lai, bài báo có tiêu đề "Đệ quy được coi là có hại" và phải đủ dễ dàng để tìm. Nó cũng đáng đọc. – SystemParadox

+0

Có gì 'setenv' ở đây? Các csh nội trang? – alecov

25

setenv MAKEFLAGS '-j8'

Hy vọng điều này sẽ hữu ích!

5

Đây là cách tôi đã thực hiện nó:

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

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

tôi đã cơ bản "bí danh" mục tiêu mặc định của tôi all đến một "private" _all. Lệnh để tìm ra số lõi là OSX cụ thể, AFAIK, vì vậy bạn có thể cải thiện nó để có nhiều nền tảng hơn nếu bạn muốn. Và vì nhiệm vụ ?=, chúng tôi chỉ có thể ghi đè nó bằng biến và env nếu/khi cần.

EDIT:

Bạn cũng có thể thêm vào MAKEFLAGS bạn từ bên trong makefile bản thân, như vậy:

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

Đây là IMHO tốt hơn so với các giải pháp khác, vì bạn có thể điều chỉnh điều này cho mỗi Makefile. –

+0

Bạn không thể thay đổi MAKEFLAGS theo cách này. Hãy dùng thử: https://gist.github.com/sanmai/dcc31ae20afa6e8ba4721f174fe05fd9 – sanmai