2012-06-21 2 views
6

SCons 나는 직장에서 프로젝트를 구축하기 위해 GCC의 텍스트 출력을 분석하여 모든 컴파일러 경고에 대한 요약 보고서를 작성하려고합니다. 우리의 빌드 스크립트가 꽤 길고 콘솔에 많은 텍스트 출력이 있기 때문에 각 대상.SCons : gcc 텍스트 출력 저장/리다이렉트 (경고)

저는 Google과이 사이트를 꽤 오래 검색했으며이를 수행하기 위해 SCons에 내장 된 메소드를 찾을 수 없습니다. 나는 전체 stdout과 stderr 스트림을 this example마다 하나의 파일로 리다이 렉팅하려고했지만, SCons 자체의 출력 만 캡처되고 호출하는 도구의 출력은 캡처되지 않는다.

내 생각은 SCons가 GCC로 전송할 인수를 컴파일하고 인수 문자열 끝에 리디렉션을 추가하는 위치를 찾는 것입니다. 문서를 읽은 후, 컴파일 변수 CCCOMCXXCOM에는 컴파일에 사용 된 명령 행이 포함 된 것으로 보입니다. 그러나 SConstruct에 아래 줄을 추가했을 때 SCons가 실행중인 명령 줄에는 아무 것도 변경되지 않았습니다. 작품은 전체 SCons는 명령에서 표준 오류 스트림을 리디렉션 된 한

baseEnv['CCCOM'] += " 2> gcc-c-output.txt" 
baseEnv['CXXCOM'] += " 2> gcc-cxx-output.txt" 

한 가지 :

scons 2> stderr.txt 
나는 그러나, 이러한 문제를 방지하고, 가능하면 SCons는 내 모든 것을 포함하고 싶습니다

. 출력물이 반드시 파일로 갈 필요는 없습니다. 빌드 끝에 파일을 구문 분석하고 저장하기 위해 액세스 할 수있는 한 어디서나 저장할 수 있습니다.

나는 오랫동안 수색 한 결과 아무 것도 생각 나지 않아서 무엇을 시도해야할지 모르겠다. 나는 이처럼 뭔가를하고 싶었던 사람이 아니라는 것을 믿어야합니다.

답변

5

내가 잘못하고있는 것을 알아 냈으므로 여기서 내 자신의 질문에 대답 할 것입니다. CCCOMCXXCOM 변수는 수정해야 할 올바른 변수 였지만 공유 라이브러리 객체를 생성하는 문제 였으므로 이러한 변수는 사용되지 않았습니다. 내가 수정해야 할 것들은 SHCCCOMSHCXXCOM입니다. 나는이에 대한 많은 정보를 찾을 수 없습니다로

baseEnv['SHCCCOM'] += " 2> gcc-c-output.txt" 
baseEnv['SHCXXCOM'] += " 2> gcc-cxx-output.txt" 

는 희망이 답변이 다른 사람을 도움이 될 것입니다

다음 코드는 (경고 및 오류 만 stderr에 기록되어있다)를 GCC 경고 출력을 리디렉션을 위해 일을 가지고 주제를 검색 할 때

0

CCCOMCXXCOM 구성 변수 대신 CCCXX 변수를 사용해 보셨습니까? 경우에 따라 Here's 완전한 SCons 구성 변수 목록.

시스템에서 리디렉션을 내부적으로 수행하는 스크립트에 CCCXX을 설정하는 것도 고려할 수 있습니다.

편집 : CCCOMCXXCOM 변수는 실제로 소스 파일을 컴파일하는 데 사용되는 명령, 모든 CFlags 등을 잊어 버렸습니다. 읽기 전용이라고 생각해서 놀랍게도 설정할 수있었습니다. 변수.

+0

baseEnv['SHCCCOM'] += " 2> ${SOURCE}gcc-c-output.txt" baseEnv['SHCXXCOM'] += " 2> ${SOURCE}gcc-cxx-output.txt" 

이 당신에게 각 소스 파일에 대한 별도의 파일을 제공해야이 ... 수있는 명령이 실제로 어떤 컴파일하는 데 사용은 왜 그들은 좋은 후보자가 될 것이라고 생각했지만 SCons는 내 수정 사항을 무시하는 것 같습니다. 나는 심지어 값을 빈 문자열로 설정하려고 시도했지만, 여전히 괜찮 았습니다. 해결책을 찾고있는 동안 변수를 수정하는 방법을 언급했기 때문에 뭔가 옳지 않은 것 같습니다. GCC 실행 파일을 래핑하는 것에 대해서는 생각하지 않았습니다. 나는 더 많은 SConsy 대답을 기다리는 동안 그 옵션을 탐색 할 것입니다. – EarlCrapstone

+0

@EarlCrapstone, 임, 컴파일 된 각 cc 파일에 대해이 두 변수의 값이 변경 될 것입니다 (덮어 쓰임). 대신 CC와 CXX를 사용해보십시오. 실제로 차이가 있습니다. 다른 컴파일러를 지정하도록 수정했고 제대로 작동합니다. – Brady

+0

내가 뭘 잘못했는지 알았지 만, 내가 새로운 이래로 네 시간 만 더 내 자신의 질문에 대답하게하지 않을 것이다. @ 브래디 이러한 변수는 빌드 중에 실제로 변경되지 않습니다. 내 문제는 내가 공유 라이브러리 객체를 만들고 있었기 때문에 대신'SHCCCOM'과'SHCXXCOM'을 사용하고있었습니다. – EarlCrapstone

3

전체 제어의 경우 env['SPAWN'] 구성 변수를 무시할 수 있습니다. 그런 다음 인자로 주어진 명령 행을 실행하는 책임이있는 Python 메소드를 제공합니다.일반적으로이 인수를 사용하고 하위 프로세스 (어떤 형식으로 subprocess.Popen 사용)를 생성합니다. 이렇게하면 기본값 env['SPAWN']에 대한 통과 대체가 수행됩니다.

하지만 이제는 subprocess.Popen 호출을 완전히 제어 할 수 있습니다. STDOUT, STDERR 또는 둘 다 자유롭게 임의의 버퍼/파일로 리디렉션 할 수 있습니다. 콘솔에 인쇄하거나 파일로 저장하기 전에 출력에 대한 사후 처리를 수행 할 수도 있습니다. 예를 들어 노란색으로 경고를 표시하고 빨간색으로 오류를 표시하는 데이 기능을 사용했습니다.

env['SPAWN']을 무시하는 방법에 대한 샘플 코드는 SCons Wiki의 this page을 확인하십시오.

+0

SPAWN 메서드를 사용하면 명령 줄이 너무 길어지고 scons가 임시 파일을 사용하여 링크 단계를 수행 할 때 Windows에서 중단됩니다. :( – Nick

0

다음과 같이 사용하십시오. 에 대해 어떻게

baseEnv['CCCOM'][0] += " 2> gcc-c-output.txt"