2010-02-01 2 views
0

임베디드 시스템 프로젝트를위한 SConstruct 파일을 디자인하려고합니다. 내 컴퓨터의 컴파일러는 "C : ₩ Program Files ₩ IAR Systems ₩ Embedded Workbench 5.4 ₩ arm ₩ bin"에 있습니다. "임베디드 워크 벤치의 다른 버전이 설치되어 있어도 빌드 시스템에서 도구 체인을 찾으려고합니다. 사용자가 다른 곳에 설치하도록 선택했습니다.버전 번호가있는 경로에서 컴파일러를 찾는 방법은 무엇입니까?

메이크 파일이나 개미 파일에 사용되는 전략에 관심이 있습니다. 아마도 여기에서도 유용 할 것이기 때문입니다.

이 작업을 수행하기위한 전략은 무엇입니까? Windows 레지스트리를 검색하거나 "C : ₩ Program Files ₩ IAR Systems ₩ Embedded Workbench * ₩ arm ₩ bin"을 찾는 것 이외의 옵션이 있습니까?

+1

PATH에있는 설치를 찾으십니까? 또는 컴퓨터의 어느 곳에서나 설치를 원하십니까? – Dingo

+0

나는 그것이 기계에서 어디서나 설치를 원한다. 나는 마술이라고 알고 있으며, 내가 원하는만큼 잘 작동하지 않는다. 대부분 나는 이런 식으로 접근하는 방법에 대한 조언을 찾고 있습니다. –

답변

2

가장 쉬운 해결 방법은 환경 변수를 사용하는 것입니다. 각 빌드 호스트마다 수동으로 설정해야하지만 빌드 시스템은 환경 변수 만 참조해야하므로 모든 빌드 호스트에 공통적으로 적용될 수 있습니다. 다음 다른 버전의 유사한

설치 및

귀하의 경우 예를 들어, 당신은 할 수 있습니다 :

EWBARM_V0504 = "프로그램 파일 \ IAR 시스템 \ 임베디드 워크 벤치 5.4 \ 암 \ 빈은 \ C" 빌드 시스템에서는 경로 대신 % EWBARM_V0504 %를 사용합니다. 변수가 존재하지 않는다면 빌드가 실패하고 잘못된 컴파일러를 사용하는 것이 바람직하며 쉽게 수정 될 수 있습니다.

0

서로 다른 버전의 툴체인이 서로 다른 버그 및/또는 기능을 가질 수 있으므로 자동으로 다른 툴 세트로 떨어지는 것이 좋습니다. 단일 프로젝트에서 여러 도구 버전을 지원할 때 대개 메이크 파일이나 환경을 통해 할당 된 버전 번호가 있습니다. 그런 다음 -D TOOLS_VERSION=$(TOOLS_VERSION)을 컴파일러에 전달하고 해당 값을 사용하여 특정 버전의 도구에 필요한 주요 버그 수정 및 해결 방법을 사용할 수 있습니다. 이 시스템을 사용하면 어떤 도구를 지원할 것인지 명확히 알 수있을뿐만 아니라 다른 개발자가 한 번의 편집으로 도구 버전을 쉽게 전환 할 수 있습니다.

+0

아마도 기존 프로젝트를 지원하는 경우라면 원래 도구를 사용하는 것이 일반적입니다. 컴파일러를 변경하면 모듈에서 수락 테스트까지 전체 프로젝트의 유효성을 다시 검사해야하기 때문일 수 있습니다. 이는 팀 또는 프로젝트 정책이나 안전 또는 제약 또는 계약상의 요구 사항 일 수 있으며, 현장에서의 끔찍한 놀라움을 피하는 것만으로도 실용적 일 수 있습니다. 예를 들어, 코드베이스에는 잠복 버그가있을 수 있습니다.이 버그는 한 컴파일러에서 작동하지만 다른 코드로 노출됩니다. 전체 시스템의 유효성을 다시 확인하지 않으면 알 수 없습니다. – Clifford

+0

제가 생각하기에 그것은 정확하게 요점입니다. –

0

SCons에 대한 좋은 점은 당신이 처분 할 수있는 모든 파이썬을 가지고 있다는 것입니다. 따라서 win32.winreg를 사용하여 레지스트리를 살펴 보거나 경로 집합을 둘러 볼 수 있습니다. 물론 명령 줄 옵션이나 옵션 파일을 사용하여 자동 검색을 무시할 수 있습니다. 그런 다음 선택 도구를 찾으면 기본적으로 SCons에서 사용하는 두 가지 방법이 있습니다. 도구의 디렉토리를 env [ENV] [ 'PATH'] 앞에 추가하거나 (env.PrependEnvPath를 사용할 수 있음) 또는 도구의 전체 경로를 $ CC의 값으로 사용하십시오 (그리고 $ LINK, $ SHLINK 등을 적절하게 설정하십시오).

나는 보통 TOOL_MYCOMPILER 함수를 만들어 env를 취하여 컴파일러와 그 toolchain (cpp, linker, 뭐든간에)에서 사용할 수 있도록 설정한다. 그것은 당신의 SConstruct/SConscript에서 더 깨끗한 것을 유지합니다.