LoginSignup
0
0

More than 1 year has passed since last update.

Uncrustifyを使ってObjCコードを整形する

Last updated at Posted at 2023-03-07

はじめに

本稿ではUncrustifyを使用してObjective-Cコードを整形するために、 uncrustify コマンドのビルド方法や基本的なコマンドの使い方に触れています。

Uncrustifyとは

Uncrustifyとは、ソースコード整形ツールの一つです。公式サイトによると、Objective-Cだけでなく、C, C++, C#, D, Java, Pawn, Valaに対応しているようです。

コード整形ツールを活用することで、改行やインデントなどを定めたルール(コーディング規約)を適用し、ソースコードの品質を保つことができます。

実行環境

macOSのバージョン

sw_vers
ProductName:		macOS
ProductVersion:		13.1
BuildVersion:		22C65

Uncrustifyのビルド

1. ソースコードのダウンロード

git clone https://github.com/uncrustify/uncrustify.git
cd uncrustify
# バージョンを指定したい場合はtagをチェックアウト
git checkout uncrustify-0.76.0

2. ビルド

cmakeのバージョン

cmake --version
cmake version 3.25.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

cmake 3.19.4+を使うことで、arm64とx86_64両対応のUniversal Binaryをビルドできます。
参考: https://qiita.com/mktshhr/items/c8048b328af6be90f68e

make

クローンしたuncrustifyのソースコードのルートディレクトリで以下のコマンドを実行します。

mkdir build
cd build
cmake -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_BUILD_TYPE=Release ..
make

ビルドに成功すると、buildディレクトリ内に uncrustify コマンドが生成されています。

3. uncrustifyコマンドにPATHを通す

ビルドに成功した uncrustify コマンドを適当なところに格納し、PATHを通します。

PATHが正しく通っていれば、以下のコマンドでUncrustifyのバージョンを確認できます。

uncrustify --version
Uncrustify-0.76.0_f

コード整形ルールの設定

コード整形ルールは以下のようなKey-Valueを羅列した形式で設定します。
本稿ではuncrustify-objc.cfgというファイル名で保存しています。

uncrustify-objc.cfg
indent_with_tabs    = 0
output_tab_size     = 4
indent_columns      = output_tab_size
indent_label        = 2
indent_align_assign = FALSE

設定できるルールは、以下の記事が非常に参考になります。

ObjCコードの整形

ターミナルで実行

コマンドを実行するディレクトリには以下のファイルがあるものとします。

- uncrustify-objc.cfg
- SampleFile.h
- SampleFile.m

コマンド実行例を以下に示します。以下の例はSampleFile.mファイルのソースコードを整形します。

uncrustify -c uncrustify-objc.cfg -l OC SampleFile.m

コード整形結果はSampleFile.m.uncrustifyファイルに出力されます。SampleFile.mファイル自体に変更はありません。 -l OC はプログラミング言語にObjCを指定しています。

uncrustify -c uncrustify-objc.cfg -l OC --no-backup SampleFile.m

--no-backup オプションを付けると、SampleFile.mファイル自体にコード整形を適用し更新します。

find + xargs + uncrustifyを組み合わせて一括整形

uncrustify -c uncrustify-objc.cfg -l OC --no-backup ./**/*.m

ワイルドカードを使えば一括で整形することができます。ただ、これだとPodsディレクトリ内のソースコードまで整形してしまったりと、少々使い勝手が悪い時があります。

そこで、僕は find + xargs コマンドと組み合わせて使っています。
以下のようなShellスクリプトを用意します。

uncrustify.sh
#!/bin/bash

find . \
-type d -name "*.framework" -prune \
-a -type d -not -name "*.framework" \
-o -type d -name "*.xcframework" -prune \
-a -type d -not -name "*.xcframework" \
-o -type d -name "Pods" -prune \
-a -type d -not -name "Pods" \
-o -type d -name "Carthage" -prune \
-a -type d -not -name "Carthage" \
-o -type d -name "build" -prune \
-a -type d -not -name "build" \
-o -name "*.m" \
-o -name "*.h" \
| xargs uncrustify -c uncrustify-objc.cfg -l OC --no-backup

上記のスクリプト例では、*.framework, *.xcframework, Pods, buildディレクトリを除外しつつ、すべての.hファイルと.mファイルにコード整形を適用し更新します。 find コマンドのオプションは適宜調整してください。

uncrustify.shに実行権限を与えます。

chmod +x uncrustify.sh

このuncrusitfy.shをプロジェクトのルートディレクトリに置いて実行します。

このスクリプトは、ソースコード一式に破壊的な変更を加えるため、実行前に一度コミットしておくことをお奨めします。

./uncrustify.sh

以上でObjective-Cのソースコードを一括で整形することができます。

自動コード整形環境の構築

ここまででコマンドを手動実行することで、コード整形ができるようになりました。しかし、このような手順は自動化したいところです。

次回はUncrustifyを応用して、自動でコード整形が走るようにする仕組みを作ります。

次回: 「uncrustify + husky + lint-stagedでObjCコードをコミット時に自動整形する」

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0