web-dev-qa-db-ja.com

カスタムCMakeターゲットに渡される環境変数を変更する方法は?

おそらく私は明らかな何かを見逃しているかもしれませんが、 add_custom_target() によって起動されたプロセスによって表示される環境変数を明示的に設定する方法を理解できないようです。

私は次を試しました:

set(ENV{PATH} "C:/Some/Path;$ENV{PATH}")
add_custom_target(newtarget somecommand)

残念ながら、%PATH%環境変数は、somecommandに変更されずに表示されます。 (問題を再現するGistを設定しました ここ 。)

何が間違っていますか?

24
Nathan Osman

カスタムターゲットの環境変数を設定するポータブルな方法は、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)

コマンドラインツールモード も参照してください。

20
sakra

環境変数を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以降で利用可能です。

16
Tsyvarev