|
| 1 | +# OpenColorIO.wasm - Graphics Tier 3 CMake Configuration |
| 2 | +# Production-quality color management library compiled to WebAssembly |
| 3 | +# Following WASM Ecosystem Standards v2.0 |
| 4 | + |
| 5 | +cmake_minimum_required(VERSION 3.16) |
| 6 | +project(OpenColorIO_WASM VERSION 2.5.0) |
| 7 | + |
| 8 | +# Verify we're using Emscripten |
| 9 | +if(NOT EMSCRIPTEN) |
| 10 | + message(FATAL_ERROR "This build script requires Emscripten. Please use: emcmake cmake") |
| 11 | +endif() |
| 12 | + |
| 13 | +# Set C++ standard |
| 14 | +set(CMAKE_CXX_STANDARD 17) |
| 15 | +set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 16 | + |
| 17 | +# Build type configuration |
| 18 | +if(NOT CMAKE_BUILD_TYPE) |
| 19 | + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE) |
| 20 | +endif() |
| 21 | + |
| 22 | +# Graphics Tier 3 memory configuration - High memory for rendering and LUTs |
| 23 | +set(WASM_INITIAL_MEMORY "128MB") |
| 24 | +set(WASM_MAXIMUM_MEMORY "2GB") |
| 25 | + |
| 26 | +# Build options for OpenColorIO.wasm |
| 27 | +option(ENABLE_SIMD "Enable WebAssembly SIMD optimizations" ON) |
| 28 | +option(ENABLE_WEBGPU "Enable WebGPU compute shader support" ON) |
| 29 | +option(ENABLE_WASM_NATIVE "Enable WASM-native filesystem features" ON) |
| 30 | + |
| 31 | +# Ecosystem dependency integration - Foundation Tier 1 libraries |
| 32 | +set(ECOSYSTEM_DEPS "") |
| 33 | + |
| 34 | +# Check for Foundation Tier 1 dependencies |
| 35 | +find_path(IMATH_WASM_DIR "imath.wasm" PATHS "../Imath.wasm/install" "../Imath.wasm/dist" NO_DEFAULT_PATH) |
| 36 | +if(IMATH_WASM_DIR) |
| 37 | + list(APPEND ECOSYSTEM_DEPS "${IMATH_WASM_DIR}/imath.wasm") |
| 38 | + message(STATUS "Using ecosystem Imath.wasm from ${IMATH_WASM_DIR}") |
| 39 | +else() |
| 40 | + message(WARNING "Imath.wasm not found - OpenColorIO requires Foundation Tier 1 dependencies") |
| 41 | +endif() |
| 42 | + |
| 43 | +find_path(LIBEXPAT_WASM_DIR "libexpat.wasm" PATHS "../libexpat.wasm/install" "../libexpat.wasm/dist" NO_DEFAULT_PATH) |
| 44 | +if(LIBEXPAT_WASM_DIR) |
| 45 | + list(APPEND ECOSYSTEM_DEPS "${LIBEXPAT_WASM_DIR}/libexpat.wasm") |
| 46 | + message(STATUS "Using ecosystem libexpat.wasm from ${LIBEXPAT_WASM_DIR}") |
| 47 | +endif() |
| 48 | + |
| 49 | +find_path(ZLIB_WASM_DIR "zlib.wasm" PATHS "../zlib.wasm/install" "../zlib.wasm/dist" NO_DEFAULT_PATH) |
| 50 | +if(ZLIB_WASM_DIR) |
| 51 | + list(APPEND ECOSYSTEM_DEPS "${ZLIB_WASM_DIR}/zlib.wasm") |
| 52 | + message(STATUS "Using ecosystem zlib.wasm from ${ZLIB_WASM_DIR}") |
| 53 | +endif() |
| 54 | + |
| 55 | +find_path(MINIZIP_NG_WASM_DIR "minizip-ng.wasm" PATHS "../minizip-ng.wasm/install" "../minizip-ng.wasm/dist" NO_DEFAULT_PATH) |
| 56 | +if(MINIZIP_NG_WASM_DIR) |
| 57 | + list(APPEND ECOSYSTEM_DEPS "${MINIZIP_NG_WASM_DIR}/minizip-ng.wasm") |
| 58 | + message(STATUS "Using ecosystem minizip-ng.wasm from ${MINIZIP_NG_WASM_DIR}") |
| 59 | +endif() |
| 60 | + |
| 61 | +find_path(PYSTRING_WASM_DIR "pystring.wasm" PATHS "../pystring.wasm/install" "../pystring.wasm/dist" NO_DEFAULT_PATH) |
| 62 | +if(PYSTRING_WASM_DIR) |
| 63 | + list(APPEND ECOSYSTEM_DEPS "${PYSTRING_WASM_DIR}/pystring.wasm") |
| 64 | + message(STATUS "Using ecosystem pystring.wasm from ${PYSTRING_WASM_DIR}") |
| 65 | +endif() |
| 66 | + |
| 67 | +# Base compiler flags for Graphics Tier 3 |
| 68 | +set(WASM_BASE_FLAGS |
| 69 | + -sWASM=1 |
| 70 | + -sMODULARIZE=1 |
| 71 | + -sEXPORT_ES6=1 |
| 72 | + -sEXPORT_NAME='OpenColorIOModule' |
| 73 | + -sINITIAL_MEMORY=${WASM_INITIAL_MEMORY} |
| 74 | + -sMAXIMUM_MEMORY=${WASM_MAXIMUM_MEMORY} |
| 75 | + -sALLOW_MEMORY_GROWTH=1 |
| 76 | + -sSTACK_SIZE=5MB |
| 77 | + -sASSERTIONS=0 |
| 78 | +) |
| 79 | + |
| 80 | +# Performance optimization flags |
| 81 | +set(WASM_OPTIMIZATION_FLAGS |
| 82 | + -O3 |
| 83 | + -flto |
| 84 | + --closure 1 |
| 85 | +) |
| 86 | + |
| 87 | +# SIMD flags - Enable WebAssembly SIMD for color processing |
| 88 | +if(ENABLE_SIMD) |
| 89 | + list(APPEND WASM_BASE_FLAGS -msimd128) |
| 90 | + add_compile_definitions(OCIO_WASM_SIMD_ENABLED) |
| 91 | + message(STATUS "✅ WebAssembly SIMD enabled for color transforms") |
| 92 | +else() |
| 93 | + message(STATUS "❌ SIMD disabled - using scalar fallback") |
| 94 | +endif() |
| 95 | + |
| 96 | +# WebGPU support flags |
| 97 | +if(ENABLE_WEBGPU) |
| 98 | + list(APPEND WASM_BASE_FLAGS |
| 99 | + -sUSE_WEBGPU=1 |
| 100 | + -sASYNCIFY=1 # Required for async WebGPU operations |
| 101 | + ) |
| 102 | + add_compile_definitions(OCIO_WASM_WEBGPU_ENABLED) |
| 103 | + message(STATUS "✅ WebGPU compute shader support enabled") |
| 104 | +else() |
| 105 | + message(STATUS "❌ WebGPU disabled") |
| 106 | +endif() |
| 107 | + |
| 108 | +# WASM-native filesystem support |
| 109 | +if(ENABLE_WASM_NATIVE) |
| 110 | + list(APPEND WASM_BASE_FLAGS |
| 111 | + -sFORCE_FILESYSTEM=1 |
| 112 | + -sASYNCIFY=1 # Required for async file operations |
| 113 | + -lidbfs.js # IDBFS for persistent color space storage |
| 114 | + --preload-file configs@/color-configs |
| 115 | + ) |
| 116 | + add_compile_definitions(OCIO_WASM_NATIVE_ENABLED) |
| 117 | + message(STATUS "✅ WASM-native filesystem patterns enabled") |
| 118 | +else() |
| 119 | + message(STATUS "❌ WASM-native features disabled") |
| 120 | +endif() |
| 121 | + |
| 122 | +# Runtime method exports |
| 123 | +set(WASM_RUNTIME_METHODS |
| 124 | + ccall |
| 125 | + cwrap |
| 126 | + HEAPU8 |
| 127 | + HEAPF32 |
| 128 | + addFunction |
| 129 | + removeFunction |
| 130 | + FS |
| 131 | +) |
| 132 | +list(JOIN WASM_RUNTIME_METHODS "," RUNTIME_METHODS_STR) |
| 133 | +list(APPEND WASM_BASE_FLAGS -sEXPORTED_RUNTIME_METHODS=[${RUNTIME_METHODS_STR}]) |
| 134 | + |
| 135 | +# Debug vs Release configuration |
| 136 | +if(CMAKE_BUILD_TYPE STREQUAL "Debug") |
| 137 | + list(APPEND WASM_BASE_FLAGS |
| 138 | + -g |
| 139 | + -gsource-map |
| 140 | + -sASSERTIONS=1 |
| 141 | + -sDEBUG_LEVEL=1 |
| 142 | + ) |
| 143 | + message(STATUS "🐛 Debug build with source maps enabled") |
| 144 | +else() |
| 145 | + list(APPEND WASM_BASE_FLAGS ${WASM_OPTIMIZATION_FLAGS}) |
| 146 | + message(STATUS "🚀 Release build with full optimization") |
| 147 | +endif() |
| 148 | + |
| 149 | +# Apply flags to both compile and link |
| 150 | +string(JOIN " " WASM_FLAGS_STR ${WASM_BASE_FLAGS}) |
| 151 | +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS_STR}") |
| 152 | +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS_STR}") |
| 153 | +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${WASM_FLAGS_STR}") |
| 154 | + |
| 155 | +# Link ecosystem dependencies |
| 156 | +if(ECOSYSTEM_DEPS) |
| 157 | + string(JOIN " " ECOSYSTEM_DEPS_STR ${ECOSYSTEM_DEPS}) |
| 158 | + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ECOSYSTEM_DEPS_STR}") |
| 159 | + message(STATUS "🔗 Linking ecosystem dependencies: ${ECOSYSTEM_DEPS_STR}") |
| 160 | +endif() |
| 161 | + |
| 162 | +# Source files for OpenColorIO WASM module |
| 163 | +set(OCIO_WASM_SOURCES |
| 164 | + wasm/ocio_wasm_main.cpp |
| 165 | + wasm/ocio_wasm_api.cpp |
| 166 | + wasm/ocio_wasm_simd.cpp |
| 167 | + wasm/ocio_wasm_webgpu.cpp |
| 168 | + wasm/ocio_wasm_native.cpp |
| 169 | + wasm/ocio_js_bindings.cpp |
| 170 | +) |
| 171 | + |
| 172 | +# Create the WASM executable |
| 173 | +add_executable(opencolorio_wasm ${OCIO_WASM_SOURCES}) |
| 174 | + |
| 175 | +# Set output names |
| 176 | +set_target_properties(opencolorio_wasm PROPERTIES |
| 177 | + OUTPUT_NAME "opencolorio" |
| 178 | +) |
| 179 | + |
| 180 | +# Include directories for OpenColorIO headers |
| 181 | +target_include_directories(opencolorio_wasm PRIVATE |
| 182 | + ${CMAKE_CURRENT_SOURCE_DIR}/include |
| 183 | + ${CMAKE_CURRENT_SOURCE_DIR}/src |
| 184 | +) |
| 185 | + |
| 186 | +# Link against system OpenColorIO (assumes already built) |
| 187 | +find_package(PkgConfig) |
| 188 | +if(PkgConfig_FOUND) |
| 189 | + pkg_check_modules(OCIO REQUIRED OpenColorIO) |
| 190 | + target_include_directories(opencolorio_wasm PRIVATE ${OCIO_INCLUDE_DIRS}) |
| 191 | + target_compile_options(opencolorio_wasm PRIVATE ${OCIO_CFLAGS_OTHER}) |
| 192 | + target_link_libraries(opencolorio_wasm ${OCIO_LIBRARIES}) |
| 193 | +endif() |
| 194 | + |
| 195 | +# Compile definitions |
| 196 | +target_compile_definitions(opencolorio_wasm PRIVATE |
| 197 | + OCIO_VERSION_MAJOR=2 |
| 198 | + OCIO_VERSION_MINOR=5 |
| 199 | + OCIO_VERSION_PATCH=0 |
| 200 | + OCIO_WASM_BUILD=1 |
| 201 | +) |
| 202 | + |
| 203 | +# Installation |
| 204 | +install(FILES |
| 205 | + ${CMAKE_CURRENT_BINARY_DIR}/opencolorio.js |
| 206 | + ${CMAKE_CURRENT_BINARY_DIR}/opencolorio.wasm |
| 207 | + DESTINATION dist/ |
| 208 | +) |
| 209 | + |
| 210 | +# Install TypeScript definitions |
| 211 | +install(FILES |
| 212 | + wasm/opencolorio.d.ts |
| 213 | + DESTINATION dist/ |
| 214 | +) |
| 215 | + |
| 216 | +# Install additional assets |
| 217 | +if(ENABLE_WASM_NATIVE) |
| 218 | + install(DIRECTORY configs/ DESTINATION dist/color-configs/) |
| 219 | +endif() |
| 220 | + |
| 221 | +# Print build summary |
| 222 | +message(STATUS "") |
| 223 | +message(STATUS "=== OpenColorIO.wasm Build Configuration ===") |
| 224 | +message(STATUS "Version: ${PROJECT_VERSION}") |
| 225 | +message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}") |
| 226 | +message(STATUS "SIMD: ${ENABLE_SIMD}") |
| 227 | +message(STATUS "WebGPU: ${ENABLE_WEBGPU}") |
| 228 | +message(STATUS "WASM-native: ${ENABLE_WASM_NATIVE}") |
| 229 | +message(STATUS "Ecosystem deps: ${ECOSYSTEM_DEPS}") |
| 230 | +message(STATUS "Memory: ${WASM_INITIAL_MEMORY} - ${WASM_MAXIMUM_MEMORY}") |
| 231 | +message(STATUS "==========================================") |
| 232 | +message(STATUS "") |
0 commit comments