Commented makefile
This commit is contained in:
parent
e4c5cc3a46
commit
315b59ec29
1 changed files with 34 additions and 2 deletions
36
makefile
36
makefile
|
|
@ -1,27 +1,46 @@
|
||||||
#!/usr/bin/make -f
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
|
# Target architecture for compilation
|
||||||
|
ARCH = native
|
||||||
|
|
||||||
|
# Optimization level
|
||||||
|
O = 3
|
||||||
|
|
||||||
|
# Flags for the compiler
|
||||||
FLAGS = -std=c23
|
FLAGS = -std=c23
|
||||||
FLAGS += -O3
|
FLAGS += -O$(O)
|
||||||
FLAGS += -march=native
|
FLAGS += -march=$(ARCH)
|
||||||
|
# Only override gcc default tuning if specified in make command line
|
||||||
|
ifneq (, $(TUNE))
|
||||||
|
FLAGS += -mtune=$(TUNE)
|
||||||
|
endif
|
||||||
FLAGS += -pedantic
|
FLAGS += -pedantic
|
||||||
FLAGS += -Wall
|
FLAGS += -Wall
|
||||||
FLAGS += -Wextra
|
FLAGS += -Wextra
|
||||||
FLAGS += -Werror
|
FLAGS += -Werror
|
||||||
|
# This flag is because of the compiler otherwise giving too much warning
|
||||||
FLAGS += -Wformat-truncation=0
|
FLAGS += -Wformat-truncation=0
|
||||||
|
|
||||||
|
# Compile flag for defining GITHASH to put at the end of the version string
|
||||||
GITFLAG = -D'GITHASH=$(shell git rev-parse --short=1 HEAD)'
|
GITFLAG = -D'GITHASH=$(shell git rev-parse --short=1 HEAD)'
|
||||||
|
|
||||||
|
# Directories where .o files and excecutables will be placed
|
||||||
OBJDIR = obj
|
OBJDIR = obj
|
||||||
OUTDIR = out
|
OUTDIR = out
|
||||||
|
|
||||||
|
# The UI to compile for by default using make run
|
||||||
#UI_TARGET = vt100
|
#UI_TARGET = vt100
|
||||||
UI_TARGET = ncurses
|
UI_TARGET = ncurses
|
||||||
|
|
||||||
|
# The URL of the plaintext version of the lisence, for the --license option
|
||||||
LICENSEURL = https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
LICENSEURL = https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
||||||
|
|
||||||
|
# C compiler
|
||||||
CC = cc
|
CC = cc
|
||||||
|
|
||||||
.NOTINTERMEDIATE:
|
.NOTINTERMEDIATE:
|
||||||
|
|
||||||
|
# Messages to print during different steps in making
|
||||||
MSG_FETCHING = FETCHING:
|
MSG_FETCHING = FETCHING:
|
||||||
MSG_LINKING = Linking:
|
MSG_LINKING = Linking:
|
||||||
MSG_COMPILING = Compiling C:
|
MSG_COMPILING = Compiling C:
|
||||||
|
|
@ -29,44 +48,57 @@ MSG_CLEANING = Cleaning:
|
||||||
MSG_CLEANING_OBJ = Cleaning $(OBJDIR):
|
MSG_CLEANING_OBJ = Cleaning $(OBJDIR):
|
||||||
MSG_CLEANING_OUT = Cleaning $(OUTDIR):
|
MSG_CLEANING_OUT = Cleaning $(OUTDIR):
|
||||||
|
|
||||||
|
# Compile for all UI targets
|
||||||
all: $(addprefix $(OUTDIR)/connect4_,ncurses.elf vt100.elf)
|
all: $(addprefix $(OUTDIR)/connect4_,ncurses.elf vt100.elf)
|
||||||
|
|
||||||
|
# Compile and run the default UI target
|
||||||
run: $(OUTDIR)/connect4_$(UI_TARGET).elf
|
run: $(OUTDIR)/connect4_$(UI_TARGET).elf
|
||||||
./$<
|
./$<
|
||||||
|
|
||||||
|
# Compile and run with a specific UI target
|
||||||
run_%: $(OUTDIR)/connect4_%.elf
|
run_%: $(OUTDIR)/connect4_%.elf
|
||||||
./$<
|
./$<
|
||||||
|
|
||||||
|
# Compile specifically the ncurses version
|
||||||
|
# This one's special because it needs -lncursesw
|
||||||
$(OUTDIR)/connect4_ncurses.elf: $(addprefix $(OBJDIR)/,ui_ncurses.o logic.o connect4.o LICENSE.o)
|
$(OUTDIR)/connect4_ncurses.elf: $(addprefix $(OBJDIR)/,ui_ncurses.o logic.o connect4.o LICENSE.o)
|
||||||
@echo $(MSG_LINKING) $@
|
@echo $(MSG_LINKING) $@
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
$(CC) $(FLAGS) -lncursesw -o $@ $^
|
$(CC) $(FLAGS) -lncursesw -o $@ $^
|
||||||
|
|
||||||
|
# Compile the final excecutable for a given UI target
|
||||||
$(OUTDIR)/connect4_%.elf: $(addprefix $(OBJDIR)/,ui_%.o logic.o connect4.o LICENSE.o)
|
$(OUTDIR)/connect4_%.elf: $(addprefix $(OBJDIR)/,ui_%.o logic.o connect4.o LICENSE.o)
|
||||||
@echo $(MSG_LINKING) $@
|
@echo $(MSG_LINKING) $@
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
$(CC) $(FLAGS) -o $@ $^
|
$(CC) $(FLAGS) -o $@ $^
|
||||||
|
|
||||||
|
# Make an object file for the license so it does not all need to be in the code
|
||||||
$(OBJDIR)/LICENSE.o: $(OBJDIR)/LICENSE
|
$(OBJDIR)/LICENSE.o: $(OBJDIR)/LICENSE
|
||||||
@echo $(MSG_LINKING) $@
|
@echo $(MSG_LINKING) $@
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
cd $(@D); ld -r -b binary -o $(@F) $(^F)
|
cd $(@D); ld -r -b binary -o $(@F) $(^F)
|
||||||
|
|
||||||
|
# Compile the object file of the main code.
|
||||||
|
# This one's special because it includes the git hash
|
||||||
$(OBJDIR)/connect4.o: connect4.c
|
$(OBJDIR)/connect4.o: connect4.c
|
||||||
@echo $(MSG_COMPILING) $^
|
@echo $(MSG_COMPILING) $^
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
$(CC) -c $(FLAGS) $(GITFLAG) -o $@ $^
|
$(CC) -c $(FLAGS) $(GITFLAG) -o $@ $^
|
||||||
|
|
||||||
|
# Generic object file compile
|
||||||
$(OBJDIR)/%.o: %.c
|
$(OBJDIR)/%.o: %.c
|
||||||
@echo $(MSG_COMPILING) $^
|
@echo $(MSG_COMPILING) $^
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
$(CC) -c $(FLAGS) -o $@ $^
|
$(CC) -c $(FLAGS) -o $@ $^
|
||||||
|
|
||||||
|
# Download the license file in non-markdown form.
|
||||||
|
# This is not cleaned as that would be too silly
|
||||||
$(OBJDIR)/LICENSE:
|
$(OBJDIR)/LICENSE:
|
||||||
@echo $(MSG_FETCHING) $@
|
@echo $(MSG_FETCHING) $@
|
||||||
curl $(LICENSEURL) \
|
curl $(LICENSEURL) \
|
||||||
| sed -n '/END OF TERMS AND CONDITIONS/q;p' > $(OBJDIR)/LICENSE
|
| sed -n '/END OF TERMS AND CONDITIONS/q;p' > $(OBJDIR)/LICENSE
|
||||||
|
|
||||||
|
# Remove all compilation output and intermediate files
|
||||||
clean:
|
clean:
|
||||||
@echo $(MSG_CLEANING)
|
@echo $(MSG_CLEANING)
|
||||||
@echo $(MSG_CLEANING_OBJ)
|
@echo $(MSG_CLEANING_OBJ)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue