Debugging

make 명령에서 제공되는 대부분의 command line options 이 makefile 을 디버깅하고 테스트하는데 사용될 수 있습니다. 또한 디버깅 시에 직접 info, warning, error builtin 함수를 활용할 수도 있습니다.

info, warning, error 함수

이 함수들의 특징은 확장 결과로 메시지가 출력되지만 반환값은 empty 라는 것입니다. 따라서 makefile 어느 위치에서든지 syntax error 없이 위치시켜 사용할 수 있습니다. info 함수는 stdout 으로 출력을 하고 warningerror 함수는 stderr 로 출력을 하는데 error 함수의 경우는 해당 위치에서 make 실행이 종료됩니다. 따라서 특정 상황에서 make 실행을 종료하고 싶으면 error 함수를 이용하면 됩니다.

다음은 info 함수를 활용하여 makefile 이 실제 어떤 순서대로 실행되는지 알아보는 예제입니다. 출력 결과를 보면 먼저 global 영역이 처리가 완료된 후에 recipe 가 실행되는데 이때도 작성 순서대로 실행되는 것이 아니라 먼저 make 레이어에 해당하는 변수 및 함수가 확장되고 난후에 shell 명령이 실행되는 것을 알 수 있습니다.

$(info start ...)

foo :
    @$(info recipe start ...)
    @date +%F
    @$(info recipe end ...)

$(info end ...)
$(info -------------------------)

###########  실행 결과  ###########

sh$ make
start ...
end ...
-------------------------        
recipe start ...
recipe end ...
2019-06-14      # recipe 가 실행될때는 먼저 make 변수, 함수가 확장된후 shell 명령이 실행된다.

error 함수를 활용하면 특정 위치에서 make 실행을 종료할 수 있습니다. 다음은 FOO 변수가 존재하지 않거나( undefined ) 또는 값이 empty 일 경우 make 실행이 종료됩니다.

ifndef FOO                                       ifeq "$(FOO)" ""
$(error FOO is not defined or empty)             $(error FOO is not defined or empty)
endif                                            endif

error 함수를 이용해 assert 함수를 작성할 수도 있습니다.

define assert  
$(if $1,,$(error Assertion failed: $2))
endef

$(call assert,condition,message)

-p ( --print-data-base ) 옵션

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

-d 또는 --debug[=options] 옵션

make 이 실행될 때 디버깅 정보도 함께 출력합니다. 어떤 파일이 비교되는지, 어떤 implicit rule 이 검색되는지, 어떤 파일이 remake 되는지 등 make 실행시 일어나는 전반에 대한 정보를 볼 수 있습니다. --debug 옵션에는 다음과 같은 인수를 사용할 수 있는데 인수를 주지 않으면 기본적으로 basic 이 사용됩니다.

make -d 명령은 make --debug=all 와 같은 것입니다.

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 합니다.

--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