Browse Source

feat: rust-ffi framework

master
Dnomd343 2 years ago
parent
commit
3ed08b5a2b
  1. 1
      .gitignore
  2. 2
      src/CMakeLists.txt
  3. 39
      src/klotski/CMakeLists.txt
  4. 4
      src/klotski/all_cases/CMakeLists.txt
  5. 4
      src/klotski/analyse/CMakeLists.txt
  6. 4
      src/klotski/benchmark/CMakeLists.txt
  7. 4
      src/klotski/common_code/CMakeLists.txt
  8. 2
      src/klotski/core/CMakeLists.txt
  9. 4
      src/klotski/fast_cal/CMakeLists.txt
  10. 14
      src/klotski/ffi/tmain.cc
  11. 4
      src/klotski/raw_code/CMakeLists.txt
  12. 4
      src/klotski/short_code/CMakeLists.txt
  13. 2
      src/klotski/utils/CMakeLists.txt
  14. 3
      src/main.c
  15. 242
      src/rust_ffi/Cargo.lock
  16. 11
      src/rust_ffi/Cargo.toml
  17. 26
      src/rust_ffi/build.rs
  18. 18
      src/rust_ffi/src/main.rs
  19. 3
      src/rust_ffi/wrapper.h
  20. 4
      test/CMakeLists.txt

1
.gitignore

@ -2,4 +2,5 @@
/.idea/
/cmake-build-debug/
/cmake-build-release/
/src/rust_ffi/target/
/src/klotski/utils/version.h

2
src/CMakeLists.txt

@ -7,4 +7,4 @@ include_directories(klotski/ffi)
add_subdirectory(klotski)
add_executable(cli main.c)
target_link_libraries(cli PUBLIC klotski)
target_link_libraries(cli PRIVATE klotski)

39
src/klotski/CMakeLists.txt

@ -2,7 +2,10 @@ cmake_minimum_required(VERSION 3.0)
project(klotski-core VERSION 0.0.1 LANGUAGES CXX)
configure_file(utils/version.h.in ${PROJECT_SOURCE_DIR}/utils/version.h)
configure_file(
utils/version.h.in
${PROJECT_SOURCE_DIR}/utils/version.h
)
set(CMAKE_CXX_STANDARD 14)
@ -42,26 +45,28 @@ set(FFI_SRC codec.cc tmain.cc version.cc)
list(TRANSFORM FFI_SRC PREPEND "ffi/")
add_library(klotski-ffi OBJECT ${FFI_SRC})
option(SHARED_LIB "build static library" ON)
if (SHARED_LIB)
add_library(klotski SHARED $<TARGET_OBJECTS:klotski-ffi>)
else()
add_library(klotski STATIC $<TARGET_OBJECTS:klotski-ffi>)
endif()
set(OBJS $<TARGET_OBJECTS:klotski-ffi>)
################################################################
list(APPEND OBJS $<TARGET_OBJECTS:utils>)
list(APPEND OBJS $<TARGET_OBJECTS:all_cases>)
target_link_libraries(klotski PRIVATE utils)
target_link_libraries(klotski PRIVATE all_cases)
list(APPEND OBJS $<TARGET_OBJECTS:raw_code>)
list(APPEND OBJS $<TARGET_OBJECTS:short_code>)
list(APPEND OBJS $<TARGET_OBJECTS:common_code>)
target_link_libraries(klotski PRIVATE raw_code)
target_link_libraries(klotski PRIVATE short_code)
target_link_libraries(klotski PRIVATE common_code)
list(APPEND OBJS $<TARGET_OBJECTS:core>)
list(APPEND OBJS $<TARGET_OBJECTS:analyse>)
list(APPEND OBJS $<TARGET_OBJECTS:fast_cal>)
target_link_libraries(klotski PRIVATE core)
target_link_libraries(klotski PRIVATE analyse)
target_link_libraries(klotski PRIVATE fast_cal)
list(APPEND OBJS $<TARGET_OBJECTS:benchmark>)
target_link_libraries(klotski PRIVATE benchmark)
################################################################
option(STATIC_LIB "build static library" ON)
if (STATIC_LIB)
add_library(klotski STATIC ${OBJS})
else()
add_library(klotski SHARED ${OBJS})
endif()
################################################################

