From: Ezekiel Newren <ezekielnewren@xxxxxxxxx> Upcoming patches will accelerate and simplify xdiff, while also porting parts of it to Rust. In preparation, add some stubs and setup the Rust build. For now, it is easier to let cargo build rust and have make or meson merely link against the static library that cargo builds. In line with ongoing libification efforts, use multiple crates to allow more modularity on the Rust side. xdiff is the crate that this series will focus on, but we also introduce the interop crate for future patch series. In order to facilitate interoperability between C and Rust, introduce C definitions for Rust primitive types in git-compat-util.h. Signed-off-by: Ezekiel Newren <ezekielnewren@xxxxxxxxx> --- .gitignore | 3 +++ Makefile | 20 +++++++++++++++++++- git-compat-util.h | 17 +++++++++++++++++ meson.build | 32 ++++++++++++++++++++++++++++++++ rust/Cargo.toml | 6 ++++++ rust/interop/Cargo.toml | 14 ++++++++++++++ rust/interop/src/lib.rs | 0 rust/xdiff/Cargo.toml | 15 +++++++++++++++ rust/xdiff/src/lib.rs | 0 9 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 rust/Cargo.toml create mode 100644 rust/interop/Cargo.toml create mode 100644 rust/interop/src/lib.rs create mode 100644 rust/xdiff/Cargo.toml create mode 100644 rust/xdiff/src/lib.rs diff --git a/.gitignore b/.gitignore index 04c444404e4b..ff81e3580c4e 100644 --- a/.gitignore +++ b/.gitignore @@ -254,3 +254,6 @@ Release/ /contrib/buildsystems/out /contrib/libgit-rs/target /contrib/libgit-sys/target +/.idea/ +/rust/target/ +/rust/Cargo.lock diff --git a/Makefile b/Makefile index 70d1543b6b86..db39e6e1c28e 100644 --- a/Makefile +++ b/Makefile @@ -919,6 +919,11 @@ TEST_SHELL_PATH = $(SHELL_PATH) LIB_FILE = libgit.a XDIFF_LIB = xdiff/lib.a +ifeq ($(DEBUG), 1) +RUST_LIB = rust/target/debug/libxdiff.a +else +RUST_LIB = rust/target/release/libxdiff.a +endif REFTABLE_LIB = reftable/libreftable.a GENERATED_H += command-list.h @@ -1392,6 +1397,8 @@ UNIT_TEST_OBJS += $(UNIT_TEST_DIR)/lib-reftable.o GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(LIB_FILE) EXTLIBS = +GITLIBS += $(RUST_LIB) + GIT_USER_AGENT = git/$(GIT_VERSION) ifeq ($(wildcard sha1collisiondetection/lib/sha1.h),sha1collisiondetection/lib/sha1.h) @@ -2925,6 +2932,14 @@ $(LIB_FILE): $(LIB_OBJS) $(XDIFF_LIB): $(XDIFF_OBJS) $(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^ +.PHONY: $(RUST_LIB) +$(RUST_LIB): +ifeq ($(DEBUG), 1) + cd rust && RUSTFLAGS="-Aunused_imports -Adead_code" cargo build --verbose +else + cd rust && RUSTFLAGS="-Aunused_imports -Adead_code" cargo build --verbose --release +endif + $(REFTABLE_LIB): $(REFTABLE_OBJS) $(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^ @@ -3756,7 +3771,10 @@ cocciclean: $(RM) -r .build/contrib/coccinelle $(RM) contrib/coccinelle/*.cocci.patch -clean: profile-clean coverage-clean cocciclean +rustclean: + cd rust && cargo clean + +clean: profile-clean coverage-clean cocciclean rustclean $(RM) -r .build $(UNIT_TEST_BIN) $(RM) GIT-TEST-SUITES $(RM) po/git.pot po/git-core.pot diff --git a/git-compat-util.h b/git-compat-util.h index 4678e21c4cb8..82dc99764ac0 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -196,6 +196,23 @@ static inline int is_xplatform_dir_sep(int c) #include "compat/msvc.h" #endif +/* rust types */ +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + +typedef float f32; +typedef double f64; + +typedef size_t usize; +typedef ptrdiff_t isize; + /* used on Mac OS X */ #ifdef PRECOMPOSE_UNICODE #include "compat/precompose_utf8.h" diff --git a/meson.build b/meson.build index 596f5ac7110e..2d8da17f6515 100644 --- a/meson.build +++ b/meson.build @@ -267,6 +267,36 @@ version_gen_environment.set('GIT_DATE', get_option('build_date')) version_gen_environment.set('GIT_USER_AGENT', get_option('user_agent')) version_gen_environment.set('GIT_VERSION', get_option('version')) +if get_option('optimization') in ['2', '3', 's', 'z'] + rust_target = 'release' + rust_args = ['--release'] + rustflags = '-Aunused_imports -Adead_code' +else + rust_target = 'debug' + rust_args = [] + rustflags = '-Aunused_imports -Adead_code -C debuginfo=2 -C opt-level=1 -C force-frame-pointers=yes' +endif + + +rust_leaf = custom_target('rust_leaf', + output: 'libxdiff.a', + build_by_default: true, + build_always_stale: true, + command: ['cargo', 'build', + '--manifest-path', meson.project_source_root() / 'rust/Cargo.toml' + ] + rust_args, + env: { + 'RUSTFLAGS': rustflags, + }, + install: false, +) + +rust_xdiff_dep = declare_dependency( + link_args: ['-L' + meson.project_source_root() / 'rust/target' / rust_target, '-lxdiff'], +# include_directories: include_directories('xdiff/include'), # Adjust if you expose headers +) + + compiler = meson.get_compiler('c') libgit_sources = [ @@ -1677,6 +1707,8 @@ version_def_h = custom_target( ) libgit_sources += version_def_h +libgit_dependencies += rust_xdiff_dep + libgit = declare_dependency( link_with: static_library('git', sources: libgit_sources, diff --git a/rust/Cargo.toml b/rust/Cargo.toml new file mode 100644 index 000000000000..ed3d79d7f827 --- /dev/null +++ b/rust/Cargo.toml @@ -0,0 +1,6 @@ +[workspace] +members = [ + "xdiff", + "interop", +] +resolver = "2" diff --git a/rust/interop/Cargo.toml b/rust/interop/Cargo.toml new file mode 100644 index 000000000000..045e3b01cfad --- /dev/null +++ b/rust/interop/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "interop" +version = "0.1.0" +edition = "2021" + +[lib] +name = "interop" +path = "src/lib.rs" +## staticlib to generate xdiff.a for use by gcc +## cdylib (optional) to generate xdiff.so for use by gcc +## rlib is required by the rust unit tests +crate-type = ["staticlib", "rlib"] + +[dependencies] diff --git a/rust/interop/src/lib.rs b/rust/interop/src/lib.rs new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/rust/xdiff/Cargo.toml b/rust/xdiff/Cargo.toml new file mode 100644 index 000000000000..eb7966aada64 --- /dev/null +++ b/rust/xdiff/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "xdiff" +version = "0.1.0" +edition = "2021" + +[lib] +name = "xdiff" +path = "src/lib.rs" +## staticlib to generate xdiff.a for use by gcc +## cdylib (optional) to generate xdiff.so for use by gcc +## rlib is required by the rust unit tests +crate-type = ["staticlib", "rlib"] + +[dependencies] +interop = { path = "../interop" } diff --git a/rust/xdiff/src/lib.rs b/rust/xdiff/src/lib.rs new file mode 100644 index 000000000000..e69de29bb2d1 -- gitgitgadget