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:
Code: Alles auswählen
make
Code: Alles auswählen
make
Code: Alles auswählen
make DBG=1
Code: Alles auswählen
make DBG=1
Code: Alles auswählen
make
Code: Alles auswählen
make
[...]
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)
MfG