Command-line Options

make 은 작업을 컨트롤하거나 디버깅에 사용할 수 있는 다양한 옵션들을 제공합니다.

make 명령의 종료 상태 값은 다음 3 가지 중에 하나가 됩니다.

0 make 이 정상 종료하였을 때
2 make 이 오류로 종료하였을 때입니다. 이때는 관련 메시지도 함께 프린트됩니다.
1 이것은 "-q" 옵션을 사용하여 make 을 실행했을 때 갱신해야 될 타겟이 존재하는 것을 의미합니다.

-b , -m

이 옵션은 단순히 다른 make 버전과 호환성을 위한 것으로 ignored 됩니다.

-B , --always-make

모든 타겟을 out-of-date 상태로 간주하고 무조건 다시 빌드합니다.

-C dir , --directory=dir

주로 recursive make 에서 사용되는 옵션인데 make 명령을 실행하기 전에 먼저 cd 합니다. 옵션을 여러개 사용할 수 있는데 이때는 서로 연결됩니다. 따라서 다음은 모두 같은 결과가 됩니다.

1. make -C foo/bar                
2. make -C foo/ -C bar
3. cd foo/bar && make

-d

make 이 실행될 때 디버깅 정보도 함께 출력합니다. 어떤 파일이 비교되는지, 어떤 implicit rule 이 검색되는지, 어떤 파일이 remake 되는지 등 make 실행시 일어나는 전반에 대한 정보를 볼 수 있습니다. 이것은 --debug=a 옵션과 같은것 입니다.

--debug[=options]

make 이 실행될 때 디버깅 정보도 함께 출력합니다. 옵션 인수로 다음과 같은 값을 사용할 수 있는데 여러 개를 사용할 경우는 , 로 분리하면 됩니다. 옵션 인수를 주지 않으면 기본적으로 basic 이 사용됩니다.

a (all) 모든 디버깅 정보를 enable 합니다. 이것은 make 명령 실행시 "-d" 옵션을 사용하는 것과 같습니다.
b (basic) basic 디버깅 정보를 출력합니다 ( 갱신해야될 타겟, 빌드가 성공했는지 등 )
v (verbose) basic 정보에 더해서 어떤 makefile 을 파싱하는지, 어떤 prerequisites 은 빌드할 필요가 없는지 등 정보를 출력합니다.
i (implicit) basic 정보에 더해서 implicit rule 검색에 대한 정보를 출력합니다.
j (jobs)

make 실행시 호출되는 sub-commands 관련 정보를 출력합니다.

Putting child 0x564c96ee6e40 (all) PID 31478 on the chain.
Live child 0x564c96ee6e40 (all) PID 31478
Reaping winning child 0x564c96ee6e40 PID 31478
Removing child 0x564c96ee6e40 PID 31478 from chain....
m (makefile) 위 옵션들을 사용했을 때 출력되는 정보들는 makefile remake 시에는 출력되지 않는데 이 옵션을 사용하면 출력됩니다. "all" 옵션에는 이 옵션이 기본적으로 포함됩니다.
n (none) 디버깅 정보 출력을 disable 합니다.

-e , --environment-overrides

이 옵션을 사용하면 makefile 에서 설정한 변수값 대신에 환경 변수에서 설정한 값이 사용됩니다.

--eval=string

명령 라인에서 make script 를 작성해 전달할 수 있습니다. 그러면 make 의 builtin 룰과 변수들이 정의된 후 makefile 을 읽어들이기 전에 실행됩니다.

print-%:
    @echo $* = $($*) from $(origin $*)

############  실행 결과  #############
sh$ make --eval='AA := 100' print-AA
AA = 100 from file

sh$ make --eval='XX := AA' --eval='$(XX) := 100' print-AA
AA = 100 from file

-f file , --file=file , --makefile=file

실행할 makefile 을 지정합니다.

-i , --ignore-errors

