Files
raylib/src/Makefile

451 lines
15 KiB
Makefile
Raw Normal View History

#******************************************************************************
#
2017-05-08 00:47:15 +02:00
# raylib makefile
2017-03-24 03:32:07 -05:00
#
2017-05-08 00:47:15 +02:00
# Platforms supported:
# PLATFORM_DESKTOP: Windows (win32/Win64)
# PLATFORM_DESKTOP: Linux
# PLATFORM_DESKTOP: OSX (Mac)
# PLATFORM_ANDROID: Android (ARM or ARM64)
# PLATFORM_RPI: Raspberry Pi (Raspbian)
# PLATFORM_WEB: HTML5 (Chrome, Firefox)
#
2017-05-08 00:47:15 +02:00
# Many thanks to Milan Nikolic (@gen2brain) for implementing Android platform pipeline.
# Many thanks to Emanuele Petriglia for his contribution on GNU/Linux pipeline.
#
# Copyright (c) 2014-2017 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.
2017-05-08 00:47:15 +02:00
.PHONY: all clean install uninstall
# define raylib platform to compile for
2017-01-26 20:58:00 +01:00
# possible platforms: PLATFORM_DESKTOP PLATFORM_ANDROID PLATFORM_RPI PLATFORM_WEB
PLATFORM ?= PLATFORM_DESKTOP
2017-05-19 00:55:02 +02:00
# define raylib default path, required to look for emsdk and android-toolchain
RAYLIB_PATH ?= C:/raylib
# define YES if you want shared/dynamic version of library instead of static (default)
2017-05-19 00:55:02 +02:00
SHARED_RAYLIB ?= NO
# use OpenAL Soft as shared library (.so / .dll)
# NOTE: If defined NO, static OpenAL Soft library should be provided
2017-05-03 14:16:42 +02:00
SHARED_OPENAL ?= NO
2016-11-17 12:55:30 +01:00
# on PLATFORM_WEB force OpenAL Soft shared library
ifeq ($(PLATFORM),PLATFORM_WEB)
SHARED_OPENAL = YES
endif
ifeq ($(PLATFORM),PLATFORM_ANDROID)
SHARED_OPENAL = YES
2016-11-17 12:55:30 +01:00
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)
2017-03-24 03:28:12 -05:00
PLATFORM_OS=LINUX
else
ifeq ($(UNAMEOS),Darwin)
PLATFORM_OS=OSX
endif
endif
endif
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
# Emscripten required variables
2017-05-19 00:55:02 +02:00
EMSDK_PATH = $(RAYLIB_PATH)/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
2017-01-26 20:58:00 +01:00
ifeq ($(PLATFORM),PLATFORM_ANDROID)
2017-05-08 00:47:15 +02:00
# Android NDK path
# NOTE: Required for standalone toolchain generation
2017-01-26 20:58:00 +01:00
ANDROID_NDK = $(ANDROID_NDK_HOME)
2017-05-08 00:47:15 +02:00
# Android standalone toolchain path
# NOTE: This path is also used if toolchain generation
#ANDROID_TOOLCHAIN = $(CURDIR)/toolchain
2017-05-19 00:55:02 +02:00
ANDROID_TOOLCHAIN = $(RAYLIB_PATH)/android-toolchain
2017-01-26 20:58:00 +01:00
2017-05-08 00:47:15 +02:00
# Android architecture: ARM or ARM64
2017-01-26 20:58:00 +01:00
ANDROID_ARCH ?= ARM
2017-05-08 00:47:15 +02:00
# Android compiler: gcc or clang
# NOTE: Define YES to use clang instead of gcc
2017-01-26 20:58:00 +01:00
ANDROID_LLVM ?= NO
endif
ifeq ($(PLATFORM),PLATFORM_RPI)
2017-05-08 00:47:15 +02:00
# RPI cross-compiler
CROSS_COMPILE ?= NO
endif
# define raylib graphics api depending on selected platform
2017-05-08 00:47:15 +02:00
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
# 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
2016-06-16 20:25:50 +02:00
#GRAPHICS = GRAPHICS_API_OPENGL_21 # Uncomment to use OpenGL 2.1
endif
2017-05-08 00:47:15 +02:00
ifeq ($(PLATFORM),PLATFORM_RPI)
# on RPI OpenGL ES 2.0 must be used
GRAPHICS = GRAPHICS_API_OPENGL_ES2
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
2017-05-08 00:47:15 +02:00
# 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
GRAPHICS = GRAPHICS_API_OPENGL_ES2
endif
# NOTE: makefiles targets require tab indentation
2017-05-08 00:47:15 +02:00
# NOTE: define compiler: gcc for C program, define as g++ for C++
2017-01-26 20:58:00 +01:00
# default gcc compiler
CC = gcc
2017-07-18 22:23:43 -04:00
# For OS X
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
ifeq ($(PLATFORM_OS),OSX)
CC = clang
endif
endif
2017-05-08 00:47:15 +02:00
# Android toolchain compiler
2017-01-26 20:58:00 +01:00
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
2017-05-08 00:47:15 +02:00
# RPI cross-compiler
ifeq ($(PLATFORM),PLATFORM_RPI)
ifeq ($(CROSS_COMPILE),YES)
# rpi compiler
CC = armv6j-hardfloat-linux-gnueabi-gcc
endif
endif
2017-05-08 00:47:15 +02:00
# HTML5 emscripten compiler
ifeq ($(PLATFORM),PLATFORM_WEB)
2016-07-18 17:07:50 +02:00
CC = emcc
2017-01-26 20:58:00 +01:00
endif
2017-05-08 00:47:15 +02:00
# default archiver program to pack libraries
2017-01-26 20:58:00 +01:00
AR = ar
2017-05-08 00:47:15 +02:00
# Android archiver
2017-01-26 20:58:00 +01:00
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:
2017-03-24 03:42:10 -05:00
# -O1 defines optimization level
2017-03-24 01:20:24 -05:00
# -Og enable debugging
2016-06-01 12:38:06 +02:00
# -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)
2016-06-01 12:38:06 +02:00
# -Wno-missing-braces ignore invalid warning (GCC bug 53119)
# -D_DEFAULT_SOURCE use with -std=c99
CFLAGS += -O1 -Wall -std=c99 -D_DEFAULT_SOURCE -fgnu89-inline -Wno-missing-braces
2017-03-24 03:28:12 -05:00
ifeq ($(PLATFORM),PLATFORM_WEB)
CFLAGS += -s USE_GLFW=3 -s ASSERTIONS=1 --profiling --preload-file resources
2017-03-29 16:04:29 -05:00
# -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
2017-03-24 03:28:12 -05:00
endif
2017-03-24 01:20:24 -05:00
2017-03-24 03:37:49 -05:00
#CFLAGSEXTRA = -Wextra -Wmissing-prototypes -Wstrict-prototypes
2016-07-18 17:07:50 +02:00
# if shared library required, make sure code is compiled as position independent
2017-05-19 00:55:02 +02:00
ifeq ($(SHARED_RAYLIB),YES)
CFLAGS += -fPIC
SHAREDFLAG = BUILDING_DLL
2016-09-21 12:29:03 +02:00
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
2017-05-08 00:47:15 +02:00
# external required libraries (stb and others)
INCLUDES = -I. -Iexternal
2017-05-11 16:45:49 +02:00
2017-01-26 20:58:00 +01:00
# OpenAL Soft library
2017-05-18 19:24:24 +02:00
INCLUDES += -Iexternal/openal_soft/include
2017-05-08 00:47:15 +02:00
# define any directories containing required header files
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
# GLFW3 library
INCLUDES += -Iexternal/glfw3/include
endif
ifeq ($(PLATFORM),PLATFORM_RPI)
2017-05-08 00:47:15 +02:00
# RPI requried libraries
INCLUDES += -I/opt/vc/include
INCLUDES += -I/opt/vc/include/interface/vmcs_host/linux
INCLUDES += -I/opt/vc/include/interface/vcos/pthreads
2017-05-08 00:47:15 +02:00
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
# GLFW3 library
INCLUDES += -Iexternal/glfw3/include
endif
ifeq ($(PLATFORM),PLATFORM_ANDROID)
# Android required libraries
INCLUDES += -I$(ANDROID_TOOLCHAIN)/sysroot/usr/include
# Include android_native_app_glue.h
2017-05-18 19:24:24 +02:00
INCLUDES += -Iexternal/android/native_app_glue
2017-05-08 00:47:15 +02:00
#INCLUDES += -I$(ANDROID_NDK)/sources/android/native_app_glue
endif
2016-07-18 17:07:50 +02:00
# define output directory for compiled library
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
ifeq ($(PLATFORM_OS),WINDOWS)
OUTPUT_PATH = ../release/win32/mingw32
endif
2017-03-24 03:28:12 -05:00
ifeq ($(PLATFORM_OS),LINUX)
2016-07-18 17:07:50 +02:00
OUTPUT_PATH = ../release/linux
endif
ifeq ($(PLATFORM_OS),OSX)
OUTPUT_PATH = ../release/osx
endif
endif
2017-05-08 00:47:15 +02:00
ifeq ($(PLATFORM),PLATFORM_RPI)
OUTPUT_PATH = ../release/rpi
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
OUTPUT_PATH = ../release/html5
endif
2017-01-26 20:58:00 +01:00
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
2016-07-18 17:07:50 +02:00
2016-07-16 21:01:43 +02:00
# 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.
2016-07-16 21:01:43 +02:00
OBJS = $(patsubst %.c, %.o, $(wildcard *.c))
OBJS += external/stb_vorbis.o
2016-07-18 17:07:50 +02:00
# typing 'make' will invoke the default target entry called 'all',
# in this case, the 'default' target entry is raylib
2017-05-08 00:47:15 +02:00
all: raylib
2017-01-26 20:58:00 +01:00
2017-05-08 00:47:15 +02:00
# generate standalone Android toolchain
# NOTE: Android toolchain could already be provided
2017-01-26 20:58:00 +01:00
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
2016-07-18 17:07:50 +02:00
# 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)!"
2016-07-18 17:07:50 +02:00
else
2017-05-19 00:55:02 +02:00
ifeq ($(SHARED_RAYLIB),YES)
2017-07-17 14:16:23 +02:00
# 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) $(SHAREDLIBS) -Lexternal/glfw3/lib/win32 -Lexternal/openal_soft/lib/win32 -lglfw3 -lgdi32 -Wl,--out-implib,$(OUTPUT_PATH)/libraylibdll.a
@echo "raylib dynamic library (raylib.dll) and import library (libraylibdll.a) generated!"
endif
2017-03-24 03:28:12 -05:00
ifeq ($(PLATFORM_OS),LINUX)
# compile raylib to shared library version for GNU/Linux.
2017-03-24 03:32:07 -05:00
# WARNING: you should type "make clean" before doing this target
$(CC) -shared -o $(OUTPUT_PATH)/libraylib.so $(OBJS) -lglfw -lGL -lopenal -lm -lpthread -ldl
2017-07-17 14:16:23 +02:00
@echo "raylib shared library generated (libraylib.so)!"
endif
2017-07-17 14:16:23 +02:00
ifeq ($(PLATFORM_OS),OSX)
2017-07-18 22:23:43 -04:00
$(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
@echo "raylib shared library generated (libraylib.dylib)!"
endif
2017-01-26 20:58:00 +01:00
ifeq ($(PLATFORM),PLATFORM_ANDROID)
$(CC) -shared -o $(OUTPUT_PATH)/libraylib.so $(OBJS)
2017-05-10 19:37:48 +02:00
@echo "raylib shared library generated (libraylib.so)!"
2017-01-26 20:58:00 +01:00
endif
2016-07-18 17:07:50 +02:00
else
2017-05-03 14:16:42 +02:00
# compile raylib static library.
2017-01-26 20:58:00 +01:00
$(AR) rcs $(OUTPUT_PATH)/libraylib.a $(OBJS)
2017-05-10 19:37:48 +02:00
@echo "raylib static library generated (libraylib.a)!"
ifeq ($(SHARED_OPENAL),NO)
@echo "expected OpenAL Soft static library linking"
else
@echo "expected OpenAL Soft shared library linking"
endif
2016-07-18 17:07:50 +02:00
endif
endif
2016-07-18 17:07:50 +02:00
# compile all modules with their prerequisites
2016-07-18 17:07:50 +02:00
# 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)
2016-07-18 17:07:50 +02:00
# compile rlgl module
rlgl.o : rlgl.c rlgl.h raymath.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(GRAPHICS)
2017-03-24 03:32:07 -05:00
2016-07-18 17:07:50 +02:00
# compile shapes module
shapes.o : shapes.c raylib.h rlgl.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(SHAREDFLAG)
2017-03-24 03:32:07 -05:00
2016-07-18 17:07:50 +02:00
# compile textures module
textures.o : textures.c rlgl.h utils.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(GRAPHICS) -D$(SHAREDFLAG)
2016-07-18 17:07:50 +02:00
# compile text module
text.o : text.c raylib.h utils.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(SHAREDFLAG)
2016-07-18 17:07:50 +02:00
# compile models module
models.o : models.c raylib.h rlgl.h raymath.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
2016-07-18 17:07:50 +02:00
# compile audio module
audio.o : audio.c raylib.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG) -D$(SHAREDOPENALFLAG)
2017-03-24 03:32:07 -05:00
# compile stb_vorbis library
external/stb_vorbis.o: external/stb_vorbis.c external/stb_vorbis.h
$(CC) -c -o $@ $< -O1 $(CFLAGS) $(INCLUDES) -D$(PLATFORM)
2016-07-18 17:07:50 +02:00
# compile utils module
utils.o : utils.c utils.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
2016-07-18 17:07:50 +02:00
2016-07-18 15:13:43 +02:00
# It installs generated and needed files to compile projects using raylib.
# The installation works manually.
# TODO: add other platforms.
install :
ifeq ($(ROOT),root)
2017-03-24 03:28:12 -05:00
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).
2017-05-19 00:55:02 +02:00
ifeq ($(SHARED_RAYLIB),YES)
2016-08-04 15:48:37 +02:00
cp --update $(OUTPUT_PATH)/libraylib.so /usr/local/lib/libraylib.so
else
2016-07-18 15:13:43 +02:00
cp --update raylib.h /usr/local/include/raylib.h
2016-08-04 15:48:37 +02:00
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.
2017-05-08 00:47:15 +02:00
uninstall :
ifeq ($(ROOT),root)
2017-03-24 03:28:12 -05:00
ifeq ($(PLATFORM_OS),LINUX)
rm --force /usr/local/include/raylib.h
2017-05-19 00:55:02 +02:00
ifeq ($(SHARED_RAYLIB),YES)
rm --force /usr/local/lib/libraylib.so
else
rm --force /usr/local/lib/libraylib.a
endif
@echo "raylib dev files removed!"
else
2016-07-18 17:07:50 +02:00
@echo "This function works only on GNU/Linux systems"
endif
else
@echo "Error: no root permissions"
endif
# clean everything
clean:
ifeq ($(PLATFORM_OS),WINDOWS)
2016-07-18 17:07:50 +02:00
del *.o $(OUTPUT_PATH)/libraylib.a $(OUTPUT_PATH)/libraylib.bc $(OUTPUT_PATH)/libraylib.so external/stb_vorbis.o
else
2016-07-18 17:07:50 +02:00
rm -f *.o $(OUTPUT_PATH)/libraylib.a $(OUTPUT_PATH)/libraylib.bc $(OUTPUT_PATH)/libraylib.so external/stb_vorbis.o
2017-01-26 20:58:00 +01:00
endif
ifeq ($(PLATFORM),PLATFORM_ANDROID)
rm -rf $(ANDROID_TOOLCHAIN)
endif
@echo "removed all generated files!"