Split USE backends into separate targets

This commit is contained in:
2023-06-28 19:52:14 +10:00
parent a75e480155
commit b72891a283
2 changed files with 48 additions and 50 deletions

View File

@ -2,26 +2,9 @@ cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
project(padlab C) project(padlab C)
set(TARGET padlab) set(TARGET padlab)
option(USE_METAL "use Metal for drawing" ${APPLE}) option(BUILD_OPENGL_LEGACY "Build legacy OpenGL 1.1 compatibility profile executable" ON)
if (USE_METAL) option(BUILD_METAL "Build executable using Metal for drawing (WIP)" ${APPLE})
option(USE_OPENGL "Use OpenGL for drawing (WIP)" OFF) option(BUILD_OPENGL "Build OpenGL 3.3 core profile executable (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()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD 99)
@ -33,7 +16,7 @@ elseif (MSVC)
endif() endif()
find_package(SDL2 REQUIRED) find_package(SDL2 REQUIRED)
if (USE_OPENGL OR USE_OPENGL_LEGACY) if (BUILD_OPENGL OR BUILD_OPENGL_LEGACY)
if (NOT DEFINED OpenGL_GL_PREFERENCE) if (NOT DEFINED OpenGL_GL_PREFERENCE)
set(OpenGL_GL_PREFERENCE "GLVND") set(OpenGL_GL_PREFERENCE "GLVND")
endif() endif()

View File

@ -1,44 +1,59 @@
set(SOURCES set(SOURCES_COMMON
maths.h maths.h
draw.h draw.h
draw_common.c draw_common.c
$<$<NOT:$<OR:$<BOOL:${USE_METAL}>,$<BOOL:${USE_OPENGL}>,$<BOOL:${USE_OPENGL_LEGACY}>>>:draw.c>
$<$<BOOL:${USE_METAL}>:draw_metal.m metal_shader_types.h>
$<$<BOOL:${USE_OPENGL}>:draw_opengl_core.c>
$<$<BOOL:${USE_OPENGL_LEGACY}>:draw_opengl.c>
stick.h stick.h
stick.c stick.c
analogue.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}
$<$<PLATFORM_ID:Windows>:SDL2::SDL2main>
SDL2::SDL2
$<$<BOOL:${GNU}>:m>)
target_compile_options(${_TARGET} PRIVATE
$<$<BOOL:${GNU}>:-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(METAL Metal REQUIRED)
find_library(FOUNDATION Foundation REQUIRED) find_library(FOUNDATION Foundation REQUIRED)
find_library(QUARTZCORE QuartzCore REQUIRED) find_library(QUARTZCORE QuartzCore REQUIRED)
include(MetalHelper) include(MetalHelper)
metal_compile(OUTPUT shader.metallib SOURCES shader.metal) metal_compile(OUTPUT shader.metallib SOURCES shader.metal)
include(BinHelper)
bin2h_compile(OUTPUT metalShader.h BIN ${CMAKE_CURRENT_BINARY_DIR}/shader.metallib) bin2h_compile(OUTPUT metalShader.h BIN ${CMAKE_CURRENT_BINARY_DIR}/shader.metallib)
list(APPEND SOURCES ${CMAKE_CURRENT_BINARY_DIR}/metalShader.h) add_executable(${TARGET}_metal ${SOURCES_COMMON} ${SOURCES_METAL} ${CMAKE_CURRENT_BINARY_DIR}/metalShader.h)
elseif (USE_OPENGL) target_include_directories(${TARGET}_metal PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
include(GL3WHelper) target_link_libraries(${TARGET}_metal ${METAL} ${QUARTZCORE} ${FOUNDATION})
add_gl3w(gl3w) common_setup(${TARGET}_metal)
include(BinHelper)
bin2h_compile(OUTPUT glslShaders.h TXT vert.glsl geom.glsl frag.glsl)
list(APPEND SOURCES ${CMAKE_CURRENT_BINARY_DIR}/glslShaders.h)
endif() endif()
add_executable(${TARGET} ${SOURCES}) if (BUILD_OPENGL)
target_include_directories(${TARGET} PRIVATE include(GL3WHelper)
$<$<OR:$<BOOL:${USE_METAL}>,$<BOOL:${USE_OPENGL}>>:${CMAKE_CURRENT_BINARY_DIR}>) add_gl3w(gl3w)
target_link_libraries(${TARGET} bin2h_compile(OUTPUT glslShaders.h TXT vert.glsl geom.glsl frag.glsl)
$<$<PLATFORM_ID:Windows>:SDL2::SDL2main> add_executable(${TARGET}_glcore ${SOURCES_COMMON} ${SOURCES_OPENGL} ${CMAKE_CURRENT_BINARY_DIR}/glslShaders.h)
SDL2::SDL2 target_include_directories(${TARGET}_glcore PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
$<$<BOOL:${USE_METAL}>:${METAL} ${QUARTZCORE} ${FOUNDATION}> target_link_libraries(${TARGET}_glcore OpenGL::GL gl3w)
$<$<OR:$<BOOL:${USE_OPENGL}>,$<BOOL:${USE_OPENGL_LEGACY}>>:OpenGL::GL> target_compile_definitions(${TARGET}_glcore PRIVATE USE_OPENGL)
$<$<BOOL:${USE_OPENGL}>:gl3w> common_setup(${TARGET}_glcore)
$<$<BOOL:${GNU}>:m>) endif()
target_compile_options(${TARGET} PRIVATE
$<$<BOOL:${GNU}>:-Wall -Wextra -pedantic -Wno-unused-parameter>) if (BUILD_OPENGL_LEGACY)
target_compile_definitions(${TARGET} PRIVATE add_executable(${TARGET}_gl ${SOURCES_COMMON} ${SOURCES_OPENGL_LEGACY})
$<$<BOOL:${USE_METAL}>:USE_METAL> target_link_libraries(${TARGET}_gl OpenGL::GL)
$<$<OR:$<BOOL:${USE_OPENGL}>,$<BOOL:${USE_OPENGL_LEGACY}>>:USE_OPENGL>) target_compile_definitions(${TARGET}_gl PRIVATE USE_OPENGL)
common_setup(${TARGET}_gl)
endif()