2016-06-06 3 views
4

아래의 간단한 CMake 스크립트를 사용해 가상의 theheader.h C 헤더 파일을 찾으십시오. 내가 아는 한, 이것은 FindXXX.cmake 모듈에있는 라이브러리의 include 디렉토리를 찾는 일반적인 방법입니다.CMake가 PATH에서 라이브러리를 찾지 못하도록 함.

PATH="/home/cschreib/someapp/bin:$PATH" 

이 밝혀 :

cmake_minimum_required(VERSION 2.6) 
project(test) 

find_path(
    TEST_INCLUDES 
    NAMES "theheader.h" 
) 

message(STATUS "TEST_INCLUDES: ${TEST_INCLUDES}") 

지금이 CMake 스크립트 관련이없는 방식으로, 내가 정의 bin 디렉토리를 포함하도록 내 PATH 환경 변수 (I 리눅스를 실행하는거야) 편집 한, 그 가정 디렉토리 /home/cschreib/someapp/include이 존재하고 theheader.h이라는 파일이 있습니다. 이 헤더는 someapp을 빌드하기 위해 로컬로만 사용되었지만 다른 프로그램에서 사용하도록 의도 된 것은 아닙니다 *.

CMake 3.3 이전에는 CMake에서이 사용자 지정 위치를 찾지 못했습니다. 그러나 버전 3.3부터 CMake는 똑똑 해지기 위해 $PATH의 모든 디렉토리에 대해 includebin으로 바꿉니다. 따라서 CMake 3.3 (이상)은이 사용자 지정 디렉터리에서 theheader.h을 찾습니다. 이것은 결코 의도 된 것이 아니기 때문에 헤더와 공유 객체 버전이 일치하지 않는 등 모든 종류의 문제가 발생합니다.

내가 에 NO_SYSTEM_ENVIRONMENT_PATH 옵션을 사용하여 $PATH을 보지 못하게 할 수 있지만이 문제에 대한 좀 더 일반적인 해결책을 찾고 있습니다. 사실이 문제는 모든 라이브러리에서 발생할 수 있습니다. 필자가 필요로하는 모든 FindXXX.cmake 모듈의 사본을 만들 수 있었고 체계적으로 NO_SYSTEM_ENVIRONMENT_PATH 옵션을 추가했지만, 나는 이것을 피하고 싶습니다.

이 원치 않는 기능을 끄는 데 사용할 수있는 글로벌 스위치가 있습니까? 아니면 다른 방법으로?

* : 누군가가 이에 대해 의견을 말하기 전에. 나는 이것이 좋은 습관이 아니라는 것을 알고있다. 또한 지역 사회에서 사람들은 선한 방법과 나쁜 방법을별로 신경 쓰지 않는 경향이 있다는 것을 알고 있습니다.이 상황은 매우 일반적입니다. 커뮤니티를 변경하지 않을 것이므로, CMake 스크립트를 나쁜 습관에 견뎌야합니다.

답변

3

이 동작은 CMake 버전 3.6이 설치된 비 Windows 플랫폼에서 다시 제거되었습니다.

이 문제가 발생하면 최신 CMake 버전을 업데이트하십시오. 3.6 릴리스 Deprecated and Removed Features 노트 버전을 참조하십시오 find_library(), find_path()find_file() 명령은 더 이상 비 Windows 플랫폼에서 PATH 환경 변수에서 파생 된 설치 접두사에서 검색되지

. 이 동작은 Windows 호스트를 지원하기 위해 CMake 3.3에 추가되었지만 UNIX 호스트에서는 문제가 있음이 입증되었습니다. 도구에 대해서만 <prefix>/bin 디렉터리를 PATH에 보관하는 사용자는 반드시 지원되는 <prefix>/lib 디렉터리를 검색 할 필요가 없습니다. 검색 할 접두사 목록을 사용하여 환경 변수를 설정할 수 있습니다.

+0

그들은 그것을 다시 바 꾸었습니다. 나는 그 때 업그레이 드를 위해 갈 것이다. 감사. – Kalith

1

제 생각에, 그런 스위치는 CMake 3.5에는 존재하지 않습니다. 나는이 문제를 해결하려고 노력하지 않을 것이다. CMake와 관련하여 해킹을하더라도 컴파일러 나 사용자를 혼란스럽게 만들 수 있기 때문이다.

헤더의 위치는 어디입니까? 헤더 중 하나를 변경하도록 요청할 수 있습니까? 일반적으로 프로젝트는 다른 라이브러리와 충돌하고 그러한 문제를 해결하려고하지 않으려합니다.

+0

FFTW는 배포판의 저장소를 통해 전 세계적으로 설치되었지만 컴파일해야하는 프로그램과 함께 제공되었습니다. 물론이 헤더는 더 이상 필요하지 않으므로 수동으로 제거 할 수 있습니다. 하지만 내 질문의 요점은 때로는 바람직하지 않고 항상 혼란 스러울 수있는 그러한 수동 개입을 피하는 것이 었습니다. 팁을 가져 주셔서 감사합니다! – Kalith

+0

방금 ​​떠날 수 있습니다. CMake는 하나의 버전을 찾고 이것을 사용합니다. 그러나 Florian은 올바른 방법으로 질문에 대답합니다. – usr1234567

관련 문제