cmake: Fix PLATFORM_WEB build

Did this ever work? Surely, doesn't look like it...
This commit is contained in:
Ahmad Fatoum 2018-04-12 19:31:53 +02:00
parent cea78e4fc1
commit e025e62445
9 changed files with 150 additions and 121 deletions

View file

@ -5,7 +5,8 @@ git:
depth: 3 depth: 3
# TODO we could use a 32 bit Docker container for running true 32-bit tests # TODO we could use a 32 bit Docker container for running true 32-bit tests
# services: - docker services:
- docker
matrix: matrix:
include: include:
@ -16,10 +17,10 @@ matrix:
env: ARCH=amd64 env: ARCH=amd64
sudo: required sudo: required
- os: linux - os: linux
env: ARCH=amd64 GLFW=SYSTEM env: ARCH=amd64 GLFW=SYSTEM RELEASE=NO
sudo: required sudo: required
- os: linux - os: linux
env: USE_WAYLAND=ON ARCH=amd64 env: USE_WAYLAND=ON ARCH=amd64 RELEASE=NO
sudo: required sudo: required
addons: addons:
apt: apt:
@ -30,13 +31,15 @@ matrix:
- os: osx - os: osx
env: ARCH=universal env: ARCH=universal
- os: linux - os: linux
env: ARCH=arm64-android env: ARCH=arm64-android RELEASE=NO
sudo: required
- os: linux
env: ARCH=html5 RELEASE=NO
sudo: required sudo: required
before_script: before_script:
before_install: before_install:
- export PLATFORM=Desktop
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then - if [ "$TRAVIS_OS_NAME" == "linux" ]; then
if [[ "$ARCH" == *-android ]]; then if [[ "$ARCH" == *-android ]]; then
export RAYLIB_PACKAGE_SUFFIX="-Android-arm64"; export RAYLIB_PACKAGE_SUFFIX="-Android-arm64";
@ -44,9 +47,14 @@ before_install:
unzip -qq android-ndk*.zip; unzip -qq android-ndk*.zip;
android-ndk*/build/tools/make_standalone_toolchain.py --arch arm64 --api 21 --install-dir /tmp/android-toolchain; android-ndk*/build/tools/make_standalone_toolchain.py --arch arm64 --api 21 --install-dir /tmp/android-toolchain;
export PATH=/tmp/android-toolchain/bin:$PATH; export PATH=/tmp/android-toolchain/bin:$PATH;
export PLATFORM=Android; export CMAKE_ARCH_ARGS='-DPLATFORM=Android';
export CC=aarch64-linux-android-clang; export CC=aarch64-linux-android-clang;
export CXX=aarch64-linux-android-clang++; export CXX=aarch64-linux-android-clang++;
elif [ "$ARCH" == "html5" ]; then
export RAYLIB_PACKAGE_SUFFIX="-html5";
docker run --privileged=true -dit --name emscripten -v $(pwd):/src trzeci/emscripten:sdk-incoming-64bit bash;
export CMAKE_ARCH_ARGS='-DPLATFORM=Web -DCMAKE_TOOLCHAIN_FILE=../cmake/emscripten.cmake';
export RUNNER='docker exec -it emscripten cmake -E chdir build';
else else
sudo apt-get install -y gcc-multilib sudo apt-get install -y gcc-multilib
libasound2-dev:$ARCH libasound2-dev:$ARCH
@ -68,10 +76,10 @@ before_install:
export RAYLIB_PACKAGE_SUFFIX="-macOS"; export RAYLIB_PACKAGE_SUFFIX="-macOS";
if [ "$GLFW" == "SYSTEM" ]; then brew update; brew install glfw; fi; if [ "$GLFW" == "SYSTEM" ]; then brew update; brew install glfw; fi;
fi fi
- "$CC --version" - mkdir build
- $RUNNER $CC --version
script: script:
- mkdir build
- cd build - cd build
- if test -n "${USE_WAYLAND}"; - if test -n "${USE_WAYLAND}";
then wget https://mirrors.kernel.org/ubuntu/pool/universe/e/extra-cmake-modules/extra-cmake-modules_5.38.0a-0ubuntu1_amd64.deb; then wget https://mirrors.kernel.org/ubuntu/pool/universe/e/extra-cmake-modules/extra-cmake-modules_5.38.0a-0ubuntu1_amd64.deb;
@ -81,12 +89,12 @@ script:
git checkout 1.12 && ./autogen.sh --prefix=/usr && make && sudo make install; git checkout 1.12 && ./autogen.sh --prefix=/usr && make && sudo make install;
popd; popd;
fi fi
- cmake $CMAKE_ARCH_ARGS -DMACOS_FATLIB=ON -DSTATIC=ON -DSHARED=ON -DBUILD_EXAMPLES=ON -DBUILD_GAMES=ON -DUSE_EXTERNAL_GLFW=IF_POSSIBLE -DUSE_WAYLAND=${USE_WAYLAND} -DPLATFORM=${PLATFORM} .. - $RUNNER cmake $CMAKE_ARCH_ARGS -DMACOS_FATLIB=ON -DSTATIC=ON -DSHARED=ON -DBUILD_EXAMPLES=ON -DBUILD_GAMES=ON -DUSE_EXTERNAL_GLFW=IF_POSSIBLE -DUSE_WAYLAND=${USE_WAYLAND} ..
- make VERBOSE=1 - $RUNNER make VERBOSE=1
- if [ "$GLFW" != "SYSTEM" ]; then make package; fi; - if [ "$RELEASE" != "NO" ]; then $RUNNER make package; fi;
- sudo make install - sudo $RUNNER make install
- pkg-config --static --libs raylib - if [[ "$ARCH" != *-android && "$ARCH" != html5 ]]; then
- if [[ "$ARCH" != *-android ]]; then pkg-config --static --libs raylib;
nm -g release/libraylib.a | grep glfwGetProcAddress || (echo "libraylib.a doesn't contain GLFW symbols! Aborting..." && false); nm -g release/libraylib.a | grep glfwGetProcAddress || (echo "libraylib.a doesn't contain GLFW symbols! Aborting..." && false);
fi fi

