Sauberes Quoting in Makefiles =?UTF-8?Q?m=C3=B6glich??= (was: Automatische Make Targets)

31/03/2008 - 20:59 von Volker Grabsch | Report spam
Matthias Kluwe <mkluwe@gmail.com> schrieb:

Angenommen, "foo2bar" ist ein Filter, der aus .foo-Dateien .bar-
Dateien macht. Dann schreibe ich ein Makefile mit dem Inhalt

%.bar : %.foo
foo2bar $< > $@



Unabhàngig von der gestellten Frage noch ein Verbesserungsvorschlag:

%.bar : %.foo
foo2bar '$<' > '$@'

Dann klappt's auch bei Dateinamen Leerzeichen und àhnlichem Zeugs.

Einziges Manko: Apostrophe "'" in Dateinamen werden nicht korrekt
behandelt. Sauberes Quoting ist in Shellscripen schon eine Qual,
aber in Makefiles nahezu unmöglich. :-(

Das fliegt einem nur deshalb nicht so oft um die Ohren, weil die
meisten Programmierer 'harmlose' Dateinamen wàhlen. ;-)


Gruß,

Volker

"Wenn du der Meinung bist, der andere sei ein Depp, dann überlass das
Antworten denjenigen, die nicht dieser Meinung sind."

 

Lesen sie die antworten

#1 Stefan Reuther
01/04/2008 - 19:05 | Warnen spam
Volker Grabsch wrote:
Unabhàngig von der gestellten Frage noch ein Verbesserungsvorschlag:

%.bar : %.foo
foo2bar '$<' > '$@'

Dann klappt's auch bei Dateinamen Leerzeichen und àhnlichem Zeugs.

Einziges Manko: Apostrophe "'" in Dateinamen werden nicht korrekt
behandelt. Sauberes Quoting ist in Shellscripen schon eine Qual,
aber in Makefiles nahezu unmöglich. :-(



Da make sowieso offenbar keinen ernsthaften Quoting-Mechanismus hat, mit
dem man Namen mit Leerzeichen drin erstmal überhaupt angeben könnte, ist
das ziemlich egal.

Beispiel mit GNU make:
testq: 'foo.t bar.t'
testqq: "foo.t bar.t"
testbs: foo.t\ bar.t
%.t:
echo $@

GNU make akzeptiert nur den dritten Fall als Dateiname mit Leerzeichen drin:
royale:~ > make testq
echo 'foo.t
/bin/sh: -c: line 0: unexpected EOF while looking for matching `''
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** ['foo.t] Error 2

royale:~ > make testqq
echo "foo.t
/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** ["foo.t] Error 2

royale:~ > make testbs
echo foo.t bar.t
foo.t bar.t

Borland Make (zugegebenermaßen nicht ontopic hier, aber manchmal will
man ja portabel sein) hingegen akzeptiert den zweiten als einzelnen
Namen, den ersten und den dritten hingegen als zwei Namen:
royale:~ > cat Makefile
testq: 'foo.t bar.t'
testqq: "foo.t bar.t"
testbs: foo.t\ bar.t
"foo.t bar.t":
echo qq $*
'foo.t bar.t':
echo q $*
foo.t\ bar.t:
echo bs $*

royale:~ > bmake testq
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
echo q 'foo
q foo
echo q bar
q bar

royale:~ > bmake testqq
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
echo qq "foo.t bar"
qq foo.t bar

royale:~ > bmake testbs
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
echo bs foo.t\
bs foo.t\
echo bs bar
bs bar

Das fliegt einem nur deshalb nicht so oft um die Ohren, weil die
meisten Programmierer 'harmlose' Dateinamen wàhlen. ;-)



Die meisten Programmiersprachen erlauben nur [A-Za-z0-9_] für
Bezeichner, also gibt es nicht wirklich Gründe, die Dateinamen aus einem
wesentlich größeren Zeichenvorrat zu bilden. Schon Bindestriche sind bei
den Borland-Tools problematisch.
royale:~ > tlib foo.lib +bla-blub.obj
TLIB 4.5 Copyright (c) 1987, 1999 Inprise Corporation
Warning: 'bla.OBJ' file not found
Warning: 'blub' not found in library
(das ist das Äquivalent zu 'ar a foo.a bla-blub.o').


Stefan

Ähnliche fragen