2016-06-30 3 views
0

Ich habe mehrere verschiedene Ziele in Makefile, aber ich möchte nicht, dass Benutzer einige von ihnen aus der Shell aufrufen können, sie sind nur Voraussetzungen für andere Ziele. Zum Beispiel:Ziele in Makefile, die nicht in der Shell aufgerufen werden können

target1: pre1 pre2 
    ... 

target2: target3 
    ... 

target3: 
    ... 

würde ich deaktivieren möchte target3 in bash aufrufen, in einer Weise, die auch bash von Anzeigen make target3 wenn make target eingegeben wird, und dann wird tab Taste gedrückt verhindern würde.

Kurz gesagt, ich möchte nicht, dass Leute, die mit meinem Makefile machen aufrufen zu wissen, dass target3 existiert. Ist es möglich zu erreichen?

+0

dokumentieren nur die gültigen 'make' Ziele. – Kusalananda

+0

Ich könnte das tun, aber es wird mich nicht vor Idioten schützen. –

Antwort

1

Eine Möglichkeit, dies zu erreichen, besteht darin, das dem make-Befehl übergebene Ziel mithilfe der Variablen MAKECMDGOALS zu analysieren.

Hier ist, wie aussehen wie die 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 

Wenn die make kein Ziel hat, wird es die echo auszuführen. Die make target3 wird nichts ausgeben.

Wenn Sie ein bestimmtes Ziel ermöglichen es Ihnen, die folgenden hinzufügen:

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

Ok ich bekomme die Idee, deine Antwort hilft Ich löse das Problem. –

0

Haftungsausschluss: Diese Antwort hängt vollständig von der Linux-Distribution ab, die Sie verwenden. Dies wird unter Ubuntu 16.04 getestet:

Markieren Sie dies als ein verstecktes Ziel. Benennen Sie es in etwas um, das mit einer nicht alphanumerischen Zeichenfolge beginnt.

Gemeinsame Option wäre .target3

Von declare -f _make_target_extract_script:

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

Diese Linie über einen Teil des sed Skript, das die Zielliste druckt für make über die Bash-Completion-Funktion _make.

1

Kein Experte in make, Bit der GNU make Seiten umsah

standardmäßig machen beginnt mit dem ersten Ziel (nicht Ziele, deren Namen beginnen mit ‚‘).

So werden die Zielnamen, die mit einem Punkt beginnen, nicht berücksichtigt, wenn make das Standardziel angibt. Sie könnten versuchen, das Hinzufügen von dot (.) vor Ihrem Ziel als

target1: pre1 pre2 
    ... 

target2: .target3 
    ... 

.target3: 
    ... 

target3 von gezeigtem Standard zu vermeiden, wenn Sie tab gedrückt wird.

+0

Der 'Punkt (.)' Hat den Job gemacht !. Danke, ich war auf der Suche nach speziellen eingebauten Zielnamen, aber 'dot (.)' Ist genug. –

+0

Es löste sich aber nur teilweise. Ziele mit 'dor (.)' Erscheinen nicht, wenn ich 'make target' gebe und die' tab' Taste drücke, aber ich kann diese Ziele immer noch von bash aus aufrufen, indem ich 'make .target' gebe. –

Verwandte Themen