15
cmake/emscripten.cmake Normal file
View file

@ -0,0 +1,15 @@
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER emcc)
SET(CMAKE_CXX_COMPILER em++)
if(NOT DEFINED CMAKE_AR)
find_program(CMAKE_AR NAMES emar)
endif()
if(NOT DEFINED CMAKE_RANLIB)
find_program(CMAKE_RANLIB NAMES emranlib)
endif()
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

View file

@ -5,7 +5,11 @@ add_definitions("-DRAYLIB_CMAKE=1")
# Linking for OS X -framework options # Linking for OS X -framework options
# Will do nothing on other OSes # Will do nothing on other OSes
if(APPLE) if(${PLATFORM} MATCHES "Android")
find_library(OPENGL_LIBRARY OpenGL)
set(LIBS_PRIVATE m log android EGL GLESv2 OpenSLES atomic c)
elseif(${PLATFORM} MATCHES "Web")
elseif(APPLE)
find_library(OPENGL_LIBRARY OpenGL) find_library(OPENGL_LIBRARY OpenGL)
find_library(COCOA_LIBRARY Cocoa) find_library(COCOA_LIBRARY Cocoa)
find_library(IOKIT_LIBRARY IOKit) find_library(IOKIT_LIBRARY IOKit)
@ -16,9 +20,6 @@ if(APPLE)
${IOKIT_LIBRARY} ${COREFOUNDATION_LIBRARY} ${COREVIDEO_LIBRARY}) ${IOKIT_LIBRARY} ${COREFOUNDATION_LIBRARY} ${COREVIDEO_LIBRARY})
elseif(WIN32) elseif(WIN32)
# no pkg-config --static on Windows yet... # no pkg-config --static on Windows yet...
elseif(${PLATFORM} MATCHES "Android")
find_library(OPENGL_LIBRARY OpenGL)
set(LIBS_PRIVATE m log android EGL GLESv2 OpenSLES atomic c)
else() else()
find_library(pthread NAMES pthread) find_library(pthread NAMES pthread)
find_package(OpenGL QUIET) find_package(OpenGL QUIET)
@ -87,6 +88,9 @@ function(link_libraries_to_executable executable)
# Link raylib # Link raylib
if (TARGET raylib_shared) if (TARGET raylib_shared)
target_link_libraries(${executable} raylib_shared) target_link_libraries(${executable} raylib_shared)
elseif(${PLATFORM} MATCHES "Web")
target_link_libraries(${executable} ${__PKG_CONFIG_LIBS_PRIVATE})
target_link_libraries(${executable} raylib)
else() else()
target_link_libraries(${executable} raylib ${__PKG_CONFIG_LIBS_PRIVATE}) target_link_libraries(${executable} raylib ${__PKG_CONFIG_LIBS_PRIVATE})
endif() endif()

