cmake和automake本质上都是用来生成Makefile的工具,为啥Makefile需要工具来生成呢?因为大型的C和C++项目构建步骤特别繁琐,自己维护Makefile特别麻烦,因此懒惰的程序员们开发了各种生成Makefile的工具,cmake和automake就是这样的工具。
automake使用#
- 运行autoscan命令
- 将configure.scan 文件重命名为configure.in,并修改configure.in文件
- 在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件
- 在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS文件
- 将/usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下
- 运行aclocal命令
- 运行autoconf命令
- 运行automake -a命令
- 运行./confiugre脚本(常见的开源软件基本已经提前生成好了configure文件了)
cmake使用#
使用cmake仅需要提供一份CMakeLists.txt, 然后运行cmake命令,即可得到一份Makefile文件。
功能对比#
命令 |
automake |
cmake |
变量定义 |
name=... |
set(name, "...") |
环境检测 |
AC_INIT |
AC_PROG_CC |
AC_CHECK_LIB([pthread], [pthread_rwlock_init]) |
AC_PROG_RANLIB |
AC_OUTPUT |
|
find_library(lib libname pathllist) |
find_package(packename) |
find_path(var name pathlist) |
find_program(var name pathlist) |
|
子目录 |
SUBDIRS= |
add_subdirectory(list) |
可执行文件 |
bin_PROGRAMS=binname |
binname_SOURCES= |
binname_LDADD= |
binname_CFLAGS= |
binname_LDFLAGS= |
|
add_executable(binname ${sources}) |
target_link_libraries(binname librarylist) |
|
动态库 |
lib_LIBRARIES=libname.so |
libname_SOURCES= |
|
add_library(libname shared ${source})
|
静态库 |
lib_LIBRARIES=libname.a |
ibname_a_SOURCES= |
|
add_library(libname static ${source})
|
头文件 |
INCLUDES= |
include_HEADES=或CFLAGS=-I |
|
include_directories(list)
|
源码搜索 |
|
aux_source_directories(. list)
|
依赖库 |
LIBS= 或 LDADD= |
target_link_libraries(binname librarylist)
|
标志 |
CFLAGS= 或 LDFLAGS= |
set(CMAKE_C_FLAGS ...)
|
libtool |
AC_PROG_LIBTOOL |
lib_LTLIBRARIES=name.la |
name_la_SOURCES= |
|
|
条件语句 |
使用Make的条件语句 if() endif |
if(my), else(my), endif(my), while(condition), endwhile(condition) |
执行外部命令 |
|
exec_program(commd ) |
子模块 |
|
include() |
信息输出 |
|
messge(STATUS "messge") |
项目 |
|
project(name) |
其他文件 |
EXTRA_DIST |
install(FILES files.. ), install(DIRECTORY dirs..) |
安装设置 |
EXTRA_DIST |
install |