Det där med makefile…

Här diskuteras programmering och utveckling
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Det där med makefile…

Inlägg av Johnny Rosenberg »

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:

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)/*~ 
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:

Kod: Markera allt

LIBS=-lm
Som den uppmärksamme ser, så använder jag dock inte bara mattebiblioteket, utan även sndfile:

Kod: Markera allt

$(CC) -o $@ $^ $(CFLAGS) $(LIBS) `pkg-config --libs sndfile`
Det är ju den där satsen med bakåtfnuttar jag vill åt här. Terminal:

Kod: Markera allt

$ `pkg-config --libs sndfile`
-lsndfile
Så vad jag vill göra, är att lägga till sndfile i variabeln LIB, så att den expanderas till:

Kod: Markera allt

-lm -lsndfile
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:

Kod: Markera allt

LIBS="-lm -lsndfile"
En lösning (av riktig nödlösningskaraktär) är ju att ha två variabler:

Kod: Markera allt

LIB1=-lm
LIB2=-lsndfile
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.
Senast redigerad av 2 Johnny Rosenberg, redigerad totalt 17 gång.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Det där med makefile…

Inlägg av Johnny Rosenberg »

Men va fan…!
Som vanligt kommer jag på svaret själv precis när jag skickat min korkade fråga: Man skiter helt enkelt i allt vad fnuttar heter; det funkar ändå… verkar det som när jag testat lite nu, i alla fall:

Kod: Markera allt

IDIR =../Inc
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=Obj
LDIR =../Lib

LIBS=-lm -lsndfile

_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)

.PHONY: clean
clean:
	rm -f $(ODIR)/*.o *~ core $(IDIR)/*~ 

Kod: Markera allt

Src$ make
gcc -c -o Obj/SoundMan.o SoundMan.c -I../Inc `pkg-config --cflags sndfile`
gcc -o SoundMan Obj/SoundMan.o Obj/Trim.o -I../Inc -lm -lsndfile
Src$ 
Jaha, då borde det bara vara att göra samma sak med CFLAGS också, med andra ord. ”`pkg-config --cflags sndfile`” verkar dock inte returnera något, så jag antar att det bara är att skippa den.

Kod: Markera allt

IDIR =../Inc
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=Obj
LDIR =../Lib

LIBS=-lm -lsndfile

_DEPS = Trim.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = SoundMan.o Trim.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
	$(CC) -c -o $@ $< $(CFLAGS)

SoundMan: $(OBJ)
	$(CC) -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean
clean:
	rm -f $(ODIR)/*.o *~ core $(IDIR)/*~ 

Kod: Markera allt

Src$ make
gcc -c -o Obj/SoundMan.o SoundMan.c -I../Inc
gcc -o SoundMan Obj/SoundMan.o Obj/Trim.o -I../Inc -lm -lsndfile
Src$ 
Verkar fungera, men jag har inte så värst mycket innehåll i min SoundMan.c och dess beroenden än, så man lär väl märka så småningom om man stöter på patrull…
Gör man det är det ju bara att skriva hit och i samma ögonblick man trycker ”Skicka” kommer man på 18 nya förslag att testa, varav det första funkar perfekt…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Skriv svar

Återgå till "Programmering och webbdesign"