View file

@ -1,5 +1,5 @@
# Setup the project and settings # Setup the project and settings
project(raylib) project(raylib C)
include(GNUInstallDirs) include(GNUInstallDirs)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")
@ -13,14 +13,6 @@ configure_file(config.h.in ${CMAKE_BINARY_DIR}/cmake/config.h)
include_directories(${CMAKE_BINARY_DIR}) include_directories(${CMAKE_BINARY_DIR})
include_directories(SYSTEM .) include_directories(SYSTEM .)
if(MACOS_FATLIB)
if (CMAKE_OSX_ARCHITECTURES)
message(FATAL_ERROR "User supplied -DCMAKE_OSX_ARCHITECTURES overrides -DMACOS_FATLIB=ON")
else()
SET(CMAKE_OSX_ARCHITECTURES "x86_64;i386")
endif()
endif()
# Get the sources together # Get the sources together
file(GLOB raylib_sources *.c) file(GLOB raylib_sources *.c)
list(REMOVE_ITEM raylib_sources ${CMAKE_CURRENT_SOURCE_DIR}/rglfw.c) list(REMOVE_ITEM raylib_sources ${CMAKE_CURRENT_SOURCE_DIR}/rglfw.c)
@ -72,9 +64,9 @@ if(${PLATFORM} MATCHES "Desktop")
set(GRAPHICS "GRAPHICS_API_OPENGL_ES2") set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
endif() endif()
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
if(APPLE)
set(GRAPHICS "GRAPHICS_API_OPENGL_33") set(GRAPHICS "GRAPHICS_API_OPENGL_33")
link_libraries("${LIBS_PRIVATE}") link_libraries("${LIBS_PRIVATE}")
elseif(WIN32) elseif(WIN32)
@ -85,12 +77,9 @@ elseif(${PLATFORM} MATCHES "Web")
set(PLATFORM "PLATFORM_WEB") set(PLATFORM "PLATFORM_WEB")
set(GRAPHICS "GRAPHICS_API_OPENGL_ES2") set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
# Need to use `emcc` set(CMAKE_C_FLAGS "-s USE_GLFW=3 -s ASSERTIONS=1 --profiling")
set(CMAKE_C_COMPILER "emcc")
set(CMAKE_CXX_COMPILER "em++")
# Change the name of the output library # Change the name of the output library
set(RAYLIB "libraylib.bc")
elseif(${PLATFORM} MATCHES "Android") elseif(${PLATFORM} MATCHES "Android")
set(PLATFORM "PLATFORM_ANDROID") set(PLATFORM "PLATFORM_ANDROID")
@ -110,12 +99,6 @@ elseif(${PLATFORM} MATCHES "Raspberry Pi")
set(GRAPHICS "GRAPHICS_API_OPENGL_ES2") set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
endif() endif()
# Which platform?
if(${PLATFORM} MATCHES "PLATFORM_WEB")
# For the web.
add_executable(${RAYLIB} ${sources})
else()
if(${SHARED}) if(${SHARED})
add_library(${RAYLIB}_shared SHARED ${sources}) add_library(${RAYLIB}_shared SHARED ${sources})
@ -161,12 +144,11 @@ else()
endif(${SHARED}) endif(${SHARED})
if(${STATIC}) if(${STATIC})
add_library(${RAYLIB} STATIC ${sources}) if(${PLATFORM} MATCHES "PLATFORM_WEB")
set(CMAKE_STATIC_LIBRARY_SUFFIX ".bc")
endif()
target_compile_definitions(${RAYLIB} add_library(${RAYLIB} STATIC ${sources})
PUBLIC ${PLATFORM}
PUBLIC ${GRAPHICS}
)
set(PKG_CONFIG_LIBS_PRIVATE ${__PKG_CONFIG_LIBS_PRIVATE}) set(PKG_CONFIG_LIBS_PRIVATE ${__PKG_CONFIG_LIBS_PRIVATE})
if (${PLATFORM} MATCHES "Desktop") if (${PLATFORM} MATCHES "Desktop")
@ -192,7 +174,12 @@ else()
file(COPY "physac.h" DESTINATION ".") file(COPY "physac.h" DESTINATION ".")
file(COPY "raymath.h" DESTINATION ".") file(COPY "raymath.h" DESTINATION ".")
file(COPY "audio.h" DESTINATION ".") file(COPY "audio.h" DESTINATION ".")
endif()
target_compile_definitions(${RAYLIB}
PUBLIC ${PLATFORM}
PUBLIC ${GRAPHICS}
)
# Print the flags for the user # Print the flags for the user
message(STATUS "Compiling with the flags:") message(STATUS "Compiling with the flags:")

