2012-10-16 3 views
5

많은 서브 프로젝트가있는 CMake 프로젝트가 있습니다. 각각은 (add_custom_command를 호출하여) 특정 정보가있는 작은 텍스트 파일을 생성하기 위해 제공하는 함수를 사용할 수 있습니다. 마지막 단계에서 모든 파일을 하나의 큰 텍스트 파일로 결합하고 싶습니다.CMake : add_custom_command에 대한 종속성을 동적으로 추가하십시오.

생성 된 파일 (한 곳에서)을 검색하고 병합하는 사용자 지정 명령을 만들었습니다.

문제는이 최종 단계가 실제로 얼마나 많은 파일이 제공 될지 알지 못하는 동안 하위 프로젝트에서 만들어진 모든 작은 단계에 의존하게하고 싶다는 것입니다.

내 마지막 명령을 보이는 같은 :

add_custom_command(OUTPUT combination.txt 
        COMMAND create combination.txt from all files from /path/) 

내 생성 - 작은 텍스트 파일에 대한-각-하위 프로젝트 명령은 다음과 같습니다

add_custom_command(OUTPUT /path/${sub_project_name}.txt 
        COMMAND create /path/${sub_project_name}.txt) 

와 나는 그 작은 파일을 만들 때 "combination.txt"를 /path/${sub_project_name}.txt에 의존하도록하고 싶습니다.

그래서 저는 다음과 같이 할 수 있습니다.

add_dependency(combination.txt /path/${sub_project_name}.txt) 

그러나 이것은 타겟에서만 작동합니다.

또한 OBJECT_DEPENDS와 set_source_files_properties을 사용하려했지만, (어쩌면 그 add_target의 CPP 파일을 사용하려는?)

마지막 방법으로 얻을 그것이 내가이 볼 일을 할 작동하지 않는 것 같다 모든 작은 파일 경로를 누적하는 캐시 변수를 사용하고 다음과 같이 사용하십시오.

add_custom_command(OUTPUT combination.txt 
        COMMAND create combination.txt from all files from /path/ 
        DEPENDS ${all_small_files_list}) 

그러나 이것은 내가하고 싶은 마지막 것입니다.

답변

4

add_custom_command을 사용하는 대신 올바른 종속성 정의가있는 add_custom_target을 사용할 수 있습니다. (따라서 항상 빌드되지는 않습니다.)

add_custom_target(project 
        COMMAND touch project.txt) 

add_custom_target(project2 
        COMMAND touch project2.txt) 

add_custom_target(combination 
        COMMAND cat project.txt project2.txt > combination.txt) 

add_dependencies(combination project2) 
add_dependencies(combination project) 

add_executable(t t.c) 
add_dependencies(t combination.txt) 

다시 : 프로젝트 대상 따라서 조합 대상이 오래된 얻을 수 있도록 실제 의존성 체인을 만들 add_custom_targetDEPENDS 인수를 사용하고 있는지 확인하십시오.

업데이트 : 너무 성급했습니다. 실제로 cmake (적어도 2.8.9까지)는 종속성에 대해 다음과 같이 작동합니다. add_dependencies을 호출하면 IOW (생성 된) 파일의 사용자 정의 명령 OUTPUT 인 종속성을 추가 할 수 없습니다. add_dependencies을 사용하면 add_custom_target으로 작성된 target 만 추가 할 수 있습니다. 그러나 add_custom_target의 경우 DEPENDS 지시문을 사용하여 add_custom_command의 출력을 사용할 수 있습니다. 즉이 작동하게 말했다 :

add_custom_command(OUTPUT project.txt 
        COMMAND uptime >> project.txt MAIN_DEPENDENCY t2.c) 
add_custom_target(project DEPENDS project.txt) 

add_custom_target(combination 
        COMMAND cat project.txt project2.txt > combination.txt) 
add_dependencies(combination project) 

이 조합의 목표는 항상 더 MAIN_DEPENDENCY 또는 DEPENDS이 없습니다로 재생 될 수 있지만, add_dependencies의 사용이 허용되어 있는지 확인합니다.

+0

정상적으로 작동하지만 예상대로 작동하지 않습니다. make를 호출 할 때마다 모든 대상 (조합, 프로젝트 및 프로젝트 2)이 다시 빌드되므로 파일이 다시 생성됩니다. 이것은 가능한만큼 좋지 않습니다.) 나를 위해 예상되는 동작은 필요하지 않으면 파일을 다시 생성하지 않는 것입니다. CMake의 docs에 따르면 - add_custom_target은 매번 빌드됩니다. add_custom_command로 작동하는 솔루션을 갖고 싶습니다. 종속성이 변경 될 때만 빌드됩니다. –

+0

project.txt를 생성하기 위해 종속성으로 무엇을 사용합니까? 나는 cmake-doc이 말하고자하는 바는 custom_target이 재 빌드되어야하는지 아닌지를 항상 확인한다는 것입니다. 적어도 저처럼 작동하는 것 같습니다. –

+0

글쎄, 우리가 어떻게하는지에 대해 제대로 읽은 후에, 나는 너무 조숙하다는 것을 인정해야한다. 내 대답 업데이트를 참조하십시오. –

관련 문제