目的
clang-formatを用いて C++ソースコードを整形しようとした場合、clang-foramt コマンド単体ではプロジェクタ内のフォルダを再帰的に検索して特定フォルダかつ特定拡張子のファイルを見つける、といったことができない。
そのためには bash におけるfind
といった、ファイル検索用のコマンドを使用すればいい。しかし こうした汎用的なツールを用いた具体的なコマンドを毎回検索・作成するのは面倒であり、また特に以下の要件を満たす例を紹介しているページが見つからなかったため、ここに記録する。
- 特定のサブフォルダ、特定の拡張子名のファイルのみを検索し、clang-format に渡す
- Windows と Linux の両方でのケースを検討する。
- シェル上で実行可能(ワンライナー)
参考文献
-
clang-format と find を組み合わせた例は、以下のページを参考にした。
https://stackoverflow.com/questions/28896909/how-to-call-clang-format-over-a-cpp-project-folder -
本記事では参照できていないが、bash における clang-format を再帰的に実行するスクリプトの例。
https://github.com/eklitzke/clang-format-all
解決策
bash, powershell, cmd のそれぞれで、以下に記載する特定のフォルダ内の、特定の拡張子のファイルに対して、clang-format (dry-run オプション付き)を実行するコマンドを記載する。
- 対象フォルダ名:src, test, include
- 対象拡張子名:cpp, hpp, h, cc, cxx
bash(Linux)
find src test include -regex '.*\.\(cpp\|hpp\|h\)' -exec clang-format -style=file --dry-run --Werror -i {} \;
powershell(Windows)
clang-format -style=file --dry-run --Werror $(Get-ChildItem -Path $PWD/src,$PWD/test,$PWD/include -Recurse | Where Name -Match '.(?:cpp|hpp|h)$' | Select-Object -ExpandProperty FullName)
cmd(Windows)
コマンドプロンプトのみ、複数フォルダを同時に検索する方法は見つからなかった。
for /r .\src %a in (*.cpp *hpp *.h) do clang-format -style=file --dry-run --Werror %a
今後の改善点
- (bash): xargs を使用する。
- (Windows): WSL で実行できるならば、bash のコマンドを使用する。
- (bash):
-prune -o
の書き方を使用し、特定ディレクトリを除外できるようにする。