diff options
| author | Ahmad Fatoum <ahmad@a3f.at> | 2018-07-29 12:56:19 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-29 12:56:19 +0200 |
| commit | 6905a875eda7e1ac85b768f5aa4e07dc92537bdb (patch) | |
| tree | f8bf880840312d42478043a04bc7f273f892b180 /src | |
| parent | cf021e38117723b655a2399e62f8d5f87ce3d413 (diff) | |
| parent | 5a94a280d0a7d2866a12e6f9144401881e17de02 (diff) | |
| download | raylib-6905a875eda7e1ac85b768f5aa4e07dc92537bdb.tar.gz raylib-6905a875eda7e1ac85b768f5aa4e07dc92537bdb.zip | |
Merge pull request #608 from a3f/master
CMake: Major cleanup to support find_package(raylib)
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 213 | ||||
| -rw-r--r-- | src/CMakeOptions.txt | 25 | ||||
| -rw-r--r-- | src/core.c | 6 |
3 files changed, 155 insertions, 89 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 05e3c0d2..ceee761f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,20 +5,28 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake") set(PROJECT_VERSION 2.0.0) set(API_VERSION 2) -set(RAYLIB raylib) # Name of the generated library include("CMakeOptions.txt") include(BuildType) configure_file(config.h.in ${CMAKE_BINARY_DIR}/cmake/config.h) -include_directories(${CMAKE_BINARY_DIR}) -include_directories(SYSTEM .) +include_directories(${CMAKE_BINARY_DIR} .) # Get the sources together file(GLOB raylib_sources *.c) list(REMOVE_ITEM raylib_sources ${CMAKE_CURRENT_SOURCE_DIR}/rglfw.c) +if(USE_EXTERNAL_GLFW STREQUAL "ON") + find_package(glfw3 3.2.1 REQUIRED) +elseif(USE_EXTERNAL_GLFW STREQUAL "IF_POSSIBLE") + find_package(glfw3 3.2.1 QUIET) +endif() +if (glfw3_FOUND) + set(LIBS_PRIVATE ${LIBS_PRIVATE} glfw) +endif() + # Explicitly check against "ON", because USE_EXTERNAL_GLFW is a tristate option if(NOT glfw3_FOUND AND NOT USE_EXTERNAL_GLFW STREQUAL "ON" AND "${PLATFORM}" MATCHES "Desktop") + MESSAGE(STATUS "Using raylib's GLFW") set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) @@ -30,54 +38,63 @@ if(NOT glfw3_FOUND AND NOT USE_EXTERNAL_GLFW STREQUAL "ON" AND "${PLATFORM}" MAT endif() add_subdirectory(external/glfw) - include_directories(external/glfw/include) + include_directories(BEFORE SYSTEM external/glfw/include) list(APPEND raylib_sources $<TARGET_OBJECTS:glfw_objlib>) else() + MESSAGE(STATUS "Using external GLFW") set(GLFW_PKG_DEPS glfw) endif() -include(utils) +add_definitions("-DRAYLIB_CMAKE=1") if(USE_AUDIO) + if (NOT USE_OPENAL_BACKEND) + file(GLOB mini_al external/mini_al.c) + MESSAGE(STATUS "Audio Backend: mini_al") + else() + find_package(OpenAL REQUIRED) + MESSAGE(STATUS "Audio Backend: OpenAL") + endif() file(GLOB stb_vorbis external/stb_vorbis.c) - file(GLOB mini_al external/mini_al.c ${stb_vorbis}) - set(sources ${raylib_sources} ${mini_al}) + set(sources ${raylib_sources} ${mini_al} ${stb_vorbis}) else() + MESSAGE(STATUS "Audio Backend: None (-DUSE_AUDIO=OFF)") set(INCLUDE_AUDIO_MODULE 0) list(REMOVE_ITEM raylib_sources ${CMAKE_CURRENT_SOURCE_DIR}/audio.c) set(sources ${raylib_sources}) endif() -include(AddIfFlagCompiles) - ### Config options ### # Translate the config options to what raylib wants if(${PLATFORM} MATCHES "Desktop") - set(PLATFORM "PLATFORM_DESKTOP") - - # OpenGL version - if (${OPENGL_VERSION} MATCHES "3.3") - set(GRAPHICS "GRAPHICS_API_OPENGL_33") - elseif (${OPENGL_VERSION} MATCHES "2.1") - set(GRAPHICS "GRAPHICS_API_OPENGL_21") - elseif (${OPENGL_VERSION} MATCHES "1.1") - set(GRAPHICS "GRAPHICS_API_OPENGL_11") - elseif (${OPENGL_VERSION} MATCHES "ES 2.0") - set(GRAPHICS "GRAPHICS_API_OPENGL_ES2") - endif() + set(PLATFORM_CPP "PLATFORM_DESKTOP") if(APPLE) # Need to force OpenGL 3.3 on OS X # See: https://github.com/raysan5/raylib/issues/341 set(GRAPHICS "GRAPHICS_API_OPENGL_33") + find_library(OPENGL_LIBRARY OpenGL) + set(LIBS_PRIVATE ${OPENGL_LIBRARY}) link_libraries("${LIBS_PRIVATE}") elseif(WIN32) add_definitions(-D_CRT_SECURE_NO_WARNINGS) + else() + find_library(pthread NAMES pthread) + find_package(OpenGL QUIET) + if ("${OPENGL_LIBRARIES}" STREQUAL "") + set(OPENGL_LIBRARIES "GL") + endif() + + if ("${CMAKE_SYSTEM_NAME}" MATCHES "(Net|Open)BSD") + find_library(OSS_LIBRARY ossaudio) + endif() + + set(LIBS_PRIVATE m pthread ${OPENGL_LIBRARIES} ${OSS_LIBRARY}) endif() elseif(${PLATFORM} MATCHES "Web") - set(PLATFORM "PLATFORM_WEB") + set(PLATFORM_CPP "PLATFORM_WEB") set(GRAPHICS "GRAPHICS_API_OPENGL_ES2") set(CMAKE_C_FLAGS "-s USE_GLFW=3 -s ASSERTIONS=1 --profiling") @@ -85,8 +102,9 @@ elseif(${PLATFORM} MATCHES "Web") # Change the name of the output library elseif(${PLATFORM} MATCHES "Android") - set(PLATFORM "PLATFORM_ANDROID") + set(PLATFORM_CPP "PLATFORM_ANDROID") 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) @@ -97,94 +115,139 @@ elseif(${PLATFORM} MATCHES "Android") 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") + find_library(OPENGL_LIBRARY OpenGL) + set(LIBS_PRIVATE m log android EGL GLESv2 OpenSLES atomic c) + elseif(${PLATFORM} MATCHES "Raspberry Pi") - set(PLATFORM "PLATFORM_RPI") + set(PLATFORM_CPP "PLATFORM_RPI") set(GRAPHICS "GRAPHICS_API_OPENGL_ES2") + endif() -if(${SHARED}) - add_library(${RAYLIB}_shared SHARED ${sources}) +if (${OPENGL_VERSION}) + set(${SUGGESTED_GRAPHICS} "${GRAPHICS}") + if (${OPENGL_VERSION} MATCHES "3.3") + set(GRAPHICS "GRAPHICS_API_OPENGL_33") + elseif (${OPENGL_VERSION} MATCHES "2.1") + set(GRAPHICS "GRAPHICS_API_OPENGL_21") + elseif (${OPENGL_VERSION} MATCHES "1.1") + set(GRAPHICS "GRAPHICS_API_OPENGL_11") + elseif (${OPENGL_VERSION} MATCHES "ES 2.0") + set(GRAPHICS "GRAPHICS_API_OPENGL_ES2") + endif() + if (${SUGGESTED_GRAPHICS} AND NOT "${SUGGESTED_GRAPHICS}" STREQUAL "${GRAPHICS}") + message(WARNING "You are overriding the suggested GRAPHICS=${SUGGESTED_GRAPHICS} with ${GRAPHICS}! This may fail") + endif() +endif() + +if(NOT GRAPHICS) + set(GRAPHICS "GRAPHICS_API_OPENGL_33") +endif() + +include_directories(${OPENGL_INCLUDE_DIR} ${OPENAL_INCLUDE_DIR}) +set(LIBS_PRIVATE ${LIBS_PRIVATE} ${OPENAL_LIBRARY}) +include(LibraryPathToLinkerFlags) +library_path_to_linker_flags(__PKG_CONFIG_LIBS_PRIVATE "${LIBS_PRIVATE}") + +if(STATIC) + if(${PLATFORM} MATCHES "Web") + set(CMAKE_STATIC_LIBRARY_SUFFIX ".bc") + endif() + + add_library(raylib_static STATIC ${sources}) - target_compile_definitions(${RAYLIB}_shared - PUBLIC ${PLATFORM} + target_compile_definitions(raylib_static + PUBLIC ${PLATFORM_CPP} + PUBLIC ${GRAPHICS} + ) + + set(PKG_CONFIG_LIBS_PRIVATE ${__PKG_CONFIG_LIBS_PRIVATE} ${GLFW_PKG_LIBS}) + string (REPLACE ";" " " PKG_CONFIG_LIBS_PRIVATE "${PKG_CONFIG_LIBS_PRIVATE}") + if (${PLATFORM} MATCHES "Desktop") + target_link_libraries(raylib_static glfw ${GLFW_LIBRARIES} ${LIBS_PRIVATE}) + endif() + + if (WITH_PIC) + set_property(TARGET raylib_static PROPERTY POSITION_INDEPENDENT_CODE ON) + endif() + set_target_properties(raylib_static PROPERTIES PUBLIC_HEADER "raylib.h") + if(NOT WIN32) # Keep lib*.(a|dll) name, but avoid *.lib files overwriting each other on Windows + set_target_properties(raylib_static PROPERTIES OUTPUT_NAME raylib) + endif() + install( + TARGETS raylib_static + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + ) +set_target_properties(raylib_static PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_BINARY_DIR}/release") + + add_test("pkg-config--static" ${PROJECT_SOURCE_DIR}/../cmake/test-pkgconfig.sh --static) +endif(STATIC) + + +if(SHARED) + add_library(raylib SHARED ${sources}) + + target_compile_definitions(raylib + PUBLIC ${PLATFORM_CPP} PUBLIC ${GRAPHICS} ) set(PKG_CONFIG_LIBS_EXTRA "") - set_property(TARGET ${RAYLIB}_shared PROPERTY POSITION_INDEPENDENT_CODE ON) + set_property(TARGET raylib PROPERTY POSITION_INDEPENDENT_CODE ON) set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}") set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_MACOSX_RPATH ON) - target_link_libraries(${RAYLIB}_shared ${LIBS_PRIVATE}) - if (${PLATFORM} MATCHES "PLATFORM_DESKTOP") - target_link_libraries(${RAYLIB}_shared glfw) + target_link_libraries(raylib ${LIBS_PRIVATE}) + if (${PLATFORM} MATCHES "Desktop") + target_link_libraries(raylib glfw) endif() if (UNIX AND ${FILESYSTEM_LACKS_SYMLINKS}) MESSAGE(WARNING "Can't version UNIX shared library on file system without symlink support") else() - set_target_properties(${RAYLIB}_shared PROPERTIES + set_target_properties(raylib PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${API_VERSION} ) endif() - set_target_properties(${RAYLIB}_shared PROPERTIES + set_target_properties(raylib PROPERTIES PUBLIC_HEADER "raylib.h" ) - if(WIN32) + + if (WIN32) install( - TARGETS ${RAYLIB}_shared - RUNTIME DESTINATION lib - PUBLIC_HEADER DESTINATION include + TARGETS raylib + RUNTIME DESTINATION "lib" + PUBLIC_HEADER DESTINATION "include" ) - else() # Keep lib*.(a|dll) name, but avoid *.lib files overwriting each other on Windows - set_target_properties(${RAYLIB}_shared PROPERTIES OUTPUT_NAME ${RAYLIB}) + else() install( - TARGETS ${RAYLIB}_shared - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + TARGETS raylib + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) endif() + set_target_properties(raylib PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_BINARY_DIR}/release") add_test("pkg-config" ${PROJECT_SOURCE_DIR}/../cmake/test-pkgconfig.sh) -endif(${SHARED}) - -if(${STATIC}) - if(${PLATFORM} MATCHES "PLATFORM_WEB") - set(CMAKE_STATIC_LIBRARY_SUFFIX ".bc") - endif() - - add_library(${RAYLIB} STATIC ${sources}) - - target_compile_definitions(${RAYLIB} - PUBLIC ${PLATFORM} - PUBLIC ${GRAPHICS} - ) - - set(PKG_CONFIG_LIBS_PRIVATE ${__PKG_CONFIG_LIBS_PRIVATE} ${GLFW_PKG_LIBS}) - string (REPLACE ";" " " PKG_CONFIG_LIBS_PRIVATE "${PKG_CONFIG_LIBS_PRIVATE}") - if (${PLATFORM} MATCHES "PLATFORM_DESKTOP") - target_link_libraries(${RAYLIB} glfw ${GLFW_LIBRARIES}) - endif() - - if (WITH_PIC) - set_property(TARGET ${RAYLIB} PROPERTY POSITION_INDEPENDENT_CODE ON) - endif() - set_target_properties(${RAYLIB} PROPERTIES PUBLIC_HEADER "raylib.h") - install(TARGETS ${RAYLIB} - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - ) - - add_test("pkg-config--static" ${PROJECT_SOURCE_DIR}/../cmake/test-pkgconfig.sh --static) -endif(${STATIC}) +else(SHARED) + add_library(raylib ALIAS raylib_static) +endif(SHARED) if (NOT DEFINED PKG_CONFIG_LIBS_EXTRA) set(PKG_CONFIG_LIBS_EXTRA "${PKG_CONFIG_LIBS_PRIVATE}") endif() configure_file(../raylib.pc.in raylib.pc @ONLY) install(FILES ${CMAKE_BINARY_DIR}/release/raylib.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") +configure_file(../cmake/raylib-config-version.cmake raylib-config-version.cmake @ONLY) +install(FILES ${CMAKE_BINARY_DIR}/release/raylib-config-version.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/raylib") +install(FILES ${PROJECT_SOURCE_DIR}/../cmake/raylib-config.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/raylib") + +# populates raylib_{FOUND, INCLUDE_DIRS, LIBRARIES, LDFLAGS, DEFINITIONS} +include(PopulateConfigVariablesLocally) +populate_config_variables_locally(raylib) # Copy the header files to the build directory file(COPY "raylib.h" DESTINATION ".") @@ -195,7 +258,7 @@ file(COPY "audio.h" DESTINATION ".") # Print the flags for the user message(STATUS "Compiling with the flags:") -message(STATUS " PLATFORM=" ${PLATFORM}) +message(STATUS " PLATFORM=" ${PLATFORM_CPP}) message(STATUS " GRAPHICS=" ${GRAPHICS}) # Packaging diff --git a/src/CMakeOptions.txt b/src/CMakeOptions.txt index a9cd4354..79f09414 100644 --- a/src/CMakeOptions.txt +++ b/src/CMakeOptions.txt @@ -4,13 +4,13 @@ include(EnumOption) enum_option(PLATFORM "Desktop;Web;Android;Raspberry Pi" "Platform to build for.") -enum_option(OPENGL_VERSION "3.3;2.1;1.1;ES 2.0" "OpenGL Version to build raylib with") +enum_option(OPENGL_VERSION "OFF;3.3;2.1;1.1;ES 2.0" "Force a specific OpenGL Version?") # Shared library is always PIC. Static library should be PIC too if linked into a shared library option(WITH_PIC "Compile static library as position-independent code" OFF) option(SHARED "Build raylib as a dynamic library" OFF) option(STATIC "Build raylib as a static library" ON) -option(MACOS_FATLIB "Build fat library for both i386 and x86_64 on macOS" ON) +option(MACOS_FATLIB "Build fat library for both i386 and x86_64 on macOS" OFF) option(USE_AUDIO "Build raylib with audio module" ON) if(${PLATFORM} MATCHES "Web") cmake_dependent_option(USE_OPENAL_BACKEND "Link raylib with openAL instead of mini-al" ON "USE_AUDIO" OFF) @@ -23,6 +23,9 @@ if(UNIX AND NOT APPLE) option(USE_WAYLAND "Use Wayland for window creation" OFF) endif() +option(INCLUDE_EVERYTHING "Include everything disabled by default (for CI usage" OFF) +set(OFF ${INCLUDE_EVERYTHING} CACHE INTERNAL "Replace any OFF by default with \${OFF} to have it covered by this option") + # core.c option(SUPPORT_BUSY_WAIT_LOOP "Use busy wait loop for timing sync instead of a high-resolution timer" ON) @@ -48,13 +51,13 @@ option(SUPPORT_FILEFORMAT_DDS "Support loading DDS as textures" ON) option(SUPPORT_FILEFORMAT_HDR "Support loading HDR as textures" ON) option(SUPPORT_FILEFORMAT_KTX "Support loading KTX as textures" ON) option(SUPPORT_FILEFORMAT_ASTC "Support loading ASTC as textures" ON) -option(SUPPORT_FILEFORMAT_BMP "Support loading BMP as textures" OFF) -option(SUPPORT_FILEFORMAT_TGA "Support loading TGA as textures" OFF) -option(SUPPORT_FILEFORMAT_JPG "Support loading JPG as textures" OFF) -option(SUPPORT_FILEFORMAT_GIF "Support loading GIF as textures" OFF) -option(SUPPORT_FILEFORMAT_PSD "Support loading PSD as textures" OFF) -option(SUPPORT_FILEFORMAT_PKM "Support loading PKM as textures" OFF) -option(SUPPORT_FILEFORMAT_PVR "Support loading PVR as textures" OFF) +option(SUPPORT_FILEFORMAT_BMP "Support loading BMP as textures" ${OFF}) +option(SUPPORT_FILEFORMAT_TGA "Support loading TGA as textures" ${OFF}) +option(SUPPORT_FILEFORMAT_JPG "Support loading JPG as textures" ${OFF}) +option(SUPPORT_FILEFORMAT_GIF "Support loading GIF as textures" ${OFF}) +option(SUPPORT_FILEFORMAT_PSD "Support loading PSD as textures" ${OFF}) +option(SUPPORT_FILEFORMAT_PKM "Support loading PKM as textures" ${OFF}) +option(SUPPORT_FILEFORMAT_PVR "Support loading PVR as textures" ${OFF}) # models.c option(SUPPORT_FILEFORMAT_OBJ "Support loading OBJ file format" ON) @@ -66,11 +69,11 @@ option(SUPPORT_FILEFORMAT_WAV "Support loading WAV for sound" ON) option(SUPPORT_FILEFORMAT_OGG "Support loading OGG for sound" ON) option(SUPPORT_FILEFORMAT_XM "Support loading XM for sound" ON) option(SUPPORT_FILEFORMAT_MOD "Support loading MOD for sound" ON) -option(SUPPORT_FILEFORMAT_FLAC "Support loading FLAC for sound" OFF) +option(SUPPORT_FILEFORMAT_FLAC "Support loading FLAC for sound" ${OFF}) # utils.c option(SUPPORT_SAVE_PNG "Support saving image data in PNG file format" ON) -option(SUPPORT_SAVE_BMP "Support saving image data in BMP file format" OFF) +option(SUPPORT_SAVE_BMP "Support saving image data in BMP file format" ${OFF}) option(SUPPORT_TRACELOG "Show TraceLog() output messages. NOTE: By default LOG_DEBUG traces not shown" ON) option(SUPPORT_FILEFORMAT_FNT "Support loading fonts in FNT format" ON) @@ -1915,14 +1915,14 @@ static bool InitGraphicsDevice(int width, int height) if (configFlags & FLAG_WINDOW_UNDECORATED) glfwWindowHint(GLFW_DECORATED, GL_FALSE); // Border and buttons on Window else glfwWindowHint(GLFW_DECORATED, GL_TRUE); // Decorated window - -#if !defined(PLATFORM_WEB) // FLAG_WINDOW_TRANSPARENT not supported on HTML5 + // FLAG_WINDOW_TRANSPARENT not supported on HTML5 and not included in any released GLFW version yet +#if defined(GLFW_TRANSPARENT_FRAMEBUFFER) if (configFlags & FLAG_WINDOW_TRANSPARENT) glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE); // Transparent framebuffer else glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_FALSE); // Opaque framebuffer #endif if (configFlags & FLAG_MSAA_4X_HINT) glfwWindowHint(GLFW_SAMPLES, 4); // Tries to enable multisampling x4 (MSAA), default is 0 - + // NOTE: When asking for an OpenGL context version, most drivers provide highest supported version // with forward compatibility to older OpenGL versions. // For example, if using OpenGL 1.1, driver can provide a 4.3 context forward compatible. |
