自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何精準(zhǔn)的收集所有 MDK 源代碼文件?一個腳本搞定

開發(fā) 前端
有些工程,可能包含了一大堆文件(比如 rt-thread 工程),你可能并不需要它們,但是卻一直保留在你的工程目錄中,想刪掉又怕刪錯,一個個整理又太麻煩。

[[409413]]

本文轉(zhuǎn)載自微信公眾號「魚鷹談單片機」,作者魚鷹Osprey。轉(zhuǎn)載本文請聯(lián)系魚鷹談單片機公眾號。

標(biāo)題

有些工程,可能包含了一大堆文件(比如 rt-thread 工程),你可能并不需要它們,但是卻一直保留在你的工程目錄中,想刪掉又怕刪錯,一個個整理又太麻煩。

還有就是,當(dāng)你使用 SI(source insight) 看源代碼時,因為你不知道哪些文件才是你當(dāng)前文件需要的,所以只能一股腦把所有的源文件添加到工程里面了。

然后你會發(fā)現(xiàn),一個 main 函數(shù)有多處定義了,你都不知道哪個文件的 main 函數(shù)才是正主(在看 linux 源代碼時亦是如此,根本不知道哪些文件被編譯進(jìn)內(nèi)核了)。并且 SI 同步時間也大大延長了,本來幾秒鐘就能完成同步的,可能就需要十幾秒,幾十秒。

有沒有好的方法把 MDK 工程里面包含的文件提取出來呢?

當(dāng)然有。

最近魚鷹寫了一個腳本,專門干這事,通過在 git bash 中執(zhí)行這個腳本,就可以完成提取工作(包括匯編文件、C 文件、包含的頭文件)。

匯編文件和C 文件我們可以通過打開 *.uvopt 文件找到對應(yīng)的文件路徑。

但是頭文件咋辦?

我們知道 MDK 工程可以編譯可以通過,那么 MDK 肯定知道頭文件在哪找,所以我們需要想辦法找到這些信息。

然后我們可以在 Objects 文件夾里面的 *.d 文件中找到對應(yīng)的頭文件路徑(每一個源文件都有一個對應(yīng)的 *.d 文件存在,比如上面的 main.c 對應(yīng)的文件就是 main.d)。

使用記事本打開 main.d 文件:

我們可以看到 main.d 文件的第一項就是 C 文件,后面的就是頭文件路徑了,因為目前這個文件只包含了一個頭文件 S3C2440.h ,所以這個 main.d 文件里面只有一個頭文件信息。

所以我們的腳本要做的事情很簡單,就是把所有源文件的 *.d 文件信息收集起來,然后進(jìn)行適當(dāng)?shù)奶幚砭涂梢粤恕?/p>

腳本如下:

  1. #!/bin/bash 
  2. # Author: Osprey 
  3. # 本腳本用于生成 MDK 包含的源文件信息  
  4. # 必須使用 MDK 編譯后,在工程文件目錄下執(zhí)行本腳本 
  5.                
  6. dir_obj=./obj           # *.d 文件所在目錄  
  7. out_file_name=absolute_files.txt     # 輸出文件名(絕對路徑) 
  8. relative_out_file_name=relative_files.txt     # 輸出文件名(相對路徑) 
  9. ###當(dāng)前路徑處理 
  10.  
  11. # 斜杠替換為反斜杠  \ 也是特殊字符,需要轉(zhuǎn)義   操作 `` 有問題 
  12. curr_dir=`pwd`/ 
  13. echo ${curr_dir} | sed 's/\//\\/g' > ${out_file_name} && curr_dir=`cat ${out_file_name}`  
  14. curr_dir=${curr_dir#*\\}  # 去除第一個斜杠 
  15. # 第一個反斜杠替換    :\  
  16. echo ${curr_dir} | sed 's/\\/:\\/' > ${out_file_name} && curr_dir=`cat ${out_file_name}` 
  17.  
  18. # 替換 \ 為 \\ 防止 sed 命令出錯 
  19. echo ${curr_dir} | sed 's/\\/\\\\/g' > ${out_file_name} && curr_dir=`cat ${out_file_name}` 
  20.  
  21. echo "curr dir: ${curr_dir}" 
  22.  
  23. # *.d 文件中包含了源文件信息所以不需要從 *.uvoptx 中提取,下面這些 if 里面的命令沒有意義 
  24. if false ; then 
  25.     dir_uvoptx=./  
  26.     file_uvoptx=`find ${dir_uvoptx} -name "*.uvoptx"
  27.     echo "file the name: ${file_uvoptx}" 
  28.  
  29.     sed -i "s/      <PathWithFileName>/"${curr_dir}"/g" ${out_file_name} 
  30.     sed -i  's/<\/PathWithFileName>//g' ${out_file_name} 
  31. fi 
  32.  
  33. # 首先進(jìn)入目錄 
  34. cd ${dir_obj} 
  35.  
  36. temp_file_name=temp_files.txt 
  37. find ./ -name "*.d" | xargs cat > head_temp.txt # 合并所有 d 文件 
  38.  
  39. if [[ ! -s head_temp.txt ]]  
  40. then 
  41.   echo "file is null, please build the project"  # 文件空白 
  42.   exit 0 
  43. fi 
  44.  
  45. # 去除重復(fù)文件,并排序 
  46. sort -u head_temp.txt > head_temp1.txt 
  47. # 去除標(biāo)準(zhǔn)頭文件  搜索關(guān)鍵 ':\' (包含了標(biāo)準(zhǔn)頭文件),分隔符 ':' 去除 *.O 文件名                   'o: ..'   'o: \.\.'  
  48. cat head_temp1.txt | grep -v ':\\' | awk -F ": " '{print $2}' > head_temp.txt  
  49.  
  50.  
  51. # 替換 / 為 \  
  52. sed -i 's/\//\\/g' head_temp.txt 
  53.  
  54.  
  55. # 添加絕對路徑 
  56. absolute_files=../${out_file_name} 
  57. echo "add absolute dir: ${curr_dir}"  # 雙反斜杠是為了防止 sed 命令出錯 
  58. #行首(^ 代表行首)添加絕對路徑字符串 
  59. sed "s/^/"${curr_dir}"/g" head_temp.txt > ${absolute_files}   
  60. # 添加相對路徑(去除 ..\ )必須用單引號(根據(jù) SI 工程的情況決定是否去除 ..\) 
  61. relative_files=../${relative_out_file_name} 
  62. sed 's:\.\.\\::g' head_temp.txt > ${relative_files}  
  63.  
  64. rm head_temp.txt head_temp1.txt  # 刪除文件 
  65.  
  66. cnt=`wc ${absolute_files} | awk '{print $2}'`  # 計文件數(shù) 
  67.  
  68. echo "all files is saved in file: ${absolute_files##*/} && ${relative_files##*/}, files number is: ${cnt} " 

這個腳本會在當(dāng)前目錄下生成兩個文件,absolute_files.txt 和 relative_files.txt ,里面包含了兩種路徑信息,如果使用相對路徑的話,可以使用 relative_files.txt 導(dǎo)入到 SI 工程中,比如通過下面的 “add from list”導(dǎo)入這個文件 relative_files.txt:

那么如何使用這個腳本呢?

特別注意,工程路徑中不要有中文,否則執(zhí)行失敗(下面的截圖路徑是中文,所以會失敗)

0、編譯 MDK ,產(chǎn)生 *.d 文件

1、把腳本保存到一個文件中,比如 mdk_list.sh

2、將腳本復(fù)制到工程目錄下

修改腳本的 *.d 文件夾路徑,這里的路徑為 obj,

3、打開 git bash

4、執(zhí)行剛才的腳本(這里的后綴可以隨便,沒有關(guān)系),可以在腳本目錄下生成兩個文件

  1. ./mdk_lsit.sh.txt 

生成的頭文件路徑中不存在標(biāo)準(zhǔn)頭文件(可自行修改腳本支持),因為這個一般在 MDK 安裝目錄下,所以就去除了這些信息。

5、可以打開文件查看信息:

絕對路徑:

相對路徑:

特別注意:在使用 SI 導(dǎo)入該文件時,SI 工程路徑必須和 MDK 工程保持一致。

即下面兩個文件(夾)必須在同一目錄下才能順利添加進(jìn)去。

如果 MDK 工程文件在子文件夾下,那么 SI 工程也必須在子文件夾下,否則 SI 導(dǎo)入時將失敗,畢竟在使用相對路徑時,不能找到對應(yīng)文件當(dāng)然會失敗,但是使用絕對路徑?jīng)]有這個要求,但會影響 SI 工程的使用(不能隨便移動工程或者重命名),可以自行修改腳本功能使其適用與不同情況。

總之,基本的腳本功能和思路已經(jīng)提供給大家了,如何根據(jù)實際情況修改就是各位道友的問題了,建議大家簡單學(xué)習(xí)一下這些腳本知識,可以幫助大家很方便的處理一些簡單工作,比如替換、搜索、重命名、計數(shù)、數(shù)字比較等功能。

最后友情提醒,刪除源文件時,需要有備份或者 git 管理,否則刪錯了可就后悔莫及了。

 

責(zé)任編輯:武曉燕 來源: 魚鷹談單片機
相關(guān)推薦

2019-12-30 11:07:02

Https免費腳本

2017-09-15 15:13:33

效果設(shè)備UI

2009-07-07 16:22:13

JDK5.0源代碼

2022-06-23 08:42:08

配置加密解密

2022-05-26 10:42:30

數(shù)據(jù)權(quán)限注解

2025-01-08 08:00:00

2022-06-14 10:47:27

項目日志PUT

2014-07-08 09:27:24

SQLSERVER腳本

2022-06-29 09:02:31

go腳本解釋器

2024-01-24 09:24:19

自動駕駛算法

2019-03-24 14:14:40

代碼閱讀源代碼

2012-12-21 15:29:07

Android

2025-04-08 01:00:00

Spring開發(fā)系統(tǒng)

2022-06-27 08:36:27

分布式事務(wù)XA規(guī)范

2016-10-11 16:28:11

源代碼

2022-09-16 09:36:02

Lapce開源代碼編輯器

2011-03-22 16:20:19

恢復(fù)數(shù)據(jù)庫

2021-02-15 17:29:46

LinuxShell腳本

2011-09-07 09:44:32

SQL Server還原

2017-12-05 10:40:33

Python子域名
點贊
收藏

51CTO技術(shù)棧公眾號