From ab05ace3ce8b999ab665194e63b8b5d03a7787ac Mon Sep 17 00:00:00 2001 From: ratalaika Date: Sat, 22 Nov 2014 00:13:09 +0100 Subject: [PATCH] Added first version of OS X compilation support --- OSX.diff | 167 ++++++++++++++++++ examples/makefile | 23 ++- examples/textures_logo_raylib.c | 2 +- .../glfw3/lib/cmake/glfw/glfwConfig.cmake | 10 ++ .../lib/cmake/glfw/glfwConfigVersion.cmake | 12 ++ .../lib/cmake/glfw/glfwTargets-debug.cmake | 20 +++ .../glfw3/lib/cmake/glfw/glfwTargets.cmake | 84 +++++++++ external/glfw3/lib/libglfw.3.0.dylib | Bin 0 -> 127856 bytes external/glfw3/lib/libglfw.3.dylib | 1 + external/glfw3/lib/libglfw.dylib | 1 + external/glfw3/lib/pkgconfig/glfw3.pc | 13 ++ src/makefile | 10 +- src/rlgl.c | 16 +- src/utils.c | 4 +- 14 files changed, 352 insertions(+), 11 deletions(-) create mode 100644 OSX.diff create mode 100644 external/glfw3/lib/cmake/glfw/glfwConfig.cmake create mode 100644 external/glfw3/lib/cmake/glfw/glfwConfigVersion.cmake create mode 100644 external/glfw3/lib/cmake/glfw/glfwTargets-debug.cmake create mode 100644 external/glfw3/lib/cmake/glfw/glfwTargets.cmake create mode 100755 external/glfw3/lib/libglfw.3.0.dylib create mode 120000 external/glfw3/lib/libglfw.3.dylib create mode 120000 external/glfw3/lib/libglfw.dylib create mode 100644 external/glfw3/lib/pkgconfig/glfw3.pc diff --git a/OSX.diff b/OSX.diff new file mode 100644 index 00000000..59b6fa6a --- /dev/null +++ b/OSX.diff @@ -0,0 +1,167 @@ +diff --git a/examples/makefile b/examples/makefile +index 076c959..f445321 100644 +--- a/examples/makefile ++++ b/examples/makefile +@@ -24,8 +24,8 @@ + #************************************************************************************************** + + # define raylib platform (by default, compile for RPI) +-# Other possible platforms: PLATFORM_DESKTOP PLATFORM_DESKTOP_LINUX +-PLATFORM ?= PLATFORM_RPI ++# Other possible platforms: PLATFORM_DESKTOP PLATFORM_DESKTOP_LINUX PLATFORM_DESKTOP_OSX ++PLATFORM ?= PLATFORM_DESKTOP_OSX + + # define compiler: gcc for C program, define as g++ for C++ + CC = gcc +@@ -55,6 +55,14 @@ else + LFLAGS = -L. -L../src -L/opt/vc/lib + endif + ++# define library paths containing required libs ++ifeq ($(PLATFORM),PLATFORM_DESKTOP_OSX) ++ LFLAGS = -L. -L../src -L../external/glfw3/lib/ -I../external/openal_soft/lib/ ++else ++ LFLAGS = -L. -L../src ++endif ++ ++ + # define any libraries to link into executable + # if you want to link libraries (libname.so or libname.a), use the -lname + ifeq ($(PLATFORM),PLATFORM_RPI) +@@ -68,11 +76,18 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP_LINUX) + # libglfw3-dev libopenal-dev libglew-dev libegl1-mesa-dev + LIBS = -lraylib -lglfw -lGLEW -lGL -lopenal + else ++ifeq ($(PLATFORM),PLATFORM_DESKTOP_OSX) ++ # libraries for OS X 10.9 desktop compiling ++ # requires the following packages: ++ # libglfw3-dev libopenal-dev libglew-dev libegl1-mesa-dev ++ LIBS = -lraylib -lglfw -framework OpenGL -framework OpenAl -framework Cocoa ++else + # libraries for Windows desktop compiling + # NOTE: GLFW3 and OpenAL Soft libraries should be installed + LIBS = -lraylib -lglfw3 -lglew32 -lopengl32 -lopenal32 -lgdi32 + endif + endif ++endif + + # define additional parameters and flags for windows + ifeq ($(PLATFORM),PLATFORM_DESKTOP) +@@ -254,9 +269,13 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP_LINUX) + find . -type f -executable -delete + rm -f *.o + else ++ifeq ($(PLATFORM),PLATFORM_DESKTOP_OSX) ++ rm -f *.o ++else + del *.o *.exe + endif + endif ++endif + @echo Cleaning done + + # instead of defining every module one by one, we can define a pattern +diff --git a/examples/textures_logo_raylib.c b/examples/textures_logo_raylib.c +index f4aeb73..b56f5f0 100644 +--- a/examples/textures_logo_raylib.c ++++ b/examples/textures_logo_raylib.c +@@ -21,7 +21,7 @@ int main() + InitWindow(screenWidth, screenHeight, "raylib [textures] example - texture loading and drawing"); + + // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) +- Texture2D texture = LoadTexture("resources/raylib_logo.png"); // Texture loading ++ Texture2D texture = LoadTexture("./resources/raylib_logo.png"); // Texture loading + //--------------------------------------------------------------------------------------- + + // Main game loop +diff --git a/src/makefile b/src/makefile +index 0c078e8..780aa16 100644 +--- a/src/makefile ++++ b/src/makefile +@@ -24,8 +24,8 @@ + #************************************************************************************************** + + # define raylib platform (by default, compile for RPI) +-# Other possible platforms: PLATFORM_DESKTOP PLATFORM_DESKTOP_LINUX +-PLATFORM ?= PLATFORM_RPI ++# Other possible platforms: PLATFORM_DESKTOP PLATFORM_DESKTOP_LINUX PLATFORM_DESKTOP_OSX ++PLATFORM ?= PLATFORM_DESKTOP_OSX + + # define raylib graphics api depending on selected platform + ifeq ($(PLATFORM),PLATFORM_RPI) +@@ -57,7 +57,7 @@ endif + ifeq ($(PLATFORM),PLATFORM_RPI) + INCLUDES = -I. -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads + else +- INCLUDES = -I. ++ INCLUDES = -I. -I../external/glfw3/include/ -I../external/openal_soft/include/ + endif + + # define all object files required +@@ -124,9 +124,13 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP_LINUX) + find . -type f -executable -delete + rm -f *.o libraylib.a + else ++ifeq ($(PLATFORM),PLATFORM_DESKTOP_OSX) ++ rm -f *.o libraylib.a ++else + del *.o libraylib.a + endif + endif ++endif + @echo Cleaning done + + # instead of defining every module one by one, we can define a pattern +diff --git a/src/rlgl.c b/src/rlgl.c +index 8f1a66a..865281a 100644 +--- a/src/rlgl.c ++++ b/src/rlgl.c +@@ -32,13 +32,23 @@ + #include // Declares malloc() and free() for memory management, rand() + + #if defined(GRAPHICS_API_OPENGL_11) +- #include // Basic OpenGL include ++ #ifdef __APPLE__ ++ #include ++ #include ++ #include ++ #else ++ #include // Basic OpenGL include ++ #endif + #endif + + #if defined(GRAPHICS_API_OPENGL_33) + #define GLEW_STATIC +- #include // Extensions loading lib +- //#include "glad.h" // TODO: Other extensions loading lib? --> REVIEW ++ #ifdef __APPLE__ ++ #include ++ #else ++ #include // Extensions loading lib ++ //#include "glad.h" // TODO: Other extensions loading lib? --> REVIEW ++ #endif + #endif + + #if defined(GRAPHICS_API_OPENGL_ES2) +diff --git a/src/utils.c b/src/utils.c +index b511211..26a4406 100644 +--- a/src/utils.c ++++ b/src/utils.c +@@ -40,7 +40,7 @@ + #include // Used for functions with variable number of parameters (TraceLog()) + //#include // String management functions: strlen(), strrchr(), strcmp() + +-#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) ++#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_DESKTOP_OSX) + #define STB_IMAGE_WRITE_IMPLEMENTATION + #include "stb_image_write.h" // Create PNG file + #endif +@@ -107,7 +107,7 @@ unsigned char *DecompressData(const unsigned char *data, unsigned long compSize, + return pUncomp; + } + +-#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) ++#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_DESKTOP_OSX) + // Creates a bitmap (BMP) file from an array of pixel data + // NOTE: This function is not explicitly available to raylib users + void WriteBitmap(const char *fileName, unsigned char *imgData, int width, int height) diff --git a/examples/makefile b/examples/makefile index 076c9594..f4453213 100644 --- a/examples/makefile +++ b/examples/makefile @@ -24,8 +24,8 @@ #************************************************************************************************** # define raylib platform (by default, compile for RPI) -# Other possible platforms: PLATFORM_DESKTOP PLATFORM_DESKTOP_LINUX -PLATFORM ?= PLATFORM_RPI +# Other possible platforms: PLATFORM_DESKTOP PLATFORM_DESKTOP_LINUX PLATFORM_DESKTOP_OSX +PLATFORM ?= PLATFORM_DESKTOP_OSX # define compiler: gcc for C program, define as g++ for C++ CC = gcc @@ -55,6 +55,14 @@ else LFLAGS = -L. -L../src -L/opt/vc/lib endif +# define library paths containing required libs +ifeq ($(PLATFORM),PLATFORM_DESKTOP_OSX) + LFLAGS = -L. -L../src -L../external/glfw3/lib/ -I../external/openal_soft/lib/ +else + LFLAGS = -L. -L../src +endif + + # define any libraries to link into executable # if you want to link libraries (libname.so or libname.a), use the -lname ifeq ($(PLATFORM),PLATFORM_RPI) @@ -67,12 +75,19 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP_LINUX) # requires the following packages: # libglfw3-dev libopenal-dev libglew-dev libegl1-mesa-dev LIBS = -lraylib -lglfw -lGLEW -lGL -lopenal +else +ifeq ($(PLATFORM),PLATFORM_DESKTOP_OSX) + # libraries for OS X 10.9 desktop compiling + # requires the following packages: + # libglfw3-dev libopenal-dev libglew-dev libegl1-mesa-dev + LIBS = -lraylib -lglfw -framework OpenGL -framework OpenAl -framework Cocoa else # libraries for Windows desktop compiling # NOTE: GLFW3 and OpenAL Soft libraries should be installed LIBS = -lraylib -lglfw3 -lglew32 -lopengl32 -lopenal32 -lgdi32 endif endif +endif # define additional parameters and flags for windows ifeq ($(PLATFORM),PLATFORM_DESKTOP) @@ -253,9 +268,13 @@ else ifeq ($(PLATFORM),PLATFORM_DESKTOP_LINUX) find . -type f -executable -delete rm -f *.o +else +ifeq ($(PLATFORM),PLATFORM_DESKTOP_OSX) + rm -f *.o else del *.o *.exe endif +endif endif @echo Cleaning done diff --git a/examples/textures_logo_raylib.c b/examples/textures_logo_raylib.c index f4aeb738..b56f5f03 100644 --- a/examples/textures_logo_raylib.c +++ b/examples/textures_logo_raylib.c @@ -21,7 +21,7 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [textures] example - texture loading and drawing"); // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) - Texture2D texture = LoadTexture("resources/raylib_logo.png"); // Texture loading + Texture2D texture = LoadTexture("./resources/raylib_logo.png"); // Texture loading //--------------------------------------------------------------------------------------- // Main game loop diff --git a/external/glfw3/lib/cmake/glfw/glfwConfig.cmake b/external/glfw3/lib/cmake/glfw/glfwConfig.cmake new file mode 100644 index 00000000..b11654d3 --- /dev/null +++ b/external/glfw3/lib/cmake/glfw/glfwConfig.cmake @@ -0,0 +1,10 @@ +# - Config file for the glfw package +# It defines the following variables +# GLFW_INCLUDE_DIR, the path where GLFW headers are located +# GLFW_LIBRARY_DIR, folder in which the GLFW library is located +# GLFW_LIBRARY, library to link against to use GLFW + +set(GLFW_INCLUDE_DIR "/Users/ratalaika/Repositories/external/glfw3/lib/include") +set(GLFW_LIBRARY_DIR "/Users/ratalaika/Repositories/external/glfw3/lib/lib") + +find_library(GLFW_LIBRARY "glfw" HINTS ${GLFW_LIBRARY_DIR}) diff --git a/external/glfw3/lib/cmake/glfw/glfwConfigVersion.cmake b/external/glfw3/lib/cmake/glfw/glfwConfigVersion.cmake new file mode 100644 index 00000000..524c86dc --- /dev/null +++ b/external/glfw3/lib/cmake/glfw/glfwConfigVersion.cmake @@ -0,0 +1,12 @@ + +set(PACKAGE_VERSION "3.0.4") + +if ("${PACKAGE_FIND_VERSION_MAJOR}" EQUAL "3") + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_FIND_VERSION_MINOR}" EQUAL 0) + set(PACKAGE_VERSION_EXACT TRUE) + endif() +else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) +endif() + diff --git a/external/glfw3/lib/cmake/glfw/glfwTargets-debug.cmake b/external/glfw3/lib/cmake/glfw/glfwTargets-debug.cmake new file mode 100644 index 00000000..f35f7d2f --- /dev/null +++ b/external/glfw3/lib/cmake/glfw/glfwTargets-debug.cmake @@ -0,0 +1,20 @@ +#---------------------------------------------------------------- +# Generated CMake target import file for configuration "Debug". +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Import target "glfw" for configuration "Debug" +set_property(TARGET glfw APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(glfw PROPERTIES + IMPORTED_LINK_INTERFACE_LIBRARIES_DEBUG "" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/lib/libglfw.3.0.dylib" + IMPORTED_SONAME_DEBUG "/Users/ratalaika/Repositories/external/glfw3/lib/lib/libglfw.3.dylib" + ) + +list(APPEND _IMPORT_CHECK_TARGETS glfw ) +list(APPEND _IMPORT_CHECK_FILES_FOR_glfw "${_IMPORT_PREFIX}/lib/libglfw.3.0.dylib" ) + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) diff --git a/external/glfw3/lib/cmake/glfw/glfwTargets.cmake b/external/glfw3/lib/cmake/glfw/glfwTargets.cmake new file mode 100644 index 00000000..bd183427 --- /dev/null +++ b/external/glfw3/lib/cmake/glfw/glfwTargets.cmake @@ -0,0 +1,84 @@ +# Generated by CMake 3.1.0-rc2 + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) + message(FATAL_ERROR "CMake >= 2.6.0 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.6) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_targetsDefined) +set(_targetsNotDefined) +set(_expectedTargets) +foreach(_expectedTarget glfw) + list(APPEND _expectedTargets ${_expectedTarget}) + if(NOT TARGET ${_expectedTarget}) + list(APPEND _targetsNotDefined ${_expectedTarget}) + endif() + if(TARGET ${_expectedTarget}) + list(APPEND _targetsDefined ${_expectedTarget}) + endif() +endforeach() +if("${_targetsDefined}" STREQUAL "${_expectedTargets}") + set(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT "${_targetsDefined}" STREQUAL "") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") +endif() +unset(_targetsDefined) +unset(_targetsNotDefined) +unset(_expectedTargets) + + +# Compute the installation prefix relative to this file. +get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) + +# Create imported target glfw +add_library(glfw SHARED IMPORTED) + +# Load information for each installed configuration. +get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(GLOB CONFIG_FILES "${_DIR}/glfwTargets-*.cmake") +foreach(f ${CONFIG_FILES}) + include(${f}) +endforeach() + +# Cleanup temporary variables. +set(_IMPORT_PREFIX) + +# Loop over all imported files and verify that they actually exist +foreach(target ${_IMPORT_CHECK_TARGETS} ) + foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) + if(NOT EXISTS "${file}" ) + message(FATAL_ERROR "The imported target \"${target}\" references the file + \"${file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + unset(_IMPORT_CHECK_FILES_FOR_${target}) +endforeach() +unset(_IMPORT_CHECK_TARGETS) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) diff --git a/external/glfw3/lib/libglfw.3.0.dylib b/external/glfw3/lib/libglfw.3.0.dylib new file mode 100755 index 0000000000000000000000000000000000000000..963d716d127232cb0f65aeee06c70e6fa92d5739 GIT binary patch literal 127856 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 literal 0 HcmV?d00001 diff --git a/external/glfw3/lib/libglfw.3.dylib b/external/glfw3/lib/libglfw.3.dylib new file mode 120000 index 00000000..cd20112e --- /dev/null +++ b/external/glfw3/lib/libglfw.3.dylib @@ -0,0 +1 @@ +libglfw.3.0.dylib \ No newline at end of file diff --git a/external/glfw3/lib/libglfw.dylib b/external/glfw3/lib/libglfw.dylib new file mode 120000 index 00000000..d4bd51e1 --- /dev/null +++ b/external/glfw3/lib/libglfw.dylib @@ -0,0 +1 @@ +libglfw.3.dylib \ No newline at end of file diff --git a/external/glfw3/lib/pkgconfig/glfw3.pc b/external/glfw3/lib/pkgconfig/glfw3.pc new file mode 100644 index 00000000..f5252b35 --- /dev/null +++ b/external/glfw3/lib/pkgconfig/glfw3.pc @@ -0,0 +1,13 @@ +prefix=/Users/ratalaika/Repositories/external/glfw3/lib +exec_prefix=${prefix} +includedir=${prefix}/include +libdir=${exec_prefix}/lib + +Name: GLFW +Description: A portable library for OpenGL, window and input +Version: 3.0.4 +URL: http://www.glfw.org/ +Requires.private: +Libs: -L${libdir} -lglfw +Libs.private: -framework Cocoa -framework OpenGL -framework IOKit -framework CoreFoundation -framework CoreVideo +Cflags: -I${includedir} diff --git a/src/makefile b/src/makefile index 0c078e86..780aa16b 100644 --- a/src/makefile +++ b/src/makefile @@ -24,8 +24,8 @@ #************************************************************************************************** # define raylib platform (by default, compile for RPI) -# Other possible platforms: PLATFORM_DESKTOP PLATFORM_DESKTOP_LINUX -PLATFORM ?= PLATFORM_RPI +# Other possible platforms: PLATFORM_DESKTOP PLATFORM_DESKTOP_LINUX PLATFORM_DESKTOP_OSX +PLATFORM ?= PLATFORM_DESKTOP_OSX # define raylib graphics api depending on selected platform ifeq ($(PLATFORM),PLATFORM_RPI) @@ -57,7 +57,7 @@ endif ifeq ($(PLATFORM),PLATFORM_RPI) INCLUDES = -I. -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads else - INCLUDES = -I. + INCLUDES = -I. -I../external/glfw3/include/ -I../external/openal_soft/include/ endif # define all object files required @@ -123,9 +123,13 @@ else ifeq ($(PLATFORM),PLATFORM_DESKTOP_LINUX) find . -type f -executable -delete rm -f *.o libraylib.a +else +ifeq ($(PLATFORM),PLATFORM_DESKTOP_OSX) + rm -f *.o libraylib.a else del *.o libraylib.a endif +endif endif @echo Cleaning done diff --git a/src/rlgl.c b/src/rlgl.c index 8f1a66a8..865281a3 100644 --- a/src/rlgl.c +++ b/src/rlgl.c @@ -32,13 +32,23 @@ #include // Declares malloc() and free() for memory management, rand() #if defined(GRAPHICS_API_OPENGL_11) - #include // Basic OpenGL include + #ifdef __APPLE__ + #include + #include + #include + #else + #include // Basic OpenGL include + #endif #endif #if defined(GRAPHICS_API_OPENGL_33) #define GLEW_STATIC - #include // Extensions loading lib - //#include "glad.h" // TODO: Other extensions loading lib? --> REVIEW + #ifdef __APPLE__ + #include + #else + #include // Extensions loading lib + //#include "glad.h" // TODO: Other extensions loading lib? --> REVIEW + #endif #endif #if defined(GRAPHICS_API_OPENGL_ES2) diff --git a/src/utils.c b/src/utils.c index b5112111..26a44065 100644 --- a/src/utils.c +++ b/src/utils.c @@ -40,7 +40,7 @@ #include // Used for functions with variable number of parameters (TraceLog()) //#include // String management functions: strlen(), strrchr(), strcmp() -#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) +#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_DESKTOP_OSX) #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h" // Create PNG file #endif @@ -107,7 +107,7 @@ unsigned char *DecompressData(const unsigned char *data, unsigned long compSize, return pUncomp; } -#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) +#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_DESKTOP_OSX) // Creates a bitmap (BMP) file from an array of pixel data // NOTE: This function is not explicitly available to raylib users void WriteBitmap(const char *fileName, unsigned char *imgData, int width, int height)