리눅스 커널 개발 환경 설정에 관련해서는 필자가 이전부터 여러 포스트에 거쳐 그 내용을 기술했으나 통합된 자료가 없어서 이참에 하나로 모아서 정리해보려 한다.
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 branch
와 local branch
를 동기화하여 사용한다.
make tags cscope
코드 탐색을 위해 ctags
와 cscope
을 생성한다. 꽤 오래 걸리는 작업이니 잠깐 기다린다.
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)
만일 LSP
를 사용하고 있다면 compiler_commands.json
파일을 생성해야 한다. bear
를 통해 생성하면 하루 온종일 걸리므로 실제론 이 방법 대신에 스크립트를 실행해서 생성하게 된다. 빌드를 먼저하고 빌드 디렉토리에 대해 실행할 수 있다.
./scripts/clang-tools/gen_compile_commands.py -d ../build/current/
만일 clang
와 gcc
컴파일 옵션 차이로 인해서 경고가 발생한다면 다음과 같은 설정 파일을 생성해서 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]
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 <실명>