DXライブラリをCMakeと併用する方法

# 概要

DXライブラリをCMakeと併用する方法の一つを紹介します。
ここではCMakeの機能を使ってビルド時にDXライブラリをダウンロードしてリンクする方法を紹介します。

GitHubに実際のリポジトリ例を上げてあるので、そちらも併せて参照してください。
→ [ishioka0222/dxlib-with-cmake
](https://github.com/ishioka0222/dxlib-with-cmake)

他にも、DXライブラリをCMakeと併用する方法には以下のような方法がありますが、これらの方法はここでは紹介しません。
- DXライブラリをあらかじめリポジトリ外にダウンロードしておき、CMakeLists.txtにその絶対パスをハードコーディングしてリンクする。
    - メリット：複数のリポジトリで同じDXライブラリを共用できるため、PCの容量を節約できる。
    - デメリット：ソースコードをGitHubで公開した際に、それをcloneしてビルドするためにはあらかじめ指定された場所にDXライブラリをダウンロードする必要がある。
- DXライブラリをあらかじめリポジトリ内にダウンロードしておき、Gitの監視対象に含め、CMakeLists.txtにその相対パスを記述してリンクする。
    - メリット：DXライブラリの更新された場合でもビルドが安定して行える。
    - デメリット：DXライブラリは容量が大きいので、Gitリポジトリの容量を圧迫してしまう。


# 動作を確認した環境

- Windows 10
- Visual Studio 2022（ビルドはコマンドラインもしくはVisual Studio Codeから行いますが、コンパイルにVisual Studio Build Toolsが必要になります ）
- Visual Studio Code
- DXライブラリ 3.23
- CMake 3.22.2

# 手順

以下のようなディレクトリ構成でファイルを作成していきます。

```
dxlib-with-cmake/
|-- CMakeLists.txt     ... 1
`---src/
    |-- CMakeLists.txt ... 2
    `-- main.cpp       ... 3
```

## 1. `dxlib-with-cmake/CMakeLists.txt`

`dxlib-with-cmake`ディレクトリ直下の`CMakeLists.txt`には以下のような内容を記述します。
`#`から始まる行はコメントです。

```cmake
# CMakeのバージョンを指定します
# ここは利用しているCMakeのバージョンによって適当な値に変更しても問題ありません
cmake_minimum_required(VERSION 3.22)

# プロジェクト名を設定
project(my-dxlib-project)

# DXLIB_DIRという名前の変数を設定します
# ここではDXLIB_DIRという変数にdxlib-with-cmake/dxlib/のパスが入ります
set(DXLIB_DIR ${CMAKE_SOURCE_DIR}/dxlib)

# 上で設定したDXLIB_DIRのパス、すなわちdxlib-with-cmake/dxlib/に
# DXライブラリをダウンロードして展開します
# https://dxlib.xsrv.jp/DxLib/DxLibNoneModel_NoneSoftDrawCode_VC_3_23.zipの部分で
# DXライブラリのURLを指定しています
# DXライブラリが更新されるたびにこのURLは修正する必要があります
# DXライブラリのURLは https://dxlib.xsrv.jp/dxdload.html で確認できます
# ここでは、DXライブラリの「３Ｄモデル機能＆ソフトウエアレンダリング機能無しパッケージ」を使用しています。
include(ExternalProject)
ExternalProject_Add(DxLibDownload
  URL https://dxlib.xsrv.jp/DxLib/DxLibNoneModel_NoneSoftDrawCode_VC_3_23.zip
  SOURCE_DIR ${DXLIB_DIR}
  CONFIGURE_COMMAND ""
  BUILD_COMMAND ""
  INSTALL_COMMAND ""
)

# `src`ディレクトリをCMakeのビルド対象に追加します
add_subdirectory("./src")
```

CMakeは`ExternalProject_Add`で追加した外部のプロジェクトを自動でconfigure, build, installする機能があるようですが、DXライブラリはビルド済みなので、その機能をオフにするために`CONFIGURE_COMMAND ""`のようなオプションを記述してデフォルトの値を上書きしています。

## 2. `dxlib-with-cmake/src/CMakeLists.txt`

`src`ディレクトリ直下の`CMakeLists.txt`には以下のような内容を記述します。

```cmake
add_executable(main "main.cpp")

# 以下でDXライブラリをinclude, linkします
# 注意：この例ではDXライブラリの「３Ｄモデル機能＆ソフトウエアレンダリング機能無しパッケージ」を使用していますが、
# 通常の「ＤＸライブラリ Windows版」を使用する場合にはおそらく以下の部分を修正する必要があります
target_include_directories(main PRIVATE ${DXLIB_DIR})
target_link_directories(main PRIVATE ${DXLIB_DIR})
add_dependencies(main DxLibDownload)
```

## 3. `dxlib-with-cmake/src/main.cpp`

`src`ディレクトリ直下の`main.cpp`には以下のような内容を記述します。
ここでは例として`Hello, world!`と表示するだけのプログラムを記述します。

```cpp
// 以下の行がないとコンパイルが通りません
#pragma comment(linker, "/subsystem:windows")

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
  ChangeWindowMode(true);

  if (DxLib_Init() == -1) {
    return -1;
  }

  printfDx("Hello, world!\n");

  WaitKey();

  DxLib_End();

  return 0;
}
```

## 4. 実行

この状態で、`dxlib-with-cmake`ディレクトリの下でコマンドプロンプトを立ち上げ、以下のコマンドを実行するとDXライブラリが自動でダウンロードされ、ビルドが行われます。
回線が遅いとダウンロードに時間がかかるので注意してください。

```sh
cmake -S . -B "build"
cmake --build "build"
```