使用Eclipse進行Makefile項目

最近在MCU on Eclipse網站上看到Erich Styger所寫的一篇有關在Eclipse中使用Makefile建立項目的文章,文章講解清晰明瞭很是不錯,因此呢沒人將其翻譯過來供各位同仁參考。固然限於我的水平,有不當之處懇請指正。原文網址:https://mcuoneclipse.com/2017/07/22/tutorial-makefile-projects-with-eclipse/git

 

像Eclipse這樣的IDE的好處是它使得處理項目的工做變得很是容易。由於它不但能夠生成文件,並且能夠獲取並自動地管理Makefile文件。但有時這可能不是我想要的,由於我須要更大的靈活性和控制,或者我想要爲個人持續集成和自動化測試系統使用相同的製做文件。在這種狀況下,就須要本身編寫Makefile文件。github

有一件事不排除其餘內容:本文介紹如何使用Eclipse中的makefiles與Eclipse中託管構建系統類似的溫馨度,可是具備無限制的make files:瀏覽器

 

概要eclipse

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」的示例項目。ui

💡我把這個項目的來源放在了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/

歡迎關注:

相關文章
相關標籤/搜索