cndaqiang Web Linux DFT

[草稿]Makefile学习

2020-12-02
cndaqiang
RSS

语法

  • 换行\
  • 注释用#
  • 默认依赖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

命令

make-选项

(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 协议 ,转载请注明出处!


目录

访客数据