[모던 CMake] 코드 분석 도구와 포매터 통합

모던 CMake를 활용하여 효율적인 C++ 프로젝트 빌드 시스템을 구축하는 방법을 계속해서 알아보겠습니다. 이번 글에서는 코드의 품질을 높이고 일관된 스타일을 유지하기 위해 코드 분석 도구코드 포매터를 CMake에 통합하는 방법에 대해 다루겠습니다.

etc-image-0

코드 분석 도구 소개

코드 분석 도구는 코드의 잠재적인 버그, 메모리 누수, 스타일 문제 등을 찾아내어 소프트웨어의 품질을 향상시키는 데 도움을 줍니다. 대표적인 코드 분석 도구로는 Clang-Tidy, Cppcheck, SonarQube 등이 있습니다.

Clang-Tidy

  • Clang-Tidy는 Clang 컴파일러 인프라를 기반으로 하는 소스 코드 분석 도구로, 코드의 버그 패턴, 스타일 문제 등을 찾아냅니다.
  • 다양한 체크 옵션을 제공하며, 사용자 정의 체크를 작성할 수도 있습니다.

Cppcheck

  • Cppcheck는 C/C++ 코드에 대한 정적 분석 도구로, 메모리 누수, NULL 포인터 역참조 등의 문제를 찾아냅니다.
  • 컴파일러에 독립적이며, 다양한 플랫폼에서 사용 가능합니다.

코드 포매터 소개

코드 포매터는 소스 코드를 일관된 스타일로 자동 정렬해주는 도구입니다. 대표적으로 Clang-Format이 있습니다.

Clang-Format

  • Clang-Format은 Clang 프로젝트의 일부로, C/C++ 코드의 스타일을 자동으로 정렬합니다.
  • 다양한 스타일 옵션을 제공하며, 프로젝트에 맞는 스타일을 설정할 수 있습니다.

CMake와 코드 분석 도구 통합

CMake를 사용하여 코드 분석 도구를 빌드 프로세스에 통합함으로써, 빌드 시 자동으로 코드 검사를 수행할 수 있습니다.

Clang-Tidy 통합

CMake 설정

CMake에서는 CMAKE_CXX_CLANG_TIDY 변수를 설정하여 Clang-Tidy를 통합할 수 있습니다.

# Clang-Tidy 설정
set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-checks=*")
  • clang-tidy 실행 파일과 옵션을 지정합니다.
  • -checks=*는 모든 체크를 활성화한다는 의미입니다.

특정 타겟에만 적용

특정 타겟에만 Clang-Tidy를 적용하려면 target_compile_options()를 사용합니다.

target_compile_options(MyApp PRIVATE
    -Xclang -add-plugin -Xclang clang-tidy
)

Cppcheck 통합

CMake 설정

Cppcheck는 컴파일러가 아니므로, add_custom_target()을 사용하여 별도의 검사 타겟을 생성합니다.

