# Within directory build/Release or build/Debug: Select debug/release variant with % cmake -DCMAKE_BUILD_TYPE=Debug/Release ../.. # Build and run: make run-day-XX or cmake --build . --target run-day-nn cmake_minimum_required(VERSION 3.10) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) set(CMAKE_C_STANDARD 99) add_definitions(-DCMAKE_EXPORT_COMPILE_COMMANDS=ON) if (NOT MSVC) set(WARNING_FLAGS_C -Wall -Wextra -Wpedantic -Wvla -Wshadow -Wundef -Wmisleading-indentation -Wnull-dereference -Wswitch-default -Wstrict-overflow=5 -Wconversion -Wno-sign-conversion -Wsign-promo -Wcast-align -Wcast-qual -Wdouble-promotion -Wformat=2 -Winit-self -Wdisabled-optimization -Wno-unused-function) set(WARNING_FLAGS_CXX -Wall -Wextra -Wpedantic -Wvla -Wshadow -Wundef -Wmisleading-indentation -Wnull-dereference -Wswitch-default -Wstrict-overflow=5 -Wconversion -Wno-sign-conversion -Wsign-promo -Wcast-align -Wcast-qual -Wdouble-promotion -Wformat=2 -Winit-self -Wdisabled-optimization -Woverloaded-virtual -Wredundant-decls -Wctor-dtor-privacy -Wno-unused-function) set(DBG_FLAGS -fsanitize=undefined,address -g3 -glldb -Og) else () set(WARNING_FLAGS_C /W4) set(WARNING_FLAGS_CXX /W4) set(DBG_FLAGS /fsanitize=address) endif () project(aoc-2025) set(CMAKE_DEBUG_POSTFIX _dbg) if (NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) endif() # set(CMAKE_VERBOSE_MAKEFILE OFF) include(CheckIPOSupported) check_ipo_supported(RESULT ipo_available) if (ipo_available AND (NOT CMAKE_BUILD_TYPE MATCHES Debug) AND (NOT CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)) message("-- IPO enabled") endif() set(TARGETS day-01 day-02) # Add the other days as you please. list(LENGTH TARGETS NUM_TARGETS) set(LIBGUF_IMPLS ${CMAKE_CURRENT_SOURCE_DIR}/libguf_impls/guf_alloc_libc_impl.c ${CMAKE_CURRENT_SOURCE_DIR}/libguf_impls/guf_str_impl.c ${CMAKE_CURRENT_SOURCE_DIR}/libguf_impls/guf_init_impl.c ) foreach(current_target IN LISTS TARGETS) add_executable(${current_target} ${current_target}/${current_target}.c ${LIBGUF_IMPLS}) set_target_properties(${current_target} PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) target_include_directories(${current_target} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/" "${CMAKE_CURRENT_SOURCE_DIR}/libguf/src/") target_compile_options(${current_target} PRIVATE ${WARNING_FLAGS_C} $<$:${DBG_FLAGS}>) target_link_options(${current_target} PRIVATE ${WARNING_FLAGS_C} $<$:${DBG_FLAGS}>) target_compile_definitions(${current_target} PRIVATE AOC_DAY_NAME="${current_target}") if(ipo_available AND (NOT CMAKE_BUILD_TYPE MATCHES Debug) AND (NOT CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)) set_property(TARGET ${current_target} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) endif() add_custom_target("run-${current_target}" DEPENDS ${current_target} COMMAND ${current_target} ${CMAKE_CURRENT_SOURCE_DIR}/input/${current_target}.txt WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ) add_custom_target("run-${current_target}-example" DEPENDS ${current_target} COMMAND ${current_target} ${CMAKE_CURRENT_SOURCE_DIR}/input/${current_target}-example.txt WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ) endforeach(current_target) # TODO... add_custom_target("run-all" DEPENDS ${TARGETS} COMMAND day-01 ${CMAKE_CURRENT_SOURCE_DIR}/input/day-01.txt COMMAND day-01 ${CMAKE_CURRENT_SOURCE_DIR}/input/day-02.txt WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ) add_custom_target("run-all-examples" DEPENDS ${TARGETS} COMMAND day-01 ${CMAKE_CURRENT_SOURCE_DIR}/input/day-01-example.txt COMMAND day-02 ${CMAKE_CURRENT_SOURCE_DIR}/input/day-02-example.txt WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} )