@@ -34,15 +34,116 @@ set(CMAKE_CXX_EXTENSIONS OFF)
3434set (CMAKE_CXX_MODULE_STD 26)
3535set (CMAKE_CXX_MODULE_EXTENSIONS OFF )
3636
37+ option (
38+ CPP_BINDINGS_LINUX_ENABLE_FFI_JSON_EXPORT
39+ "Enable ASTrein JSON export for the cpp-core FFI headers"
40+ OFF
41+ )
42+ set (
43+ CPP_BINDINGS_LINUX_ASTREIN_EXECUTABLE
44+ ""
45+ CACHE FILEPATH
46+ "Path to the ASTrein executable used for FFI JSON export"
47+ )
48+ set (
49+ CPP_BINDINGS_LINUX_FFI_JSON_OUTPUT
50+ "${CMAKE_BINARY_DIR } /cpp_bindings_linux.ffi.json"
51+ CACHE FILEPATH
52+ "Output path for the generated cpp-core FFI API metadata"
53+ )
54+
3755CPMAddPackage (
3856 NAME cpp_core
3957 GITHUB_REPOSITORY Serial-IO/cpp-core
40- GIT_TAG v2.0.0
58+ GIT_TAG v2.0.1
4159 OPTIONS
4260 "CMAKE_EXPORT_COMPILE_COMMANDS OFF"
43- "CPP_CORE_ENABLE_AST_EXPORT ON"
4461)
4562
63+ if (CPP_BINDINGS_LINUX_ENABLE_FFI_JSON_EXPORT)
64+ if (CPP_BINDINGS_LINUX_ASTREIN_EXECUTABLE)
65+ set (_cpp_bindings_linux_astrein "${CPP_BINDINGS_LINUX_ASTREIN_EXECUTABLE} " )
66+ else ()
67+ find_program (_cpp_bindings_linux_astrein NAMES astrein )
68+ endif ()
69+
70+ if (NOT _cpp_bindings_linux_astrein)
71+ message (
72+ FATAL_ERROR
73+ "CPP_BINDINGS_LINUX_ENABLE_FFI_JSON_EXPORT=ON requires ASTrein. "
74+ "Install astrein or set CPP_BINDINGS_LINUX_ASTREIN_EXECUTABLE."
75+ )
76+ endif ()
77+
78+ file (
79+ GLOB_RECURSE _cpp_bindings_linux_ffi_headers
80+ CONFIGURE_DEPENDS
81+ "${cpp_core_SOURCE_DIR } /include/*.h"
82+ "${cpp_core_SOURCE_DIR } /include/*.hpp"
83+ )
84+ set (
85+ _cpp_bindings_linux_ffi_wrapper
86+ "${CMAKE_BINARY_DIR } /ffi.cpp"
87+ )
88+ get_filename_component (
89+ _cpp_bindings_linux_ffi_output_dir
90+ "${CPP_BINDINGS_LINUX_FFI_JSON_OUTPUT} "
91+ DIRECTORY
92+ )
93+
94+ file (
95+ GENERATE
96+ OUTPUT "${_cpp_bindings_linux_ffi_wrapper} "
97+ CONTENT "#include <cpp_core/serial.h>\n "
98+ )
99+
100+ add_library (
101+ cpp_bindings_linux_ffi_ast_context
102+ OBJECT
103+ EXCLUDE_FROM_ALL
104+ "${_cpp_bindings_linux_ffi_wrapper} "
105+ )
106+ target_include_directories (
107+ cpp_bindings_linux_ffi_ast_context
108+ PRIVATE
109+ "${cpp_core_SOURCE_DIR } /include"
110+ )
111+ target_compile_features (
112+ cpp_bindings_linux_ffi_ast_context
113+ PRIVATE
114+ cxx_std_26
115+ )
116+
117+ add_custom_command (
118+ OUTPUT "${CPP_BINDINGS_LINUX_FFI_JSON_OUTPUT} "
119+ COMMAND
120+ ${CMAKE_COMMAND } -E make_directory
121+ "${_cpp_bindings_linux_ffi_output_dir} "
122+ COMMAND
123+ "${_cpp_bindings_linux_astrein} "
124+ --ffi
125+ --compile-commands "${CMAKE_BINARY_DIR } /compile_commands.json"
126+ --require-c-linkage
127+ --require-default-visibility
128+ --public-header "cpp_core/serial.h"
129+ --api-root "${cpp_core_SOURCE_DIR } /include"
130+ --output "${CPP_BINDINGS_LINUX_FFI_JSON_OUTPUT} "
131+ "${_cpp_bindings_linux_ffi_wrapper} "
132+ DEPENDS
133+ "${_cpp_bindings_linux_astrein} "
134+ "${CMAKE_BINARY_DIR } /compile_commands.json"
135+ "${_cpp_bindings_linux_ffi_wrapper} "
136+ ${_cpp_bindings_linux_ffi_headers}
137+ COMMENT "Exporting cpp-core FFI API metadata with ASTrein"
138+ VERBATIM
139+ )
140+
141+ add_custom_target (
142+ cpp_bindings_linux_ffi_json
143+ DEPENDS "${CPP_BINDINGS_LINUX_FFI_JSON_OUTPUT} "
144+ )
145+ endif ()
146+
46147CPMAddPackage (
47148 NAME GTest
48149 GITHUB_REPOSITORY google/googletest
0 commit comments