cmake_minimum_required(VERSION 2.8) # Default to release build if not specified if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) endif() project(minimal_webgl) macro(append_linker_flags FLAGS) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAGS}") endmacro() if (EMSCRIPTEN) set(CMAKE_EXECUTABLE_SUFFIX ".html") # Link in the JS library file for support code append_linker_flags("--js-library ${CMAKE_CURRENT_LIST_DIR}/library_js.js") # Link in to WebGL/GLES system library append_linker_flags("-lGL") # Enable Closure compiler for aggressive JS size minification append_linker_flags("--closure 1") # When marshalling C UTF-8 strings across the JS<->Wasm language boundary, favor smallest generated code size # rather than performance append_linker_flags("-sTEXTDECODER=2") # Enable aggressive MINIMAL_RUNTIME mode. append_linker_flags("-sMINIMAL_RUNTIME=2") # Require WebGL 2 support in target browser, for smallest generated code size. (pass -sMIN_WEBGL_VERSION=1 to dual-target WebGL 1 and WebGL 2) append_linker_flags("-sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2") # Tell the example code in webgl.c that we are only targeting WebGL 2. add_definitions(-DMAX_WEBGL_VERSION=2) # The generated build output is only to be expected to be run in a web browser, never in a native CLI shell, or in a web worker. append_linker_flags("-sENVIRONMENT=web") # Choose the oldest browser versions that should be supported. The higher minimum bar you choose, the less # emulation code may be present for old browser quirks. append_linker_flags("-sMIN_FIREFOX_VERSION=70") append_linker_flags("-sMIN_SAFARI_VERSION=130000") append_linker_flags("-sMIN_IE_VERSION=0x7FFFFFFF") # Do not support Internet Explorer at all (this is the Emscripten default, shown here for posterity) append_linker_flags("-sMIN_EDGE_VERSION=79") # Require Chromium-based Edge browser append_linker_flags("-sMIN_CHROME_VERSION=80") # Fine tuning for code size: do not generate code to abort program execution on malloc() failures, that will # not be interesting here. append_linker_flags("-sABORTING_MALLOC=0") # Reduce WebGL code size: We do not need GLES2 emulation for automatic GL extension enabling append_linker_flags("-sGL_SUPPORT_AUTOMATIC_ENABLE_EXTENSIONS=0") # Reduce WebGL code size: We do not need GLES2 emulation for GL extension names append_linker_flags("-sGL_EXTENSIONS_IN_PREFIXED_FORMAT=0") # Reduce WebGL code size: No need to specify the GL_VENDOR/GL_RENDERER etc. fields in format required by GLES2 spec. append_linker_flags("-sGL_EMULATE_GLES_VERSION_STRING_FORMAT=0") # Reduce WebGL code size at the expense of performance (this only has an effect in WebGL 1, practically a no-op here) append_linker_flags("-sGL_POOL_TEMP_BUFFERS=0") # Reduce WebGL code size: WebGL bindings layer should not keep track of certain WebGL # errors that are only meaningful for C/C++ applications. (good to enable for release when glGetError() is not used, but disable in debug) append_linker_flags("-sGL_TRACK_ERRORS=0") # Reduce WebGL code size: do not emit code for extensions that we might not need. append_linker_flags("-sGL_SUPPORT_SIMPLE_ENABLE_EXTENSIONS=0") # Optimization flag to optimize aggressively for size. (other options -Os, -O3, -O2, -O1, -O0) append_linker_flags("-Oz") # Reduce code size: We do not need libc errno field support in our build output. append_linker_flags("-sSUPPORT_ERRNO=0") # Reduce code size: We do not need native POSIX filesystem emulation support (Emscripten FS/MEMFS) append_linker_flags("-sFILESYSTEM=0") endif() file(GLOB_RECURSE sources *.cpp *.c *.h) add_executable(minimal_webgl ${sources}) file(GLOB_RECURSE assets *.png) foreach(asset ${assets}) file(COPY "${asset}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/") endforeach()