autoconf、configure、make 命令

推荐链接:

在线试用 Linux 发行版 — 在线Linux终端

Make 命令教程

编译安装应用程序,只有这几步:

1
2
3
4
5
autoconf
./configure --prefix=/opt/local/git
make all # 等价于 make
make install
make distclean

autoconf

如果你在源码目录里没有看到 configure,而有 configure.ac,那是源码模板,你需要用 autoconf 生成:

1
2
# 根据 `configure.ac` 生成 `configure` 脚本
autoconf

autoconf 与 make configure 的区别

命令 类型 作用
autoconf 正宗的工具命令 属于 GNU Autotools,用于从 configure.ac 自动生成标准的 configure 脚本。
make configure 初始 Makefile 的 configure 目标 某些项目源代码里原本就附带了一个“手写”或“初始”的 Makefile,其中定义了一个 configure 目标,通常用于调用 autoconf 或相关工具链生成 configure 脚本
也就是说,make configure 相当于间接调用 autoconf,但它依赖于初始 Makefile 中有没有定义这个目标。

configure

configure 是一个 Shell 脚本,它的作用是在不同 Unix/Linux 平台上自动检测系统特性,并生成适合当前环境的构建文件(如 Makefile 和头文件),使源代码可以顺利被编译和链接。

作用

  • 检查系统环境(操作系统和架构、C 编译器、依赖库/头文件、头文件等)
  • 根据提供的选项(如 --prefix--with-xxx)生成定制化的、符合GNU规范的 Makefile 文件
  • 输出配置状态文件(如 config.statusconfig.h

通用且常用的选项

1
2
# 指定安装路径前缀。执行文件安装在 `/usr/local/bin`,资源文件安装在 `/usr/local/share`。
./configure --prefix=/usr/local

程序支持的选项

每个程序支持的选项都不同,执行 ./configure --help 列出具体支持。大致可归类如下:

1
2
3
4
5
--enable-* \              # 内建功能的开关,启用可选功能。
--disable-* \ # 内建功能的开关,禁用可选功能。
--with-* \ # 用于 指定依赖库的支持与路径,或者是否使用某些外部组件。
--without-* \ # 用于 指定依赖库的支持与路径,或者是否使用某些外部组件。
--with-zlib=/usr/local # 启用 zlib 支持,并指定其安装路径。

nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
[root@localhost nginx-1.26.3]# ./configure --help
--help print this message

--prefix=PATH set installation prefix
--sbin-path=PATH set nginx binary pathname
--modules-path=PATH set modules path
--conf-path=PATH set nginx.conf pathname
--error-log-path=PATH set error log pathname
--pid-path=PATH set nginx.pid pathname
--lock-path=PATH set nginx.lock pathname

--user=USER set non-privileged user for
worker processes
--group=GROUP set non-privileged group for
worker processes

--build=NAME set build name
--builddir=DIR set build directory

--with-select_module enable select module
--without-select_module disable select module
--with-poll_module enable poll module
--without-poll_module disable poll module

--with-threads enable thread pool support

--with-file-aio enable file AIO support

--without-quic_bpf_module disable ngx_quic_bpf_module

--with-http_ssl_module enable ngx_http_ssl_module
--with-http_v2_module enable ngx_http_v2_module
--with-http_v3_module enable ngx_http_v3_module
--with-http_realip_module enable ngx_http_realip_module
--with-http_addition_module enable ngx_http_addition_module
--with-http_xslt_module enable ngx_http_xslt_module
--with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module
--with-http_image_filter_module enable ngx_http_image_filter_module
--with-http_image_filter_module=dynamic
enable dynamic ngx_http_image_filter_module
--with-http_geoip_module enable ngx_http_geoip_module
--with-http_geoip_module=dynamic enable dynamic ngx_http_geoip_module
--with-http_sub_module enable ngx_http_sub_module
--with-http_dav_module enable ngx_http_dav_module
--with-http_flv_module enable ngx_http_flv_module
--with-http_mp4_module enable ngx_http_mp4_module
--with-http_gunzip_module enable ngx_http_gunzip_module
--with-http_gzip_static_module enable ngx_http_gzip_static_module
--with-http_auth_request_module enable ngx_http_auth_request_module
--with-http_random_index_module enable ngx_http_random_index_module
--with-http_secure_link_module enable ngx_http_secure_link_module
--with-http_degradation_module enable ngx_http_degradation_module
--with-http_slice_module enable ngx_http_slice_module
--with-http_stub_status_module enable ngx_http_stub_status_module

--without-http_charset_module disable ngx_http_charset_module
--without-http_gzip_module disable ngx_http_gzip_module
--without-http_ssi_module disable ngx_http_ssi_module
--without-http_userid_module disable ngx_http_userid_module
--without-http_access_module disable ngx_http_access_module
--without-http_auth_basic_module disable ngx_http_auth_basic_module
--without-http_mirror_module disable ngx_http_mirror_module
--without-http_autoindex_module disable ngx_http_autoindex_module
--without-http_geo_module disable ngx_http_geo_module
--without-http_map_module disable ngx_http_map_module
--without-http_split_clients_module disable ngx_http_split_clients_module
--without-http_referer_module disable ngx_http_referer_module
--without-http_rewrite_module disable ngx_http_rewrite_module
--without-http_proxy_module disable ngx_http_proxy_module
--without-http_fastcgi_module disable ngx_http_fastcgi_module
--without-http_uwsgi_module disable ngx_http_uwsgi_module
--without-http_scgi_module disable ngx_http_scgi_module
--without-http_grpc_module disable ngx_http_grpc_module
--without-http_memcached_module disable ngx_http_memcached_module
--without-http_limit_conn_module disable ngx_http_limit_conn_module
--without-http_limit_req_module disable ngx_http_limit_req_module
--without-http_empty_gif_module disable ngx_http_empty_gif_module
--without-http_browser_module disable ngx_http_browser_module
--without-http_upstream_hash_module
disable ngx_http_upstream_hash_module
--without-http_upstream_ip_hash_module
disable ngx_http_upstream_ip_hash_module
--without-http_upstream_least_conn_module
disable ngx_http_upstream_least_conn_module
--without-http_upstream_random_module
disable ngx_http_upstream_random_module
--without-http_upstream_keepalive_module
disable ngx_http_upstream_keepalive_module
--without-http_upstream_zone_module
disable ngx_http_upstream_zone_module

--with-http_perl_module enable ngx_http_perl_module
--with-http_perl_module=dynamic enable dynamic ngx_http_perl_module
--with-perl_modules_path=PATH set Perl modules path
--with-perl=PATH set perl binary pathname

--http-log-path=PATH set http access log pathname
--http-client-body-temp-path=PATH set path to store
http client request body temporary files
--http-proxy-temp-path=PATH set path to store
http proxy temporary files
--http-fastcgi-temp-path=PATH set path to store
http fastcgi temporary files
--http-uwsgi-temp-path=PATH set path to store
http uwsgi temporary files
--http-scgi-temp-path=PATH set path to store
http scgi temporary files

--without-http disable HTTP server
--without-http-cache disable HTTP cache

--with-mail enable POP3/IMAP4/SMTP proxy module
--with-mail=dynamic enable dynamic POP3/IMAP4/SMTP proxy module
--with-mail_ssl_module enable ngx_mail_ssl_module
--without-mail_pop3_module disable ngx_mail_pop3_module
--without-mail_imap_module disable ngx_mail_imap_module
--without-mail_smtp_module disable ngx_mail_smtp_module

--with-stream enable TCP/UDP proxy module
--with-stream=dynamic enable dynamic TCP/UDP proxy module
--with-stream_ssl_module enable ngx_stream_ssl_module
--with-stream_realip_module enable ngx_stream_realip_module
--with-stream_geoip_module enable ngx_stream_geoip_module
--with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module
--with-stream_ssl_preread_module enable ngx_stream_ssl_preread_module
--without-stream_limit_conn_module disable ngx_stream_limit_conn_module
--without-stream_access_module disable ngx_stream_access_module
--without-stream_geo_module disable ngx_stream_geo_module
--without-stream_map_module disable ngx_stream_map_module
--without-stream_split_clients_module
disable ngx_stream_split_clients_module
--without-stream_return_module disable ngx_stream_return_module
--without-stream_pass_module disable ngx_stream_pass_module
--without-stream_set_module disable ngx_stream_set_module
--without-stream_upstream_hash_module
disable ngx_stream_upstream_hash_module
--without-stream_upstream_least_conn_module
disable ngx_stream_upstream_least_conn_module
--without-stream_upstream_random_module
disable ngx_stream_upstream_random_module
--without-stream_upstream_zone_module
disable ngx_stream_upstream_zone_module

--with-google_perftools_module enable ngx_google_perftools_module
--with-cpp_test_module enable ngx_cpp_test_module

--add-module=PATH enable external module
--add-dynamic-module=PATH enable dynamic external module

--with-compat dynamic modules compatibility

--with-cc=PATH set C compiler pathname
--with-cpp=PATH set C preprocessor pathname
--with-cc-opt=OPTIONS set additional C compiler options
--with-ld-opt=OPTIONS set additional linker options
--with-cpu-opt=CPU build for the specified CPU, valid values:
pentium, pentiumpro, pentium3, pentium4,
athlon, opteron, sparc32, sparc64, ppc64

--without-pcre disable PCRE library usage
--with-pcre force PCRE library usage
--with-pcre=DIR set path to PCRE library sources
--with-pcre-opt=OPTIONS set additional build options for PCRE
--with-pcre-jit build PCRE with JIT compilation support
--without-pcre2 do not use PCRE2 library

--with-zlib=DIR set path to zlib library sources
--with-zlib-opt=OPTIONS set additional build options for zlib
--with-zlib-asm=CPU use zlib assembler sources optimized
for the specified CPU, valid values:
pentium, pentiumpro

--with-libatomic force libatomic_ops library usage
--with-libatomic=DIR set path to libatomic_ops library sources

--with-openssl=DIR set path to OpenSSL library sources
--with-openssl-opt=OPTIONS set additional build options for OpenSSL

--with-debug enable debug logging

git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
[root@gzbh-dev-zhaolanqi git-2.49.0]# ./configure --help
`configure' configures git @GIT_VERSION@ to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print `checking ...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for `--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or `..']

Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]

