Det där med makefile…
Postat: 17 mar 2012, 18:33
Okej, har gjort lite efterforskning i ämnet men har några frågetecken som jag inte lyckats räta ut trots idoga försök medelst sökning och liknande.
För att ta ett exempel, så har jag lyckats få till följande fullt fungerande (än så länge) make-fil som är tänkt att kompilera ett litet program jag kallar för SoundMan:
Det mesta här är ju snott från annat håll och anpassat till mina behov.
Har märkt att en make-fil inte verkar fungera som ett skalskript, så vissa saker man är van att göra med skalskript verkar alltså inte gå att göra i en make-fil. Ett exempel är då tilldelningen av variabler, exempelvis:
Som den uppmärksamme ser, så använder jag dock inte bara mattebiblioteket, utan även sndfile:
Det är ju den där satsen med bakåtfnuttar jag vill åt här. Terminal:
Så vad jag vill göra, är att lägga till sndfile i variabeln LIB, så att den expanderas till:
Alla försök till detta har dock varit fruktlösa. Det går ju exempelvis inte att, som i ett skalskript, använda dubbelfnuttar:
En lösning (av riktig nödlösningskaraktär) är ju att ha två variabler:
Men en av tankarna med variabler är ju att det ska vara enkelt att redigera make-filen, och det blir det ju inte här om vi exempelvis senare vill införa ett tredje bibliotek; då måste vi ju lik förbaskat in och härja på flera ställen i texten.
Någon som har ett bättre förslag?
Har sökt som en gredelin liten tant (vilket ju är anmärkningsvärd med tanke på att varken kön eller färg stämmer…), men bara funnit hur man inkluderar flera bibliotek när man kompilerar manuellt med exempelvis gcc, inte i en make-fil vid användande av variabler.
För att ta ett exempel, så har jag lyckats få till följande fullt fungerande (än så länge) make-fil som är tänkt att kompilera ett litet program jag kallar för SoundMan:
Kod: Markera allt
IDIR =../Inc
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=Obj
LDIR =../Lib
LIBS=-lm
_DEPS = Trim.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = SoundMan.o Trim.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS) `pkg-config --cflags sndfile`
SoundMan: $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LIBS) `pkg-config --libs sndfile`
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(IDIR)/*~
Har märkt att en make-fil inte verkar fungera som ett skalskript, så vissa saker man är van att göra med skalskript verkar alltså inte gå att göra i en make-fil. Ett exempel är då tilldelningen av variabler, exempelvis:
Kod: Markera allt
LIBS=-lm
Kod: Markera allt
$(CC) -o $@ $^ $(CFLAGS) $(LIBS) `pkg-config --libs sndfile`
Kod: Markera allt
$ `pkg-config --libs sndfile`
-lsndfile
Kod: Markera allt
-lm -lsndfile
Kod: Markera allt
LIBS="-lm -lsndfile"
Kod: Markera allt
LIB1=-lm
LIB2=-lsndfile
Någon som har ett bättre förslag?
Har sökt som en gredelin liten tant (vilket ju är anmärkningsvärd med tanke på att varken kön eller färg stämmer…), men bara funnit hur man inkluderar flera bibliotek när man kompilerar manuellt med exempelvis gcc, inte i en make-fil vid användande av variabler.