おそらく私は明らかな何かを見逃しているかもしれませんが、 add_custom_target()
によって起動されたプロセスによって表示される環境変数を明示的に設定する方法を理解できないようです。
私は次を試しました:
set(ENV{PATH} "C:/Some/Path;$ENV{PATH}")
add_custom_target(newtarget somecommand)
残念ながら、%PATH%
環境変数は、somecommand
に変更されずに表示されます。 (問題を再現するGistを設定しました ここ 。)
何が間違っていますか?
カスタムターゲットの環境変数を設定するポータブルな方法は、CMakeのコマンドラインツールモードコマンドenv
を使用することです。
env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...
Run command in a modified environment.
例えば。:
add_custom_target(newtarget ${CMAKE_COMMAND} -E env NAME=VALUE somecommand)
コマンドラインツールモード も参照してください。
環境変数をconfigurationステップで設定しますが、_add_custom_target
_に指定されたコマンドはbuildステップで実行されます。 CMake FAQも参照してください: 環境変数を取得または設定するにはどうすればよいですか?
[...]
環境変数SET
CMakeLists.txt内onlyはcmake自体に有効です(configure-time)、したがって、このメソッドを使用して、カスタムコマンドに必要な環境変数を設定することはできません(build-time)。さまざまなCMakeコマンドによる環境変数のサポートがなければ(たとえば、add_custom_command()
、現在まだサポートされていません)、受け入れられる回避策は、実行するコマンドをラップする代わりにシェルスクリプトを呼び出すことです。
現在、_add_custom_target
_(およびビルドステップのアクションを定義する他のコマンド、たとえば_add_custom_command
_)は、単純な環境変数の設定をサポートしていません。 このバグレポート でアドバイスされているように、Linuxでのスペースなしの変数値の設定には、コマンドの前に「VAR = VAL」句を追加できます。一般的なケースでは、環境をセットアップして実際のコマンドを実行するwrapperスクリプトを準備できます。
Windowsの場合:
wrapper.bat:
_@ECHO OFF
set PATH=C:\\Some\\Path;%PATH%
%*
_
CMakeLists.txt:
_add_custom_target(...
COMMAND cmd /c ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.bat <real_command> args...
)
_
Linuxの場合:
wrapper.sh:
_export "PATH=/Some/Path:$PATH"
eval "$*"
_
CMakeLists.txt:
_add_custom_target(...
COMMAND /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh <real_command> args...
)
_
変数の値が構成に依存する場合、_configure_file
_を使用してラッパースクリプトを構成できます。
[〜#〜] update [〜#〜]:
@sakraで述べたように、env
実行可能ファイルのcmake
ツールモードはラッパースクリプトとして使用できます。
_add_custom_target(...
COMMAND ${CMAKE_COMMAND} -E env "PATH=C:/Some/Path;$ENV{PATH}" <real_command> args...
)
_
この方法はCMake 3.2以降で利用可能です。