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

欢迎关注:

相关文章
相关标签/搜索