project(Prism)

file(GLOB_RECURSE SRC_SOURCE src/**.cpp)

# configure
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

add_subdirectory(vendor/spdlog EXCLUDE_FROM_ALL)
add_subdirectory(vendor/glfw EXCLUDE_FROM_ALL)
add_subdirectory(vendor/glad EXCLUDE_FROM_ALL)


# imgui
set(IMGUI_DIR vendor/ImGui)
include_directories(${IMGUI_DIR} ${IMGUI_DIR}/backends)
file(GLOB IMGUI_SOURCE
        ${IMGUI_DIR}/*.cpp
        ${IMGUI_DIR}/backends/imgui_impl_opengl3.cpp
        ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp)

# add imgui source
list(APPEND SRC_SOURCE ${IMGUI_SOURCE})

# link libraries
set(LINK_LIBRARIES
        spdlog
        glfw
        glad
)

# link library opengl
if(WIN32)
    list(APPEND LINK_LIBRARIES opengl32)
elseif(UNIX AND NOT APPLE)
    find_package(X11 REQUIRED)
    list(APPEND LINK_LIBRARIES GL ${X11_LIBRARIES})
endif()


set(TARGET_INCLUDE_DIR
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
        ${IMGUI_DIR}
)

# static library
set(STATIC_LIBRARY ${PROJECT_NAME}-static)

add_library(${STATIC_LIBRARY} STATIC ${SRC_SOURCE})

target_compile_definitions(${STATIC_LIBRARY} PRIVATE
        PRISM_STATIC
        $<$<CONFIG:Debug>:PM_ENABLE_ASSERTS>
)

target_include_directories(${STATIC_LIBRARY} PUBLIC
        ${TARGET_INCLUDE_DIR}
)
target_link_libraries(${STATIC_LIBRARY} PRIVATE
        ${LINK_LIBRARIES}
)
target_precompile_headers(${STATIC_LIBRARY} PRIVATE
        src/pmpch.h
)

set_target_properties(${STATIC_LIBRARY} PROPERTIES
        OUTPUT_NAME ${PROJECT_NAME}
        ARCHIVE_OUTPUT_NAME ${PROJECT_NAME}
)

# shared library
set(SHARED_LIBRARY ${PROJECT_NAME}-shared)

add_library(${SHARED_LIBRARY} SHARED ${SRC_SOURCE})

target_compile_definitions(${SHARED_LIBRARY} PRIVATE
        PRISM_SHARED BUILD_PRISM_DLL
        $<$<CONFIG:Debug>:PM_ENABLE_ASSERTS>
)

target_include_directories(${SHARED_LIBRARY} PUBLIC
        ${TARGET_INCLUDE_DIR}
)
target_link_libraries(${SHARED_LIBRARY} PRIVATE
        ${LINK_LIBRARIES}
)
target_precompile_headers(${SHARED_LIBRARY} PRIVATE
        src/pmpch.h
)

set_target_properties(${SHARED_LIBRARY} PROPERTIES
        OUTPUT_NAME ${PROJECT_NAME}d
        LIBRARY_OUTPUT_NAME ${PROJECT_NAME}d
)


# alias
add_library(Prism::static ALIAS Prism-static)
add_library(Prism::shared ALIAS Prism-shared)
add_library(Prism ALIAS Prism-shared)
