[GNU Make] Optimaliseert targets weg?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • icyx
  • Registratie: Januari 2007
  • Niet online

icyx

chown -R us ./base

Topicstarter
Ik heb een makefile die hele fancy dingen doet met een latex beamer presentatie. Die is in vier verschillende modi te compileren, welke allemaal een eigen target hebben. Compileren werkt dan ook prima als ik dit doe:
v|1.1M|[kevin@lpt08a ~/jslinux/afstudeerpresentatie]$ make silent-pres; make silent-presnotes; make silent-handout; make silent-static


Zodra ik het volgende maketarget toevoeg, gaat hij echter onderuit:

build: silent-pres silent-presnotes silent-handout silent-static


Wanneer ik kijk naar de rules die make wil uitvoeren zie ik gelijk de fout:
v1.1M|[kevin@lpt08a ~/jslinux/afstudeerpresentatie]$ make build -n
perl -pi -e 's/^\%\\prestrue/\\prestrue/' presentatie.tex
pdflatex -interaction nonstopmode presentatie > /dev/null 2>&1
pdflatex -interaction nonstopmode presentatie > /dev/null 2>&1
perl -pi -e 's/^\\prestrue/\%\\prestrue/' presentatie.tex
mv presentatie.pdf presentatie.pres.pdf 
touch presentatie.pdf
mv presentatie.pdf presentatie.org.pdf
make -f latex-makefile clean > /dev/null 2>&1
mv presentatie.org.pdf presentatie.pdf
perl -pi -e 's/^\%\\presnotestrue/\\presnotestrue/' presentatie.tex
perl -pi -e 's/^\\presnotestrue/\%\\presnotestrue/' presentatie.tex
mv presentatie.pdf presentatie.presnotes.pdf 
perl -pi -e 's/^\%\\handouttrue/\\handouttrue/' presentatie.tex
perl -pi -e 's/^\\handouttrue/\%\\handouttrue/' presentatie.tex
mv presentatie.pdf presentatie.handout.pdf 
perl -pi -e 's/^\%\\statictrue/\\statictrue/' presentatie.tex
perl -pi -e 's/^\\statictrue/\%\\statictrue/' presentatie.tex
mv presentatie.pdf presentatie.static.pdf

Wat hier gebeurd is het printen van commando's uit de subtargets. Ze delen alle vier alleen ook weer eenzelfde target; build-int-silent:
build-int-silent:
        @${PDFLATEX} ${FILE} > /dev/null 2>&1
        @${PDFLATEX} ${FILE} > /dev/null 2>&1


De 2,3 en 4e negeren dit target echte allemaal, ookal staat het er wel correct in (getuige ook de losse invocations). Volgens mij zit make het weg te optimaliseren 'omdat het toch hetzelfde target is'. Is het ook, maar het resulteert in 4 verschillende PDF's :p.

Weet iemand hoe ik kan zorgen dat make gewoon die targets uitvoerd, en ze niet wegoptimaliseerd?
v|1.1M|[kevin@lpt08a ~/jslinux/afstudeerpresentatie]$ make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-pc-linux-gnu

When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.


Acties:
  • 0 Henk 'm!

  • Joseph
  • Registratie: April 2008
  • Laatst online: 12:59
make --no-optimize

Acties:
  • 0 Henk 'm!

  • icyx
  • Registratie: Januari 2007
  • Niet online

icyx

chown -R us ./base

Topicstarter
Die staat bij genoemde versie niet in de supported arguments. Ik heb wel dit:

  -B, --always-make           Unconditionally make all targets.

Maar die geeft dezelde output als hierboven. Vanuit welke manpage heb je die optie?

When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.


Acties:
  • 0 Henk 'm!

  • Wolf87
  • Registratie: Juli 2004
  • Laatst online: 11:10
Volgens mij probeer je een phony target te maken.

Zie: http://www.gnu.org/softwa...argets.html#Phony-Targets

Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 02-10 22:42

CAPSLOCK2000

zie teletekst pagina 888

