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}")