Linux Make命令详解

1 概述

  make命令常用参数-C,-n, -j.其实make还有很多参数也很有用,本文描述将简单介绍。

使用make版本:

$ make --version
GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

2 参数

2.1 -b,-m

忽略兼容性
(Ignored for compatibility).

$ make -b
$ make -m

2.2 -B, --always-make

无条件编译所有目标(Unconditionally make all targets).

$ make -B
$ make --always-make

2.3 -C DIRECTORY, --directory=DIRECTORY

改变编译目录(Change to DIRECTORY before doing anything).

$ make -C src
$ make --directory=src

2.4 -d

打印许多调试信息,对调试Makefile很有用(Print lots of debugging information).

$ make -d

2.5 --debug[=FLAGS]

打印各种类型的调试信息(Print various types of debugging information).
FALGS:

  • a (all) 输出所有类型的调试信息,等效于“-d”选项
  • b (basic) 输出基本调试信息。包括:那些目标过期、是否重建成功过期目标文件
  • v (verbose) basic级别之上的输出信息。包括:解析的makefile文件名,不需要重建文件等。此选项目默认打开“basic”级别的调试信息。
  • i (implicit) 输出所有使用到的隐含规则描述。此选项目默认打开“basic”级别的调试信息。
  • j (jobs) 输出所有执行命令的子进程,包括命令执行的PID等。
  • m (makefile) 也就是makefile,输出make读取makefile,更新makefile,执行makefile的信息。

2.6 -e, --environment-overrides

用系统环境变量覆盖Makefile文件中环境变量(Environment variables override makefiles).

2.7 --eval=STRING

将STRING赋值为makefile语句(Evaluate STRING as a makefile statement).

2.8 -f FILE, --file=FILE, --makefile=FILE

将FILE作为makefile文件(Read FILE as a makefile).

$ make -f mkfile
$ make --file mkfile
$ make --makefile mkfile

2.9 -i, --ignore-error

忽略错误接着执行(Ignore errors from recipes).

2.10 -I DIRECTORY, --include-dir=DIRECTORY

在指定目录中搜索包含的makefile(Search DIRECTORY for included makefiles).

2.11 -j [N], --jobs[=N]

一次允许N个编译;无参数说明使用CPU核数个编译(Allow N jobs at once; infinite jobs with no arg).

$ make -j
$ make -j 4

2.12 -l [N], --load-average[=N], --max-load[=N]

除非负载低于N,否则不要启动多个作业(Don’t start multiple jobs unless load is below N).

$ make -j -l 0.01
$ make -j --load-average 0.1
$ make -j ----max-load  1

2.13 -L, --check-symlink-times

使用符号链接和目标之间的最新修改时间(Use the latest mtime between symlinks and target).

$ make -L

2.14 -n, --just-print, --dry-run, --recon

不实际编译,只是打印编译步骤(Don’t actually run any recipe; just print them).

src$ make -n
mkdir -p /home/james/git/cppcmd1.0.0/src/.obj
echo C++ /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o
g++ -c -std=c++11 -I/home/james/git/cppcmd1.0.0/src/../inc /home/james/git/cppcmd1.0.0/src/../src/cppcmd.cpp -o /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o
echo C++ /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o
g++ -c -std=c++11 -I/home/james/git/cppcmd1.0.0/src/../inc /home/james/git/cppcmd1.0.0/src/../src/cmdio.cpp -o /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o
echo Ar /home/james/git/cppcmd1.0.0/src/../lib/libcppcmd.a
ar -rcD /home/james/git/cppcmd1.0.0/src/../lib/libcppcmd.a   /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o  /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o
make -ts --no-print-directory

2.15 -o FILE, --old-file=FILE, --assume-old=FILE

将文件FILE视作旧文件,不重新编译它(Consider FILE to be very old and don’t remake it).

2.16 -O[TYPE], --output-sync[=TYPE]

按TYPE同步并行作业的输出(Synchronize output of parallel jobs by TYPE).

2.17 -p, --print-data-base

打印make内部的database(Print make’s internal database).

$ make -p

2.18 -q, --question

不运行任何命令,并且无输出。make只是返回一个查询状态。返回状态为0表示没有目标需要重建,1表示存在需要重建的目标,2表示有错误发生。(Run no recipe; exit status says if up to date).

$ make -q

2.19 -r, --no-builtin-rules

禁用内置的隐式规则(Disable the built-in implicit rules).

$ make -r

2.20 -R, --no-builtin-variables

禁用内置变量设置(Disable the built-in variable settings).

$ make -R

2.21 -s, --silent, --quiet

取消命令执行过程的打印(Don’t echo recipes).

cppcmd1.0.0$ make -s
C++ /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o
C++ /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o
Ar /home/james/git/cppcmd1.0.0/src/../lib/libcppcmd.a
C++ /home/james/git/cppcmd1.0.0/test/.obj/cmdtest.o
C++ /home/james/git/cppcmd1.0.0/test/.obj/test.o
Link /home/james/git/cppcmd1.0.0/test/../bin/test
cppcmd1.0.0$ make -s
cppcmd1.0.0$ 