By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc. You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
--sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
--datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
--datadir=DIR read-only architecture-independent data [DATAROOTDIR]
--infodir=DIR info documentation [DATAROOTDIR/info]
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/git]
--htmldir=DIR html documentation [DOCDIR]
--dvidir=DIR dvi documentation [DOCDIR]
--pdfdir=DIR pdf documentation [DOCDIR]
--psdir=DIR ps documentation [DOCDIR]

Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-pthreads=FLAGS FLAGS is the value to pass to the compiler to enable
POSIX Threads. The default if FLAGS is not specified
is to try first -pthread and then -lpthread.
--disable-pthreads will disable threading.
--enable-jsmin=PATH PATH is the name of a JavaScript minifier or the
absolute path to one.
--enable-cssmin=PATH PATH is the name of a CSS minifier or the absolute
path to one.

Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-sane-tool-path=DIR-1[:DIR-2...:DIR-n]
Directories to prepend to PATH in build system and
generated scripts
--with-lib=ARG ARG specifies alternative name for lib directory
--with-openssl use OpenSSL library (default is YES)
ARG can be prefix for openssl library and headers
--with-libpcre1 DEPRECATED
--with-libpcre synonym for --with-libpcre2
--with-libpcre2 support Perl-compatible regexes via libpcre2
(default is NO)
ARG can be also prefix for libpcre library and
headers
--with-curl support http(s):// transports (default is YES)
ARG can be also prefix for curl library and headers
--with-expat support git-push using http:// and https://
transports via WebDAV (default is YES)
ARG can be also prefix for expat library and headers
--without-iconv if your architecture doesn't properly support iconv
--with-iconv=PATH PATH is prefix for libiconv library and headers
used only if you need linking with libiconv
--with-gitconfig=VALUE Use VALUE instead of /etc/gitconfig as the global
git configuration file. If VALUE is not fully
qualified it will be interpreted as a path relative
to the computed prefix at runtime.
--with-gitattributes=VALUE
Use VALUE instead of /etc/gitattributes as the
global git attributes file. If VALUE is not fully
qualified it will be interpreted as a path relative
to the computed prefix at runtime.
--with-pager=VALUE Use VALUE as the fall-back pager instead of 'less'.
This is used by things like 'git log' when the user
does not specify a pager to use through alternate
methods. eg: /usr/bin/pager
--with-editor=VALUE Use VALUE as the fall-back editor instead of 'vi'.
This is used by things like 'git commit' when the
user does not specify a preferred editor through
other methods. eg: /usr/bin/editor
--with-shell=PATH provide PATH to shell
--with-perl=PATH provide PATH to perl
--with-python=PATH provide PATH to python
--with-zlib=PATH provide PATH to zlib
--with-tcltk use Tcl/Tk GUI (default is YES)
ARG is the full path to the Tcl/Tk interpreter.
Bare --with-tcltk will make the GUI part only if
Tcl/Tk interpreter will be found in a system.

Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
nonstandard directory <lib dir>
LIBS libraries to pass to the linker, e.g. -l<library>
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
CPP C preprocessor

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

Report bugs to <git@vger.kernel.org>.

如何查看默认安装位置

方式一:有些程序的 ./configure --help 会标明 --prefix 默认值。

方式二:在 Makefile 文件中检索 prefix

make

make –help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Usage: make [options] [target] ...
Options:
-b, -m Ignored for compatibility.
-B, --always-make Unconditionally make all targets.
-C DIRECTORY, --directory=DIRECTORY
Change to DIRECTORY before doing anything.
-d Print lots of debugging information.
--debug[=FLAGS] Print various types of debugging information.
-e, --environment-overrides
Environment variables override makefiles.
--eval=STRING Evaluate STRING as a makefile statement.
-f FILE, --file=FILE, --makefile=FILE
Read FILE as a makefile.
-h, --help Print this message and exit.
-i, --ignore-errors Ignore errors from recipes.
-I DIRECTORY, --include-dir=DIRECTORY
Search DIRECTORY for included makefiles.
-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.
-l [N], --load-average[=N], --max-load[=N]
Don't start multiple jobs unless load is below N.
-L, --check-symlink-times Use the latest mtime between symlinks and target.
-n, --just-print, --dry-run, --recon
Don't actually run any recipe; just print them.
-o FILE, --old-file=FILE, --assume-old=FILE
Consider FILE to be very old and don't remake it.
-p, --print-data-base Print make's internal database.
-q, --question Run no recipe; exit status says if up to date.
-r, --no-builtin-rules Disable the built-in implicit rules.
-R, --no-builtin-variables Disable the built-in variable settings.
-s, --silent, --quiet Don't echo recipes.
-S, --no-keep-going, --stop
Turns off -k.
-t, --touch Touch targets instead of remaking them.
-v, --version Print the version number of make and exit.
-w, --print-directory Print the current directory.
--no-print-directory Turn off -w, even if it was turned on implicitly.
-W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE
Consider FILE to be infinitely new.
--warn-undefined-variables Warn when an undefined variable is referenced.
--warn-undefined-functions Warn when an undefined user function is called.

This program built for x86_64-redhat-linux-gnu
Report bugs to <bug-make@gnu.org>

make 或 make all

作用:执行 Makefileall 目标。根据 Makefile 的规则编译源代码(如 .c.cpp),最终生成的产物是:

  • 可执行文件(如 myappmain
  • 静态库文件.a 文件)
  • 动态库文件.so 文件)
  • 有时还可能生成中间文件(.o)、头文件、配置文件等

打开 Makefile 文件,前两行内容已说明 Makefile 的默认目标是 all ,所以 make 等价于make all

1
2
# The default target of this Makefile is...
all::

make install

作用:执行 Makefileinstall 目标。将编译好的文件复制到系统目录(如 /usr/local/bin/usr/local/lib 等)。

以下是 Makefile 文件 install 目标的示例,此目标依赖于 all,也就是说,执行 make install先执行 make all,所以你无需执行 make all

1
2
3
4
5
6
7
8
install: all
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
$(INSTALL) $(INSTALL_STRIP) $(PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
$(INSTALL) $(SCRIPTS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
$(INSTALL) $(INSTALL_STRIP) $(install_bindir_xprograms) '$(DESTDIR_SQ)$(bindir_SQ)'
$(INSTALL) $(BINDIR_PROGRAMS_NO_X) '$(DESTDIR_SQ)$(bindir_SQ)'

make clean

作用

  • 执行 Makefileclean 目标。删除编译过程中生成的临时文件、目标文件(.o)、中间产物和最终的二进制文件(可执行文件、库等),保留源文件和 Makefile
  • 有利于重新编译或打包源码

make distclean

make distclean 是一个比 make clean 更彻底的清理命令,常用于在编译源码项目时,完全恢复到初始状态(就像刚解压出来的源码包那样)。

作用:执行 Makefiledistclean 目标。distclean 目标依赖于 clean,也就是说,执行 make distclean先执行 make clean。此外,它还会删除 configure、Makefile 等文件

以下是 Makefile 文件 distclean 目标的示例:

1
2
3
4
5
distclean: clean
$(RM) configure
$(RM) config.log config.status config.cache
$(RM) config.mak.autogen config.mak.append
$(RM) -r autom4te.cache