简介

对于比较大的项目手动去编写很多makefile是不合理的, Autotools是一种自动产生Makefile的工具集,我毕业设计就是用的这套工具,整体感觉还是比较繁琐。Cmake出现要晚一点,在效率和使用上都要好些。当然Cmake只能用来构建C++/Java。

基本语法元素

常用指令

PROJECT(sample [CXX] [C] [Java])

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
SET(SRC_FILES sample.cpp)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) # build/bin
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)    # build/lib

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
ADD_SUBDIRECTORY(src bin)

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
MESSAGE(STATUS "This is SOURCE dir "${PROJECT_SOURCE_DIR})
MESSAGE(STATUS "This is BINARY dir "${PROJECT_BINARY_DIR})

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
LINK_DIRECTORIES(directory1 directory2 ...)
TARGET_LINK_LIBRARIES(target library1
        <debug | optimized> library2
        ...)
ADD_EXECUTABLE(sample ${SRC_FILES})

ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
        source1 source2 ... sourceN)
ADD_LIBRARY(hello SHARED ${SRC_FILES})

SET_TARGET_PROPERTIES(target1 target2 ...
        PROPERTIES prop1 value1
                prop2 value2 ...)

# 这种方法用来处理TARGE不能重名,但是又想输出同名的文件
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)

ADD_DEFINITIONS(-DENABLE_DEBUG -DABC)
SET(CMAKE_C_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
SET(CMAKE_CXX_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
ADD_DEPENDENCIES(target-name depend-target1 depend-target2 ...)

安装指令

安装指令比较复杂,安装前缀CMAKE_INSTALL_PREFIX默认值为/usr/local

INSTALL(TARGETS targets...
        [[ARCHIVE|LIBRARY|RUNTIME]
                [DESTINATION <dir>]
                [PERMISSIONS permissions...]
                [CONFIGURATIONS [Debug|Release|...]]
                [COMPONENT <component>]
                [OPTIONAL]]
        [...])
INSTALL(TARGETS myrun mylib mystaticlib
        RUNTIME DESTINATION bin         # ${CMAKE_INSTALL_PREFIX}/bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION libstatic
        )

INSTALL(FILES files... DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>]
        [RENAME <name>]
        [OPTIONAL])
INSTALL(FILES hello.h DESTINATION include/hello)

INSTALL(PROGRAMS files... DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>]
        [RENAME <name>]
        [OPTIONAL])

INSTALL(DIRECTORY dirs... DESTINATION <dir>
        [FILE_PERMISSIONS permissions...]
        [DIRECTORY_PERMISSIONS permissions...]
        [USE_SOURCE_PERMISSIONS]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>]
        [[PATTERN <pattern> | REGEX <regex>]
                [EXCLUDE]
                [PERMISSIONS permissions...]]
        [...])
# Note: if dirs with / means move content, no / means move dir
INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj
        PATTERN "CVS" EXCLUDE
        PATTERN "scripts/*"
        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
                GROUP_EXECUTE GROUP_READ)

INSTALL([[SCRIPT <file>] [CODE <code>]] [...])