看懂makefile 各种语句及语法 http://c.biancheng.net/view/7093.html
Makefile本质上来讲也是shell脚本,即每条command都是shell进程,运行完shell进程都会退出
1.如果没有定义此变量,则添加:
下方例子是说如果XXNO变量的值是空字符,则赋值该变量,并export出去,使得该变量在整个执行makefile期间让子make可以使用
export将变量传递到子make过程,文件后缀为.mak,需要include .mak 文件
ifeq ($(strip $(XXNO)),)
XXNO=/pathname
export XXNO
endif
更为常用:表示其他变量若有值则export XXNO的值
ifneq ($(strip $(其他变量)),)
XXNO=/pathname
export XXNO
endif
2.获取当前makefile所在文件夹:区分 与脚本的$(pwd)
TRUNK_DIR=$(shell pwd)
3.makefile 的注释同脚本注释 ,使用 “#”
变量的字符引用,假如变量是多字符的,引用不可以直接$,需要使用()或者 { },如果直接引用是引用变量的首字母
$(xxno)
${xxno}
$xxno 相当于 $(x)xxno
makefile允许‘=’两边有空格,这里是shell代码 ,shell不允许‘=’号两边有空格,否则将空格也包含进去。
makefile 的shell代码在目标:另起一行写,在同一行写的话还是makefile代码。
4.在Makefile中执行shell命令,一行创建一个进程来执行。这也是为什么很多Makefile中有很多行的末尾都是“; \”,以此来保证代码是一行而不是多行,这样Makefile可以在一个进程中执行
for循环:如果shell中的变量需要 $$ 多一个$:
for profile in $(PROFILE_SET);\
do \
echo [$$id] $$profile;\
id=`expr $$id + 1`; \
done;
while循环:
while [ "$$select"x == ""x ] ;\
do \
echo $(INFOR5);read select;\
done; \
5.如果执行的是shell命令,在命令前加@,将不会打印echo “xxx”
@echo "xxx"
6.makefile 中的规则以及嵌套规则(规则与目标的区分):
rule:rule1 rule2 rule3
当make rule 时将会连rule1、rule2、rule3 规则下的shell代码都执行一遍,需要提醒的是make的执行不会理会变量的赋值等,只会理会规则下的shell。
make命令参数
用法:make [选项] [目标] ...
选项:
-b, -m 忽略兼容性。
-B, --always-make 无条件 make 所有目标。
-C DIRECTORY, --directory=DIRECTORY
在执行前先切换到 DIRECTORY 目录。
-d 打印大量调试信息。
--debug[=FLAGS] 打印各种调试信息。
-e, --environment-overrides
环境变量覆盖 makefile 中的变量。
-f FILE, --file=FILE, --makefile=FILE
从 FILE 中读入 makefile。
-h, --help 打印该消息并退出。
-i, --ignore-errors Ignore errors from commands. //和-k参数结合使用能够得到所有的编译错误信息
-I DIRECTORY, --include-dir=DIRECTORY
在 DIRECTORY 中搜索被包含的 makefile。
-j [N], --jobs[=N] 同时允许 N 个任务;无参数表明允许无限个任务。
-k, --keep-going 当某些目标无法创建时仍然继续。
-l [N], --load-average[=N], --max-load[=N]
在系统负载高于 N 时不启动多任务。
-L, --check-symlink-times 使用软链接及软链接目标中修改时间较晚的一个。
-n, --just-print, --dry-run, --recon
不要实际运行任何命令;仅仅输出他们
-o FILE, --old-file=FILE, --assume-old=FILE
将 FILE 当做很旧,不必重新生成。
-p, --print-data-base 打印 make 的内部数据库。
-q, --question 不运行任何命令;退出状态说明是否已全部更新。
-r, --no-builtin-rules 禁用内置隐含规则。
-R, --no-builtin-variables 禁用内置变量设置。
-s, --silent, --quiet 不显示命令。
-S, --no-keep-going, --stop
关闭 -k。
-t, --touch touch 目标而不是重新创建它们。
-v, --version 打印 make 的版本号并退出。
-w, --print-directory 打印当前目录。
--no-print-directory 关闭 -w,即使 -w 默认开启。
-W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE
将 FILE 当做最新。
--warn-undefined-variables 当引用未定义变量的时候发出警告。
该程序为 x86_64-pc-linux-gnu 编译
报告错误到 <bug-make@gnu.org>
#### make completed successfully ####
举个演示,-n表示不执行只显示
make CUSTOM=CT PROFILE=CMCC_AP_WIFI6_W30S_Demo libsqlite3 -n
makefile或者
## 如果需要加其它型号,例如添加S12_UNISOC_PLUS,S12_PRO 可以改成S12_PRO-S12_UNISOC_PLUS
ifneq (,$(findstring $(TZ_PROJECT),S12_PRO))
CFLAGS += -DCONFIG_STRONG_ENCRYPTION
endif