Page MenuHomePhorge

D374.1792695588.diff
No OneTemporary

Authored By
Unknown
Size
9 KB
Referenced Files
None
Subscribers
None

D374.1792695588.diff

diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@
cpp/objects
.ccls-cache
cpp/src/lib.rs
+build
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -15,30 +15,22 @@
script:
- apt-get update
- DEBIAN_FRONTEND=noninteractive apt-get -y upgrade
- - DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends rustup build-essential g++ libolm-dev libboost-json-dev wget cmake ca-certificates
+ - DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends rustup build-essential g++ libolm-dev libboost-json-dev wget cmake ca-certificates catch2 corrosion
- rustup default stable
- # catch2 is broken in ubuntu, see https://bugs.launchpad.net/ubuntu/+source/catch2/+bug/2081647
- - wget https://github.com/catchorg/Catch2/archive/v3.3.2.tar.gz -O catch2.tar.gz
- - tar -xf catch2.tar.gz
- - cd Catch2-*
- - mkdir build && cd build && \
- - cmake .. -DCATCH_ENABLE_WERROR=OFF -DBUILD_TESTING=OFF
- - make -j$(($(nproc) / 2)) install
- - cd ../..
- - rm -rf Catch2-* catch2.tar.gz
- - cd cpp
- - mv -v build.rs build.rs.orig
- - grep -v 'cargo::rerun-if-changed' build.rs.orig > build.rs
- - make BUILD_TYPE="$BUILD_TYPE" test
+ - mkdir build
+ - cd build
+ - cmake .. -DCMAKE_BUILD_TYPE="$BUILD_TYPE"
+ - make -j$(($(nproc) / 2))
+ - CTEST_OUTPUT_ON_FAILURE=ON make test
build:release:
extends:
- .build
before_script:
- - BUILD_TYPE=release
+ - BUILD_TYPE=Release
build:debug:
extends:
- .build
before_script:
- - BUILD_TYPE=debug
+ - BUILD_TYPE=Debug
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,70 @@
+
+cmake_minimum_required(VERSION 3.23)
+
+project(vodozemac-bindings)
+
+include(GNUInstallDirs)
+include(CTest)
+find_package(Perl REQUIRED)
+find_package(Corrosion REQUIRED)
+
+# corrosion_import_crate requires that lib.rs exist, so we must generate it right now when configuring
+message(STATUS "Generating lib.rs")
+execute_process(COMMAND "${PERL_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/cpp/inject-maybe"
+ "${CMAKE_SOURCE_DIR}/cpp/src/lib.rs.in" "${CMAKE_BINARY_DIR}/vodozemac.lib.rs"
+ ERROR_FILE "${CMAKE_BINARY_DIR}/vodozemac.lib.rs.log"
+ COMMAND_ERROR_IS_FATAL ANY)
+# Use a temporary file and copy it into place to avoid unnecessarily updating it
+configure_file("${CMAKE_BINARY_DIR}/vodozemac.lib.rs" "${CMAKE_SOURCE_DIR}/cpp/src/lib.rs" COPYONLY)
+
+corrosion_import_crate(MANIFEST_PATH cpp/Cargo.toml)
+
+function(get_symlink filename out_var)
+ if(IS_SYMLINK "${filename}")
+ file(READ_SYMLINK "${filename}" result)
+ if(NOT IS_ABSOLUTE "${result}")
+ get_filename_component(dir "${filename}" DIRECTORY)
+ set(result "${dir}/${result}")
+ endif()
+ set("${out_var}" "${result}" PARENT_SCOPE)
+ else()
+ set("${out_var}" "${filename}" PARENT_SCOPE)
+ endif()
+endfunction()
+
+add_library(vodozemac-shared SHARED)
+get_symlink("${CMAKE_BINARY_DIR}/cargo/build/${Rust_CARGO_TARGET}/cxxbridge/vodozemac/src/lib.rs.h" vodozemac_HEADERS)
+target_sources(
+ vodozemac-shared
+ PRIVATE
+ FILE_SET HEADERS FILES ${vodozemac_HEADERS})
+set_target_properties(vodozemac-shared
+ PROPERTIES
+ LINKER_LANGUAGE CXX
+ OUTPUT_NAME vodozemac
+ EXPORT_NAME vodozemac
+ VERSION 1.0.0
+ SOVERSION 4
+)
+target_link_libraries(vodozemac-shared PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,vodozemac-static>")
+install(FILES ${vodozemac_HEADERS} TYPE INCLUDE RENAME vodozemac.h)
+install(TARGETS vodozemac-shared EXPORT vodozemacTargets LIBRARY)
+
+set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/vodozemac)
+
+install(
+ EXPORT vodozemacTargets
+ NAMESPACE vodozemac::
+ DESTINATION ${ConfigPackageLocation}
+)
+
+install(
+ FILES cmake/vodozemacConfig.cmake
+ DESTINATION ${ConfigPackageLocation})
+
+if(BUILD_TESTING)
+ find_package(Catch2 REQUIRED)
+ find_package(Boost REQUIRED COMPONENTS json)
+ find_package(Olm REQUIRED)
+ add_subdirectory(cpp/tests)
+endif()
diff --git a/cmake/vodozemacConfig.cmake b/cmake/vodozemacConfig.cmake
new file mode 100644
--- /dev/null
+++ b/cmake/vodozemacConfig.cmake
@@ -0,0 +1,2 @@
+
+include("${CMAKE_CURRENT_LIST_DIR}/vodozemacTargets.cmake")
diff --git a/cpp/Makefile b/cpp/Makefile
deleted file mode 100644
--- a/cpp/Makefile
+++ /dev/null
@@ -1,117 +0,0 @@
-
-.PHONY: all dynamic-lib test install
-
-BUILD_TYPE := debug
-ifeq ($(BUILD_TYPE), release)
-CARGO_ARGS = --release
-else
-CARGO_ARGS =
-endif
-ifneq ($(CARGO_TARGET),)
-CARGO_ARGS += --target $(CARGO_TARGET)
-endif
-
-VERSION = 1.0.0
-SOVERSION = 4
-
-ifeq ($(CARGO_TARGET),)
-TARGET_DIR = ../target/$(BUILD_TYPE)
-else
-TARGET_DIR = ../target/$(CARGO_TARGET)/$(BUILD_TYPE)
-endif
-CXXBRIDGE_DIR = $(TARGET_DIR)/../cxxbridge
-STATIC_LIB = $(TARGET_DIR)/libvodozemac.a
-ifeq ($(OS), Windows_NT)
-SHARED_LIB_NAME = libvodozemac.dll
-else
-UNAME_S := $(shell uname -s)
-ifeq ($(UNAME_S),Darwin)
-SHARED_LIB_NAME = libvodozemac.dylib
-else
-SHARED_LIB_NAME = libvodozemac.so
-endif
-endif
-SHARED_LIB_PREFIX = $(TARGET_DIR)/$(SHARED_LIB_NAME)
-SHARED_LIBS = $(SHARED_LIB_PREFIX) $(SHARED_LIB_PREFIX).$(VERSION) $(SHARED_LIB_PREFIX).$(SOVERSION)
-
-# The list of libraries are obtained by running
-# `cargo rustc -- --print native-static-libs`.
-# Unfortunately, the output format is really hostile to automatically generating the list on the fly.
-ifeq ($(OS), Windows_NT)
-SHARED_LIB_LDFLAGS = -lbcrypt -ladvapi32 -lstdc++ -lkernel32 -ladvapi32 -lntdll -luserenv -lws2_32 -lkernel32 -Wl,--out-implib,$(SHARED_LIB_PREFIX).a
-else ifeq ($(UNAME_S),Darwin)
-SHARED_LIB_LDFLAGS = -lc++
-else ifeq ($(CARGO_TARGET),aarch64-linux-android)
-SHARED_LIB_LDFLAGS = -lc -lm -lc++_shared -ldl -llog -lunwind -ldl -lm -lc
-else
-SHARED_LIB_LDFLAGS = -lstdc++ -lgcc_s -lutil -lrt -lpthread -lm -ldl -lc
-endif
-
-HEADER = $(CXXBRIDGE_DIR)/vodozemac/src/lib.rs.h
-SOURCES = src/account.rs src/group_sessions.rs src/lib.rs src/sas.rs src/session.rs src/types.rs src/maybe.rs build.rs vodozemac_maybe_derive/src/lib.rs
-
-all: dynamic-lib
-
-CXX ?= c++
-LN ?= ln
-INSTALL ?= install
-CP ?= cp
-PERL ?= perl
-CARGO ?= cargo
-
-# Packagers may need to override them all.
-PREFIX = /usr/local
-DESTDIR =
-LIBDIR = $(PREFIX)/lib
-INCLUDEDIR = $(PREFIX)/include
-
-src/lib.rs: src/lib.rs.in inject-maybe
- $(PERL) ./inject-maybe < src/lib.rs.in > src/lib.rs
-
-$(STATIC_LIB): $(SOURCES)
- $(CARGO) build $(CARGO_ARGS)
-
-dynamic-lib: $(SHARED_LIB_PREFIX)
-
-$(SHARED_LIB_PREFIX).$(SOVERSION): $(SHARED_LIB_PREFIX).$(VERSION)
- $(LN) -sfv $(SHARED_LIB_NAME).$(VERSION) $(SHARED_LIB_PREFIX).$(SOVERSION)
-
-$(SHARED_LIB_PREFIX): $(SHARED_LIB_PREFIX).$(SOVERSION)
- $(LN) -sfv $(SHARED_LIB_NAME).$(SOVERSION) $(SHARED_LIB_PREFIX)
-
-$(SHARED_LIB_PREFIX).$(VERSION): $(STATIC_LIB)
-ifeq ($(UNAME_S),Darwin)
- $(CXX) -Wl,-force_load,$(STATIC_LIB) $(SHARED_LIB_LDFLAGS) -dynamiclib -fPIC -Wl,-install_name,@rpath/$(SHARED_LIB_NAME).$(SOVERSION) -o $(SHARED_LIB_PREFIX).$(VERSION)
-else
- $(CXX) -Wl,--whole-archive $(STATIC_LIB) -Wl,--no-whole-archive $(SHARED_LIB_LDFLAGS) -shared -fPIC -Wl,-soname=$(SHARED_LIB_NAME) -o $(SHARED_LIB_PREFIX).$(VERSION)
-endif
-
-TEST_CXXFLAGS = -Wall -g -std=c++17 -I $(CXXBRIDGE_DIR)
-TEST_LDFLAGS = -lCatch2Main -lCatch2 -lolm -lboost_json \
- -L $(TARGET_DIR) -l vodozemac -ldl -Wl,-rpath,$(TARGET_DIR) \
- -L /usr/local/lib -Wl,-rpath,/usr/local/lib
-
-TEST_DEPS = $(SHARED_LIB_PREFIX).$(VERSION) tests/util.hpp
-TESTS_EXCEPT = account-test session-test sas-test group-session-test
-TESTS_NOEXCEPT = $(TESTS_EXCEPT:-test=-noexcept-test)
-TESTS = $(TESTS_EXCEPT) $(TESTS_NOEXCEPT)
-
-%-test: tests/%.cpp $(TEST_DEPS)
- $(CXX) $(TEST_CXXFLAGS) -DVODOZEMAC_TEST_EXCEPTIONS=1 -fexceptions $< $(TEST_LDFLAGS) -o $@
-
-%-noexcept-test: tests/%.cpp $(TEST_DEPS)
- $(CXX) $(TEST_CXXFLAGS) -DVODOZEMAC_TEST_EXCEPTIONS=0 -fno-exceptions $< $(TEST_LDFLAGS) -o $@
-
-test: $(TESTS)
- for i in $^; do ./$$i || exit 1; done
-
-install:
- $(INSTALL) -d $(DESTDIR)$(INCLUDEDIR) $(DESTDIR)$(LIBDIR)
- $(INSTALL) -m644 $(STATIC_LIB) $(DESTDIR)$(LIBDIR)
- $(INSTALL) -m755 $(SHARED_LIB_PREFIX).$(VERSION) $(DESTDIR)$(LIBDIR)
-ifeq ($(OS), Windows_NT)
- $(INSTALL) -m755 $(SHARED_LIB_PREFIX).a $(DESTDIR)$(LIBDIR)
-endif
- $(LN) -sfv $(SHARED_LIB_NAME).$(VERSION) $(DESTDIR)$(LIBDIR)/$(SHARED_LIB_NAME).$(SOVERSION)
- $(LN) -sfv $(SHARED_LIB_NAME).$(SOVERSION) $(DESTDIR)$(LIBDIR)/$(SHARED_LIB_NAME)
- $(CP) $(HEADER) $(DESTDIR)$(INCLUDEDIR)/vodozemac.h
diff --git a/cpp/inject-maybe b/cpp/inject-maybe
--- a/cpp/inject-maybe
+++ b/cpp/inject-maybe
@@ -45,7 +45,20 @@
my $output = '';
-while (<STDIN>) {
+my $in;
+if (length $ARGV[0]) {
+ open $in, '<', $ARGV[0] or die "Cannot open input file: $!\n";
+} else {
+ $in = \*STDIN;
+}
+my $out;
+if (length $ARGV[1]) {
+ open $out, '>', $ARGV[1] or die "Cannot open output file: $!\n";
+} else {
+ $out = \*STDOUT;
+}
+
+while (<$in>) {
$output .= $_;
if (/fn ([a-z_0-9]+)\(/) {
$funcName = $1;
@@ -71,4 +84,4 @@
s{// gen-typedef-place\n}{$generatedTypedef} for $output;
s{// gen-maybe-place\n}{$generatedMaybe} for $output;
-print $output;
+print {$out} $output;
diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/cpp/tests/CMakeLists.txt
@@ -0,0 +1,21 @@
+function(vodozemac_add_test testname source)
+ add_executable("${testname}" "${source}")
+ target_link_libraries("${testname}"
+ PRIVATE Catch2::Catch2WithMain
+ Boost::json
+ Olm::Olm
+ vodozemac-shared)
+ add_test("${testname}" "${testname}")
+endfunction()
+
+function(vodozemac_add_tests)
+ foreach(testname ${ARGN})
+ vodozemac_add_test("${testname}" "${testname}.cpp")
+ target_compile_options("${testname}" PRIVATE -fexceptions)
+
+ vodozemac_add_test("${testname}-noexcept" "${testname}.cpp")
+ target_compile_options("${testname}-noexcept" PRIVATE -fno-exceptions)
+ endforeach()
+endfunction()
+
+vodozemac_add_tests(account group-session sas session)

File Metadata

Mime Type
text/plain
Expires
Thu, Oct 22, 11:59 AM (19 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1791138
Default Alt Text
D374.1792695588.diff (9 KB)

Event Timeline