Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85812995
D374.1792695595.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Authored By
Unknown
Size
9 KB
Referenced Files
None
Subscribers
None
D374.1792695595.diff
View Options
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
Details
Attached
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.1792695595.diff (9 KB)
Attached To
Mode
D374: Switch to cmake and corrosion
Attached
Detach File
Event Timeline