GNU Make - Make "erfindet" rm
watchout 26.11.2009 - 14:25 1824 10
watchout
Legendundead
|
Mein makefile denkt sich irgendwo einen "rm ..." Befehl aus, was es aber nicht machen soll wenns nach mir geht. Ich nehm mal stark an dass ich irgendwo was verbaut hab *hust* Das makefile selbst soll pdflatex ausführen und das Ergebnis in ein anderes Verzeichnis KOPIEREN (mit spezieller benamsung) Was aber im Moment passiert ist dass es nach dem kopieren das "original" PDF löscht, wodurch mir make natürlich unabhängig von änderungen im tex-file ständig pdflatex ausführt.... abgesehen davon hat auch TeXShop Probleme damit ein PDF anzuzeigen das nicht existiert (TeXShop erzeugt $(PRJ).pdf und zeigt das per intrnem Viewer an) Das merkwürdige ist, dass mir in der Konsole sogar der rm-Befehl angezeigt wird, direkt nach cp Ich starte make übrigens *nicht* aus TeXShop sondern vom Terminal aus, nur um dahingehenden Fragen vorzubeugen Hier das Makefile: PRJ = Test
TEXBIN="/Library/TeX/Distributions/.DefaultTeX/Contents/Programs/i386/"
AWKDATE=gawk '{gsub("%% DATE=","");print $0}'
AWKSHRT=gawk '{gsub("%% SHORT=","");print $0}'
GREPDATE=grep -E "^%% DATE=" "$@.tex"
GREPSHRT=grep -E "^%% SHORT=" "$@.tex"
GETDATE=$(GREPDATE) | $(AWKDATE)
GETSHRT=$(GREPSHRT) | $(AWKSHRT)
# Phony targets will always be run
.PHONY: clean cleaner
all: $(PRJ)
%: %.pdf
cp -f "$<" "../_PDF/Test_`$(GETSHRT)`_`$(GETDATE)`.pdf"
%.pdf: %.tex
$(TEXBIN)pdflatex "$<" > /dev/null
$(TEXBIN)pdflatex "$<" > /dev/null
clean:
rm -f *.out
rm -f *.aux
cleaner: clean
rm -f *.log
rm -f *.pdf
Und output von "make" (ausgeführt in bash) "/Library/TeX/Distributions/.DefaultTeX/Contents/Programs/i386/"pdflatex "Test.tex" > /dev/null
"/Library/TeX/Distributions/.DefaultTeX/Contents/Programs/i386/"pdflatex "Test.tex" > /dev/null
cp -f "Test.pdf" "../_PDF/Test_`grep -E "^%% SHORT=" "Test.tex" | gawk '{gsub("%% SHORT=","");print }'`_`grep -E "^%% DATE=" "Test.tex" | gawk '{gsub("%% DATE=","");print }'`.pdf"
rm Test.pdf
|
Ringding
Pilot
|
Am wahrscheinlichsten liegt es daran, dass du das File "Test" nicht erzeugst. Wenn du's als Target hast, sollte auch das File gemacht werden. Oder pdflatex liefert einen Fehlercode zurück. Da könnte ich mir auch vorstellen, dass er deswegen das output-File löscht.
|
watchout
Legendundead
|
pdflatex macht keinen Fehler, das dachte ich mir auch schon, das mit dem File erzeugen... Werd ich mal testen, find ich trotzdem noch merkwürdig dass der einfach den Output löscht
|
watchout
Legendundead
|
Ok ich hab das jetzt verändert.... und er löscht mir NOCH IMMER ein file nur in dem Fall ists nicht so schlimm, das is wohl noch das unwichtigste: PRJ = Test
TEXBIN="/Library/TeX/Distributions/.DefaultTeX/Contents/Programs/i386/"
AWKDATE=gawk '{gsub("%% DATE=","");print $0}'
AWKSHRT=gawk '{gsub("%% SHORT=","");print $0}'
GREPDATE=grep -E "^%% DATE=" "$<"
GREPSHRT=grep -E "^%% SHORT=" "$<"
GETDATE=`$(GREPDATE) | $(AWKDATE)`
GETSHRT=`$(GREPSHRT) | $(AWKSHRT)`
SILENT= > /dev/null
# Phony targets will always be run
.PHONY: clean cleaner
all: $(PRJ).pdf
%.pdf: %.tex %.cp
$(TEXBIN)pdflatex "$<" $(SILENT)
$(TEXBIN)pdflatex "$<" $(SILENT)
cp -f "$@" "`cat $*.cp`"
%.cp: %.tex
echo ../_PDF/$(GETSHRT)_$(GETDATE).pdf > $@
clean:
rm -f *.log
rm -f *.out
rm -f *.aux
rm -f *.cp
cleaner: clean
rm -f *.pdf
make output: echo ../_PDF/`grep -E "^%% SHORT=" "Test.tex" | gawk '{gsub("%% SHORT=","");print }'`_`grep -E "^%% DATE=" "Test.tex" | gawk '{gsub("%% DATE=","");print }'`.pdf > Test.cp
"/Library/TeX/Distributions/.DefaultTeX/Contents/Programs/i386/"pdflatex "Test.tex" > /dev/null
"/Library/TeX/Distributions/.DefaultTeX/Contents/Programs/i386/"pdflatex "Test.tex" > /dev/null
cp -f "Test.pdf" "`cat Test.cp`"
rm Test.cp
Irgendeine implicit rule pfuscht mir da rein... aber ich weiss nicht welche und es nervt. so richtig. grrr edit: Auf den 2. blick hin ists wohl aber vollkommen egal ob jetzt Test.cp gelöscht wird oder nicht, weil ja entweder ist es up to date, oder Test.tex ist auch nicht up to date und es muss sowieso neu erstellt werden. Also ist die Sache lauffähig von meiner Warte aus - nur warum make das file jetzt wirklich löscht is mir immer noch nicht klar.
Bearbeitet von watchout am 28.11.2009, 20:56
|
Ringding
Pilot
|
Hast du irgendwelche komischen Environmentvariablen gesetzt? Mir kommt das Verhalten schon etwas seltsam vor…
|
watchout
Legendundead
|
Überhaupt nichts, aber... du musst mir ja nicht glauben, env sollte mich entlasten foobar:~$ env
MANPATH=/sw/share/man:/opt/subversion/man:/usr/share/man:/usr/local/share/man:/usr/X11/man:/sw/lib/perl5/5.10.0/man:/usr/X11R6/man
TERM_PROGRAM=Apple_Terminal
TERM=xterm-color
SHELL=/bin/bash
TMPDIR=-snip-
PERL5LIB=/sw/lib/perl5:/sw/lib/perl5/darwin
Apple_PubSub_Socket_Render=-snip-
TERM_PROGRAM_VERSION=272
QTDIR=/sw/lib/qt3
SGML_CATALOG_FILES=/sw/etc/sgml/catalog
USER=foobar
COMMAND_MODE=unix2003
SSH_AUTH_SOCK=-snip-
__CF_USER_TEXT_ENCODING=0x1F5:0:0
PATH=/sw/bin:/sw/sbin:/opt/subversion/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/Users/foobar/Scripts:/usr/X11R6/bin
XML_CATALOG_FILES=/sw/etc/xml/catalog
PWD=/Users/foobar
VERSIONER_PERL_PREFER_32_BIT=yes
SHLVL=1
HOME=/Users/foobar
LOGNAME=foobar
LC_CTYPE=UTF-8
INFOPATH=/sw/share/info:/sw/info:/usr/share/info
DISPLAY=-snip-:0
_=/usr/bin/env
(sorry für -snip- aber forum is public lesbar und ich kenn nicht alle sicherheitslücken )
|
BuSHidO
ist süß
|
Ändere mal den Namen von Test.cp auf was anderes ... meintest.cp oder so.
|
Ringding
Pilot
|
Hmm, macht's vielleicht Probleme, dass es groß geschrieben ist? Das Verhalten von make wird wohl nie jemand vollständig verstehen .
|
COLOSSUS
AdministratorGNUltra
|
Das Verhalten von make wird wohl nie jemand vollständig verstehen . Signed! Ich kann leider auch nicht konkret weiterhelfen, aber wenn es wo (abseits von Mailinglisten und Newsgroups) Hilfe gibt, dann wohl in #workingset auf irc.freenode.org
|
watchout
Legendundead
|
Aaalso, ich hab auf der Uni mit wem diskutiert warum das gelöscht wird und der hat mir nen Tip gegeben... ziemlich einfach eigentlich. Für make gibts die option "-d" mit der es anzeigt wie das makefile interpretiert wird, welche rules angewendet werden. Vor dem rm kommt die message "Removing intermediate files..." und es gibt scheinbar auch eine passende Trying implicit prerequisite `Test.cp'.
Looking for a rule with intermediate file `Test.cp'.
Avoiding implicit rule recursion.
Trying pattern rule with stem `Test'.
Trying implicit prerequisite `Test.tex'.
Found an implicit rule for `Test.pdf'.
Also ich bin fürs erste mal zufrieden mit der Auflösung, Test.cp ist wie gesagt nicht so wichtig und es muss in jedem Fall neu generiert werden.
|
watchout
Legendundead
|
Ha! http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=4073Ziemlich weit unten meldet sich der package-maintainer mit: All you have to do to remove intermediate file processing is cause the file to not be considered intermediate anymore. All it takes for a file to not be intermediate is _any_ explicit mention whatsoever of the file, either as a dependency or as a prerequisite.
So, just saying:
dummy: t.bar
is enough to keep t.bar from being intermediate, without any of the side-effects of .PRECIOUS. Naja, zu früh gefreut, weil das funktioniert eben wieder nicht mit pattern rules...
|