From 393128c1973937573b189ce2bda784afcbd00158 Mon Sep 17 00:00:00 2001 From: Diogo Diniz Date: Wed, 4 Mar 2026 19:49:08 +0000 Subject: [PATCH] feat: Added pyincp to build system --- CMakePresets.json | 5 ++- app/CMakeLists.txt | 2 ++ app/cmake/incp.cmake | 82 ++++++++++++++++++++++++++++++++++++++++++++ app/incp/schema.yml | 10 ++++++ 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 app/cmake/incp.cmake create mode 100644 app/incp/schema.yml diff --git a/CMakePresets.json b/CMakePresets.json index bef647a..b38599b 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -11,7 +11,10 @@ "displayName": "Default Config", "generator": "Ninja", "binaryDir": "${sourceDir}/build", - "toolchainFile": "cmake/toolchain.cmake" + "toolchainFile": "cmake/toolchain.cmake", + "cacheVariables": { + "Python3_EXECUTABLE": "/home/didas/src/SAT/incp-test/.venv/bin/python" + } } ], "buildPresets": [ diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 504b6d0..c69795c 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -80,6 +80,8 @@ include(FetchContent) #FetchContent_Declare(...) #FetchContent_MakeAvailable(...) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/incp.cmake) + # == Library linking == #target_link_libraries(${EXECUTABLE} ...) diff --git a/app/cmake/incp.cmake b/app/cmake/incp.cmake new file mode 100644 index 0000000..95397e0 --- /dev/null +++ b/app/cmake/incp.cmake @@ -0,0 +1,82 @@ +FetchContent_Declare( + pyincp + GIT_REPOSITORY git@repo.dsi.tecnico.ulisboa.pt:nanosatlab/istsat-2/incp.git + GIT_TAG temp/CMake-integration +) + +FetchContent_MakeAvailable(pyincp) + +find_program(ASN1SCC NAMES asn1scc) + +set(INCP_SCHEMA ${CMAKE_CURRENT_LIST_DIR}/../incp/schema.yml) # Can also be a directory or list of files +set(INCP_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) + +set(ASN1_OUTPUT ${INCP_OUTPUT_DIR}/gen.asn1) + +set(ASN1_OUTPUT ${INCP_OUTPUT_DIR}/gen.asn1) +set(ASN1SCC_SOURCES + ${INCP_OUTPUT_DIR}/gen.c + ${INCP_OUTPUT_DIR}/asn1crt.c + ${INCP_OUTPUT_DIR}/asn1crt_encoding.c + ${INCP_OUTPUT_DIR}/asn1crt_encoding_uper.c +) +set(ASN1SCC_HEADERS + ${INCP_OUTPUT_DIR}/gen.h + ${INCP_OUTPUT_DIR}/asn1crt.h + ${INCP_OUTPUT_DIR}/asn1crt_encoding.h + ${INCP_OUTPUT_DIR}/asn1crt_encoding_uper.h +) +set(WRAPPER_SOURCE ${INCP_OUTPUT_DIR}/gen_wrapper.c) +set(WRAPPER_HEADER ${INCP_OUTPUT_DIR}/gen_wrapper.h) +set(INCP_SOURCES + ${ASN1SCC_SOURCES} + ${WRAPPER_SOURCE} +) + +# Generates the ASN1 code +add_custom_command( + OUTPUT ${ASN1_OUTPUT} + COMMAND + ${CMAKE_COMMAND} -E env + PYTHONPATH=${pyincp_SOURCE_DIR} + ${INCP_GEN_COMMAND} --asn1 ${INCP_OUTPUT_DIR} ${INCP_SCHEMA} + MAIN_DEPENDENCY ${INCP_SCHEMA} + COMMENT "INCP: Generating ASN1 definition" + VERBATIM +) + +# Compiles the ASN1 code to C +add_custom_command( + OUTPUT + ${ASN1SCC_SOURCES} + ${ASN1SCC_HEADERS} + COMMAND + ${ASN1SCC} -c -uPER --slim --word-size 4 --handle-empty-sequences -if BitStream_AppendByteArray -if BitStream_DecodeConstraintWholeNumber -if BitStream_EncodeConstraintWholeNumber -o ${INCP_OUTPUT_DIR} ${ASN1_OUTPUT} + MAIN_DEPENDENCY ${ASN1_OUTPUT} + COMMENT "INCP: Compiling ASN1 definition" + VERBATIM +) + +# Generates the C wrapper +add_custom_command( + OUTPUT + ${WRAPPER_SOURCE} + ${WRAPPER_HEADER} + COMMAND + ${CMAKE_COMMAND} -E env + PYTHONPATH=${pyincp_SOURCE_DIR} + ${INCP_GEN_COMMAND} --c ${INCP_OUTPUT_DIR} ${INCP_SCHEMA} + MAIN_DEPENDENCY ${INCP_SCHEMA} + COMMENT "INCP: Generating C wrapper" + VERBATIM +) + +# Integrate generated artifacts with the project's build +target_sources(${EXECUTABLE} PRIVATE + ${ASN1SCC_SOURCES} + ${WRAPPER_SOURCE} +) + +target_include_directories(${EXECUTABLE} PRIVATE + ${INCP_OUTPUT_DIR} +) diff --git a/app/incp/schema.yml b/app/incp/schema.yml new file mode 100644 index 0000000..4fb287b --- /dev/null +++ b/app/incp/schema.yml @@ -0,0 +1,10 @@ +modules: + - name: mod_a + enums: [] + variables: + - name: var_a + doc: Var a + type: I32 + reports: [] + commands: [] + events: []