본문 바로가기

Linux Kernel

리눅스 커널에 커밋 해보자

반응형

리눅스 커널에 커밋해보자!

리눅스 커널에 커밋한다는 건 정말 멋진 일이다. 하지만 나는 아직 쪼렙이기 때문에 커널의 중요한 파트에 기여할 수는 없다. 하지만 리눅스 커널에 커밋하기 위해서 항상 엄청난 일을 해야하는 건 아니다. 대신 나는 아주 작고 귀여운, 코딩 스타일 고치기를 해보기로 했다. 코딩 스타일을 점검해주는 checkpatch.pl 스크립트의 warning을 고쳐보자. 

 

우선 git 저장소를 클론한다.

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

 

drivers/staging 폴더에는 TODO 파일이 있는데, 코딩 스타일을 고쳐야 할 경우에는 "fix checkpatch.pll warning"이라고 보통 쓰여있다. 그런 파일들을 한 번 찾아보자.

cd drivers/staging
cat */TODO | grep "checkpatch"

명령어를 실행해보니 drivers/staging/rtl8723bs/TODO에 checkpatch를 고칠 것이 많아서 커밋을 작성하고 email을 보내봤다.  그리고 3분만에 Greg-KH bot에게 reject 당했다.

너의 패치는 잘못되었다 - from Greg KH bot

요약하면 내용은 다음과 같다.

- 1. 한 patch는 한 가지 일만 해야한다. 디렉토리의 모든 코딩 스타일을 고치는 등의 행위는 review를 힘들게 만든다.

- 2. Signed-off-by line을 명시하지 않았다.

- 3. 실제 이름으로 이메일을 보내야 한다 (닉네임 X)

 

나는 위에 있는걸 셋다 어겼다 ㅋㅋㅋ 그래서 youtube에서 Greg-KH 아저씨가 patch 작성법을 설명한 동영상이 있어서 듣고 다시 작성해본다.

checkpatch.pl

커밋을 하기 전에 먼저 고유의 브랜치를 만들어주자. 이름은 중요하지 않다.

git checkout -b fix_braces

그리고 drivers/staging/rtl8723bs로 이동해서 checkpatch.pl을 돌려보자. checkpatch.pl은 scripts 폴더에 있다. 나는 이 폴더를 PATH에 추가해뒀다.

checkpatch.pl --file --terse core/rtw_cmd.c

warning이 정말 많이 뜨는데, 한번에 여러개를 고쳤다가 reject 당했으므로 "braces {} are not necessary for any arm of this statement" 오류만 고쳐보자.

checkpatch.pl --file --terse core/rtw_cmd.c | grep "braces"

실제로 오류가 뜬 line을 보면 다음과 같이 if에 single line임에도 불구하고 괄호를 쓴다. 이건 linux kernel codingstyle에서 벗어나므로 고쳐주자. 리눅스 코딩스타일은 www.kernel.org/doc/html/v4.10/process/coding-style.html에 나와있다.

잘못된 코딩 스타일

compile

커밋 하기 전에 컴파일이 되는지 확인해본다. 커널을 컴파일하려면 config를 설정해야하는데, 아직 커널 컴파일 하는법을 자세히 모르므로... make allyesconfig를 해주고 빌드해보자.

 

make allyesconfig
make drivers/staging/rtl8723bs/core/rtw_cmd.o

다행히 잘 컴파일이 되었다!

commit

git add core/rtw_cmd.c
git commit

지금 보니까 영어가 좀 이상한데, 받아줄지 모르겠다 ㅋㅋㅋ 일단 커밋을 했으면 patch를 만들자.

git format-patch master..fix_braces

patch가 생겼다! 이제 이걸 email로 보내보자. 근데 email을 누구한테 보내나? 이것도 scripts에 get_maintainer.pl이라는 스크립트가 있어서 관련된 maintainer들을 볼 수 있다. 그런데 난 그냥 영상 따라서 Greg KH 아저씨한테 보내봤다.

get_maintainer 예시

그런데 이메일을 보내려면 apt-get install git-email을 깔고, 메일 설정을 먼저 해주어야 한다. 나는 Gmail 기준으로 설명을 작성해보겠다.

git config --global sendemail.smtpserver smtp.gmail.com
git config --global sendemail.smtpencryption tls 
git config --global sendemail.smtpserverport 587 
git config --global sendemail.smtpuser 42.hyeyoo@gmail.com

그리고 google은 안전하지 않은 클라이언트에서 접속하는걸 기본적으로 허용하지 않으므로, myaccount.google.com/lesssecureapps에서 허용해주어야 로그인이 된다.

git send-email --to gregkh@linuxfoundation.org --cc devel@driverdev.osuosl.org 0001-Staging-rtl8723bs-fixed-a-brace-coding-style.patch

그리고 비밀번호를 입력해주면 패치를 이메일로 보내게 된다!

제 인내의 시간이다.. 나의 작고 귀여운 패치가 승인될 때까지 기다려보자.

Accepted!

우와 내 patch가 accept되었다! 메일 보낸지 반나절도 안됐는데, 생각보다 빨리됐다.

참고 링크

 

Submitting patches: the essential guide to getting your code into the kernel — The Linux Kernel documentation

For a person or company who wishes to submit a change to the Linux kernel, the process can sometimes be daunting if you’re not familiar with “the system.” This text is a collection of suggestions which can greatly increase the chances of your change

www.kernel.org

 

[번역] Beginner Guide to Linux Kernel Hacking

Beginner Guide to Linux Kernel Hacking 막상 kernel 에 관련된 책도 보고 어떻게 개발에 참여할 수 있는지 고민만 많이 하지 딱히 문제가 있는 부분을 찾는 것도 수정하는 것도 어렵다.(다 잘되어 있는 code

woodz.tistory.com

 

linux kernel 개발에 참여해보자!!

오랫만에 패치 작업을 하려니 처음부터 모두 설정해가며 작업을 하게되었다. 삽질에 삽질을 거듭해서 결국에는 어찌어찌 패치를 커밋까지는 했는데, 그냥 있으면 또 잊어먹을 테니 이 참에 한

chlrbgh0.tistory.com