From 57849f989b47c40c33829f1b0de3105ebad5a1d3 Mon Sep 17 00:00:00 2001 From: Martynas Gurskas Date: Mon, 19 May 2025 15:17:11 +0300 Subject: [PATCH 1/5] Remove unused scaffolding test case configuration in CMakeLists Signed-off-by: Martynas Gurskas --- cpp-tests/CMakeLists.txt | 47 ---------------------------------------- 1 file changed, 47 deletions(-) diff --git a/cpp-tests/CMakeLists.txt b/cpp-tests/CMakeLists.txt index b6e4835..d59bab7 100644 --- a/cpp-tests/CMakeLists.txt +++ b/cpp-tests/CMakeLists.txt @@ -54,24 +54,6 @@ list(APPEND BINDING_FILES ${BINDINGS_SRC_DIR}/${TEST_NAME}.cpp) endmacro(test_case) -# Add a scaffolding test case -macro(scaffolding_test_case TEST_NAME) - -add_executable(${TEST_NAME}-scaffolding-test tests/${TEST_NAME}/main.cpp ${BINDINGS_SRC_DIR}/${TEST_NAME}.cpp) -target_include_directories(${TEST_NAME}-scaffolding-test PRIVATE ${BINDINGS_SRC_DIR} include) -target_link_libraries(${TEST_NAME}-scaffolding-test uniffi_fixtures Threads::Threads) - -add_test(NAME ${TEST_NAME}-scaffolding-test COMMAND ${TEST_NAME}-scaffolding-test) -memcheck_test(${TEST_NAME}-scaffolding-test) - -add_dependencies(${TEST_NAME}-scaffolding-test bindings scaffolding) - -list(APPEND SCAFFOLDING_FILES ${BINDINGS_SRC_DIR}/${TEST_NAME}_cpp_scaffolding.cpp) -list(APPEND SCAFFOLDING_LIB_FILES scaffolding_tests/${TEST_NAME}/lib_${TEST_NAME}.cpp) -list(APPEND SCAFFOLDING_LIB_INCLUDE_DIRS scaffolding_tests/${TEST_NAME}) - -endmacro(scaffolding_test_case) - test_case(arithmetic) test_case(callbacks) test_case(fixture_callbacks) @@ -90,27 +72,6 @@ test_case(enum_style_test) test_case(empty_type) test_case(error_types_builtin) -# scaffolding_test_case(arithmetic) -# scaffolding_test_case(callbacks) -# scaffolding_test_case(fixture_callbacks) -# scaffolding_test_case(chronological) -# scaffolding_test_case(custom_types) -# scaffolding_test_case(geometry) -# scaffolding_test_case(rondpoint) -# scaffolding_test_case(sprites) -# scaffolding_test_case(todolist) -# scaffolding_test_case(traits) -# scaffolding_test_case(coverall) -# scaffolding_test_case(custom_types_builtin) -# scaffolding_test_case(enum_style_test) -# scaffolding_test_case(empty_type) - -# add_library(uniffi_fixtures SHARED -# ${SCAFFOLDING_LIB_FILES}) -# target_include_directories(uniffi_fixtures PRIVATE -# ${SCAFFOLDING_LIB_INCLUDE_DIRS} ${BINDINGS_SRC_DIR}) -# add_dependencies(uniffi_fixtures scaffolding) - add_custom_target(libs ALL BYPRODUCTS ${BINDING_FILES} COMMAND cargo build @@ -124,11 +85,3 @@ add_custom_target(bindings ALL WORKING_DIRECTORY ${BINDINGS_BUILD_DIR} COMMENT "Generating bindings" ) - -# add_custom_target(scaffolding ALL -# BYPRODUCTS ${SCAFFOLDING_FILES} -# DEPENDS libs -# COMMAND ./uniffi-bindgen-cpp --scaffolding --library ${UNIFFI_FIXTURES_LIB} --out-dir bindings -# WORKING_DIRECTORY ${BINDINGS_BUILD_DIR} -# COMMENT "Generating scaffolding" -# ) From 860ef4331dde86ef94df5481c027de0a8b7f3aff Mon Sep 17 00:00:00 2001 From: Martynas Gurskas Date: Mon, 19 May 2025 15:19:27 +0300 Subject: [PATCH 2/5] Generate used code only in the scaffolding header Before we were including async functions/struct alongside unused vtable method definitions, which lead to problems when trying to include multiple uniffi projects in the same executable Signed-off-by: Martynas Gurskas --- bindgen/src/bindings/cpp/gen_cpp/mod.rs | 19 +++++++++++++++++++ .../bindings/cpp/templates/scaffolding.hpp | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/bindgen/src/bindings/cpp/gen_cpp/mod.rs b/bindgen/src/bindings/cpp/gen_cpp/mod.rs index 6876e11..acd90b0 100644 --- a/bindgen/src/bindings/cpp/gen_cpp/mod.rs +++ b/bindgen/src/bindings/cpp/gen_cpp/mod.rs @@ -97,6 +97,25 @@ impl<'a> ScaffoldingHeader<'a> { fn new(ci: &'a ComponentInterface) -> Self { Self { ci } } + + pub fn scaffolding_definitions(&self) -> impl Iterator + '_ { + self.ci + .callback_interface_definitions() + .into_iter() + .map(|cb| cb.vtable_definition()) + .chain( + self.ci + .object_definitions() + .iter() + .flat_map(|o| o.vtable_definition()), + ) + .map(Into::into) + .chain( + self.ci + .iter_ffi_function_definitions_non_async() + .map(Into::into), + ) + } } #[derive(Template)] diff --git a/bindgen/src/bindings/cpp/templates/scaffolding.hpp b/bindgen/src/bindings/cpp/templates/scaffolding.hpp index aa263ea..216436d 100644 --- a/bindgen/src/bindings/cpp/templates/scaffolding.hpp +++ b/bindgen/src/bindings/cpp/templates/scaffolding.hpp @@ -28,7 +28,7 @@ struct RustCallStatus { #endif -{%- for def in ci.ffi_definitions() %} +{%- for def in self.scaffolding_definitions() %} {%- match def %} {%- when FfiDefinition::CallbackFunction(callback) %} {% call macros::ffi_return_type(callback) %} {{ callback.name()}}( @@ -41,7 +41,7 @@ struct {{ ffi_struct.name()|ffi_struct_name }} { {%- endfor %} }; {%- when FfiDefinition::Function(func) %} -{%- match func.return_type() -%} +{% match func.return_type() -%} {% when Some with (return_type) %}{{ return_type|ffi_type_name }} {% when None %}void {% endmatch %}{{ func.name() }}( {%- for arg in func.arguments() %} {{- arg.type_().borrow()|ffi_type_name }} {{ arg.name() }}{% if !loop.last || func.has_rust_call_status_arg() %}, {% endif -%} From 63e7bc00f9810894c108a8c0851de4d25f0d147a Mon Sep 17 00:00:00 2001 From: Martynas Gurskas Date: Mon, 19 May 2025 15:21:16 +0300 Subject: [PATCH 3/5] Add multilib test A special test that includes multiple uniffi output headers to check for symbol clashes Signed-off-by: Martynas Gurskas --- cpp-tests/CMakeLists.txt | 12 ++++++++++++ cpp-tests/tests/multilib/main.cpp | 5 +++++ 2 files changed, 17 insertions(+) create mode 100644 cpp-tests/tests/multilib/main.cpp diff --git a/cpp-tests/CMakeLists.txt b/cpp-tests/CMakeLists.txt index d59bab7..89d30f7 100644 --- a/cpp-tests/CMakeLists.txt +++ b/cpp-tests/CMakeLists.txt @@ -72,6 +72,18 @@ test_case(enum_style_test) test_case(empty_type) test_case(error_types_builtin) +# Special multilib test that only needs to compile to check for potential symbol clashes +add_executable(multilib-test + tests/multilib/main.cpp + ${BINDINGS_SRC_DIR}/arithmetic.cpp + ${BINDINGS_SRC_DIR}/coverall.cpp + ${BINDINGS_SRC_DIR}/sprites.cpp +) +target_include_directories(multilib-test PRIVATE ${BINDINGS_SRC_DIR} include) +target_link_directories(multilib-test PRIVATE ${BINDINGS_BUILD_DIR}) +target_link_libraries(multilib-test uniffi_bindgen_cpp_fixtures Threads::Threads ${ADDITIONAL_LIBS}) +add_dependencies(multilib-test bindings) + add_custom_target(libs ALL BYPRODUCTS ${BINDING_FILES} COMMAND cargo build diff --git a/cpp-tests/tests/multilib/main.cpp b/cpp-tests/tests/multilib/main.cpp new file mode 100644 index 0000000..29411ee --- /dev/null +++ b/cpp-tests/tests/multilib/main.cpp @@ -0,0 +1,5 @@ +#include +#include +#include + +int main() { return 0; } From 056a2ae7a9bfddfcfc816831a60e9cd3f0930b4c Mon Sep 17 00:00:00 2001 From: Martynas Gurskas Date: Mon, 19 May 2025 15:28:13 +0300 Subject: [PATCH 4/5] Bump uniffi cpp version Signed-off-by: Martynas Gurskas --- CHANGELOG.md | 5 +++++ Cargo.lock | 2 +- README.md | 4 ++-- bindgen/Cargo.toml | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4ff01d..2427baa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +#### v0.7.1+v0.28.3 + +---- +- Core: Generate used code only in the scaffolding header + #### v0.7.0+v0.28.3 ---- diff --git a/Cargo.lock b/Cargo.lock index 4771ec9..3d0ae49 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -609,7 +609,7 @@ dependencies = [ [[package]] name = "uniffi-bindgen-cpp" -version = "0.7.0+v.0.28.3" +version = "0.7.1+v.0.28.3" dependencies = [ "anyhow", "askama", diff --git a/README.md b/README.md index d93d444..e5303a3 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ as a separate project from `uniffi-rs`, as per # How to install -Minimum Rust version required to install `uniffi-bindgen-cpp` is `1.72`. +Minimum Rust version required to install `uniffi-bindgen-cpp` is `1.74`. Newer Rust versions should also work fine. ```bash -cargo install uniffi-bindgen-cpp --git https://github.com/NordSecurity/uniffi-bindgen-cpp --tag v0.7.0+v0.28.3 +cargo install uniffi-bindgen-cpp --git https://github.com/NordSecurity/uniffi-bindgen-cpp --tag v0.7.1+v0.28.3 ``` # How to generate bindings diff --git a/bindgen/Cargo.toml b/bindgen/Cargo.toml index 9019372..a6b2c4e 100644 --- a/bindgen/Cargo.toml +++ b/bindgen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uniffi-bindgen-cpp" -version = "0.7.0+v.0.28.3" +version = "0.7.1+v.0.28.3" edition = "2021" [dependencies] From 9d57c8adeaa00048e4da4e1555e6eed12f8ddafd Mon Sep 17 00:00:00 2001 From: Martynas Gurskas Date: Mon, 19 May 2025 15:31:34 +0300 Subject: [PATCH 5/5] Update deprecated Ubuntu runner in CI Signed-off-by: Martynas Gurskas --- .github/workflows/cpp.yml | 6 ++---- cpp-tests/CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cpp.yml b/.github/workflows/cpp.yml index ceb2235..90df88d 100644 --- a/.github/workflows/cpp.yml +++ b/.github/workflows/cpp.yml @@ -14,9 +14,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - # Ubuntu-20.04 is being used here on purpose instead of ubuntu-latest due to a bug with clang and libstdc++ - # https://github.com/actions/runner-images/issues/8659 - os: [ubuntu-20.04, windows-latest, macos-13] + os: [ubuntu-22.04, windows-latest, macos-13] build_type: [Release] cpp_compiler: [g++, clang++, cl] exclude: @@ -24,7 +22,7 @@ jobs: cpp_compiler: clang++ - os: windows-latest cpp_compiler: g++ - - os: ubuntu-20.04 + - os: ubuntu-22.04 cpp_compiler: cl - os: macos-13 cpp_compiler: cl diff --git a/cpp-tests/CMakeLists.txt b/cpp-tests/CMakeLists.txt index 89d30f7..b8a0282 100644 --- a/cpp-tests/CMakeLists.txt +++ b/cpp-tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.10) project(binding-tests VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON)