cmake_minimum_required(VERSION 3.20) project(vkzip VERSION 1.0.0 LANGUAGES C) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) # ── Platform detection ────────────────────────────────────────────── if(WIN32) add_definitions(-D_CRT_SECURE_NO_WARNINGS -DPLATFORM_WINDOWS) else() add_definitions(-DPLATFORM_LINUX) endif() # ── Find Vulkan ───────────────────────────────────────────────────── find_package(Vulkan REQUIRED) # ── Source files ──────────────────────────────────────────────────── set(SOURCES src/main.c src/vkz_format.c src/gpu_context.c src/gpu_compress.c src/gpu_decompress.c src/cpu_fallback.c ) # ── Executable ────────────────────────────────────────────────────── add_executable(vkzip ${SOURCES}) target_include_directories(vkzip PRIVATE ${CMAKE_SOURCE_DIR}/src ${Vulkan_INCLUDE_DIRS} ) target_link_libraries(vkzip PRIVATE ${Vulkan_LIBRARIES} ) if(NOT WIN32) target_link_libraries(vkzip PRIVATE m pthread) endif() # ── Compile shaders (GLSL → SPIR-V) ──────────────────────────────── find_program(GLSLC glslc HINTS "$ENV{VULKAN_SDK}/bin") if(NOT GLSLC) find_program(GLSLC glslangValidator HINTS "$ENV{VULKAN_SDK}/bin") endif() if(GLSLC) set(SHADER_SRC_DIR "${CMAKE_SOURCE_DIR}/shaders") set(SHADER_BIN_DIR "${CMAKE_BINARY_DIR}/shaders") file(MAKE_DIRECTORY ${SHADER_BIN_DIR}) set(SHADER_SOURCES ${SHADER_SRC_DIR}/compress.comp ${SHADER_SRC_DIR}/decompress.comp ) foreach(SHADER ${SHADER_SOURCES}) get_filename_component(SHADER_NAME ${SHADER} NAME) set(SPIRV_OUTPUT "${SHADER_BIN_DIR}/${SHADER_NAME}.spv") add_custom_command( OUTPUT ${SPIRV_OUTPUT} COMMAND ${GLSLC} -o ${SPIRV_OUTPUT} ${SHADER} DEPENDS ${SHADER} COMMENT "Compiling shader ${SHADER_NAME} -> SPIR-V" ) list(APPEND SPIRV_OUTPUTS ${SPIRV_OUTPUT}) endforeach() add_custom_target(shaders ALL DEPENDS ${SPIRV_OUTPUTS}) add_dependencies(vkzip shaders) # Embed shader directory path at compile time target_compile_definitions(vkzip PRIVATE SHADER_DIR="${SHADER_BIN_DIR}" ) else() message(WARNING "glslc/glslangValidator not found! Shaders will not be compiled.") message(WARNING "Install Vulkan SDK: https://vulkan.lunarg.com/sdk/home") endif() # ── Install ───────────────────────────────────────────────────────── install(TARGETS vkzip RUNTIME DESTINATION bin) if(GLSLC) install(DIRECTORY ${SHADER_BIN_DIR}/ DESTINATION share/vkzip/shaders) endif() # ── Compiler warnings ────────────────────────────────────────────── if(MSVC) target_compile_options(vkzip PRIVATE /W4) else() target_compile_options(vkzip PRIVATE -Wall -Wextra -O2) endif() message(STATUS "") message(STATUS "╔══════════════════════════════════════════╗") message(STATUS "║ VKZip - GPU File Compressor ║") message(STATUS "║ Vulkan Compute Shader Acceleration ║") message(STATUS "╠══════════════════════════════════════════╣") message(STATUS "║ Platform: ${CMAKE_SYSTEM_NAME}") message(STATUS "║ Compiler: ${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}") message(STATUS "║ Vulkan: ${Vulkan_LIBRARY}") message(STATUS "║ Shaders: ${GLSLC}") message(STATUS "╚══════════════════════════════════════════╝") message(STATUS "")