1. 反引号设置变量
var = `ls .` 等同于 var = $(shell ls .)
2. 不知道为何makefile好像不支持tcsh,只支持bsh嵌入shell脚本(注意属于命令,加tab)
3. 由于tcsh用的较多,现在补习一下sh的脚本知识。
4. 当sh嵌入makefile中时,请将sh中的变量$var 写成 $$var
5. makefile的预编译指令
这些语句在编译时解释,而不是在运行是解释,因此 xxxx 根据上下文可以是命令,赋值, 或者目标依赖。总而言之可以是任何语句。
6. 注意使用转义符号 /
一般变量中带有 #,% 等时需要转义。
7. 作为IC design 工程师一般常用的make 语法如下:
1. ) .PHONY: all checkdir compile clean
指定伪目标, 通常有 all , 检查目录并创建它, 编译源代码, 清除
2.) 上面提到的预编译指令
用于根据条件指定变量或者选择执行的命令
3.) 嵌入shell
4.) 列出带目录的源代码列表 (为何要带目录稍后解释)
ASRC:= ${SRC_DIR}/a.s /
${SRC_DIR}/b.s
或者
ASRC:= $(wildcard ${SRC_DIR}/*.s)
5. ) 通过源代码列表得到目的代码列表
AOBJ:= $(patsubst %.s, %.o, $(ASRC))
6.) 应用静态编译
只有应用静态模式这样才能使得 每个 .o 和每个 .s 一一 对应起来。编译的.o 就放在 ${SRC_DIR} 目录下
8. 为何要带目录呢?
这样可以很方便的使用静态编译,而且方便wildcard 的展开。代价是编译的.o只能放在 ${SRC_DIR} 下
如果我们不采用如此做法那么处理起来相对麻烦些:例如我们要吧 src 目录下的.c 编译成.o文件,并放到 obj目录下
9. 为何要用make?
1) 很适合处理编译,提供了相应的函数
2) 运行速度快,不需要重复编译
3) 适合clone仿真(即多核运行)