gRPC 관련 문서를 보다가 CMakeList.txt 로 어떻게 빌드를 하는지 훑어보는 중에 다음과 같은 표현을 발견했다.
set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)
_PROTOBUF_PROTOC 라는 변수로 $<TARGET_FILE:protobuf::protoc> 값을 설정하는 표현이다.
그런데 $<TARGET_FILE:protobuf::protoc> 이라는 표현은 또 어떤 것인가?
cmake 의 generator-expression 중의 하나임을 알게 되었다.
generator-expression 은 $<...>
형태로 표현한다. 괄호 내의 내용에 대해 어떤 값을 평가(evaluate)한다고 되어 있다.
링크한 페이지에서 TARGET_FILE 을 검색해보면,
$<TARGET_FILE:tgt>
Full path to the
tgt
binary file.
즉, 타켓의 전체 경로를 얻어오는 표현이다. 그러므로, $<TARGET_FILE:protobuf::protoc> 은 protobuf::protoc
의 전체 경로를 나타내게 된다.
그렇다면, 이 실제값은 어떻게 확인할 수 있을까. message() 를 사용하면 되지 않을까.
링크한 페이지의 가장 하단에 보면, generator-expression은 빌드 중에 평가되는 값이기 때문에 message()로는 확인할 수 없다라고 설명한다. 그리고, 확인할 수 있는 방법도 설명하고 있다.
$<TARGET_FILE:protobuf::protoc> 의 경우에는,
add_custom_target(genexdebug COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE:protobuf::protoc>")
이 값은 cmake를 구성(configure) 단계가 아닌, 빌드(build) 단계에서 값이 출력된다.