2014-11-13 4 views
5

아무도 cmake 변수 나 후크 또는 실행되는 기본 플랫폼 이름/맛 이름을 줄 수있는 것을 알고 있습니까? 예 : 리눅스 - 센토 리눅스 - 우분투 리눅스 - SLESCmake에서 기본 플랫폼/맛을 감지하십시오.

나는 cmake가 "CMAKE_SYSTEM"변수를 가지고 있지만 리눅스의 맛을 차별화하는데 도움이되지 않는다는 것을 알고있다. 어떤 도움을 주셔서 감사합니다.

편집 : 방금 ​​읽은 명령은 lsb_release 명령을 사용하여 읽을 수 있습니까?

답변

3

아마도이 테스트는 직접 작성해야합니다. 다음은 가능한 예 중 하나입니다. go googled : https://htcondor-wiki.cs.wisc.edu/index.cgi/fileview?f=build/cmake/FindLinuxPlatform.cmake&v=4592599fecc08e5588c4244e2b0ceb7d32363a56

그러나 실제 필요에 따라 테스트가 상당히 복잡 할 수 있습니다. 예를 들어 데비안 기반 OS 인 우분투는 항상 /etc/debian_version이고 많은 RPM 기반 OS는 전통적으로 /etc/redhat-release을 가지고 있습니다. 이 리눅스 표준베이스 (LSB) 사양의 파일 /etc/os-release는하지만 로컬 호스트에 예를 들어이 파일은 알 수 알 수없는 이유로 :

+0

그래, 문제는 꽤 복잡하고 수동으로 변수를 설정하려고 생각하지만 단지 거기에 어떤 해결책이 있는지보고 싶었습니다. – tejas

+0

글쎄, 위에서 제시 한 가능한 구현 중 하나. 수세 기반의 경우'/ etc/SuSE-release'를 볼 수도 있습니다. 또 다른 가능한 해결책은 "주요 맛"(예 :'RPM','DEB' 또는''기반의 패키지 관리자를 호출하고 [여기] (http://unix.stackexchange.com/questions/37336/how-to-detect-sles-version)에서 설명한대로 특정 패키지를 찾습니다. – user3159253

+0

'/ etc/os-release'는 최소한 모든 시스템 기반 배포판에서 작동 할 것입니다. – mattdm

1

내 컴퓨터에

CMAKE_SYSTEM_INFO_FILE == "Platform/Linux" 
CMAKE_SYSTEM_NAME == "Linux" 
CMAKE_SYSTEM == "Linux-<kernel version>" 

cmake --system-information 얻을 비어 있습니다 그 사람들이 자신의 CMakeLists.txt 파일에서 매크로를 사용하여 예상대로 작동하기 때문에 아마도 CMAKE_SYSTEM_NAME이 실제로 원하는 것이지만 여기에 가면이 3과 명령을 통해 cmake까지 기계의 속성을 검사 할 수 있습니다.

+0

유감스럽게도 리눅스 커널 버전은 일반적으로 특정 리눅스 설치의 가장 중요한 특징입니다. 기술적으로 나는 고대 커널을 설정할 수 있습니다 글쎄요, 그렇다면 LIBC를 다운 그레이드하거나 특별히 컴파일해야 할 필요가 있습니다 ... 글쎄요, 일부 "핵심 소프트웨어"가 있습니다. – user3159253

+0

@ user3159253 그 이유는 내가 명령을 추가했기 때문입니다. 소프트웨어 컴파일 – user2485710

0

아니요. 2015 년 현재, CMake는 우분투에서 실행 중인지 여부도 알 수 없습니다.

CMake는 쓰레기 절차 적 플랫폼 별 빌드 사양을 쓰는 데 표준 언어를 사용했지만 내 의견으로는 그 이상의 모든 목표에서 실패했습니다. 우분투는 ~ 자체를 제대로 꾸밀 수 없습니다. 일부 가난한 관리자는 분명히 그것을 손으로하고 있습니다.

2

파일 시스템에서 파일을 검사하는 것보다 약간 덜 복잡한 것은 사용 가능한 CMAKE_SYSTEM 변수에서 가능한 최선을 추론하는 것입니다. 이 같은 예를 들어 CMakeLists.txt 파일을 포함하는 라인 :

message("-- CMAKE_SYSTEM_INFO_FILE: ${CMAKE_SYSTEM_INFO_FILE}") 
message("-- CMAKE_SYSTEM_NAME:  ${CMAKE_SYSTEM_NAME}") 
message("-- CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") 
message("-- CMAKE_SYSTEM:   ${CMAKE_SYSTEM}") 

string (REGEX MATCH "\\.el[1-9]" os_version_suffix ${CMAKE_SYSTEM}) 
message("-- os_version_suffix:  ${os_version_suffix}") 

출력이 내가 cmake .을 실행할 때 :

-- CMAKE_SYSTEM_INFO_FILE: Platform/Linux 
-- CMAKE_SYSTEM_NAME:  Linux 
-- CMAKE_SYSTEM_PROCESSOR: x86_64 
-- CMAKE_SYSTEM:   Linux-2.6.32-573.7.1.el6.x86_64 
-- os_version_suffix:  .el6 

그리고 내 상황은 .el6은 차별화에 충분했다.

10

다음 코드는 기본 리눅스 시스템에 대한 정보와 함께 LSB_RELEASE_ID_SHORT cmake 변수를 채 웁니다

find_program(LSB_RELEASE lsb_release) 
execute_process(COMMAND ${LSB_RELEASE} -is 
    OUTPUT_VARIABLE LSB_RELEASE_ID_SHORT 
    OUTPUT_STRIP_TRAILING_WHITESPACE 
) 

우분투에, 예를 들어, Ubuntu를 얻을 수 있습니다.

execute_process(COMMAND lsb_release -cs 
    OUTPUT_VARIABLE RELEASE_CODENAME 
    OUTPUT_STRIP_TRAILING_WHITESPACE 
) 

일예를 : 당신은 (가능한 경우) 배포판의 코드 명을 얻고 싶은 경우에