Make is juist gemaakt voor dit soort optimalisaties. Wat je wil gaat lijnrecht in tegen het ontwerp van make. Een van de belangrijskste features van make is juist dat het niet meer doet dan noodzakelijk.
Als hetzelfde target 4 keer voorkomt dan wordt het maar 1 keer toegepast. Meer dan 1 keer zou ook nergens op moeten slaan, de uitkomst van een target staat vast. Als de uitkomst van je target niet iedere keer hetzelfde is dan klopt je target niet.

Het lijkt er op dat jij hetzelfde target wil gebruiken voor verschillende files. Dat kan niet kloppen. De output van een target is altijd hetzelfde.

Een oplossing is om de filenaam deel van target te maken.

zoiets
code:
1
2
%-build-silent:
        @${PDFLATEX} $* > /dev/null 2>&1



Als je echt hetzelfde target meerdere keren wil aanroepen (en dat wil je niet) dan kun je het afdwingen door make opnieuw te starten vanuit je makefile:

code:
1
2
3
4
wiljeniet:
        make targetA
        make targetA
        make targetA

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

  • icyx
  • Registratie: Januari 2007
  • Niet online

icyx

chown -R us ./base

Topicstarter
CAPSLOCK2000 schreef op zaterdag 21 januari 2012 @ 14:52:
Make is juist gemaakt voor dit soort optimalisaties. Wat je wil gaat lijnrecht in tegen het ontwerp van make. Een van de belangrijskste features van make is juist dat het niet meer doet dan noodzakelijk.
Als hetzelfde target 4 keer voorkomt dan wordt het maar 1 keer toegepast. Meer dan 1 keer zou ook nergens op moeten slaan, de uitkomst van een target staat vast. Als de uitkomst van je target niet iedere keer hetzelfde is dan klopt je target niet.
Eens, dat is zeker een groot voordeel.
Het lijkt er op dat jij hetzelfde target wil gebruiken voor verschillende files. Dat kan niet kloppen. De output van een target is altijd hetzelfde.
In dit geval is dit dus niet zo. Het betreft een beamer presentatie die verschillende modi kent. Denk hierbij aan handouts, notes, etc. Nu weet ik wel dat je met meerdere preambles kunt werken, maar die zullen ook identiek zijn, op een of twee regels na. Nu heb ik dus alles in een preamble zitten, waarbij er \if$mode ... \fi constructies zijn.

Dit werkt dus prima, maar daardoor resulteert de makefile in identieke targets met verschillende output.
Een oplossing is om de filenaam deel van target te maken.

zoiets
code:
1
2
%-build-silent:
        @${PDFLATEX} $* > /dev/null 2>&1
Nice, dat kende ik nog niet :). Is alleen in deze situatie niet geschikt. De file is immers hetzelfde.
Als je echt hetzelfde target meerdere keren wil aanroepen (en dat wil je niet) dan kun je het afdwingen door make opnieuw te starten vanuit je makefile:

code:
1
2
3
4
wiljeniet:
        make targetA
        make targetA
        make targetA
Dit is momenteel idd mijn workaround, maar ik zoek naar een nette oplossing. Of natuurlijk een opmerking waarmee ik inzie dat ik het verkeerd aanpak ;)

When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.


Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 02-10 22:42

CAPSLOCK2000

zie teletekst pagina 888

icyx schreef op zaterdag 21 januari 2012 @ 15:15:
Nice, dat kende ik nog niet :). Is alleen in deze situatie niet geschikt. De file is immers hetzelfde.
<knip>
Dit is momenteel idd mijn workaround, maar ik zoek naar een nette oplossing. Of natuurlijk een opmerking waarmee ik inzie dat ik het verkeerd aanpak ;)
De input-file is hetzelfde, de output niet, en daar gaat het om. Ik hoop dat dit die opmerking was :)

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

  • icyx
  • Registratie: Januari 2007
  • Niet online

icyx

chown -R us ./base

Topicstarter
Ja, dat was het. Ik heb de Makefile opnieuw gestructureerd, waarbij de targets inderdaad voor een vaste output zorgen. Het probleem is dan ook opgelost, en ik heb er weer wat kennis bij ;). Bedankt

When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.

Pagina: 1