Cmake Practice
简介
对于比较大的项目手动去编写很多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>]] [...])