[GNU Make] dependency op target van een andere makefile

Pagina: 1
Acties:

  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 19:20 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 11:06

Robtimus

me Robtimus no like you

Eelis schreef op 12 juli 2004 @ 09:48:
code:
1
2
3
4
5
6
7
.PHONY: docs

distrib.tar: X
  tar -cf $@ docs/docs.html

docs:
  cd docs && $(MAKE) docs.html
Ik weet het antwoord zo niet, maar die laatste regel kan netter:
code:
1
2
docs:
        make -C docs docs.html

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Wat gebeurt er als je de dependency ook in de hoofd-makefile definieërt?

code:
1
2
3
4
5
6
7
%.html: %.xml

distrib.tar: docs
  tar -cf $@ $^

docs: docs/docs.html
  make -C docs docs.html

[ Voor 18% gewijzigd door Verwijderd op 12-07-2004 10:45 ]


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 19:20 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je vraag is eigenlijk wel raar, want aan de ene kant wil je geen recursive make, maar aan de andere kant wil je dat weer wel. Je wilt namelijk bereiken dat je docs.html up-to-date is als je op top-level een distributie maakt, maar je wilt het maken van docs.html in een aparate Makefile beschrijven.

Je moet dus kiezen: recursive make of niet. Als je volledig voor recursive make gaat, zal er altijd door de sub directories worden gelopen om alle targets bij te werken. Het lijkt me echter het verstandigst om dan ook gelijk van Automake gebruik te gaan maken.

Als je geen recusirve make wilt, dan zou je ook Makefiles kunnen gaan includen in de top-level Makefile. Dit zal er dan voor zorgen dat deze top-level Makefile kennis heeft van alle regels die jij in de Makefiles van subdirectories het gemaakt. Het probleem is daarbij dan wel dat de sources en targets in de subdirectories moeten verschijnen.

Hier onder een klein schetsje van hoe je dit zonder enige fancy trucjes kan doen. Als je het fraaier wilt doen moet je eens zoeken naar het implementeren van een non-recursive make. Als je geen bezwaar hebt tegen recursive make, zou ik gewoon dat gaan gebruiken. Ook is Automake wel aan te raden.

Makefile:
code:
1
2
3
4
5
6
7
8
.PHONY: docs

DIST_FILES=

distrib.tar: $(DIST_FILES)
    tar -cf $@ $(DIST_FILES)

include docs/Makefile


docs/Makefile
code:
1
2
3
4
docs/docs.html: docs/docs.xml
    cp $< $@

DIST_FILES+=docs/docs.html

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 19:20 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Eelis: het is volgens de manual niet verstandig om $(MAKE) door 'make' te vervangen.
Idd, op enkele platformen is er zowel een make als gmake. Als je in gmake opeens make gaat aanroepen, gebruik je opeens een andere implementatie. Doordat make MAKE set en jij die variabele gebruikt, weet je altijd zeker dat je recursief dezelfde make aanroept.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 11:06

Robtimus

me Robtimus no like you

dan gebruik je $(MAKE) -C docs docs.html
Ik doelde meer op het gebruik van -C ipv cd'en

[ Voor 7% gewijzigd door Robtimus op 12-07-2004 11:51 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 19:20 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Eelis: zonder daarmee te veroorzaken dat alle afhankelijke targets onnodig ge-update worden
Ah ja, het is nu duidelijk dat je op zich niks hebt tegen een recursive make (dacht even dat je bezig was met het ontlopen daarvan). Je gaf zelf eigenlijk al de aanzet tot een goede oplossing:
'docs/docs.html' valt af omdat distrib.tar dan niet ge-update wordt als docs.xml wordt aangepast.
Als je voor de dist recursief een "make all" aanroept op alle subdirs, dan zullen alle targets geupdate waarvan het default target afhankelijk van is. Dit is ook min of meer wat door het automatische all/install/dist targets gedaan wordt in Automake. Eigenlijk wordt een dist daar zelfs recursief opgebouwd: elke subdir plaatst de files die in de distributie moeten komen in een locale, tijdelijk directory. Het top-level pakt het hele zaakje alleen maar in.

Je kan dus twee dingen doen: een recursieve dist, of voor de top-level dist een recursieve make all, waarbij je dan wel in elke Makefile zulke default targets moet gaan aangeven.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 106% gewijzigd door Eelis op 18-02-2015 19:20 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Eelis: Het punt is eigenlijk dat ik het probleem liever locaal en bescheiden op wil lossen binnen de rules die betrekking hebben op de betreffende files, zonder terug te hoeven vallen op 'grootse'/'big-guns' oplossingen die meteen op alle subdirectories en met allerlei default targets werken..
Tja, je wilt iets lokaal oplossen, maar je wilt wel recursive gebruiken. Daarmee zeg je dus eigenlijk: ik wil recursieve maak, maar nu even niet. Als je je dependencies in de Makefiles van subdirectories definieert, dan kunnen die alleen *daar* gebruiken. Als je al die dependency kennis ook op top level wil hebben, dan moet je geen recursive make gebruiken (wat niet betekent dat je alle regels op top-level moet schrijven, zie m'n include oplossing).

De oplossing die je nu hebt lijkt me daarom eigenlijk wel redelijk in deze opzet. Make is een functionele taal, dus dingen als 'herhaald toepassen' kan je wel vergeten ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 19:20 ]


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 107% gewijzigd door Eelis op 18-02-2015 19:20 ]

Pagina: 1