Cmakeにて"The DOWNLOAD_EXTRACT_TIMESTAMP option was not given and policy CMP0135 is   not set."という警告が表示されたことについて

## はじめに
C++でテストコードを書きたく思い、[GoogleTest](url="https://github.com/google/googletest?tab=readme-ov-file")を導入することにしました。公式チュートリアル「[GoogleTestPrimer ](url="https://google.github.io/googletest/primer.html")」を取り組み始めました。

## 問題
チュートリアルのサンプルコードをCopy&Pasteした後、

```shell
$ cmake -S . -B build
```

を実行したところ、

```terminal
$ cmake -S . -B build
-- The C compiler identification is AppleClang 16.0.0.16000026
-- The CXX compiler identification is AppleClang 16.0.0.16000026
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Warning (dev) at /opt/homebrew/Cellar/cmake/3.30.0/share/cmake/Modules/FetchContent.cmake:1373 (message):
  The DOWNLOAD_EXTRACT_TIMESTAMP option was not given and policy CMP0135 is
  not set.  The policy's OLD behavior will be used.  When using a URL
  download, the timestamps of extracted files should preferably be that of
  the time of extraction, otherwise code that depends on the extracted
  contents might not be rebuilt if the URL changes.  The OLD behavior
  preserves the timestamps from the archive instead, but this is usually not
  what you want.  Update your project to the NEW behavior or specify the
  DOWNLOAD_EXTRACT_TIMESTAMP option with a value of true to avoid this
  robustness issue.
Call Stack (most recent call first):
  CMakeLists.txt:9 (FetchContent_Declare)
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Found Python: /opt/homebrew/Frameworks/Python.framework/Versions/3.12/bin/python3.12 (found version "3.12.5") found components: Interpreter
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done (3.4s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/murakamitadashi/school/2024/database/20241002_btree/BTree/build

```

途中で警告が表示されました。

>CMake Warning (dev) at /opt/homebrew/Cellar/cmake/3.30.0/share/cmake/Modules/FetchContent.cmake:1373 (message):
  The DOWNLOAD_EXTRACT_TIMESTAMP option was not given and policy CMP0135 is
  not set.  The policy's OLD behavior will be used.  When using a URL
  download, the timestamps of extracted files should preferably be that of
  the time of extraction, otherwise code that depends on the extracted
  contents might not be rebuilt if the URL changes.  The OLD behavior
  preserves the timestamps from the archive instead, but this is usually not
  what you want.  Update your project to the NEW behavior or specify the
  DOWNLOAD_EXTRACT_TIMESTAMP option with a value of true to avoid this
  robustness issue.
Call Stack (most recent call first):
  CMakeLists.txt:9 (FetchContent_Declare)
This warning is for project developers.  Use -Wno-dev to suppress it.

>CMake Warning (dev) at /opt/homebrew/Cellar/cmake/3.30.0/share/cmake/Modules/FetchContent.cmake:1373 (message)：
  DOWNLOAD_EXTRACT_TIMESTAMP オプションが指定されておらず、ポリシー CMP0135 が設定されていません。
  が設定されていません。 ポリシーのOLD動作が使用されます。 URL
  URLダウンロードを使用する場合、抽出されたファイルのタイムスタンプは、抽出された時点のタイムスタンプであることが推奨されます。
  抽出されたファイルのタイムスタンプは、抽出時のものであることが望ましいです。
  に依存するコードは再構築されないかもしれません。 OLDの動作
  はアーカイブのタイムスタンプを保存しますが、これは通常
  を必要としません。 プロジェクトをNEWの挙動に更新するか、あるいは
  DOWNLOAD_EXTRACT_TIMESTAMP オプションに true を指定してください。
  オプションにtrueを指定します。
コールスタック（最新のコールが最初）：
  CMakeLists.txt:9 (FetchContent_Declare)
この警告はプロジェクト開発者向けです。 抑制するには -Wno-dev を使用してください。

警告を無視しても、テストを実行はできたのですが、一応気になりましたので調べることにしました。


## 調べたこと・原因など
どうやらCMakeListの記述にある

```cmake
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
```

が原因のようです。CMP0135で検索しますと、次のページが見つかりました。

https://cmake.org/cmake/help/latest/policy/CMP0135.html

このページによりますと、FetchContent_Declareを使う際は、DOWNLOAD_EXTRACT_TIMESTAMPオプションをつけなければ、警告が発せられるそうです。確かに、警告文にもそのように書いてありますね。つまり、この警告を解決するには、DOWNLOAD_EXTRACT_TIMESTAMPオプションをONにする必要があるということですね。

## どのように解決したか
https://gitlab.kitware.com/cmake/cmake/-/issues/25107

このサイトに、DOWNLOAD_EXTRACT_TIMESTAMPを有効にする方法が書いてありました。

```cmake
DOWNLOAD_EXTRACT_TIMESTAMP ON
```

という記述を追加するだけで良いとのこと。

```cmake
include(FetchContent)
FetchContent_Declare(
  googletest
  DOWNLOAD_EXTRACT_TIMESTAMP ON  # 追加
  URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
```

これで、再度

```shell
$ cmake -S . -B build
```

を実行しました。

```terminal
$ cmake -S . -B build
-- Configuring done (0.4s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/murakamitadashi/school/2024/database/20241002_btree/BTree/build
```

警告なく、無事ビルドできました。

## 考察
CMake3.24以降では、抽出されたコンテンツの全てに、抽出時刻のタイムスタンプをつけることが推奨されているようです。