Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 34 additions & 11 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -76,31 +76,54 @@ endif ()
#####################################
# Encode CAPIO-CL JSON Schemas
#####################################
find_program(XXD_EXECUTABLE xxd)
find_program(PYTHON_EXECUTABLE python3)

set(CAPIOCL_JSON_SCHEMAS_DIRECTORY "${CMAKE_BINARY_DIR}/schemas")
set(OUTPUT_HEADER "${CAPIOCL_JSON_SCHEMAS_DIRECTORY}/capio_cl_json_schemas.hpp")
file(GLOB SCHEMA_FILES "${CMAKE_SOURCE_DIR}/schema/*.json")
file(GLOB SCHEMA_FILES "${CMAKE_CURRENT_SOURCE_DIR}/schema/*.json")

set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/schema*.json")
message(STATUS "Generating output header at ${OUTPUT_HEADER}")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/schema/*.json")

file(MAKE_DIRECTORY ${CAPIOCL_JSON_SCHEMAS_DIRECTORY})
file(WRITE ${OUTPUT_HEADER} "// Bundled CAPIO-CL encoded JSON schemas\n")
file(APPEND ${OUTPUT_HEADER} "#pragma once\n\n")

foreach (SCHEMA_FILE ${SCHEMA_FILES})
get_filename_component(SCHEMA_NAME ${SCHEMA_FILE} NAME_WE)
get_filename_component(SCHEMA_BASENAME ${SCHEMA_FILE} NAME)
message(STATUS "Bundling CAPIO-CL schema: ${SCHEMA_BASENAME}")
file(APPEND ${OUTPUT_HEADER} "// CAPIO-CL version: ${SCHEMA_NAME}\n")

execute_process(
COMMAND xxd -i ${SCHEMA_BASENAME}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/schema
OUTPUT_VARIABLE HEXDATA
RESULT_VARIABLE RES
)
if (NOT RES EQUAL 0)
message(FATAL_ERROR "xxd failed for ${SCHEMA_FILE}")
if (XXD_EXECUTABLE)
message(STATUS "Using system xxd: ${XXD_EXECUTABLE}")
execute_process(
COMMAND ${XXD_EXECUTABLE} -i ${SCHEMA_BASENAME}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/schema
OUTPUT_VARIABLE HEXDATA
RESULT_VARIABLE RES
)
if (NOT RES EQUAL 0)
message(FATAL_ERROR "xxd failed for ${SCHEMA_FILE}")
endif ()
else ()
if (NOT PYTHON_EXECUTABLE)
message(FATAL_ERROR "Unable to locate python3 package. either xxd or python3 packages are required to build CAPIO-CL")
endif ()
message(STATUS "xxd not found — using Python fallback: ${XXD_I_SCRIPT}")
execute_process(
COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/schema/bundler.py ${SCHEMA_BASENAME}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/schema
OUTPUT_VARIABLE HEXDATA
RESULT_VARIABLE RES
)
if (NOT RES EQUAL 0)
message(FATAL_ERROR "Failed bundling for ${SCHEMA_FILE}")
endif ()
endif ()


file(APPEND ${OUTPUT_HEADER} "// CAPIO-CL version: ${SCHEMA_NAME}\n")
file(APPEND ${OUTPUT_HEADER} "${HEXDATA}\n\n")
endforeach ()

Expand Down
46 changes: 46 additions & 0 deletions schema/bundler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/usr/bin/env python3

'''
Convert JSON schema files from UTF-8 encoding into char[] encoded C source files
It is equivalent to run xdd -i <SCHEMA>.json
This is useful to not require xxd as a dependency!
'''

import sys, os, re

BYTES_PER_LINE = 12

def derive_name(path_or_stdin: str) -> str:
base = "stdin" if path_or_stdin in ("-", "") else os.path.basename(path_or_stdin)
name = re.sub(r'[^0-9A-Za-z_]', '_', base)
if not name:
name = "data"
if name[0].isdigit():
name = "_" + name
return name

def read_bytes(path: str) -> bytes:
if path in ("-", ""):
return sys.stdin.buffer.read()
with open(path, "rb") as f:
return f.read()

def emit_c_array(name: str, data: bytes) -> None:
print(f"unsigned char {name}[] = {{")
if data:
for i in range(0, len(data), BYTES_PER_LINE):
chunk = data[i:i+BYTES_PER_LINE]
line = ", ".join(f"0x{b:02x}" for b in chunk)
print(f" {line},")
print("};")
print(f"unsigned int {name}_len = {len(data)};")

def main():
# Usage: python xxd_i.py [FILE|-]
path = sys.argv[1] if len(sys.argv) > 1 else "-"
name = derive_name(path)
data = read_bytes(path)
emit_c_array(name, data)

if __name__ == "__main__":
main()
Loading