<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 如何精準的收集所有 MDK 源代碼文件?一個(gè)腳本搞定

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

發(fā)布人:魚(yú)鷹談單片機 時(shí)間:2021-07-07 來(lái)源:工程師 發(fā)布文章

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

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

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

有沒(méi)有好的方法把 MDK 工程里面包含的文件提取出來(lái)呢?

1.png

當然有。

最近魚(yú)鷹寫(xiě)了一個(gè)腳本,專(zhuān)門(mén)干這事,通過(guò)在 git bash 中執行這個(gè)腳本,就可以完成提取工作(包括匯編文件、C 文件、包含的頭文件)。

匯編文件和C 文件我們可以通過(guò)打開(kāi) *.uvopt 文件找到對應的文件路徑。

2.png

但是頭文件咋辦?

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

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

使用記事本打開(kāi) main.d 文件:

3.png

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

4.png

所以我們的腳本要做的事情很簡(jiǎn)單,就是把所有源文件的 *.d 文件信息收集起來(lái),然后進(jìn)行適當的處理就可以了。

腳本如下:

#!/bin/bash
# Author: Osprey
# 本腳本用于生成 MDK 包含的源文件信息 
# 必須使用 MDK 編譯后,在工程文件目錄下執行本腳本
dir_obj=./obj           # *.d 文件所在目錄 
out_file_name=absolute_files.txt     # 輸出文件名(絕對路徑)
relative_out_file_name=relative_files.txt     # 輸出文件名(相對路徑)
###當前路徑處理
# 斜杠替換為反斜杠  \ 也是特殊字符,需要轉義   操作 `` 有問(wèn)題
curr_dir=`pwd`/
echo ${curr_dir} | sed 's/\//\\/g' > ${out_file_name} && curr_dir=`cat ${out_file_name}` 
curr_dir=${curr_dir#*\\}  # 去除第一個(gè)斜杠
# 第一個(gè)反斜杠替換    :\ 
echo ${curr_dir} | sed 's/\\/:\\/' > ${out_file_name} && curr_dir=`cat ${out_file_name}`
# 替換 \ 為 \\ 防止 sed 命令出錯
echo ${curr_dir} | sed 's/\\/\\\\/g' > ${out_file_name} && curr_dir=`cat ${out_file_name}`
echo "curr dir: ${curr_dir}"
# *.d 文件中包含了源文件信息所以不需要從 *.uvoptx 中提取,下面這些 if 里面的命令沒(méi)有意義
if false ; then
    dir_uvoptx=./ 
    file_uvoptx=`find ${dir_uvoptx} -name "*.uvoptx"`
    echo "file the name: ${file_uvoptx}"
    sed -i "s/      <PathWithFileName>/"${curr_dir}"/g" ${out_file_name}
    sed -i  's/<\/PathWithFileName>//g' ${out_file_name}
fi
# 首先進(jìn)入目錄
cd ${dir_obj}
temp_file_name=temp_files.txt
find ./ -name "*.d" | xargs cat > head_temp.txt # 合并所有 d 文件
if [[ ! -s head_temp.txt ]] 
then
  echo "file is null, please build the project"  # 文件空白
  exit 0
fi
# 去除重復文件,并排序
sort -u head_temp.txt > head_temp1.txt
# 去除標準頭文件  搜索關(guān)鍵 ':\' (包含了標準頭文件),分隔符 ':' 去除 *.O 文件名                   'o: ..'   'o: \.\.' 
cat head_temp1.txt | grep -v ':\\' | awk -F ": " '{print $2}' > head_temp.txt 
# 替換 / 為 \ 
sed -i 's/\//\\/g' head_temp.txt
# 添加絕對路徑
absolute_files=../${out_file_name}
echo "add absolute dir: ${curr_dir}"  # 雙反斜杠是為了防止 sed 命令出錯
#行首(^ 代表行首)添加絕對路徑字符串
sed "s/^/"${curr_dir}"/g" head_temp.txt > ${absolute_files}  
# 添加相對路徑(去除 ..\ )必須用單引號(根據 SI 工程的情況決定是否去除 ..\)
relative_files=../${relative_out_file_name}
sed 's:\.\.\\::g' head_temp.txt > ${relative_files} 
rm head_temp.txt head_temp1.txt  # 刪除文件
cnt=`wc ${absolute_files} | awk '{print $2}'`  # 計文件數
echo "all files is saved in file: ${absolute_files##*/} && ${relative_files##*/}, files number is: ${cnt} "

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

5.png

那么如何使用這個(gè)腳本呢?

特別注意,工程路徑中不要有中文,否則執行失?。ㄏ旅娴慕貓D路徑是中文,所以會(huì )失?。?/p>

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

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

2、將腳本復制到工程目錄下

6.png

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

7.png

3、打開(kāi) git bash

8.png

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

./mdk_lsit.sh.txt

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

9.png

5、可以打開(kāi)文件查看信息:

絕對路徑:

10.png

相對路徑:

11.png

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

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

12.png

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

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

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

*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: Python

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>