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要查找的文件时,使用的-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发现未定义变量,那么给出警告。我们从这些选项可以看出, 没有可以打印出makefile中我们定义的变量的值的选项。即使 -p 可以,但是打印出的文本信息太多了,一次性输出这么多信息,并非是我们所希望的。Makefile(make)之(3)输出变量值_Once_day的博客-CSDN博客
从博客可知 shell - 保存/导出make环境中的所有变量? - Thinbug
应该这样做,在makefile中写个伪目标showAllVar,伪目标的执行内容是如下之一都行:(Makefile 打印变量的值_墨痕诉清风的博客-CSDN博客)
举例如下:(用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博客
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了)