https://www.cnblogs.com/qixianyu/p/6574048.html
CMake学习之路
一 为什么使用CMake
CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。总之很强大!
三 CMake基本使用和语法
1
|
command (args ...)
|
command 是命令名,大小写无关(注意:变量是大小写相关的)
args 是参数,参数如果有空格,应该用双引号括起来
变量引用用${VAR}语法
set命令可以将多变量可以放在一起,合成为一个变量,如下所示
1
2
|
set(Foo a b c)
command(${Foo})=command(a b c)<br>command(
"${Foo}"
)=command(
"a b c"
)
|
CMake可以直接获取系统环境变量和Windows注册值。为了获取系统环境变量,需要语法
1
|
$ENV{VAR}
|
四 CMake中的Hello World
CMakeLists.txt文件中
1
2
|
project(Hello)
add_executable(Hello Hello.c)
|
这只是最简单的版本,下面还有一个复杂一些的版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
cmake_minimum_required (2.6)
project (HELLO)
set (HELLO_SRCS Hello.c File2.c File3.c)
if
(win32)
set (HELLO_SRCS ${HELLO_SRCS} WinSupport.c)
else
()
set (HELLO_SRCS ${HELLO_SRCS} UnixSupport.c)
endif ()
add_executable (Hello ${HELLO_SRCS})
#look for Tcl library
find_library (TCL_LIBRARY NAMES tcl tcl84 tcl83 tcl82 tcl80 PATHS /usr/lib /usr/local/lib)
if
(TCL_LIBRARY)
target_link_library (HELLO ${TCL_LIBRARY})
endif ()
|
五 Run Cmake
cd Hello
cmake ..
make
六 CMake帮助文档
安装完之后,进入/usr/share/cmake
目录形式如下
.
├── completions
├── editors
│ ├── emacs
│ └── vim
├── Help
│ ├── command
│ ├── generator
│ ├── include
│ ├── manual
│ ├── module
│ ├── policy
│ ├── prop_cache
│ ├── prop_dir
│ ├── prop_gbl
│ ├── prop_inst
│ ├── prop_sf
│ ├── prop_test
│ ├── prop_tgt
│ ├── release
│ └── variable
├── include
├── Modules
│ ├── CMakeAddFortranSubdirectory
│ ├── Compiler
│ ├── CompilerId
│ ├── FindCUDA
│ ├── FortranCInterface
│ │ └── Verify
│ ├── IntelVSImplicitPath
│ ├── Internal
│ └── Platform
└── Templates
└── Windows
其中需要注意的是Help目录和Modules目录,Help目录为帮助文档,Modulues目录为find_package指令的查找目录之一。
cmake --help
我们可以查看cmake帮助,这个很全,比如显示cmake的指令
cmake --help-command-list
add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command build_name cmake_host_system_information cmake_minimum_required cmake_policy configure_file continue create_test_sourcelist ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile exec_program execute_process export export_library_dependencies file find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install install_files install_programs install_targets link_directories link_libraries list load_cache load_command macro make_directory mark_as_advanced math message option output_required_files project qt_wrap_cpp qt_wrap_ui remove remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string subdir_depends subdirs target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_libraries target_sources try_compile try_run unset use_mangled_mesa utility_source variable_requires variable_watch while write_file
再如cmake定义的变量
cmake --help-variable-list
<PROJECT-NAME>_BINARY_DIR <PROJECT-NAME>_SOURCE_DIR <PROJECT-NAME>_VERSION <PROJECT-NAME>_VERSION_MAJOR <PROJECT-NAME>_VERSION_MINOR <PROJECT-NAME>_VERSION_PATCH <PROJECT-NAME>_VERSION_TWEAK APPLE BORLAND BUILD_SHARED_LIBS CMAKE_<CONFIG>_POSTFIX CMAKE_<LANG>_ARCHIVE_APPEND CMAKE_<LANG>_ARCHIVE_CREATE CMAKE_<LANG>_ARCHIVE_FINISH CMAKE_<LANG>_COMPILER CMAKE_<LANG>_COMPILER_ABI CMAKE_<LANG>_COMPILER_EXTERNAL_TOOLCHAIN CMAKE_<LANG>_COMPILER_ID CMAKE_<LANG>_COMPILER_LOADED CMAKE_<LANG>_COMPILER_TARGET CMAKE_<LANG>_COMPILER_VERSION CMAKE_<LANG>_COMPILE_OBJECT CMAKE_<LANG>_CREATE_SHARED_LIBRARY CMAKE_<LANG>_CREATE_SHARED_MODULE CMAKE_<LANG>_CREATE_STATIC_LIBRARY CMAKE_<LANG>_FLAGS CMAKE_<LANG>_FLAGS_DEBUG CMAKE_<LANG>_FLAGS_MINSIZEREL CMAKE_<LANG>_FLAGS_RELEASE CMAKE_<LANG>_FLAGS_RELWITHDEBINFO CMAKE_<LANG>_IGNORE_EXTENSIONS
cmake --help-variable-list CMAKE_<LANG>_IMPLICIT_INCLUDE_DIRECTORIESCMAKE_<LANG> _IMPLICIT_LINK_DIRECTORIESCMAKE_<LANG> _IMPLICIT_LINK_FRAMEWORK_DIRECTORIESCMAKE_<LANG> _IMPLICIT_LINK_LIBRARIESCMAKE_<LANG> _LIBRARY_ARCHITECTURECMAKE_<LANG> _LINKER_PREFERENCECMAKE_<LANG> _LINKER_PREFERENCE_PROPAGATESCMAKE_<LANG> _LINK_EXECUTABLECMAKE_<LANG> _OUTPUT_EXTENSIONCMAKE_<LANG> _PLATFORM_IDCMAKE_<LANG> _SIMULATE_IDCMAKE_<LANG> _SIMULATE_VERSIONCMAKE_<LANG> _SIZEOF_DATA_PTRCMAKE_<LANG> _SOURCE_FILE_EXTENSIONSCMAKE_<LANG> _VISIBILITY_PRESETCMAKE_ABSOLUTE_DESTINATION_FILESCMAKE_ANDROID_APICMAKE_ANDROID_API_MINCMAKE_ANDROID_GUICMAKE_APPBUNDLE_PATHCMAKE_ARCMAKE_ARCHIVE_OUTPUT_DIRECTORYCMAKE_ARGCCMAKE_ARGV0CMAKE_AUTOMOCCMAKE_AUTOMOC_MOC_OPTIONSCMAKE_AUTOMOC_RELAXED_MODECMAKE_AUTORCCCMAKE_AUTORCC_OPTIONSCMAKE_AUTOUICCMAKE_AUTOUIC_OPTIONSCMAKE_BACKWARDS_COMPATIBILITYCMAKE_BINARY_DIRCMAKE_BUILD_TOOLCMAKE_BUILD_TYPECMAKE_BUILD_WITH_INSTALL_RPATHCMAKE_CACHEFILE_DIRCMAKE_CACHE_MAJOR_VERSIONCMAKE_CACHE_MINOR_VERSIONCMAKE_CACHE_PATCH_VERSIONCMAKE_CFG_INTDIRCMAKE_CL_64CMAKE_COLOR_MAKEFILECMAKE_COMMANDCMAKE_COMPILER_2005CMAKE_COMPILER_IS_GNU<LANG> CMAKE_COMPILE_PDB_OUTPUT_DIRECTORYCMAKE_COMPILE_PDB_OUTPUT_DIRECTORY_<CONFIG> CMAKE_CONFIGURATION_TYPESCMAKE_CROSSCOMPILINGCMAKE_CTEST_COMMANDCMAKE_CURRENT_BINARY_DIRCMAKE_CURRENT_LIST_DIRCMAKE_CURRENT_LIST_FILECMAKE_CURRENT_LIST_LINECMAKE_CURRENT_SOURCE_DIRCMAKE_CXX_COMPILE_FEATURESCMAKE_CXX_EXTENSIONSCMAKE_CXX_STANDARDCMAKE_CXX_STANDARD_REQUIREDCMAKE_C_COMPILE_FEATURESCMAKE_C_EXTENSIONSCMAKE_C_STANDARDCMAKE_C_STANDARD_REQUIREDCMAKE_DEBUG_POSTFIXCMAKE_DEBUG_TARGET_PROPERTIESCMAKE_DISABLE_FIND_PACKAGE_<PackageName> CMAKE_DL_LIBSCMAKE_EDIT_COMMANDCMAKE_ERROR_DEPRECATEDCMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATIONCMAKE_EXECUTABLE_SUFFIXCMAKE_EXE_LINKER_FLAGSCMAKE_EXE_LINKER_FLAGS_<CONFIG> CMAKE_EXPORT_NO_PACKAGE_REGISTRYCMAKE_EXTRA_GENERATORCMAKE_EXTRA_SHARED_LIBRARY_SUFFIXESCMAKE_FIND_LIBRARY_PREFIXESCMAKE_FIND_LIBRARY_SUFFIXESCMAKE_FIND_NO_INSTALL_PREFIXCMAKE_FIND_PACKAGE_NAMECMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRYCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRYCMAKE_FIND_PACKAGE_WARN_NO_MODULECMAKE_FIND_ROOT_PATHCMAKE_FIND_ROOT_PATH_MODE_INCLUDECMAKE_FIND_ROOT_PATH_MODE_LIBRARYCMAKE_FIND_ROOT_PATH_MODE_PACKAGECMAKE_FIND_ROOT_PATH_MODE_PROGRAMCMAKE_FRAMEWORK_PATHCMAKE_Fortran_FORMATCMAKE_Fortran_MODDIR_DEFAULTCMAKE_Fortran_MODDIR_FLAGCMAKE_Fortran_MODOUT_FLAGCMAKE_Fortran_MODULE_DIRECTORYCMAKE_GENERATORCMAKE_GENERATOR_PLATFORMCMAKE_GENERATOR_TOOLSETCMAKE_GNUtoMSCMAKE_HOME_DIRECTORYCMAKE_HOST_APPLECMAKE_HOST_SYSTEMCMAKE_HOST_SYSTEM_NAMECMAKE_HOST_SYSTEM_PROCESSORCMAKE_HOST_SYSTEM_VERSIONCMAKE_HOST_UNIXCMAKE_HOST_WIN32CMAKE_IGNORE_PATHCMAKE_IMPORT_LIBRARY_PREFIXCMAKE_IMPORT_LIBRARY_SUFFIXCMAKE_INCLUDE_CURRENT_DIRCMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACECMAKE_INCLUDE_DIRECTORIES_BEFORECMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORECMAKE_INCLUDE_PATHCMAKE_INSTALL_DEFAULT_COMPONENT_NAMECMAKE_INSTALL_MESSAGECMAKE_INSTALL_NAME_DIRCMAKE_INSTALL_PREFIXCMAKE_INSTALL_RPATHCMAKE_INSTALL_RPATH_USE_LINK_PATHCMAKE_INTERNAL_PLATFORM_ABICMAKE_JOB_POOL_COMPILECMAKE_JOB_POOL_LINKCMAKE_LIBRARY_ARCHITECTURECMAKE_LIBRARY_ARCHITECTURE_REGEXCMAKE_LIBRARY_OUTPUT_DIRECTORYCMAKE_LIBRARY_PATHCMAKE_LIBRARY_PATH_FLAGCMAKE_LINK_DEF_FILE_FLAGCMAKE_LINK_DEPENDS_NO_SHAREDCMAKE_LINK_INTERFACE_LIBRARIESCMAKE_LINK_LIBRARY_FILE_FLAGCMAKE_LINK_LIBRARY_FLAGCMAKE_LINK_LIBRARY_SUFFIXCMAKE_MACOSX_BUNDLECMAKE_MACOSX_RPATHCMAKE_MAJOR_VERSIONCMAKE_MAKE_PROGRAMCMAKE_MAP_IMPORTED_CONFIG_<CONFIG> CMAKE_MATCH_COUNTCMAKE_MFC_FLAGCMAKE_MINIMUM_REQUIRED_VERSIONCMAKE_MINOR_VERSIONCMAKE_MODULE_LINKER_FLAGSCMAKE_MODULE_LINKER_FLAGS_<CONFIG> CMAKE_MODULE_PATHCMAKE_NOT_USING_CONFIG_FLAGSCMAKE_NO_BUILTIN_CHRPATHCMAKE_NO_SYSTEM_FROM_IMPORTEDCMAKE_OBJECT_PATH_MAXCMAKE_OSX_ARCHITECTURESCMAKE_OSX_DEPLOYMENT_TARGETCMAKE_OSX_SYSROOTCMAKE_PARENT_LIST_FILECMAKE_PATCH_VERSIONCMAKE_PDB_OUTPUT_DIRECTORYCMAKE_PDB_OUTPUT_DIRECTORY_<CONFIG> CMAKE_POLICY_DEFAULT_CMP<NNNN> CMAKE_POLICY_WARNING_CMP<NNNN> CMAKE_POSITION_INDEPENDENT_CODECMAKE_PREFIX_PATHCMAKE_PROGRAM_PATHCMAKE_PROJECT_<PROJECT-NAME> _INCLUDECMAKE_PROJECT_NAMECMAKE_RANLIBCMAKE_ROOTCMAKE_RUNTIME_OUTPUT_DIRECTORYCMAKE_SCRIPT_MODE_FILECMAKE_SHARED_LIBRARY_PREFIXCMAKE_SHARED_LIBRARY_SUFFIXCMAKE_SHARED_LINKER_FLAGSCMAKE_SHARED_LINKER_FLAGS_<CONFIG> CMAKE_SHARED_MODULE_PREFIXCMAKE_SHARED_MODULE_SUFFIXCMAKE_SIZEOF_VOID_PCMAKE_SKIP_BUILD_RPATHCMAKE_SKIP_INSTALL_ALL_DEPENDENCYCMAKE_SKIP_INSTALL_RPATHCMAKE_SKIP_INSTALL_RULESCMAKE_SKIP_RPATHCMAKE_SOURCE_DIRCMAKE_STAGING_PREFIXCMAKE_STANDARD_LIBRARIESCMAKE_STATIC_LIBRARY_PREFIXCMAKE_STATIC_LIBRARY_SUFFIXCMAKE_STATIC_LINKER_FLAGSCMAKE_STATIC_LINKER_FLAGS_<CONFIG> CMAKE_SYSROOTCMAKE_SYSTEMCMAKE_SYSTEM_IGNORE_PATHCMAKE_SYSTEM_INCLUDE_PATHCMAKE_SYSTEM_LIBRARY_PATHCMAKE_SYSTEM_NAMECMAKE_SYSTEM_PREFIX_PATHCMAKE_SYSTEM_PROCESSORCMAKE_SYSTEM_PROGRAM_PATHCMAKE_SYSTEM_VERSIONCMAKE_TOOLCHAIN_FILECMAKE_TRY_COMPILE_CONFIGURATIONCMAKE_TWEAK_VERSIONCMAKE_USER_MAKE_RULES_OVERRIDECMAKE_USER_MAKE_RULES_OVERRIDE_<LANG> CMAKE_USE_RELATIVE_PATHSCMAKE_VERBOSE_MAKEFILECMAKE_VERSIONCMAKE_VISIBILITY_INLINES_HIDDENCMAKE_VS_DEVENV_COMMANDCMAKE_VS_INTEL_Fortran_PROJECT_VERSIONCMAKE_VS_MSBUILD_COMMANDCMAKE_VS_MSDEV_COMMANDCMAKE_VS_NsightTegra_VERSIONCMAKE_VS_PLATFORM_NAMECMAKE_VS_PLATFORM_TOOLSETCMAKE_WARN_DEPRECATEDCMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATIONCMAKE_WIN32_EXECUTABLECMAKE_XCODE_ATTRIBUTE_<an-attribute> CMAKE_XCODE_PLATFORM_TOOLSETCPACK_ABSOLUTE_DESTINATION_FILESCPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORYCPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATIONCPACK_INCLUDE_TOPLEVEL_DIRECTORYCPACK_INSTALL_SCRIPTCPACK_PACKAGING_INSTALL_PREFIXCPACK_SET_DESTDIRCPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATIONCTEST_BINARY_DIRECTORYCTEST_BUILD_COMMANDCTEST_BUILD_NAMECTEST_BZR_COMMANDCTEST_BZR_UPDATE_OPTIONSCTEST_CHECKOUT_COMMANDCTEST_CONFIGURATION_TYPECTEST_CONFIGURE_COMMANDCTEST_COVERAGE_COMMANDCTEST_COVERAGE_EXTRA_FLAGSCTEST_CURL_OPTIONSCTEST_CVS_CHECKOUTCTEST_CVS_COMMANDCTEST_CVS_UPDATE_OPTIONSCTEST_DROP_LOCATIONCTEST_DROP_METHODCTEST_DROP_SITECTEST_DROP_SITE_CDASHCTEST_DROP_SITE_PASSWORDCTEST_DROP_SITE_USERCTEST_GIT_COMMANDCTEST_GIT_UPDATE_CUSTOMCTEST_GIT_UPDATE_OPTIONSCTEST_HG_COMMANDCTEST_HG_UPDATE_OPTIONSCTEST_MEMORYCHECK_COMMANDCTEST_MEMORYCHECK_COMMAND_OPTIONSCTEST_MEMORYCHECK_SANITIZER_OPTIONSCTEST_MEMORYCHECK_SUPPRESSIONS_FILECTEST_MEMORYCHECK_TYPECTEST_NIGHTLY_START_TIMECTEST_P4_CLIENTCTEST_P4_COMMANDCTEST_P4_OPTIONSCTEST_P4_UPDATE_OPTIONSCTEST_SCP_COMMANDCTEST_SITECTEST_SOURCE_DIRECTORYCTEST_SVN_COMMANDCTEST_SVN_OPTIONSCTEST_SVN_UPDATE_OPTIONSCTEST_TEST_TIMEOUTCTEST_TRIGGER_SITECTEST_UPDATE_COMMANDCTEST_UPDATE_OPTIONSCTEST_UPDATE_VERSION_ONLYCTEST_USE_LAUNCHERSCYGWINENVEXECUTABLE_OUTPUT_PATHLIBRARY_OUTPUT_PATHMINGWMSVCMSVC10MSVC11MSVC12MSVC14MSVC60MSVC70MSVC71MSVC80MSVC90MSVC_IDEMSVC_VERSIONPROJECT_BINARY_DIRPROJECT_NAMEPROJECT_SOURCE_DIRPROJECT_VERSIONPROJECT_VERSION_MAJORPROJECT_VERSION_MINORPROJECT_VERSION_PATCHPROJECT_VERSION_TWEAKUNIXWIN32WINCEWINDOWS_PHONEWINDOWS_STOREXCODE_VERSION
七 深入学习cmake
cmake实践
mastering cmake
cmake的帮助文档