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

欢迎关注:

猜你喜欢

转载自blog.csdn.net/foxclever/article/details/81214299