makefile: pattern in target extrahieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

makefile: pattern in target extrahieren

Beitrag von reox » 14.03.2022 16:11:39

Ich möchte in einem Makefile verschiedene png Bilder aus einem svg erzeugen, etwa so:

Code: Alles auswählen

bild_300_de.png: bild_de.svg
	inkscape -d 300 -C -o $@ $<
bild_300_en.png: bild_en.svg
	inkscape -d 300 -C -o $@ $<
bild_de.svg: bild.svg
	# ...
bild_en.svg: bild.svg
	# ...
[...]
das klappt ja auch alles wunderbar, aber jetzt will ich zB 150, 300 und 600 dpi erzeugen und auch die de/en in eine regel zusammenfassen.

Nun kann ich zumindest sowas machen:

Code: Alles auswählen

bild_%_de.png: bild.svg
	inkscape -d $* -C -o $@ $<
und dies funktioniert auch:

Code: Alles auswählen

bild_300_%.png: bild_%.svg
	inkscape -d 300 -C -o $@ $<
Nur kann man auch irgendwie beides zusammen haben? Oder hilft es da nur sich die regeln on-the-fly generiern zu lassen?

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: makefile: pattern in target extrahieren

Beitrag von paedubucher » 24.03.2022 16:40:33

Ich verweise mal auf diese Diskussion vom letzten Herbst. Wenn es nicht portabel zu sein braucht, hatte da JTH eine ansprechende Lösung.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: makefile: pattern in target extrahieren

Beitrag von reox » 25.03.2022 11:07:21

hmm so ganz wird mir nicht klar wie mir das hilft :?
Um das an dein Beispiel anzugleichen wäre das in etwa so wie wenn ich aus einer Markdowndatei, PDFs in A4 und letter in jeweils zwei sprachen machen will - je nach dem wie das target benannt ist. Das Problem ist ja, ich kann mit den Wildcards nicht arbeiten, weil im Make mehrere variablen geben müsste und sowas geht offenbar nicht.

Ich hab ja eine source datei und will dann parameter angeben, welche datei da raus kommt, zB so:

Code: Alles auswählen

bild.svg + (de, 300, png) --> bild_300_de.png
bild.svg + (en, 600, tiff) --> bild_600_en.tiff
Mir scheint der einzige weg ist sich mit eval, call und einer funktion die targets selber zu bauen - wobei das alles sehr umständlich ist. Da schreib ich mir lieber schnell ein python script, welches dann das makefile generiert :D
Der Make weg geht vermutlich per https://stackoverflow.com/questions/101 ... ver-a-list und https://stackoverflow.com/questions/977 ... -makefiles

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: makefile: pattern in target extrahieren

Beitrag von JTH » 25.03.2022 12:10:08

reox hat geschrieben: ↑ zum Beitrag ↑
25.03.2022 11:07:21
Da schreib ich mir lieber schnell ein python script, welches dann das makefile generiert :D
Oder, wenn du schon soweit bist, einfach ein Skript, dass direkt anhand übergebener Parameter, anstatt aus den Zieldateinamen herausgelesen, die Dateien erzeugt. Könnte der einfachere Weg sein.

Aber zu deinem Ansatz mit Makefile: Welche Parameter dabei sind denn vorher bekannt oder zumindest die Liste der Möglichkeiten beschränkt (und damit bekannt)? Gibt es nur de und en als Sprache (nehme mal an, dass es ein Sprachkürzel ist)? Ist die Liste der DPI auch beschränkt oder wäre das ein völlig beliebiger Parameter? Oder möchtest du beides – und anscheinend ja auch den Zieldateityp – wirklich völlig frei angeben können? Bei letzterem wär ein Skript wahrscheinlich leichter.
Manchmal bekannt als Just (another) Terminal Hacker.

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: makefile: pattern in target extrahieren

Beitrag von reox » 25.03.2022 16:58:17

der Usecase ist aktuell das ich eine gewisse Liste an oft gebrauchten Varianten vorgeneriere. Also ja, die Parameter sind bekannt - ich wollte nur vermeiden 100 zeilen makefile zu schreiben ;)

aber es kann auch sein, dass jemand eine spezialkonfiguration braucht (kA en, 72dpi, jpeg2000) und dann wärs nett, wenn das sofort bereit steht. Da wäre dann ein script sicherlich besser.

Antworten