使用Eclipse進行Makefile項目
最近在MCU on Eclipse網站上看到Erich Styger所寫的一篇有關在Eclipse中使用Makefile創建項目的文章,文章講解清晰明了非常不錯,所以呢沒人將其翻譯過來供各位同仁參考。當然限於個人水平,有不當之處懇請指正。原文網址:https://mcuoneclipse.com/2017/07/22/tutorial-makefile-projects-with-eclipse/
像Eclipse這樣的IDE的好處是它使得處理項目的工作變得非常容易。因為它不但可以生成文件,而且可以獲取並自動地管理Makefile文件。但有時這可能不是我想要的,因為我需要更大的靈活性和控制,或者我想要為我的持續集成和自動化測試系統使用相同的制作文件。在這種情況下,就需要自己編寫Makefile文件。
有一件事不排除其他內容:本文介紹如何使用Eclipse中的makefiles與Eclipse中托管構建系統相似的舒適度,但是具有無限制的make files:
概要
Eclipse附帶一個內置的構建系統(managed make):我可以配置編譯器鏈接器設置,Eclipse會處理其余的事情。在本教程中,我將介紹如何使用Eclipse手動創建和使用精心制作的make files。所推薦的make files和模板可以方便地使用make來控制構建系統。所提出的方法要求添加到項目中的每個新的源文件需要擴展make文件,而是對所有包含的頭文件的自動生成依賴文件的make文件進行擴展。
使用make文件的好處是:
- 比Eclipse .cproject文件和設置更容易在版本控制系統中存儲和跟蹤
- 完全控制構建和制作過程
- 作為構建過程的一部分,與其他步驟(例如使用版本控制系統或自動化測試系統)相比,這是微不足道的
- 可以在IDE和外部使用相同的構建(make)(例如在自動構建系統上)
- 並且編寫make文件也很有趣
make文件方法需要了解構建過程,為此,了解什麽與管理make一起使用是有幫助的,所以我可以將其用作基礎或靈感。
前提條件
要在Eclipse中使用make文件,我需要以下內容:
- Eclipse IDE。我正在使用恩智浦MCUXpresso IDE v10.0.2(基於Neon),但任何其他Eclipse發行版也可以這樣做。
- 使用make實用程序安裝GNU工具鏈。通常這裏附帶了一個捆綁的Eclipse IDE,或者您可以使用DIY工具鏈。
- 您的目標設備的編譯器和鏈接器設置。使用現有示例項目中的選項。
- 啟動和鏈接器文件。再次,您可以借用現有的示例項目。
- 應用源文件。我建議先從“空”main函數開始。
獲取必要的文件和選項的一個好方法是查看一個通常使用“manged make”的示例項目。
??我把這個項目的來源放在了GitHub上。在本文末尾的“鏈接”部分,檢查GitHub項目的鏈接。
來自Eclipse受托管Make
使用受管制作系統,Eclipse會檢測項目中存在的文件(例如* .c)並自動生成make文件:
生成器設置
這樣生成make文件:
生成Make文件
通過構建工具集成,我有一個GUI可以設置工具的選項:
管理構建工具設置
所有這些信息都將添加到make文件中,如果我做一個構建,它調用make實用程序(或構建器)使用所有必要的命令行構建它。檢查控制臺視圖輸出可以看到它有什麽作用
控制臺視圖輸出
有了這個,我應該有一切做一個make文件項目。
創建Make File項目
我在Eclipse中創建一個新的make文件項目,菜單File> New Project:
新項目
與Eclipse中的許多事情一樣,有多種方法來做事情。
如果我有現有的代碼,我可以使用‘Makefile項目與現有代碼‘。然後我可以給一個名字和現有的代碼位置(文件夾)。然後,它將在該代碼位置文件夾內創建項目,並將所有源文件添加到項目中:
新建帶已有代碼的Make文件項目
通用的方法是生成C或C ++項目:
新的C/C++項目
然後給項目一個名稱,並選擇一個空的make文件項目與支持的工具鏈:
創建空的Makefile項目
然後按“下一步”,然後根據所選的工具鏈進行剩余的對話框。這將創建一個如下的空項目:
空Makefile項目
應用文件
要編輯一些東西,添加一個新的源文件:
添加新的源文件
將其命名為main.c或任何您喜歡的:
新的main.c文件
然後添加一個main()例程與一些代碼,例如
static int i;
void main(void) {
for(;;) {
i++;
}
/* do not leave main() */
}
Makefile文件
接下來,使用項目文件夾中的上下文菜單“ 新建”>“文件 ”:
新文件
在項目中創建一個名為“makefile”的文件:
創建Make File
這會添加一個空的make文件。
CMSIS,系統文件和啟動
下一步很大程度上取決於所使用的設備。我在這個例子中使用恩智浦FRDM-KL25Z板。為了結構化,我創建了源的目錄。特殊的“ debug ”文件夾將用於放置對象和可執行文件。
展開的項目結構
Make文件語法
下一步是實現make文件內容。一般的make文件如下所示:
all:hello.axf
清潔:
rm main.o hello.axf
hello.axf:main.o
gcc -g -o hello main.o
main.o:
gcc -c -g main.c
make文件中的每個條目都具有以下語法:
<target>:<依賴關系列表>
<tab>要執行的命令
??請註意,每個命令前面都需要一個<TAB>字符!
有兩個名為特殊目標所有的清潔。‘clean‘用於刪除所有臨時文件,‘all‘用於構建應用程序。
Makefile的內容
在makefile中,我定義了用於刪除文件,編譯器和鏈接器的變量:
############################
#刪除文件的命令
RM:= rm -rf
############################
#編譯器
CC:= arm-none-eabi-gcc
############################
#鏈接器
LL:= arm-none-eabi-gcc
然後我為最終的可執行文件定義一個宏:
############################
#二進制/可以構建
EXE:= \
./debug/MyMakeProject.axf
接下來是所有目標文件的列表。因為目標文件將被放置在‘debug‘文件夾中,這是名稱的一部分:
############################
#目標文件列表
OBJS:= \
./debug/main.o \
./debug/startup_MKL25Z4.o \
./debug/system_MKL25Z4.o
接下來的事情真的很酷 如果main.c包含頭文件main.h,我將不得不寫一個規則
main.o:main.c main.h
$(CC)-c main.c -o main.o
但這是非常痛苦的:我必須為每個文件編寫規則,並且需要跟蹤頭文件。相反,我讓編譯器稍後再創建依賴文件,擴展名為.d(用於依賴)。依賴文件main.d看起來像這樣:
debug / main.o debug / main.d:source / main.c source / main.h
source/ main.h:
如果不是“幹凈”目標,我將文件作為附加規則文件包含在內:
############################
#包含生成的依賴文件(只有不幹凈的目標)
ifneq($(MAKECMDGOALS),clean)
ifneq($(strip $(C_DEPS)))
- 包含$(C_DEPS)
endif
endif
以下是我以後可以使用的編譯器選項集:
############################
#編譯器選項
CC_OPTIONS:= -c -std = gnu99 -O0 -g-功能部分-fdata-sections -fno-builtin -mcpu = cortex-m0plus -mthumb -DCPU_MKL25Z128VLK4 -D__USE_CMSIS -I“CMSIS”-I“source”
類似的,鏈接器的選項:
############################
#鏈接器選項
LL_OPTIONS:= -nostdlib -Xlinker -Map =“debug / MyMakeProject.map”-Xlinker --gc-sections -Xlinker -print-memory-usage -mcpu = cortex-m0plus -mthumb -T linksfile.ld -o $(EXE )
接下來的目標是構建應用程序:
############################
#main(all)target
all:$(EXE)
@echo“***finished building***”
跟著目標做一個“幹凈”:
############################
#Clean target
clean:
-$(RM) $(EXECUTABLES) $(OBJS) $(EXE)
-$(RM) ./debug/*.map
-@echo ‘ ‘
以下是將應用程序與所有對象文件鏈接的規則:
############################
# Rule to link the executable
$(EXE): $(OBJS) $(USER_OBJS) linkerfile.ld
@echo ‘Building target: $@‘
@echo ‘Invoking: Linker‘
arm-none-eabi-gcc $(LL_OPTIONS) $(OBJS) $(LIBS)
@echo ‘Finished building target: $@‘
@echo ‘ ‘
接下來,我指定構建對象文件的規則。我必須為每個要使用的子文件夾指定一個規則:
############################
# Rule to build the files in the source folder
./debug/%.o: ./source/%.c
@echo ‘Building file: $<‘
$(CC) $(CC_OPTIONS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo ‘Finished building: $<‘
@echo ‘ ‘
############################
# Rule to build the files in the CMSIS folder
./debug/%.o: ./CMSIS/%.c
@echo ‘Building file: $<‘
$(CC) $(CC_OPTIONS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo ‘Finished building: $<‘
@echo ‘ ‘
??選項-MMD -MP -MF“$(@:%。o =%。d)”
-MT“$(@:%。o =%。o)”為每個編譯的源文件生成依賴項.d文件。
制作目標
要構建項目,可以使用Eclipse中通常的“make / build”和“clean”菜單/命令。但還有一個很酷的方式:構建目標!
為此,打開構建目標視圖(菜單Windows>顯示視圖>其他):
Make創建目標
在該視圖中,選擇項目,然後單擊“新建目標”按鈕:
新建目標
創建“幹凈”目標:
清潔目標
這將為項目添加一個“構建目標”組。使用上下文菜單為“全部”添加新目標:
創建新的目標
這樣,我可以雙擊或使用上下文菜單在makefile中執行目標:
在Eclipse項目瀏覽器中創建目標
綜述
在Eclipse中進行托管的制作和構建是一個很好的功能:它簡單易用,並且可能是與IDE類似的98%的用例的正確的東西。但是如果我想使用Eclipse的普通make文件,這並不困難。使用提出的make文件模板,如果將新的源添加到項目中,我必須擴展文件列表。否則一切都得到照顧。編寫文件需要學習階段,但這可能是一個很好的投入。
接下來就可以快樂的Make中了。
相關鏈接
- 本文在GitHub上的項目和文件:https://github.com/ErichStyger/mcuoneclipse/tree/master/Examples/MCUXpresso/FRDM-KL25Z/MyMakeProject
- 制作文件教程:https://mcuoneclipse.com/2012/02/13/make-my-make-with-eclipse-and-mcu10/
- GNU Make:https : //www.gnu.org/software/make/
歡迎關註:
使用Eclipse進行Makefile項目