4
src/klotski/all_cases/CMakeLists.txt

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0)
add_library(all_cases STATIC all_cases.cc basic_ranges.cc)
target_link_libraries(all_cases PUBLIC utils)
add_library(all_cases OBJECT all_cases.cc basic_ranges.cc)
#target_link_libraries(all_cases PUBLIC utils)

4
src/klotski/analyse/CMakeLists.txt

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0)
add_library(analyse STATIC analyse.cc backtrack.cc)
target_link_libraries(analyse PUBLIC core)
add_library(analyse OBJECT analyse.cc backtrack.cc)
#target_link_libraries(analyse PUBLIC core)

4
src/klotski/benchmark/CMakeLists.txt

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0)
add_library(benchmark STATIC chore.cc benchmark.cc)
target_link_libraries(benchmark PUBLIC all_cases)
add_library(benchmark OBJECT chore.cc benchmark.cc)
#target_link_libraries(benchmark PUBLIC all_cases)

4
src/klotski/common_code/CMakeLists.txt

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0)
add_library(common_code STATIC convert.cc serialize.cc common_code.cc)
target_link_libraries(common_code PUBLIC utils)
add_library(common_code OBJECT convert.cc serialize.cc common_code.cc)
#target_link_libraries(common_code PUBLIC utils)

2
src/klotski/core/CMakeLists.txt

@ -1,3 +1,3 @@
cmake_minimum_required(VERSION 3.0)
add_library(core STATIC core.cc)
add_library(core OBJECT core.cc)

4
src/klotski/fast_cal/CMakeLists.txt

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0)
add_library(fast_cal STATIC cal_core.cc fast_cal.cc)
target_link_libraries(fast_cal PUBLIC core)
add_library(fast_cal OBJECT cal_core.cc fast_cal.cc)
#target_link_libraries(fast_cal PUBLIC core)

14
src/klotski/ffi/tmain.cc

@ -1,12 +1,11 @@
#include <cstdio>
#include <cstdint>
#include <iostream>
//#include <iostream>
#include "klotski.h"
//#include "core.h"
#include "common.h"
//#include "common.h"
#include "benchmark.h"
#include "all_cases.h"
@ -16,13 +15,16 @@ using namespace klotski;
void tmain() {
printf("tmain start\n");
std::cout << ALL_CASES_SIZE_SUM << std::endl;
printf("%d\n", ALL_CASES_SIZE_SUM);
// std::cout << ALL_CASES_SIZE_SUM << std::endl;
// uint64_t common_code = 0x1A9BC0C00;
// klotski::Common::range_reverse(common_code);
std::cout << Benchmark::basic_ranges(Benchmark::MS) << std::endl;
std::cout << Benchmark::all_cases(Benchmark::MS) << std::endl;
printf("%f\n", Benchmark::basic_ranges(Benchmark::MS));
printf("%f\n", Benchmark::all_cases(Benchmark::MS));
// std::cout << Benchmark::basic_ranges(Benchmark::MS) << std::endl;
// std::cout << Benchmark::all_cases(Benchmark::MS) << std::endl;
printf("tmain exit\n");
}

4
src/klotski/raw_code/CMakeLists.txt

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0)
add_library(raw_code STATIC convert.cc raw_code.cc)
target_link_libraries(raw_code PUBLIC utils)
add_library(raw_code OBJECT convert.cc raw_code.cc)
#target_link_libraries(raw_code PUBLIC utils)

4
src/klotski/short_code/CMakeLists.txt

@ -2,5 +2,5 @@ cmake_minimum_required(VERSION 3.0)
include_directories(offset)
add_library(short_code STATIC convert.cc serialize.cc short_code.cc)
target_link_libraries(short_code PUBLIC utils all_cases)
add_library(short_code OBJECT convert.cc serialize.cc short_code.cc)
#target_link_libraries(short_code PUBLIC utils all_cases)

2
src/klotski/utils/CMakeLists.txt

@ -1,3 +1,3 @@
cmake_minimum_required(VERSION 3.0)
add_library(utils STATIC common.cc)
add_library(utils OBJECT common.cc)

