Add defs generator.
This commit is contained in:
69
cmake/modules/envtoh.cmake
Normal file
69
cmake/modules/envtoh.cmake
Normal file
@@ -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}")
|
||||
@@ -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)
|
||||
|
||||
5
src/dawndefs.env
Normal file
5
src/dawndefs.env
Normal file
@@ -0,0 +1,5 @@
|
||||
# Copyright (c) 2025 Dominic Masters
|
||||
#
|
||||
# This software is released under the MIT License.
|
||||
# https://opensource.org/licenses/MIT
|
||||
|
||||
@@ -12,3 +12,20 @@ function(add_asset ASSET_TYPE ASSET_PATH)
|
||||
)
|
||||
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()
|
||||
Reference in New Issue
Block a user