【CMake】ネットワーク認証を簡単に行う!変数`CMAKE_NETRC_FILE`の解説とサンプルコード


CMake 変数 CMAKE_NETRC_FILE は、file(DOWNLOAD)file(UPLOAD) コマンドの NETRC オプションの初期化に使用されます。これらのコマンドは、ネットワーク上のファイルをダウンロードまたはアップロードするためのものです。CMAKE_NETRC_FILE 変数は、これらのコマンドが使用する .netrc ファイルの場所を指定します。

導入バージョン

この変数は CMake 3.11 で導入されました。

構文

set(CMAKE_NETRC_FILE "/path/to/.netrc")

説明

CMAKE_NETRC_FILE 変数は、.netrc ファイルへのフルパスを設定します。.netrc ファイルは、ネットワーク接続の認証情報を含むテキストファイルです。file(DOWNLOAD)file(UPLOAD) コマンドは、このファイルを使用して、ダウンロードまたはアップロードするサーバーへの認証を行います。

file(DOWNLOAD) コマンドでの使用

file(DOWNLOAD "https://example.com/file.txt" DESTINATION "${CMAKE_BINARY_DIR}/file.txt" NETRC "${CMAKE_NETRC_FILE}")

この例では、https://example.com/file.txt からファイルをダウンロードし、CMAKE_BINARY_DIR ディレクトリに file.txt という名前で保存します。NETRC オプションは、CMAKE_NETRC_FILE 変数で指定された .netrc ファイルを使用することを指示します。

file(UPLOAD) コマンドでの使用

file(UPLOAD "${CMAKE_BINARY_DIR}/file.txt" "ftp://example.com/file.txt" NETRC "${CMAKE_NETRC_FILE}")

この例では、CMAKE_BINARY_DIR ディレクトリにある file.txt ファイルを ftp://example.com/file.txt にアップロードします。NETRC オプションは、CMAKE_NETRC_FILE 変数で指定された .netrc ファイルを使用することを指示します。

ExternalProject モジュールでの使用

ExternalProject モジュールは、CMAKE_NETRC_FILE 変数を使用して、ダウンロードまたはアップロードする外部プロジェクトの認証を行います。

FetchContent モジュールでの使用

FetchContent モジュールは、CMAKE_NETRC_FILE 変数を使用して、ダウンロードまたはアップロードする外部コンテンツの認証を行います。

  • .netrc ファイルの形式は次のとおりです。
  • .netrc ファイルは、ユーザーのホームディレクトリ (~) にある .netrc ファイルと、システム全体の .netrc ファイルの両方を使用できます。システム全体の .netrc ファイルは、通常 /etc/netrc にあります。
  • file(DOWNLOAD)file(UPLOAD) コマンドでは、NETRC オプションの代わりに LOCAL オプションを使用することもできます。LOCAL オプションを使用すると、コマンド内で認証情報を直接指定できます。
machine host_name login user_name password
  • password は、ログインパスワードです。
  • login は、ログインユーザーの名前です。
  • machine は、接続先のホストの名前です。

プログラミングにおける活用例

以下は、CMAKE_NETRC_FILE 変数を使用して、ネットワーク上のファイルをダウンロードする CMake スクリプトの例です。

set(CMAKE_NETRC_FILE "/path/to/.netrc")

file(DOWNLOAD "https://example.com/file.txt" DESTINATION "${CMAKE_BINARY_DIR}/file.txt")

message(STATUS "Downloaded file.txt")


ファイルのダウンロード

set(CMAKE_NETRC_FILE "/path/to/.netrc")

file(DOWNLOAD "https://example.com/file.txt" DESTINATION "${CMAKE_BINARY_DIR}/file.txt")

message(STATUS "Downloaded file.txt")

このコードは、~/.netrc ファイルに保存された認証情報を使用して、https://example.com/file.txt からファイルをダウンロードし、CMAKE_BINARY_DIR ディレクトリに file.txt という名前で保存します。

ファイルのアップロード

set(CMAKE_NETRC_FILE "/path/to/.netrc")

file(UPLOAD "${CMAKE_BINARY_DIR}/file.txt" "ftp://example.com/file.txt")

message(STATUS "Uploaded file.txt")

