diff --git a/examples/Makefile b/examples/Makefile index 5f13846db..0ac510505 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,8 +1,6 @@ #************************************************************************************************** # -# raylib makefile for desktop platforms, Raspberry Pi and HTML5 (emscripten) -# -# NOTE: By default examples are compiled using raylib static library and OpenAL Soft shared library +# raylib makefile for Desktop platforms, Raspberry Pi, Android and HTML5 # # Copyright (c) 2013-2017 Ramon Santamaria (@raysan5) # @@ -25,19 +23,34 @@ .PHONY: all clean -# define raylib platform to compile for -# possible platforms: PLATFORM_DESKTOP PLATFORM_RPI PLATFORM_WEB +# Define required raylib variables # WARNING: To compile to HTML5, code must be redesigned to use emscripten.h and emscripten_set_main_loop() PLATFORM ?= PLATFORM_DESKTOP +RAYLIB_PATH ?= .. +PROJECT_NAME ?= raylib_example + +ifeq ($(PLATFORM),PLATFORM_RPI) + RAYLIB_PATH ?= /home/pi/raylib +endif + +# Library type used for raylib and OpenAL Soft: STATIC (.a) or SHARED (.so/.dll) +# NOTE: Libraries should be provided in the selected form +RAYLIB_LIBTYPE ?= STATIC +OPENAL_LIBTYPE ?= STATIC -# determine PLATFORM_OS in case PLATFORM_DESKTOP selected +# On PLATFORM_WEB force OpenAL Soft shared library +ifeq ($(PLATFORM),PLATFORM_WEB) + OPENAL_LIBTYPE = SHARED +endif + +# Determine PLATFORM_OS in case PLATFORM_DESKTOP selected ifeq ($(PLATFORM),PLATFORM_DESKTOP) # No uname.exe on MinGW!, but OS=Windows_NT on Windows! ifeq ($(UNAME),Msys) -> Windows ifeq ($(OS),Windows_NT) PLATFORM_OS=WINDOWS LIBPATH=win32 else - UNAMEOS:=$(shell uname) + UNAMEOS=$(shell uname) ifeq ($(UNAMEOS),Linux) PLATFORM_OS=LINUX LIBPATH=linux @@ -50,32 +63,6 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) endif endif -# define OpenAL Soft library type: STATIC (.a) or SHARED (.so/.dll) -# NOTE: OpenAL Soft library should be provided in the selected form -OPENAL_LIBTYPE ?= STATIC - -# on PLATFORM_WEB force OpenAL Soft shared library -ifeq ($(PLATFORM),PLATFORM_WEB) - OPENAL_LIBTYPE = SHARED -endif - -# define default raylib path for include and library search -ifeq ($(PLATFORM),PLATFORM_DESKTOP) - ifeq ($(PLATFORM_OS),WINDOWS) - RAYLIB_PATH ?= C:\raylib\raylib - endif - ifeq ($(PLATFORM_OS),LINUX) - RAYLIB_PATH ?= .. - endif - ifeq ($(PLATFORM_OS),OSX) - RAYLIB_PATH ?= .. - endif -endif -ifeq ($(PLATFORM),PLATFORM_RPI) - RAYLIB_PATH ?= /home/pi/raylib -endif - - ifeq ($(PLATFORM),PLATFORM_RPI) # RPI cross-compiler RPI_CROSS_COMPILE ?= NO @@ -91,16 +78,27 @@ ifeq ($(PLATFORM),PLATFORM_WEB) export PATH=$(EMSDK_PATH);$(EMSDK_PATH)\clang\$(CLANG_VERSION);$(EMSDK_PATH)\node\$(NODE_VERSION)\bin;$(EMSDK_PATH)\python\$(PYTHON_VERSION);$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION);C:\raylib\MinGW\bin:$$(PATH) EMSCRIPTEN=$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION) endif -ifeq ($(PLATFORM),PLATFORM_ANDROID) - # Android required path variables - ANDROID_NDK = C:/android-ndk - ANDROID_TOOLCHAIN = C:/android_toolchain_arm_api16 - # Android architecture: ARM or ARM64 - ANDROID_ARCH ?= ARM +# Define raylib release directory for compiled library +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),WINDOWS) + RAYLIB_RELEASE = $(RAYLIB_PATH)/release/win32/mingw32 + endif + ifeq ($(PLATFORM_OS),LINUX) + RAYLIB_RELEASE = $(RAYLIB_PATH)/release/linux + endif + ifeq ($(PLATFORM_OS),OSX) + RAYLIB_RELEASE = $(RAYLIB_PATH)/release/osx + endif +endif +ifeq ($(PLATFORM),PLATFORM_WEB) + RAYLIB_RELEASE = $(RAYLIB_PATH)/release/html5 +endif +ifeq ($(PLATFORM),PLATFORM_RPI) + RAYLIB_RELEASE = $(RAYLIB_PATH)/release/rpi endif -# default C compiler: gcc +# Define default C compiler: gcc CC = gcc ifeq ($(PLATFORM),PLATFORM_DESKTOP) @@ -119,18 +117,17 @@ ifeq ($(PLATFORM),PLATFORM_WEB) # HTML5 emscripten compiler CC = emcc endif -ifeq ($(PLATFORM),PLATFORM_ANDROID) - # Android toolchain (must be provided for desired architecture and compiler) - # NOTE: gcc compiler is being deprecated at Android NDK r16 - ifeq ($(ANDROID_ARCH),ARM) - CC = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-clang - endif - ifeq ($(ANDROID_ARCH),ARM64) - CC = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-clang - endif + +# Define default make program: Mingw32-make +MAKE = mingw32-make + +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),LINUX) + MAKE = make + endif endif -# define compiler flags: +# Define compiler flags: # -O1 defines optimization level # -Og enable debugging # -s strip unnecessary data from build @@ -139,10 +136,10 @@ endif # -std=gnu99 defines C language mode (GNU C from 1999 revision) # -fgnu89-inline declaring inline functions support (GCC optimized) # -Wno-missing-braces ignore invalid warning (GCC bug 53119) -# -D_DEFAULT_SOURCE use with -std=c99 -CFLAGS += -O1 -s -Wall -std=c99 +# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec +CFLAGS += -O1 -s -Wall -std=c99 -D_DEFAULT_SOURCE -fgnu89-inline -Wno-missing-braces -# additional flags for compiler (if desired) +# Additional flags for compiler (if desired) #CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),WINDOWS) @@ -155,154 +152,85 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) endif endif ifeq ($(PLATFORM),PLATFORM_RPI) - CFLAGS += -std=gnu99 -fgnu89-inline + CFLAGS += -std=gnu99 endif ifeq ($(PLATFORM),PLATFORM_WEB) - # -O2 # if used, also set --memory-init-file 0 - # --memory-init-file 0 # to avoid an external memory initialization code file (.mem) - # -s ALLOW_MEMORY_GROWTH=1 # to allow memory resizing - # -s TOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB) - # --preload-file file.res # embbed file.res resource into .data file - CFLAGS += -D_DEFAULT_SOURCE -s USE_GLFW=3 -s ASSERTIONS=1 --profiling -endif -ifeq ($(PLATFORM),PLATFORM_ANDROID) - # Compiler flags for arquitecture - CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 - # Compilation functions attributes options - CFLAGS += -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC - # Compiler options for the linker - CFLAGS += -Wa,--noexecstack -Wformat -Werror=format-security -no-canonical-prefixes - # Preprocessor macro definitions - CFLAGS += -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=16 -endif - -# define raylib release directory for compiled library -ifeq ($(PLATFORM),PLATFORM_DESKTOP) - ifeq ($(PLATFORM_OS),WINDOWS) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/win32/mingw32 - endif - ifeq ($(PLATFORM_OS),LINUX) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/linux - endif - ifeq ($(PLATFORM_OS),OSX) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/osx - endif -endif -ifeq ($(PLATFORM),PLATFORM_RPI) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/rpi -endif -ifeq ($(PLATFORM),PLATFORM_WEB) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/html5 -endif -ifeq ($(PLATFORM),PLATFORM_ANDROID) - ifeq ($(ANDROID_ARCH),ARM) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/android/armeabi-v7a - endif - ifeq ($(ANDROID_ARCH),ARM64) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/android/arm64-v8a - endif + # -O2 # if used, also set --memory-init-file 0 + # --memory-init-file 0 # to avoid an external memory initialization code file (.mem) + # -s ALLOW_MEMORY_GROWTH=1 # to allow memory resizing + # -s TOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB) + # -s USE_PTHREADS=1 # multithreading support + CFLAGS += -s USE_GLFW=3 -s ASSERTIONS=1 --profiling TOTAL_MEMORY=16777216 --preload-file resources endif -# define any directories containing required header files -INCLUDE_PATHS = -I. -I$(RAYLIB_RELEASE) -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external +# Define include paths for required headers +# NOTE: Several external required libraries (stb and others) +INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/release/include -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external -ifeq ($(PLATFORM),PLATFORM_DESKTOP) - ifeq ($(PLATFORM_OS),WINDOWS) - # external libraries headers (GLFW3 and OpenAL Soft) - INCLUDE_PATHS += -I$(RAYLIB_PATH)/src/external/glfw3/include - INCLUDE_PATHS += -I$(RAYLIB_PATH)/src/external/openal_soft/include - endif - ifeq ($(PLATFORM_OS),LINUX) - # you may optionally create this directory and install raylib - # and related headers there. Edit ../src/Makefile appropriately. - INCLUDE_PATHS += -I/usr/local/include/raylib - endif - ifeq ($(PLATFORM_OS),OSX) - # additional directories for MacOS - endif -endif +# Define additional directories containing required header files ifeq ($(PLATFORM),PLATFORM_RPI) - INCLUDE_PATHS += -I../src -I/opt/vc/include - INCLUDE_PATHS += -I/opt/vc/include/interface/vmcs_host/linux + # RPI requried libraries + INCLUDE_PATHS += -I/opt/vc/include + INCLUDE_PATHS += -I/opt/vc/include/interface/vmcs_host/linux INCLUDE_PATHS += -I/opt/vc/include/interface/vcos/pthreads endif -ifeq ($(PLATFORM),PLATFORM_WEB) - # GLFW3 library - INCLUDE_PATHS += -Iexternal/glfw3/include -endif -ifeq ($(PLATFORM),PLATFORM_ANDROID) - # Android required libraries - INCLUDE_PATHS += -I$(ANDROID_TOOLCHAIN)/sysroot/usr/include - # Include android_native_app_glue.h - INCLUDE_PATHS += -Iexternal/android/native_app_glue - #INCLUDE_PATHS += -I$(ANDROID_NDK)/sources/android/native_app_glue -endif -# define library paths containing required libs +# Define library paths containing required libs LDFLAGS = -L. -L$(RAYLIB_RELEASE) -L$(RAYLIB_PATH)/src -ifeq ($(PLATFORM),PLATFORM_DESKTOP) - # add standard directories for GNU/Linux - ifeq ($(PLATFORM_OS),WINDOWS) - # external libraries to link with (GLFW3 and OpenAL Soft) - LDFLAGS += -L$(RAYLIB_PATH)/src/external/glfw3/lib/$(LIBPATH) - LDFLAGS += -L$(RAYLIB_PATH)/src/external/openal_soft/lib/$(LIBPATH) - endif -endif ifeq ($(PLATFORM),PLATFORM_RPI) LDFLAGS += -L/opt/vc/lib endif -# define any libraries to link into executable +# Define any libraries required on linking # if you want to link libraries (libname.so or libname.a), use the -lname ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),WINDOWS) - # libraries for Windows desktop compiling + # Libraries for Windows desktop compiling # NOTE: GLFW3 and OpenAL Soft libraries should be installed LDLIBS = -lraylib -lglfw3 -lopengl32 -lgdi32 - # if static OpenAL Soft required, define the corresponding libs + + # Define required flags and libs for OpenAL Soft STATIC/SHARED usage + # NOTE: ALLIBS flag only required for raylib Win32 SHARED library building ifeq ($(OPENAL_LIBTYPE),STATIC) LDLIBS += -lopenal32 -lwinmm - CFLAGS += -Wl,-allow-multiple-definition + CFLAGS += -DAL_LIBTYPE_STATIC -Wl,-allow-multiple-definition else LDLIBS += -lopenal32dll endif PHYSAC_LIBS = -static -lpthread endif ifeq ($(PLATFORM_OS),LINUX) - # libraries for Debian GNU/Linux desktop compiling - # requires the following packages: - # libglfw3-dev libopenal-dev libegl1-mesa-dev - LDLIBS = -lraylib -lglfw -lGL -lopenal -lm -lpthread -ldl - # on XWindow requires also below libraries + # Libraries for Debian GNU/Linux desktop compiling + # NOTE: Required packages: libglfw3-dev libopenal-dev libegl1-mesa-dev + LDLIBS = -lraylib -lglfw3 -lGL -lopenal -lm -lpthread -ldl + + # On XWindow requires also below libraries LDLIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor endif ifeq ($(PLATFORM_OS),OSX) - # libraries for OS X 10.9 desktop compiling - # required packages: libglfw3-dev libopenal-dev libegl1-mesa-dev + # Libraries for OSX 10.9 desktop compiling + # NOTE: Required packages: libglfw3-dev libopenal-dev libegl1-mesa-dev LDLIBS = -lraylib -lglfw -framework OpenGL -framework OpenAL -framework Cocoa endif endif ifeq ($(PLATFORM),PLATFORM_RPI) - # libraries for Raspberry Pi compiling - # NOTE: OpenAL Soft library should be installed (libopenal1 package) + # Libraries for Raspberry Pi compiling + # NOTE: Required packages: libopenal1 LDLIBS = -lraylib -lGLESv2 -lEGL -lpthread -lrt -lm -lbcm_host -lopenal endif ifeq ($(PLATFORM),PLATFORM_WEB) - # NOTE: Set the correct path to libraylib.bc + # Libraries for web (HTML5) compiling LDLIBS = $(RAYLIB_RELEASE)/libraylib.bc endif -ifeq ($(PLATFORM),PLATFORM_ANDROID) - # libraries for Android shared library compilation - LDLIBS = -lnative_app_glue -lraylib -lopenal -llog -landroid -lEGL -lGLESv2 -lOpenSLES -latomic -lc -lm -endif +# Define output extension to generate a .html file using provided shell ifeq ($(PLATFORM),PLATFORM_WEB) EXT = .html WEB_SHELL = --shell-file $(RAYLIB_PATH)\templates\web_shell\shell.html endif -# define all object files required +# Define all object files required EXAMPLES = \ core/core_basic_window \ core/core_input_keys \ @@ -365,15 +293,16 @@ EXAMPLES = \ physac/physics_shatter \ fix_dylib \ +CURRENT_MAKEFILE = $(lastword $(MAKEFILE_LIST)) -# typing 'make' will invoke the default target entry +# Default target entry all: examples -# generic compilation pattern +# Generic compilation pattern %: %.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -# compile all examples +# Compile all examples examples: $(EXAMPLES) # compile [core] example - basic window @@ -635,7 +564,7 @@ ifeq ($(PLATFORM_OS),OSX) find . -type f -perm +ugo+x -print0 | xargs -t -0 -R 1 -I file install_name_tool -change libglfw.3.0.dylib ../external/glfw3/lib/osx/libglfw.3.0.dylib file endif -# clean everything +# Clean everything clean: ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),WINDOWS) @@ -655,10 +584,6 @@ ifeq ($(PLATFORM),PLATFORM_RPI) endif ifeq ($(PLATFORM),PLATFORM_WEB) del *.o *.html *.js -endif -ifeq ($(PLATFORM),PLATFORM_ANDROID) - del temp\bin\* lib\* temp\obj\* temp\src\* /f/s/q - del temp\*.keystore - rmdir temp /s /q endif @echo Cleaning done + diff --git a/src/Makefile b/src/Makefile index f577ebae3..2545fd59e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -40,35 +40,33 @@ .PHONY: all clean install uninstall -# define raylib platform to compile for -# possible platforms: PLATFORM_DESKTOP PLATFORM_ANDROID PLATFORM_RPI PLATFORM_WEB +# Define required raylib variables PLATFORM ?= PLATFORM_DESKTOP +RAYLIB_PATH ?= .. -# define raylib library type: STATIC (.a) or SHARED (.so/.dll) -RAYLIB_LIBTYPE ?= SHARED - -# define OpenAL Soft library type: STATIC (.a) or SHARED (.so/.dll) +# Library type used for raylib and OpenAL Soft: STATIC (.a) or SHARED (.so/.dll) # NOTE: OpenAL Soft library should be provided in the selected form -OPENAL_LIBTYPE ?= SHARED +RAYLIB_LIBTYPE ?= STATIC +OPENAL_LIBTYPE ?= STATIC -# on PLATFORM_WEB force OpenAL Soft shared library +# On PLATFORM_WEB force OpenAL Soft shared library ifeq ($(PLATFORM),PLATFORM_WEB) OPENAL_LIBTYPE = SHARED endif -# determine if the file has root access (only for installing raylib) +# Determine if the file has root access (only for installing raylib) # "whoami" prints the name of the user that calls him (so, if it is the root # user, "whoami" prints "root"). ROOT = $(shell whoami) -# determine PLATFORM_OS in case PLATFORM_DESKTOP selected +# Determine PLATFORM_OS in case PLATFORM_DESKTOP selected ifeq ($(PLATFORM),PLATFORM_DESKTOP) # No uname.exe on MinGW!, but OS=Windows_NT on Windows! # ifeq ($(UNAME),Msys) -> Windows ifeq ($(OS),Windows_NT) PLATFORM_OS=WINDOWS else - UNAMEOS:=$(shell uname) + UNAMEOS=$(shell uname) ifeq ($(UNAMEOS),Linux) PLATFORM_OS=LINUX else @@ -95,6 +93,33 @@ ifeq ($(PLATFORM),PLATFORM_WEB) EMSCRIPTEN=$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION) endif +# Define output directory for compiled library +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),WINDOWS) + RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/win32/mingw32 + endif + ifeq ($(PLATFORM_OS),LINUX) + RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/linux + endif + ifeq ($(PLATFORM_OS),OSX) + RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/osx + endif +endif +ifeq ($(PLATFORM),PLATFORM_RPI) + RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/rpi +endif +ifeq ($(PLATFORM),PLATFORM_WEB) + RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/html5 +endif +ifeq ($(PLATFORM),PLATFORM_ANDROID) + ifeq ($(ANDROID_ARCH),ARM) + RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/android/armeabi-v7a + endif + ifeq ($(ANDROID_ARCH),ARM64) + RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/android/arm64-v8a + endif +endif + ifeq ($(PLATFORM),PLATFORM_ANDROID) # Android required path variables ANDROID_NDK = C:/android-ndk @@ -104,33 +129,31 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID) ANDROID_ARCH ?= ARM endif -# define raylib graphics api depending on selected platform +# Define raylib graphics api depending on selected platform ifeq ($(PLATFORM),PLATFORM_DESKTOP) - # by default use OpenGL 3.3 on desktop platforms + # By default use OpenGL 3.3 on desktop platforms GRAPHICS ?= GRAPHICS_API_OPENGL_33 #GRAPHICS = GRAPHICS_API_OPENGL_11 # Uncomment to use OpenGL 1.1 #GRAPHICS = GRAPHICS_API_OPENGL_21 # Uncomment to use OpenGL 2.1 endif ifeq ($(PLATFORM),PLATFORM_RPI) - # on RPI OpenGL ES 2.0 must be used + # On RPI OpenGL ES 2.0 must be used GRAPHICS = GRAPHICS_API_OPENGL_ES2 endif ifeq ($(PLATFORM),PLATFORM_WEB) - # on HTML5 OpenGL ES 2.0 is used, emscripten translates it to WebGL 1.0 + # On HTML5 OpenGL ES 2.0 is used, emscripten translates it to WebGL 1.0 GRAPHICS = GRAPHICS_API_OPENGL_ES2 endif ifeq ($(PLATFORM),PLATFORM_ANDROID) - # by default use OpenGL ES 2.0 on Android + # By default use OpenGL ES 2.0 on Android GRAPHICS = GRAPHICS_API_OPENGL_ES2 endif -# NOTE: makefiles targets require tab indentation -# NOTE: define compiler: gcc for C program, define as g++ for C++ - -# default C compiler: gcc +# Default C compiler: gcc +# NOTE: define g++ compiler if using C++ CC = gcc ifeq ($(PLATFORM),PLATFORM_DESKTOP) @@ -151,7 +174,7 @@ ifeq ($(PLATFORM),PLATFORM_WEB) endif ifeq ($(PLATFORM),PLATFORM_ANDROID) # Android toolchain (must be provided for desired architecture and compiler) - # NOTE: gcc compiler is being deprecated at Android NDK r16 + # NOTE: gcc compiler is being deprecated in Android NDK r16 ifeq ($(ANDROID_ARCH),ARM) CC = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-gcc endif @@ -160,8 +183,7 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID) endif endif - -# default archiver program to pack libraries +# Default archiver program to pack libraries AR = ar # Android archiver (also depends on desired architecture) @@ -174,7 +196,7 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID) endif endif -# define compiler flags: +# Define compiler flags: # -O1 defines optimization level # -Og enable debugging # -s strip unnecessary data from build @@ -186,7 +208,7 @@ endif # -D_DEFAULT_SOURCE use with -std=c99 CFLAGS += -O1 -Wall -std=c99 -D_DEFAULT_SOURCE -fgnu89-inline -Wno-missing-braces -# additional flags for compiler (if desired) +# Additional flags for compiler (if desired) #CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes ifeq ($(PLATFORM),PLATFORM_WEB) # -O2 # if used, also set --memory-init-file 0 @@ -207,7 +229,7 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID) CFLAGS += -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=16 endif -# define raylib libtype required compilation flags +# Define required compilation flags for raylib SHARED lib ifeq ($(RAYLIB_LIBTYPE),SHARED) # make sure code is compiled as position independent # BE CAREFUL: It seems that for gcc -fpic si not the same as -fPIC @@ -215,37 +237,17 @@ ifeq ($(RAYLIB_LIBTYPE),SHARED) CFLAGS += -fPIC -DBUILD_LIBTYPE_SHARED endif -# if static OpenAL Soft required, define the corresponding flags -# NOTE: ALLIBS flag only required for raylib Win32 SHARED library building -ifeq ($(OPENAL_LIBTYPE),STATIC) - ALLIBS = -lopenal32 -lwinmm - ALFLAGS = -DAL_LIBTYPE_STATIC -else - ALLIBS = -lopenal32dll -endif - -# define include paths for required headers -# external required libraries (stb and others) -INCLUDE_PATHS = -I. -Iexternal +# Define include paths for required headers +# NOTE: Several external required libraries (stb and others) +INCLUDE_PATHS = -I. -Iexternal -Iexternal/include -# OpenAL Soft library -INCLUDE_PATHS += -Iexternal/openal_soft/include - -# define any directories containing required header files -ifeq ($(PLATFORM),PLATFORM_DESKTOP) - # GLFW3 library - INCLUDE_PATHS += -Iexternal/glfw3/include -endif +# Define additional directories containing required header files ifeq ($(PLATFORM),PLATFORM_RPI) # RPI requried libraries INCLUDE_PATHS += -I/opt/vc/include INCLUDE_PATHS += -I/opt/vc/include/interface/vmcs_host/linux INCLUDE_PATHS += -I/opt/vc/include/interface/vcos/pthreads endif -ifeq ($(PLATFORM),PLATFORM_WEB) - # GLFW3 library - INCLUDE_PATHS += -Iexternal/glfw3/include -endif ifeq ($(PLATFORM),PLATFORM_ANDROID) # Android required libraries INCLUDE_PATHS += -I$(ANDROID_TOOLCHAIN)/sysroot/usr/include @@ -254,58 +256,30 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID) #INCLUDE_PATHS += -I$(ANDROID_NDK)/sources/android/native_app_glue endif -# Linker options +# Define linker options ifeq ($(PLATFORM),PLATFORM_ANDROID) LDFLAGS = -Wl,-soname,libraylib.so -Wl,--exclude-libs,libatomic.a LDFLAGS += -Wl,--build-id -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings # Force linking of library module to define symbol LDFLAGS += -u ANativeActivity_onCreate # Library paths containing required libs - LDFLAGS += -L. -Lsrc -L$(OUTPUT_PATH) -Lexternal/openal_soft/lib/android + LDFLAGS += -L. -Lsrc -L$(RAYLIB_RELEASE_PATH) -Lexternal/openal_soft/lib/android LDLIBS = -lopenal -llog -landroid -lEGL -lGLESv2 -lOpenSLES -latomic -lc -lm endif -# define output directory for compiled library -ifeq ($(PLATFORM),PLATFORM_DESKTOP) - ifeq ($(PLATFORM_OS),WINDOWS) - OUTPUT_PATH = ../release/libs/win32/mingw32 - endif - ifeq ($(PLATFORM_OS),LINUX) - OUTPUT_PATH = ../release/libs/linux - endif - ifeq ($(PLATFORM_OS),OSX) - OUTPUT_PATH = ../release/libs/osx - endif -endif -ifeq ($(PLATFORM),PLATFORM_RPI) - OUTPUT_PATH = ../release/libs/rpi -endif -ifeq ($(PLATFORM),PLATFORM_WEB) - OUTPUT_PATH = ../release/libs/html5 -endif -ifeq ($(PLATFORM),PLATFORM_ANDROID) - ifeq ($(ANDROID_ARCH),ARM) - OUTPUT_PATH = ../release/libs/android/armeabi-v7a - endif - ifeq ($(ANDROID_ARCH),ARM64) - OUTPUT_PATH = ../release/libs/android/arm64-v8a - endif -endif - -# define all object files required with a wildcard -# The wildcard takes all files that finish with ".c", then it replaces the -# extentions with ".o", that are the object files. +# Define all object files required with a wildcard +# The wildcard takes all files that finish with ".c", +# and replaces extentions with ".o", that are the object files OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) OBJS += stb_vorbis.o -# typing 'make' will invoke the default target entry called 'all', -# in this case, the 'default' target entry is raylib +# Default target entry all: raylib -# generate standalone Android toolchain +# Generate standalone Android toolchain # NOTE: Android toolchain could already be provided -toolchain: +generate_android_toolchain: ifeq ($(PLATFORM),PLATFORM_ANDROID) ifeq ($(ANDROID_ARCH),ARM) $(ANDROID_NDK)/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchain=arm-linux-androideabi-4.9 --use-llvm --install-dir=$(ANDROID_TOOLCHAIN) @@ -315,37 +289,37 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID) endif endif -# compile raylib library +# Compile raylib library raylib: $(OBJS) ifeq ($(PLATFORM),PLATFORM_WEB) - # compile raylib for web. - emcc -O1 $(OBJS) -o $(OUTPUT_PATH)/libraylib.bc + # Compile raylib for web. + emcc -O1 $(OBJS) -o $(RAYLIB_RELEASE_PATH)/libraylib.bc @echo "raylib library generated (libraylib.bc)!" else ifeq ($(RAYLIB_LIBTYPE),SHARED) # NOTE: If using OpenAL Soft as static library, all its dependencies must be also linked in the shared library ifeq ($(PLATFORM_OS),WINDOWS) - $(CC) -shared -o $(OUTPUT_PATH)/raylib.dll $(OBJS) $(ALLIBS) -Lexternal/glfw3/lib/win32 -Lexternal/openal_soft/lib/win32 -lglfw3 -lgdi32 -Wl,--out-implib,$(OUTPUT_PATH)/libraylibdll.a + $(CC) -shared -o $(RAYLIB_RELEASE_PATH)/raylib.dll $(OBJS) $(ALLIBS) -Lexternal/glfw3/lib/win32 -Lexternal/openal_soft/lib/win32 -lglfw3 -lgdi32 -Wl,--out-implib,$(RAYLIB_RELEASE_PATH)/libraylibdll.a @echo "raylib dynamic library (raylib.dll) and import library (libraylibdll.a) generated!" endif ifeq ($(PLATFORM_OS),LINUX) - # compile raylib to shared library version for GNU/Linux. + # Compile raylib to shared library version for GNU/Linux. # WARNING: you should type "make clean" before doing this target - $(CC) -shared -o $(OUTPUT_PATH)/libraylib.so $(OBJS) -lglfw -lGL -lopenal -lm -lpthread -ldl + $(CC) -shared -o $(RAYLIB_RELEASE_PATH)/libraylib.so $(OBJS) -lglfw -lGL -lopenal -lm -lpthread -ldl @echo "raylib shared library generated (libraylib.so)!" endif ifeq ($(PLATFORM_OS),OSX) - $(CC) -dynamiclib -o $(OUTPUT_PATH)/libraylib.dylib $(OBJS) -L/usr/local/Cellar/glfw/3.2.1/lib -lglfw -framework OpenGL -framework OpenAL -framework Cocoa - install_name_tool -id "libraylib.dylib" $(OUTPUT_PATH)/libraylib.dylib + $(CC) -dynamiclib -o $(RAYLIB_RELEASE_PATH)/libraylib.dylib $(OBJS) -L/usr/local/Cellar/glfw/3.2.1/lib -lglfw -framework OpenGL -framework OpenAL -framework Cocoa + install_name_tool -id "libraylib.dylib" $(RAYLIB_RELEASE_PATH)/libraylib.dylib @echo "raylib shared library generated (libraylib.dylib)!" endif ifeq ($(PLATFORM),PLATFORM_ANDROID) - $(CC) -shared -o $(OUTPUT_PATH)/libraylib.so $(OBJS) $(LDFLAGS) $(LDLIBS) + $(CC) -shared -o $(RAYLIB_RELEASE_PATH)/libraylib.so $(OBJS) $(LDFLAGS) $(LDLIBS) @echo "raylib shared library generated (libraylib.so)!" endif else - # compile raylib static library. - $(AR) rcs $(OUTPUT_PATH)/libraylib.a $(OBJS) + # Compile raylib static library. + $(AR) rcs $(RAYLIB_RELEASE_PATH)/libraylib.a $(OBJS) @echo "raylib static library generated (libraylib.a)!" ifeq ($(OPENAL_LIBTYPE),STATIC) @echo "expected OpenAL Soft static library linking" @@ -355,46 +329,45 @@ else endif endif -# compile all modules with their prerequisites +# Compile all modules with their prerequisites -# compile core module +# Compile core module core.o : core.c raylib.h rlgl.h utils.h raymath.h gestures.h $(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) -D$(GRAPHICS) -# compile rlgl module +# Compile rlgl module rlgl.o : rlgl.c rlgl.h raymath.h $(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) -D$(GRAPHICS) -# compile shapes module +# Compile shapes module shapes.o : shapes.c raylib.h rlgl.h $(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) -D$(GRAPHICS) -# compile textures module +# Compile textures module textures.o : textures.c rlgl.h utils.h $(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) -D$(GRAPHICS) -# compile text module +# Compile text module text.o : text.c raylib.h utils.h $(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) -D$(GRAPHICS) -# compile models module +# Compile models module models.o : models.c raylib.h rlgl.h raymath.h $(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) -D$(GRAPHICS) -# compile audio module +# Compile audio module audio.o : audio.c raylib.h $(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) $(ALFLAGS) -# compile stb_vorbis library +# Compile stb_vorbis library stb_vorbis.o: external/stb_vorbis.c external/stb_vorbis.h $(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) -# compile utils module +# Compile utils module utils.o : utils.c utils.h $(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) -# It installs generated and needed files to compile projects using raylib. -# The installation works manually. +# Install generated and needed files to required directories # TODO: add other platforms. install : ifeq ($(ROOT),root) @@ -404,10 +377,10 @@ ifeq ($(ROOT),root) # /usr/local/include/) are for libraries that are installed # manually (without a package manager). ifeq ($(RAYLIB_LIBTYPE),SHARED) - cp --update $(OUTPUT_PATH)/libraylib.so /usr/local/lib/libraylib.so + cp --update $(RAYLIB_RELEASE_PATH)/libraylib.so /usr/local/lib/libraylib.so else cp --update raylib.h /usr/local/include/raylib.h - cp --update $(OUTPUT_PATH)/libraylib.a /usr/local/lib/libraylib.a + cp --update $(RAYLIB_RELEASE_PATH)/libraylib.a /usr/local/lib/libraylib.a endif @echo "raylib dev files installed/updated!" else @@ -417,7 +390,7 @@ else @echo "Error: no root permissions" endif -# it removes raylib dev files installed on the system. +# Remove raylib dev files installed on the system # TODO: see 'install' target. uninstall : ifeq ($(ROOT),root) @@ -436,12 +409,12 @@ else @echo "Error: no root permissions" endif -# clean everything +# Clean everything clean: ifeq ($(PLATFORM_OS),WINDOWS) - del *.o $(OUTPUT_PATH)/libraylib.a $(OUTPUT_PATH)/libraylib.bc $(OUTPUT_PATH)/libraylib.so external/stb_vorbis.o + del *.o $(RAYLIB_RELEASE_PATH)/libraylib.a $(RAYLIB_RELEASE_PATH)/libraylib.bc $(RAYLIB_RELEASE_PATH)/libraylib.so external/stb_vorbis.o else - rm -f *.o $(OUTPUT_PATH)/libraylib.a $(OUTPUT_PATH)/libraylib.bc $(OUTPUT_PATH)/libraylib.so external/stb_vorbis.o + rm -f *.o $(RAYLIB_RELEASE_PATH)/libraylib.a $(RAYLIB_RELEASE_PATH)/libraylib.bc $(RAYLIB_RELEASE_PATH)/libraylib.so external/stb_vorbis.o endif ifeq ($(PLATFORM),PLATFORM_ANDROID) rm -rf $(ANDROID_TOOLCHAIN) diff --git a/templates/standard_game/Makefile b/templates/standard_game/Makefile index 72c6a7cc6..73205b387 100644 --- a/templates/standard_game/Makefile +++ b/templates/standard_game/Makefile @@ -1,6 +1,6 @@ #************************************************************************************************** # -# raylib makefile for desktop platforms, Raspberry Pi and HTML5 (emscripten) +# raylib makefile for Desktop platforms, Raspberry Pi, Android and HTML5 # # Copyright (c) 2013-2017 Ramon Santamaria (@raysan5) # @@ -23,29 +23,30 @@ .PHONY: all clean -# define raylib platform to compile for -# possible platforms: PLATFORM_DESKTOP PLATFORM_RPI PLATFORM_WEB +# Define required raylib variables # WARNING: To compile to HTML5, code must be redesigned to use emscripten.h and emscripten_set_main_loop() PLATFORM ?= PLATFORM_DESKTOP +RAYLIB_PATH ?= ..\.. +PROJECT_NAME ?= standard_game -# define NO to use OpenAL Soft as static library (shared by default) -SHARED_OPENAL ?= NO +# Library type used for raylib and OpenAL Soft: STATIC (.a) or SHARED (.so/.dll) +# NOTE: Libraries should be provided in the selected form +RAYLIB_LIBTYPE ?= STATIC +OPENAL_LIBTYPE ?= STATIC +# On PLATFORM_WEB force OpenAL Soft shared library ifeq ($(PLATFORM),PLATFORM_WEB) - SHARED_OPENAL = NO + OPENAL_LIBTYPE = SHARED endif -# define raylib directory for include and library -RAYLIB_PATH ?= C:\raylib\raylib - -# determine PLATFORM_OS in case PLATFORM_DESKTOP selected +# Determine PLATFORM_OS in case PLATFORM_DESKTOP selected ifeq ($(PLATFORM),PLATFORM_DESKTOP) # No uname.exe on MinGW!, but OS=Windows_NT on Windows! ifeq ($(UNAME),Msys) -> Windows ifeq ($(OS),Windows_NT) PLATFORM_OS=WINDOWS LIBPATH=win32 else - UNAMEOS:=$(shell uname) + UNAMEOS=$(shell uname) ifeq ($(UNAMEOS),Linux) PLATFORM_OS=LINUX LIBPATH=linux @@ -58,55 +59,23 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) endif endif -# define compiler: gcc for C program, define as g++ for C++ -ifeq ($(PLATFORM),PLATFORM_WEB) - # define emscripten compiler - CC = emcc -else -ifeq ($(PLATFORM_OS),OSX) - # define llvm compiler for mac - CC = clang -else - # define default gcc compiler - CC = gcc -endif +ifeq ($(PLATFORM),PLATFORM_RPI) + # RPI cross-compiler + RPI_CROSS_COMPILE ?= NO endif -# define compiler flags: -# -O2 defines optimization level -# -Og enable debugging -# -s strip unnecessary data from build -# -Wall turns on most, but not all, compiler warnings -# -std=c99 defines C language mode (standard C from 1999 revision) -# -std=gnu99 defines C language mode (GNU C from 1999 revision) -# -fgnu89-inline declaring inline functions support (GCC optimized) -# -Wno-missing-braces ignore invalid warning (GCC bug 53119) -# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec -ifeq ($(PLATFORM),PLATFORM_DESKTOP) - ifeq ($(PLATFORM_OS),WINDOWS) - CFLAGS = -O2 -s -Wall -std=c99 - endif - ifeq ($(PLATFORM_OS),LINUX) - CFLAGS = -O2 -s -Wall -std=c99 -D_DEFAULT_SOURCE - endif - ifeq ($(PLATFORM_OS),OSX) - CFLAGS = -O2 -s -Wall -std=c99 - endif -endif ifeq ($(PLATFORM),PLATFORM_WEB) - CFLAGS = -O1 -Wall -std=c99 -D_DEFAULT_SOURCE -s USE_GLFW=3 -s ASSERTIONS=1 -s TOTAL_MEMORY=67108864 --profiling --preload-file resources - # -O2 # if used, also set --memory-init-file 0 - # --memory-init-file 0 # to avoid an external memory initialization code file (.mem) - # -s ALLOW_MEMORY_GROWTH=1 # to allow memory resizing - # -s TOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB) - # --preload-file file.res # embbed file.res resource into .data file -endif -ifeq ($(PLATFORM),PLATFORM_RPI) - CFLAGS = -O2 -s -Wall -std=gnu99 -fgnu89-inline + # Emscripten required variables + EMSDK_PATH = C:/emsdk + EMSCRIPTEN_VERSION = 1.37.9 + CLANG_VERSION=e1.37.9_64bit + PYTHON_VERSION=2.7.5.3_64bit + NODE_VERSION=4.1.1_64bit + export PATH=$(EMSDK_PATH);$(EMSDK_PATH)\clang\$(CLANG_VERSION);$(EMSDK_PATH)\node\$(NODE_VERSION)\bin;$(EMSDK_PATH)\python\$(PYTHON_VERSION);$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION);C:\raylib\MinGW\bin:$$(PATH) + EMSCRIPTEN=$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION) endif -#CFLAGSEXTRA = -Wextra -Wmissing-prototypes -Wstrict-prototypes -# define raylib release directory for compiled library +# Define raylib release directory for compiled library ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),WINDOWS) RAYLIB_RELEASE = $(RAYLIB_PATH)/release/win32/mingw32 @@ -125,147 +94,184 @@ ifeq ($(PLATFORM),PLATFORM_RPI) RAYLIB_RELEASE = $(RAYLIB_PATH)/release/rpi endif -# define any directories containing required header files -INCLUDES = -I. -I$(RAYLIB_RELEASE) -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external +# Define default C compiler: gcc +CC = gcc +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),OSX) + # OSX default compiler + CC = clang + endif +endif ifeq ($(PLATFORM),PLATFORM_RPI) - INCLUDES += -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads + ifeq ($(RPI_CROSS_COMPILE),YES) + # RPI cross-compiler + CC = armv6j-hardfloat-linux-gnueabi-gcc + endif endif +ifeq ($(PLATFORM),PLATFORM_WEB) + # HTML5 emscripten compiler + CC = emcc +endif + +# Define default make program: Mingw32-make +MAKE = mingw32-make + ifeq ($(PLATFORM),PLATFORM_DESKTOP) - ifeq ($(PLATFORM_OS),WINDOWS) - # external libraries headers - # GLFW3 - INCLUDES += -I$(RAYLIB_PATH)/src/external/glfw3/include - # OpenAL Soft - INCLUDES += -I$(RAYLIB_PATH)/src/external/openal_soft/include - endif ifeq ($(PLATFORM_OS),LINUX) - # you may optionally create this directory and install raylib - # and related headers there. Edit ../src/Makefile appropriately. - INCLUDES += -I/usr/local/include/raylib - endif - ifeq ($(PLATFORM_OS),OSX) - # additional directories for MacOS + MAKE = make + endif +endif + +# Define compiler flags: +# -O1 defines optimization level +# -Og enable debugging +# -s strip unnecessary data from build +# -Wall turns on most, but not all, compiler warnings +# -std=c99 defines C language mode (standard C from 1999 revision) +# -std=gnu99 defines C language mode (GNU C from 1999 revision) +# -fgnu89-inline declaring inline functions support (GCC optimized) +# -Wno-missing-braces ignore invalid warning (GCC bug 53119) +# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec +CFLAGS += -O1 -s -Wall -std=c99 -D_DEFAULT_SOURCE -fgnu89-inline -Wno-missing-braces + +# Additional flags for compiler (if desired) +#CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),LINUX) + CFLAGS += -no-pie -D_DEFAULT_SOURCE endif endif +ifeq ($(PLATFORM),PLATFORM_RPI) + CFLAGS += -std=gnu99 +endif +ifeq ($(PLATFORM),PLATFORM_WEB) + # -O2 # if used, also set --memory-init-file 0 + # --memory-init-file 0 # to avoid an external memory initialization code file (.mem) + # -s ALLOW_MEMORY_GROWTH=1 # to allow memory resizing + # -s TOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB) + # -s USE_PTHREADS=1 # multithreading support + CFLAGS += -s USE_GLFW=3 -s ASSERTIONS=1 --profiling TOTAL_MEMORY=16777216 --preload-file resources +endif -# define library paths containing required libs -LFLAGS = -L. -L$(RAYLIB_RELEASE) -L$(RAYLIB_PATH)/src +# Define include paths for required headers +# NOTE: Several external required libraries (stb and others) +INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/release/include -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external +# Define additional directories containing required header files ifeq ($(PLATFORM),PLATFORM_RPI) - LFLAGS += -L/opt/vc/lib + # RPI requried libraries + INCLUDE_PATHS += -I/opt/vc/include + INCLUDE_PATHS += -I/opt/vc/include/interface/vmcs_host/linux + INCLUDE_PATHS += -I/opt/vc/include/interface/vcos/pthreads endif -ifeq ($(PLATFORM),PLATFORM_DESKTOP) - # add standard directories for GNU/Linux - ifeq ($(PLATFORM_OS),WINDOWS) - # external libraries to link with - # GLFW3 - LFLAGS += -L$(RAYLIB_PATH)/src/external/glfw3/lib/$(LIBPATH) - # OpenAL Soft - LFLAGS += -L$(RAYLIB_PATH)/src/external/openal_soft/lib/$(LIBPATH) - endif + +# Define library paths containing required libs +LDFLAGS = -L. -L$(RAYLIB_RELEASE) -L$(RAYLIB_PATH)/src + +ifeq ($(PLATFORM),PLATFORM_RPI) + LDFLAGS += -L/opt/vc/lib endif -# define any libraries to link into executable +# Define any libraries required on linking # if you want to link libraries (libname.so or libname.a), use the -lname ifeq ($(PLATFORM),PLATFORM_DESKTOP) - ifeq ($(PLATFORM_OS),LINUX) - # libraries for Debian GNU/Linux desktop compiling - # requires the following packages: - # libglfw3-dev libopenal-dev libegl1-mesa-dev - LIBS = -lraylib -lglfw3 -lGL -lopenal -lm -lpthread -ldl - # on XWindow requires also below libraries - LIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor - else - ifeq ($(PLATFORM_OS),OSX) - # libraries for OSX 10.9 desktop compiling - # requires the following packages: - # libglfw3-dev libopenal-dev libegl1-mesa-dev - LIBS = -lraylib -lglfw -framework OpenGL -framework OpenAL -framework Cocoa - else - # libraries for Windows desktop compiling + ifeq ($(PLATFORM_OS),WINDOWS) + # Libraries for Windows desktop compiling # NOTE: GLFW3 and OpenAL Soft libraries should be installed - LIBS = -lraylib -lglfw3 -lopengl32 -lgdi32 - # if static OpenAL Soft required, define the corresponding libs - ifeq ($(SHARED_OPENAL),NO) - LIBS += -lopenal32 -lwinmm - CFLAGS += -Wl,-allow-multiple-definition + LDLIBS = -lraylib -lglfw3 -lopengl32 -lgdi32 + + # Define required flags and libs for OpenAL Soft STATIC/SHARED usage + # NOTE: ALLIBS flag only required for raylib Win32 SHARED library building + ifeq ($(OPENAL_LIBTYPE),STATIC) + LDLIBS += -lopenal32 -lwinmm + CFLAGS += -DAL_LIBTYPE_STATIC -Wl,-allow-multiple-definition else - LIBS += -lopenal32dll + LDLIBS += -lopenal32dll endif endif + ifeq ($(PLATFORM_OS),LINUX) + # Libraries for Debian GNU/Linux desktop compiling + # NOTE: Required packages: libglfw3-dev libopenal-dev libegl1-mesa-dev + LDLIBS = -lraylib -lglfw3 -lGL -lopenal -lm -lpthread -ldl + + # On XWindow requires also below libraries + LDLIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor + endif + ifeq ($(PLATFORM_OS),OSX) + # Libraries for OSX 10.9 desktop compiling + # NOTE: Required packages: libglfw3-dev libopenal-dev libegl1-mesa-dev + LDLIBS = -lraylib -lglfw -framework OpenGL -framework OpenAL -framework Cocoa endif endif ifeq ($(PLATFORM),PLATFORM_RPI) - # libraries for Raspberry Pi compiling - # NOTE: OpenAL Soft library should be installed (libopenal1 package) - LIBS = -lraylib -lGLESv2 -lEGL -lpthread -lrt -lm -lbcm_host -lopenal + # Libraries for Raspberry Pi compiling + # NOTE: Required packages: libopenal1 + LDLIBS = -lraylib -lGLESv2 -lEGL -lpthread -lrt -lm -lbcm_host -lopenal endif ifeq ($(PLATFORM),PLATFORM_WEB) - # NOTE: Set the correct path to libraylib.bc - LIBS = $(RAYLIB_RELEASE)/libraylib.bc + # Libraries for web (HTML5) compiling + LDLIBS = $(RAYLIB_RELEASE)/libraylib.bc endif -# define additional parameters and flags for windows +# Define additional parameters and flags for windows ifeq ($(PLATFORM_OS),WINDOWS) - # resources file contains windows exe icon + # resources file contains raylib icon for windows .exe # -Wl,--subsystem,windows hides the console window WINFLAGS = $(RAYLIB_PATH)/src/resources -Wl,--subsystem,windows endif +# Define output extension to generate a .html file using provided shell ifeq ($(PLATFORM),PLATFORM_WEB) EXT = .html WEB_SHELL = --shell-file $(RAYLIB_PATH)\templates\web_shell\shell.html endif -# define all screen object files required -SCREENS = \ - screens/screen_logo.o \ - screens/screen_title.o \ - screens/screen_options.o \ - screens/screen_gameplay.o \ - screens/screen_ending.o \ - -# typing 'make' will invoke the default target entry called 'all', -# in this case, the 'default' target entry is standard_game -all: standard_game +# Define all object files required +PROJECT_SOURCE_FILES = standard_game.c\ + screens/screen_logo.c \ + screens/screen_title.c \ + screens/screen_options.c \ + screens/screen_gameplay.c \ + screens/screen_ending.c + +OBJS = $(patsubst %.c, %.o, $(PROJECT_SOURCE_FILES)) -# compile template - standard_game -standard_game: standard_game.c $(SCREENS) - $(CC) -o $@$(EXT) $< $(SCREENS) $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) +CURRENT_MAKEFILE = $(lastword $(MAKEFILE_LIST)) -# compile screen LOGO -screens/screen_logo.o: screens/screen_logo.c - $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) -D$(PLATFORM) - -# compile screen TITLE -screens/screen_title.o: screens/screen_title.c - $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) -D$(PLATFORM) +ifeq ($(PLATFORM),PLATFORM_ANDROID) + CURRENT_MAKEFILE = Makefile.Android + export PROJECT_NAME + export PROJECT_SOURCE_FILES +else + CURRENT_MAKEFILE += -n $(PROJECT_NAME) +endif -# compile screen OPTIONS -screens/screen_options.o: screens/screen_options.c - $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) -D$(PLATFORM) +# Default target entry +all: + $(MAKE) -f $(CURRENT_MAKEFILE) -# compile screen GAMEPLAY -screens/screen_gameplay.o: screens/screen_gameplay.c - $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) -D$(PLATFORM) +# Project target defined by PROJECT_NAME +$(PROJECT_NAME): $(OBJS) + $(CC) -o $(PROJECT_NAME)$(EXT) $(OBJS) $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) $(WINFLAGS) -# compile screen ENDING -screens/screen_ending.o: screens/screen_ending.c - $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) -D$(PLATFORM) +# Compile source files +# NOTE: This pattern will compile every module defined on $(OBJS) +%.o: %.c + $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) -# clean everything +# Clean everything clean: ifeq ($(PLATFORM),PLATFORM_DESKTOP) - ifeq ($(PLATFORM_OS),OSX) - find . -type f -perm +ugo+x -delete - rm -f *.o - else + ifeq ($(PLATFORM_OS),WINDOWS) + del *.o *.exe /s + endif ifeq ($(PLATFORM_OS),LINUX) find -type f -executable | xargs file -i | grep -E 'x-object|x-archive|x-sharedlib|x-executable' | rev | cut -d ':' -f 2- | rev | xargs rm -f - else - del *.o *.exe /s endif + ifeq ($(PLATFORM_OS),OSX) + find . -type f -perm +ugo+x -delete + rm -f *.o endif endif ifeq ($(PLATFORM),PLATFORM_RPI) @@ -277,7 +283,3 @@ ifeq ($(PLATFORM),PLATFORM_WEB) endif @echo Cleaning done -# instead of defining every module one by one, we can define a pattern -# this pattern below will automatically compile every module defined on $(OBJS) -#%.exe : %.c -# $(CC) -o $@ $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM)