## ## Gem-graph OpenGL experiments ## ## Desc: Makefile ## ## Copyright (C) 2023 Arthur Menges ## Copyright (C) 2023 Adrien Bourmault ## ## This file is part of Gem-graph. ## ## This program is free software: you can redistribute it and/or modify ## it under the terms of the GNU Affero General Public License as published by ## the Free Software Foundation, either version 3 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU Affero General Public License for more details. ## ## You should have received a copy of the GNU Affero General Public License ## along with this program. If not, see . ## .PHONY: all clean install run build_system .DELETE_ON_ERROR: $(BINDIR)/gem-graph-client .DEFAULT_GOAL := all # # Color codes # CL='\033[0;32m' CL2='\033[1;36m' CL3='\033[0m' NC='\033[1;37m' # # Variables & constants # NTHREADS= $(shell nproc) CC=gcc WARNINGS= -Wall DEBUG= -ggdb -fno-omit-frame-pointer -fdiagnostics-color=always OPTIMIZE= -O3 INCLUDE= $(shell pkg-config --cflags glib-2.0 libxml-2.0 gtk4) -I libide/core LIBS= $(shell pkg-config --libs glib-2.0 libxml-2.0 gtk4) -lGL -lGLU -lm -lepoxy -lX11 -lGLEW BINDIR=bin BUILDDIR=build SRCDIR=src LIBIDEDIR=libide #vpath %.c $(SRCDIR) SOURCES=$(shell find $(SRCDIR) -type f -name "*.c") LIBIDESOURCES=$(shell find $(LIBIDEDIR) -type f -name "*.c") LIBIDESOURCES=$(LIBIDESOURCES) $(shell find $(LIBIDEDIR) -type f -name "*.in") BUILDBINS=$(patsubst %.c,$(BUILDDIR)/%.o,$(SOURCES)) BUILDDEPS=$(patsubst %.c,$(BUILDDIR)/%.d,$(SOURCES)) LIBIDEBUILDBINS=$(patsubst %.c,$(LIBIDEDIR)/%.o,$(SOURCES)) LIBIDEBUILDDEPS=$(patsubst %.c,$(LIBIDEDIR)/%.d,$(SOURCES)) -include /etc/os-release # # Directories # $(BUILDDIR): @mkdir -p $@ @echo -e ${CL2}[$@] ${CL}folder generated.${CL3} $(LIBIDEDIR): @mkdir -p $@ @echo -e ${CL2}[$@] ${CL}folder generated.${CL3} $(BINDIR): @mkdir -p $@ @echo -e ${CL2}[$@] ${CL}folder generated.${CL3} # # Dependencies # -include $(LIBIDEBUILDDEPS) -include $(BUILDDEPS) $(BUILDDIR)/%.d: %.c | $(BUILDDIR) @mkdir -p $(shell dirname $@) @$(CC) $(INCLUDE) -MM -MT $(@:%.d=%.o) -MF $@ $< @echo -e ${CL2}[$@] ${CL}dependencies generated.${CL3} $(LIBIDEDIR)/%.d: %.c | $(LIBIDEDIR) @mkdir -p $(shell dirname $@) @$(CC) $(INCLUDE) -MM -MT $(@:%.d=%.o) -MF $@ $< @echo -e ${CL2}[$@] ${CL}dependencies generated.${CL3} # # Compilation # $(BINDIR)/gem-graph-client: $(LIBIDEBUILDBINS) $(BUILDBINS) | $(BINDIR) @$(CC) -o $@ $(WARNINGS) $(DEBUG) $(OPTIMIZE) $^ $(INCLUDE) $(LIBS) @echo -e ${CL2}[$@] ${CL}built.${CL3} $(BUILDDIR)/%.o: %.c | $(BUILDDIR) @mkdir -p $(shell dirname $@) @$(CC) $(WARNINGS) $(DEBUG) $(OPTIMIZE) $(INCLUDE) -c $< -o $@ @echo -e ${CL2}[$@] ${CL}compiled.${CL3} $(LIBIDEDIR)/%.o: %.c | $(LIBIDEDIR) @mkdir -p $(shell dirname $@) @$(CC) $(WARNINGS) $(DEBUG) $(OPTIMIZE) $(INCLUDE) -c $< -o $@ @echo -e ${CL2}[$@] ${CL}compiled.${CL3} # # Virtual recipes # clean: @rm -rf $(BINDIR) @rm -rf $(BUILDDIR) @echo -e ${CL2}[$@] ${CL}done.${CL3} install: echo "Installing is not supported" ifeq ($(ID), guix) build_system: @echo -e ${CL2}[$@] ${CL}building through containerized manifest...${CL3} @guix shell --container -m ./manifest.scm -- make $(BINDIR)/gem-graph-client -j $(NTHREADS) @echo -e ${CL2}[$@] ${CL}done.${CL3} else build_system: @echo -e ${CL2}[$@] ${CL}building...${CL3} @make $(BINDIR)/gem-graph-client -j $(NTHREADS) @echo -e ${CL2}[$@] ${CL}done.${CL3} endif run: build_system @echo -e ${CL2}[$@] ${CL}executing...${CL3} @$(BINDIR)/gem-graph-client @echo -e ${CL2}[$@] ${CL}done.${CL3} debug: build_system @echo -e ${CL2}[$@] ${CL}executing...${CL3} @gdb $(BINDIR)/gem-graph-client @echo -e ${CL2}[$@] ${CL}done.${CL3} valgrind: build_system @echo -e ${CL2}[$@] ${CL}executing...${CL3} @valgrind $(BINDIR)/gem-graph-client @echo -e ${CL2}[$@] ${CL}done.${CL3} all: build_system @echo -e ${CL2}[$@] ${CL}done.${CL3}