View file

@ -1,13 +1,24 @@
### Config options ### ### Config options ###
include(CMakeDependentOption) include(CMakeDependentOption)
set(PLATFORM "Desktop" CACHE STRING "Platform to build for.")
set_property(CACHE PLATFORM PROPERTY STRINGS "Desktop" "Web" "Android" "Raspberry Pi")
set(OPENGL_VERSION "3.3" CACHE STRING "OpenGL Version to build raylib with")
set_property(CACHE OPENGL_VERSION PROPERTY STRINGS "3.3" "2.1" "1.1" "ES 2.0")
# Shared library is always PIC. Static library should be PIC too if linked into a shared library # 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(WITH_PIC "Compile static library as position-independent code" OFF)
option(SHARED "Build raylib as a dynamic library" OFF) option(SHARED "Build raylib as a dynamic library" OFF)
option(STATIC "Build raylib as a static library" ON) 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" ON)
option(USE_AUDIO "Build raylib with audio module" ON) 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)
else()
cmake_dependent_option(USE_OPENAL_BACKEND "Link raylib with openAL instead of mini-al" OFF "USE_AUDIO" OFF) cmake_dependent_option(USE_OPENAL_BACKEND "Link raylib with openAL instead of mini-al" OFF "USE_AUDIO" OFF)
endif()
set(USE_EXTERNAL_GLFW OFF CACHE STRING "Link raylib against system GLFW instead of embedded one") set(USE_EXTERNAL_GLFW OFF CACHE STRING "Link raylib against system GLFW instead of embedded one")
set_property(CACHE USE_EXTERNAL_GLFW PROPERTY STRINGS ON OFF IF_POSSIBLE) set_property(CACHE USE_EXTERNAL_GLFW PROPERTY STRINGS ON OFF IF_POSSIBLE)
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
@ -15,12 +26,6 @@ if(UNIX AND NOT APPLE)
endif() endif()
set(PLATFORM "Desktop" CACHE STRING "Platform to build for.")
set_property(CACHE PLATFORM PROPERTY STRINGS "Desktop" "Web" "Android" "Raspberry Pi")
set(OPENGL_VERSION "3.3" CACHE STRING "OpenGL Version to build raylib with")
set_property(CACHE OPENGL_VERSION PROPERTY STRINGS "3.3" "2.1" "1.1" "ES 2.0")
# core.c # core.c
option(SUPPORT_BUSY_WAIT_LOOP "Use busy wait loop for timing sync instead of a high-resolution timer" ON) option(SUPPORT_BUSY_WAIT_LOOP "Use busy wait loop for timing sync instead of a high-resolution timer" ON)
option(SUPPORT_CAMERA_SYSTEM "Provide camera module (camera.h) with multiple predefined cameras: free, 1st/3rd person, orbital" ON) option(SUPPORT_CAMERA_SYSTEM "Provide camera module (camera.h) with multiple predefined cameras: free, 1st/3rd person, orbital" ON)
@ -88,4 +93,14 @@ if(DEFINED STATIC_RAYLIB)
message(DEPRECATION "-DSTATIC_RAYLIB is deprecated. Please use -DSTATIC instead.") message(DEPRECATION "-DSTATIC_RAYLIB is deprecated. Please use -DSTATIC instead.")
endif() endif()
if(${PLATFORM} MATCHES "Desktop" AND APPLE)
if(MACOS_FATLIB)
if (CMAKE_OSX_ARCHITECTURES)
message(FATAL_ERROR "User supplied -DCMAKE_OSX_ARCHITECTURES overrides -DMACOS_FATLIB=ON")
else()
set(CMAKE_OSX_ARCHITECTURES "x86_64;i386")
endif()
endif()
endif()
# vim: ft=cmake # vim: ft=cmake

