• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

GNUmake vs BSDmake: target pattern mit %?

dettus

Bicycle User
Themenstarter #1
Hallo!

Ich bin gerade wieder ein wenig am coden.
Ich habe folgendes Problem, vielleicht kann mir einer von Euch helfen:

In meinem Makefile habe ich verschiedene checks.

Code:
check.none:
    echo OK

check.low_ansi:
    echo OK

check.low_ansi2:
    echo OK

check.sixel:
    echo OK

check: check.none check.low_ansi check.low_ansi2 check.sixel
    echo "Alle checks OK"
WieManLeichtSieht(tm) machen die checks im Grunde genommen alles das gleiche. (Okay, ich muss zugegeben ich trickse noch ein wenig mit $@ substituttionen rum....) Aber die Kommandos sind tatsaechlich IDENTISCH.

Daher habe ich mir gedacht, dass ich vielleicht sowas machen koennte.

Code:
check.%:
    echo OK

check: check.none check.low_ansi check.low_ansi2 check.sixel
    echo "Alle checks OK"
Bei GNUmake funktioniert das. Bei BSDmake kommt ein
Code:
make: don't know how to make none.check (prerequisite of: check)
hat irgendjemand eine Idee? .for habe ich auch probiert, leider funktioniert das nur bei BSDmake. Aber nicht bei GNUmake.
 

Zirias

Well-Known Member
#2
BSD make kennt diese Form von Pattern-Rules nicht. Im Allgemeinen ist es meiner Meinung nach ab einer gewissen Komplexität sinnlos, ein Makefile "portierbar" halten zu wollen. Entweder man entscheidet sich für ein bestimmtes "make", oder man verwendet ein anderes Buildsystem (das dann eventuell auch portierbare Makefiles generieren kann, wie z.B. autotools, cmake, ...)
 

dettus

Bicycle User
Themenstarter #3
Hmm... ein .c.o: target funktioniert ja auch auf beiden Systemen. Was ist das eigentlich fuer ein Konstrukt?
 

Zirias

Well-Known Member
#4
Das ist eine "suffix rule". Bedeutet das gleiche wie in GNU make "%.o: %.c". Ist eben nicht besonders flexibel, es funktioniert nur mit suffixes und weitere prerequisites sind auch nicht möglich.
 

PhysChemist

Well-Known Member
#5
Hallo,

ich löse gelegentlich ähnlich gelagerte Probleme mit .for-Schleifen.

Damit müsstest Du die Check-Subtypen nur noch in einer Vaiable spechern

Code:
CHECKS=none low_ansi low_ansi2 sixel

.for __C in ${CHECKS}
SUBCHECKS += check.${__C}
check.${__C}:
    echo OK
.endfor

check: ${SUBCHECKS}
    echo "Alle checks OK"
Das ist jetzt nicht getestet. Aber einfachere Lösungen für automatische Targets habe ich für mich noch nicht gefunden.

MfG
PhysChemist
 

dettus

Bicycle User
Themenstarter #6
Ja, eine .for schleife waere eine Loesung. Leider ist das wieder eine, die BSD make kann. Und GNU make nicht.

Mittlerweile habe ich auch schon das hier als Konstrukt gefunden:

Code:
{none,low_ansi,low_ansi2,sixel}.check:
    echo OK
was auch wieder nur bei BSD make funktioniert. *grmpf*
 

Zirias

Well-Known Member
#7
Wie gesagt, der Versuch, komplexere Dinge in "portable make" zu machen, ist zum scheitern verurteilt ;) Schau dir an, was bei den GNU autotools am Ende für Makefiles rauskommen -- das hat einen Grund :)

Wenn du direkt "make" verwenden willst, würde ich empfehlen, für das Projekt festzulegen, welches Make es sein muss. Meistens fällt die Wahl dann auf GNU make, weil das einfach verbreiteter ist und auch problemlos auf allen *BSD Systemen verfügbar.