logo

한국어

make 명령행 옵션

관리자 2014.06.08 12:43 조회 수 : 50

출처 : http://blog.daum.net/english_100/13


9. make를 실행하는 법

 

make의 종료 상태는 다음 3가지중 하나를 갖는다.

 

0

make가 성공적으로 끝났음

 

2

make 수행중 에러가 발생했음. 그 에러에 대한 메시지를 출력함

 

1

'-q' 옵션이 사용되었고 어떤 타깃이 아직 최신상태로 갱신되지 않았다고 make가 결정했을 때

 

9.1 Makefile을 명기하기 위한 옵션

 

특정 makefile을 명기하기 위해서 '-f'나 '--file'옵션이 이용된다. 예를 들어 '-f altmake'. 이 옵션은 여러개가 사용될 수 있고 모든 makefile이 공동으로 사용된다. 이 옵션이 없을 경우 디폴트 파일은 GNUmakefie, makefile, Makefile 순으로 검색되어 읽혀진다.


9.2 목표(goal)을 명시하기 위한 인수


목 표란 make가 궁극적으로 갱신하고자하는 타깃으로서 목표 타깃의 prerequisite들, 그 prerequisite의 prerequisite들도 함께 갱신된다. 구체적 명시가 없으면 makefile 내에 처음 등장하는 타깃이 목표가 된다 (. 으로 시작하는 타깃 제외). 그러므로 makefile 내 첫 타깃은 전체 프로그램을 컴파일하는것이 일반적이다. 첫 규칙이 여러개의 타깃을 갖는 경우 그 중에서 첫 타깃이 디폴트 목표가 된다. .DEFAULT_GOAL 변수를 이용하면 디폴트 목표를 임의로 설정 관리할 수 있다.

make의 명령행 옵션을 사용하여 원하는 목표를 명시할 수도 있다. 이 때 여러개의 타깃을 나열할 수도 있는데 그 순서에 따라 실행된다. '-'로 시작하거나 '='가 포함된 타깃이 아닌 이상 어떤 타깃도 목표로 지정할 수 있다.

명령행에 목표를 지정할 경우 make는 MAKECMDGOALS라는 변수에 그 값들을 저장하는데 명령행 목표가 주어지지 않으면 이 변수 또한 빈값이 된다. 이 변수는 특별한 환경에서만 사용되어야 하는데 예를 들어 :

source = foo.c bar.c

ifneq ($(MAKECMDGOALS),clean)

include $(sources:.c=.d)

endif


이 예는 clean을 수행할 때 .d 파일을 include하지 않는데 이는 만들자마자 다시 지우는 것을 방지하기 위해서다. 


all 

clean

mostlyclean

distclean

realclean

clobber

clean이 지우는 것보다 더많은 파일을 지운다.

install

print

변화된 소스파일의 목록을 프린트한다.

tar

shar

dist

TAGS

check

test


9.3 recipe를 수행 못하게 하는 옵션


Makefile 은 make에게 어떤 타깃이 최신상태인지 어떤지를 어떻게 알려줄것이며 어떻게 갱신할 것인지를 지시한다. 하지만 타깃 갱신이 항상 원하는 대로 이루어 지는건 아닌데 이는 어떤 옵션이 make에게 다른 행동을 지시하기 때문이다.


'-n'

'--just-print'

'--dry-run'

'--recon'

"No-op" 타깃을 갱신하기 위한 recipe를 단지 프린트할 뿐 실행하지는 않는다.

'-t'

'--touch'

타깃을 실제 갱신하는 것이 아니고 단지 상태만 최신으로 변화시킨다.

'-q'

'--question'

실제적인 어떤 실행 없이 타깃이 최신 상태인지만 체크한다.

'-W file'

'--what-if=file'

'--assume-new=file'

'--new-file=file'

file에 대해 실재 변경이 이루어지지 않지만 make로 하여금 그 파일의 변경 시간을 현재로 변경시킨다.


9.4 파일의 재컴파일을 피하는 법


9.5 변수 덮어씌우기


