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

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

코드 분석 도구 소개

코드 분석 도구는 코드의 잠재적인 버그, 메모리 누수, 스타일 문제 등을 찾아내어 소프트웨어의 품질을 향상시키는 데 도움을 줍니다. 대표적인 코드 분석 도구로는 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를 활용하여 코드 분석 도구와 포매터를 빌드 시스템에 통합하는 방법에 대해 알아보았습니다. 이러한 도구들을 효과적으로 사용하면 코드의 품질을 높이고 일관된 스타일을 유지할 수 있으며, 개발 생산성을 향상시킬 수 있습니다.

반응형