use cbindgen for FFI #3
|
|
@ -9,6 +9,8 @@ find_package(Qt6 REQUIRED COMPONENTS Gui Widgets)
|
||||||
find_program(CARGO cargo REQUIRED)
|
find_program(CARGO cargo REQUIRED)
|
||||||
set(CARGO_TARGET_DIR "${CMAKE_BINARY_DIR}/cargo")
|
set(CARGO_TARGET_DIR "${CMAKE_BINARY_DIR}/cargo")
|
||||||
|
|
||||||
|
include(cbindgen.cmake)
|
||||||
|
|
||||||
qt_standard_project_setup()
|
qt_standard_project_setup()
|
||||||
|
|
||||||
add_subdirectory(ui)
|
add_subdirectory(ui)
|
||||||
|
|
|
||||||
13
cbindgen.cmake
Normal file
13
cbindgen.cmake
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
option(LOCAL_CBINDGEN "Download and build `cbindgen` even if one can be found on the system")
|
||||||
|
|
||||||
|
if(NOT LOCAL_CBINDGEN)
|
||||||
|
find_program(CBINDGEN cbindgen)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CBINDGEN)
|
||||||
|
message(CONFIGURE_LOG "cbindgen not found, downloading...")
|
||||||
|
set(crates "${CMAKE_BINARY_DIR}/crates")
|
||||||
|
file(MAKE_DIRECTORY ${crates})
|
||||||
|
execute_process(COMMAND ${CARGO} install --root ${crates} cbindgen@0.29.4)
|
||||||
|
set(CACHE{CBINDGEN} TYPE FILEPATH FORCE VALUE "${crates}/bin/cbindgen")
|
||||||
|
endif()
|
||||||
14
ui/cbindgen.toml
Normal file
14
ui/cbindgen.toml
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
includes = ["types.hxx"]
|
||||||
|
sys_includes = ["cstdint"]
|
||||||
|
pragma_once = true
|
||||||
|
no_includes = true
|
||||||
|
namespace = "ffi"
|
||||||
|
tab_width = 4
|
||||||
|
language = "C++"
|
||||||
|
|
||||||
|
[parse]
|
||||||
|
parse_deps = true
|
||||||
|
include = ["PROJECT-NAME"]
|
||||||
|
|
||||||
|
[export]
|
||||||
|
exclude = ["Box"]
|
||||||
|
|
@ -22,3 +22,24 @@ add_library(PROJECT_NAME_impl STATIC IMPORTED)
|
||||||
set_target_properties(PROJECT_NAME_impl PROPERTIES
|
set_target_properties(PROJECT_NAME_impl PROPERTIES
|
||||||
IMPORTED_LOCATION ${impl_basename}.a
|
IMPORTED_LOCATION ${impl_basename}.a
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# generate the bindings
|
||||||
|
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include")
|
||||||
|
set(bindings_basename "${CMAKE_CURRENT_BINARY_DIR}/include/bindings")
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${bindings_basename}.hxx
|
||||||
|
COMMAND ${CBINDGEN} --only-target-dependencies --output "${bindings_basename}.hxx" --depfile "${bindings_basename}.d"
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
DEPFILE ${bindings_basename}.d
|
||||||
|
VERBATIM
|
||||||
|
CODEGEN
|
||||||
|
DEPENDS_EXPLICIT_ONLY
|
||||||
|
)
|
||||||
|
|
||||||
|
target_sources(PROJECT_NAME_impl INTERFACE
|
||||||
|
${bindings_basename}.hxx
|
||||||
|
)
|
||||||
|
target_include_directories(PROJECT_NAME_impl INTERFACE
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/include"
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,6 @@
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
namespace ffi {
|
|
||||||
extern "C" Core* rt4_viewport_create(xcb_connection_t* connection, std::uint32_t window, std::uint32_t width, std::uint32_t height);
|
|
||||||
extern "C" void rt4_viewport_destroy(Core* viewport);
|
|
||||||
extern "C" void rt4_viewport_configure(Core* viewport, std::uint32_t width, std::uint32_t height);
|
|
||||||
extern "C" void rt4_viewport_redraw(Core* viewport, const RedrawArgs* args);
|
|
||||||
} // namespace ffi
|
|
||||||
|
|
||||||
BoxCore::BoxCore(BoxCore&& b)
|
BoxCore::BoxCore(BoxCore&& b)
|
||||||
: ptr(std::exchange(b.ptr, {})) {
|
: ptr(std::exchange(b.ptr, {})) {
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,23 +2,10 @@
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "bindings.hxx"
|
||||||
|
|
||||||
struct xcb_connection_t;
|
struct xcb_connection_t;
|
||||||
|
|
||||||
struct alignas(16) Vec4 {
|
|
||||||
float x, y, z, w;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace ffi {
|
|
||||||
struct Core;
|
|
||||||
|
|
||||||
struct RedrawArgs {
|
|
||||||
float cam_yaw;
|
|
||||||
float cam_pitch;
|
|
||||||
float cam_distance;
|
|
||||||
float cam_fovy;
|
|
||||||
};
|
|
||||||
} // namespace ffi
|
|
||||||
|
|
||||||
using ffi::RedrawArgs;
|
using ffi::RedrawArgs;
|
||||||
|
|
||||||
class MutCore {
|
class MutCore {
|
||||||
|
|
|
||||||
12
ui/src/types.hxx
Normal file
12
ui/src/types.hxx
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct alignas(16) Vec4 {
|
||||||
|
float x, y, z, w;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace ffi {
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
using Box = T*;
|
||||||
|
|
||||||
|
} // namespace ffi
|
||||||
Loading…
Reference in New Issue
Block a user