2.22 -k, --keep-going

当一些目标无法make时继续编译(Keep going when some targets can’t be made).

$ make -k
$ make --keep-going

2.23 -S, --no-keep-going, --stop

关闭-k(Turns off -k).

$ make -S
$ make --no-keep-going 
$ make --stop

2.24 -t, --touch

Touch目标而不是重新make目标(Touch targets instead of remaking them).

:src$ make -t
make: 'all' is up to date.

2.25 --trace

打印跟踪信息(Print tracing information).

src$ make --trace
/home/james/git/cppcmd1.0.0/src/../mkfiles/lib.mk:34: target '/home/james/git/cppcmd1.0.0/src/.obj' does not exist
mkdir -p /home/james/git/cppcmd1.0.0/src/.obj
/home/james/git/cppcmd1.0.0/src/../mkfiles/lib.mk:27: update target '/home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o' due to: /home/james/git/cppcmd1.0.0/src/../src/cppcmd.cpp /home/james/git/cppcmd1.0.0/src/../src/cmdhelper.h /home/james/git/cppcmd1.0.0/src/.obj
echo C++ /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o
C++ /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o
g++ -c -std=c++11 -I/home/james/git/cppcmd1.0.0/src/../inc /home/james/git/cppcmd1.0.0/src/../src/cppcmd.cpp -o /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o
/home/james/git/cppcmd1.0.0/src/../mkfiles/lib.mk:27: update target '/home/james/git/cppcmd1.0.0/src/.obj/cmdio.o' due to: /home/james/git/cppcmd1.0.0/src/../src/cmdio.cpp /home/james/git/cppcmd1.0.0/src/../src/cmdhelper.h /home/james/git/cppcmd1.0.0/src/.obj
echo C++ /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o
C++ /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o
g++ -c -std=c++11 -I/home/james/git/cppcmd1.0.0/src/../inc /home/james/git/cppcmd1.0.0/src/../src/cmdio.cpp -o /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o
/home/james/git/cppcmd1.0.0/src/../mkfiles/lib.mk:19: update target '/home/james/git/cppcmd1.0.0/src/../lib/libcppcmd.a' due to: /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o /home/james/git/cppcmd1.0.0/src/../lib
echo Ar /home/james/git/cppcmd1.0.0/src/../lib/libcppcmd.a
Ar /home/james/git/cppcmd1.0.0/src/../lib/libcppcmd.a
ar -rcD /home/james/git/cppcmd1.0.0/src/../lib/libcppcmd.a   /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o  /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o
/home/james/git/cppcmd1.0.0/src/../mkfiles/lib.mk:16: update target 'all' due to: /home/james/git/cppcmd1.0.0/src/../lib/libcppcmd.a
make -ts --no-print-directory

2.26 -w, --print-directory

打印当前目录(Print the current directory).

cppcmd$ make -w
make: Entering directory '/home/james/git/cppcmd1.0.0'
make[1]: Entering directory '/home/james/git/cppcmd1.0.0/src'
C++ /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o
C++ /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o
Ar /home/james/git/cppcmd1.0.0/src/../lib/libcppcmd.a
make[1]: Leaving directory '/home/james/git/cppcmd1.0.0/src'
make[1]: Entering directory '/home/james/git/cppcmd1.0.0/test'
C++ /home/james/git/cppcmd1.0.0/test/.obj/cmdtest.o
C++ /home/james/git/cppcmd1.0.0/test/.obj/test.o
Link /home/james/git/cppcmd1.0.0/test/../bin/test
make[1]: Leaving directory '/home/james/git/cppcmd1.0.0/test'
make: Leaving directory '/home/james/git/cppcmd1.0.0'

2.27 --no-print-directory

关闭-w,即使它是隐式打开的(Turn off -w, even if it was turned on implicitly).

cppcmd$ make --no-print-directory
C++ /home/james/git/cppcmd1.0.0/src/.obj/cppcmd.o
C++ /home/james/git/cppcmd1.0.0/src/.obj/cmdio.o
Ar /home/james/git/cppcmd1.0.0/src/../lib/libcppcmd.a
C++ /home/james/git/cppcmd1.0.0/test/.obj/cmdtest.o
C++ /home/james/git/cppcmd1.0.0/test/.obj/test.o
Link /home/james/git/cppcmd1.0.0/test/../bin/test

2.28 -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE

设定文件FILE的时间戳为当前时间,但不改变文件实际的最后修改时间。此选项主要是为实现了对所有依赖于文件“FILE”的目标的强制重建(Consider FILE to be infinitely new).

$ make -W file.c

2.29 --warn-undefined-variables

引用未定义的变量时发出警告(Warn when an undefined variable is referenced).

$ make --warn-undefined-variables
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysnow010

你的鼓励就是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值