diff --git a/cmake/modules/envtoh.cmake b/cmake/modules/envtoh.cmake deleted file mode 100644 index d6b0d86..0000000 --- a/cmake/modules/envtoh.cmake +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (c) 2026 Dominic Masters -# -# This software is released under the MIT License. -# https://opensource.org/licenses/MIT - -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) - # Skip comments and empty lines (allow whitespace before # or ;) - if(line STREQUAL "" OR line MATCHES "^[ \t]*[#;]") - continue() - endif() - - # Expect KEY=VALUE (allow spaces around '=') - if(NOT line MATCHES "^[A-Za-z_][A-Za-z0-9_]*[ \t]*=[ \t]*") - 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 (allow spaces around '=') - string(REGEX REPLACE "^[A-Za-z_][A-Za-z0-9_]*[ \t]*=[ \t]*" "" RAW_VALUE "${line}") - - # 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/tools/CMakeLists.txt b/tools/CMakeLists.txt index 7986058..828a4ed 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -16,18 +16,12 @@ function(add_asset ASSET_TYPE ASSET_PATH) 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}" + set(DUSK_DEFS_TARGET_NAME "DUSK_DEFS_${OUTPUT_NAME_RELATIVE}") + dusk_run_python( + ${DUSK_DEFS_TARGET_NAME} + tools.envtoh + --env ${INPUT_PATH} + --output ${DUSK_BUILT_ASSETS_DIR}/${OUTPUT_NAME_RELATIVE} ) - add_custom_target(${OUTPUT_NAME_RELATIVE}_header DEPENDS ${OUTPUT_FULL_PATH}) - add_dependencies(${DUSK_LIBRARY_TARGET_NAME} ${OUTPUT_NAME_RELATIVE}_header) + add_dependencies(${DUSK_LIBRARY_TARGET_NAME} ${DUSK_DEFS_TARGET_NAME}) endfunction() \ No newline at end of file diff --git a/tools/envtoh/__main__.py b/tools/envtoh/__main__.py new file mode 100644 index 0000000..96c399d --- /dev/null +++ b/tools/envtoh/__main__.py @@ -0,0 +1,46 @@ +import argparse +import os +from dotenv import load_dotenv, dotenv_values + +parser = argparse.ArgumentParser(description="Convert .env to .h defines") +parser.add_argument("--env", required=True, help="Path to .env file") +parser.add_argument("--output", required=True, help="Path to output .h file") +args = parser.parse_args() + +# Load .env file +load_dotenv(dotenv_path=args.env) +fileDefs = dotenv_values(dotenv_path=args.env) + + +outHeader = "" +outHeader += "#include \"dusk.h\"\n\n" +for key, value in fileDefs.items(): + # Determine type and print out appropriate C type define. + + # Float + try: + asFloat = float(value) + outHeader += f"#define {key} {asFloat}f\n" + continue + except: + pass + + # Integer + try: + asInt = int(value) + outHeader += f"#define {key} {asInt}\n" + except: + pass + + # Boolean + if value.lower() in ['true', 'false']: + asBool = '1' if value.lower() == 'true' else '0' + outHeader += f"#define {key} {asBool}\n" + continue + + # String + outHeader += f'#define {key} "{value}"\n' + +# Write to output file +with open(args.output, 'w') as outFile: + outFile.write(outHeader) \ No newline at end of file