cmake_minimum_required(VERSION 3.10) project(carga-electrica C) set(CMAKE_C_STANDARD 99) # set(CMAKE_C_EXTENSIONS OFF) # Change later after fixing errors set(CMAKE_C_STANDARD_REQUIRED True) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(BIN proyecto) function(download_if_missing url output_path) if(NOT EXISTS ${output_path}) message(STATUS "Downloading ${url} -> ${output_path}") file(DOWNLOAD ${url} ${output_path} SHOW_PROGRESS STATUS status LOG log ) list(GET status 0 status_code) if(NOT status_code EQUAL 0) message(FATAL_ERROR "Failed to download ${url}:\n${log}") endif() endif() endfunction() # Download external libraries file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/external) download_if_missing( "https://raw.githubusercontent.com/nothings/stb/refs/heads/master/stb_image.h" "${CMAKE_CURRENT_SOURCE_DIR}/external/stb_image.h" ) # Download external scripts file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts) download_if_missing( "https://raw.githubusercontent.com/Brady-Brandt/glstri/main/main.c" "${CMAKE_CURRENT_SOURCE_DIR}/scripts/glstri.c" ) add_executable(glstri scripts/glstri.c) # Find packages # OpenGL set(OpenGL_GL_PREFERENCE GLVND) # "GLVND" Or "LEGACY" find_package(OpenGL REQUIRED) if (OPENGL_opengl_LIBRARY) set(OPENGL_LIB ${OPENGL_opengl_LIBRARY}) elseif (OPENGL_gl_LIBRARY) message(STATUS "Using legacy OpenGL") set(OPENGL_LIB ${OPENGL_gl_LIBRARY}) else() message(FATAL_ERROR "No suitable OpenGL library found.") endif() # GLFW find_package(glfw3 REQUIRED) # GLEW find_package(GLEW REQUIRED) # Update submodules find_package(Git QUIET) if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git") option(GIT_SUBMODULE "Check submodules during build" ON) if(GIT_SUBMODULE) execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} RESULT_VARIABLE GIT_SUBMOD_RESULT) if(NOT GIT_SUBMOD_RESULT EQUAL 0) message(FATAL_ERROR "git submodule update --init --recursive failed with ${GIT_SUBMOD_RESULT}. Please check out submodules.") endif() endif() endif() # Submodule: cglm add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/external/cglm EXCLUDE_FROM_ALL) # Submodule: skr add_library(skr INTERFACE) target_include_directories(skr INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/external/skr ) # Submodule: slog # add_library(slog INTERFACE) # target_include_directories(slog INTERFACE # ${CMAKE_CURRENT_SOURCE_DIR}/external/slog # ) # Submodule: ini # add_library(ini INTERFACE) # target_include_directories(ini INTERFACE # ${CMAKE_CURRENT_SOURCE_DIR}/external/ini/src # ) # Transpile GLSL into C set(SHADER_DIR ${CMAKE_SOURCE_DIR}/main/shaders) set(GLSL_EXTS vert frag comp geom tesc tese) foreach(ext ${GLSL_EXTS}) file(GLOB SHADER_FILES ${SHADER_DIR}/*.${ext}) foreach(shader ${SHADER_FILES}) get_filename_component(shader_name ${shader} NAME) get_filename_component(base_name ${shader} NAME_WE) set(output_file ${SHADER_DIR}/${shader_name}.c) add_custom_command( OUTPUT ${output_file} COMMAND $ -s -v ${base_name}_${ext} ${shader} ${output_file} DEPENDS ${shader} glstri COMMENT "transpiling ${shader_name} -> ${output_file}" VERBATIM ) list(APPEND TRANSPILED_SHADERS ${output_file}) endforeach() endforeach() add_custom_target(transpile_shaders ALL DEPENDS ${TRANSPILED_SHADERS}) # Main program add_executable(${BIN} main/main.c # external/ini/src/ini.c ) target_include_directories(${BIN} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} external ) target_link_libraries(${BIN} PRIVATE m ${OPENGL_LIB} glfw GLEW::GLEW cglm_headers skr # slog # ini ) if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(${BIN} PRIVATE $<$:-g3 -O0 -Wall -Wextra -DDEBUG -fno-omit-frame-pointer -fsanitize=address,undefined> $<$:-O3 -g0 -DNDEBUG -ffunction-sections -fdata-sections -fmacro-prefix-map=${CMAKE_SOURCE_DIR}/=> ) target_link_options(${BIN} PRIVATE $<$:-fno-omit-frame-pointer -fsanitize=address,undefined> $<$:-Wl,--gc-sections> ) # Enable LTO in Release if supported option(ENABLE_LTO "Enable LTO in Release" ON) if(ENABLE_LTO) include(CheckIPOSupported) check_ipo_supported(RESULT ipo_ok OUTPUT ipo_err) if(ipo_ok) set_property(TARGET ${BIN} PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) else() target_compile_options(${BIN} PRIVATE $<$:-flto>) target_link_options(${BIN} PRIVATE $<$:-flto>) endif() endif() # Optionally strip symbols in Release option(STRIP_RELEASE "Strip symbols from Release binaries" ON) if(STRIP_RELEASE) if(CMAKE_STRIP) add_custom_command(TARGET ${BIN} POST_BUILD COMMAND ${CMAKE_STRIP} $ ) else() target_link_options(${BIN} PRIVATE $<$:-s>) endif() endif() endif() add_dependencies(${BIN} transpile_shaders)