2016-06-30 5 views
0

私はMakefileで複数の異なるターゲットを持っていますが、シェルからそれらを呼び出せないようにするために、他のターゲットの前提条件にすぎません。たとえば:シェル内で呼び出せないメークファイル内のターゲット

target1: pre1 pre2 
    ... 

target2: target3 
    ... 

target3: 
    ... 

私もmake targetが入力され、その後、tabキーが押されたときmake target3を表示からbashのを防ぐような方法では、bashでtarget3を呼び出して無効にしたいと思います。

つまり、Makefileを使ってmakeを呼び出して、target3が存在することを知りたい人はいません。達成することは可能ですか?

+0

ちょうど有効な 'make'目標を文書化します。 – Kusalananda

+0

私はそれを行うことができますが、それは馬鹿から私を保護しません。 –

答えて

1

これを達成する方法は、MAKECMDGOALS変数を使用してmakeコマンドに与えられたターゲットを解析することです。ここで

Makefileどのように見えるかです:

ifeq ($(MAKECMDGOALS),) 
ALLOWED=1 
endif 

target1: target2 target3 
ifdef ALLOWED 
    echo "target1" 
endif 

target2: 
ifdef ALLOWED 
    echo "target2" 
endif 

target3: 
ifdef ALLOWED 
    echo "target3" 
endif 

makeは何の目標を持っていない場合、それはechoを実行します。 make target3は何も出力しません。

あなたが特定のターゲットを許可したい場合は、以下を追加することができます。

ifeq ($(filter target1,$(MAKECMDGOALS)),target1) 
ALLOWED=1 
endif 
+0

私はアイデアを得ました。私は問題を解決する。 –

0

免責事項:この回答は、使用しているLinuxディストリビューションに完全に依存します。これはUbuntu 16.04でテストされています:

隠しターゲットとしてマークしてください。英数字以外の文字列で始まる名前に変更します。

共通オプションはdeclare -f _make_target_extract_scriptから.target3

次のようになります。

/^[^a-zA-Z0-9]/    d    # convention for hidden tgt 

上記のこの行は、bashの補完機能_makeを経て、makeのターゲットリストを出力sedスクリプトの一部です。

1

makeんの専門家で、デフォルトではGNU makeページ

見回しのビット、第一のターゲットと開始します(ない名前で始まるターゲットを「」)。

したがって、ピリオドで始まるターゲット名は、makeがデフォルトの目標を特定するときに考慮されません。あなたはtabが押されたときに表示されるデフォルトからtarget3を避けるために

target1: pre1 pre2 
    ... 

target2: .target3 
    ... 

.target3: 
    ... 

としてあなたのターゲットの前にdot.)を追加してみてください。

+0

'dot(。)'がジョブを実行しました!ありがとう、私はいくつかの特殊なビルトインターゲット名を探していましたが、ドット(。)で十分です。 –

+0

それは部分的に解決されました。 'make target'と打ち込んで' tab'キーを押すと 'dor(。) 'のターゲットは表示されませんが、' make .target'と打つことでこのターゲットを引き続き呼び出すことができます –

関連する問題