| cmake_minimum_required(VERSION 3.10) |
| cmake_policy(SET CMP0072 NEW) |
| project(TestFindOpenGL C) |
| include(CTest) |
| |
| find_package(OpenGL REQUIRED) |
| |
| # import target for GLU |
| add_executable(test_tgt main.c) |
| target_link_libraries(test_tgt OpenGL::GLU) |
| add_test(NAME test_tgt COMMAND test_tgt) |
| |
| # OPENGL_LIBRARIES should be whatever libraries are needed to link. |
| add_executable(test_var main.c) |
| target_include_directories(test_var PRIVATE ${OPENGL_INGLUDE_DIRS}) |
| target_link_libraries(test_var PRIVATE ${OPENGL_LIBRARIES}) |
| add_test(NAME test_var COMMAND test_var) |
| |
| # VND support adds an ::OpenGL import target. This can be used for OpenGL-only |
| # code (code that does not manipulate contexts, like our 'main.c'). Without |
| # VND, ::GL can be used for both context and non-context OpenGL code. |
| if(OpenGL_TEST_VND) |
| add_executable(test_comp_none main.c) |
| target_link_libraries(test_comp_none PRIVATE OpenGL::OpenGL) |
| add_test(NAME test_comp_none COMMAND test_comp_none) |
| else() |
| add_executable(test_comp_none main.c) |
| target_link_libraries(test_comp_none PRIVATE OpenGL::GL) |
| add_test(NAME test_comp_none COMMAND test_comp_none) |
| endif() |
| |
| # GLX |
| if(OpenGL_TEST_VND) |
| find_package(OpenGL REQUIRED COMPONENTS OpenGL GLX) |
| add_executable(test_comp_glx main.c) |
| target_link_libraries(test_comp_glx PRIVATE OpenGL::OpenGL OpenGL::GLX) |
| add_test(NAME test_comp_glx COMMAND test_comp_glx) |
| else() |
| # non-VND systems won't have it, but an optional search for GLX should still |
| # be okay. |
| find_package(OpenGL COMPONENTS GLX) |
| add_executable(test_comp_glx_novnd main.c) |
| target_link_libraries(test_comp_glx_novnd PRIVATE OpenGL::GL) |
| add_test(NAME test_comp_glx_novnd COMMAND test_comp_glx_novnd) |
| endif() |
| |
| find_package(OpenGL COMPONENTS OpenGL EGL) |
| if(OpenGL_EGL_FOUND) |
| add_executable(test_comp_egl main.c) |
| target_link_libraries(test_comp_egl PRIVATE OpenGL::OpenGL OpenGL::EGL) |
| add_test(NAME test_comp_egl COMMAND test_comp_egl) |
| # EGL-only code should not link to GLX. |
| get_target_property(iface_libs OpenGL::EGL INTERFACE_LINK_LIBRARIES) |
| if(iface_libs MATCHES "GLX") |
| message(FATAL_ERROR "EGL-only code links to GLX!") |
| endif() |
| endif() |
| |
| # all three COMPONENTS together. |
| find_package(OpenGL COMPONENTS OpenGL EGL GLX) |
| if(OpenGL_EGL_FOUND AND OpenGL_GLX_FOUND) |
| add_executable(test_comp_both main.c) |
| target_link_libraries(test_comp_both PRIVATE OpenGL::OpenGL OpenGL::EGL |
| OpenGL::GLX) |
| add_test(NAME test_comp_both COMMAND test_comp_both) |
| endif() |
| |
| find_package(OpenGL COMPONENTS GLES2) |
| if(OpenGL_GLES2_FOUND) |
| add_executable(test_comp_gles2 main_gles2.c) |
| target_link_libraries(test_comp_gles2 PRIVATE OpenGL::GLES2) |
| add_test(NAME test_comp_gles2 COMMAND test_comp_gles2) |
| # GLES2-only code should not link to OpenGL |
| get_target_property(iface_libs test_comp_gles2 LINK_LIBRARIES) |
| if(iface_libs MATCHES "OpenGL::OpenGL") |
| message(FATAL_ERROR "GLES2-only code links to OpenGL!") |
| endif() |
| endif() |
| |
| # GLES2 and EGL together. |
| find_package(OpenGL COMPONENTS GLES2 EGL) |
| if(OpenGL_GLES2_FOUND AND OpenGL_EGL_FOUND) |
| add_executable(test_comp_gles2_egl main_gles2.c) |
| target_link_libraries(test_comp_gles2_egl PRIVATE OpenGL::GLES2 |
| OpenGL::EGL) |
| add_test(NAME test_comp_gles2_egl COMMAND test_comp_gles2_egl) |
| # GLES2-EGL-only code should not link to OpenGL or GLX |
| get_target_property(iface_libs test_comp_gles2_egl LINK_LIBRARIES) |
| if(iface_libs MATCHES "OpenGL::OpenGL") |
| message(FATAL_ERROR "GLES2-only code links to OpenGL!") |
| endif() |
| if(iface_libs MATCHES "GLX") |
| message(FATAL_ERROR "GLES2-EGL-only code links to GLX!") |
| endif() |
| endif() |
| |
| # GLES2 and GLX together. |
| find_package(OpenGL COMPONENTS GLES2 GLX) |
| if(OpenGL_GLES2_FOUND AND OpenGL_GLX_FOUND) |
| add_executable(test_comp_gles2_glx main_gles2.c) |
| target_link_libraries(test_comp_gles2_glx PRIVATE OpenGL::GLES2 |
| OpenGL::GLX) |
| add_test(NAME test_comp_gles2_glx COMMAND test_comp_gles2_glx) |
| # GLES2-GLX-only code should not link to OpenGL or EGL |
| get_target_property(iface_libs test_comp_gles2_glx LINK_LIBRARIES) |
| if(iface_libs MATCHES "OpenGL::OpenGL") |
| message(FATAL_ERROR "GLES2-only code links to OpenGL!") |
| endif() |
| if(iface_libs MATCHES "EGL") |
| message(FATAL_ERROR "GLES2-GLX-only code links to EGL!") |
| endif() |
| endif() |
| |
| find_package(OpenGL COMPONENTS GLES3) |
| if(OpenGL_GLES3_FOUND) |
| add_executable(test_comp_gles3 main_gles3.c) |
| target_link_libraries(test_comp_gles3 PRIVATE OpenGL::GLES3) |
| add_test(NAME test_comp_gles3 COMMAND test_comp_gles3) |
| # GLES3-only code should not link to OpenGL. |
| get_target_property(iface_libs test_comp_gles3 LINK_LIBRARIES) |
| if(iface_libs MATCHES "OpenGL::OpenGL") |
| message(FATAL_ERROR "GLES3-only code links to OpenGL!") |
| endif() |
| endif() |
| |
| # GLES3 and EGL together. |
| find_package(OpenGL COMPONENTS GLES3 EGL) |
| if(OpenGL_GLES3_FOUND AND OpenGL_EGL_FOUND) |
| add_executable(test_comp_gles3_egl main_gles3.c) |
| target_link_libraries(test_comp_gles3_egl PRIVATE OpenGL::GLES3 |
| OpenGL::EGL) |
| add_test(NAME test_comp_gles3_egl COMMAND test_comp_gles3_egl) |
| # GLES3-EGL-only code should not link to OpenGL or GLX |
| get_target_property(iface_libs test_comp_gles3_egl LINK_LIBRARIES) |
| if(iface_libs MATCHES "OpenGL::OpenGL") |
| message(FATAL_ERROR "GLES3-only code links to OpenGL!") |
| endif() |
| if(iface_libs MATCHES "GLX") |
| message(FATAL_ERROR "GLES3-EGL-only code links to GLX!") |
| endif() |
| endif() |
| |
| # GLES3 and GLX together. |
| find_package(OpenGL COMPONENTS GLES3 GLX) |
| if(OpenGL_GLES3_FOUND AND OpenGL_GLX_FOUND) |
| add_executable(test_comp_gles3_glx main_gles3.c) |
| target_link_libraries(test_comp_gles3_glx PRIVATE OpenGL::GLES3 |
| OpenGL::GLX) |
| add_test(NAME test_comp_gles3_glx COMMAND test_comp_gles3_glx) |
| # GLESr-GLX-only code should not link to OpenGL or EGL |
| get_target_property(iface_libs test_comp_gles3_glx LINK_LIBRARIES) |
| if(iface_libs MATCHES "OpenGL::OpenGL") |
| message(FATAL_ERROR "GLES3-only code links to OpenGL!") |
| endif() |
| if(iface_libs MATCHES "EGL") |
| message(FATAL_ERROR "GLES3-GLX-only code links to EGL!") |
| endif() |
| endif() |