"We are back" « oc.at

GNU Make - Make "erfindet" rm

watchout 26.11.2009 - 14:25 1824 10
Posts

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
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 :confused:

Ich starte make übrigens *nicht* aus TeXShop sondern vom Terminal aus, nur um dahingehenden Fragen vorzubeugen ;)

Hier das Makefile:
Code:
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)
Code:
"/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
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
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:

Code:
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:
Code:
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
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Hast du irgendwelche komischen Environmentvariablen gesetzt? Mir kommt das Verhalten schon etwas seltsam vor…

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Überhaupt nichts, aber... du musst mir ja nicht glauben, env sollte mich entlasten :D

Code:
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 :p)

BuSHidO

ist süß
Registered: Jul 2001
Location: galaxie
Posts: 542
Ändere mal den Namen von Test.cp auf was anderes ... meintest.cp oder so.

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Hmm, macht's vielleicht Probleme, dass es groß geschrieben ist?

Das Verhalten von make wird wohl nie jemand vollständig verstehen :).

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12122
Zitat von Ringding
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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
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
Code:
   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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Ha!

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=4073

Ziemlich weit unten meldet sich der package-maintainer mit:
Zitat
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...
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz