1- QDL := qdl
2- RAMDUMP := qdl-ramdump
31VERSION := $(or $(VERSION ) , $(shell git describe --dirty --always --tags 2>/dev/null) , "unknown-version")
42
5- CFLAGS += -O2 - Wall -g ` pkg-config --cflags libxml-2.0 libusb-1.0 `
3+ CFLAGS += -Wall ` pkg-config --cflags libxml-2.0 libusb-1.0 `
64LDFLAGS += ` pkg-config --libs libxml-2.0 libusb-1.0 `
75ifeq ($(OS ) ,Windows_NT)
86LDFLAGS += -lws2_32
97endif
108prefix := /usr/local
119
10+ # Default build type
11+ BUILD_TYPE ?= debug
12+ BUILD_DIR = build/$(BUILD_TYPE )
13+ OBJ_DIR = $(BUILD_DIR ) /obj
14+ BIN_DIR = $(BUILD_DIR ) /bin
15+ GEN_DIR = $(BUILD_DIR ) /gen
16+
17+ QDL := qdl
1218QDL_SRCS := firehose.c io.c qdl.c sahara.c util.c patch.c program.c read.c sha2.c sim.c ufs.c usb.c ux.c oscompat.c vip.c sparse.c gpt.c
13- QDL_OBJS : = $(QDL_SRCS:.c=.o )
19+ QDL_OBJS = $(addprefix $( OBJ_DIR ) /, $( notdir $( QDL_SRCS:.c=.o ) ) )
1420
21+ RAMDUMP := qdl-ramdump
1522RAMDUMP_SRCS := ramdump.c sahara.c io.c sim.c usb.c util.c ux.c oscompat.c
16- RAMDUMP_OBJS : = $(RAMDUMP_SRCS:.c=.o )
23+ RAMDUMP_OBJS = $(addprefix $( OBJ_DIR ) /, $( notdir $( RAMDUMP_SRCS:.c=.o ) ) )
1724
1825KS_OUT := ks
1926KS_SRCS := ks.c sahara.c util.c ux.c oscompat.c
20- KS_OBJS : = $(KS_SRCS:.c=.o )
27+ KS_OBJS = $(addprefix $( OBJ_DIR ) /, $( notdir $( KS_SRCS:.c=.o ) ) )
2128
2229CHECKPATCH_SOURCES := $(shell find . -type f \( -name "* .c" -o -name "* .h" -o -name "* .sh" \) ! -name "sha2.c" ! -name "sha2.h" ! -name "*version.h" ! -name "list.h")
2330CHECKPATCH_ROOT := https://raw.githubusercontent.com/torvalds/linux/v6.15/scripts
@@ -26,41 +33,55 @@ CHECKPATCH_SP_URL := $(CHECKPATCH_ROOT)/spelling.txt
2633CHECKPATCH := ./.scripts/checkpatch.pl
2734CHECKPATCH_SP := ./.scripts/spelling.txt
2835
29- default : $(QDL ) $(RAMDUMP ) $(KS_OUT )
36+ default : debug
37+ all : debug release
38+
39+ release :
40+ $(MAKE ) BUILD_TYPE=release CFLAGS=' $(CFLAGS) -O2 -Ibuild/release/gen' _all_internal
41+
42+ debug :
43+ $(MAKE ) BUILD_TYPE=debug CFLAGS=' $(CFLAGS) -O0 -g -Ibuild/debug/gen' _all_internal
44+
45+ # Inner target that actually builds things with the chosen BUILD_TYPE
46+ _all_internal : dirs $(BIN_DIR ) /$(QDL ) $(BIN_DIR ) /$(RAMDUMP ) $(BIN_DIR ) /$(KS_OUT )
47+
48+ dirs :
49+ @mkdir -p $(OBJ_DIR ) $(BIN_DIR ) $(GEN_DIR )
50+
51+ $(OBJ_DIR ) /% .o : % .c
52+ $(CC ) $(CFLAGS ) -c $< -o $@
3053
31- $(QDL ) : $(QDL_OBJS )
54+ $(BIN_DIR ) / $( QDL ) : $(QDL_OBJS )
3255 $(CC ) -o $@ $^ $(LDFLAGS )
3356
34- $(RAMDUMP ) : $(RAMDUMP_OBJS )
57+ $(BIN_DIR ) / $( RAMDUMP ) : $(RAMDUMP_OBJS )
3558 $(CC ) -o $@ $^ $(LDFLAGS )
3659
37- $(KS_OUT ) : $(KS_OBJS )
60+ $(BIN_DIR ) / $( KS_OUT ) : $(KS_OBJS )
3861 $(CC ) -o $@ $^ $(LDFLAGS )
3962
4063compile_commands.json : $(QDL_SRCS ) $(KS_SRCS )
4164 @echo -n $^ | jq -snR " [inputs|split(\" \" )[]|{directory:\" $( PWD) \" , command: \" $( CC) $( CFLAGS) -c \(.)\" , file:.}]" > $@
4265
43- version.h : :
44- @echo " #define VERSION \" $( VERSION) \" " > .version.h
45- @cmp -s .version.h version.h || cp .version.h version.h
66+ $( GEN_DIR ) / version.h :
67+ @echo " #define VERSION \" $( VERSION) \" " > $( GEN_DIR ) / .version.h
68+ @cmp -s $( GEN_DIR ) / .version.h $( GEN_DIR ) / version.h || cp $( GEN_DIR ) / .version.h $( GEN_DIR ) / version.h
4669
47- util.o : version.h
70+ $( OBJ_DIR ) / util.o : $( GEN_DIR ) / version.h
4871
4972clean :
50- rm -f $(QDL ) $(QDL_OBJS )
51- rm -f $(RAMDUMP ) $(RAMDUMP_OBJS )
52- rm -f $(KS_OUT ) $(KS_OBJS )
73+ rm -rf build
5374 rm -f compile_commands.json
5475 rm -f version.h .version.h
5576 rm -f $(CHECKPATCH )
5677 rm -f $(CHECKPATCH_SP )
5778 if [ -d .scripts ]; then rmdir .scripts; fi
5879
59- install : $( QDL ) $( RAMDUMP ) $( KS_OUT )
80+ install : release
6081 install -d $(DESTDIR )$(prefix ) /bin
61- install -m 755 $^ $(DESTDIR )$(prefix ) /bin
82+ install -m 755 $( BIN_DIR ) / $( QDL ) $( BIN_DIR ) / $( RAMDUMP ) $( BIN_DIR ) / $( KS_OUT ) $(DESTDIR )$(prefix ) /bin
6283
63- tests : default
84+ tests : debug
6485tests :
6586 @./tests/run_tests.sh
6687
0 commit comments