‘warning: jobserver unavailable: using -j1. Add `+' to parent make rule.’


In order for make processes to communicate, the parent will pass information to the child. Since this could result in problems if the child process isn’t actually a make, the parent will only do this if it thinks the child is a make. The parent uses the normal algorithms to determine this (see How the MAKE Variable Works). If the makefile is constructed such that the parent doesn’t know the child is a make process, then the child will receive only part of the information necessary. In this case, the child will generate this warning message and proceed with its build in a sequential manner.


make 프로세스가 통신을 하기 위해서, 부모는 자식에게 정보를 넘겨줄 것이다. 자식 프로세스가 실제로 make를 하지 못하는 문제가 발생하기 전까지, 부모는 자식이 make를 진행 중이라고 생각을 할 것이다. 부모는 이것을 결정하기 위한 일반적인 알고리즘을 사용한다(How the MAKE Variable Works를 볼 것). 만약 makefile이 부모가 자식이 make 프로세스란걸 알지 못 하는 것과 같은 구조로 짜여있을 경우, 자식은 필요한 정보의 일부분만 받게 될 것이다. 이경우, 자식은 이 경고 메시지를 생성하고 자신의 빌드를 순차적인 방법으로 진행할 것이다.


[링크 : https://www.gnu.org/software/make/manual/html_node/Error-Messages.html]


Recursive make commands should always use the variable MAKE, not the explicit command name ‘make’, as shown here:


subsystem:

        cd subdir && $(MAKE)

[링크 : https://www.gnu.org/software/make/manual/html_node/MAKE-Variable.html#MAKE-Variable]



한줄 요약하자면..

병렬 구조로 안짜여졌으니 병렬로 안하겠어! 라는 의미


해결책은..

make -c ... 

이런거 대신

$(MAKE) -c ...

이런식으로 MAKE 변수를 써라.. 인가?



+

Only certain flags go into $(MAKEFLAGS).  -j isn't included because the sub-makes communicate with each other to ensure the appropriate number of jobs are occuring


Also, you should use $(MAKE) instead of make, since $(MAKE) will always evaluate to the correct executable name (which might not be make).

[링크 : http://stackoverflow.com/questions/9147196/makefile-pass-jobs-param-to-sub-makefiles]



The ‘-j’ option is a special case (see Parallel Execution). If you set it to some numeric value ‘N’ and your operating system supports it (most any UNIX system will; others typically won’t), the parent make and all the sub-makes will communicate to ensure that there are only ‘N’ jobs running at the same time between them all. Note that any job that is marked recursive (see Instead of Executing Recipes) doesn’t count against the total jobs (otherwise we could get ‘N’ sub-makes running and have no slots left over for any real work!)


If your operating system doesn’t support the above communication, then ‘-j 1’ is always put into MAKEFLAGS instead of the value you specified. This is because if the ‘-j’ option were passed down to sub-makes, you would get many more jobs running in parallel than you asked for. If you give ‘-j’ with no numeric argument, meaning to run as many jobs as possible in parallel, this is passed down, since multiple infinities are no more than one.


If you do not want to pass the other flags down, you must change the value of MAKEFLAGS, like this:


subsystem:

        cd subdir && $(MAKE) MAKEFLAGS=

The command line variable definitions really appear in the variable MAKEOVERRIDES, and MAKEFLAGS contains a reference to this variable. If you do want to pass flags down normally, but don’t want to pass down the command line variable definitions, you can reset MAKEOVERRIDES to empty, like this:


MAKEOVERRIDES =

This is not usually useful to do. However, some systems have a small fixed limit on the size of the environment, and putting so much information into the value of MAKEFLAGS can exceed it. If you see the error message ‘Arg list too long’, this may be the problem. (For strict compliance with POSIX.2, changing MAKEOVERRIDES does not affect MAKEFLAGS if the special target ‘.POSIX’ appears in the makefile. You probably do not care about this.)


A similar variable MFLAGS exists also, for historical compatibility. It has the same value as MAKEFLAGS except that it does not contain the command line variable definitions, and it always begins with a hyphen unless it is empty (MAKEFLAGS begins with a hyphen only when it begins with an option that has no single-letter version, such as ‘--warn-undefined-variables’). MFLAGS was traditionally used explicitly in the recursive make command, like this:


subsystem:

        cd subdir && $(MAKE) $(MFLAGS)

but now MAKEFLAGS makes this usage redundant. If you want your makefiles to be compatible with old make programs, use this technique; it will work fine with more modern make versions too.


[링크 : https://www.gnu.org/.../html_node/Options_002fRecursion.html#Options_002fRecursion]



'프로그램 사용 > make, configure' 카테고리의 다른 글

make 의존성 파일?  (0) 2015.12.18
make 암시적 룰  (0) 2015.12.18
make jobserver unavailable  (0) 2015.12.16
make 아카이브  (0) 2015.12.14
make 매크로  (0) 2015.12.14
make -j -l  (0) 2015.11.30
Posted by 구차니

댓글을 달아 주세요