2016-11-25 5 views
1

외부 C 라이브러리 용 FindXXX.cmake 스크립트를 작성하고 있습니다. 스크립트에 라이브러리 버전 정보를 제공하고 싶습니다. 그러나 라이브러리는이 정보를 버전 번호를 문자열로 반환하는 함수 형식으로 만 제공합니다.CMake로 바이너리에서 라이브러리 버전을 추출하십시오.

내가 FindXXX.cmake이 즉석에서 다음 C 프로그램을 컴파일함으로써 내가 버전 번호를 추출 할 수 있다고 생각 :

, CMake 컴파일 및 구성시에 위의 프로그램을 실행해야 작동이 위해서는
#include <stdio.h> 
#include "library.h" 

int main() { 
    char version[256]; 
    get_version(version); 
    puts(version); 
    return 0; 
} 

, 인쇄 한 정보를 버전 식별자로 사용하십시오. 나는 후자 (execute_process)를 수행하는 방법을 알고 있으며, 거의은 이전 방법을 알고 있습니다. CheckCSourceRuns이 마음에 들지만 생성 된 실행 파일의 표준 출력을 캡처하는 방법을 모르겠습니다.

TL : DR : 프로그램을 컴파일하고 실행하고 생성 시간에 CMake에서 stdout을 캡처하는 방법이 있습니까?

답변

2

당신이 (당신의 소스 파일이 foo_get_version.c로 명명한다고 가정한다) 그 목적을 위해 try_run을 사용할 수 있습니다 :

try_run(foo_run_result foo_compile_result 
     foo_try_run ${CMAKE_CURRENT_LIST_DIR}/foo_get_version.c 
     RUN_OUTPUT_VARIABLE foo_run_output) 

if(NOT foo_compile_result) 
    # ... Failed to compile 
endif() 
if(NOT foo_run_result EQUAL "0") 
    # ... Failed to run 
endif() 

# Now 'foo_run_output' variable contains output of your program. 

주, try_run이 실행되지 않도록 을 크로스 컴파일 할 때. 대신 CMake는 사용자가 캐시 변수 foo_run_resultfoo_run_result__TRYRUN_OUTPUT을 설정할 것으로 예상합니다.

+0

감사합니다. 작동합니다! 크로스 컴파일에 대한 마지막 비트를 얻지 못했습니다. 정교한 케어? –

+1

크로스 컴파일하면 * 라이브러리에 * 링크 (즉, 프로그램을 컴파일) 할 수 있지만 ** 라이브러리를로드 할 수 없습니다. 즉, 프로그램을 실행합니다. 이는 * 호스트 * 플랫폼 ('cmake '을 실행하는 곳)이 * target * 플랫폼 (라이브러리가로드 될 플랫폼)과 다르기 때문입니다. 이 경우 라이브러리의 버전을 얻으려면 다른 방법이 필요합니다. 예를 들어, 사용자에게 * target * machine에서 프로그램을 실행하도록 요청하고 해당 실행에 따라 특정 CMake 캐시 변수를 설정할 수 있습니다. – Tsyvarev

관련 문제