Gcc 为ARM项目编写makefile

Gcc 为ARM项目编写makefile,gcc,makefile,Gcc,Makefile,我的项目结构如下所示: . ├── 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 -m

我的项目结构如下所示:

.
├── 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
由于我将向该项目添加更多文件,因此我必须将每个文件附加到我的“构建脚本”中。
如果可能,我想使用
makefile

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

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

    • 一个典型的
      生成文件可能看起来像。。。等等,这里有一个关于GNU Make的文档,其中包含一个很好的简单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
      
      你真的应该看一看非常好的文档:你将无法要求stackoverflow对你的makefile进行任何修改,从这个“引导makefile”开始,你应该能够修改它以逐步学习,并将文档作为参考

      $ 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