Makefile:构建自动化
我们可以用make
命令行工具替代手动敲入“编译”、“链接”、“烧写”这些命令,自动完成整个过程。make
工具使用一个名为Makefile
的配置文件,从中读取执行动作的指令。这种自动化方式非常棒,因为这样可以把构建固件的过程、使用了哪些编译标记等也文档化。
在 https://makefiletutorial.com 上有一个非常好的给初学者的 Makefile 教程,强烈建议看一下。下面我将列出一些非常必要的概念以理解我们所使用的 Makefile。对于已经很熟悉make
的朋友,可以跳过这一部分。
其实Makefile
的格式并不复杂:
action1:
command ... # Comments can go after hash symbol
command .... # IMPORTANT: command must be preceded with the TAB character
action2:
command ... # Don't forget about TAB. Spaces won't work!
现在我们可以跟动作名(也被称作目标)一起调用make
来执行相应的动作:
$makeaction1
当然,也可以在命令中定义和使用变量,动作也可以是需要创建的文件名:
firmware.elf:
COMPILATION COMMAND .....
任何动作都可以有一个依赖列表。例如,firmware.elf
依赖源文件main.c
,当main.c
改变时,make build
就会重新构建firmware.elf
:
build:firmware.elf
firmware.elf:main.c
COMPILATIONCOMMAND
我们已经准备好为固件编写Makefile
,定义一个build
动作/目标:
CFLAGS ?= -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion
-Wformat-truncation -fno-common -Wconversion
-g3 -Os -ffunction-sections -fdata-sections -I.
-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 $(EXTRA_CFLAGS)
LDFLAGS ?= -Tlink.ld -nostartfiles -nostdlib --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map
SOURCES = main.c
build: firmware.elf
firmware.elf: $(SOURCES)
arm-none-eabi-gcc $(SOURCES) $(CF服务器托管网LAGS) $(LDFLAGS) -o $@
在这里我们定义了一些编译标记。?=
表示这是默认值,我们可以在命令行中覆盖它们,像这样:
$makebuildCFLAGS="-O2...."
上面的Makefile
文件中定义了CFLAGS
、LDFLAGS
、SOURCES
变量,然后我们告诉make
,当要build
时创建firmware.elf
文件,它依赖main.c
文件,使用arm-none-eabi-gcc
编译器和给定的编译标记生成它。$@
特殊变量会被展开成动作/目标名,在这个例子中是firmware.elf
。
现在调用make
试一下:
$makebuild
arm-none-eabi-gccmain.c-W服务器托管网-Wall-Wextra-Werror-Wundef-Wshadow-Wdouble-promotion-Wformat-truncation-fno-common-Wconversion-g3-Os-ffunction-sections-fdata-sections-I.-mcpu=cortex-m4-mthumb-mfloat-abi=hard-mfpu=fpv4-sp-d16-Tlink.ld-nostartfiles-nostdlib--specsnano.specs-lc-lgcc-Wl,--gc-sections-Wl,-Map=firmware.elf.map-ofirmware.elf
如果我们再次运行:
$makebuild
make:Nothingtobedonefor`build'.
make
会检查firmware.elf
和依赖项main.c
的修改时间,如果是它们是最新的,则什么都不做。如果我们修改下main.c
,则会重新构建:
$touchmain.c#Simulatechangesinmain.c
$makebuild
现在,还剩下“烧写”这个动作/目标:
firmware.bin: firmware.elf
arm-none-eabi-objcopy -O binary $
OK,现在从终端中执行命令make flash
就会创建firmware.bin
文件,然后通过st-link
烧入板子。当main.c
改变时,这个命令也会重新构建,因为firmware.bin
依赖firmware.elf
,firmware.elf
又依赖main.c
。所以我们的开发循环就是这样的两步:
#Developcodeinmain.c
$makeflash
还有一个良好实践就是在Makefile
中添加clean
动作,以删除构建生成的文件:
clean:
rm-rffirmware.*
完整工程源码可以在step-0-minimal[1]文件夹找到。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
Flask 是一个轻量级的 Python Web 开发框架,它易于上手,适合构建小型到中型的 Web 应用。在这一章节中,我们将详细介绍 Flask 的基本概念、组件和用法。为了便于理解,我们将使用实例来展示如何使用 Flask 构建一个简单的 Web 应用。…