From b842e5821a453d5bfdb7f38a79ab15989597b37b Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Wed, 12 Nov 2025 19:25:10 -0600 Subject: [PATCH] Add defs generator. --- cmake/modules/envtoh.cmake | 69 ++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 4 +++ src/dawndefs.env | 5 +++ tools/CMakeLists.txt | 17 ++++++++++ 4 files changed, 95 insertions(+) create mode 100644 cmake/modules/envtoh.cmake create mode 100644 src/dawndefs.env diff --git a/cmake/modules/envtoh.cmake b/cmake/modules/envtoh.cmake new file mode 100644 index 0000000..4c003e1 --- /dev/null +++ b/cmake/modules/envtoh.cmake @@ -0,0 +1,69 @@ +if(NOT DEFINED ENV_FILE) + message(FATAL_ERROR "ENV_FILE is not set") +endif() + +if(NOT DEFINED OUT_HEADER) + message(FATAL_ERROR "OUT_HEADER is not set") +endif() + +if(NOT EXISTS "${ENV_FILE}") + message(FATAL_ERROR ".env file not found: ${ENV_FILE}") +endif() + +file(STRINGS "${ENV_FILE}" ENV_LINES) + +set(HEADER_CONTENT "#pragma once\n#include \"dusk.h\"\n\n") + +foreach(line IN LISTS ENV_LINES) + # Trim whitespace + string(REGEX REPLACE "^[ \t]*" "" line "${line}") + string(REGEX REPLACE "[ \t]*$" "" line "${line}") + + # Skip comments and empty lines (allow whitespace before # or ;) + if(line STREQUAL "" OR line MATCHES "^[ \t]*[#;]") + continue() + endif() + + # Expect KEY=VALUE + if(NOT line MATCHES "^[A-Za-z_][A-Za-z0-9_]*=") + message(WARNING "Skipping invalid line in ${ENV_FILE}: '${line}'") + continue() + endif() + + # Extract key + string(REGEX MATCH "^[A-Za-z_][A-Za-z0-9_]*" KEY "${line}") + string(LENGTH "${KEY}" key_len) + + # Extract value + string(SUBSTRING "${line}" ${key_len} -1 rest) + string(REGEX REPLACE "^[ \t]*=[ \t]*" "" RAW_VALUE "${rest}") + + # Lowercase copy for boolean detection + string(TOLOWER "${RAW_VALUE}" VALUE_LC) + set(VALUE "${RAW_VALUE}") + + # Determine type and format accordingly + if(VALUE_LC STREQUAL "true") + set(HEADER_CONTENT "${HEADER_CONTENT}#define ${KEY} true\n") + + elseif(VALUE_LC STREQUAL "false") + set(HEADER_CONTENT "${HEADER_CONTENT}#define ${KEY} false\n") + + elseif(VALUE MATCHES "^[+-]?[0-9]+$") + # Integer + set(HEADER_CONTENT "${HEADER_CONTENT}#define ${KEY} ${VALUE}\n") + + elseif(VALUE MATCHES "^[+-]?[0-9]*\\.[0-9]+$") + # Float → append "f" + set(HEADER_CONTENT "${HEADER_CONTENT}#define ${KEY} ${VALUE}f\n") + + else() + # String → escape for C literal + string(REPLACE "\\" "\\\\" VALUE_ESC "${VALUE}") + string(REPLACE "\"" "\\\"" VALUE_ESC "${VALUE_ESC}") + set(HEADER_CONTENT "${HEADER_CONTENT}#define ${KEY} \"${VALUE_ESC}\"\n") + endif() +endforeach() + +file(WRITE "${OUT_HEADER}" "${HEADER_CONTENT}") +message(STATUS "Generated header: ${OUT_HEADER}") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 43bd8be..fcec72a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,7 @@ find_package(cglm REQUIRED) find_package(libzip REQUIRED) + # Libs target_link_libraries(${DUSK_TARGET_NAME} PUBLIC @@ -27,6 +28,9 @@ target_sources(${DUSK_TARGET_NAME} main.c ) +# Defs +add_defs(dawndefs.env dawndefs.h) + # Subdirs add_subdirectory(assert) add_subdirectory(asset) diff --git a/src/dawndefs.env b/src/dawndefs.env new file mode 100644 index 0000000..4864180 --- /dev/null +++ b/src/dawndefs.env @@ -0,0 +1,5 @@ +# Copyright (c) 2025 Dominic Masters +# +# This software is released under the MIT License. +# https://opensource.org/licenses/MIT + diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 0ef1273..a9aacea 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -11,4 +11,21 @@ function(add_asset ASSET_TYPE ASSET_PATH) "${ASSET_TYPE}#${FULL_ASSET_PATH}#${ASSETS_ARGS}" ) set(DUSK_ASSETS ${DUSK_ASSETS} CACHE INTERNAL ${DUSK_CACHE_TARGET}) +endfunction() + +function(add_defs INPUT_PATH OUTPUT_NAME_RELATIVE) + set(INPUT_FULL_PATH "${CMAKE_CURRENT_LIST_DIR}/${INPUT_PATH}") + set(OUTPUT_FULL_PATH "${DUSK_GENERATED_HEADERS_DIR}/${OUTPUT_NAME_RELATIVE}") + + add_custom_command( + OUTPUT ${OUTPUT_FULL_PATH} + COMMAND ${CMAKE_COMMAND} + -DENV_FILE=${INPUT_FULL_PATH} + -DOUT_HEADER=${OUTPUT_FULL_PATH} + -P ${CMAKE_SOURCE_DIR}/cmake/modules/envtoh.cmake + DEPENDS ${INPUT_FULL_PATH} ${CMAKE_SOURCE_DIR}/cmake/modules/envtoh.cmake + COMMENT "Generating ${OUTPUT_NAME_RELATIVE}" + ) + add_custom_target(${OUTPUT_NAME_RELATIVE}_header DEPENDS ${OUTPUT_FULL_PATH}) + add_dependencies(${DUSK_TARGET_NAME} ${OUTPUT_NAME_RELATIVE}_header) endfunction() \ No newline at end of file