[Linux Kernel] 개발 환경 설정하기

문연수·2024년 7월 19일
0

Linux Kernels

목록 보기
1/5

 리눅스 커널 개발 환경 설정에 관련해서는 필자가 이전부터 여러 포스트에 거쳐 그 내용을 기술했으나 통합된 자료가 없어서 이참에 하나로 모아서 정리해보려 한다.

1. 리눅스 커널 다운로드

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

리눅스 커널의 소스코드는 다음의 링크에 접속해서 이하에 적힌 세 가지 주소를 git clone 해서 다운로드 받을 수 있다. 어떤 주소를 사용하던 상관없다.

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

그 밖의 커널 저장소는 다음의 링크에 접속해서 확인해볼 수 있다:
https://kernel.googlesource.com

- 개발 브랜치 추가하기

git remote add netdev/net https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
git remote add netdev/net-next https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/

git remote update

git checkout --track -b net netdev/net/main
git checkout --track -b net-next netdev/net-next/main

 여러 디렉토리에서 서로 다른 저장소를 다운 받아서 관리하면 용량도 크고 관리도 복잡하기 때문에 필자는 이를 하나의 디렉토리 안에서 관리하기 위해 remote branchlocal branch 를 동기화하여 사용한다.

2. ctags & cscope 생성하기

make tags cscope

코드 탐색을 위해 ctagscscope 을 생성한다. 꽤 오래 걸리는 작업이니 잠깐 기다린다.

3. 커널 빌드하기

- 요구사항 패키지 확인하기

https://www.kernel.org/doc/html/latest/process/changes.html

커널 빌드에 필요한 패키지는 위에서 확인하면 된다.

- 빌드 옵션

 여러가지가 있는데 주로 사용하는 옵션은 menuconfig, defconfig 정도이다. 추가적으로 모든 설정은 yes 로 만드는 allyesconfig 을 통해 드라이버나 모듈까지 싹 다 빌드하여 built-in 할 수도 있다.

defconfig 을 사용하면 arch/<ARCH>/configs 하위에 있는 미리 정의된 설정을 사용한다. 여기에서 ARCH 를 지정하지 않으면 현재 시스템의 설정으로 빌드한다.

make O=../build/current defconfig

- 빌드하기

make O=../build/current -j$(nproc)

 빌드할 때에 -j 옵션을 부여하여 병렬로 빌드를 수행할 수 있다. 또한 빌드한 오브젝트 파일이 코드와 섞이게 되면 코드 탐색이 불편하므로 따로 빼서 빌드하는게 좋다.

- 드라이버만 빌드하기

make drivers/staging/rtl8712/
make M=drivers/staging/rtl8712/ # 모듈(.ko)로 빌드하기

- 크로스 컴파일

make ARCH=arm64 defconfig O=../build/ARM64
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

4. compiler_commands.json 생성하기

 만일 LSP 를 사용하고 있다면 compiler_commands.json 파일을 생성해야 한다. bear 를 통해 생성하면 하루 온종일 걸리므로 실제론 이 방법 대신에 스크립트를 실행해서 생성하게 된다. 빌드를 먼저하고 빌드 디렉토리에 대해 실행할 수 있다.

./scripts/clang-tools/gen_compile_commands.py -d ../build/current/

 만일 clanggcc 컴파일 옵션 차이로 인해서 경고가 발생한다면 다음과 같은 설정 파일을 생성해서 clangd 가 무시하게 만들 수 있다:

# .clangd 파일 생성 후,
touch .clangd
# 파일에 다음의 내용을 복사해 넣는다.
CompileFlags:
  Remove: [-fconserve-stack, -fno-allow-store-data-races, -mfunction-return=thunk-extern, -mindirect-branch-cs-prefix, -mindirect-branch-register, -mindirect-branch=thunk-extern, -mskip-rax-setup, -mpreferred-stack-boundary=3, -mno-fp-ret-in-387]

5. 패치 메일

sudo dnf install git-email

 패치 메일 전송을 위해서는 git-email 을 설치해야 한다. 설치 후에는 다음과 같이 SMTP 메일 서버 config 을 잡아 주어야 한다.

git config --global sendemail.smtpencryption <protocol>
git config --global sendemail.smtpserverport <port>
git config --global sendemail.smptserver <mailserver>
git config --global sendemail.smtpuser <email>
git config --global sendemail.smtppass <password>

 또한 리눅스 커널 커밋으로 올라갈 유저명은 반드시 실명이어야 하기 때문에 커널 디렉토리 내에서 config 을 한번 더 잡아주는 것이 좋다:

git config user.name <실명>
profile
2000.11.30

0개의 댓글