CMakeを使用してQt5アプリケーションを作成する

この記事はCMakeの基本的な使い方をある程度把握しており、
CMakeを使用してQtアプリケーション作成したい人を対象としています。
今回はQt5.6、CMake3.5を使用しました。

## プロジェクト名とアプリのバージョンを設定する
```
cmake_minimum_required(VERSION 3.0)
project(MinimalQtApp VERSION 0.0.1)
```
`cmake_minimum_required()`で`CMake`のバージョンを指定します。
`project()`で作成するアプリ名とバージョンを指定します。
`CMake3.0`から`VERSION *.*.*`と書くことでバージョンナンバーを指定できるようになりました。

## QTDIRを指定する
```
set(QTDIR $ENV{QTDIR})
set(CMAKE_PREFIX_PATH ${QTDIR})
```
後に登場しますが`find_package(Qt5...)`という構文で自動でQtライブラリをサーチすることができます。
この`find_package(Qt5...)`という構文でライブラリをサーチするためには、`QTDIR`にQtライブラリのルートディレクトリを設定する必要がありますのでここでセットしておきます。
`QTDIR`はシステムの環境変数に登録しておくかプロジェクトの環境変数として登録しておくのが良いでしょう。

## Qtライブラリをプロジェクトに追加する
```
find_package(Qt5Widgets REQUIRED)
︙
target_link_libraries(${PROJECT_NAME} Qt5::Widgets)
```
Qtライブラリをプロジェクトに追加するには`find_package()`でQtライブラリを探してきて`target_link_libraries()`を使用してアプリケーションにリンクします。
上記の例では`Widgets`しか指定していませんが、`Widgets`の依存している`Core`や`Gui`も自動でリンク対象になります。

## uiファイルを処理する
```
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
︙
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_BINARY_DIR})

qt5_wrap_ui(UI_HEADERS ${UI_SOURCES})
```
GUIアプリケーションを作成する際には多くの場合`.ui`を用いてレイアウトを作成することになると思います。
CMakeには`qt5_wrap_ui()`という`.ui`ファイルをコンパイル可能なヘッダに変換してくれる便利な関数がありますのでこれを利用します。
この関数を利用するには`CMAKE_INCLUDE_CURRENT_DIR`と`CMAKE_AUTOMOC`を`ON`に設定します。
ヘッダファイルはビルドディレクトリに出力されますので`${CMAKE_CURRENT_SOURCE_DIR}`と`${CMAKE_CURRENT_BINARY_DIR}`をインクルードディレクトリに追加してあげることで、生成されたヘッダファイルをプロジェクトが見つけることができるようになります。

## アイコンを同梱する
```
if(WIN32)
set(APP_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icon.rc)
elseif(APPLE)
set(MACOSX_BUNDLE_ICON icon.icns)
set(APP_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icon.icns)
set_source_files_properties(${APP_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
endif()

if(WIN32)
set(APP_BUNDLE WIN32)
elseif(APPLE)
set(APP_BUNDLE MACOSX_BUNDLE)
endif()

add_executable(${PROJECT_NAME} ${APP_BUNDLE} ${APP_ICON} ${SOURCES} ${HEADERS} ${UI_HEADERS})

if(APPLE)
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/AppleInfo.plist)
endif()
```
Windowsの場合はバンドルタイプを`WIN32`に指定し、用意した`.ico``.rc`ファイルの`.rc`ファイルの方をアプリケーションに追加することでアイコンを登録できます。
Macの場合はバンドルタイプを指定しアイコンをアプリケーションに追加するところまではWindowsと同じですが、それプラス`AppleInfo.plist`を作成して`set_target_properties()`でアプリケーションに登録する必要があります。
この設定ファイルはCMake同梱のものがありますのでそちらを参考に作成すると良いでしょう。

## HiDPI対応する(Macのみ)
```
<key>NSHighResolutionCapable</key>
<true/>
```
Macの場合はHiDPI対応も視野に入れる必要があります。
HiDPIに対応するためには前述の`AppleInfo.plist`に`NSHighResolutionCapable true`を追加してあげるとことでHiDPIモードでアプリが起動するようになります。
Qt5.5までのバージョンではそれプラス`QApplication`に明示的に`Qt::AA_UseHighDpiPixmaps`を指定する必要がありました。

## パッケージをデプロイする
```
【Windows】
windeployqt.exe MinimalQtApp.exe

【Mac】
macdeployqt MinimalQtApp.app
```
Qt同梱の`windeployqt`や`macdeployqt`などのコマンドを使用すると依存ライブラリを実行ファイルのあるディレクトリまでコピーしてくれます。
但し`windeployqt`はQtライブラリ以外の依存関係は解決してくれませんので、Qt以外のライブラリは自分でコピーすることになります。
`macdeployqt`も依存関係が解決できない場合がありますのでその場合は`install_name_tool`を使用して自分で依存関係を解決する必要があります。

今回はハマりそうな部分だけを書きましたが、
[こちら](https://github.com/buresu/MinimalQtApp)にサンプルプロジェクトが置いてありますのでご参考にどうぞ！

それでは素敵なQtライフを！

## 追記

### uiファイルの処理について （2016年3月31日）

CMake3.0から`CMAKE_AUTOUIC`を`ON`にして`.ui`ファイルを`add_executable()`に渡すと`qt5_wrap_ui()`を使用せずとも自動でヘッダファイルを作成してくれるようです。

```
cmake_minimum_required(VERSION 3.0)
︙
set(CMAKE_AUTOUIC ON)
︙
add_executable(${PROJECT_NAME} ${APP_BUNDLE} ${APP_ICON} ${SOURCES} ${HEADERS} ${UI_SOURCES})
```
shibukawaさん情報ありがとうございました！