2017-12-27 7 views
0

함께 연결되는 여러 개의 .xsd 파일로 구성된 .xsd 파일과 함께 제공해야하는 응용 프로그램이 있습니다. 연결에 대한 소스 목록은 모든 라이브러리 종속성을 살펴보고 해당 라이브러리의 속성을 검사하여 파생 될 수 있습니다.add_custom_command에서 여러 파일 연결

function(make_config_xsd) 
    set(xsd_config ${CMAKE_CURRENT_BINARY_DIR}/config.xsd) 

    # build up a list of config files that are going to be concatenated 
    set(config_list ${appcommon_SOURCE_DIR}/config/common.xsd) 

    # iterate over the library dependencies and pull out config_file properties 
    get_target_property(libraries ${PROJECT_NAME} LINK_LIBRARIES) 
    foreach(lib ${libraries}) 
     get_target_property(conf ${lib} config_file) 
     if(conf) 
      list(APPEND config_list ${conf}) 
     endif() 
    endforeach() 

    # finally, add the app specific one last 
    list(APPEND config_list ${PROJECT_SOURCE_DIR}/config/config.xsd) 

    add_custom_command(OUTPUT ${xsd_config} 
     COMMAND echo \"<?xml version=\\"1.0\\"?><xs:schema xmlns:xs=\\"http://www.w3.org/2001/XMLSchema\\">\" > ${xsd_config} 
     COMMAND cat ${config_list} >> ${xsd_config} 
     COMMAND echo \"</xs:schema>\" >> ${xsd_config} 
     DEPENDS "${config_list}") 

    add_custom_target(generate-config DEPENDS ${xsd_config}) 
    add_dependencies(${PROJECT_NAME} generate-config) 
endfunction() 

가 나타납니다 작업 : 내가 함께 결국 무엇

는 "옳은 일을"할 응용 프로그램의 CMakeLists.txt 그냥 호출 할 수있는 기능이었다. 하지만 실제로이 문제를 해결하는 "올바른 방법"인지 잘 모르겠다. add_custom_target() 그냥 add_custom_command()의 출력에 의존하므로 add_dependencies()도 올바르게 보이지 않습니다. 이와 같이 생성 된 파일에 대한 의존성을 수행하는 직접적인 방법이 있습니까?

+0

경우, 요구 사항이 추가 지정 대상을 만들 수 없습니다. 라이브러리 나 실행 파일의 경우 소스 파일 목록에 파일을 추가하여 파일에 대한 종속성을 지정할 수 있습니다. – Tsyvarev

+0

1. add_custom_command (TARGET $ {PROJECT_NAME} POST_BUILD ....)는 어떻게됩니까? 2. COMMAND $ {CMAKE_COMMAND} -E를 사용하는 것을 선호합니다. 불행히도 고양이 concat가 없습니다. 3. FILE (READ ...) FILE (WRITE) cf를 사용할 수 있습니다. [cmake 메일 링리스트의이 게시물] (https://cmake.org/pipermail/cmake/2010-July/038028.html) –

답변

0

Tsyvarev으로 지적하면, 생성 설정 파일을 대상 소스 목록에 추가하기 만하면됩니다.

즉, 대체 :

add_custom_target(generate-config DEPENDS ${xsd_config}) 
add_dependencies(${PROJECT_NAME} generate-config) 

을 단지로 : 다른 사용자 지정 명령 또는 사용자 정의 목표 설정 파일에 따라

target_sources(${PROJECT_NAME} ${xsd_config})