명 령행에서 'v=x' 형태의 인자가 주어지면 이는 변수 v에 x값을 할당함을 의미한다. 이 경우 makefile내에 존재하는 같은 이름의 변수값은 모두 무시된다. 하지만 만약 makefile 내에 override 지시자를 사용해 변수를 정의하면 이는 명령행 옵션에 의한 변수 덮어씌우기를 무시해 버린다. 


9.6 프로그램 컴파일 시험해 보기


쉘명령을 수행하는 동안 에러가 발생하면 make는 0이 아니 값을 반환하고 즉시 모든 것을 중단한다. 하지만 프로그램을 수정하여 컴파일 할때는 에러가 나도 중단하지 말고 모든 에러들을 보여주길 원한다. 

이런 경우 '-k' '--keep-going' 옵션을 사용하면 된다. 


9.7 옵션 요약


'-b'

'-m'

호환성 때문에 안쓰는 옵션

'-B'

'--always-make'

모든 타깃을 구닥다리로 간주해서 모두 다시 갱신하게하는 옵션

'-C dir'

'--directory=dir'

makefile을 읽기 전에 dir 디렉토리로 옮긴후 읽어들임

'-d'

정상 처리과정뿐 아니라 디버깅 정보도 프린트 함. 

'--debug[=option]'

디버깅 레벨을 지정할 수 있음. 아무런 인자가 없으면 basic레벨 그외의 인자는 :

a (all)

모든 형태의 디버깅 정보 츨력

b (basic)

기본 정보 출력

v (verbose)

기본 정보 보다 상위 정보 출력

i (implicit)

암시적 규칙과 관련된 정보

j (jobs)

특정 하부명령을 기동하는데 있어서의 세부사항 출력

m (makefile)

위의 메시지들은 makefile을 다시 만드는 경우 출력되지 않으나 이 옵션은 이를 가능케 함

'-e'

'--envirenment-overrides'

환경으로부터 건내받은 변수가 makefile내에 정의된 변수에 우선하게 함

'--eval=string'

eval 함수의 명령행 버젼

'-f file'

'--file=file'

'--makefile=file'

file 이란 이름의 파일을 makefile로 읽어들임

'-h'

'--help'

옵션들에 대한 도움

'-i'

'--ignore-errors'

모든 에러 무시

'-I'

'--include-dir=dir'

makefile을 include할 디렉토리 dir 지정

'-j [jobs]'

'--jobs[=jobs]'

동시에 실행할 수 있는 recipe 수 지정

'-k'

'---keep-going'

에러가 나도 멈추지 말고 계속 수행

'-l [load]'

'--load-average[=load]'

'--max-load[=load]'

다른 recipe들이 실행되고 있으면 새로운 recipe는 시작되어서는 안되고 평균 load는 적어도 load를 유지해야 함

'-L'

'--check-symlink-times'

'-n'

'--just-print'

'--dry-run'

'--recon'

recipe를 실행하지는 말고 프린트만 할것

'-o file'

'--old-file=file'

--assume-old=file'

파일이 prerequisite보다 오래됐어도 갱신하지 말것

'-p'

'--print-data-base'

makefile로 부터 얻어진 규칙과 변수값을 프린트 함

'-q'

'--question'

실행하거나 프린트하는 것없이 단지 타깃이 최신상태이면 0를 반환함

'-r'

'--no-builtin-rules'

빌트인된 암시적 규칙 사용을 제한함

'-R'

'--no-builtin-variables'

빌트인 규칙에 특정된 변수 사용 제한

'-s'

'--silent'

'--quiet'

recipe가 수행될 때 recipe를 프린트하지 말것

'-S'

'--no-keep-going'

'--stop'

'-k' 옵션 영향력을 없애버림

'-t'

'--touch'

파일을 터치함

'-v'

'--version'

 make의 버젼 프린트

'-w'

'--print-directory'

일하고 있는 디렉토리를 프린트함

'--no-print-directory'

'-w' 옵션을 무력화함

'-W'

'--what-if=file'

'--new-file=file'

'--assume-new=file'

파일이 변경된 것처럼 가장함. 

'-warn-undefined-variables'

정의 안된 변수 참조가 있을 때 경고 메시지 출력