2013-06-12 2 views
0

나는 CMake가 컴파일러에 다른 이름으로 include 디렉토리를 만들도록 지시하는 방법을 찾고있다.지도가 다른 디렉토리의 경로를 포함

내가 외국 도서관의 코드가 필요한 프로젝트가 있다고 가정 해 보겠습니다. 이 코드는 프로젝트의 루트 디렉토리 인 foreignLib-1.5.0_build123456 디렉토리에 있습니다. 때때로이 라이브러리를 업데이트하고이 과정에서 라이브러리 디렉토리 이름을 변경하려고합니다.

내 C++ 소스 파일에서이 디렉토리를 foreignLib로 참조하려고합니다. 나는

#include "foreignLib/include/lib.h" 

을 쓸 수 있기를 원하고 CMake 내가 궁금 이제

#include "foreignLib-1.5.0_build123456/include/lib.h" 

이 번역 내 컴파일러를 말해야한다 :

  • 이 기능이 CMake에 존재처럼합니까 ?
  • 예인 경우 어떻게 사용합니까?
  • 예인 경우 어떤 컴파일러가 지원됩니까?
+3

유닉스 계열 운영 체제를 사용하는 경우 파일 시스템에서 심볼릭 링크를 사용하여이 작업을 수행해야합니다. – arne

+0

이 프로젝트는 크로스 플랫폼을 목표로하므로 OS 종속 기능을 사용하는 것은 옵션이 아닙니다. 또한 이것은 git을 버전 제어로 사용하고 있으며 git이 심볼릭 링크를 저장할 수있는 것처럼 보이지 않습니다. http://stackoverflow.com/questions/954560/what-does-git-do-to-files-that-are- a-symbolic-link – Chris

+0

NTFS에는 Windows Vista 이후의 심볼릭 링크가 있습니다. –

답변

1

당신은 Cmake의 configure_file 살펴 수 : 당신의 CMakeLists에서

#include ${DIR_TO_LIB}/include/xy.h 

yourfile.cpp.in에 소스 파일의 이름을 변경하고 할, 당신은 발행

(명령 줄이나 뭔가를 구문 분석) 어떻게 든 변수 DIR_TO_LIB 설정
configure_file(yourfile.cpp.in, yourfile.cpp) 

올바른 경로가 설정된 yourfile.cpp이됩니다.

이것은 의도 한 것과 정확히 다를 수 있지만 작동한다고 생각합니다.

0

빌드 프로세스의 일부로 실제 포함 경로가있는 잘 알려진 위치 (나중에 "boilerplate/foreignLib_lib.h"라고 함)에 포함 파일을 생성합니다.

코드 파일 :

#include "boilerplate/foreignLib_lib.h" 

상용구/foreignLib_lib.h : 현재 foreignLib 경로를 추가하는

#include "foreignLib-1.5.0_build123456/include/lib.h" 
+0

처음에는 내 마음에 왔지만 다른 대답은 훨씬 더 우아합니다. –

0

사용 CMake의 include_directories 문 또는 *_CXX_FLAGS-I 스위치를 추가하여 경로를 포함 .

+0

사실 그것은 내가 생각한 것인데, 단지 파일이 들어있는 디렉토리 만 갖고 싶다는 것입니다. foreignLib-1.5.0_build123456 /'을 내 include 경로에 추가하면,'#include "include/lib.h"로 파일을 참조 하겠지만, 나는 그것을 원하지 않는다. 외부 lib 포함 파일은 다른 외부 lib 또는 프로젝트의 다른 파일을 잠재적으로 음영 처리해서는 안됩니다. – Chris

+0

그런 다음 또 다른 디렉토리 레벨을 추가해야합니다 :'foreignLib-1.5.0_build123456/foreignLib/include/lib.h' –

+0

네,하지만 foreign lib-1.5.0_build123456라는 이름으로 외부 lib의 tarball을 추출하지 않도록하는 것이 좋습니다. 그래서 나는 다음번에 그것을 대체 할 수 있습니다. 압축을 푼 후에 수행해야하는 추가 단계가 있다면 디렉토리 이름을 모두 변경하는 것이 좋겠지 만, 그렇게하고 싶지는 않습니다. – Chris

2

아마도 전체 빌드 디렉토리에 전체 include 디렉토리를 복사하여 사용 가능하게 만들 것입니다.

괜찮은 방법은 file(GLOB_RECURSE ...)을 사용하여 includes 폴더에있는 파일 목록을 수집 한 다음 configure_file(<input> <output> COPYONLY)을 사용하여 파일을 빌드 트리에 복사하는 것입니다.

configure_file을 사용하면 빌드 트리의 파일 만 필요에 따라 바뀝니다. 즉, CMake를 다시 실행해도 이러한 파일이 빌드 도구의 최신 버전으로 표시되지 않으므로 불필요한 재 컴파일을 피할 수 있습니다.

set(ForeignLibName foreignLib-1.5.0_build123456) 
set(ForeignLibRoot ${CMAKE_SOURCE_DIR}/${ForeignLibName}) 
file(GLOB_RECURSE IncludeFiles RELATIVE ${ForeignLibRoot} ${ForeignLibRoot}/*) 
foreach(IncludeFile ${IncludeFiles}) 
    configure_file(${ForeignLibRoot}/${IncludeFile} 
       ${CMAKE_BINARY_DIR}/${ForeignLibName}/foreignLib/${IncludeFile} 
       COPYONLY) 
endforeach() 

include_directories(${CMAKE_BINARY_DIR}/${ForeignLibName}) 

이 당신이 할 수 있도록해야합니다 : 당신이 외국 라이브러리를 업데이트 할 때 CMake의 다음를 재 - 실행되도록, 당신은 또한 CMakeLists.txt 업데이트되도록해야 할 것

#include "foreignLib/include/lib.h" 

시간은 당신이 지어갑니다. CMakeLists.txt를 업데이트하는 것은 단일 줄 set(ForeignLibName ...) 만 변경하면됩니다.

+0

+1 정말이 솔루션을 좋아합니다. – drescherjm

관련 문제