From 65a416d5146f20b1c86f6f5740cd7d14a1b1146b Mon Sep 17 00:00:00 2001 From: m-jzc Date: Thu, 24 Aug 2023 08:53:51 +0000 Subject: [PATCH] modify README.md shell and libxml2-rust1.py Signed-off-by: m-jzc --- README.md | 88 ++++++++++++++++++++++++++--------------- better/curl-rust-run.sh | 30 ++++++++++---- better/json-c-run.sh | 37 ++++++++++++----- better/libxml2-run.sh | 79 ++++++++++++++++++++++++------------ better/libxml2-rust1.py | 29 +++++++++++++- 5 files changed, 189 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index db3fd4e..6975812 100644 --- a/README.md +++ b/README.md @@ -87,17 +87,17 @@ $ rustup component add rustc-dev ``` -## 五、使用教程——以json-c为例 +## 五、使用教程 ### Step1 - 将C代码翻译为Rust代码 #### 1. 输入-工具-输出 -+ **输入(C代码)**:`~/your_path/c2rust/c-code/json-c` ++ **输入(C代码)**:`~/your_path/c2rust/c-code/your_c_code` + **工具(c2rust)**: `~/your_path/c2rust/c2rust` -+ **输出(初始Rust代码)**:`~/your_path/c2rust/better/test-inputs/jsonc_rust` ++ **输出(初始Rust代码)**:`~/your_path/c2rust/better/test-inputs/your_rust` #### 2. 执行命令 @@ -106,9 +106,9 @@ $ rustup component add rustc-dev > 完整安装教程参考:https://gitee.com/mirrors/C2Rust?_from=gitee_search#installation ```shell -# 前置条件 -$ apt install build-essential llvm clang libclang-dev cmake libssl-dev pkg-config python3 - +# Openeuler中前置条件 +$ yum install llvm clang cmake pkg-config python3 llvm-devel clang-devel openssl-devel +$ yum groupinstall "Development Tools" # 进入翻译前端-c2rust的目录 $ cd ~/your_path/c2rust/c2rust @@ -122,9 +122,9 @@ $ cargo build --release > 通用翻译方法参考:https://gitee.com/mirrors/C2Rust?_from=gitee_search#translating-c-to-rust ```shell -# 1. 给json-c生成compile_commands.json文件 -# 进入json-c测例目录 -$ cd ~/your_path/c2rust/c-code/json-c +# 1. 给your_c_code生成compile_commands.json文件 +# 进入your_c_code测例目录 +$ cd ~/your_path/c2rust/c-code/your_c_code # 生成compile_commands.json $ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 $ make @@ -133,12 +133,12 @@ $ make # 进入翻译前端-c2rust目录 $ cd ~/your_path/c2rust/c2rust # 执行翻译命令 -$ c2rust transpile your_path/c2rust/c-code/json-c/compile_commands.json\ - -e -o your_path/c2rust/better/test-inputs/jsonc_rust +$ c2rust transpile your_path/c2rust/c-code/your_c_code/compile_commands.json\ + -e -o your_path/c2rust/better/test-inputs/your_rust # 3. 验证翻译是否成功(不可以省略,后续优化会使用对应的target目录) # 进入初始Rust代码存放的目录 -$ cd ~/your_path/c2rust/better/test-inputs/jsonc_rust +$ cd ~/your_path/c2rust/better/test-inputs/your_rust # 编译(无报错即转换成功) $ cargo build ``` @@ -147,9 +147,9 @@ $ cargo build #### 1. 输入-工具-输出 -+ **输入(初始Rust代码)**:`~/your_path/c2rust/better/test-inputs/jsonc_rust` ++ **输入(初始Rust代码)**:`~/your_path/c2rust/better/test-inputs/your_rust` + **工具(better - resolve-imports)**:`~/your_path/c2rust/better/src/bin/resolve-imports.rs` -+ **输出(去除重复类型后的Rust代码)**:`~/your_path/c2rust/better/rewrite-workspace/jsonc_rust` ++ **输出(去除重复类型后的Rust代码)**:`~/your_path/c2rust/better/rewrite-workspace/your_rust` #### 2. 执行命令 @@ -159,41 +159,44 @@ $ cargo build # 进入优化工具better目录下 $ cd ~/your_path/c2rust/better -# 从test-inputs/jsonc_rust 复制到 rewrite-workspace/中 -$ cp -r test-inputs/jsonc_rust rewrite-workspace/ +# 从test-inputs/your_rust 复制到 rewrite-workspace/中 +$ cp -r test-inputs/your_rust rewrite-workspace/ ``` + **更改调用参数文件** -`/home/xial/c2rust/better/rewrite-invocations/jsonc_rust`文件中存储关于jsonc_rust的参数信息,分为两部分: +`/home/xial/c2rust/better/rewrite-invocations/your_rust`文件中存储关于your_rust的参数信息,分为两部分: -1. jsonc_rust的lib.rs路径 -2. jsonc_rust的链接库路径,在对应的target路径中 +1. your_rust的lib.rs路径 +2. your_rust的链接库路径,在对应的target路径中 内容应设置为如下所示,***your_path***是使用者自己的路径前缀: -> /***your_path***/c2rust/better/rewrite-workspace/jsonc_rust/lib.rs -> -L all=/***your_path***/c2rust/better/rewrite-workspace/jsonc_rust/target/debug/deps +> /***your_path***/c2rust/better/rewrite-workspace/your_rust/lib.rs +> -L all=/***your_path***/c2rust/better/rewrite-workspace/your_rust/target/debug/deps + **执行resolve-imports算法** ```shell +# 修正resolve-lifetimes中不支持的libc类型 +# json-c-rust.py中的jsonc_rust需改为your_rust +python3 json-c-rust.py # 进入优化工具better目录下 $ cargo clean -$ cargo run --release --bin resolve-imports -- `cat rewrite-invocations/jsonc_rust` +$ cargo run --release --bin resolve-imports -- `cat rewrite-invocations/your_rust` ``` #### 3.算法效果 -对比`better/test-inputs/jsonc_rust`和`better/rewrite-workspace/jsonc_rust` +对比`better/test-inputs/your_rust`和`better/rewrite-workspace/your_rust` ### Step2 - 执行Resolve-LifetimeS算法 #### 1. 输入-工具-输出 -+ **输入(初始Rust代码)**:`~/your_path/c2rust/better/rewrite-workspace/jsonc_rust` ++ **输入(初始Rust代码)**:`~/your_path/c2rust/better/rewrite-workspace/your_rust` + **工具(better - resolve-imports)**:`~/your_path/c2rust/better/src/bin/resolve-lifetimes.rs` -+ **输出(去除重复类型后的Rust代码)**:`~/your_path/c2rust/better/rewrite-workspace/jsonc_rust` ++ **输出(去除重复类型后的Rust代码)**:`~/your_path/c2rust/better/rewrite-workspace/your_rust` #### 2. 执行命令 @@ -202,33 +205,56 @@ $ cargo run --release --bin resolve-imports -- `cat rewrite-invocations/jsonc_ru ```shell # 进入优化工具better目录下 $ cargo clean -$ cargo run --release --bin resolve-lifetimes -- `cat rewrite-invocations/jsonc_rust` +$ cargo run --release --bin resolve-lifetimes -- `cat rewrite-invocations/your_rust` ``` #### 3. 算法效果 -对比`better/test-inputs/jsonc_rust`和`better/rewrite-workspace/jsonc_rust` +对比`better/test-inputs/your_rust`和`better/rewrite-workspace/your_rust` ### Step3 - 执行unsafe-fixer算法 #### 1. 输入-工具-输出 -+ **输入(初始Rust代码)**:`~/your_path/c2rust/better/rewrite-workspace/jsonc_rust` ++ **输入(初始Rust代码)**:`~/your_path/c2rust/better/rewrite-workspace/your_rust` + **工具(better - resolve-imports)**:`~/your_path/c2rust/unsafe-fixer` -+ **输出(去除重复类型后的Rust代码)**:`~/your_path/c2rust/better/rewrite-workspace/jsonc_rust` ++ **输出(去除重复类型后的Rust代码)**:`~/your_path/c2rust/better/rewrite-workspace/your_rust` #### 2. 执行命令 + **执行unsafe-fixer算法** ```shell +# 修正unsafe-fixer中不支持的let ref 和 let ref mut类型 +python3 json-c-rust.py # 进入优化工具unsafe-fixer目录下 $ cargo clean $ cargo build --release -$ target/release/unsafe-fixer /your_path/c2rust/better/rewrite-workspace/jsonc_rust +$ target/release/unsafe-fixer /your_path/c2rust/better/rewrite-workspace/your_rust ``` #### 3. 算法效果 -对比`better/test-inputs/jsonc_rust`和`better/rewrite-workspace/jsonc_rust` +对比`better/test-inputs/your_rust`和`better/rewrite-workspace/your_rust` + +### Step4 - 编译结果进行验证 + +#### 1. 执行命令 + ++ **编译最终结果** + +```shell +# 保存结果 +cd better +rm -r result/your_rust +cp -r rewrite-workspace/your_rust result/ + +# 编译结果 +cd result/your_rust +cargo clean +cargo build +``` + +#### 2. 算法效果 +验证编译是否报错 \ No newline at end of file diff --git a/better/curl-rust-run.sh b/better/curl-rust-run.sh index ee9a07d..9530ef6 100755 --- a/better/curl-rust-run.sh +++ b/better/curl-rust-run.sh @@ -1,22 +1,23 @@ #!/bin/bash -rm curl-rust.txt +#rm curl-rust.txt rm -r rewrite-workspace/curl-rust # rewrite unsafe-rust in rewrite-workspace cp -r test-inputs/curl-rust rewrite-workspace/ cd rewrite-workspace/curl-rust cargo clean -cargo build +cargo build &>/dev/null cd ../.. # 更改运行路径 # 修正resolve-lifetimes中不支持的libc类型 -# 修正unsafe-fixer中不支持的let ref 和 let ref mut类型 python3 curl-rust.py # (1) resolve-imports # export RUST_LOG=debug -cargo run --release --bin resolve-imports -- `cat rewrite-invocations/curl-rust` >curl-imports.txt +echo "Running resolve-imports..." +cargo run --release --bin resolve-imports -- `cat rewrite-invocations/curl-rust` &>/dev/null +echo "Finish running resolve-imports..." # save to ./after-resolve-imports rm -r after-resolve-imports/curl-rust cp -r rewrite-workspace/curl-rust after-resolve-imports/ @@ -27,25 +28,38 @@ rm -r rewrite-workspace/curl-rust cp -r after-resolve-imports/expand_bitfield/curl-rust rewrite-workspace/ cd rewrite-workspace/curl-rust cargo clean -cargo build +cargo build &>/dev/null cd ../.. # (2) resolve-lifetimes # save to after-resolve-lifetimes # export RUST_LOG=debug -cargo run --release --bin resolve-lifetimes -- -f --merge-field-lifetimes `cat rewrite-invocations/curl-rust` >> curl-rust.txt +echo "Running resolve-lifetimes..." +cargo run --release --bin resolve-lifetimes -- -f --merge-field-lifetimes `cat rewrite-invocations/curl-rust` &>/dev/null +echo "Finish running resolve-lifetimes..." + # save to after-resolve-lifetimes rm -r after-resolve-lifetimes/curl-rust cp -r rewrite-workspace/curl-rust after-resolve-lifetimes/ # (3) run unsafe-fixer +# 修正unsafe-fixer中不支持的let ref 和 let ref mut类型 +python3 curl-rust.py cd .. cd unsafe-fixer cargo clean -cargo build --release +cargo build --release &>/dev/null cd .. +echo "Running unsafe-fixer..." unsafe-fixer/target/release/unsafe-fixer better/rewrite-workspace/curl-rust +echo "Finish running unsafe-fixer..." + # 保存结果 cd better rm -r result/curl-rust -cp -r rewrite-workspace/curl-rust result/ \ No newline at end of file +cp -r rewrite-workspace/curl-rust result/ + +# 编译结果 +cd result/curl-rust +cargo clean +cargo build \ No newline at end of file diff --git a/better/json-c-run.sh b/better/json-c-run.sh index 772cb92..61f9b2a 100755 --- a/better/json-c-run.sh +++ b/better/json-c-run.sh @@ -1,43 +1,62 @@ #!/bin/bash +# start_time=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"` -rm jsonc_rust.txt +#rm jsonc_rust.txt rm -r rewrite-workspace/jsonc_rust # rewrite unsafe-rust in rewrite-workspace cp -r test-inputs/jsonc_rust rewrite-workspace/ cd rewrite-workspace/jsonc_rust cargo clean -cargo build +cargo build &>/dev/null cd ../.. # 更改运行路径 + # 修正resolve-lifetimes中不支持的libc类型 -# 修正unsafe-fixer中不支持的let ref 和 let ref mut类型 python3 json-c-rust.py # (1) run resolve-imports -# export RUST_LOG=debug -RUST_BACKTRACE=1 cargo run --release --bin resolve-imports -- `cat rewrite-invocations/jsonc_rust` > jsonc_rust.txt +echo "Running resolve-imports..." +RUST_BACKTRACE=1 cargo run --release --bin resolve-imports -- `cat rewrite-invocations/jsonc_rust` &>/dev/null +echo "Finish running resolve-imports..." # save to ./after-resolve-imports rm -r after-resolve-imports/jsonc_rust cp -r rewrite-workspace/jsonc_rust after-resolve-imports/ # (2) run resolve-lifetimes -# export RUST_LOG=debug -RUST_BACKTRACE=1 cargo run --release --bin resolve-lifetimes -- -f --merge-field-lifetimes `cat rewrite-invocations/jsonc_rust` > jsonc_rust.txt +echo "Running resolve-lifetimes..." +RUST_BACKTRACE=1 cargo run --release --bin resolve-lifetimes -- -f --merge-field-lifetimes `cat rewrite-invocations/jsonc_rust` &>/dev/null +echo "Finish running resolve-lifetimes..." # save to after-resolve-lifetimes rm -r after-resolve-lifetimes/jsonc_rust cp -r rewrite-workspace/jsonc_rust after-resolve-lifetimes/ - +# 修正unsafe-fixer中不支持的let ref 和 let ref mut类型 +python3 json-c-rust.py # # (3) run unsafe-fixer cd .. cd unsafe-fixer cargo clean -cargo build --release +cargo build --release &>/dev/null cd .. +echo "Running unsafe-fixer..." unsafe-fixer/target/release/unsafe-fixer better/rewrite-workspace/jsonc_rust +echo "Finish running unsafe-fixer..." # 保存结果 cd better rm -r result/jsonc_rust cp -r rewrite-workspace/jsonc_rust result/ +# 编译结果 +cd result/jsonc_rust +cargo clean +cargo build + + +#finish_time=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"` + +#duration=$(($(($(date +%s -d "$finish_time")-$(date +%s -d "$start_time"))))) + +#rm -f jsontime.txt +#touch jsontime.txt +#echo "this shell script execution duration: $duration" > jsontime.txt diff --git a/better/libxml2-run.sh b/better/libxml2-run.sh index 6035435..6398d5d 100755 --- a/better/libxml2-run.sh +++ b/better/libxml2-run.sh @@ -1,30 +1,34 @@ #!/bin/bash -rm libxml2_rust.txt +#start_time=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"` + +#rm libxml2_rust.txt rm -r rewrite-workspace/libxml2_rust # rewrite unsafe-rust in rewrite-workspace -cp -r test-inputs/libxml2_rust rewrite-workspace/ -cd rewrite-workspace/libxml2_rust -cargo clean -cargo build -cd ../.. +# resolve-lifetimes不支持bitfield扩展包,需要手动对源代码进行bitfield展开 +# test-inputs/test-inputs-fixer/libxml2_rust存放已展开后的代码 +cp -r test-inputs/test-inputs-fixer/libxml2_rust rewrite-workspace/ +# cd rewrite-workspace/libxml2_rust +# cargo clean +# cargo build +# cd ../.. # 更改运行路径 # 修正resolve-lifetimes中不支持的libc类型 # 修正unsafe-fixer中不支持的let ref 和 let ref mut类型 -python3 libxml2_rust1.py +python3 libxml2-rust1.py # (1) resolve-imports # export RUST_LOG=debug -cargo run --release --bin resolve-imports -- `cat rewrite-invocations/libxml2_rust` >curl-imports.txt +# cargo run --release --bin resolve-imports -- `cat rewrite-invocations/libxml2_rust` >curl-imports.txt # save to ./after-resolve-imports -rm -r after-resolve-imports/libxml2_rust -cp -r rewrite-workspace/libxml2_rust after-resolve-imports/ +# rm -r after-resolve-imports/libxml2_rust +# cp -r rewrite-workspace/libxml2_rust after-resolve-imports/ # resolve-lifetimes不支持bitfield扩展包,需要手动对源代码进行bitfield展开 # after-resolve-imports/expand_bitfield/curl-rust存放已展开后的代码 -rm -r rewrite-workspace/libxml2_rust -cp -r after-resolve-imports/expand_bitfield/libxml2_rust rewrite-workspace/ +# rm -r rewrite-workspace/libxml2_rust +# cp -r after-resolve-imports/expand_bitfield/libxml2_rust rewrite-workspace/ # (2) resolve-lifetimes @@ -33,28 +37,37 @@ cp -r after-resolve-imports/expand_bitfield/libxml2_rust rewrite-workspace/ cp patch/libxml2/part1/lib.rs rewrite-workspace/libxml2_rust cd rewrite-workspace/libxml2_rust cargo clean -cargo build +cargo build &>/dev/null cd ../.. -# export RUST_LOG=debug -cargo run --release --bin resolve-imports -- `cat rewrite-invocations/libxml2_rust` -cargo run --release --bin resolve-lifetimes -- -f --merge-field-lifetimes `cat rewrite-invocations/libxml2_rust` +echo "Running resolve-imports..." +cargo run --release --bin resolve-imports -- `cat rewrite-invocations/libxml2_rust` &>/dev/null +echo "Finish running resolve-imports..." +echo "Running resolve-lifetimes..." +cargo run --release --bin resolve-lifetimes -- -f --merge-field-lifetimes `cat rewrite-invocations/libxml2_rust` &>/dev/null +echo "Finish running resolve-lifetimes..." + # part-2 cp patch/libxml2/part2/lib.rs rewrite-workspace/libxml2_rust cd rewrite-workspace/libxml2_rust cargo clean -cargo build +cargo build &>/dev/null cd ../.. -# export RUST_LOG=debug -cargo run --release --bin resolve-imports -- `cat rewrite-invocations/libxml2_rust` -cargo run --release --bin resolve-lifetimes -- -f --merge-field-lifetimes `cat rewrite-invocations/libxml2_rust` +echo "Running resolve-imports..." +cargo run --release --bin resolve-imports -- `cat rewrite-invocations/libxml2_rust` &>/dev/null +echo "Finish running resolve-imports..." +echo "Running resolve-lifetimes..." +cargo run --release --bin resolve-lifetimes -- -f --merge-field-lifetimes `cat rewrite-invocations/libxml2_rust` &>/dev/null +echo "Finish running resolve-lifetimes..." + # part-3 cp patch/libxml2/part3/lib.rs rewrite-workspace/libxml2_rust cd rewrite-workspace/libxml2_rust cargo clean -cargo build +cargo build &>/dev/null cd ../.. -# export RUST_LOG=debug -cargo run --release --bin resolve-imports -- `cat rewrite-invocations/libxml2_rust` +echo "Running resolve-imports..." +cargo run --release --bin resolve-imports -- `cat rewrite-invocations/libxml2_rust` &>/dev/null +echo "Finish running resolve-imports..." # save to after-resolve-lifetimes rm -r after-resolve-lifetimes/libxml2_rust @@ -62,14 +75,30 @@ cp -r rewrite-workspace/libxml2_rust after-resolve-lifetimes/ # (3) run unsafe-fixer -python3 libxml2_rust2.py +# 修正unsafe-fixer中不支持的let ref 和 let ref mut类型 +python3 libxml2-rust1.py +cp patch/libxml2/part_all/lib.rs rewrite-workspace/libxml2_rust cd .. cd unsafe-fixer cargo clean -cargo build --release +cargo build --release &>/dev/null cd .. +echo "Running unsafe-fixer..." unsafe-fixer/target/release/unsafe-fixer better/rewrite-workspace/libxml2_rust +echo "Finish running unsafe-fixer..." + # 保存结果 cd better rm -r result/libxml2_rust cp -r rewrite-workspace/libxml2_rust result/ + +# 编译结果 +cd result/libxml2_rust +cargo clean +cargo build + +#finish_time=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"` + +#duration=$(($(($(date +%s -d "$finish_time")-$(date +%s -d "$start_time"))))) +#touch libxmltime.txt +#echo "this shell script execution duration: $duration">libxmltime.txt diff --git a/better/libxml2-rust1.py b/better/libxml2-rust1.py index a82377d..4fe0228 100755 --- a/better/libxml2-rust1.py +++ b/better/libxml2-rust1.py @@ -1,6 +1,31 @@ import os import re +pattern_1 = r"let\s+ref\s+mut\s+(\w+)\s*=\s*([\s\S]*?);" +pattern_2 = r"let\s+ref\s+(\w+)\s*=\s*(.*);" + +def replace_pattern_1(dir_path): + for root, dirs, files in os.walk(dir_path): + for file in files: + if os.path.splitext(file)[1] == '.rs': + file_path = os.path.join(root, file) + with open(file_path, 'r') as f: + content = f.read() + result = re.sub(pattern_1, r"let \1 = &mut (\2);", content) + with open(file_path, 'w') as f: + f.write(result) + +def replace_pattern_2(dir_path): + for root, dirs, files in os.walk(dir_path): + for file in files: + if os.path.splitext(file)[1] == '.rs': + file_path = os.path.join(root, file) + with open(file_path, 'r') as f: + content = f.read() + result = re.sub(pattern_2, r"let \1 = &(\2);", content) + with open(file_path, 'w') as f: + f.write(result) + def replace_text(dir_path, old_text, new_text): for root, dirs, files in os.walk(dir_path): for file in files: @@ -32,6 +57,8 @@ def main(): replace_text(work_dir, 'libc::c_schar', 'i8') replace_text(work_dir, 'libc::c_double', 'f64') replace_text(work_dir, 'libc::c_float', 'f32') + replace_pattern_1(work_dir) + replace_pattern_2(work_dir) if __name__ == "__main__": - main() \ No newline at end of file + main() -- Gitee