recipe 실행시 오류가 발생하면 make 실행이 중단되는데 이 옵션을 사용하면 오류가 ignore 됩니다.

-I dir , --include-dir=dir

이것은 include 지시자 에서 사용되는 옵션인데 만약에 파일이 / 로 시작하지 않고, 현재 디렉토리에서도 찾을 수 없다면 이 옵션으로 지정한 디렉토리에서 찾게 됩니다. 이 옵션은 여러 개를 사용할 수 있습니다.

-j [N] , --jobs[=N]

rule 단위로 recipe 들을 병렬 실행할 때 사용하는 옵션입니다. 최대 몇 개까지 병렬 실행할지 개수( N )를 지정할 수 있는데 만약에 개수를 지정하지 않고 단독으로 사용하면 as many recipes as possible 실행합니다.

-l [load] , --load-average[=load] , --max-load[=load]

병렬 실행시 현재 시스템 로드에 따라서 새로 실행되는 job 을 제한할 수 있습니다. 기본적으로 1 개의 job 은 항상 실행되지만 새로 job 을 생성할 때는 먼저 -l 옵션에 설정한 값을 비교하여 현재 시스템 로드가 해당 값보다 작을 경우에만 새로 job 을 생성합니다. 기본값은 no limit 입니다.

# 시스템 로드가 2.5 이상이면 새로 job 을 생성하지 않습니다.

sh$ make -j8 -l 2.5

-k , --keep-going

recipe 실행시 오류가 발생하면 make 실행이 종료되는데 이 옵션을 사용하면 오류가 발생한 타겟과 의존관계가 없는 타겟들은 계속 진행됩니다.

-L , --check-symlink-times

파일명으로 symbolic link 를 사용할 경우는 파일의 timestamp 를 체크할 때 기본적으로 symbolic link 에 연결된 파일의 값이 사용되지만 이 옵션을 사용하면 symbolic link 자체 값도 포함해서 그중 최신 값이 사용됩니다.

-n , --just-print , --dry-run , --recon

이 옵션은 recipe 에서 실행되는 명령문을 출력만 하고 실제 실행하지는 않습니다. 명령문 앞에 @ prefix 가 붙은 경우에도 출력이 됩니다. 이 옵션이 사용되어도 명령문 앞에 + prefix 가 붙은 경우나 makefile remake 에 사용되는 recipe 는 실행됩니다.

-o file , --old-file=file , --assume-old=file

이 옵션은 최신 상태의 파일을 old 상태로 간주하여 실행할 수 있게 해줍니다 ( 실제 old 상태로 만드는 것은 아님 ). 반대로 old 상태의 파일을 최신 상태의 파일로 간주하여 실행할 수 있는 -W 옵션도 있습니다.

-O[type] , --output-sync[=type]

-j 옵션을 이용해 여러 타겟의 recipe 가 병렬로 실행되면 출력이 서로 겹치게 됩니다. 이와 같은 문제를 해결하기 위한 출력 동기화 옵션입니다. 출력은 특정 type 단위로 모아져서 한번에 출력되는데 여기에는 다음과 같이 4 가지 종류를 사용할 수 있습니다. type 을 지정하지 않으면 기본값은 target 이 되고 해당 타겟의 recipe 에서 발생한 출력이 모두 모아져서 한번에 출력됩니다. 좀더 자세한 내용은 여기를 참고 하세요

1. none ( no synchronization )
2. line ( recipe 라인 단위 )
3. target ( rule 단위 )
4. recurse ( recursive make 실행시 sub-make 단위 )

-p , --print-data-base

makefile 을 읽어들여 실행한 후에 make 이 가지고 있는 룰과 변수 database 정보를 출력합니다.

# make 에 builtin 으로 설정되어 있는 룰과 변수 database 정보를 보려면 다음과 같이하면 됩니다.
sh$ make -p -f /dev/null

# remake 은 하지 않고 database 를 출력하려면 다음과 같이 합니다.
sh$ make -qp

-q , --question

