2016-01-27 7 views
15

私は明らかに何かが不足しているかもしれませんが、add_custom_target()によって起動されたプロセスが見ることのできる環境変数を明示的に設定する方法を見つけることができません。カスタムCMakeターゲットに渡される環境変数を変更するには?

は、私は次のことを試してみました:

残念ながら
set(ENV{PATH} "C:/Some/Path;$ENV{PATH}") 
add_custom_target(newtarget somecommand) 

%PATH%環境変数はsomecommandにそのまま表示されます。 (私は問題を再現する要点を設定しましたhere

私は間違っていますか?

+0

私はあなたのコメントから新しいプロセスを作成するので、新しいプロセスはメインプロセスの環境を継承せずに独自の環境を提供することをお勧めします。メインプロセスの子プロセスを作成する場合は、環境を継承する必要がありますが、 'cmake'は何も分かりませんので、私はここから離れているかもしれません。しかし、ディレクトリ区切り文字として 'backslash'を使うべきです。'/'ではなく、'/'はスイッチプレフィックスです。ときどき '/'はうまく動作しますが、信頼できません。 – Magoo

答えて

13

カスタムターゲットの環境変数を設定するポータブルな方法は、CMakeの者を使用することです。

12

あなたは設定段階で環境変数を設定しますが、add_custom_targetのために指定されたコマンドはビルドステップで実行されます。 CMakeのよくある質問も参照してください:CMakeLists.txt How can I get or set environment variables?

[...]
環境変数SETにのみ cmakeの自体(のconfigure-時間)のために有効になり、 ので、あなたはこれを使用することはできませんメソッドを使用して、カスタムコマンドに必要な環境変数 を設定します(ビルド時間)。 様々なCMakeコマンド (例えば、add_custom_command()、現時点ではまだサポートされていません)で環境変数をサポートしない場合、 の代わりにシェルスクリプトを呼び出す可能性があります。

現在 add_custom_target

(ビルドステップのためのアクションを定義し、他のコマンドは、例えばadd_custom_command)簡単な設定の環境変数をサポートしていません。 this bugreportでアドバイスされているように、設定変数の値にスペースがない場合は、Linux上でをコマンドに追加する前に、 "VAR = VAL"節を付けることができます。 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... 
) 

O n個の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によって示されるように、cmake実行のenvツールモードがラッパー・スクリプトとして使用することができる。

add_custom_target(... 
    COMMAND ${CMAKE_COMMAND} -E env "PATH=C:/Some/Path;$ENV{PATH}" <real_command> args... 
) 

このようにCMakeの3.2から利用可能です。

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]... 
Run command in a modified environment. 

例えば:

add_custom_target(newtarget ${CMAKE_COMMAND} -E env NAME=VALUE somecommand) 

またCommand Line Tool Modeを参照してください。コマンドラインツールモードコマンドenv