2014-05-11 2 views
0

2 개의 라이브러리 프로젝트 (B, C)에 따라 주 프로젝트 (A)가 있습니다.올바르게 외부 프로젝트에 대한 CMAKE 사용자 지정 명령을 설정하는 방법

─A 
├──src 
├──dep 
│ ├─B 
│ │ ├──include 
│ │ ├──src 
│ │ └──CMakeLists.txt[B] 
│ └─C 
│  ├──include 
│  ├──src 
│  └──CMakeLists.txt[C] 
└──CMakeLists.txt[A] 

a의 CMakeLists.txt이 같은 (단축)입니다 :

project(A) 

add_subdirectory(dep/B) 
include_directories(dep/B/include) 

add_subdirectory(dep/C) 
include_directories(dep/C/include) 

add_executable(A ...src/files...) 

target_link_libraries(A B) 
target_link_libraries(A C) 

B 또는 C 내가의 출력 디렉토리에 복사 출력 디렉토리를 가지고 싶습니다 내장하는 경우 업데이트 된 컴파일 된 라이브러리 (.lib 및 .dll 파일)를 찾을 수 있습니다.

이 내가 (CMakeLists.txt에서 [A])을 사용하여 뭘하려 :

add_custom_command(TARGET B POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy_directory 
     $<TARGET_FILE_DIR:B> 
     $<TARGET_FILE_DIR:A>) 

add_custom_command(TARGET C POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy_directory 
     $<TARGET_FILE_DIR:C> 
     $<TARGET_FILE_DIR:A>) 

그러나 분명히 실행되지 않습니다.

나는이 같은의 PRE_BUILD 단계에 복사를하고 시도 :

add_custom_command(TARGET A PRE_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy_directory 
     $<TARGET_FILE_DIR:B> 
     $<TARGET_FILE_DIR:A>) 

add_custom_command(TARGET A PRE_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy_directory 
     $<TARGET_FILE_DIR:C> 
     $<TARGET_FILE_DIR:A>) 

그것은 작동하지만, 내가 무엇 B 또는 C

작업 있어요 때마다 다시 컴파일해야 이것을 구성하는 올바른 방법은 무엇입니까?

+0

B와 C가 DLL 프로젝트입니다. Visual Studio 내에서 예를 들어 B를 편집하고 빌드 할 수 있지만 A의 출력 디렉토리에 새 DLL을 복사해야합니다. 그렇지 않으면 A는 이전 버전을 계속 사용합니다. –

답변

1

사용 RUNTIME_OUTPUT_DIRECTORY 대상 속성은 목표 대상을 변경하려면 다음

# file dep/B/CMakeLists.txt 
add_library(boo SHARED ...) 
set_target_properties(boo PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") 
+0

이것은 매우 좋은 해결책이며, 파일이 올바르게 업데이트되고 프로젝트간에 추가 종속성을 만들 필요가 없습니다. –

관련 문제