CMake作为国产CFD开源软件OneFLOW的使用的一个跨平台的安装(编译)工具,功能非常强大,且对于大型软件跨平台构建是非常重要的。但是任何事情都有两面性,作为一个强大的构建工具,其本身也是有学习成本的。对于高手自不必多言,但是对于很多初学者来说还是有一定学习曲线的。
本文尝试在某种程度上降低这种学习曲线,这个切入点并不从简单的编译开始,而是从一个没有源码的工程开始,看看Cmake能够给出什么样的信息,从而对CMake有一些初步的感性的认识。
应该认识到CMake本身起始也是一种编程语言,写好Cmake文件也是一门艺术。
下面介绍下具体过程:
在d盘gitdir目录下建立CMakeTestPrj目录,里面包含一个空的build目录和一个CMakeList文件。
CMakeLists.txt文件内容如下:
cmake_minimum_required (VERSION 3.10)
project(MyTest DESCRIPTION "This is a test cmake project" )
message(STATUS "Welcome to Build Project ${CMAKE_PROJECT_NAME}.")
message(STATUS "The operating system is ${CMAKE_HOST_SYSTEM_NAME}, version is ${CMAKE_HOST_SYSTEM_VERSION}.")
message(STATUS "The CMAKE_SIZEOF_VOID_P is ${CMAKE_SIZEOF_VOID_P}.")
message(STATUS "The CMAKE_HOST_WIN32 is ${CMAKE_HOST_WIN32}.")
message(STATUS "The CMAKE_HOST_UNIX is ${CMAKE_HOST_UNIX}.")
message(STATUS "The CMAKE_HOST_SYSTEM_PROCESSOR is ${CMAKE_HOST_SYSTEM_PROCESSOR}.")
message(STATUS "The CMAKE_LIBRARY_ARCHITECTURE is ${CMAKE_LIBRARY_ARCHITECTURE}.")
message(STATUS "The CMAKE_VERSION is ${CMAKE_VERSION}.")
message(STATUS "The CMAKE_MAJOR_VERSION is ${CMAKE_MAJOR_VERSION}.")
message(STATUS "The CMAKE_MINOR_VERSION is ${CMAKE_MINOR_VERSION}.")
message(STATUS "The CMAKE_PATCH_VERSION is ${CMAKE_PATCH_VERSION}.")
message(STATUS "The CMAKE_TWEAK_VERSION is ${CMAKE_TWEAK_VERSION}.")
message(STATUS "The CMAKE_SHARED_LIBRARY_PREFIX is ${CMAKE_SHARED_LIBRARY_PREFIX}.")
message(STATUS "The CMAKE_SHARED_LIBRARY_SUFFIX is ${CMAKE_SHARED_LIBRARY_SUFFIX}.")
message(STATUS "The CMAKE_SHARED_MODULE_PREFIX is ${CMAKE_SHARED_MODULE_PREFIX}.")
message(STATUS "The CMAKE_SHARED_MODULE_SUFFIX is ${CMAKE_SHARED_MODULE_SUFFIX}.")
message(STATUS "The CMAKE_STATIC_LIBRARY_PREFIX is ${CMAKE_STATIC_LIBRARY_PREFIX}.")
message(STATUS "The CMAKE_STATIC_LIBRARY_SUFFIX is ${CMAKE_STATIC_LIBRARY_SUFFIX}.")
message(STATUS "The CMAKE_OBJECT_PATH_MAX is ${CMAKE_OBJECT_PATH_MAX}.")
message(STATUS "The CMAKE_MAKE_PROGRAM is ${CMAKE_MAKE_PROGRAM}.")
message(STATUS "The CMAKE_CACHEFILE_DIR is ${CMAKE_CACHEFILE_DIR}.")
message(STATUS "The CMAKE_COMMAND is ${CMAKE_COMMAND}.")
message(STATUS "The CMAKE_CPACK_COMMAND is ${CMAKE_CPACK_COMMAND}.")
message(STATUS "The CMAKE_CTEST_COMMAND is ${CMAKE_CTEST_COMMAND}.")
message(STATUS "The CMAKE_GENERATOR is ${CMAKE_GENERATOR}.")
message(STATUS "The CMAKE_GENERATOR_INSTANCE is ${CMAKE_GENERATOR_INSTANCE}.")
message(STATUS "The CMAKE_GENERATOR_PLATFORM is ${CMAKE_GENERATOR_PLATFORM}.")
message(STATUS "The CMAKE_GENERATOR_TOOLSET is ${CMAKE_GENERATOR_TOOLSET}.")
message(STATUS "The CMAKE_IMPORT_LIBRARY_PREFIX is ${CMAKE_IMPORT_LIBRARY_PREFIX}.")
message(STATUS "The CMAKE_IMPORT_LIBRARY_SUFFIX is ${CMAKE_IMPORT_LIBRARY_SUFFIX}.")
message(STATUS "The CMAKE_AR is ${CMAKE_AR}.")
message(STATUS "The WIN32 is ${WIN32}.")
message(STATUS "The MSVC is ${MSVC}.")
message(STATUS "The MSVC_IDE is ${MSVC_IDE}.")
message(STATUS "The MSVC_TOOLSET_VERSION is ${MSVC_TOOLSET_VERSION}.")
message(STATUS "The MSVC_VERSION is ${MSVC_VERSION}.")
message(STATUS "The CMAKE_VS_PLATFORM_NAME is ${CMAKE_VS_PLATFORM_NAME}.")
message(STATUS "The CMAKE_VS_PLATFORM_TOOLSET is ${CMAKE_VS_PLATFORM_TOOLSET}.")
message(STATUS "The CMAKE_VS_PLATFORM_TOOLSET_VERSION is ${CMAKE_VS_PLATFORM_TOOLSET_VERSION}.")
message(STATUS "The CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION is ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}.")
message(STATUS "The PROJECT_VERSION is ${PROJECT_VERSION}.")
message(STATUS "The PROJECT_VERSION_MAJOR is ${PROJECT_VERSION_MAJOR}.")
message(STATUS "The MyTest_VERSION is ${MyTest_VERSION}.")
message(STATUS "The BUILD_SHARED_LIBS is ${BUILD_SHARED_LIBS}.")
message(STATUS "The CTEST_BINARY_DIRECTORY is ${CTEST_BINARY_DIRECTORY}.")
message(STATUS "The CTEST_BUILD_COMMAND is ${CTEST_BUILD_COMMAND}.")
message(STATUS "The CTEST_BUILD_NAME is ${CTEST_BUILD_NAME}.")
message(STATUS "The PROJECT_BINARY_DIR is ${PROJECT_BINARY_DIR}.")
message(STATUS "The PROJECT_DESCRIPTION is ${PROJECT_DESCRIPTION}.")
message(STATUS "The CMAKE_SOURCE_DIR is ${CMAKE_SOURCE_DIR}.")
message(STATUS "The CMAKE_BINARY_DIR is ${CMAKE_BINARY_DIR}.")
message(STATUS "The CMAKE_CURRENT_SOURCE_DIR is ${CMAKE_CURRENT_SOURCE_DIR}.")
message(STATUS "The CMAKE_CURRENT_BINARY_DIR is ${CMAKE_CURRENT_BINARY_DIR}.")
实际上主要就是使用了message输出各种变量的信息,这些信息有助于加强初学者对于Cmake这种语言的理解。
打开CMake图形界面,如上图所示设置,并选择Configure,有:
这样就可以方便的监测Cmake自带的各种变量值了,也可以根据实际情况,其中的一些语句用到实际的工程项目中。