# 모든 소스 파일 목록
file(GLOB_RECURSE ALL_SOURCE_FILES ${CMAKE_SOURCE_DIR}/src/*.cpp)

# Cppcheck 타겟 생성
add_custom_target(cppcheck
    COMMAND cppcheck --enable=all --inconclusive --quiet ${ALL_SOURCE_FILES}
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    COMMENT "Running Cppcheck..."
)
  • file(GLOB_RECURSE ...)를 사용하여 모든 소스 파일을 가져옵니다.
  • cppcheck 명령어를 실행하는 커스텀 타겟을 생성합니다.

CMake와 코드 포매터 통합

빌드 과정에서 코드 포매터를 실행하여 일관된 코드 스타일을 유지할 수 있습니다.

Clang-Format 통합

CMake 설정

# 포맷 대상 소스 파일 목록
file(GLOB_RECURSE ALL_SOURCE_FILES ${CMAKE_SOURCE_DIR}/src/*.cpp ${CMAKE_SOURCE_DIR}/include/*.h)

# Clang-Format 타겟 생성
add_custom_target(format
    COMMAND clang-format -i ${ALL_SOURCE_FILES}
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    COMMENT "Running Clang-Format..."
)
  • clang-format 명령어를 실행하여 소스 파일을 포맷팅합니다.
  • -i 옵션은 파일을 직접 수정한다는 의미입니다.

Git Hooks와 연동

코드 포매터를 개발 워크플로우에 통합하기 위해 Git Hooks를 사용할 수 있습니다.

  • pre-commit 훅을 사용하여 커밋 전에 자동으로 clang-format을 실행합니다.
  • .git/hooks/pre-commit 파일을 생성하고 아래 내용을 추가합니다.
#!/bin/sh
clang-format -i $(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(cpp|h)$')
  • 스크립트에 실행 권한을 부여합니다.
chmod +x .git/hooks/pre-commit

CI/CD 파이프라인에서 코드 분석 도구 사용

CI/CD 환경에서 코드 분석 도구를 실행하여 코드 품질을 지속적으로 관리할 수 있습니다.

GitHub Actions에서 Clang-Tidy 실행

.github/workflows/ci.yml

name: Build and Analyze

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-analyze:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - name: Set up CMake
      uses: lukka/get-cmake@v3

    - name: Install Clang-Tidy
      run: sudo apt-get install -y clang-tidy

    - name: Build with Clang-Tidy
      run: |
        cmake -B build -S . -DCMAKE_CXX_CLANG_TIDY="clang-tidy;-checks=*"
        cmake --build build
  • CI 환경에서 Clang-Tidy를 설치하고 빌드 시 실행합니다.
  • 코드 분석 결과를 CI 로그에서 확인할 수 있습니다.

분석 결과를 파일로 저장

Clang-Tidy의 결과를 파일로 저장하여 CI에서 아티팩트로 업로드하거나 분석할 수 있습니다.

set(CMAKE_CXX_CLANG_TIDY
    "clang-tidy;-checks=*;-export-fixes=${CMAKE_BINARY_DIR}/clang-tidy-fixes.yaml"
)
  • -export-fixes 옵션을 사용하여 수정 제안을 YAML 파일로 저장합니다.

IDE와 통합

코드 분석 도구와 포매터를 IDE와 통합하여 개발 시 실시간으로 피드백을 받을 수 있습니다.

Visual Studio Code

  • Clang-Tidy: C/C++ Advanced Lint 확장 기능을 설치하여 Clang-Tidy 분석 결과를 코드 편집기에 표시합니다.
  • Clang-Format: Clang-Format 확장 기능을 설치하여 코드 저장 시 자동으로 포맷팅합니다.

CLion

  • Clang-Tidy: 기본적으로 Clang-Tidy를 지원하며, 설정에서 활성화할 수 있습니다.
  • Clang-Format: 코드 스타일 설정에서 Clang-Format을 선택하여 사용할 수 있습니다.

예제 프로젝트 적용

최상위 CMakeLists.txt 업데이트

cmake_minimum_required(VERSION 3.15)
project(MyProject VERSION 1.0.0)

add_subdirectory(src)

# Clang-Tidy 설정
find_program(CLANG_TIDY_EXE NAMES "clang-tidy")
if(CLANG_TIDY_EXE)
    set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_EXE};-checks=*")
endif()

# Clang-Format 타겟 생성
file(GLOB_RECURSE ALL_SOURCE_FILES ${CMAKE_SOURCE_DIR}/src/*.cpp ${CMAKE_SOURCE_DIR}/include/*.h)
add_custom_target(format
    COMMAND clang-format -i ${ALL_SOURCE_FILES}
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    COMMENT "Running Clang-Format..."
)

# Cppcheck 타겟 생성
add_custom_target(cppcheck
    COMMAND cppcheck --enable=all --inconclusive --quiet ${ALL_SOURCE_FILES}
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    COMMENT "Running Cppcheck..."
)
  • Clang-Tidy를 빌드 과정에 통합하고, Clang-Format과 Cppcheck 타겟을 생성합니다.

사용 방법

  • Clang-Format 실행:
  • cmake --build build --target format
  • Cppcheck 실행:
  • cmake --build build --target cppcheck
  • 빌드 시 Clang-Tidy 실행:
  • cmake -B build -S . cmake --build build

코드 품질 향상의 효과

코드 분석 도구와 포매터를 빌드 시스템에 통합함으로써 다음과 같은 이점을 얻을 수 있습니다.

  • 버그 조기 발견: 코드 작성 시점이나 빌드 시점에 잠재적인 버그를 발견하여 수정할 수 있습니다.
  • 코드 스타일 일관성 유지: 자동 포매팅을 통해 팀 내에서 일관된 코드 스타일을 유지할 수 있습니다.
  • 코드 리뷰 효율성 향상: 스타일 문제나 간단한 버그는 도구로 자동 검출되므로, 코드 리뷰에서는 로직과 설계에 집중할 수 있습니다.
  • 개발 생산성 향상: 개발자가 코드 품질에 대한 부담을 덜고 핵심 로직 구현에 집중할 수 있습니다.

결론

이번 글에서는 CMake를 활용하여 코드 분석 도구와 포매터를 빌드 시스템에 통합하는 방법에 대해 알아보았습니다. 이러한 도구들을 효과적으로 사용하면 코드의 품질을 높이고 일관된 스타일을 유지할 수 있으며, 개발 생산성을 향상시킬 수 있습니다.

반응형