diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ed3bb5..3d1b09d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,26 +2,9 @@ cmake_minimum_required(VERSION 3.3 FATAL_ERROR) project(padlab C) set(TARGET padlab) -option(USE_METAL "use Metal for drawing" ${APPLE}) -if (USE_METAL) - option(USE_OPENGL "Use OpenGL for drawing (WIP)" OFF) - option(USE_OPENGL_LEGACY "Use legacy OpenGL for drawing" OFF) - if (USE_OPENGL) - message(FATAL_ERROR "USE_METAL and USE_OPENGL are both ON but only one backend can be used at a time, turn one OFF and regenerate. (or delete cache and try again)") - elseif (USE_OPENGL_LEGACY) - message(FATAL_ERROR "USE_METAL and USE_OPENGL_LEGACY are both ON but only one backend can be used at a time, turn one OFF and regenerate. (or delete cache and try again)") - endif() -else() - option(USE_OPENGL "Use OpenGL for drawing (WIP)" OFF) - if (USE_OPENGL) - option(USE_OPENGL_LEGACY "Use legacy OpenGL for drawing" OFF) - if (USE_OPENGL_LEGACY) - message(FATAL_ERROR "USE_OPENGL and USE_OPENGL_LEGACY are both ON but only one backend can be used at a time, turn one OFF and regenerate. (or delete cache and try again)") - endif() - else() - option(USE_OPENGL_LEGACY "Use legacy OpenGL for drawing" ON) - endif() -endif() +option(BUILD_OPENGL_LEGACY "Build legacy OpenGL 1.1 compatibility profile executable" ON) +option(BUILD_METAL "Build executable using Metal for drawing (WIP)" ${APPLE}) +option(BUILD_OPENGL "Build OpenGL 3.3 core profile executable (WIP)" OFF) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") set(CMAKE_C_STANDARD 99) @@ -33,7 +16,7 @@ elseif (MSVC) endif() find_package(SDL2 REQUIRED) -if (USE_OPENGL OR USE_OPENGL_LEGACY) +if (BUILD_OPENGL OR BUILD_OPENGL_LEGACY) if (NOT DEFINED OpenGL_GL_PREFERENCE) set(OpenGL_GL_PREFERENCE "GLVND") endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 707698c..ea4efa9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,44 +1,59 @@ -set(SOURCES +set(SOURCES_COMMON maths.h draw.h draw_common.c - $<$,$,$>>:draw.c> - $<$:draw_metal.m metal_shader_types.h> - $<$:draw_opengl_core.c> - $<$:draw_opengl.c> stick.h stick.c analogue.c) +set(SOURCES_SDL_RENDERER draw.c) +set(SOURCES_METAL draw_metal.m metal_shader_types.h) +set(SOURCES_OPENGL draw_opengl_core.c) +set(SOURCES_OPENGL_LEGACY draw_opengl.c) -if (USE_METAL) +function (common_setup _TARGET) + target_link_libraries(${_TARGET} + $<$:SDL2::SDL2main> + SDL2::SDL2 + $<$:m>) + target_compile_options(${_TARGET} PRIVATE + $<$:-Wall -Wextra -pedantic -Wno-unused-parameter>) +endfunction() + +add_executable(${TARGET} ${SOURCES_COMMON} ${SOURCES_SDL_RENDERER}) +common_setup(${TARGET}) + +if (BUILD_METAL OR BUILD_OPENGL) + include(BinHelper) +endif() + +if (BUILD_METAL) + enable_language(OBJC) find_library(METAL Metal REQUIRED) find_library(FOUNDATION Foundation REQUIRED) find_library(QUARTZCORE QuartzCore REQUIRED) include(MetalHelper) metal_compile(OUTPUT shader.metallib SOURCES shader.metal) - include(BinHelper) bin2h_compile(OUTPUT metalShader.h BIN ${CMAKE_CURRENT_BINARY_DIR}/shader.metallib) - list(APPEND SOURCES ${CMAKE_CURRENT_BINARY_DIR}/metalShader.h) -elseif (USE_OPENGL) - include(GL3WHelper) - add_gl3w(gl3w) - include(BinHelper) - bin2h_compile(OUTPUT glslShaders.h TXT vert.glsl geom.glsl frag.glsl) - list(APPEND SOURCES ${CMAKE_CURRENT_BINARY_DIR}/glslShaders.h) + add_executable(${TARGET}_metal ${SOURCES_COMMON} ${SOURCES_METAL} ${CMAKE_CURRENT_BINARY_DIR}/metalShader.h) + target_include_directories(${TARGET}_metal PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(${TARGET}_metal ${METAL} ${QUARTZCORE} ${FOUNDATION}) + common_setup(${TARGET}_metal) endif() -add_executable(${TARGET} ${SOURCES}) -target_include_directories(${TARGET} PRIVATE - $<$,$>:${CMAKE_CURRENT_BINARY_DIR}>) -target_link_libraries(${TARGET} - $<$:SDL2::SDL2main> - SDL2::SDL2 - $<$:${METAL} ${QUARTZCORE} ${FOUNDATION}> - $<$,$>:OpenGL::GL> - $<$:gl3w> - $<$:m>) -target_compile_options(${TARGET} PRIVATE - $<$:-Wall -Wextra -pedantic -Wno-unused-parameter>) -target_compile_definitions(${TARGET} PRIVATE - $<$:USE_METAL> - $<$,$>:USE_OPENGL>) +if (BUILD_OPENGL) + include(GL3WHelper) + add_gl3w(gl3w) + bin2h_compile(OUTPUT glslShaders.h TXT vert.glsl geom.glsl frag.glsl) + add_executable(${TARGET}_glcore ${SOURCES_COMMON} ${SOURCES_OPENGL} ${CMAKE_CURRENT_BINARY_DIR}/glslShaders.h) + target_include_directories(${TARGET}_glcore PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(${TARGET}_glcore OpenGL::GL gl3w) + target_compile_definitions(${TARGET}_glcore PRIVATE USE_OPENGL) + common_setup(${TARGET}_glcore) +endif() + +if (BUILD_OPENGL_LEGACY) + add_executable(${TARGET}_gl ${SOURCES_COMMON} ${SOURCES_OPENGL_LEGACY}) + target_link_libraries(${TARGET}_gl OpenGL::GL) + target_compile_definitions(${TARGET}_gl PRIVATE USE_OPENGL) + common_setup(${TARGET}_gl) +endif()