diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f771f6d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "lib/glfw"] + path = lib/glfw + url = https://github.com/glfw/glfw +[submodule "lib/libarchive"] + path = lib/libarchive + url = https://github.com/libarchive/libarchive diff --git a/Makefile b/Makefile index 83bd78a..55edc4b 100644 --- a/Makefile +++ b/Makefile @@ -1,102 +1,83 @@ # Copyright (c) 2025 Quinn # Licensed under the MIT Licence. See LICENSE for details -SHELL = bash -.SHELLFLAGS = -O globstar -c # build configuration, information about the current build process NAME = mcaselector-lite -VERSION = 0.0.0 DEBUG ?= 0 CC ?= cc LD ?= ld -# compilation flags -CFLAGS += -c -std=gnu99 -Wall -Wextra -Wpedantic -MMD -MP -LDFLAGS += -flto +# setting default compilation flags +# some of which are able to be overwritten, others are always appended +CPPFLAGS ?= +CFLAGS ?= -O2 -Wall -Wextra -Wpedantic +LDFLAGS ?= -flto +CFLAGS += -std=gnu99 -# architecture/OS detection -ifeq ($(KERNEL),) -ISWIN := $(if $(filter $(OS),Windows_NT),1,0) -ifeq ($(ISWIN),1) -KERNEL = mingw -MARCH = x86_64 +# add a few extra flags depending on whether +# we're debugging or not +ifeq ($(DEBUG),0) +CPPFLAGS += -DNDEBUG else -MARCH := $(shell uname -m) -KERNEL := $(shell uname -s | tr '[:upper:]' '[:lower:]') +CFLAGS += -fsanitize=address -ftrapv -g +LDFLAGS += -fsanitize=address -ftrapv endif -else -ISWIN := $(if $(filter $(KERNEL),mingw),1,0) -endif -ifeq ($(MARCH),) -$(error must also set MARCH when manually setting KERNEL) +CPPFLAGS += -Iinclude -Ilib/glad/include -Ilib/glfw/include -Ilib/libarchive/libarchive +LDFLAGS += -Lobj/lib/glfw/src -Lobj/lib/libarchive/libarchive +LDLIBS += -lm -lglfw -larchive + +# detect if we're compiling on Windows, meaning +# a lot of things considered "standard" are unavailable. +ifeq ($(OS),Windows_NT) +ISWIN = 1 +NAME := $(NAME).exe +$(warning Detected Windows_NT, please refer to the documentation if you encounter issues.) endif -# profiles -ifeq ($(DEBUG),1) -PROF = dbg -CFLAGS += -UNDEBUG -Og -g -Wextra -Wpedantic -CFLAGS += $(if $(filter 1,$(ISWIN)),,-fsanitize=address,undefined) -ftrapv -LDFLAGS += $(if $(filter 1,$(ISWIN)),,-fsanitize=address,undefined) -ftrapv -# |--profile: testing -else ifeq ($(DEBUG),test) -PROF = test -CFLAGS += -UNDEBUG -O2 -g -CFLAGS += $(if $(filter 1,$(ISWIN)),,-fsanitize=address) -ftrapv -LDFLAGS += $(if $(filter 1,$(ISWIN)),,-fsanitize=address) -ftrapv -else -PROF = rel -CFLAGS += -DNDEBUG -O2 -endif +# TODO: find a better method to find all source files +# find all the source files using wildcards +# NOTE: MS-DOS and MS-Windows uses backslash `\`, this might break. +RES := $(wildcard res/*) +SRC := $(wildcard src/*.c src/*/*.c src/*/*/*.c src/*/*/*/*.c src/*/*/*/*/*.c src/*/*/*/*/*/*.c src/*/*/*/*/*/*/*.c src/*/*/*/*/*/*/*/*.c) lib/glad/gl.c +OBJ := $(SRC:%.c=obj/%.o) $(RES:%=obj/%.o) +TSRC := $(wildcard test/*.c test/*/*.c test/*/*/*.c test/*/*/*/*.c test/*/*/*/*/*.c test/*/*/*/*/*/*.c test/*/*/*/*/*/*/*.c test/*/*/*/*/*/*/*/*.c) +TOBJ := $(TSRC:%.c=obj/%.o) -CFLAGS += $(shell pkg-config --cflags glfw3 libarchive) -Iinclude -Ilib/glad/include -LDFLAGS += $(shell pkg-config --libs glfw3 libarchive) -lm - -# get source files -SRC := $(shell echo src/**/*.c) lib/glad/src/gl.c -RES := $(wildcard res/*.glsl) -ifeq ($(DEBUG),test) -SRC := $(filter-out src/main.c, $(SRC)) $(shell echo test/**/*.c) -endif - -NAME += $(if $(filter 1,$(ISWIN)),.exe,) -DIR_BIN := bin/$(MARCH)-$(KERNEL)/$(VERSION)/$(PROF) -DIR_OBJ := obj/$(MARCH)-$(KERNEL)/$(VERSION)/$(PROF) - -# output files -BIN := $(DIR_BIN)/$(NAME) -OBJ := $(SRC:%.c=$(DIR_OBJ)/%.o) $(RES:%=$(DIR_OBJ)/%.o) -DEP := $(OBJ:%.o=%.d) - -.PHONY: -run: compile - $(if $(filter 1,$(ISWIN)),wine,) $(BIN) - -.PHONY: -compile: $(BIN) - -.PHONY .NOTPARALLEL: +.PHONY: all test clean libs +all: bin/$(NAME) +libs: obj/lib/glfw/ obj/lib/libarchive/ +test: bin/TEST_$(NAME); bin/TEST_$(NAME) clean: - @[ -d obj/ ] && rm -rv obj/ || true - @[ -d bin/ ] && rm -rv bin/ || true + @[ -d bin/ ] && rm -vr bin/ || true + @[ -d obj/ ] && rm -vr obj/ || true -$(BIN): $(OBJ) - $(info [CC/LD] $@) - @mkdir -p $(@D) - @$(CC) -o $@ $^ $(LDFLAGS) +# compiles the libraries using cmake +obj/lib/%/: lib/%/ + cmake -S $< -B $@ + $(MAKE) -C $@ -$(DIR_OBJ)/%.o: %.c - $(info [CC] $@) +# link together a runtime binary +bin/$(NAME): libs $(OBJ) + $(info [CC/LD] $@) @mkdir -p $(@D) - @$(CC) $(CFLAGS) -o $@ $< + @$(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) -$(DIR_OBJ)/res/%.o: res/% - $(info [LD] $@) +# link together a testing binary +bin/TEST_$(NAME): $(TOBJ) $(filter-out main.o,$(OBJ)) + $(info [CC/LD] $@) @mkdir -p $(@D) + @$(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) + +obj/res/%.o: res/% + $(info [LD] $@) @$(LD) -r -b binary -o $@ $< -# some definitions for "default" and assumed compilers, for bulk selection -.PHONY: x86_64-linux-gnu-gcc x86_64-w64-mingw32-gcc -x86_64-linux-gnu-gcc:; $(MAKE) $(CALL) $(MAKEFLAGS) CC=$@ MARCH=x86_64 KERNEL=linux -x86_64-w64-mingw32-gcc:; $(MAKE) $(CALL) $(MAKEFLAGS) CC=$@ MARCH=x86_64 KERNEL=mingw +obj/%.o: %.c + $(info [CC] $@) + @mkdir -p $(@D) + @$(CC) -c $(CPPFLAGS) $(CFLAGS) -MMD -MP -o $@ $< --include $(DEP) +# Include the generated dependency files. +# Which creates rules for all dependencies, +# as a result updating an .o file when a .h is updated. +-include $(OBJ:%.o=%.d) diff --git a/lib/glfw b/lib/glfw new file mode 160000 index 0000000..7b6aead --- /dev/null +++ b/lib/glfw @@ -0,0 +1 @@ +Subproject commit 7b6aead9fb88b3623e3b3725ebb42670cbe4c579 diff --git a/lib/libarchive b/lib/libarchive new file mode 160000 index 0000000..9525f90 --- /dev/null +++ b/lib/libarchive @@ -0,0 +1 @@ +Subproject commit 9525f90ca4bd14c7b335e2f8c84a4607b0af6bdf