CMake - 環境変数
概要
環境変数の基本的な参照方法として、$ENV{変数名}
という構文を使用する。
この方法は、CMakeスクリプトのどの場所でも利用可能であり、直感的な記法となっている。
例えば、システムの環境変数PATHを参照する場合は、$ENV{PATH}と記述する。
環境変数を扱う場合、重要なことは存在確認がある。
DEFINED ENV{変数名}
コマンドを使用することにより、特定の環境変数が定義されているかどうかを確認することができる。
これは、ビルド環境の違いによって発生する問題を防ぐために重要である。
環境変数の値をCMakeスクリプト内で再利用する場合、set
コマンドを使用して、環境変数の値をCMakeの変数へ代入することを推奨する。
これにより、値の再利用が容易になり、スクリプトの可読性も向上する。
また、環境変数の値を一時的に変更することも可能である。
set(ENV{変数名} <新しい値>)
コマンドを使用して環境変数の値を設定できる。
これは、この変更がCMakeのプロセス内でのみ有効であり、親プロセスには影響しないという制約 (特徴) がある。
プロジェクトの柔軟性を高める技術として、環境変数が存在しない場合に備えて適切なデフォルト値を設定することにより、スクリプトの堅牢性が向上する。
注意が必要なことは、異なるオペレーティングシステムでは、パスの区切り文字 (Windowsではバックスラッシュ、UNIX系ではフォワードスラッシュ) が異なる。
CMakeは内部でパスの正規化を行うが、明示的に処理が必要な場合もある。
環境変数は、外部ライブラリやツールのパスの指定、コンパイルフラグの設定、インストールディレクトリの指定等、様々な用途で活用される。
例えば、BOOST_ROOTやJAVA_HOME等の環境変数は、それぞれのライブラリやツールの場所を指定するために広く使用されている。
ビルドシステムの設定において、環境変数を使用することで異なる開発環境や実行環境への対応が容易になるが、
過度に環境変数に依存するとビルドスクリプトの可搬性が低下する可能性があるため、適切なバランスを取る必要がある。
また、デバッグとトラブルシューティングにおいて、環境変数の値はmessage
コマンドを使用して出力することを推奨する。
これにより、ビルド時の問題解決が容易になる。
基本的な参照
環境変数を参照する。
これは、CMakeの任意の場所で使用可能である。
$ENV{<変数名>}
# $ENV{<変数名>}コマンドを使用した直接的な環境変数の参照
message("Path environment variable: $ENV{PATH}")
message("Home directory: $ENV{HOME}")
値の取得と代入
set
コマンドを使用して、環境変数の値をCMakeの変数に代入することができる。
これにより、環境変数の値を後で使用するために保存できる。
set(MY_PATH $ENV{PATH})
set(MY_HOME $ENV{HOME})
環境変数の存在確認
DEFINED ENV{<変数名>}
コマンドを使用して、環境変数が定義されているかどうかを確認することができる。
これは、if文での条件分岐に有効である。
# 環境変数の存在確認と条件分岐
if(DEFINED ENV{BOOST_ROOT})
message("BOOST_ROOT is defined: $ENV{BOOST_ROOT}")
else()
message("BOOST_ROOT is not defined")
endif()
環境変数のデフォルト値の設定
環境変数が存在しない場合、デフォルト値を設定することができる。
※注意
環境変数の値は文字列として扱われる。
環境変数の変更は、set(ENV{<変数名>} <値>)
コマンドで可能であるが、親プロセスには影響しない。
パスを扱う場合、システムに依存する区切り文字に注意する。
if(NOT DEFINED ENV{MY_CUSTOM_VAR})
set(ENV{MY_CUSTOM_VAR} "default_value")
endif()
message("MY_CUSTOM_VAR: $ENV{MY_CUSTOM_VAR}")
複数の環境変数を組み合わせ
# boostライブラリの環境変数BOOST_ROOTが定義されている場合、
# 変数BOOST_PATHにおいて、該当するboostライブラリが存在するバージョンのパスを設定
if(DEFINED ENV{BOOST_ROOT} AND DEFINED ENV{BOOST_VERSION})
set(BOOST_PATH "$ENV{BOOST_ROOT}/boost_$ENV{BOOST_VERSION}")
message("Boost path: ${BOOST_PATH}")
endif()
find_packageコマンドでの環境変数の使用
# boostライブラリの環境変数BOOST_ROOTが環境変数として設定されている場合、その値を使用
find_package(Boost REQUIRED COMPONENTS system filesystem
HINTS $ENV{BOOST_ROOT}
)
環境変数を使用した独自パスの構築
set(CUSTOM_LIB_PATH "$ENV{HOME}/libs:$ENV{LD_LIBRARY_PATH}")
message("Custom library path: ${CUSTOM_LIB_PATH}")
環境変数の値を一時的に変更
set(ENV{LD_LIBRARY_PATH} "/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64:/lib:/lib64")
環境変数を使用したターゲットプロパティの設定
if(DEFINED ENV{INCLUDE_DIRS})
target_include_directories(MyApp PRIVATE $ENV{INCLUDE_DIRS})
endif()
複数の可能性のある環境変数の確認
set(PYTHON_PATH "")
if(DEFINED ENV{PYTHONPATH})
set(PYTHON_PATH $ENV{PYTHONPATH})
elseif(DEFINED ENV{PYTHON_HOME})
set(PYTHON_PATH $ENV{PYTHON_HOME})
else()
message(WARNING "Neither PYTHONPATH nor PYTHON_HOME is defined")
endif()
環境変数を使用したコンパイルフラグの設定
if(DEFINED ENV{EXTRA_CFLAGS})
add_compile_options($ENV{EXTRA_CFLAGS})
endif()
環境変数を使用したインストールパスの設定
if(DEFINED ENV{INSTALL_PREFIX})
set(CMAKE_INSTALL_PREFIX $ENV{INSTALL_PREFIX})
endif()