Raspberry Pi로 컴파일하고 있음을 어떻게 알 수 있습니까?


24

Raspberry Pi는 C/C++일부 하드웨어 기능 (예 :에 대한 호출)에 액세스하기 위해 약간의 특수 코드가 필요합니다 bcm_host_init(). 나는 이것을 자동으로 감지하는 안정적이고 우아한 방법을 찾고 있습니다. 나는 어떤 컴파일러 있다고 생각하지 않습니다 #defines같은 _WIN32그래서에서의 검출, 내가 남용 할 수는 CMake충분 (쉘 스크립트를 실행할 수있는). 또한 모든 배포판이 아니라면 대부분 작동하는 방법을 원합니다.

내가 생각할 수있는 한 가지 방법은 /opt/vc/include/bcm_host.h파일 ( 예 : 어렵지 않음)을 찾고 아키텍처가 ARM인지 확인하는 것입니다 ( #define예 : __arm__에 대한 매크로 가 있으므로 컴파일 타임에 쉽습니다 __ARMEL__). 이 추가 아치 검사는 다른 컴퓨터에서 크로스 컴파일 환경이 있지만 현재 크로스 컴파일되지 않은 경우 위양성을 방지하기위한 것입니다. 이것보다 다른 더 좋은 방법이 있습니까?

답변:


20

코드가 의존 하는 기능 의 구성 / 컴파일 시간을 확인 하는 것이 좋습니다. 가양를 피하는 것은 (누군가가 의도적으로도 약간의 노력과 거짓말 수) 사실상 불가능하기 때문에 특정 장치를 검사하는 것은 문제가 수표의 목표는 질문에 대답하는 것입니다 ? "나는 '예'인 경우 어떤 코드 경로가해야 여기에 구축 할 수 있습니다 사용하고 있습니까? " 하지 "이의 이름과 같은 장치 I입니까?"


이 참조 (일반적으로 사전 정의 된 매크로에 대한 훌륭한 정보 출처)에 따르면 매크로를 사용할 수 있습니다.

__arm__

GCC / Arm 조합을 감지합니다.

나는 이것을 다음과 같이 확인했다.

#include <stdio.h>

int main() {
  #ifdef __arm__
  printf("Why yes it is, thank you\n");
  #endif
  return 0;
}

실제로 메시지를 인쇄했습니다.

이것은 또한 모든 Arm 장치를 포착 하므로 빌드 도구의 일부 (예 cmake/autoconf:)를 사용하여 존재 여부를 확인하는 것이 좋습니다 /opt/vc/include/bcm_host.h.

예를 들어

AC_CHECK_HEADERS
autoconf에서 :

AC_CHECK_HEADERS(/opt/vc/include/bcm_host.h)

원인 :

HAVE__OPT_VC_INCLUDE_BCM_HOST_H

config.h에 정의

또는 CMake의 경우 :

include(CheckIncludeFile)
CHECK_INCLUDE_FILE(/opt/vc/include/bcm_host.h BCMHOST)

실제로 이것을 감지하는 더 좋은 방법은 없다고 생각합니다. 하드웨어 관련 사항을 구성 / CMake 할 수는 있지만 동일한 SoC를 사용하는 다른 플랫폼이 있으므로 실제로 신뢰할 수는 없으며 실제로 관심있는 것 해당 헤더 파일의 존재는 주어진 대상에 대한 빌드 방법을 알려주기 때문입니다. 라즈베리 파이임을 증명할 수는 있지만 여전히 올바른 헤더 파일을 찾을 수 없으며 초기 오류는 미스 빌드보다 낫습니다.

정말로 Pi (또는 충분히 비슷한)인지 확인하려면 다음과 같은 간단한 방법을 사용할 수 있습니다.

grep -o BCM2708 /proc/cpuinfo

또는 (라즈베리 피 2와 3의 경우) :

grep -o BCM2709 /proc/cpuinfo

구성시 Raspberry Pi가 기반으로하는 SoC와 일치합니다.

몇 가지 더 많은 테스트를 던질 수 있습니다 (예 : USB는 조금 더 알아 내고 모델 A 또는 B 장치인지 암시하는 데 도움이 될 것입니다). 그러나 확실한 것은 충분하지 않습니다.

알려진 목록에 대해 / boot에있는 파일의 해시를 확인할 수는 있지만 모르는 비공식 펌웨어 업데이트 나 펌웨어 업데이트가 있으면 빌드 할 수 없습니다. (또는 동일한 부팅 설정을 가진 다른 유사한 비 Pi 장치)


아마도 내 생각에 대한 설명이 충분히 명확하지 않았지만 __ARMEL__정의 방법은 정확히 __arm__. 나는 단지 가장 좋은 매크로를 찾기 위해 귀찮게하지 않았다.
Tapio

나는 또한 파일을 찾는 것이 문제가 아님을 분명히하기 위해 아이디어 설명을 수정했다. 나는 제시 한 아이디어를 구현하는 방법이 아니라 다른 더 나은 방법을 찾고있다.
Tapio

@Tapio-이것이 올바른 문제라고 생각하지 않습니다. 헤더 파일이 없으면 정보가 쓸모 없다는 Pi임을 입증하더라도 Pi 관련 코드를 작성하는 데 필요합니다. BCM 비 Pi 장치를 찾더라도 Pi에 대해 작성한 코드는 동일한 SoC를 기반으로하는 경우 해당 코드에서 정상적으로 실행될 것입니다.
Flexo

네 말이 맞아 그 생각은 내 마음을 넘어갔지 만 나는 그것에 대해 충분히 생각하지 않았다. 어쨌든 편집 내용은 이것을 훌륭한 가치로 받아들입니다.
Tapio

2
확인 /opt/vc/include/bcm_host.h-파일이 (컴파일) 호스트 시스템의 해당 위치에 없을 때 크로스 컴파일에 어떻게 작동합니까? 마찬가지로 grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfo대상이 아닌 컴파일 호스트를 감지하려고합니까?
SlySven
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.