FindOpenGL.cmake 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #[[
  2. Custom find module for OpenGL ES for Emscripten compilation.
  3. Input variables:
  4. OpenGL_ENABLE_EMULATION
  5. Output variables:
  6. OpenGL_FOUND
  7. OpenGL_VERSION
  8. Resulting targets:
  9. OpenGL::GL
  10. More info:
  11. https://emscripten.org/docs/porting/multimedia_and_graphics/OpenGL-support.html
  12. ]]
  13. include(FindPackageHandleStandardArgs)
  14. include(FindPackageMessage)
  15. if(NOT TARGET OpenGL::GL)
  16. # If no version was specified, set default
  17. if(NOT DEFINED OpenGL_FIND_VERSION)
  18. set(OpenGL_FIND_VERSION "3")
  19. endif()
  20. if(NOT DEFINED OpenGL_ENABLE_EMULATION)
  21. set(OpenGL_ENABLE_EMULATION ON)
  22. endif()
  23. # Check if requested OpenGL version is valid
  24. if((OpenGL_FIND_VERSION VERSION_LESS "1") OR (OpenGL_FIND_VERSION VERSION_GREATER_EQUAL "4"))
  25. message(FATAL_ERROR "The requested OpenGL version ${OpenGL_FIND_VERSION} is invalid.")
  26. endif()
  27. # Emscripten includes OpenGL ES support as part of it's SDK, meaning there's no need to find it
  28. set(OpenGL_FOUND TRUE)
  29. add_library(OpenGL::GL INTERFACE IMPORTED)
  30. # Set found OpenGL version
  31. if((OpenGL_FIND_VERSION VERSION_GREATER_EQUAL "1") AND (OpenGL_FIND_VERSION VERSION_LESS "2"))
  32. set(OpenGL_VERSION "1")
  33. elseif((OpenGL_FIND_VERSION VERSION_GREATER_EQUAL "2") AND (OpenGL_FIND_VERSION VERSION_LESS "3"))
  34. set(OpenGL_VERSION "2")
  35. elseif((OpenGL_FIND_VERSION VERSION_GREATER_EQUAL "3") AND (OpenGL_FIND_VERSION VERSION_LESS "4"))
  36. set(OpenGL_VERSION "3")
  37. endif()
  38. #[[
  39. The Emscripten SDK already makes OpenGL available by default without any additional configuration.
  40. However, additional settings might be needed in some cases.
  41. ]]
  42. # Handle OpenGL 1 edge case
  43. # More info: https://emscripten.org/docs/porting/multimedia_and_graphics/OpenGL-support.html#emulation-of-older-desktop-opengl-api-features
  44. if(OpenGL_VERSION VERSION_EQUAL "1")
  45. target_link_libraries(OpenGL::GL INTERFACE "-sLEGACY_GL_EMULATION")
  46. endif()
  47. # Handle OpenGL ES software emulation
  48. # More info: https://emscripten.org/docs/porting/multimedia_and_graphics/OpenGL-support.html#opengl-es-2-0-3-0-emulation
  49. if(OpenGL_ENABLE_EMULATION AND OpenGL_VERSION VERSION_GREATER_EQUAL "2")
  50. target_link_libraries(OpenGL::GL INTERFACE "-sFULL_ES${OpenGL_VERSION}")
  51. endif()
  52. # Get final compiler and linker flags to print them
  53. get_target_property(OpenGL_COMPILE_FLAGS OpenGL::GL "INTERFACE_COMPILE_OPTIONS")
  54. get_target_property(OpenGL_LINK_FLAGS OpenGL::GL "INTERFACE_LINK_OPTIONS")
  55. find_package_message(
  56. "OpenGL"
  57. "OpenGL ${OpenGL_VERSION} has been found as part of the Emscripten SDK."
  58. "[${OpenGL_COMPILE_FLAGS}][${OpenGL_LINK_FLAGS}]"
  59. )
  60. # Clean scope
  61. unset(OpenGL_COMPILE_FLAGS)
  62. unset(OpenGL_LINK_FLAGS)
  63. else()
  64. # Since the target already exists, we declare it as found
  65. set(OpenGL_FOUND TRUE)
  66. if(NOT DEFINED OpenGL_VERSION)
  67. set(OpenGL_VERSION "UNKNOWN")
  68. endif()
  69. endif()