このコードは、CMAKE_BINARY_DIR ディレクトリにある file.txt ファイルを ftp://example.com/file.txt にアップロードします。

ExternalProject モジュールでの使用

set(CMAKE_NETRC_FILE "/path/to/.netrc")

externalproject_add(
  myproject
  SOURCE_DIR https://example.com/myproject.git
  UPDATE_COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/update.cmake
)

このコードは、https://example.com/myproject.git から myproject という名前の外部プロジェクトをダウンロードします。update.cmake ファイルは、プロジェクトを最新バージョンに更新するために使用されます。CMAKE_NETRC_FILE 変数は、ダウンロード中に認証を行うために使用されます。

FetchContent モジュールでの使用

set(CMAKE_NETRC_FILE "/path/to/.netrc")

fetchcontent_add(
  mycontent
  URL https://example.com/mycontent.tar.gz
  HASH SHA256:1234567890abcdef1234567890abcdef12345678
)

このコードは、https://example.com/mycontent.tar.gz から mycontent という名前の外部コンテンツをダウンロードします。mycontent.tar.gz ファイルは、SHA256 ハッシュ 1234567890abcdef1234567890abcdef12345678 で検証されます。CMAKE_NETRC_FILE 変数は、ダウンロード中に認証を行うために使用されます。

説明

  • ExternalProject モジュールと FetchContent モジュールは、CMake バージョン 3.13 以降でのみ使用できます。
  • file(DOWNLOAD)file(UPLOAD) コマンドは、CMake バージョン 3.11 以降でのみ使用できます。
  • CMAKE_NETRC_FILE 変数は、すべての CMake プロジェクトで使用できるグローバル変数です。
  • .netrc ファイルは、機密情報を含むため、安全な場所に保管する必要があります。


  • .netrc ファイル形式は、比較的単純ですが、複雑な認証シナリオには十分ではない場合があります。
  • CMAKE_NETRC_FILE 変数は、すべての CMake プロジェクトで使用できるグローバル変数です。これは、複数のプロジェクトで異なる認証情報を使用する場合に問題となる可能性があります。
  • .netrc ファイルは、機密情報を含むため、安全な場所に保管する必要があります。

これらの制限を回避するために、CMAKE_NETRC_FILE 変数の代替方法をいくつか検討することができます。

file(DOWNLOAD) と file(UPLOAD) コマンドの LOCAL オプション

file(DOWNLOAD)file(UPLOAD) コマンドには、NETRC オプションの代わりに LOCAL オプションを使用することができます。LOCAL オプションを使用すると、コマンド内で認証情報を直接指定できます。

file(DOWNLOAD "https://example.com/file.txt" DESTINATION "${CMAKE_BINARY_DIR}/file.txt" LOCAL USER "username" PASSWORD "password")

この例では、https://example.com/file.txt からファイルをダウンロードし、CMAKE_BINARY_DIR ディレクトリに file.txt という名前で保存します。LOCAL オプションは、usernamepassword を使用して認証を行うことを指示します。

環境変数

ネットワーク接続の認証情報を含む環境変数を設定することができます。

set(NETRC_USER "username")
set(NETRC_PASSWORD "password")

file(DOWNLOAD "https://example.com/file.txt" DESTINATION "${CMAKE_BINARY_DIR}/file.txt" NETRC "${NETRC_USER}:${NETRC_PASSWORD}")

この例では、https://example.com/file.txt からファイルをダウンロードし、CMAKE_BINARY_DIR ディレクトリに file.txt という名前で保存します。NETRC オプションは、NETRC_USERNETRC_PASSWORD 環境変数の値を使用して認証を行うことを指示します。

カスタムモジュール

ネットワーク接続の認証を処理するカスタムモジュールを作成することができます。このモジュールは、file(DOWNLOAD)file(UPLOAD) コマンドに代わるものとして使用できます。

専用の認証ライブラリ

ネットワーク接続の認証を処理する専用の認証ライブラリを使用することができます。このライブラリは、libcurllibssh のようなオープンソースライブラリであることも、独自のライブラリであることもできます。

最適な代替方法の選択

最適な代替方法は、個々のニーズによって異なります。以下の点を考慮する必要があります。

  • 柔軟性
  • 複雑性
  • セキュリティ要件