1. 程式人生 > >使用Eclipse進行Makefile專案

使用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

 [email protected] ' '

以下是將應用程式與所有物件檔案連結的規則:

############################

# Rule to link the executable

$(EXE): $(OBJS) $(USER_OBJS) linkerfile.ld

 @echo 'Building target: [email protected]'

 @echo 'Invoking: Linker'

 arm-none-eabi-gcc $(LL_OPTIONS) $(OBJS) $(LIBS)

 @echo 'Finished building target: [email protected]'

 @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 "[email protected]" "$<"

 @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 "[email protected]" "$<"

 @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/

歡迎關注: