目标:
makefile中的变量可能是这样:
CPU = -mcpu=cortex-m4
# fpu
FPU = -mfpu=fpv4-sp-d16
# float-abi
FLOAT-ABI = -mfloat-abi=hard
# mcu
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
# macros for gcc
# AS defines
AS_DEFS =
# C defines
C_DEFS = -DUSE_HAL_DRIVER -DSTM32F407xx
如何打印出 C_DEFS 这个变量的值,MCU 这个变量的值???
首先来了解一些基本知识:
make(指的就是make.exe)是要操作makefile文件的,而操作makefile的时候,我们可以给它一些命令,更符合我们的操作方法。
make的命令行选项有如下:
(make-选项 - 知乎)
之前指定make要查找的文件时,使用的-f和--file=吗?这是make工具的参数,下面看看常用的选项都有哪些:
-
-b或-m,忽略其他版本make的兼容性。 -
-B或–-always-make,重编译。 -
-C或--directory=,指定读取makefile的目录。 -
--debug[=]或-d(--debug=a),输出make的调试信息,有以下几种级别可选,默认输出最简单信息。
-
a--输出所有调试信息。 -
b--输出简单调试信息。 -
v--输出b级之上的信息。 -
i--输出隐式规则(implicit)。 -
j--输出执行规则中命令的详细信息。 -
m--输出操作makefile时的信息
-
-e或--environment-overrides,指明环境变量中的值覆盖makefile中的值 -
-f或--file=或--makefile=,指定需要执行的makefile。 -
-h或--help,显示帮助信息。 -
-i或--ignore-errors,执行时忽略错误。 -
-I或--include-dir=,指定包含makefile的搜索目录。 -
-j或--jobs[=],指定同时运行命令的数目。默认尽可能多的运行 -
-k或--keep-going,出错也不停止运行。 -
-l或--load-average[=]或--max-load[=],指定make运行的负载。 -
-n或--just-print或--dry-run或--recon,仅输出执行命令序列,但并不实际执行。 -
-o或--old-file=或--assume-old=,指定不重新生成的目标。 -
-p或--print-data-base,输出make的内部的所有数据,包括所有预定义的规则和变量。该选项输出的信息太多了,而且没法缩减的。 -
-q或--question,仅检查目标是否要更新,如果是0说明要更新,2说明有错误 -
-r或--no-builtin-variabes,禁止使用变量上的隐式规则。 -
-s或--silent或--quiet,在运行命令时不输出命令的输出 -
-S或--no-keep-going或--stop,取消-k选项,一般用在make的选项是继承来的,而你又不想要。 -
-t或--toch,把目标修改日期变为最新的,也就是阻止生成目标。 -
-v或--version,输出make版本。 -
-w或--print-directory,跟踪makefile。 -
--no-print-directory,禁止-w选项。 -
-W或--what-if=或--new-file或--assume-file=,假定目标需要更新。 -
--warn-undefined-variables,只要make发现未定义变量,那么给出警告。
打印变量的方法1
我们从这些选项可以看出, 没有可以打印出makefile中我们定义的变量的值的选项。即使 -p 可以,但是打印出的文本信息太多了,一次性输出这么多信息,并非是我们所希望的。Makefile(make)之(3)输出变量值_Once_day的博客-CSDN博客
从博客可知 shell - 保存/导出make环境中的所有变量? - Thinbug
应该这样做,在makefile中写个伪目标showAllVar,伪目标的执行内容是如下之一都行:(Makefile 打印变量的值_墨痕诉清风的博客-CSDN博客)
- 用 @echo "$(var)" 来输出 变量var的值
- $(info $(TARGET_DEVICE) )
- $(warning $(XXX)) 打印变量的值
- $(error "error: this will stop the compile")
举例如下:(用echo举例)
然后用
make -n showAllVar
命令就能打出来啦
CPU = -mcpu=cortex-m4
# fpu
FPU = -mfpu=fpv4-sp-d16
# float-abi
FLOAT-ABI = -mfloat-abi=hard
# mcu
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
# macros for gcc
# AS defines
AS_DEFS =
# C defines
C_DEFS = -DUSE_HAL_DRIVER -DSTM32F407xx
# 这样来打印出我们设置的这些变量的值
showAllVar:
@echo "$(CPU)"
@echo "$(FLOAT-ABI)"
@echo "$(MCU )"
@echo "$(AS_DEFS )"
@echo "$(C_DEFS )"
为了省去手写这些打印变量语句,可以直接用这个博客提到的方法Makefile(make)之(3)输出变量值_Once_day的博客-CSDN博客
获得变量的值的方法2
makefile文件内容还是比较简单的,我们可以自己直接写个简单的读取函数,来解析得到我们指定变量的值的(这个方法简单高效(原理就是一行行分析,自己写字符串匹配然后提取),不用增加makefile里面任何内容)。这个对于一般变量是没问题的,当这个变量是嵌套变量,或者考虑到了赋值 =、:= 等符号特性的时候,自己写的这个读取函数可能就费劲了。所以简单应用场合,可以用这个。
方法总结:
方法1:需要在makefile中加入打印语句,而且需要启动一个make进程。能应对复杂应用场合。但是,在makefile文件内容里面增加一个变量的时候,更新一个变量的值时候,make就做不了的,因为它只读取和执行这个文件里面的内容。make只可以 make EXTRAVAR="-Ddef4 -Ddef5" (带空格的标记必须用引号引起来)这样的方式来增加一个变量,但是makefile这个文件里的实际内容是不会变的(也就是文件没有被修改)。
如何在向变量追加一个值列表的同时启动make? - 问答 - 腾讯云开发者社区-腾讯云
注:make FOO+=执行与make FOO=相同的操作。它不会追加,它会覆盖FOO这个变量。要想增加,可以这样:
VAR = -Ddef1 -Ddef2 -Ddef3 $(EXTRAVAR)
make EXTRAVAR="-Ddef4 -Ddef5" #就实现了向VAR变量中增加两个值 -Ddef4 -Ddef5
方法2:直接函数读取,不用修改makefile任何内容,但是复杂变量就难以解析了。可以自己方便的增加一个变量进去,更新变量值啥的,都能做到(也就是自己直接修改makefile文件里面的内容了的)。简单应用场合可以的。
所以,具体用方法1还是2,看自己的应用场景吧。我是因为用makefile来直接存储项目的编译等参数,所以需要实际修改makefile文件的内容,所以只能是自己写解析函数了的。(还需要仅仅读复杂变量的值的话,可能就再用一下方法1了)










