Makefile Madness!

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
I.C.Wiener
Beiträge: 674
Registriert: 19.08.2003 18:45:35

Makefile Madness!

Beitrag von I.C.Wiener » 07.11.2008 14:49:02

Moin,

seit ein paar Tagen zerbreche ich mir den Kopf über ein Makefile.
Ich möchte mit einem Parameter steuern, ob das Programm mit Debug gebaut wird oder nicht.
Zusätzlich soll das Makefile merken, wenn das Projekt zuvor mit/ohne Debug gebaut wurde und nun ohne/mit Debug, also die Auswahl geändert wurde. Dazu lege ich eine Datei an. Existiert diese, wurde das Projekt mit Debug gebaut. Existiert diese nicht, ohne.

Das nun in dem Makefile irgendwie zusammen zu bringen war echt heftig. Es gibt -zig Wege und keiner davon hat bei mir funktioniert. Also habe ich nun einen in meinen Augen fast unlesbaren Block, der aber (eigentlich) seine Arbeit tut.

Das einzige Problem, das jetzt noch verbleibt, ist, dass ich das Projekt immer zweimal erstellen muss.
Beispiel: Programm ist ohne Debug gebaut Programm bereits aktuell

Code: Alles auswählen

make DBG=1
Programm ist immer noch ohne Debug gebaut (das config-Target wurde ausgeführt)

Code: Alles auswählen

make DBG=1
Programm ist mit Debug gebaut (das config-Target wurde nicht mehr ausgeführt) Programm ist mit Debug gebaut (das config-Target wurde ausgeführt) Programm ist ohne Debug gebaut (das config-Target wurde nicht mehr ausgeführt)
[...]

Irgendwie blicke ich da gerade nicht mehr durch.
Hier ist das Makefile (nicht erschrecken):

Code: Alles auswählen

SRCS=main.c                                
HDRS=debug.h                               
OBJS=$(SRCS:%.c=%.o)                       
APP=fsh                                    
CP=/bin/cp
DEL_FILE=/bin/rm -f
CC=/usr/bin/gcc
CFLAGS=-Wall -pedantic -std=c99 -pipe -c

# WARNING: Reading the next 15 lines may cause brain cancer or
# at least makes you cry a little bit inside!!!               
DID_DEBUG=$(wildcard was_built_with_debug)                    

ifneq ($(DBG),) # If DBG is set
ifeq ($(DID_DEBUG),) # If DID_DEBUG is not set
CFG_TOUCH_FILES=$(SRCS) $(HDRS) was_built_with_debug
CFG_TARGET=config                                   
endif                                               
DEBUG=-g -O0 -DDEBUG                                
else # If DBG is not set                            
ifneq ($(DID_DEBUG),) # If DID_DEBUG is set         
CFG_RM_FILES=was_built_with_debug                   
CFG_TOUCH_FILES=$(SRCS) $(HDRS)
CFG_TARGET=config
endif
DEBUG=
endif

LD=/usr/bin/gcc
LDFLAGS=-lc

$(APP): $(OBJS) $(HDRS) $(CFG_TARGET) # Does $(HDRS) have to be here if it contains inline functions?
        @echo == In Main Target: $(DID_DEBUG)\; $(DBG)\; $(DEBUG)
        $(LD) $(OBJS) $(HDRS) -o $@ $(LDFLAGS)

%.o: %.c
        $(CC) $(CFLAGS) $(DEBUG) $<

.PHONY: config
config:
        @echo == In Config Target
        rm $(CFG_RM_FILES)
        touch $(CFG_TOUCH_FILES)
Danke für's Lesen. Vielleicht weiß ja jemand einen Rat. :)

MfG
Who is... LAIN?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Makefile Madness!

Beitrag von gms » 07.11.2008 20:44:54

Makefile lasse ich mir eigentlich lieber generieren, z.B cmake gefällt mir da besonders gut.

Ich habe aber früher auch oft mit Makefiles herumgebastelt, viel weiß ich zwar nicht mehr, aber der Grund warum du wahrscheinlich zweimal das "make" anwerfen mußt, dürfte in der falschen Reihenfolge der Dependencies vom $(APP) Target liegen. So baust du zuerst die $(OBJS) und danach werden im $(CFG_TARGET) die $(SRCS) und $(HDRS) "getoucht".

Dieses "Getouche" gefällt mir überhaupt nicht. Dadurch können die Abhängigkeiten nicht mehr korrekt erkannt werden, stattdessen kannst du auch ein "clean" Target aufrufen.

Übrigens auch mit einem "simplen Makefile" kann der Sourcecode unter Berücksichtigung der Abhängigkeiten, also nur wenn sich an diesen etwas geändert hat, compiliert werden. Bei meinen von "automake" abgeschauten Beispiel sind dafür die "*.Po" Dateien zuständig, die über den gcc generiert werden können:
http://nopaste.debianforum.de/14739

Gruß
gms

Benutzeravatar
I.C.Wiener
Beiträge: 674
Registriert: 19.08.2003 18:45:35

Re: Makefile Madness!

Beitrag von I.C.Wiener » 07.11.2008 23:39:21

Moin,

das Makefile sieht sauberer aus. Das werde ich mir mal genauer anschauen, danke. :)
Inzwischen habe ich mein Makefile zwar auch schon wieder etwas entrümpelt und lesbarer gemacht,
aber es tut immer noch nicht ganz, was es soll.

MfG
Who is... LAIN?

Antworten