2017-08-21 3 views
0

私はPythonをAnacondaと一緒に使用していて、私はを私のMakefileに入れたいと思っています。しかし、make testを実行すると正しい環境が有効になると主張したいと思います。 conda環境がアクティブになると、環境変数$(CONDA_DEFAULT_ENV)が定義されます。仮想環境が有効になっていることを確認し、それに応じてMakefile内で動作します

最初に私がやった:私はmake testを実行したとき

REPO_NAME = my_repo 

define execute_in_env 
    source activate $(REPO_NAME); \ 
    $1 
endef 

test: 
    $(call execute_in_env, pytest -v --ignore=src/foo) 

この方法では、それは仮想環境を活性化し、内部テストを実行しました。問題は長さです。私は、makeがアクティブ化された仮想環境から実行されているかどうかをチェックしたいと思います。そのためにコードを変更しました:

.PHONY: test 
REPO_NAME = my_repo 
define execute_in_env = 
    [email protected] "Checking if in environment" 
    ifeq ($(CONDA_DEFAULT_ENV),$(REPO_NAME)) 
     $1 
    else 
     source activate $(REPO_NAME); \ 
     $1 
    endif 
endef 
test: 
    $(call execute_in_env, pytest -v --ignore=src/rebuydsutils) 

この実装では、テストは行われません。私は、根本的な問題はdefine execute_in_env ==である

make: Nothing to be done for `test'. 

答えて

1

を取得します。 (あなたはまた、defineの中にifeqを使用していますが、それは鋭いスティックのビットですが、私はこの特定のケースであなたを傷つけるとは思わない)。必要ない関数を使用していることに注意してください。関数はあまり読みにくくなく、makefileを保守しにくくします。同じことをやっての簡単かつクリーンな方法は、次のようになります。@ジョンの回答に基づいて

ifeq ($(CONDA_DEFAULT_ENV),$(REPO_NAME)) 
    ACTIVATE_ENV := source activate $(REPO_NAME); 
else 
    ACTIVATE_ENV := true 
endif 

test: 
    $(ACTIVATE_ENV) && pytest -v --ignore=src/rebuydsutils; 
+0

明確にするために、GNU make 3.82(2010年7月リリース)では 'define'で '= '記号を使用できる構文が追加されました。お使いのGNU makeのバージョンがそれより古い場合、この構文は使用できません。 – MadScientist

+0

仮想環境から異なる実行可能ファイルを別のルールから呼び出すときに、関数が必要です。私は答えとして自分の修正を加えます。私はそれを受け入れることができるので気軽に更新してください:) – Dror

+0

'$(call ...) 'を使うのではなく、どのレシピの前にでも簡単に' $(ACTIVATE_ENV)&&'を追加することができます。 – blackghost

0

、私は次のように書いた:

ifeq ($(CONDA_DEFAULT_ENV),$(REPO_NAME)) 
    ACTIVATE_ENV := true 
else 
    ACTIVATE_ENV := source activate $(REPO_NAME) 
endif 

# Execute python related functionalities from within the project's environment 
define execute_in_env 
    $(ACTIVATE_ENV) && $1 
endef 

その後、ルール内で私のようなもの持つことができます

test: 
    $(call execute_in_env, pytest -v --ignore=src/somepackage) 
関連する問題