[dcc] 리눅스 커널(2.6) 분산컴파일 성공

Introduction/Histories | 2009. 12. 6. 21:39 | Posted by 알 수 없는 사용자
리눅스 커널은 그 부피 만큼이나 다양한 gcc 옵션들을 사용하고 있었다.
커널을 분산 컴파일 하는데 있어서 이슈가 된 것들은 다음과 같다.

문제  해결방법
 dcc를 실행함으로써 생성되는 '-Wframe-larger-than=1024' 옵션 인식 불가 (gcc 4.4 이상에서 인식 가능)  dcc 내부의 fork() 사용을 사전에 파악한 후 옵션을 추가 생성하는 것으로 보이며, 실질적인 컴파일이 아닌 메시지가 dcc를 통해 실행되면 fork()하지 않고 즉시 exec()함으로써 옵션이 생성되지 않도록 함
 dcc를 실행함으로써 생성되는 '-fno-strict-overflow' 옵션 인식 불가(gcc 4.4 이상에서 인식 가능)  dcc 내부의 fork() 사용을 사전에 파악한 후 옵션을 추가 생성하는 것으로 보이며, 실질적인 컴파일이 아닌 메시지가 dcc를 통해 실행되면 fork()하지 않고 즉시 exec()함으로써 옵션이 생성되지 않도록 함
 dcc를 실행함으로써 생성되는 '-fno-dwarf2-cfi-asm' 옵션 인식 불가(gcc 4.4 이상에서 인식 가능)  dcc 내부의 fork() 사용을 사전에 파악한 후 옵션을 추가 생성하는 것으로 보이며, 실질적인 컴파일이 아닌 메시지가 dcc를 통해 실행되면 fork()하지 않고 즉시 exec()함으로써 옵션이 생성되지 않도록 함
 소스파일이 일반적인 '*.c'의 형태가 아닌 '*.S'의 형태를 가짐으로써 agent 가 소스파일을 인식하지 못하고 get 하지 못하는 현상  CreateMsg, MsgParser를 통해 종속성 검사를 실시하면서 오브젝트리스트, 헤더리스트를 생성하던 부분에 소스리스트도 함께 작성하도록 추가 및 변경하고 agent에게 소스리스트도 함께 전달, agent는 전달 받은 소스리스트를 가지고 소스파일을 get 함
 '-Wp,-MD,kernel/.bounds.s.d' 옵션 내부의 '-MD'로 인한 종속성 분석 파악 불가  종속성 분석을 위한 메시지를 만들 때 '-W'로 시작하는 모든 옵션을 배제함
 '-Wp,-MD,kernel/.bounds.s.d' 옵션에 의해 추가로 생성되는 파일(.bounds.s.d)이 종속성 분석에서 배제됨으로써, 이러한 경우에 리모트 컴파일을 하게 되면 그 파일을 찾을 수 없게됨  '-Wp'  옵션은 뒤에 옵션리스트를 콤마를 사용하여 나열할 수 있다. 그리고 '-MD' 는 종속성을 분석하여 그 내용을 '*.d'의 형태로 생성하도록 하는 옵션인데, 단독으로 사용할 때가 있고 위와 같이 사용할 수도 있다. 단독으로 사용하게 되면 생성될 오브젝트파일 '*.o'로부터 파일 이름은 같게 하고 확장자만 바꾸어 '*.d'의 형태로 파일을 생성하게 되고, 위와 같이 사용하게 되면 '-MD,' 뒤에 선언한 이름으로 파일을 생성하게 된다. 그런데 커널 컴파일 시 거의 모든 gcc 커맨드라인에 위의 옵션이 붙어 있고 '*.o'와 '*.d'를 함께 생성하고 있다. agent가 '*.d'파일도 돌려 줄 수 있도록, 위와 같은 옵션을 분석하여 오브젝트리스트에 '*.d'도 포함하도록 하였다.
 '*.h'와 같은 헤더파일 뿐만이 아니라 '*.c'가 종속성이 걸려 있음으로써 agent가 무한대기하는 현상  CMIMEServerCallback 에서 들어온 파일에 대해 agent로 통지할 때 '.c', '.o', '.cpp'를 제외하고 통지하던 부분을 모든 파일에 대해 통지하도록 수정
 오브젝트 파일의 이름이 길어지면서 gui 모니터링 프로그램의 튕김 현상이 나타남  모니터링 프로그램 내부에서 변수가 메시지를 모두 담지 못하는 것으로 보인다. 잠정적으로 coordinator에서 메시지를 분할하여 보내도록 하였다.

 
: