2014-01-19 11 views
7

Betrachten Sie das folgende MakefileWie kann ich eine Variablendefinition über mehrere Zeilen in einem Makefile ohne Leerzeichen aufteilen?

CP = .:${HADOOP_HOME}/share/hadoop/common/lib/hadoop-auth-2.2.0.jar:\ 
${HADOOP_HOME}/share/hadoop/hdfs/hadoop-hdfs-2.2.0.jar:\ 
${HADOOP_HOME}/share/hadoop/common/hadoop-common-2.2.0.jar:\ 
${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar:\ 
${HADOOP_HOME}/share/hadoop/mapreduce/lib/hadoop-annotations-2.2.0.jar\ 

all: 
    echo $(CP) 

Der Ausgang make des Laufens ist

.:/home/hduser/Hadoop/hadoop-2.2.0/share/hadoop/common/lib/hadoop-auth-2.2.0.jar: /home/hduser/Hadoop/hadoop-2.2.0/share/hadoop/hdfs/hadoop-hdfs-2.2.0.jar: /home/hduser/Hadoop/hadoop-2.2.0/share/hadoop/common/hadoop-common-2.2.0.jar: /home/hduser/Hadoop/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar: /home/hduser/Hadoop/hadoop-2.2.0/share/hadoop/mapreduce/lib/hadoop-annotations-2.2.0.jar 

Beachten Sie, dass es Räume nach jedem :.

Gibt es eine Möglichkeit, die Variable CP mit den Zeilenumbrüchen zu definieren, aber ohne den zusätzlichen Platz, der jede neue Zeile ersetzt?

Antwort

4

Nicht wirklich; Die Backslash-Newline-Kombination ist so definiert, dass ein Leerzeichen erzeugt wird. Wenn Sie jedoch GNU Make verwenden, können Sie einfach $(subst : ,:,$(CP)).

+0

Ich bin auf 'GNU 3.81' machen, aber der Code, den Sie sich vorgestellt nicht den gewünschten Effekt haben. Die Räume sind immer noch da. – merlin2011

+0

Insbesondere erzeugt echo $ (subst ,, $ (CP)) 'die gleiche Ausgabe wie' echo $ (CP) '. – merlin2011

+0

Entschuldigung; einen Doppelpunkt hinzugefügt - versuchen Sie es jetzt? – tripleee

2

Leider dies ein wenig Necro, aber ich denken dies wird dir geben, was Sie suchen:

CP = .:${HADOOP_HOME}/share/hadoop/common/lib/hadoop-auth-2.2.0.jar: 
CP:=$(CP)${HADOOP_HOME}/share/hadoop/hdfs/hadoop-hdfs-2.2.0.jar: 
CP:=$(CP)${HADOOP_HOME}/share/hadoop/common/hadoop-common-2.2.0.jar: 
CP:=$(CP)${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar: 
CP:=$(CP)${HADOOP_HOME}/share/hadoop/mapreduce/lib/hadoop-annotations-2.2.0.jar 

Dies sollte die nächste Zeile auf den Wert von CP hängen, etwas anders als "+ =", wodurch ein Leerzeichen hinzugefügt wird.

+0

I die 'get *** Recursive Variable referenziert sich (eventuell). Stoppen Sie auch hier Fehler. – wander95

+0

@ wander95 Interessant .... wie oft wiederholst du? Ich habe diese Methode mit bis zu 7 Zeilen verwendet, wobei jede Zeile mindestens 100 Zeichen lang ist. Ich werde versuchen, später zu testen, ob es eine obere Grenze gibt. – goodguy5

0

Ich habe es ähnlich wie @ goodguy5

CP=${HADOOP_HOME}/share/hadoop/common/lib/hadoop-auth-2.2.0.jar 
CP+=$(CP)${HADOOP_HOME}/share/hadoop/hdfs/hadoop-hdfs-2.2.0.jar 
CP+=$(CP)${HADOOP_HOME}/share/hadoop/common/hadoop-common-2.2.0.jar 
CP+=$(CP)${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar 
CP+=$(CP)${HADOOP_HOME}/share/hadoop/mapreduce/lib/hadoop-annotations-2.2.0.jar 
+0

Das funktioniert nicht: 'Makefile: 7: *** Die rekursive Variable 'CP' referenziert sich (eventuell). Stop.' –

+0

Es hat für mich funktioniert. Vielleicht ist die Compiler-Version verwandt? – ItayB

+1

Es funktioniert, wenn die erste Zeile 'CP: = ...' nicht 'CP = ...' verwendet. Dies zwingt "CP" dazu, eine einfach erweiterte Variable zu sein. – MadScientist

Verwandte Themen