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 |