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安裝
安裝很簡單

三 CMake基本使用和語法

command (args ...)

command 是命令名,大小寫無關(注意:變量是大小寫相關的)

args 是參數,參數如果有空格,應該用雙引號括起來

變量引用用${VAR}語法

set命令可以將多變量可以放在一起,合成為一個變量,如下所示

set(Foo a b c)
command(${Foo})=command(a b c)
command("${Foo}")=command("a b c")

CMake可以直接獲取系統環境變量和Windows注冊值。為了獲取系統環境變量,需要語法

$ENV{VAR}

四 CMake中的Hello World

CMakeLists.txt文件中

project(Hello)
add_executable(Hello Hello.c)

這只是最簡單的版本,下面還有一個復雜一些的版本

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_<LANG>_IMPLICIT_INCLUDE_DIRECTORIES
CMAKE_<LANG>_IMPLICIT_LINK_DIRECTORIES
CMAKE_<LANG>_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
CMAKE_<LANG>_IMPLICIT_LINK_LIBRARIES
CMAKE_<LANG>_LIBRARY_ARCHITECTURE
CMAKE_<LANG>_LINKER_PREFERENCE
CMAKE_<LANG>_LINKER_PREFERENCE_PROPAGATES
CMAKE_<LANG>_LINK_EXECUTABLE
CMAKE_<LANG>_OUTPUT_EXTENSION
CMAKE_<LANG>_PLATFORM_ID
CMAKE_<LANG>_SIMULATE_ID
CMAKE_<LANG>_SIMULATE_VERSION
CMAKE_<LANG>_SIZEOF_DATA_PTR
CMAKE_<LANG>_SOURCE_FILE_EXTENSIONS
CMAKE_<LANG>_VISIBILITY_PRESET
CMAKE_ABSOLUTE_DESTINATION_FILES
CMAKE_ANDROID_API
CMAKE_ANDROID_API_MIN
CMAKE_ANDROID_GUI
CMAKE_APPBUNDLE_PATH
CMAKE_AR
CMAKE_ARCHIVE_OUTPUT_DIRECTORY
CMAKE_ARGC
CMAKE_ARGV0
CMAKE_AUTOMOC
CMAKE_AUTOMOC_MOC_OPTIONS
CMAKE_AUTOMOC_RELAXED_MODE
CMAKE_AUTORCC
CMAKE_AUTORCC_OPTIONS
CMAKE_AUTOUIC
CMAKE_AUTOUIC_OPTIONS
CMAKE_BACKWARDS_COMPATIBILITY
CMAKE_BINARY_DIR
CMAKE_BUILD_TOOL
CMAKE_BUILD_TYPE
CMAKE_BUILD_WITH_INSTALL_RPATH
CMAKE_CACHEFILE_DIR
CMAKE_CACHE_MAJOR_VERSION
CMAKE_CACHE_MINOR_VERSION
CMAKE_CACHE_PATCH_VERSION
CMAKE_CFG_INTDIR
CMAKE_CL_64
CMAKE_COLOR_MAKEFILE
CMAKE_COMMAND
CMAKE_COMPILER_2005
CMAKE_COMPILER_IS_GNU<LANG>
CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY
CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY_<CONFIG>
CMAKE_CONFIGURATION_TYPES
CMAKE_CROSSCOMPILING
CMAKE_CTEST_COMMAND
CMAKE_CURRENT_BINARY_DIR
CMAKE_CURRENT_LIST_DIR
CMAKE_CURRENT_LIST_FILE
CMAKE_CURRENT_LIST_LINE
CMAKE_CURRENT_SOURCE_DIR
CMAKE_CXX_COMPILE_FEATURES
CMAKE_CXX_EXTENSIONS
CMAKE_CXX_STANDARD
CMAKE_CXX_STANDARD_REQUIRED
CMAKE_C_COMPILE_FEATURES
CMAKE_C_EXTENSIONS
CMAKE_C_STANDARD
CMAKE_C_STANDARD_REQUIRED
CMAKE_DEBUG_POSTFIX
CMAKE_DEBUG_TARGET_PROPERTIES
CMAKE_DISABLE_FIND_PACKAGE_<PackageName>
CMAKE_DL_LIBS
CMAKE_EDIT_COMMAND
CMAKE_ERROR_DEPRECATED
CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION
CMAKE_EXECUTABLE_SUFFIX
CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS_<CONFIG>
CMAKE_EXPORT_NO_PACKAGE_REGISTRY
CMAKE_EXTRA_GENERATOR
CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES
CMAKE_FIND_LIBRARY_PREFIXES
CMAKE_FIND_LIBRARY_SUFFIXES
CMAKE_FIND_NO_INSTALL_PREFIX
CMAKE_FIND_PACKAGE_NAME
CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY
CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY
CMAKE_FIND_PACKAGE_WARN_NO_MODULE
CMAKE_FIND_ROOT_PATH
CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
CMAKE_FIND_ROOT_PATH_MODE_PACKAGE
CMAKE_FIND_ROOT_PATH_MODE_PROGRAM
CMAKE_FRAMEWORK_PATH
CMAKE_Fortran_FORMAT
CMAKE_Fortran_MODDIR_DEFAULT
CMAKE_Fortran_MODDIR_FLAG
CMAKE_Fortran_MODOUT_FLAG
CMAKE_Fortran_MODULE_DIRECTORY
CMAKE_GENERATOR
CMAKE_GENERATOR_PLATFORM
CMAKE_GENERATOR_TOOLSET
CMAKE_GNUtoMS
CMAKE_HOME_DIRECTORY
CMAKE_HOST_APPLE
CMAKE_HOST_SYSTEM
CMAKE_HOST_SYSTEM_NAME
CMAKE_HOST_SYSTEM_PROCESSOR
CMAKE_HOST_SYSTEM_VERSION
CMAKE_HOST_UNIX
CMAKE_HOST_WIN32
CMAKE_IGNORE_PATH
CMAKE_IMPORT_LIBRARY_PREFIX
CMAKE_IMPORT_LIBRARY_SUFFIX
CMAKE_INCLUDE_CURRENT_DIR
CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE
CMAKE_INCLUDE_DIRECTORIES_BEFORE
CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE
CMAKE_INCLUDE_PATH
CMAKE_INSTALL_DEFAULT_COMPONENT_NAME
CMAKE_INSTALL_MESSAGE
CMAKE_INSTALL_NAME_DIR
CMAKE_INSTALL_PREFIX
CMAKE_INSTALL_RPATH
CMAKE_INSTALL_RPATH_USE_LINK_PATH
CMAKE_INTERNAL_PLATFORM_ABI
CMAKE_JOB_POOL_COMPILE
CMAKE_JOB_POOL_LINK
CMAKE_LIBRARY_ARCHITECTURE
CMAKE_LIBRARY_ARCHITECTURE_REGEX
CMAKE_LIBRARY_OUTPUT_DIRECTORY
CMAKE_LIBRARY_PATH
CMAKE_LIBRARY_PATH_FLAG
CMAKE_LINK_DEF_FILE_FLAG
CMAKE_LINK_DEPENDS_NO_SHARED
CMAKE_LINK_INTERFACE_LIBRARIES
CMAKE_LINK_LIBRARY_FILE_FLAG
CMAKE_LINK_LIBRARY_FLAG
CMAKE_LINK_LIBRARY_SUFFIX
CMAKE_MACOSX_BUNDLE
CMAKE_MACOSX_RPATH
CMAKE_MAJOR_VERSION
CMAKE_MAKE_PROGRAM
CMAKE_MAP_IMPORTED_CONFIG_<CONFIG>
CMAKE_MATCH_COUNT
CMAKE_MFC_FLAG
CMAKE_MINIMUM_REQUIRED_VERSION
CMAKE_MINOR_VERSION
CMAKE_MODULE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS_<CONFIG>
CMAKE_MODULE_PATH
CMAKE_NOT_USING_CONFIG_FLAGS
CMAKE_NO_BUILTIN_CHRPATH
CMAKE_NO_SYSTEM_FROM_IMPORTED
CMAKE_OBJECT_PATH_MAX
CMAKE_OSX_ARCHITECTURES
CMAKE_OSX_DEPLOYMENT_TARGET
CMAKE_OSX_SYSROOT
CMAKE_PARENT_LIST_FILE
CMAKE_PATCH_VERSION
CMAKE_PDB_OUTPUT_DIRECTORY
CMAKE_PDB_OUTPUT_DIRECTORY_<CONFIG>
CMAKE_POLICY_DEFAULT_CMP<NNNN>
CMAKE_POLICY_WARNING_CMP<NNNN>
CMAKE_POSITION_INDEPENDENT_CODE
CMAKE_PREFIX_PATH
CMAKE_PROGRAM_PATH
CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE
CMAKE_PROJECT_NAME
CMAKE_RANLIB
CMAKE_ROOT
CMAKE_RUNTIME_OUTPUT_DIRECTORY
CMAKE_SCRIPT_MODE_FILE
CMAKE_SHARED_LIBRARY_PREFIX
CMAKE_SHARED_LIBRARY_SUFFIX
CMAKE_SHARED_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS_<CONFIG>
CMAKE_SHARED_MODULE_PREFIX
CMAKE_SHARED_MODULE_SUFFIX
CMAKE_SIZEOF_VOID_P
CMAKE_SKIP_BUILD_RPATH
CMAKE_SKIP_INSTALL_ALL_DEPENDENCY
CMAKE_SKIP_INSTALL_RPATH
CMAKE_SKIP_INSTALL_RULES
CMAKE_SKIP_RPATH
CMAKE_SOURCE_DIR
CMAKE_STAGING_PREFIX
CMAKE_STANDARD_LIBRARIES
CMAKE_STATIC_LIBRARY_PREFIX
CMAKE_STATIC_LIBRARY_SUFFIX
CMAKE_STATIC_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS_<CONFIG>
CMAKE_SYSROOT
CMAKE_SYSTEM
CMAKE_SYSTEM_IGNORE_PATH
CMAKE_SYSTEM_INCLUDE_PATH
CMAKE_SYSTEM_LIBRARY_PATH
CMAKE_SYSTEM_NAME
CMAKE_SYSTEM_PREFIX_PATH
CMAKE_SYSTEM_PROCESSOR
CMAKE_SYSTEM_PROGRAM_PATH
CMAKE_SYSTEM_VERSION
CMAKE_TOOLCHAIN_FILE
CMAKE_TRY_COMPILE_CONFIGURATION
CMAKE_TWEAK_VERSION
CMAKE_USER_MAKE_RULES_OVERRIDE
CMAKE_USER_MAKE_RULES_OVERRIDE_<LANG>
CMAKE_USE_RELATIVE_PATHS
CMAKE_VERBOSE_MAKEFILE
CMAKE_VERSION
CMAKE_VISIBILITY_INLINES_HIDDEN
CMAKE_VS_DEVENV_COMMAND
CMAKE_VS_INTEL_Fortran_PROJECT_VERSION
CMAKE_VS_MSBUILD_COMMAND
CMAKE_VS_MSDEV_COMMAND
CMAKE_VS_NsightTegra_VERSION
CMAKE_VS_PLATFORM_NAME
CMAKE_VS_PLATFORM_TOOLSET
CMAKE_WARN_DEPRECATED
CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION
CMAKE_WIN32_EXECUTABLE
CMAKE_XCODE_ATTRIBUTE_<an-attribute>
CMAKE_XCODE_PLATFORM_TOOLSET
CPACK_ABSOLUTE_DESTINATION_FILES
CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY
CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION
CPACK_INCLUDE_TOPLEVEL_DIRECTORY
CPACK_INSTALL_SCRIPT
CPACK_PACKAGING_INSTALL_PREFIX
CPACK_SET_DESTDIR
CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION
CTEST_BINARY_DIRECTORY
CTEST_BUILD_COMMAND
CTEST_BUILD_NAME
CTEST_BZR_COMMAND
CTEST_BZR_UPDATE_OPTIONS
CTEST_CHECKOUT_COMMAND
CTEST_CONFIGURATION_TYPE
CTEST_CONFIGURE_COMMAND
CTEST_COVERAGE_COMMAND
CTEST_COVERAGE_EXTRA_FLAGS
CTEST_CURL_OPTIONS
CTEST_CVS_CHECKOUT
CTEST_CVS_COMMAND
CTEST_CVS_UPDATE_OPTIONS
CTEST_DROP_LOCATION
CTEST_DROP_METHOD
CTEST_DROP_SITE
CTEST_DROP_SITE_CDASH
CTEST_DROP_SITE_PASSWORD
CTEST_DROP_SITE_USER
CTEST_GIT_COMMAND
CTEST_GIT_UPDATE_CUSTOM
CTEST_GIT_UPDATE_OPTIONS
CTEST_HG_COMMAND
CTEST_HG_UPDATE_OPTIONS
CTEST_MEMORYCHECK_COMMAND
CTEST_MEMORYCHECK_COMMAND_OPTIONS
CTEST_MEMORYCHECK_SANITIZER_OPTIONS
CTEST_MEMORYCHECK_SUPPRESSIONS_FILE
CTEST_MEMORYCHECK_TYPE
CTEST_NIGHTLY_START_TIME
CTEST_P4_CLIENT
CTEST_P4_COMMAND
CTEST_P4_OPTIONS
CTEST_P4_UPDATE_OPTIONS
CTEST_SCP_COMMAND
CTEST_SITE
CTEST_SOURCE_DIRECTORY
CTEST_SVN_COMMAND
CTEST_SVN_OPTIONS
CTEST_SVN_UPDATE_OPTIONS
CTEST_TEST_TIMEOUT
CTEST_TRIGGER_SITE
CTEST_UPDATE_COMMAND
CTEST_UPDATE_OPTIONS
CTEST_UPDATE_VERSION_ONLY
CTEST_USE_LAUNCHERS
CYGWIN
ENV
EXECUTABLE_OUTPUT_PATH
LIBRARY_OUTPUT_PATH
MINGW
MSVC
MSVC10
MSVC11
MSVC12
MSVC14
MSVC60
MSVC70
MSVC71
MSVC80
MSVC90
MSVC_IDE
MSVC_VERSION
PROJECT_BINARY_DIR
PROJECT_NAME
PROJECT_SOURCE_DIR
PROJECT_VERSION
PROJECT_VERSION_MAJOR
PROJECT_VERSION_MINOR
PROJECT_VERSION_PATCH
PROJECT_VERSION_TWEAK
UNIX
WIN32
WINCE
WINDOWS_PHONE
WINDOWS_STORE
XCODE_VERSION

七 深入學習cmake

cmake實踐

mastering cmake

cmake的幫助文檔

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM