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