pretty-automata/CMakeLists.txt

137 lines
4.1 KiB
CMake

cmake_minimum_required(VERSION 3.25)
project(shader-automaton)
set(CMAKE_CXX_STANDARD 23)
set(VERBOSE yes)
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(glfw3 3.3 REQUIRED)
include(FetchContent)
include(EmbedResources.cmake)
FetchContent_Declare(
perlin
GIT_REPOSITORY https://github.com/Reputeless/PerlinNoise.git
GIT_TAG bdf39fe92b2a585cdef485bcec2bca8ab5614095
)
FetchContent_Declare(
imgui
GIT_REPOSITORY https://github.com/ocornut/imgui.git
GIT_TAG 70cca1eac07aa3809bdd3717253c3754a5b7cfcc
)
FetchContent_Declare(
gtest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG bc860af08783b8113005ca7697da5f5d49a8056f
)
FetchContent_Declare(
dejavufonts
URL https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-fonts-ttf-2.37.tar.bz2
URL_HASH SHA1=7fa15e7b9676fc3915338c41e76ad454c344fff5
)
FetchContent_MakeAvailable(perlin)
FetchContent_MakeAvailable(imgui)
add_executable(shader-automaton
src/main.cpp
src/options.cpp
src/colormaps/viridis.cpp
src/rule_presets.cpp
src/argparser.h
src/rule_presets.h
src/options.h
src/shader-helper.cpp
src/shader-helper.h
src/color.cpp
src/color.h
src/colormaps/colormaps.cpp
src/colormaps/dualcolor.cpp
src/colormaps/viridis.cpp
src/colormaps/rainbow.cpp
src/program.cpp
src/program.h
)
target_compile_definitions(shader-automaton PRIVATE PROGRAM_NAME="${CMAKE_PROJECT_NAME}" PROGRAM_VERSION="${CMAKE_PROJECT_VERSION}")
function(preprocess_shader name)
add_custom_command(
OUTPUT "preprocessed-shaders/${name}"
COMMAND ./preprocess-shader.sh "${name}"
DEPENDS "shaders/${name}"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
PRE_BUILD
VERBATIM
)
endfunction()
preprocess_shader("automaton.comp")
preprocess_shader("automaton.vert")
preprocess_shader("automaton.frag")
# TODO: this whole shader preprocessing and embedding is just broken
# it happens half at configure time rather than build time so the preprocessed files are outdated
# TODO: maybe rewrite this tool to put multiple namespaces into one target
# and to maybe define the contents separately from the target, if possible
add_embedded_binary_resources(
shader-automaton-shaders
OUT_DIR embedded-resources
HEADER shaders.h
NAMESPACE resources::shaders
RESOURCE_NAMES automaton_comp automaton_vert automaton_frag
RESOURCES
"${PROJECT_SOURCE_DIR}/preprocessed-shaders/automaton.comp"
"${PROJECT_SOURCE_DIR}/preprocessed-shaders/automaton.vert"
"${PROJECT_SOURCE_DIR}/preprocessed-shaders/automaton.frag"
)
FetchContent_MakeAvailable(dejavufonts)
add_embedded_binary_resources(
shader-automaton-fonts
OUT_DIR embedded-resources
HEADER fonts.h
NAMESPACE resources::fonts
RESOURCE_NAMES DejaVuSansMono
RESOURCES
"${dejavufonts_SOURCE_DIR}/ttf/DejaVuSansMono.ttf"
)
target_link_libraries(shader-automaton OpenGL::GL GLEW::GLEW glfw shader-automaton-shaders shader-automaton-fonts)
file(COPY_FILE "${perlin_SOURCE_DIR}/PerlinNoise.hpp" "${perlin_BINARY_DIR}/PerlinNoise.hpp")
target_include_directories(shader-automaton PRIVATE ${perlin_BINARY_DIR})
target_include_directories(shader-automaton PRIVATE "${imgui_SOURCE_DIR}/backends" "${imgui_SOURCE_DIR}")
target_sources(shader-automaton PRIVATE
${imgui_SOURCE_DIR}/imgui.cpp
${imgui_SOURCE_DIR}/imgui_demo.cpp
${imgui_SOURCE_DIR}/imgui_draw.cpp
${imgui_SOURCE_DIR}/imgui_tables.cpp
${imgui_SOURCE_DIR}/imgui_widgets.cpp
${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp
${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp
)
enable_testing()
FetchContent_MakeAvailable(gtest)
include(GoogleTest)
add_executable(ColorTest tests/color.cpp src/color.cpp)
target_link_libraries(ColorTest GTest::gtest_main)
target_include_directories(ColorTest PRIVATE src)
gtest_discover_tests(ColorTest)