aboutsummaryrefslogtreecommitdiff
path: root/src/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'src/Makefile')
-rw-r--r--src/Makefile384
1 files changed, 384 insertions, 0 deletions
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 00000000..4c2278f5
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,384 @@
+#******************************************************************************
+#
+# raylib makefile for desktop platforms, Raspberry Pi and HTML5 (emscripten)
+#
+# Many Thanks to Emanuele Petriglia for his contribution on GNU/Linux pipeline.
+#
+# Copyright (c) 2014-2016 Ramon Santamaria (@raysan5)
+#
+# This software is provided "as-is", without any express or implied warranty.
+# In no event will the authors be held liable for any damages arising from
+# the use of this software.
+#
+# Permission is granted to anyone to use this software for any purpose,
+# including commercial applications, and to alter it and redistribute it
+# freely, subject to the following restrictions:
+#
+# 1. The origin of this software must not be misrepresented; you must not
+# claim that you wrote the original software. If you use this software in a
+# product, an acknowledgment in the product documentation would be
+# appreciated but is not required.
+#
+# 2. Altered source versions must be plainly marked as such, and must not
+# be misrepresented as being the original software.
+#
+# 3. This notice may not be removed or altered from any source distribution.
+#
+#******************************************************************************
+
+# Please read the wiki to know how to compile raylib, because there are
+# different methods.
+
+.PHONY: all clean install unistall
+
+# define raylib platform to compile for
+# possible platforms: PLATFORM_DESKTOP PLATFORM_ANDROID PLATFORM_RPI PLATFORM_WEB
+PLATFORM ?= PLATFORM_DESKTOP
+
+# define YES if you want shared/dynamic version of library instead of static (default)
+SHARED ?= NO
+
+# define NO to use OpenAL Soft as static library (or shared by default)
+SHARED_OPENAL ?= YES
+
+# on PLATFORM_WEB force OpenAL Soft shared library
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ SHARED_OPENAL ?= YES
+endif
+
+# 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
+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)
+ ifeq ($(UNAMEOS),Linux)
+ PLATFORM_OS=LINUX
+ else
+ ifeq ($(UNAMEOS),Darwin)
+ PLATFORM_OS=OSX
+ endif
+ endif
+ endif
+endif
+
+ifeq ($(PLATFORM),PLATFORM_ANDROID)
+ # path to Android NDK
+ ANDROID_NDK = $(ANDROID_NDK_HOME)
+
+ # possible Android architectures: ARM ARM64
+ ANDROID_ARCH ?= ARM
+
+ # define YES to use clang instead of gcc
+ ANDROID_LLVM ?= NO
+
+ # standalone Android toolchain install dir
+ ANDROID_TOOLCHAIN = $(CURDIR)/toolchain
+endif
+
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ CROSS_COMPILE ?= NO
+endif
+
+# define raylib graphics api depending on selected platform
+ifeq ($(PLATFORM),PLATFORM_ANDROID)
+ GRAPHICS = GRAPHICS_API_OPENGL_ES2
+endif
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ # define raylib graphics api to use (on RPI, OpenGL ES 2.0 must be used)
+ GRAPHICS = GRAPHICS_API_OPENGL_ES2
+else
+ # define raylib graphics api to use (OpenGL 3.3 by default)
+ 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_WEB)
+ GRAPHICS = GRAPHICS_API_OPENGL_ES2
+endif
+
+# NOTE: makefiles targets require tab indentation
+
+# define compiler: gcc for C program, define as g++ for C++
+
+# default gcc compiler
+CC = gcc
+
+ifeq ($(PLATFORM),PLATFORM_ANDROID)
+ ifeq ($(ANDROID_ARCH),ARM)
+ ifeq ($(ANDROID_LLVM),YES)
+ CC = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-clang
+ else
+ CC = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-gcc
+ endif
+ endif
+ ifeq ($(ANDROID_ARCH),ARM64)
+ ifeq ($(ANDROID_LLVM),YES)
+ CC = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-clang
+ else
+ CC = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-gcc
+ endif
+ endif
+endif
+
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ ifeq ($(CROSS_COMPILE),YES)
+ # rpi compiler
+ CC = armv6j-hardfloat-linux-gnueabi-gcc
+ endif
+endif
+
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ # emscripten compiler
+ CC = emcc
+endif
+
+AR = ar
+
+ifeq ($(PLATFORM),PLATFORM_ANDROID)
+ ifeq ($(ANDROID_ARCH),ARM)
+ AR = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-ar
+ endif
+ ifeq ($(ANDROID_ARCH),ARM64)
+ AR = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-ar
+ endif
+endif
+
+# define compiler flags:
+# -O1 defines optimization level
+# -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)
+CFLAGS = -O1 -Wall -std=gnu99 -fgnu89-inline -Wno-missing-braces
+
+# if shared library required, make sure code is compiled as position independent
+ifeq ($(SHARED),YES)
+ CFLAGS += -fPIC
+ SHAREDFLAG = BUILDING_DLL
+ SHAREDLIBS = -Lexternal/glfw3/lib/win32 -Lexternal/openal_soft/lib/win32 -lglfw3 -lgdi32
+else
+ SHAREDFLAG = BUILDING_STATIC
+endif
+
+# if static OpenAL Soft required, define the corresponding flags
+ifeq ($(SHARED_OPENAL),NO)
+ SHAREDLIBS += -lopenal32 -lwinmm
+ SHAREDOPENALFLAG = AL_LIBTYPE_STATIC
+else
+ SHAREDLIBS += -lopenal32dll
+ SHAREDOPENALFLAG = SHARED_OPENAL
+endif
+
+#CFLAGSEXTRA = -Wextra -Wmissing-prototypes -Wstrict-prototypes
+
+# define any directories containing required header files
+ifeq ($(PLATFORM),PLATFORM_ANDROID)
+# STB libraries and others
+ INCLUDES = -I. -Iexternal
+# OpenAL Soft library
+ INCLUDES += -Iexternal/openal_soft/include
+# Android includes
+ INCLUDES += -I$(ANDROID_TOOLCHAIN)/sysroot/usr/include
+ INCLUDES += -I$(ANDROID_NDK)/sources/android/native_app_glue
+else
+# STB libraries and others
+ INCLUDES = -I. -Iexternal
+# GLFW3 library
+ INCLUDES += -Iexternal/glfw3/include
+# OpenAL Soft library
+ INCLUDES += -Iexternal/openal_soft/include
+endif
+ifeq ($(PLATFORM),PLATFORM_RPI)
+# STB libraries and others
+ INCLUDES = -I. -Iexternal
+# RPi libraries
+ INCLUDES += -I/opt/vc/include
+ INCLUDES += -I/opt/vc/include/interface/vmcs_host/linux
+ INCLUDES += -I/opt/vc/include/interface/vcos/pthreads
+# OpenAL Soft library
+ INCLUDES += -Iexternal/openal_soft/include
+endif
+
+# define output directory for compiled library
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ ifeq ($(PLATFORM_OS),WINDOWS)
+ OUTPUT_PATH = ../release/win32/mingw32
+ endif
+ ifeq ($(PLATFORM_OS),LINUX)
+ OUTPUT_PATH = ../release/linux
+ endif
+ ifeq ($(PLATFORM_OS),OSX)
+ OUTPUT_PATH = ../release/osx
+ endif
+endif
+ifeq ($(PLATFORM),PLATFORM_ANDROID)
+ ifeq ($(ANDROID_ARCH),ARM)
+ OUTPUT_PATH = ../release/android/armeabi-v7a
+ endif
+ ifeq ($(ANDROID_ARCH),ARM64)
+ OUTPUT_PATH = ../release/android/arm64-v8a
+ endif
+endif
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ OUTPUT_PATH = ../release/html5
+endif
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ OUTPUT_PATH = ../release/rpi
+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.
+OBJS = $(patsubst %.c, %.o, $(wildcard *.c))
+OBJS += external/stb_vorbis.o
+
+# typing 'make' will invoke the default target entry called 'all',
+# in this case, the 'default' target entry is raylib
+all: toolchain raylib
+
+# make standalone Android toolchain
+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)
+ endif
+ ifeq ($(ANDROID_ARCH),ARM64)
+ $(ANDROID_NDK)/build/tools/make-standalone-toolchain.sh --platform=android-21 --toolchain=aarch64-linux-androideabi-4.9 --use-llvm --install-dir=$(ANDROID_TOOLCHAIN)
+ endif
+endif
+
+# compile raylib library
+raylib: $(OBJS)
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ # compile raylib for web.
+ emcc -O1 $(OBJS) -o $(OUTPUT_PATH)/libraylib.bc
+ @echo "libraylib.bc generated (web version)!"
+else
+ ifeq ($(SHARED),YES)
+ ifeq ($(PLATFORM_OS),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)
+ @echo "raylib shared library (libraylib.so) generated!"
+ endif
+ ifeq ($(PLATFORM_OS),WINDOWS)
+ $(CC) -shared -o $(OUTPUT_PATH)/raylib.dll $(OBJS) $(SHAREDLIBS) -Wl,--out-implib,$(OUTPUT_PATH)/libraylibdll.a
+ @echo "raylib dynamic library (raylib.dll) and import library (libraylibdll.a) generated!"
+ endif
+ ifeq ($(PLATFORM),PLATFORM_ANDROID)
+ $(CC) -shared -o $(OUTPUT_PATH)/libraylib.so $(OBJS)
+ @echo "raylib shared library (libraylib.so) generated!"
+ endif
+ else
+ # compile raylib static library.
+ $(AR) rcs $(OUTPUT_PATH)/libraylib.a $(OBJS)
+ @echo "libraylib.a generated (static library)!"
+ ifeq ($(SHARED_OPENAL),NO)
+ @echo "expected OpenAL Soft static library linking"
+ else
+ @echo "expected OpenAL Soft shared library linking"
+ endif
+ endif
+endif
+
+# compile all modules with their prerequisites
+
+# compile core module
+core.o : core.c raylib.h rlgl.h utils.h raymath.h gestures.h
+ $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
+
+# compile rlgl module
+rlgl.o : rlgl.c rlgl.h raymath.h
+ $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(GRAPHICS)
+
+# compile shapes module
+shapes.o : shapes.c raylib.h rlgl.h
+ $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(SHAREDFLAG)
+
+# compile textures module
+textures.o : textures.c rlgl.h utils.h
+ $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(GRAPHICS) -D$(SHAREDFLAG)
+
+# compile text module
+text.o : text.c raylib.h utils.h
+ $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(SHAREDFLAG)
+
+# compile models module
+models.o : models.c raylib.h rlgl.h raymath.h
+ $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
+
+# compile audio module
+audio.o : audio.c raylib.h
+ $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG) -D$(SHAREDOPENALFLAG)
+
+# compile stb_vorbis library
+external/stb_vorbis.o: external/stb_vorbis.c external/stb_vorbis.h
+ $(CC) -c -o $@ $< -O1 $(CFLAGS) $(INCLUDES) -D$(PLATFORM)
+
+# compile utils module
+utils.o : utils.c utils.h
+ $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
+
+# It installs generated and needed files to compile projects using raylib.
+# The installation works manually.
+# TODO: add other platforms.
+install :
+ifeq ($(ROOT),root)
+ ifeq ($(PLATFORM_OS),LINUX)
+ # On GNU/Linux there are some standard directories that contain
+ # libraries and header files. These directory (/usr/local/lib and
+ # /usr/local/include/) are for libraries that are installed
+ # manually (without a package manager).
+ ifeq ($(SHARED),YES)
+ cp --update $(OUTPUT_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
+ endif
+ @echo "raylib dev files installed/updated!"
+ else
+ @echo "This function works only on GNU/Linux systems"
+ endif
+else
+ @echo "Error: no root permissions"
+endif
+
+# it removes raylib dev files installed on the system.
+# TODO: see 'install' target.
+unistall :
+ifeq ($(ROOT),root)
+ ifeq ($(PLATFORM_OS),LINUX)
+ rm --force /usr/local/include/raylib.h
+ ifeq ($(SHARED),YES)
+ rm --force /usr/local/lib/libraylib.so
+ else
+ rm --force /usr/local/lib/libraylib.a
+ endif
+ @echo "raylib dev files removed!"
+ else
+ @echo "This function works only on GNU/Linux systems"
+ endif
+else
+ @echo "Error: no root permissions"
+endif
+
+# 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
+else
+ rm -f *.o $(OUTPUT_PATH)/libraylib.a $(OUTPUT_PATH)/libraylib.bc $(OUTPUT_PATH)/libraylib.so external/stb_vorbis.o
+endif
+ifeq ($(PLATFORM),PLATFORM_ANDROID)
+ rm -rf $(ANDROID_TOOLCHAIN)
+endif
+ @echo "removed all generated files!"