12 Dec 2016 | linux
linux党想必都见过MakeFile,在我们安装软件的时候,有时候只要解压缩 tar.gz 文件,执行 ./configure ,再执行 make ,make install即可安装软件。那么MakeFile到底是个什么东西,实际上是把我们的编译命令都写在了一个文件里。一般我们写个几十行小代码的时候不这么干,而是直接用命令,因为这样很烦…今天看 《Vim 实用技巧》时看到一个 quickfix 工具,可以直接在 Vim 中编译代码。我心花还没怒放,就看到后面跟着在 Vim 中输入 :make 。然而这是要有前提条件你的工程文件夹里包含了MakeFile。于是我心头一动,写MakeFile好麻烦,有没有什么自动生成的工具呢。事实证明懒惰促进人类进步,这种东西怎么可能没有,于是我就花了一个晚上,整通了比写MakeFile更麻烦的自动生成MakeFile…
cd your_project_dir
autoscan
然后会自动生成 configure.scan 和 configure.log 。我们修改 configure.scan 为 configure.ac 。此处注意,网上一般的教程是说修改为 configure.in ,如果是这样的话之后执行 aclocal 会有warning,in后缀已经过时弃用啦。
vim configure.ac
可以看到内容如下
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
三个参数分别为你的package名字,版本号,和联系邮箱。
它是automake所必备的宏。一般的教程会让你和 AC_INIT 一样加参数 package 和版本号,但是实测如果加了之后运行 automake 时会报warning
AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated. For more info, see:
configure.in:5: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation
于是把后面的参数去掉,只写 AM_INIT_AUTOMAKE。
在最后一行 AC_OUTPUT 后加参数,生成MakeFile。
AC_OUTPUT([MakeFile])
新建文件 MakeFile.am ,内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=your_excutable_file
2_SOURCES=your_source_file.c your_source_file.h
第二个参数是你要生成的可执行文件,第三个为你的源文件及其头文件。
之前的操作会生成可执行文件 configure ,运行 ./configure 。如果没出错的话会生成 MakeFile 文件。
./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for g++... g++
checking whether the C++ compiler works... yes
checking for C++ compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for style of include used by make... GNU
checking dependency style of g++... gcc3
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating MakeFile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands
重点终于到了,接下来就可以make了。然而我在make时遇到一个问题,即显示 没有找到makefile。后来发现是大小写的问题,它无法识别MakeFile,而只接受 makefile…可以试下
make -f MakeFile
-f 参数为指定文件,或者直接把文件名改掉…
命令如题,安装你的程序。然后你直接输入你的可执行文件名就可以在任何地方执行你的程序啦。
命令如题,清除一些工程文件。
命令如题,把你的程序打包成 your_project-version.tar.gz 。