语法
- 换行
\
- 注释用
#
- 默认依赖
default: [label]
- 系统命令前不加
@
会把命令也输出到屏幕,加@
不会输出到屏幕 - 变量以最终的定义为准
- 执行命令必须用Tab键,使用空格替换Tab会报错
*** missing separator. Stop.
default: main test
main:
@echo main $(OBJ)
OBJ= \
obj1 \
obj2
test:
@echo test $(OBJ)
OBJ = None
执行
(python37) cndaqiang@mac makefile$ make
main None
test, None
示例
OBJ= \
obj1 \
obj2
default: main
main:
@echo $(OBJ)
赋值
https://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
其他
删除已有元素
https://cloud.tencent.com/developer/ask/62201
default: main
main:
@echo main $(OBJ)
OBJ= \
obj1 \
obj2
TMPVAR := $(OBJ)
OBJ = $(filter-out obj1, $(TMPVAR))
排序/删除重复元素
w = z z x x y c x 1 2 \
234
w += 1 2
cnq:
@echo $w
@echo $d
d=$(sort $(w))
执行
(python37) cndaqiang@mac tmp$ make
z z x x y c x 1 2 234 1 2
1 2 234 c x y z
命令
(python37) cndaqiang@mommint:~/code/octopus$ make --help
Usage: make [options] [target] ...
Options:
-b, -m Ignored for compatibility.
-B, --always-make Unconditionally make all targets.
-d Print lots of debugging information.
--debug[=FLAGS] Print various types of debugging information.
Read FILE as a makefile.
-h, --help Print this message and exit.
-i, --ignore-errors Ignore errors from recipes.
-j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no arg.
-k, --keep-going Keep going when some targets can't be made.
This program built for x86_64-pc-linux-gnu
Report bugs to <bug-make@gnu.org>
--debug
的参数
a
–输出所有调试信息。b
–输出简单调试信息。v
–输出b级之上的信息。i
–输出隐式规则(implicit)。j
–输出执行规则中命令的详细信息。m
–输出操作makefile时的信息
VPATH
使用VPATH指定源码的寻找目录
- 在Makefile中指定源码目录
VPATH=PATH1:PATH2
, 或者指定具体类型的vpath %.f90 ../src:../src2
,也可以make VPATH=PATH1:PATH2
- 使用VPATH中的代码时,必须使用变量进行调用,如下面的
$<
,而不能用代码的文件名test.f90
,因为用代码名是决定路径 - 同理如果指定了obj的目录,也要用
$@
表示输出文件 - 批量规则用
%.o:%.f90
. 不要用.f90.o
的方式,有的环境无法生效
示例
(python37) cndaqiang@mommint:~/work/fortran/makefile$ tree
.
├── obj
│ └── Makefile
├── src
│ └── test.f90
└── src2
└── fun.f90
3 directories, 3 files
(python37) cndaqiang@mommint:~/work/fortran/makefile$ cd obj/
(python37) cndaqiang@mommint:~/work/fortran/makefile/obj$ cat Makefile
VPATH=../src:../src2
FC=ifort
%.o:%.f90
$(FC) -o $@ -c $<
test:test.o fun.o
ifort -o $@ $<
(python37) cndaqiang@mommint:~/work/fortran/makefile/obj$ make
ifort -o test.o -c ../src/test.f90
ifort -o fun.o -c ../src2/fun.f90
ifort -o test test.o
本文首发于我的博客@cndaqiang.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!