Prechádzať zdrojové kódy

Documentation cmake (#1549)

* Documenting the compiler flags

* Moved some android compiler flags and added documentation on them too.

* Some more restructuring.

Removed unnecessary comments that were self described by the code.
Added some more explanations around certain parts of CMake and especially around compiler flags.
hristo 4 rokov pred
rodič
commit
88a6f16c9a

+ 4 - 2
CMakeLists.txt

@@ -2,9 +2,11 @@ cmake_minimum_required(VERSION 3.0)
 project(raylib)
 project(raylib)
 
 
 # Directory for easier includes
 # Directory for easier includes
+# Anywhere you see include(...) you can check <root>/cmake for that file
 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
 
 
-# RAYLIB_IS_MAIN determines whether the project is being used from root, or as a dependency.
+# RAYLIB_IS_MAIN determines whether the project is being used from root
+# or if it is added as a dependency (through add_subdirectory for example).
 if ("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
 if ("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
   set(RAYLIB_IS_MAIN TRUE)
   set(RAYLIB_IS_MAIN TRUE)
 else()
 else()
@@ -17,7 +19,7 @@ include(CompilerFlags)
 # Registers build options that are exposed to cmake
 # Registers build options that are exposed to cmake
 include(CMakeOptions.txt)
 include(CMakeOptions.txt)
 
 
-# Checks a few environment and compiler configurations
+# Enforces a few environment and compiler configurations
 include(BuildOptions)
 include(BuildOptions)
 
 
 # Main sources directory (the second parameter sets the output directory name to raylib)
 # Main sources directory (the second parameter sets the output directory name to raylib)

+ 53 - 7
cmake/CompilerFlags.cmake

@@ -1,29 +1,53 @@
 include(AddIfFlagCompiles)
 include(AddIfFlagCompiles)
 
 
+# Makes +/- operations on void pointers be considered an error
+# https://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html
 add_if_flag_compiles(-Werror=pointer-arith CMAKE_C_FLAGS)
 add_if_flag_compiles(-Werror=pointer-arith CMAKE_C_FLAGS)
+
+# Generates error whenever a function is used before being declared
+# https://gcc.gnu.org/onlinedocs/gcc-4.0.1/gcc/Warning-Options.html
 add_if_flag_compiles(-Werror=implicit-function-declaration CMAKE_C_FLAGS)
 add_if_flag_compiles(-Werror=implicit-function-declaration CMAKE_C_FLAGS)
-# src/external/jar_xm.h does shady stuff
+
+# Allows some casting of pointers without generating a warning
 add_if_flag_compiles(-fno-strict-aliasing CMAKE_C_FLAGS)
 add_if_flag_compiles(-fno-strict-aliasing CMAKE_C_FLAGS)
 
 
+if (ENABLE_MSAN AND ENABLE_ASAN)
+    # MSAN and ASAN both work on memory - ASAN does more things
+    MESSAGE(WARNING "Compiling with both AddressSanitizer and MemorySanitizer is not recommended")
+endif()
+
 if (ENABLE_ASAN)
 if (ENABLE_ASAN)
+    
+    # If enabled it would generate errors/warnings for all kinds of memory errors
+    # (like returning a stack variable by reference)
+    # https://clang.llvm.org/docs/AddressSanitizer.html
+    
     add_if_flag_compiles(-fno-omit-frame-pointer CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
     add_if_flag_compiles(-fno-omit-frame-pointer CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
     add_if_flag_compiles(-fsanitize=address CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
     add_if_flag_compiles(-fsanitize=address CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
+    
 endif()
 endif()
+
 if (ENABLE_UBSAN)
 if (ENABLE_UBSAN)
+    
+    # If enabled this will generate errors for undefined behavior points
+    # (like adding +1 to the maximum int value)
+    # https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
+    
     add_if_flag_compiles(-fno-omit-frame-pointer CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
     add_if_flag_compiles(-fno-omit-frame-pointer CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
     add_if_flag_compiles(-fsanitize=undefined CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
     add_if_flag_compiles(-fsanitize=undefined CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
+    
 endif()
 endif()
+
 if (ENABLE_MSAN)
 if (ENABLE_MSAN)
+    
+    # If enabled this will generate warnings for places where uninitialized memory is used
+    # https://clang.llvm.org/docs/MemorySanitizer.html
+    
     add_if_flag_compiles(-fno-omit-frame-pointer CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
     add_if_flag_compiles(-fno-omit-frame-pointer CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
     add_if_flag_compiles(-fsanitize=memory CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
     add_if_flag_compiles(-fsanitize=memory CMAKE_C_FLAGS CMAKE_LINKER_FLAGS)
+    
 endif()
 endif()
 
 
-if (ENABLE_MSAN AND ENABLE_ASAN)
-    MESSAGE(WARNING "Compiling with both AddressSanitizer and MemorySanitizer is not recommended")
-endif()
-
-add_definitions("-DRAYLIB_CMAKE=1")
-
 if(CMAKE_VERSION VERSION_LESS "3.1")
 if(CMAKE_VERSION VERSION_LESS "3.1")
     if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
     if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
         add_if_flag_compiles(-std=gnu99 CMAKE_C_FLAGS)
         add_if_flag_compiles(-std=gnu99 CMAKE_C_FLAGS)
@@ -31,3 +55,25 @@ if(CMAKE_VERSION VERSION_LESS "3.1")
 else()
 else()
     set (CMAKE_C_STANDARD 99)
     set (CMAKE_C_STANDARD 99)
 endif()
 endif()
+
+if(${PLATFORM} MATCHES "Android")
+    
+    # If enabled will remove dead code during the linking process
+    # https://gcc.gnu.org/onlinedocs/gnat_ugn/Compilation-options.html
+    add_if_flag_compiles(-ffunction-sections CMAKE_C_FLAGS)
+    
+    # If enabled will generate some exception data (usually disabled for C programs)
+    # https://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Code-Gen-Options.html
+    add_if_flag_compiles(-funwind-tables CMAKE_C_FLAGS)
+    
+    # If enabled adds stack protection guards around functions that allocate memory
+    # https://www.keil.com/support/man/docs/armclang_ref/armclang_ref_cjh1548250046139.htm
+    add_if_flag_compiles(-fstack-protector-strong CMAKE_C_FLAGS)
+    
+    # Marks that the library will not be compiled with an executable stack
+    add_if_flag_compiles(-Wa,--noexecstack CMAKE_C_FLAGS)
+    
+    # Do not expand symbolic links or resolve paths like "/./" or "/../", etc.
+    # https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html
+    add_if_flag_compiles(-no-canonical-prefixes CMAKE_C_FLAGS)
+endif()

+ 26 - 25
cmake/LibraryConfigurations.cmake

@@ -1,7 +1,7 @@
-if(${PLATFORM} MATCHES "Desktop")
+if (${PLATFORM} MATCHES "Desktop")
     set(PLATFORM_CPP "PLATFORM_DESKTOP")
     set(PLATFORM_CPP "PLATFORM_DESKTOP")
     
     
-    if(APPLE)
+    if (APPLE)
         # Need to force OpenGL 3.3 on OS X
         # Need to force OpenGL 3.3 on OS X
         # See: https://github.com/raysan5/raylib/issues/341
         # See: https://github.com/raysan5/raylib/issues/341
         set(GRAPHICS "GRAPHICS_API_OPENGL_33")
         set(GRAPHICS "GRAPHICS_API_OPENGL_33")
@@ -11,40 +11,35 @@ if(${PLATFORM} MATCHES "Desktop")
         if (NOT CMAKE_SYSTEM STRLESS "Darwin-18.0.0")
         if (NOT CMAKE_SYSTEM STRLESS "Darwin-18.0.0")
             add_definitions(-DGL_SILENCE_DEPRECATION)
             add_definitions(-DGL_SILENCE_DEPRECATION)
             MESSAGE(AUTHOR_WARNING "OpenGL is deprecated starting with macOS 10.14 (Mojave)!")
             MESSAGE(AUTHOR_WARNING "OpenGL is deprecated starting with macOS 10.14 (Mojave)!")
-        endif()
-    elseif(WIN32)
+        endif ()
+    elseif (WIN32)
         add_definitions(-D_CRT_SECURE_NO_WARNINGS)
         add_definitions(-D_CRT_SECURE_NO_WARNINGS)
         set(LIBS_PRIVATE ${LIBS_PRIVATE} winmm)
         set(LIBS_PRIVATE ${LIBS_PRIVATE} winmm)
-    else()
+    else ()
         find_library(pthread NAMES pthread)
         find_library(pthread NAMES pthread)
         find_package(OpenGL QUIET)
         find_package(OpenGL QUIET)
         if ("${OPENGL_LIBRARIES}" STREQUAL "")
         if ("${OPENGL_LIBRARIES}" STREQUAL "")
             set(OPENGL_LIBRARIES "GL")
             set(OPENGL_LIBRARIES "GL")
-        endif()
+        endif ()
         
         
         if ("${CMAKE_SYSTEM_NAME}" MATCHES "(Net|Open)BSD")
         if ("${CMAKE_SYSTEM_NAME}" MATCHES "(Net|Open)BSD")
             find_library(OSS_LIBRARY ossaudio)
             find_library(OSS_LIBRARY ossaudio)
-        endif()
+        endif ()
         
         
         set(LIBS_PRIVATE m pthread ${OPENGL_LIBRARIES} ${OSS_LIBRARY})
         set(LIBS_PRIVATE m pthread ${OPENGL_LIBRARIES} ${OSS_LIBRARY})
-    endif()
+    endif ()
 
 
-elseif(${PLATFORM} MATCHES "Web")
+elseif (${PLATFORM} MATCHES "Web")
     set(PLATFORM_CPP "PLATFORM_WEB")
     set(PLATFORM_CPP "PLATFORM_WEB")
     set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
     set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
-    set(CMAKE_C_FLAGS "-s USE_GLFW=3 -s ASSERTIONS=1 --profiling")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s USE_GLFW=3 -s ASSERTIONS=1 --profiling")
     set(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
     set(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
 
 
-elseif(${PLATFORM} MATCHES "Android")
+elseif (${PLATFORM} MATCHES "Android")
     set(PLATFORM_CPP "PLATFORM_ANDROID")
     set(PLATFORM_CPP "PLATFORM_ANDROID")
     set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
     set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
-    include(AddIfFlagCompiles)
-    add_if_flag_compiles(-ffunction-sections CMAKE_C_FLAGS)
-    add_if_flag_compiles(-funwind-tables CMAKE_C_FLAGS)
-    add_if_flag_compiles(-fstack-protector-strong CMAKE_C_FLAGS)
     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
-    add_if_flag_compiles(-Wa,--noexecstack CMAKE_C_FLAGS)
-    add_if_flag_compiles(-no-canonical-prefixes CMAKE_C_FLAGS)
+    
     add_definitions(-DANDROID -D__ANDROID_API__=21)
     add_definitions(-DANDROID -D__ANDROID_API__=21)
     include_directories(external/android/native_app_glue)
     include_directories(external/android/native_app_glue)
     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs,libatomic.a -Wl,--build-id -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings -uANativeActivity_onCreate")
     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs,libatomic.a -Wl,--build-id -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings -uANativeActivity_onCreate")
@@ -52,7 +47,7 @@ elseif(${PLATFORM} MATCHES "Android")
     find_library(OPENGL_LIBRARY OpenGL)
     find_library(OPENGL_LIBRARY OpenGL)
     set(LIBS_PRIVATE m log android EGL GLESv2 OpenSLES atomic c)
     set(LIBS_PRIVATE m log android EGL GLESv2 OpenSLES atomic c)
 
 
-elseif(${PLATFORM} MATCHES "Raspberry Pi")
+elseif (${PLATFORM} MATCHES "Raspberry Pi")
     set(PLATFORM_CPP "PLATFORM_RPI")
     set(PLATFORM_CPP "PLATFORM_RPI")
     set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
     set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
     
     
@@ -65,7 +60,7 @@ elseif(${PLATFORM} MATCHES "Raspberry Pi")
     link_directories(/opt/vc/lib)
     link_directories(/opt/vc/lib)
     set(LIBS_PRIVATE ${GLESV2} ${EGL} ${BCMHOST} pthread rt m dl)
     set(LIBS_PRIVATE ${GLESV2} ${EGL} ${BCMHOST} pthread rt m dl)
 
 
-elseif(${PLATFORM} MATCHES "DRM")
+elseif (${PLATFORM} MATCHES "DRM")
     set(PLATFORM_CPP "PLATFORM_DRM")
     set(PLATFORM_CPP "PLATFORM_DRM")
     set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
     set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
     
     
@@ -81,7 +76,7 @@ elseif(${PLATFORM} MATCHES "DRM")
     include_directories(/usr/include/libdrm)
     include_directories(/usr/include/libdrm)
     set(LIBS_PRIVATE ${GLESV2} ${EGL} ${DRM} ${GBM} pthread m dl)
     set(LIBS_PRIVATE ${GLESV2} ${EGL} ${DRM} ${GBM} pthread m dl)
 
 
-endif()
+endif ()
 
 
 if (${OPENGL_VERSION})
 if (${OPENGL_VERSION})
     set(${SUGGESTED_GRAPHICS} "${GRAPHICS}")
     set(${SUGGESTED_GRAPHICS} "${GRAPHICS}")
@@ -93,12 +88,18 @@ if (${OPENGL_VERSION})
         set(GRAPHICS "GRAPHICS_API_OPENGL_11")
         set(GRAPHICS "GRAPHICS_API_OPENGL_11")
     elseif (${OPENGL_VERSION} MATCHES "ES 2.0")
     elseif (${OPENGL_VERSION} MATCHES "ES 2.0")
         set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
         set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
-    endif()
+    endif ()
     if ("${SUGGESTED_GRAPHICS}" AND NOT "${SUGGESTED_GRAPHICS}" STREQUAL "${GRAPHICS}")
     if ("${SUGGESTED_GRAPHICS}" AND NOT "${SUGGESTED_GRAPHICS}" STREQUAL "${GRAPHICS}")
         message(WARNING "You are overriding the suggested GRAPHICS=${SUGGESTED_GRAPHICS} with ${GRAPHICS}! This may fail")
         message(WARNING "You are overriding the suggested GRAPHICS=${SUGGESTED_GRAPHICS} with ${GRAPHICS}! This may fail")
-    endif()
-endif()
+    endif ()
+endif ()
 
 
-if(NOT GRAPHICS)
+if (NOT GRAPHICS)
     set(GRAPHICS "GRAPHICS_API_OPENGL_33")
     set(GRAPHICS "GRAPHICS_API_OPENGL_33")
-endif()
+endif ()
+
+set(LIBS_PRIVATE ${LIBS_PRIVATE} ${OPENAL_LIBRARY})
+
+if (${PLATFORM} MATCHES "Desktop")
+    set(LIBS_PRIVATE ${LIBS_PRIVATE} glfw)
+endif ()

+ 115 - 99
examples/CMakeLists.txt

@@ -1,122 +1,138 @@
 # Setup the project and settings
 # Setup the project and settings
 project(examples)
 project(examples)
 
 
-# Get the sources together
-set(example_dirs audio core models others shaders shapes text textures)
+# Directories that contain examples
+set(example_dirs
+    audio
+    core
+    models
+    others
+    shaders
+    shapes
+    text
+    textures
+    )
+
+# Next few lines will check for existence of symbols or header files
+# They are needed for the physac example and threads examples
 set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=199309L)
 set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=199309L)
-  include(CheckSymbolExists)
-  check_symbol_exists(CLOCK_MONOTONIC time.h HAVE_CLOCK_MONOTONIC)
-  check_symbol_exists(QueryPerformanceCounter windows.h HAVE_QPC)
+include(CheckSymbolExists)
+check_symbol_exists(CLOCK_MONOTONIC time.h HAVE_CLOCK_MONOTONIC)
+check_symbol_exists(QueryPerformanceCounter windows.h HAVE_QPC)
 set(CMAKE_REQUIRED_DEFINITIONS)
 set(CMAKE_REQUIRED_DEFINITIONS)
-if(HAVE_QPC OR HAVE_CLOCK_MONOTONIC)
-  set(example_dirs ${example_dirs} physac)
-endif()
 
 
-set(example_sources)
-set(example_resources)
-foreach(example_dir ${example_dirs})
-  # Get the .c files
-  file(GLOB sources ${example_dir}/*.c)
-  list(APPEND example_sources ${sources})
-
-  # Any any resources
-  file(GLOB resources ${example_dir}/resources/*)
-  list(APPEND example_resources ${resources})
-endforeach()
-
-if (APPLE AND NOT CMAKE_SYSTEM STRLESS "Darwin-18.0.0")
-  add_definitions(-DGL_SILENCE_DEPRECATION)
-  MESSAGE(AUTHOR_WARNING "OpenGL is deprecated starting with macOS 10.14 (Mojave)!")
-endif()
+if (HAVE_QPC OR HAVE_CLOCK_MONOTONIC)
+    set(example_dirs ${example_dirs} physac)
+endif ()
 
 
 include(CheckIncludeFile)
 include(CheckIncludeFile)
 CHECK_INCLUDE_FILE("stdatomic.h" HAVE_STDATOMIC_H)
 CHECK_INCLUDE_FILE("stdatomic.h" HAVE_STDATOMIC_H)
 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
 find_package(Threads)
 find_package(Threads)
 if (CMAKE_USE_PTHREADS_INIT AND HAVE_STDATOMIC_H)
 if (CMAKE_USE_PTHREADS_INIT AND HAVE_STDATOMIC_H)
-  add_if_flag_compiles("-std=c11" CMAKE_C_FLAGS)
-  if(THREADS_HAVE_PTHREAD_ARG)
-    add_if_flag_compiles("-pthread" CMAKE_C_FLAGS)
-  endif()
-  if(CMAKE_THREAD_LIBS_INIT)
-    link_libraries("${CMAKE_THREAD_LIBS_INIT}")
-  endif()
-else()
-  # Items requiring pthreads
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_loading_thread.c)
-endif()
-
-
-if(${PLATFORM} MATCHES "Android")
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/rlgl_standalone.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/standard_lighting.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_3d_picking.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_vr_simulator.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_3d_camera_free.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_3d_camera_first_person.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_world_screen.c)
-
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_mesh_picking.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_material_pbr.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_cubicmap.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_skybox.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_mesh_picking.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_mesh_generation.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_heightmap.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_billboard.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_rlgl_solar_system.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_rlgl_full_solar_system.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_solar_system.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_obj_viewer.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_animation.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_first_person_maze.c)
+    add_if_flag_compiles("-std=c11" CMAKE_C_FLAGS)
+    if (THREADS_HAVE_PTHREAD_ARG)
+        add_if_flag_compiles("-pthread" CMAKE_C_FLAGS)
+    endif ()
+    if (CMAKE_THREAD_LIBS_INIT)
+        link_libraries("${CMAKE_THREAD_LIBS_INIT}")
+    endif ()
+endif ()
 
 
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_custom_uniform.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_model_shader.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_postprocessing.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_raymarching.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_palette_switch.c)
-  list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_basic_lighting.c)
-
-elseif(${PLATFORM} MATCHES "Web")
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s ASYNCIFY")
-  # Since WASM is used, ALLOW_MEMORY_GROWTH has no extra overheads
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s ALLOW_MEMORY_GROWTH=1 --no-heap-copy")
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --shell-file ${CMAKE_SOURCE_DIR}/src/shell.html")
-  set(CMAKE_EXECUTABLE_SUFFIX ".html")
+if (APPLE AND NOT CMAKE_SYSTEM STRLESS "Darwin-18.0.0")
+    add_definitions(-DGL_SILENCE_DEPRECATION)
+    MESSAGE(AUTHOR_WARNING "OpenGL is deprecated starting with macOS 10.14 (Mojave)!")
+endif ()
 
 
-  # Remove the -rdynamic flag because otherwise emscripten
-  # does not generate HTML+JS+WASM files, only a non-working
-  # and fat HTML
-  string(REPLACE "-rdynamic" "" CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS}")
-endif()
+# Collect all source files and resource files
+# into a CMake variable
+set(example_sources)
+set(example_resources)
+foreach (example_dir ${example_dirs})
+    # Get the .c files
+    file(GLOB sources ${example_dir}/*.c)
+    list(APPEND example_sources ${sources})
+    
+    # Any any resources
+    file(GLOB resources ${example_dir}/resources/*)
+    list(APPEND example_resources ${resources})
+endforeach ()
+
+if(NOT CMAKE_USE_PTHREADS_INIT OR NOT HAVE_STDATOMIC_H)
+    # Items requiring pthreads
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_loading_thread.c)
+endif ()
+
+if (${PLATFORM} MATCHES "Android")
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/rlgl_standalone.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/standard_lighting.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_3d_picking.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_vr_simulator.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_3d_camera_free.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_3d_camera_first_person.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/core/core_world_screen.c)
+    
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_mesh_picking.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_material_pbr.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_cubicmap.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_skybox.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_mesh_picking.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_mesh_generation.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_heightmap.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_billboard.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_rlgl_solar_system.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_rlgl_full_solar_system.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_solar_system.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_obj_viewer.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_animation.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/models/models_first_person_maze.c)
+    
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_custom_uniform.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_model_shader.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_postprocessing.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_raymarching.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_palette_switch.c)
+    list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_basic_lighting.c)
+
+elseif (${PLATFORM} MATCHES "Web")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s ASYNCIFY")
+    # Since WASM is used, ALLOW_MEMORY_GROWTH has no extra overheads
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s ALLOW_MEMORY_GROWTH=1 --no-heap-copy")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --shell-file ${CMAKE_SOURCE_DIR}/src/shell.html")
+    set(CMAKE_EXECUTABLE_SUFFIX ".html")
+    
+    # Remove the -rdynamic flag because otherwise emscripten
+    # does not generate HTML+JS+WASM files, only a non-working
+    # and fat HTML
+    string(REPLACE "-rdynamic" "" CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS}")
+endif ()
 
 
 include_directories(BEFORE SYSTEM others/external/include)
 include_directories(BEFORE SYSTEM others/external/include)
 
 
 if (NOT TARGET raylib)
 if (NOT TARGET raylib)
-  find_package(raylib 2.0 REQUIRED)
-endif()
+    find_package(raylib 2.0 REQUIRED)
+endif ()
 
 
 # Do each example
 # Do each example
-foreach(example_source ${example_sources})
-  # Create the basename for the example
-  get_filename_component(example_name ${example_source} NAME)
-  string(REPLACE ".c" "" example_name ${example_name})
-
-  # Setup the example
-  add_executable(${example_name} ${example_source})
-
-  target_link_libraries(${example_name} raylib)
-
-  string(REGEX MATCH ".*/.*/" resources_dir ${example_source})
-  string(APPEND resources_dir "resources")
-
-  if(${PLATFORM} MATCHES "Web" AND EXISTS ${resources_dir})
-    # The local resources path needs to be mapped to /resources virtual path
-    string(APPEND resources_dir "@resources")
-    set_target_properties(${example_name} PROPERTIES LINK_FLAGS "--preload-file ${resources_dir}")
-  endif()
-endforeach()
+foreach (example_source ${example_sources})
+    # Create the basename for the example
+    get_filename_component(example_name ${example_source} NAME)
+    string(REPLACE ".c" "" example_name ${example_name})
+    
+    # Setup the example
+    add_executable(${example_name} ${example_source})
+    
+    target_link_libraries(${example_name} raylib)
+    
+    string(REGEX MATCH ".*/.*/" resources_dir ${example_source})
+    string(APPEND resources_dir "resources")
+    
+    if (${PLATFORM} MATCHES "Web" AND EXISTS ${resources_dir})
+        # The local resources path needs to be mapped to /resources virtual path
+        string(APPEND resources_dir "@resources")
+        set_target_properties(${example_name} PROPERTIES LINK_FLAGS "--preload-file ${resources_dir}")
+    endif ()
+endforeach ()
 
 
 # Copy all of the resource files to the destination
 # Copy all of the resource files to the destination
 file(COPY ${example_resources} DESTINATION "resources/")
 file(COPY ${example_resources} DESTINATION "resources/")

+ 14 - 9
src/CMakeLists.txt

@@ -10,6 +10,8 @@ include(JoinPaths)
 if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
 if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
     if(RAYLIB_IS_MAIN)
     if(RAYLIB_IS_MAIN)
         set(default_build_type Debug)
         set(default_build_type Debug)
+    else()
+        message(WARNING "Default build type is not set (CMAKE_BUILD_TYPE)")
     endif()
     endif()
 
 
     message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
     message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
@@ -18,7 +20,7 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
     set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
     set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
 endif()
 endif()
 
 
-# Get the sources together
+# Used as public API to be included into other projects
 set(raylib_public_headers
 set(raylib_public_headers
     raylib.h
     raylib.h
     rlgl.h
     rlgl.h
@@ -27,6 +29,7 @@ set(raylib_public_headers
     raudio.h
     raudio.h
     )
     )
 
 
+# Sources to be compiled
 set(raylib_sources
 set(raylib_sources
     core.c
     core.c
     models.c
     models.c
@@ -36,7 +39,7 @@ set(raylib_sources
     utils.c
     utils.c
     )
     )
 
 
-# cmake/GlfwImport.cmake handles the details around the inclusion of glfw
+# <root>/cmake/GlfwImport.cmake handles the details around the inclusion of glfw
 include(GlfwImport)
 include(GlfwImport)
 
 
 
 
@@ -47,10 +50,11 @@ else ()
     MESSAGE(STATUS "Audio Backend: None (-DUSE_AUDIO=OFF)")
     MESSAGE(STATUS "Audio Backend: None (-DUSE_AUDIO=OFF)")
 endif ()
 endif ()
 
 
+# Sets additional platform options and link libraries for each platform
+# also selects the proper graphics API and version for that platform
+# Produces a variable LIBS_PRIVATE that will be used later
 include(LibraryConfigurations)
 include(LibraryConfigurations)
 
 
-set(LIBS_PRIVATE ${LIBS_PRIVATE} ${OPENAL_LIBRARY})
-
 add_library(raylib ${raylib_sources} ${raylib_public_headers})
 add_library(raylib ${raylib_sources} ${raylib_public_headers})
 
 
 if (NOT BUILD_SHARED_LIBS)
 if (NOT BUILD_SHARED_LIBS)
@@ -66,7 +70,6 @@ else()
     endif ()
     endif ()
 endif()
 endif()
 
 
-# Setting target properties
 set_target_properties(raylib PROPERTIES
 set_target_properties(raylib PROPERTIES
                       PUBLIC_HEADER "${raylib_public_headers}"
                       PUBLIC_HEADER "${raylib_public_headers}"
                       VERSION ${PROJECT_VERSION}
                       VERSION ${PROJECT_VERSION}
@@ -77,12 +80,11 @@ if (WITH_PIC OR BUILD_SHARED_LIBS)
     set_property(TARGET raylib PROPERTY POSITION_INDEPENDENT_CODE ON)
     set_property(TARGET raylib PROPERTY POSITION_INDEPENDENT_CODE ON)
 endif ()
 endif ()
 
 
-# Linking libraries
 target_link_libraries(raylib "${LIBS_PRIVATE}")
 target_link_libraries(raylib "${LIBS_PRIVATE}")
-if (${PLATFORM} MATCHES "Desktop")
-    target_link_libraries(raylib glfw)
-endif ()
 
 
+# Sets some compile time definitions for the pre-processor
+# If CUSTOMIZE_BUILD option is on you will not use config.h by default
+# and you will be able to select more build options
 include(CompileDefinitions)
 include(CompileDefinitions)
 
 
 # Registering include directories
 # Registering include directories
@@ -99,6 +101,8 @@ target_include_directories(raylib
 # Copy the header files to the build directory for convenience
 # Copy the header files to the build directory for convenience
 file(COPY ${raylib_public_headers} DESTINATION "include")
 file(COPY ${raylib_public_headers} DESTINATION "include")
 
 
+# Includes information on how the library will be installed on the system
+# when cmake --install is run
 include(InstallConfigurations)
 include(InstallConfigurations)
 
 
 # Print the flags for the user
 # Print the flags for the user
@@ -112,6 +116,7 @@ message(STATUS "Compiling with the flags:")
 message(STATUS "  PLATFORM=" ${PLATFORM_CPP})
 message(STATUS "  PLATFORM=" ${PLATFORM_CPP})
 message(STATUS "  GRAPHICS=" ${GRAPHICS})
 message(STATUS "  GRAPHICS=" ${GRAPHICS})
 
 
+# Options if you want to create an installer using CPack
 include(PackConfigurations)
 include(PackConfigurations)
 
 
 enable_testing()
 enable_testing()