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