Updated Makefile for conditional compilation and recursive pattern searching

This commit is contained in:
Jonathan Moallem 2020-12-03 12:47:08 +11:00
parent 2002bb961b
commit 828d38f16e
6 changed files with 50 additions and 48 deletions

View File

@ -15,12 +15,12 @@ jobs:
- name: make setup
run: make setup
- name: make compile
run: make compile
- name: make bin/app
run: make bin/app
- name: make clean
run: make clean
- name: make compile CXX=g++
run: make compile CXX=g++
- name: make bin/app CXX=g++
run: make bin/app CXX=g++
- name: make clean
run: make clean

View File

@ -19,12 +19,12 @@ jobs:
- name: make setup
run: make setup
- name: make compile
run: make compile
- name: make bin/app
run: make bin/app
- name: make clean
run: make clean
- name: make compile CXX=g++
run: make compile CXX=g++
- name: make bin/app CXX=g++
run: make bin/app CXX=g++
- name: make clean
run: make clean

View File

@ -1,4 +1,3 @@
name: Windows
on:
@ -18,18 +17,18 @@ jobs:
run: mingw32-make setup
shell: cmd
- name: make compile
run: mingw32-make compile
- name: make bin/app
run: mingw32-make bin/app
shell: cmd
- name: make clean
run: mingw32-make clean
shell: cmd
- name: make compile CXX=g++
run: mingw32-make compile CXX=g++
- name: make bin/app CXX=g++
run: mingw32-make bin/app CXX=g++
shell: cmd
- name: make clean
run: mingw32-make clean
shell: cmd
shell: cmd

3
.gitignore vendored
View File

@ -1,3 +1,4 @@
include
lib
build
bin
.idea

View File

@ -1,13 +1,21 @@
# Set general macros
buildFile = build/app
# Define custom functions
rwildcard = $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))
# Set global macros
buildDir = bin
executable = app
target = $(buildDir)/$(executable)
sources = $(call rwildcard,src/,*.cpp)
objects = $(patsubst src/%, $(buildDir)/%, $(patsubst %.cpp, %.o, $(sources)))
compileFlags = -std=c++17 -I include
linkFlags = -L lib/$(platform) -l raylib
# Check for Windows
ifeq ($(OS), Windows_NT)
# Set Windows macros
platform = Windows
compiler = g++
options = -pthread -lopengl32 -lgdi32 -lwinmm -mwindows
sources = src/main.cpp
CXX ?= g++
linkFlags += -pthread -lopengl32 -lgdi32 -lwinmm -mwindows
THEN = &&
else
# Check for MacOS/Linux
@ -15,33 +23,26 @@ else
ifeq ($(UNAMEOS), Linux)
# Set Linux macros
platform = Linux
compiler = g++
options = -l GL -l m -l pthread -l dl -l rt -l X11
libGenDirectory = # Empty
CXX ?= g++
linkFlags += -l GL -l m -l pthread -l dl -l rt -l X11
endif
ifeq ($(UNAMEOS), Darwin)
# Set macOS macros
platform = macOS
compiler = clang++
options = -framework CoreVideo -framework IOKit -framework Cocoa -framework GLUT -framework OpenGL
libGenDirectory = src
CXX ?= clang++
linkFlags += -framework CoreVideo -framework IOKit -framework Cocoa -framework GLUT -framework OpenGL
libGenDir = src
endif
# Set UNIX macros
sources = $(shell find src -type f -name '*.cpp')
THEN = ;
endif
# Explicitly set compiler to platform default if unset
ifeq ($(CXX),)
CXX = $(compiler)
endif
# Lists phony targets for Makefile
.PHONY: all setup submodules compile execute clean
.PHONY: all setup submodules execute clean
# Default target, compiles, executes and cleans
all: compile execute clean
all: $(target) execute clean
# Sets up the project for compiling, generates includes and libs
setup: include lib
@ -70,29 +71,30 @@ ifeq ($(platform), Windows)
-robocopy "vendor\raylib-cpp\vendor\raylib\src" "lib\Windows" libraylib.a
else
mkdir -p lib/$(platform)
cp vendor/raylib-cpp/vendor/raylib/$(libGenDirectory)/libraylib.a lib/$(platform)/libraylib.a
cp vendor/raylib-cpp/vendor/raylib/$(libGenDir)/libraylib.a lib/$(platform)/libraylib.a
endif
# Create the build folder
build:
# Link the program and create the executable
$(target): $(objects)
$(CXX) $(objects) -o $(target) $(linkFlags)
# Compile objects to the build directory
$(buildDir)/%.o: src/%.cpp
ifeq ($(platform), Windows)
-mkdir build
-mkdir $(@D)
else
mkdir -p build
mkdir -p $(@D)
endif
# Create the build folder and compile the executable
compile: build
$(CXX) -std=c++17 -I include -L lib/$(platform) $(sources) -o $(buildFile) -l raylib $(options)
$(CXX) -c $(compileFlags) $< -o $@
# Run the executable
execute:
$(buildFile)
$(target)
# Clean up all relevant files
clean:
ifeq ($(platform), Windows)
-del build\app.exe
-del /S $(buildDir)\*
else
rm $(buildFile)
endif
rm -rf $(buildDir)/*
endif

View File

@ -1,5 +1,5 @@
# Raylib C++ Starter
The Raylib C++ Starter kit is a template project that provides a simple starter template for the [raylib](https://github.com/raysan5/raylib) game tools library incorporating the [raylib-cpp](https://github.com/robloach/raylib-cpp) C++ bindings and using [Make](https://www.gnu.org/software/make/) for building. The starter kit can automatcially clone down raylib and the bindings, compile them, and setup the project for build using a static library.
The Raylib C++ Starter kit is a template project that provides a simple starter template for the [raylib](https://github.com/raysan5/raylib) game tools library incorporating the [raylib-cpp](https://github.com/robloach/raylib-cpp) C++ bindings and using [Make](https://www.gnu.org/software/make/) for building. The starter kit can automatcially clone down raylib and the bindings, compile them, and setup the project for conditional compilation using a static library.
> Why static linking?