View file

@ -73,6 +73,7 @@
* *
**********************************************************************************************/ **********************************************************************************************/
#include "config.h"
#if !defined(USE_OPENAL_BACKEND) #if !defined(USE_OPENAL_BACKEND)
#define USE_MINI_AL 1 // Set to 1 to use mini_al; 0 to use OpenAL. #define USE_MINI_AL 1 // Set to 1 to use mini_al; 0 to use OpenAL.
#endif #endif

View file

@ -1,5 +1,7 @@
/* config.h.in */ /* config.h.in */
#cmakedefine USE_OPENAL_BACKEND 1
// core.c // core.c
/* Camera module is included (camera.h) and multiple predefined cameras are available: free, 1st/3rd person, orbital */ /* Camera module is included (camera.h) and multiple predefined cameras are available: free, 1st/3rd person, orbital */
#cmakedefine SUPPORT_CAMERA_SYSTEM 1 #cmakedefine SUPPORT_CAMERA_SYSTEM 1

View file

@ -568,6 +568,7 @@ void ExportImage(const char *fileName, Image image)
// NOTE: Getting Color array as RGBA unsigned char values // NOTE: Getting Color array as RGBA unsigned char values
unsigned char *imgData = (unsigned char *)GetImageData(image); unsigned char *imgData = (unsigned char *)GetImageData(image);
SavePNG(fileName, imgData, image.width, image.height, 4); SavePNG(fileName, imgData, image.width, image.height, 4);
// FIXME ^ this fails on PLATFORM_WEB, what should we do?
free(imgData); free(imgData);
} }

View file

@ -147,27 +147,23 @@ void TraceLog(int msgType, const char *text, ...)
#endif // SUPPORT_TRACELOG #endif // SUPPORT_TRACELOG
} }
#if defined(SUPPORT_SAVE_BMP)
// Creates a BMP image file from an array of pixel data // Creates a BMP image file from an array of pixel data
void SaveBMP(const char *fileName, unsigned char *imgData, int width, int height, int compSize) void SaveBMP(const char *fileName, unsigned char *imgData, int width, int height, int compSize)
{ {
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) #if defined(SUPPORT_SAVE_BMP) && (defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI))
stbi_write_bmp(fileName, width, height, compSize, imgData); stbi_write_bmp(fileName, width, height, compSize, imgData);
TraceLog(LOG_INFO, "BMP Image saved: %s", fileName); TraceLog(LOG_INFO, "BMP Image saved: %s", fileName);
#endif #endif
} }
#endif
#if defined(SUPPORT_SAVE_PNG)
// Creates a PNG image file from an array of pixel data // Creates a PNG image file from an array of pixel data
void SavePNG(const char *fileName, unsigned char *imgData, int width, int height, int compSize) void SavePNG(const char *fileName, unsigned char *imgData, int width, int height, int compSize)
{ {
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) #if defined(SUPPORT_SAVE_PNG) && (defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI))
stbi_write_png(fileName, width, height, compSize, imgData, width*compSize); stbi_write_png(fileName, width, height, compSize, imgData, width*compSize);
TraceLog(LOG_INFO, "PNG Image saved: %s", fileName); TraceLog(LOG_INFO, "PNG Image saved: %s", fileName);
#endif #endif
} }
#endif
// Keep track of memory allocated // Keep track of memory allocated
// NOTE: mallocType defines the type of data allocated // NOTE: mallocType defines the type of data allocated