3
src/main.c

@ -4,7 +4,8 @@
int main() {
// printf("cli boot\n");
// tmain();
tmain();
return 0;
// bool ret = common_code_check(0x1A9BF0C00);
// printf("result -> %d\n", ret);

242
src/rust_ffi/Cargo.lock

@ -0,0 +1,242 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "bindgen"
version = "0.63.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36d860121800b2a9a94f9b5604b332d5cffb234ce17609ea479d723dbc9d3885"
dependencies = [
"bitflags",
"cexpr",
"clang-sys",
"lazy_static",
"lazycell",
"log",
"peeking_take_while",
"proc-macro2",
"quote",
"regex",
"rustc-hash",
"shlex",
"syn",
"which",
]
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "cexpr"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
dependencies = [
"nom",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "clang-sys"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3"
dependencies = [
"glob",
"libc",
"libloading",
]
[[package]]
name = "either"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
[[package]]
name = "glob"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
name = "klotski_ffi"
version = "0.1.0"
dependencies = [
"bindgen",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "lazycell"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "libc"
version = "0.2.139"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
[[package]]
name = "libloading"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
dependencies = [
"cfg-if",
"winapi",
]
[[package]]
name = "log"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
]
[[package]]
name = "memchr"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
"memchr",
"minimal-lexical",
]
[[package]]
name = "once_cell"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66"
[[package]]
name = "peeking_take_while"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
[[package]]
name = "proc-macro2"
version = "1.0.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
dependencies = [
"proc-macro2",
]
[[package]]
name = "regex"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
dependencies = [
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.6.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "shlex"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
[[package]]
name = "syn"
version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
[[package]]
name = "which"
version = "4.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
dependencies = [
"either",
"libc",
"once_cell",
]
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

11
src/rust_ffi/Cargo.toml

@ -0,0 +1,11 @@
[package]
name = "klotski_ffi"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
[build-dependencies]
bindgen = "0.63.0"

26
src/rust_ffi/build.rs

@ -0,0 +1,26 @@
extern crate bindgen;
use std::env;
use std::path::PathBuf;
const RELEASE_DIR: &str = "../../cmake-build-release/src/klotski";
fn main() {
// basic compile options
println!("cargo:rustc-link-search={}", RELEASE_DIR);
println!("cargo:rustc-link-lib=static=klotski");
println!("cargo:rerun-if-changed=wrapper.h");
println!("cargo:rustc-link-lib=stdc++");
// build binding info from c-header file
let bindings = bindgen::Builder::default()
.header("wrapper.h")
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
.generate()
.expect("Unable to generate bindings");
// release binding rust source code
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings");
}

18
src/rust_ffi/src/main.rs

@ -0,0 +1,18 @@
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
#![allow(non_upper_case_globals)]
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
use std::env;
fn klotski_tmain() {
unsafe {
tmain();
}
}
fn main() {
println!("rust start");
klotski_tmain();
println!("rust exit");
}

3
src/rust_ffi/wrapper.h

@ -0,0 +1,3 @@
#pragma once
#include "../klotski/ffi/klotski.h"

4
test/CMakeLists.txt

@ -14,7 +14,7 @@ add_library(md5 STATIC ../third_party/md5/md5.cpp)
include_directories(../src/klotski/utils)
add_executable(test_utils utils.cc)
target_link_libraries(test_utils PUBLIC gtest gtest_main)
target_link_libraries(test_utils PUBLIC utils)
target_link_libraries(test_utils PUBLIC klotski)
add_test(NAME utils COMMAND test_utils)
################################################################
@ -22,7 +22,7 @@ add_test(NAME utils COMMAND test_utils)
include_directories(../src/klotski/all_cases)
add_executable(test_all_cases all_cases.cc)
target_link_libraries(test_all_cases PUBLIC gtest gtest_main)
target_link_libraries(test_all_cases PUBLIC md5 all_cases)
target_link_libraries(test_all_cases PUBLIC klotski md5)
add_test(NAME all_cases COMMAND test_all_cases)
################################################################

Loading…
Cancel
Save