diff --git a/Dockerfile.devtools b/Dockerfile.devtools new file mode 100644 index 0000000..d501db0 --- /dev/null +++ b/Dockerfile.devtools @@ -0,0 +1,14 @@ +# mus +FROM alpine:3.20 + +# 必要なツールをインストール +RUN apk add --no-cache \ + doxygen \ + graphviz \ + cppcheck \ + clang-extra-tools # clang-tidy を含む + +# 作業ディレクトリを設定 +WORKDIR /work + +ENTRYPOINT [] \ No newline at end of file diff --git a/Dockerfile.doxygen b/Dockerfile.doxygen deleted file mode 100644 index 49fb86b..0000000 --- a/Dockerfile.doxygen +++ /dev/null @@ -1,11 +0,0 @@ -# mus -FROM alpine:3.20 - -# 必要なツールをインストール -RUN apk add --no-cache \ - doxygen \ - graphviz - -WORKDIR /work - -CMD ["doxygen", "Doxyfile"] \ No newline at end of file diff --git a/readme/develop.md b/readme/develop.md index 11073c7..be0ef75 100644 --- a/readme/develop.md +++ b/readme/develop.md @@ -2,10 +2,15 @@ - [C/C++の開発環境](#ccの開発環境) - [Linter](#linter) + - [導入方法](#導入方法) + - [Dockerを活用する](#dockerを活用する) + - [Linterの使い方](#linterの使い方) + - [clang-tidy の使い方(C++向け)](#clang-tidy-の使い方c向け) + - [ccppcheck の使い方(C / C++ 両対応)](#ccppcheck-の使い方c--c-両対応) - [テスト](#テスト) - [Doc(ドキュメンテーション)](#docドキュメンテーション) - [環境構築](#環境構築) - - [Dockerを活用する](#dockerを活用する) + - [Dockerを活用する](#dockerを活用する-1) - [doxygen 使い方](#doxygen-使い方) - [CI / CDによる実行](#ci--cdによる実行) - [Doxyfileの設定](#doxyfileの設定) @@ -14,7 +19,121 @@ ## Linter -TODO: TBD +ライブラリの候補 +* **clang-tidy** + * 精度はかなり高い + * C++向け(Cはカバー範囲が狭い) +* **cppcheck** + * C/C++ 両方対応・軽量 + * 導入が簡単にできる + +### 導入方法 + +**Macの場合** + +```sh +brew install cppcheck llvm +# パスの追加が必要 +export PATH="/opt/homebrew/opt/llvm/bin:$PATH" +clang-tidy --version +cppcheck --version +``` + +* llvm: clang-tidy は llvm に含まれています + +**Linux(Ubuntu)の場合** + +```sh +sudo apt install cppcheck clang-tidy +clang-tidy --version +cppcheck --version +``` + +#### Dockerを活用する + +[Dockerfileはこちら](../Dockerfile.devtools) + +Dockerイメージをビルドする + +```sh +docker build -f Dockerfile.devtools -t c-dev-tools . +``` + +```sh +# docker run --rm -v "$(pwd)":/work -w /work c-dev-tools <コマンド> +``` + +### Linterの使い方 + +#### clang-tidy の使い方(C++向け) + +**単一ファイルをチェックする例** + +```sh +clang-tidy src/cpp/hello.cpp -- -Iinclude -std=c++17 +# Docker +docker run --rm -v "$(pwd)":/work -w /work clang-tidy src/cpp/hello.cpp -- -Iinclude -std=c++17 +``` + +* `--`以降がコンパイラフラグ(g++に渡すものと同じ) +* -Iinclude : ヘッダファイルのパス +* -std=c++17 : 使用している C++ のバージョン + +**チェック内容を絞る使い方** + +```sh +clang-tidy src/cpp/hello.cpp \ + -checks='modernize-*,bugprone-*,readability-*' \ + -- -Iinclude -std=c++17 +``` + +よく使うチェックカテゴリ: +* bugprone-* : バグにつながるコード +* modernize-* : モダンC++スタイルへの改善提案 +* readability-* : 可読性の改善 + +**プロジェクト全体** + +CMake + compile_commands.jsonがある場合に以下の内容でできます +(clang-tidy は「コンパイル情報」がないと正しく解析できない) +compile_commands.jsonについては別途解説します。 + +```sh +mkdir -p build +cd build +cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .. + +# プロジェクト全体に対して実行 +run-clang-tidy -p build +``` + +#### ccppcheck の使い方(C / C++ 両対応) + +cppcheckはコンパイル不要で実行できる静的解析ツールです。 +CでもC++でも同じコマンドで使えます。 + +**基本的な使い方** + +```sh +cppcheck src/ +# Docker +docker run --rm -v "$(pwd)":/work -w /work c-dev-tools cppcheck src/ +``` + +**チェックレベルを広げる(おすすめ)** + +```sh +cppcheck --enable=warning,style,performance,portability src/ +# Docker +docker run --rm -v "$(pwd)":/work -w /work c-dev-tools \ +cppcheck --enable=warning,style,performance,portability src/ +``` + +* warning : 危険なコードやバグの可能性 +* style : コーディングスタイル上の問題 +* performance : 非効率なコード +* portability : 環境依存のコード + ## テスト @@ -47,28 +166,25 @@ sudo apt install doxygen graphviz #### Dockerを活用する -[Dockerfileはこちら](../Dockerfile.doxygen) +[Dockerfileはこちら](../Dockerfile.devtools) Dockerイメージをビルドする ```sh -docker build -f Dockerfile.doxygen -t dev-doxygen . +docker build -f Dockerfile.devtools -t c-dev-tools . ``` Linuxでコマンドを実行する - ```sh mkdir -p docs -# docker run --rm -v "$(pwd)":/work -w /work/docs dev-doxygen <コマンド> +# docker run --rm -v "$(pwd)":/work -w /work/docs c-dev-tools <コマンド> # 初期化コマンド -docker run --rm -v "$(pwd)":/work -w /work/docs dev-doxygen doxygen -g +docker run --rm -v "$(pwd)":/work -w /work/docs c-dev-tools doxygen -g # ドキュメントを生成する -docker run --rm -v "$(pwd)":/work -w /work/docs dev-doxygen doxygen Doxyfile +docker run --rm -v "$(pwd)":/work -w /work/docs c-dev-tools doxygen Doxyfile ``` - - ### doxygen 使い方 **設定ファイルを生成** diff --git a/src/cpp/hello.cpp b/src/cpp/hello.cpp index 0edf2ec..20d6dae 100644 --- a/src/cpp/hello.cpp +++ b/src/cpp/hello.cpp @@ -4,6 +4,10 @@ // run: ./dist/hello #include +/** +* @brief Main function +* @return int Exit status + */ int main() { std::cout << "Hello, world!" << std::endl; return 0;