갱신해야 될 타겟이 있는지 알아볼 때 사용합니다. 아무런 recipe 도 실행하지 않고 출력도 하지 않습니다. 단지 make 명령의 종료 상태 값만 설정됩니다.

  1. 모든 타겟이 up to date 상태면 종료 상태 값은 0 입니다.
  2. 갱신해야 될 타겟이 존재하면 종료 상태 값은 1 입니다.
  3. 실행 중 오류가 발생하면 종료 상태 값은 2 가 됩니다.

-r , --no-builtin-rules

make 에 builtin 돼서 제공되는 implicit rules ( pattern rules, suffix rules ) 들을 disable 합니다.

-R , --no-builtin-variables

make 의 builtin 변수들 ( builtin implicit rules 과 관련됨 ) 을 disable 합니다. 이 변수들이 disable 되면 관련 builtin rules 들도 사용할 수 없기 때문에 자동으로 -r 옵션도 설정됩니다.

-s , --silent , --quiet

recipe 에서 명령이 실행되기 전에 명령문이 출력되는 것을 disable 합니다. 이것은 모든 recipe 라인 앞에 @ prefix 를 붙인 것과 같습니다. 또한 --print-directory 옵션도 disable 되어 출력되지 않습니다.

-S , --no-keep-going , --stop

이것은 디폴트 설정이기 때문에 보통의 경우는 이 옵션이 필요 없지만 recursive make 에서 -k 옵션이 사용될 경우 상속되는 것을 방지하려면 이 옵션을 사용합니다.

-t , --touch

모든 타겟 파일을 recipe 실행 없이 touch 명령을 사용해 up to date 상태로 만듭니다. 예를 들어 특정 헤더 파일을 수정한 후에 불필요하게 재 컴파일되는 것을 방지하기 위해 사용할 수 있습니다. 특정 타겟 파일이 touch 에의해 생성되는 것을 방지하려면 .PHONY 타겟에 등록하면 됩니다.

.PHONY 타겟은 touch 에서 제외됩니다.

--trace

makefile 실행 중에 tracing 정보도 함께 출력합니다. 여기에는 makefile 이름, recipe 라인 넘버, 왜 타겟이 빌드가 되는지 같은 정보가 출력됩니다. 이때 silent 옵션이나 @ prefix 는 무시됩니다.

sh$ make --trace all
Makefile:19: target 'zoo' does not exist
echo target zoo : all
target zoo : all
Makefile:17: update target 'bar' due to: zoo
echo target bar : all
target bar : all
Makefile:15: update target 'foo' due to: bar
echo target foo : all
target foo : all

-w , --print-directory

recursive make 사용시 makefile 실행 전, 후에 디렉토리 정보를 표시해줍니다. 이 옵션은 자동으로 설정되므로 직접 설정할 필요는 없습니다. --silent 옵션을 사용하거나 --no-print-directory 옵션을 사용하면 disable 됩니다.

make[1]: Entering directory '/home/mug896/tmp/foo'
. . .
make[2]: Entering directory '/home/mug896/tmp/foo/bar'
. . .
make[2]: Leaving directory '/home/mug896/tmp/foo/bar'
. . .
make[1]: Leaving directory '/home/mug896/tmp/foo'

--no-print-directory

--print-directory 옵션이 설정되어 있는 상태에서 이 옵션이 사용되면 디렉토리 정보 출력이 disable 됩니다.

-W file , --what-if=file , --new-file=file , --assume-new=file

이 옵션은 old 상태의 파일을 최신 상태의 파일로 간주하여 실행할 수 있게 해줍니다 ( 실제 최신 상태로 만드는 것은 아님 ). 따라서 -n 옵션과 함께 사용하면 특정 파일이 update 되었을 때 어떤 작업이 일어나는지 테스트해볼 수 있습니다.

--warn-undefined-variables

makefile 작성시 undefined 변수를 사용할 경우 warning 메시지를 출력합니다.