2011-03-14 2 views
21

내가 시간을 찾고 있었고,이 정보가 아무데도 없을 것으로 보인다를 내 -j하기 위해 인수를 추출 ...GNU 만들 : 메이크

내가 추출 할 수 (및 사용)하고 싶습니다 -j 옵션을 통해 전달 된 요청 된 make "작업 수"또는 하위 파일의 경우 Makefile 자체가 Makefile에 표시합니다.

내가 지금까지 보아온 가장 유망한 것은 $ (MAKEFLAGS) 변수이지만, 내 시스템에서는 (make -j2라고하면)이 변수의 내용은 "--jobserver-fds = 3,4-j "이다. -j로 전달되는 실제 작업 수를 얻을 수있는 방법이 있습니까?

+1

왜 그렇게하고 싶습니까? 이것은 제작의 정신에 반하는 것이므로, 당신이하고 싶은 것을 성취 할 수있는 더 좋은 방법이 있다고 확신합니다. –

+0

내부적으로'make -j'를 호출 할 수있는 최상위 Makefile에서 작업의 수를 가변 매개 변수로 만들 수 있습니다. – aaz

+0

@static_rtti, 나는 make의 실제 실행에 대해 좀 더 배우기를 바랬다. (특히 $ (MAKE)로 시작했을 때). 예를 들어 모든 하위 작성자는 job_slots 값이 1입니까, 아니면 하위가 최상위 수준에서 사용할 수있는 N 작업의 하위 집합을 전달할 수 있습니까? 라파엘 (Raphael)이 제안한대로 소스를 읽는 것이 아마도 이것을 결정하는 방법 일 것이지만, make 자체를 실험하는 것이 더 간단 할 것이라고 생각했습니다. –

답변

11

사실 이걸 * nix의 makefile 안에 완벽하게 구현할 수있는 방법이 있습니다.

MAKE_PID := $(shell echo $$PPID) 
JOB_FLAG := $(filter -j%, $(subst -j ,-j,$(shell ps T | grep "^\s*$(MAKE_PID).*$(MAKE)"))) 
JOBS  := $(subst -j,,$(JOB_FLAG)) 

ps, ​​grep도 설치해야하지만 거의 제공됩니다. 작업을 처리하기 위해 더 나아질 수도 있습니다

+0

방금이 작업을 시도해 보았습니다. 사용자가'-j '를 넘겨주지 않으면'$ JOB_FLAG'를 1로 설정하기 위해 작은 변화를 만들 수 있습니다. 감사! –

+0

'ps '의 출력을 grepping하는 대신'/ proc/$ PPID/cmdline'을 읽을 수도 있습니다. –

12

미안하지만 프로세스 매개 변수를 식별하기 위해 프로세스 목록을 검사하는 응용 프로그램이나 스크립트를 작성하지 않고도 병렬 작업 수를 식별 할 수있는 방법이 없습니다.

http://cvs.savannah.gnu.org/viewvc/make/main.c?revision=1.246&root=make&view=markup에서 소스 코드를 확인하십시오. job_slots > 1을 검색하십시오.

업데이트 : 작동 범위를 제어 할 수있는 경우 make 응용 프로그램을 자신의 프로그램/스크립트로 래핑하고 매개 변수를 구문 분석하고 전용 환경 변수를 설정 한 다음 나중에 원래의 호출을 호출하십시오.

+2

소스로 가기위한 Upvote. –

+0

안녕하세요 라파엘, 답변 해 주셔서 감사합니다. 그것은 내가 두려워했던 것이다! 지금은 단순히 Makefile을 수정하여 -j의 실제 값이 필요하지 않게되었습니다 ... "make of spirit"에 더 가깝습니다 .-P –