【问题标题】:Writing a makefile for ARM project为 ARM 项目编写 makefile
【发布时间】:2016-05-22 09:55:51
【问题描述】:

我的项目结构如下:

.
├── build
├── src
|   ├── rbpi
|   |   └── gpio.h
|   ├── boot.c
|   ├── boot.s
|   └── kernel.c
└── linker.ld

这是一个简单的树莓派内核,可以让 LED 闪烁! 我目前使用一个包含以下内容的简单 bat 文件来构建它:

arm-none-eabi-gcc -g -O0 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7 -nostartfiles -Wl,-T,linker.ld src/kernel.c src/boot.c src/boot.s -o build/kernel.elf
arm-none-eabi-objcopy build/kernel.elf -O binary build/kernel7.img

由于我将向该项目添加更多文件,因此我必须将每个文件都附加到我的“buildscript”中。
如果可能,我想使用makefile

如果我想要以下“规则”,我的 makefile 应该是什么样子?

  • 编译前,清除build 目录中的所有*.elf*.img 文件。
  • 编译src目录中的所有*.c*.s文件。
  • kernel.elf文件输出到build目录下。
  • 使用链接描述文件linker.ld
  • 编译后运行objcopy生成二进制文件。

【问题讨论】:

    标签: gcc makefile


    【解决方案1】:

    一个典型的Makefile 可能看起来像...等等,这里有一个关于 GNU Make 的文档,其中包含一个很好的简单 Makefile: http://www.gnu.org/software/make/manual/make.html#Simple-Makefile

    所以对你来说一个简单的开始可能是:

    SRC := $(wildcard src/*.c src/*.s)
    CFLAGS :=  -g -O0 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7 -nostartfiles -Wl,-T,linker.ld
    
    all: build/kernel.img
    
    build/kernel.elf: $(SRC)
        arm-none-eabi-gcc $(CFLAGS) $(SRC) -o $@
    
    
    %.img: %.elf
        arm-none-eabi-objcopy $< -O binary $@
    
    clean:
        rm -f build/*.elf build/*.img
    

    (请注意,菜谱必须以制表符开头,而不是像这里的四个空格,make 理解您的文件很重要,所以复制粘贴不起作用。)

    您实际上不需要在编译之前删除 elf 和 img 文件,这是 GNU Make 的角色来知道它是否必须根据文件修改时间来重建。

    在这里,正在工作:

    $ tree
    .
    ├── build
    ├── Makefile
    └── src
        ├── boot.c
        ├── boot.s
        └── kernel.c
    
    $ make
    arm-none-eabi-gcc -g -O0 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7 -nostartfiles -Wl,-T,linker.ld src/boot.c src/kernel.c src/boot.s -o build/kernel.elf
    arm-none-eabi-objcopy build/kernel.elf -O binary build/kernel.img
    
    $ tree
    .
    ├── build
    │   ├── kernel.elf
    │   └── kernel.img
    ├── Makefile
    └── src
        ├── boot.c
        ├── boot.s
        └── kernel.c
    
    $ make
    make: Nothing to be done for 'all'.
    
    $ touch src/boot.c # If I touch a file, make will have to rebuild evrything:
    
    $ make
    arm-none-eabi-gcc -g -O0 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7 -nostartfiles -Wl,-T,linker.ld src/boot.c src/kernel.c src/boot.s -o build/kernel.elf
    arm-none-eabi-objcopy build/kernel.elf -O binary build/kernel.img
    

    你真的应该看看非常好的文档:http://www.gnu.org/software/make/manual/make.html 你将无法在 stackoverflow 上询问你需要对你的 makefile 进行的任何修改,从这个“bootstrap makefile”开始您应该可以修改它以逐步学习,以文档作为参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 2015-03-28
      • 2016-04-19
      • 2013-12-22
      相关资源
      最近更新 更多